VirtualBoxのVDIファイルサイズを圧縮する方法


301

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

ログファイルを削除しましたが、使用後にVDIファイルのサイズが小さくなりません VBoxManage.exe modifyhd "C:\Virts\mybox-i386.vdi" compact

VDIファイルのサイズを本当に圧縮する方法はありますか?ありがとう!

回答:


507

次の手順を実行する必要があります。

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

    Linuxゲストにこれを実行します。

    dd if=/dev/zero of=/var/tmp/bigemptyfile bs=4096k ; rm /var/tmp/bigemptyfile
    

    または:

    telinit 1
    mount -o remount,ro /dev/sda1
    zerofree -v /dev/sda1
    

    Windowsゲスト、ダウンロードSDeleteを Sysinternalsのからして、これを実行します。

    sdelete.exe c: -z
    

    (C:をVDIのドライブ文字に置き換えます)

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

  4. 次にmodifymedium--compactオプションを指定してVBoxManageのコマンドを実行します。

    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サイズが小さくなります。


15
次の人のために、私のコマンドは次のようになりました: "C:\ Program Files \ Oracle \ VirtualBox \ VBoxManage.exe" modifyhd "C:\ Users \ daniel \ VirtualBox VMs \ .... \ thedisk.vdi"-
ダニエル

36
zerofree Linuxユーティリティのマンページ(manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html)によると、この仕事ではzerofreeのほうがddよりも優れているはずです。「遅い」、「ディスクイメージを(一時的に)最大範囲まで拡大する」、「ディスク上のすべての空き領域を(一時的に)使用するため、他の同時書き込みアクションが失敗する可能性がある」ため、ddは推奨されません。Zerofreeはaptを介してUbuntu Linuxで利用できますが、自分でコンパイルすることもできます。
ダカティーン14

27
zerofreeのマンページに、ddを使用すると他の同時書き込みが失敗することが記載されているのは楽しいですが、zerofreeではファイルシステムを読み取り専用でマウントする必要があります!* duh *
マダルコ14

7
ヒント:次のように2行のコマンドを1行に入力しdd ...; rm /bigfileます。これによりdd、完了するのを待たない場合にディスクがいっぱいになる時間を最小限に抑えることができます。
jlhが

21
@Dakatine VirtualBox 4.3.10を使用すると、ディスクイメージファイルは最大範囲まで拡大ませんでした。VirtualBoxは、すべてのゼロブロックを物理ディスクに書き込むことを気にしないほど賢いです。
jlhが

12

私は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

コメントにリンクを残したので、それがどのように機能するか(のような)を伝えることができます。

編集する

結局のところ、私はCloneVDIツールを試してみましたが、はるかに短い時間とワンクリックで良い仕事をしました。


5
この種のサイトでは、DOS用の構文の強調表示がありますが、ありません。これは、メモ帳++でかなりきれいに見える
CADのやつ

1
@CAD_blokeは解析エンジンを必要とし、SEに投稿された異なる言語の数を考慮すると、巨大なプロジェクトを見ています。たとえば、DOSのバージョンと方言がいくつあるかを考えてみてください。これは、Linuxなどに到達する前です。
Caltor

非常に良い点。皮肉なことに、それがされたスタック交換iOSアプリ上で強調表示します。
CADブローク

2
ええCloneVDIは個人的な使用のためのはるかに優れた、より高速な方法です
-VarunAgw

6

discard / TRIMを使用したWindowsホスト上のDebianゲスト。

私は問題ではなく問題に取り組んでいるので、これはそれ自体は直接的な答えではありません。このソリューションでは、イメージを定期的に圧縮する代わりに、廃棄を使用して、ホストのVMディスクイメージ内の未使用のブロックを自動的に削除します。

このソリューションには、継続的なTRIMをサポートするゲストファイルシステムが必要です。Arch Linux wikiには、TRIM操作をサポートするファイルシステムのリストがあります

FDEと暗号ルートは、セキュリティ上の懸念があり、この質問に対する他の解決策のいずれも圧縮を許可しないため、特に対象外です。Arch Linux wikiには、TRIMおよびdm-cryptデバイスに関する情報があります

理論的には、これはVDIストレージを使用するVBoxホスト上のすべてのLinuxゲストで機能します。

ホスト構成

VBoxが終了し、何のVMが動作していないと、両方を設定することで、あなたのディスクに廃棄サポートを追加discardし、nonrotationalVMのための設定ファイル内の各ディスクのために。現時点discardではGUIにはありませんがnonrotational、「ソリッドステートドライブ」チェックボックスとして公開されています。(参照:vboxフォーラム、サポートを破棄

<AttachedDevice discard="true" nonrotational="true" type="HardDisk" [..other options..] >

VMを起動し、TRIMサポートが有効になっていることを確認します。

sudo hdparm -I /dev/sda | grep TRIM

ゲスト構成

LVMが使用中の場合は、の廃棄設定を変更し/etc/lvm/lvm.confます。(参照:debian wiki、lvm.confの例

devices {
...
    issue_discards = 1
}

fstabで、discard自動破棄するファイルシステムにオプションを追加します(ref:debian wiki、fstab example

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によって処理されるため、ここでは関係ありません。ssdtrim warningを参照してください)。

fstrim /
fstrim /build

この時点で、VM内のファイルシステムのサイズとVMイメージのサイズはかなり近い値になっているはずです。

テスト済み:

  • ゲスト1:Debian 8.7、カーネル:バックポートからのLinux 4.8 grsec、ファイルシステム:ext4
  • Guest2:Debian 9 RC2、カーネル:linux 4.9、ファイルシステム:ext4
  • ホスト1:VBox 5.1.14、Win7、イメージfmt:VDI
  • Host2:VBox 5.1.14、Win8.1、image fmt:VDI

2

MacOSゲストの場合:

  1. ゲストシステムの空き領域を無効にします。

    diskutil secureErase freespace 0 "/Volumes/Macintosh HD"
    

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

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

  3. このコマンドを実行して、VDIディスクイメージのサイズを縮小します

    VBoxManage modifyhd /path/to/thedisk.vdi --compact
    

    または

    VBoxManage modifymedium /path/to/thedisk.vdi --compact
    

1

Windows VirtualBoxで仮想DebianにマウントされたVDIイメージにこれを使用します。これは一般的な解決策ではありませんが、少なくとも私がやっていることの要点がわかるはずです。

Debianのコマンド:

root@debian:~# lsblk  # show partitions
名前MAJ:最小RMサイズROタイプマウントポイント 
sdb 8:16 0 128G 0ディスク 
└─sdb18:17 0 128G 0 part / mnt / web#これは関心のあるパーティションです!
sda 8:0 0 64G 0ディスク 
├─sda18:1 0 61,4G 0 part / 
├─sda28:2 0 1K 0パート 
└─sda58:5 0 2,7G 0パート 
[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

それが役に立てば幸い :)


1

OSでTRIMサポートを有効にしたくありません。データを削除するたびにVDIファイルでデータが圧縮され、VDIファイルが従来の回転ディスクにある場合にゲストシステムが使用できなくなるためです。私にとっては、たとえば月に1回、手動で圧縮を実行することをお勧めします。

通常の圧縮中に、VDIファイルのコンテンツは新しいファイルにコピーされます。これには、ホストディスクにいくつかの(場合によっては大きな)空き領域が必要です。

Andrew Domaszekが指摘したのと同様の解決策があります。NTFS(Windows10)でも非常にうまく機能します。

これをする:

  • GParted Live CDで起動する新しい仮想マシンを作成します(お好みのLinuxディストリビューションを使用できます)。
  • マシンの設定を編集し、SATAディスクコントローラーを設定する
  • 圧縮する既存のVDIファイルを追加します
  • TRIMをサポートするVDIベースのディスクを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
    
  • スタートマシン

  • Linuxルートシェルで、NTFSパーティションをマウントします mount /dev/sda2 /mnt
  • 空きスペースがありません dd if=/dev/zero of=/mnt/bigfile
  • rm /mnt/bigfile
  • 新しいファイルを作成せずにVDIを強制的に圧縮します。 fstrim -v /mnt

0

受け入れられた答えを補完する非常に巧妙なトリックは、ホスト上の圧縮ファイルシステムを使用することにより、ゲストスペースをゼロにした後、圧縮をまったく行わずに逃げることができることです(例えば、NTFSプロパティの仮想ドライブのフォルダを圧縮することを選択しますWindowsホスト)。実際、オペレーティングシステムは多くの繰り返しテキストファイルまたはバイナリファイルを保持する傾向があるため、これにより多くのスペースを節約できるという利点があります(たとえば、15GBのスペースがゼロになった30GBゲストドライブはホストドライブで4GBになります)。

警告には、実際のハードウェア上のドライブアクセスが増加し、CPU使用率がわずかに増加することが含まれています。


0

レガシー(〜1997-2007)オペレーティングシステムに関する重要事項

一般に、前述の回答の手法は有効です。ただし、非常に重要な特別なケースがあります。

おそらく1997年から2007年などの数年間、32ビットのオペレーティングシステムが一般的でしたが、2 GBを超えるハードディスクが既に使用されていました。その結果、ゼロのファイルを書き込むことですべての空きスペースを消費しようとすると(常にルートとして実行し、他の人がアクセスできないルートの特権空きスペースを含める必要があります)、次のように表示されます。

フィアルは大きすぎる

あなたが期待するものの代わりに:

デバイスにスペースが残っていません。

これが発生した場合、2GBのファイルサイズの制限に達している可能性があります。多くのファイル操作が符号付き32ビット整数で結果を返し、負の値がエラーコードを報告する可能性があるため、これは当時一般的でした。これは、オフセットの結果が特別な措置なしで2 ^ 31バイトに制限されたことを意味していました。

回避策は簡単です。実際にディスクの空き容量がなくなるまで、別々の異なる名前のゼロ化ファイルを作成し続けます。

クラスでこの状況をデモンストレーションしたいインストラクターの場合、Red Hat Linux 7.0の古いコピーを含む4GBのディスクイメージで十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.