2012年10月19日金曜日

VirtualBoxのvdiファイルをマウントする on Gentoo

とある目的があって、VirtualBoxで作成したゲストVMの仮想HDD(vdi)をホスト側でマウントした時のメモ。

以下の参考サイト

http://forensicir.blogspot.com/2008/01/virtualbox-and-forensics-tools.html
http://muralipiyer.blogspot.com/2008/02/mounting-virtualbox-vdi-disk-authentic.html
http://forums.gentoo.org/viewtopic-t-706144.html
によるとvditoolというものでVDIファイルのoffData値が取得出来ればマウント出来るっぽいのだが、現在このvditoolというのが手に入らない。

んで、オフィシャルサイトで検索してみたらチケットがあった。

https://www.virtualbox.org/ticket/4843
嬉しい事にこのページで代替案が提示されていた。
VBoxManageのinternalcommands dumphdinfoで確認できるらしい。

$ VBoxManage internalcommands dumphdinfo /path/to/Gentoo.vdi
--- Dumping VD Disk, Images=1
Dumping VD image "/path/to/Gentoo.vdi" (Backend=VDI)
Dumping VDI image "/path/to/Gentoo.vdi" mode=r/w uOpenFlags=8 File=0x00000001921990
Header: Version=00010001 Type=2 Flags=0 Size=21474836480
Header: cbBlock=1048576 cbBlockExtra=0 cBlocks=20480 cBlocksAllocated=20480
Header: offBlocks=4096 offData=86016
Header: Geometry: C/H/S=1024/255/63 cbSector=512
Header: uuidCreation={710bb32a-9374-4fda-b095-df4e999462fc}
Header: uuidModification={ae1aa9be-7207-4aea-8f70-f67dc57ae2f6}
Header: uuidParent={00000000-0000-0000-0000-000000000000}
Header: uuidParentModification={00000000-0000-0000-0000-000000000000}
Image: fFlags=00010000 offStartBlocks=4096 offStartData=86016
Image: uBlockMask=000FFFFF cbTotalBlockData=1048576 uShiftOffset2Index=20 offStartBlockData=0
こんな感じ。
重要なのは、Header:のoffData値もしくはImage:のoffStartData値。この場合、86016。

次に、マウントしたいVDI内のパーティション情報をGuestOSのfdiskで確認しておく。
ちなみに、自分の環境ではVDIファイルはfixed sizeで作成したものでないとうまくマウントできなかった。

GuestOSを起動して以下を確認。

# fdisk -l /dev/sda
Disk /dev/sda: 21.5GB, 21474836480 bytes
255 heads, 63 sectors/trac, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb19fd606

Device Boot Start End Blocks Id System
/dev/sda1 * 2048 264191 131072 83 Linux
/dev/sda2 264192 1312767 524288 82 Linux swamp / Solaris
/dev/sda3 1312768 41943039 20315136 83 Linux
ここで必要な情報は、1セクタのサイズとマウントしたいパーティションのStart値。
今は、/dev/sda3をマウントしたいので、ここでは1312768。セクターサイズは512。
あとファイルシステムが何かも重要。

一応GuestOSは終了しておく。

後は、マウントするだけだが、ちょろっと計算が必要。
マウントの際にVDIファイルのどの位置から対象のパーティンションが始まっているのかを正確に指定する必要がある。
これは、以下の式で求まる。

offData + Start * Sector Size = 86016 + 1312768 * 512 = 672223232
マウントするVDIの中身が単一のWindowsパーティションの場合は、上記参考サイトのように

offData + 32256
で良いみたい。32256はMBRのサイズらしい。

実際にマウント。

# mount -t ext3 -o ro,noatime,noexec,loop,offset=672223232 /path/to/Gentoo.vdi /mnt/vdi
エラーがでなければ成功。

可変サイズのVDIファイルの場合は、以下のようなエラーになってしまう。

mount: 間違ったファイルシステムタイプ、不正なオプション、
/dev/loop0 のスーパーブロックが不正、コードページまたは
ヘルパープログラムの未指定、或いは他のエラー
In some cases useful info is found in syslog - try
dmesg | tail or so
dmesgをみるとこんなメッセージだけ。

[99307.660725] EXT3-fs (loop0): error: can't find ext3 filesystem on dev loop0.
容量食うが、仕方がないので今はfixed sizeでVDIを作成している。

0 件のコメント:

コメントを投稿