VirtualBoxのVDIファイルサイズをコンパクトにするには?

vdi virtualbox

私は、非常に大きなハードディスクサイズ(ホストよりも大きい)を設定したVirtualBoxのVMを使用しています。私のミスで、VM上のプログラムが大量のログファイルを生成してしまい、VDIファイルのサイズがホスト上に空き容量がなくなるまで増え続けてしまいました

今はログファイルを削除しましたが、VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compactを使ってもVDIのファイルサイズが小さくなっていません

VDIのファイルサイズを本当にコンパクトにする方法はありますか?ありがとうございます

  325  DeepNightTwo  2013-01-07


ベストアンサー

以下のような手順を踏む必要があります

  1. ゲストでデフラグを実行します(Windowsのみ)
  2. フリースペースを無効化します

    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のドライブレターに置き換えてください)

  3. ゲストVMをシャットダウンします

  4. ここで、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 の設定ファイルでディスクごとに discardnonrotational の両方を設定して、ディスクにディスカードのサポートを追加します。現時点では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のゲストの場合は、これを行います

  1. ゲストシステムのフリースペースを無効化します

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

    (/Volumes/Macintosh HDをドライブ名に置き換えてください)

  2. ゲストVMをシャットダウンします

  3. このコマンドを実行して、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


タイトルとURLをコピーしました