VMwareの仮想ディスクをLinuxでマウントして使う

タイトルが良くなかった。「VMwareの仮想ディスクをLinuxでマウントして使う」のであれば、vmware-mountというコマンド使えば簡単に出来る。ここに書いてあるのはその逆で、Linux上のHDDのイメージファイルを仮想マシン上(ゲストOS上)の仮想ディスクとして使う方法。

具体的な方法は後で書くが、そもそもの動機と経緯は次のようになる。(ちょっと前置きが長くなるが。)Linux上に小容量のHDDのイメージファイルがあった。これを仮想マシンでマウントして使いたい。できればルートファイルシステムとして使いたい、というのが動機だ。組込み系の開発とかOSに近いところの開発を行っている人であれば、これがどれ程便利なことか分かってもらえるかと思う。ターゲットマシンのHDDがそのまま仮想マシンで使えるわけだし、仮想マシンで開発した仮想ディスクの内容をそのまま実マシンで利用できるようになる。(ただ単に、マウントして使えるだけでなく、実際のHDDと仮想ディスクの間で相互変換(P2V/V2P変換)が可能となる。)

VMwareの仮想ディスクをLinuxでマウントして使うには“vmware-mount”というコマンドを使わないで出来ない、と思いがちだが、フラットディスクに関しては言えば、結果的に普通のLinuxのmountでOKということが分かった。

VMwareの仮想ディスクは独自仕様か?

最初はXenを使おうと思い最新のXen Express 4.1.0をインストールしてみた。1年ぶり(「Xen Expressのインストール 」参照)にXenを使ったが、昔のXen Expressと異なり、仮想ディスク(Storage Repository)へLinuxからアクセスできなくなっているし、Storage Repositoryの管理コマンド、smコマンドもなくなっていて、使い勝手が大変悪くなっていた。そこで次に普段使っているVMware環境を再度調べてみた。
VMwareの仮想ディスクの内部フォーマットはズーッと独自仕様だと思い込んでいた。私が仮想マシンを使い始めたころ参考にしたいくつかの本でも、Xenの仮想ディスクをLinuxからマウントして使う例は紹介されていたが、VMwareについてはそういう紹介記事がなく独自だと思い込んでいた。当然、ディスク・スペースをダイナミックに割り当てる方式の仮想ディスクは独自の使用にならざるおえないが、最初からディスク・スペースを確保するサイズ固定型の仮想ディスクはどうなっているのだろう?と思い調べてみた。

まず、VMwareのサイズ固定型(*-flat.vmdx)の内部フォーマットとみてみた。大きな仮想ディスクでは調べにくいので、一番小さなサイズの仮想ディスクを作ってフォーマットを調べてみた。まず、Linuxゲスト適当な仮想マシンに仮想ディスクを追加する。VMwareの仮想ディスクの最少サイズは0.1GBである。ここでは"smallest"という名前の仮想ディスクを追加している。

ゲストマシンをブートしてディスクを初期化&フォーマットする。

[root@fedora-8 ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb		;: ←新しいディスクは/dev/sdb
[root@fedora-8 ~]# fdisk /dev/sdb			;: ←fdiskでパーティションを設定
Command (m for help): n					;:   ディスク全体を1つのパーティションに。
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-13, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-13, default 13): 13
Command (m for help): w
The partition table has been altered!

[root@fedora-8 ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdb1	;: ←新しいパーティションは/dev/sdb1
[root@fedora-8 ~]# mkfs -t ext3 /dev/sdb1		;: ←フォーマットする
[root@fedora-8 ~]# mount /dev/sdb1 /mnt			;: ←さっそくマウントして確認する
[root@fedora-8 ~]# ls /mnt
lost+found
[root@fedora-8 ~]# df /mnt				;: ←約100MBであることを確認。
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sdb1               101086      5664     90203   6% /mnt
[root@fedora-8 ~]#

この状態で一旦仮想マシンをシャットダウンする。次にホストマシン上で、ゲストマシンのディレクトリを確認すると次のように "smallest.vmdk"と"smallest-flat.vmdx" というファイルができている。

[root@server Fedora-8]# ls -l
total 4398012
-rw------- 1 vmware vmware 4386586624 2008-07-25 16:47 Fedora-8.vmdk
-rw------- 1 vmware vmware          0 2008-07-11 20:28 Fedora-8.vmsd
-rwxr-xr-x 1 vmware vmware       1417 2008-07-25 16:20 Fedora-8.vmx
-rw------- 1 vmware vmware       8664 2008-07-25 16:47 nvram
-rw------- 1 vmware vmware  107374080 2008-07-25 16:47 smallest-flat.vmdk
-rw------- 1 vmware vmware        343 2008-07-25 16:34 smallest.vmdk
-rw-r--r-- 1 vmware vmware      39235 2008-07-25 16:47 vmware.log
[root@server Fedora-8]#

smallest.vmdkは仮想ディスクの情報が保存されているだけで、仮想ディスクの本体は smallest-flat.vmdk となる。さて、問題はこのフラットディスクだが、どのようなフォーマットだろうか? 最初の1セクタ分(=512バイト)だけダンプしてみると、

[root@server Fedora-8]# hexdump -C -n 512 smallest-flat.vmdk
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001b0  00 00 00 00 00 00 00 00  33 42 29 7a 00 00 00 01  |........3B)z....|
000001c0  01 00 83 fe 3f 0c 3f 00  00 00 8e 2f 03 00 00 00  |....?.?..../....|
000001d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200
[root@server Fedora-8]#

おや? とこかで見たような。"55 aa"で終わっているということはHDDのMBRパーティション・テーブルではないか。しかもMBRと同じ512バイトの領域の終りが"55 aa"になっているということは....、最初の512バイトはMBRそのもの、と思いfdiskコマンドでフラット・ディスクのファイルのパーティションテーブルを確認してみると、

[root@server Fedora-8]# fdisk -l smallest-flat.vmdk
Disk smallest-flat.vmdk: 0 MB, 0 bytes
255 heads, 63 sectors/track, 0 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x7a294233

             Device Boot      Start         End      Blocks   Id  System
smallest-flat.vmdk1               1          13      104391   83  Linux
[root@server Fedora-8]#

そう、VMwareのフラットディスクはHDDのイメージそのものだった!(⇒ゲストの仮想ディスクをホストでマウントして使う