VirtualBoxのVDIファイルサイズをコンパクトにするにはどうしたらいいですか?
私はVirtualBoxのVMを使用していて、ハードディスクのサイズをホストよりも大きく設定しています。また、私のミスで、VM上のプログラムがログファイルを大量に生成してしまい、ホスト上に空き容量がなくなるまでVDIファイルのサイズが大きくなってしまいました。ありがとうございます。
私はVirtualBoxのVMを使用していて、ハードディスクのサイズをホストよりも大きく設定しています。また、私のミスで、VM上のプログラムがログファイルを大量に生成してしまい、ホスト上に空き容量がなくなるまでVDIファイルのサイズが大きくなってしまいました。ありがとうございます。
以下の手順を行う必要があります:
空き領域を無効化する:
ゲストVMをシャットダウン
これで VBoxManage の modifymedium
コマンドを --compact
オプションで実行します:
これで vdi サイズが縮小されます。
私はWindowsゲストとWindows 7のホスト上にいる、ここでは、私はフォルダツリーの
echo off
mode con:cols=140 lines=200
cls
:: see https://forums.virtualbox.org/viewtopic.php?p=29272#p29272
:: How can I reduce the size of a dynamic VDI on disk?
:: but that page says to use sdelete -s which is suboptimal.
:: use -z as per http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx
:: First run the sdelete -z c: inside the VMs that zero-out all the free space
:: THEN run this batch file
Title Compacting Free space on Virtual Machine VMs
:: http://ss64.com/nt/for_r.html
:: http://stackoverflow.com/questions/8836368/windows-batch-file-how-to-loop-through-files-in-a-directory/8836401#8836401
Setlocal EnableDelayedExpansion
:: http://ss64.com/nt/delayedexpansion.html ...
:: Notice that within the for loop we use !variable! instead of %variable%.
For /R %CD% %%G IN (*.vdi) DO (
set ohai=%%G
set lastfive=!ohai:~-5!
:: Skip snapshots which are named {guid}.vdi
if NOT !lastfive!==}.vdi (
echo .
echo Compacting %%G
"C:\Program Files\Oracle\VirtualBox\VboxManage.exe" modifyhd "%%G" --compact )
)
pause
exit
&001
私はあなたがそれがどのように動作するかを伝えることができますので、コメントにリンクを残したバッチファイルは、(並べ替え)。
これは直接的な答えではありません。定期的にイメージを圧縮する代わりに、この解決策では discard を使ってホストの VM ディスクイメージの中の使われていないブロックを自動的に削除します。
この解決策では連続的な TRIM をサポートするゲストファイルシステムが必要です。Arch Linux wiki には TRIM 操作をサポートするファイルシステムのリスト があります。
FDE と cryptoroot は特にカバーされていません。Arch Linux wiki には TRIM and dm-crypt devices についての情報があります。
理論的には、これは VDI ストレージを使用している VBox ホスト上のすべての Linux ゲストで動作します。
VBox が終了して VM が実行されていない状態で、VM の設定ファイルでディスクごとに discard
と nonrotational
の両方を設定してディスクにディスカードサポートを追加します。この時、discard
はGUIにはありませんが、nonrotational
は “Solid-state Drive "のチェックボックスとして公開されています。(ref: vbox forums, discard support )
<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >
VM を起動し、TRIM サポートが有効になっていることを確認してください。(ref: debian wiki, lvm.conf example )
sudo hdparm -I /dev/sda | grep TRIM
fstab で、自動破棄したいファイルシステムに /etc/lvm/lvm.conf
オプションを追加します (ref: debian wiki, fstab example )
devices {
...
issue_discards = 1
}
ファイルシステムを再マウントして、新しいオプションを選択させてください。
UUID=8db6787f-1e82-42d8-b39f-8b7491a0523c / ext4 discard,errors=remount-ro 0 1
UUID=70bfca92-8454-4777-9d87-a7face32b7e7 /build ext4 discard,errors=remount-ro,noatime 0 1
空きブロックを discard
で手動でトリミングするようになりました。007で連続的な廃棄を設定する代わりに、これは週単位のcronで行うことができます。(週単位の cron は、TRIM のサポートに疑問があるかもしれない物理 SSD に対して推奨されますが、基盤となる SSD はホスト OS によって処理されるので、ここでは関係ありません。
sudo mount -o remount /
sudo mount -o remount /build
この時点で、VM 内のファイルシステムのサイズと VM イメージのサイズはかなり近い値になるはずです。Guest1: Debian 8.7, kernel: linux 4.8 grsec from backports, filesystem: ext4 - Guest2. Guest2: Debian 9 RC2, kernel: linux 4.9, filesystem: ext4 - Host1. ホスト1: VBox 5.1.14, Win7, image fmt: VDI - ホスト2. Host2: VBox 5.1.14, Win8.1, イメージファイルのmt: VDI
私は Windows VirtualBox の仮想 Debian にマウントされた VDI イメージにこれを使用しています。それは一般的な解決策ではありませんが、それは少なくとも私が何をするかの要旨を与えるべきです。
Debian のコマンド:
root@debian:~# lsblk # show partitions
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 128G 0 disk └─sdb1 8:17 0 128G 0 part /mnt/web # THIS IS THE PARTITION OF INTEREST! sda 8:0 0 64G 0 disk ├─sda1 8:1 0 61,4G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 2,7G 0 part [SWAP] sr0 11:0 1 56,3M 0 rom
root@debian:~# service mysql stop # terminate all operations with partition
root@debian:~# service apache2 stop # terminate all operations with partition
root@debian:~# umount /mnt/web # unplug partition
root@debian:~# apt-get install zerofree # install tool for filling in zeros to empty space
root@debian:~# zerofree -v /dev/sdb1 # fill with zeros
root@debian:~# poweroff # shut down machine
Windows のコマンド:
C:\Program Files\Oracle\VirtualBox>VBoxManage.exe modifyhd --compact "D:\VirtualBox VMs\web.vdi" # convert zeros to empty space
**それが役立つことを願っています :)
OSでTRIMサポートを有効にしたくないのですが、データを削除するたびにVDIファイルのデータを圧縮してしまい、VDIファイルがクラシック回転ディスクにある場合、ゲストシステムが使えなくなってしまうからです。通常のコンパクト化の間、VDIファイルの内容は新しいファイルにコピーされます。これは、ホストディスク上にいくつかの(時には大きな)空き領域を必要とします。これはNTFS(Windows10)でも非常によく動作します。
これを行うには:
VDIベースのディスクをTRIMサポートでSSDとして見えるように変更:
マシンを起動
Linuxのルートシェルで、NTFSパーティションをマウント mount /dev/sda2 /mnt
空き領域ゼロ dd if=/dev/zero of=/mnt/bigfile
rm /mnt/bigfile
新しいファイルを作成せずにVDIを強制的にコンパクト化: fstrim -v /mnt
新しいファイルを作成せずにVDIをコンパクト化: &007
LEGACY (~1997-2007) オペレーティングシステムに関する重要な注意事項
一般的に、これまでに与えられた答えのテクニックは有効ですが、非常に重要な特殊なケースがあります。
何年かの間、おそらく 1997 年から 2007 年くらいまでの間は、32 ビットのオペレーティングシステムがまだ主流でしたが、 2GB を超えるハードディスクはすでに使われていました。その結果、ゼロのファイルを書き込んですべての空き領域を消費しようとすると(これは常にrootとして行われるべきで、他の誰も触れることができないrootの特権を持つ空き領域を含む)、次のように表示されることがあります:
ファイルが大きすぎます
代わりにあなたが期待しているもの:
デバイスに残されたスペースがありません。これは、多くのファイル操作が符号付き32ビット整数で結果を返すため、負の値がエラーコードを報告する可能性があったため、当時は一般的でした。
回避策は簡単です: ディスクが実際に容量を使い果たすまで、別の名前のゼロ化ファイルを作成し続けることです。
受け入れられた答えを補足するための非常に端正なトリックは、ホスト上で圧縮ファイルシステムを使用することによって、ゲストスペースをゼロにした後に、全くコンパクト化を行わずに逃げ切ることができるということです(例えば、Windowsホスト上のNTFSプロパティ上の仮想ドライブのフォルダを圧縮することを選択してください)。これは実際には、オペレーティング・システムが反復的なテキストファイルやバイナリファイルを多く保持する傾向があるため、より多くのスペースを節約できるという利点があります(例えば、15GBのスペースをゼロにした30GBのゲストドライブは、ホストドライブ上で4GBに変わることがあります)。