hack のためのネタ帳, etc,,,

参考になるページ等

Tips

vboxmanage コマンドで以下のようにすれば良いらしい。
vboxmanage controlvm "vm name" screenshotpng Screenshot_$(date +"%Y%m%d_%H%M%S").png
参考:
以下のようにして rawvmdk 形式を指定して仮想 HDD を作成すれば良い。
VBoxManage internalcommands listpartitions -rawdisk /dev/sda
VBoxManage internalcommands createrawvmdk -filename rawdisk-a.vmdk -rawdisk /dev/sda
Windows の場合は /dev/sda 等の代わりに \\.\PhysicalDrive0 のようにすれば良い。
なお Windows の場合 VBoxManage を管理者として実行する必要があるが COM オブジェクトを呼ぶ関係上 VirtualBox.exe も管理者として実行される必要があるらしく、プロパティから「管理者としてこのプログラムを実行する」にチェックを付けておかないと上手く行かなかった。
参考:
可変サイズの VDI (VirtualBox Disk Image) は作成時こそ 2MB くらいしかないが使い続けていくと、最終的にはファイルシステム上ではほとんどが空き領域という状態でも確保した最大容量まで肥大化してしまう。
一方で、最近の ext4 や xfs は SSD 対応しているため mount option に -o discard を追加したり、fstrim コマンドを用いることでストレージに対して TRIM 命令を発行することが出来るので、これを VDI に対して行ってやれば、仮想 HDD ファイルの肥大化を抑制しストレージの容量を節約出来るはずである。
と言うことで、少し調べてみたところ、VirtualBox 4.2.0 の ChangeLog を見ると以下のように書かれており VDI 形式の仮想 HDD に対して TRIM のサポートが追加されたことで、未使用領域を捨てる事が可能になった事が確認出来る。
Storage: implemented support for discarding unused image blocks through TRIM for SATA and IDE and UNMAP for SCSI when using VDI images

さて、やり方としては、VBoxManage コマンドを用いて以下のように storage に対して discard を有効にしてやれば良い。
VBoxManage storageattach "vm name" --storagectl SATA --port 0 --device 0 --discard on
"vm name" は仮想マシンに付けた名前、--storagectl, --port, --device は TRIM を有効にしたい VDI のぶら下がっている位置を与える。
ぶら下がっている位置は、VBoxManage shoinfo コマンドを用いて以下のように調べるか、仮想マシンの構成情報が XML で記録されている .vbox ファイルを見れば良い。
VBoxManage showvminfo "vm name"
成功すれば、.vbox ファイルの AttachedDevice 要素に discard="true" 属性が設定されているはず。
また、Linux を起動した際に、/sys/block/device/queue/discard_max_bytes に 0 以外の数字が入っているはず。
なお、上記の設定は Ubuntu 14.04.2 LTS 上の VirtualBox 4.3.10 の場合なので、バージョンが変わるとオプション等の書き方が若干変わっているかもしれない。その場合は、VBoxManage --help 等を参照。

あとは、/etc/fstab 等にマウントオプションとして discard を追加しておけば随時 TRIM が発行されるので自動的に未使用領域を VDI ファイルから排除してくれる。
手動で TRIM を発行したい場合は以下のように fstrim コマンドに mount point を与えてやれば良い。
fstrim /

実際に、VDI ファイルの容量が増減する様子は、
dd if=/dev/urandom of=rnd bs=1024x1024 count=1024
のように適当に大きなファイルを作ったり消したりしながら ls -ls 等で .vdi ファイルのサイズを確認してみると良い。

1点心配ないのは、未使用領域の切り捨てに伴い、ホストOS上における仮想 HDD ファイルの配置にはかなりのフラグメントが発生しそうな点。
パフォーマンスを気にするなら、しっかりデフラグした後、固定ディスクとして作った方が良いだろう。

参考:
追記: 2016-11-04:
Windows 8 以降では「ディスク デフラグ ツール」(いわゆるディスクの最適化)にが Trim 対応したらしく、CUI 版の defrag.exe に /L オプションを与えるか GUI 版の dfrgui.exe を用いることで、手動で Trim の発行が出来るようになったらしい。
Windows 上で Trim が有効になっているかどうかは以下のコマンドで確認可能。
fsutil behavior query DisableDeleteNotify
0 なら Trim は有効、1 なら Trim は無効になっている。
設定変更は以下のようにすれば良い。
: Trim 有効化
fsutil behavior set DisableDeleteNotify 0
: Trim 無効化
fsutil behavior set DisableDeleteNotify 1

参考:
ストレージの capacity, allocated, size について調査する 1 liner (って、長ぇよ)
VBoxManage list hdds|awk 'match($0,/^Location: *(.+)$/,m){fn=idx[0+n]=m[1];n++;"ls -ls '\''"fn"'\''"|getline; prop[fn,"alloc"]=$1*1024;prop[fn,"size"]=$6;}match($0,/^Capacity: /){prop[fn,"capacity"]=$2*1024*1024}END{printf("%15s %15s %15s %s\n", "capacity", "allocated", "size", "filename");for(i=0;i<n;i++){fn=idx[i]; printf("%'\''15d %'\''15d %'\''15d %s\n", prop[fn,"capacity"], prop[fn,"alloc"],prop[fn,"size"],fn)}}'
2017-12-04: Windows + Cygwin 環境用に微調整
VBoxManage list hdds|sed -r -e 's/\r//g'|awk 'match($0,/^Location: *(.+)$/,m){fn=idx[0+n]=m[1];n++;"ls -ls '\''"fn"'\''"|getline; prop[fn,"alloc"]=$1*1024;prop[fn,"size"]=$6;}match($0,/^Capacity: /){prop[fn,"capacity"]=$2*1024*1024}END{printf("%15s %15s %15s %s\n", "capacity", "allocated", "size", "filename");for(i=0;i<n;i++){fn=idx[i]; printf("%'\''15d %'\''15d %'\''15d %s\n", prop[fn,"capacity"], prop[fn,"alloc"],prop[fn,"size"],fn)}}'
実行結果は以下のような感じ
       capacity       allocated            size filename
  8,589,934,592   7,822,705,664   7,815,070,208 /home/kou/.VirtualBox/HardDisks/momonga7.vdi
  8,589,934,592     162,756,608     195,072,000 /home/kou/VirtualBox VMs/Ubuntu/Ubuntu.vdi
  8,589,934,592     762,048,512     763,363,328 /home/kou/VirtualBox VMs/CentOS6/CentOS6.vdi
流石に仮想マシンに TB 単位で割り振るのは稀だと思うので 100GB で桁揃えしている

修正 2016-11-04:
Windows で UNC が正しく扱えなかったのでクオートを変更したついでに Gist にも登録しといた。
LAVIE Hybrid ZERO (の多分2016年9月モデル?)が相談に持ち込まれたんだけど、何故か temporary の rename に失敗して、おおよそ以下のような感じのエラー吐いて extension pack の install に失敗する症状に悩まされた。
The installer failed with exit code 1: VBoxExtPackHelperApp.exe: error: Failed to rename the temporary directory to the final one: VERR_ACCESS_DENIED('C:\Program Files\Oracle\VirtualBox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_pack-_-inst-?????' -> 'G:\Program Files\Oracle\VirtualBox/ExtensionPacks/Oracle_VM_VirtualBox_Extension_Pack')

Result Code: 
E_FAIL (0x80004005)
VirtualBox の再インストールとか、旧バージョンにしてみたりとか、vboxmanage extpack cleanup とか、reboot とか、結局、何やっても駄目だったんだけど、プレインストールされてた(多分60日版の) McAfee Live Safe 殺したら何事もなかったように問題が解決した。
糞、なんだ、このポンコツセキュリティ対策ソフトは!?
広告の分際で、トラブルのA級戦犯とか死ねって思った。
お前はウイルス対策ソフトじゃなくて、ウイルスソフトって呼び方の方がお似合いだわ。
ゴミじゃん、カスじゃん。
これが Intel 傘下とか頭痛いわ。
つぅか、McAfee と NEC は俺にサポート料払うべきだろ?
俺の2時間を返せ。

参考:

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

編集にはIDが必要です