VMwareで構築したマシンをQEMUで動かすためのメモ。

逆ケースは良く聞くけど、VMwareで作ったものをわざわざ遅いQEMUで動かそうって人は余りいないみたい。自分は、仮想マシンを動かしたい実マシンでVMwareが動かない(Cylix製のP6非互換CPUのため)からそんなことをやっている訳だけど。手順の概要としては、ゲストOSをシングルユーザーで立ち上げてvmware上のディスクイメージをddで吸い上げる感じ。

  • 退避用ディスク作成

QEMUVMware ver3,4形式のファイルを扱う機能があるみたいだけど、今回はVMware6で作ってしまったのでディスクイメージを吸い上げてしまう。もしかしたら、vmware-vdiskmanagerあたりでファイルを結合すればなんとかなったかも知れないけど。
とりあえず、コピー元のディスクと同等以上の空のディスクを作成し、ゲストに接続させる。VMware Player使いの人は、qemu-imgコマンドでディスクを作れるのでそれでもOK。vmxファイルにこんな風に記述をする。

ide0:1.present = "true"
ide0:1.fileName = "append_disk.vmdk"

接続した仮想ディスクはフォーマットしておく。ext2あたりがお勧めかな。ext3はkjournaldとか要るし。

  • シングルユーザ起動

肝心のディスクイメージの吸い上げだけど、当該パーティションがmountされているとなにかと不都合がある筈なので、マウントさせないようにしてOSを再起動する。具体的には/boot/grub/menu.lstにこう書く。

title linux (single,nomount)
root (hd0,0)
kernel /boot/vmlinuz-[お使いのカーネルイメージ] root=/dev/ram0 ro single
initrd /boot/initrd.img-[お使いのinitrd]
savedefault

debian 4.0で試したけどinitrdに必要なコマンドが含まれていたので再構成しないで済んだ。ありがたい。

  • ディスクイメージの吸い上げ

次に、ディスクイメージを吸い上げる。こんな感じ。

mkdir /mnt
mount -t ext2 /dev/hdb1 /mnt
dd if=/dev/hda of=/mnt/diskimage.img bs=1024

適切なブロックサイズは分からん。ちなみに、initrdのshはctrl-cとか効かないみたい。SIGUSR1とか送って進捗をみたり出来ない。

ちなみに、吸い上げたディスクイメージのパーティションの始まる位置が分かっていれば次のようにしてマウントすることができるみたい。

mount -o loop,offset=32256 [イメージファイル] /mnt/ … hda1をマウントさせる

vmware上のゲストを再起動してからftpするなりして、先ほど作ったイメージファイルをターゲットマシン上に転送させる。ディスクイメージはそのままで実行が可能なので、QEMUコマンドラインに指定してあげるだけで起動されるはず。

qemu -hda ./diskimage.img -boot c -vnc :0 -net nic -net user -redir tcp:8080::80

  • vncとか指定しているのは趣味。(ターゲットでXを動かしてないので)
  • redirはQEMUじゃブリッジ接続が出来な…嘘!出来るっぽいですな。TUN/TAPデバイスを使うとできるっぽい。あとで試そう〜。