VirtualBox の仮想 HDD イメージ(.VDI)圧縮

以前に書いたけれど Ubuntu では run level 1 の起動方法が違ってハマったためまとめなおし。

手順は 1) ゲストで空き領域をゼロで埋め、 2) ホストでイメージを圧縮、となる。

以下詳細。

ゲスト Ubuntu での操作

zerofree コマンドで空き領域をゼロで埋める。
Ubuntu では "sudo apt-get install zerofree" で導入可能。先に進む前に入れておくこと。

run level 1 に落ちる方法は次のとおり。(sudo init 1 だとリブート中に固まって動かなくなるので GRUB 経由で)

  1. Shift を押しながら Ubuntu を起動して GRUB メニューを表示
  2. "recovery mode" を選択
  3. "root" (Drop to root shell prompt) を選択して root シェルに

以下 root シェルで実行。

$ mount / -o ro,remount   # / を read only mount
$ zerofree -v /dev/sda1   # 空き領域をゼロ埋め
$ mount / -o rw,remount   # / を writable に戻して…
$ shutdown -h now         # システムシャットダウン

ホスト Windows での操作

しばらくすると VM が終了するので、こんどは Windows ホストのコマンドラインで HDD イメージの compact を実行。

> "%PROGRAMFILES%\Oracle\VirtualBox\VboxManage"^
 modifyhd <path.to>\<file.vdi> --compact

これで空き領域が圧縮された HDD イメージ内のできあがり。
(ファイルサイズとホスト PC の処理能力次第だけれど、時間がかかります)

補足: / にマウントされているデバイスの調べ方

mount コマンドを実行するとわかる。:

$ mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nsuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)

(圧縮対象とする)一番大きなファイルシステムは df コマンドを使って確認できる。

$ df
Filesystem    1K-blocks       Used Available Use% Mounted on
/dev/sda1      65516240   47289332  14945348  76% /
udev            1963672          4   1963668   1% /dev
tmpfs            790268        792    789476   1% /run
none               5120          0      5120   0% /run/lock
none            1975668        160   1975508   1% /run/shm