Hyper-Vを使っていてよく出会うのが、メモリとストレージの容量不足。
WindowsがゲストOSのときのやり方は多くあれど、Linuxゲストの場合は…?
やってみたのでご報告します。
Hyper-Vを利用していると、ゲストOS上ではそれほど消費していないはずのディスク容量が、ホストOSからそのゲストのVHD/VHDXファイルを確認すると結構な容量を食っていることがあります。
これを縮小したい、という時のTIPSをやってみたのでメモ。
容量、ホスト:ゲストの比
DebianでsambaサーバによるActive Directory環境を稼働させているのですが、このドメインコントローラとなるsambaサーバが今回の対象です。
Debian上から見たときの容量は…
-------------------------------------------------------
$ df -m
ファイルシス 1M-ブロック 使用 使用可 使用% マウント位置
/dev/sda1 125864 2489 116959 3% /
udev 10 0 10 0% /dev
tmpfs 98 5 93 5% /run
tmpfs 244 0 244 0% /dev/shm
tmpfs 5 0 5 0% /run/lock
tmpfs 244 0 244 0% /sys/fs/cgroup
tmpfs 49 0 49 0% /run/user/1000
-------------------------------------------------------
2489MBなので、約2.5GBしか使われていないということが分かります。
しかし実際にホストOS上からVHDXファイルのプロパティで容量を確認すると、
「サイズ:19.8 GB (21,311,258,624 バイト)」と記載されており、20GBの容量が使われていることが分かります。sambaサーバのActive Directoryは何回かリプレイスを繰り返しているのですがよく見るとこのサーバは2014年から4年間稼働しっぱなしということが分かります。
手順その1:ゲストOSで
ゲストOS上では、Linuxゲストの空き領域をゼロクリアする、という操作を実行します。
WindowsだとWindows SysinternalsでSDeleteというプログラムを用意し、空き領域ゼロクリアすることになります。
※Windows Sysinternals:SDelete
https://technet.microsoft.com/ja-jp/sysinternals/bb897443(en-us).aspx
しかし今回はゲストOSはDebian GNU/Linuxです。
この場合にはddコマンドを実行してゼロクリアを実行することになります。
$ dd if=/dev/zero of=zero bs=4k; \rm zero
※指定を間違えるとディスク上のデータを完全消去してしまうことになる(場合もある)のでご注意をば
手順その2:ホストOSで
ホストOSでやることは一つ、PowerShellの「Optimize-VHD」コマンドレットでVHD/VHDXファイルを指定して容量縮小を実行する、という一点です。
> Optimize-VHD -Path %VHDファイル名% -Mode Full
-ModeはQuickとかPretrimmedなどといったいくつかオプションがありまして、デフォルトはWindowsのバージョンによってFullだったりQuickだったりと変化しますが、以前のバージョンからFullを指定しておけばやりたいこと(容量削減)は可能でしたので、明示的にFullで指定して容量削減を実行します。
上手く容量削減ができない場合には、
-------------------------------------------------------
> Mount-VHD %VHDファイル名% -NoDriveLetter -Readonly
> Optimize-VHD -Path %VHDファイル名% -Mode Full
> Dismount-VHD %VHDファイル名%
-------------------------------------------------------
という具合にマウントさせるといいのかも(今回はしませんでしたが)
さて、結果はというと、
半分、まではいかないまでも、3割・4割削減までは行けました。