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のイメージそのものだった!(⇒ゲストの仮想ディスクをホストでマウントして使う)