2013-01-07 03:41:45 +0000 2013-01-07 03:41:45 +0000
307
307

VirtualBoxのVDIファイルサイズをコンパクトにするにはどうしたらいいですか?

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

回答 (8)

520
520
520
2013-01-07 05:05:34 +0000

以下の手順を行う必要があります:

  1. ゲスト(Windowsのみ)でデフラグを実行する
  2. 空き領域を無効化する:

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

  4. これで VBoxManage の modifymedium コマンドを --compact オプションで実行します:

これで vdi サイズが縮小されます。

12
12
12
2015-01-09 10:25:08 +0000

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

私はあなたがそれがどのように動作するかを伝えることができますので、コメントにリンクを残したバッチファイルは、(並べ替え)。

7
7
7
2017-02-24 16:27:40 +0000

これは直接的な答えではありません。定期的にイメージを圧縮する代わりに、この解決策では discard を使ってホストの VM ディスクイメージの中の使われていないブロックを自動的に削除します。

この解決策では連続的な TRIM をサポートするゲストファイルシステムが必要です。Arch Linux wiki には TRIM 操作をサポートするファイルシステムのリスト があります。

FDE と cryptoroot は特にカバーされていません。Arch Linux wiki には TRIM and dm-crypt devices についての情報があります。

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

ホスト設定

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 サポートが有効になっていることを確認してください。(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

2
2
2
2016-12-16 17:08:31 +0000

MacOSのゲスト**の場合は、次のようにしてください:

  1. ゲストシステムの空き領域を無効にする:

  2. ゲスト VM をシャットダウンします。VDIディスクイメージサイズを減らすために、このコマンドを実行します。

1
1
1
2016-02-05 11:31:32 +0000

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

**それが役立つことを願っています :)

1
1
1
2017-09-15 07:17:05 +0000

OSでTRIMサポートを有効にしたくないのですが、データを削除するたびにVDIファイルのデータを圧縮してしまい、VDIファイルがクラシック回転ディスクにある場合、ゲストシステムが使えなくなってしまうからです。通常のコンパクト化の間、VDIファイルの内容は新しいファイルにコピーされます。これは、ホストディスク上にいくつかの(時には大きな)空き領域を必要とします。これはNTFS(Windows10)でも非常によく動作します。

これを行うには:

  • GParted Live CDで起動する新しい仮想マシンを作成します。
  • マシン設定を編集し、SATAディスクコントローラを設定
  • コンパクトにしたい既存のVDIファイルを追加
  • 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

0
0
0
2019-08-17 06:07:39 +0000

LEGACY (~1997-2007) オペレーティングシステムに関する重要な注意事項

一般的に、これまでに与えられた答えのテクニックは有効ですが、非常に重要な特殊なケースがあります。

何年かの間、おそらく 1997 年から 2007 年くらいまでの間は、32 ビットのオペレーティングシステムがまだ主流でしたが、 2GB を超えるハードディスクはすでに使われていました。その結果、ゼロのファイルを書き込んですべての空き領域を消費しようとすると(これは常にrootとして行われるべきで、他の誰も触れることができないrootの特権を持つ空き領域を含む)、次のように表示されることがあります:

ファイルが大きすぎます

代わりにあなたが期待しているもの:

デバイスに残されたスペースがありません。これは、多くのファイル操作が符号付き32ビット整数で結果を返すため、負の値がエラーコードを報告する可能性があったため、当時は一般的でした。

回避策は簡単です: ディスクが実際に容量を使い果たすまで、別の名前のゼロ化ファイルを作成し続けることです。

0
0
0
2018-01-20 07:13:01 +0000

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

関連する質問

11
5
7
9
8