LoginSignup
0
0

More than 1 year has passed since last update.

KVM上のWindows 10のスワップ領域(仮想メモリ)にホスト側Linuxのtmpfsを使用する

Last updated at Posted at 2021-12-18

Windowsの場合、メモリが足りなくなるとページファイルにメモリの中身が退避されますが、HDDのような遅いストレージでは読み書きが終わるまで全体の処理がストップしてしまうため、この処理が頻繁に起こると非常にストレスとなります。また、SSDでは貴重な書き込み回数を浪費してしまいます。
特に仮想マシンではメモリが限られていることが多いのでスワップの処理が頻繁に起こりがちです。
そのため、WindowsのページファイルをホストのRAM上に配置して動作の高速化を図ってみます。

準備

NTFSパーティションをフォーマットするため、ntfs-3gが必要です。

$ sudo dnf install ntfs-3g # Red Hat
$ sudo apt install ntfs-3g # Debian

ホストの設定

このようなスクリプトを用意します。

/usr/local/bin/vmswap-attach
#!/bin/sh

if [ -e /tmp/vmswap ]; then
  exit 1
fi

mkdir /tmp/vmswap
mount -o size=0,noatime -t tmpfs tmpfs /tmp/vmswap
truncate -s 8G /tmp/vmswap/disk.img
loop=$(losetup -b 4096 -Pf --show /tmp/vmswap/disk.img)
parted -s -a optimal ${loop} mklabel gpt mkpart Volume ntfs 0% 100%
mkfs.ntfs -s 4096 -p 256 -H 0 -S 0 -If "${loop}p1"
parted -s ${loop} set 1 msftdata on
losetup -d ${loop}
/usr/local/bin/vmswap-detach
#!/bin/sh

if [ ! -e /tmp/vmswap ]; then
  exit 1
fi

umount /tmp/vmswap
rm -rfv /tmp/vmswap

vmswap-attachを実行すると/tmp/vmswap/disk.imgにスワップ領域が作成され、vmswap-detachを実行すると削除されます。
もう少し詳しく解説すると、tmpfs上に8GBのスパースファイルを用意し、そこにGPTのパーティションを切り、NTFSでフォーマットします。
最後にset 1 msftdata onするのが重要なポイントで、mkfs.ntfsだけではWindowsはNTFSとして認識してくれませんでした。

systemdで自動起動できるようにユニットファイルを作成しておきます。

/etc/systemd/system/vmswap.service
[Unit]
Description=Swap space for Windows on KVM
Before=libvirtd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/vmswap-attach
ExecStop=/usr/local/bin/vmswap-detach

[Install]
WantedBy=multi-user.target
$ sudo systemctl enable --now vmswap

ゲストの設定

作成したスワップ領域をVMのストレージとして追加します。
使わなくなった領域を解放させるため、Discard modeはunmapを選択します。
Screenshot from 2021-12-21 16-01-34.png

XMLを編集し、ブロックサイズを4096バイトに設定して完了です。
(論理セクタサイズをページサイズに合わせて4096バイトでフォーマットしているため、これをしないとWindowsから見えない)

<disk type="file" device="disk">
  <driver name="qemu" type="raw" cache="writethrough" io="io_uring" ioeventfd="on" discard="unmap" iothread="4" detect_zeroes="off" packed="on"/>
  <source file="/tmp/vmswap/disk.img"/>
  <backingStore/>
  <!-- ブロックサイズを4096バイトに設定 -->
  <blockio logical_block_size="4096" physical_block_size="4096"/>
  <target dev="vdb" bus="virtio"/>
  <address type="pci" domain="0x0000" bus="0x08" slot="0x00" function="0x0"/>
</disk>

次に、ページファイルを置くための設定をします。
Windowsを起動したら、スタートボタンを右クリック→システム→関連設定の「システムの詳細設定」→詳細設定タブ→パフォーマンスの「設定」→詳細設定タブ→仮想メモリの「変更」をクリックします。
すると仮想メモリの設定ウィンドウが表示されます。
無題.png
設定後の画面がこちらです。
Dドライブが先程追加したストレージです。
カスタムサイズの場合、空き領域から5MB引いた8124MBが最大でこれ以上は大きくできません。
ここではストレージの領域を最初から目一杯使うように設定していますが、通常はシステム管理サイズで問題ないと思います。
入力後は必ず「設定」ボタンを押さないと反映されないので忘れずにクリックしておきます。
無題2.png
再起動後、追加した領域が仮想メモリとして反映されているのが確認できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0