私は、非常に大きなハードディスクサイズ(ホストよりも大きい)を設定したVirtualBoxのVMを使用しています。私のミスで、VM上のプログラムが大量のログファイルを生成してしまい、VDIファイルのサイズがホスト上に空き容量がなくなるまで増え続けてしまいました
今はログファイルを削除しましたが、VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact
を使ってもVDIのファイルサイズが小さくなっていません
VDIのファイルサイズを本当にコンパクトにする方法はありますか?ありがとうございます
325 DeepNightTwo 2013-01-07
以下のような手順を踏む必要があります
- ゲストでデフラグを実行します(Windowsのみ)
フリースペースを無効化します
Linuxゲストでこれを実行します
dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
Or:
telinit 1 mount -o remount,ro /dev/sda1 zerofree -v /dev/sda1
Windowsゲストの場合は、SysinternalsからSDeleteをダウンロードして実行してください
sdelete.exe c: -z
(C:をVDIのドライブレターに置き換えてください)
ゲストVMをシャットダウンします
ここで、VBoxManageの
modifymedium
コマンドを--compact
オプションで実行しますLinuxホストでこれを実行します
vboxmanage modifymedium --compact /path/to/thedisk.vdi
Windowsホストでこれを実行します
VBoxManage.exe modifymedium --compact c:\path\to\thedisk.vdi
Macホストでこれを実行します
VBoxManage modifymedium --compact /path/to/thedisk.vdi
これにより、VDIのサイズを小さくすることができます
554 magicandre1981 2013-01-07
私はWindowsゲストとWindows 7のホスト上にいる、ここでは、私はフォルダツリー内のVDIのすべてをコンパクトにするために書いたバッチファイルです
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
コメントにリンクを残したので、どのように動作するかが(なんとなく)わかると思います
edit
さて、そんなこんなで、CloneVDIツールを試してみたところ、はるかに短い時間でワンクリックで良い仕事をしてくれました
11 CAD bloke 2015-01-09
Windows ホスト上の Debian ゲストが discard/TRIM を使用しています
これは直接の答えではありませんが、私は問題に対処しているのであって、質問に対処しているわけではありません。定期的にイメージをコンパクト化するのではなく、このソリューションでは、廃棄を使用して、ホストのVMディスクイメージ内の未使用のブロックを自動的に削除します
このソリューションでは連続的な TRIM をサポートするゲストファイルシステムが必要です。Arch Linux wiki には TRIM 操作をサポートするファイルシステムのリストがあります
FDE と cryptoroot は特にカバーされていません。セキュリティ上の懸念があり、この質問に対する他の解決策ではどちらもコンパクト化できないからです。Arch Linux wiki には TRIM と dm-crypt デバイス についての情報があります
理論的には、VDI ストレージを使用している VBox ホスト上のすべての Linux ゲストに対して動作します
Host configuration
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 サポートが有効になっていることを確認します
sudo hdparm -I /dev/sda | grep TRIM
Guest Configuration
LVMを使用している場合は、/etc/lvm/lvm.conf
で破棄の設定を変更してください。(ref: debian wiki, lvm.conf example)
devices {
...
issue_discards = 1
}
fstab で、自動破棄したいファイルシステムに discard
オプションを追加します (ref: debian wiki, fstab の例)
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
ファイルシステムをリマウントして、新しいオプションを選択できるようにします
sudo mount -o remount /
sudo mount -o remount /build
fstrim
で空きブロックを手動でトリミングするようになりました。fstrim
は、マウントされたファイルシステムを使用し、それをバックアップしているブロックデバイスを使用しません。fstab
で継続的な廃棄を設定する代わりに、これを週単位の cron で行うことができます。(週単位の cron は、TRIM のサポートに疑問のある物理 SSD に対して推奨されていますが、基盤となる SSD はホスト OS によって処理されるので、ここでは関係ありません。ssd trim warning)
fstrim /
fstrim /build
この時点で、VM内のファイルシステムのサイズとVMイメージのサイズは、かなり近い値になるはずです
Tested with:
- Guest1.Debian 8.7, カーネル: linux 4.8 grsec from backports, ファイルシステム: ext4
- Guest2.Debian 9 RC2, カーネル: linux 4.9, ファイルシステム: ext4
- ホスト1。VBox 5.1.14, Win7, image fmt: VDI
- ホスト2。VBox 5.1.14, Win8.1, image fmt: VDI
10 Andrew Domaszek 2017-02-24
私はこれを 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
それが役立つことを願っています 🙂
2 Dejv 2016-02-05
MacOSのゲストの場合は、これを行います
ゲストシステムのフリースペースを無効化します
diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
(/Volumes/Macintosh HDをドライブ名に置き換えてください)
ゲストVMをシャットダウンします
このコマンドを実行して、VDI ディスクイメージサイズを縮小します
VBoxManage modifyhd /path/to/thedisk.vdi --compact
OR
VBoxManage modifymedium /path/to/thedisk.vdi --compact
2 Mrskman 2016-12-16
LEGACY (~1997-2007) OPERATING SYSTEMSのための重要なノート
一般的に、以前に与えられた答えの中のテクニックは有効ですが、非常に重要な特殊なケースがあります
何年かの間–おそらく1997年から2007年くらいまで–32ビットのオペレーティングシステムがまだ普通でしたが、2GB以上のハードディスクはすでに使われていました。その結果、ゼロのファイルを書き込んですべての空き領域を消費しようとすると(これは常にルートとして行われるべきで、他の誰も触れることのできないルートの特権的な空き領域を含む)、あなたは見ることができるかもしれません
ファイルが大きすぎる
期待しているのではなく
デバイスにスペースが残っていません
この現象が発生した場合、2GBのファイルサイズの制限にぶつかっている可能性が高いです。これは、多くのファイル操作が符号付き32ビット整数で結果を返すため、負の値がエラーコードを報告する可能性があったため、当時は一般的でした。これは事実上、オフセットの結果が特別な措置なしに2^31バイトに制限されることを意味していました
この回避策は簡単で、ディスクが実際に容量を使い果たすまで、別の名前のゼロ化ファイルを作成し続けます
この状況を授業で実演したい場合は、Red Hat Linux 7.0 の古いコピーを使用した 4GB のディスクイメージで十分です
2 breakpoint 2019-08-17
OSでTRIMサポートを有効にしたくないのですが、データを削除するたびにVDIファイルにデータを圧縮してしまい、VDIファイルがクラシック回転ディスクにある場合にゲストシステムが使えなくなってしまうからです。私にとっては、月に一度のように手でコンパクト化を行う方が良いです
通常のコンパクト化の間、VDIファイルの内容は新しいファイルにコピーされます。このため、ホストディスクの空き容量が必要となります
Andrew Domaszekさんが指摘されているのと同じような解決策があります。NTFS(Windows10)でも問題なく動作します
そのためには
- GParted Live CDで起動する新しい仮想マシンを作成します (好きなLinuxディストロを使用できます)
- マシンの設定を編集し、SATAディスクコントローラを設定します
- コンパクトにしたい既存のVDIファイルを追加します
VDIベースのディスクをTRIM対応のSSDとして見えるように変更
VBoxManage storageattach "gpared live" --storagectl "SATA" --port 0 --discard on --nonrotational on VBoxManage storageattach "gpared live" --storagectl "SATA" --port 1 --discard on --nonrotational on
start machine
- Linuxのルートシェルで、NTFSパーティション
mount /dev/sda2 /mnt
をマウントします - ゼロの空きスペース
dd if=/dev/zero of=/mnt/bigfile
rm /mnt/bigfile
- 新規ファイルを作成せずにVDIを強制的にコンパクト化する。
fstrim -v /mnt
2 niziak 2017-09-15
受け入れられた答えを補足するための非常に端正なトリックは、ホスト上で圧縮ファイルシステムを使用することによって、ゲストスペースをゼロにした後に、全くコンパクト化を行わずに逃げ切ることができるということです(例えば、Windowsホスト上のNTFSプロパティ上の仮想ドライブのフォルダを圧縮することを選択してください)。オペレーティングシステムは反復的なテキストファイルやバイナリファイルを多く保持する傾向があるため、これは実際にはより多くのスペースを節約できるという利点があります(例えば、15GBのスペースをゼロにした30GBのゲストドライブは、ホストドライブ上で4GBに変わることができます)
洞窟は、実際のハードウェア上でのドライブアクセスが増加する可能性があり、CPUの使用量が若干増加していることが含まれています
1 j riv 2018-01-20