仮想化ソフトウェアのディスクイメージを変換

Virtualboxのハードディスクイメージのファイル形式はvdi形式ですが、VMwareのvmdk形式、VirtualPCのvhd形式、Parallelesのhdd形式については、VirtualBoxは対応しているので、そのまま利用できます。 qemu/kvmのqcow2形式やddなどで切り出したディスクイメージは、対応していないので変換をする必要があります。

仮想化ソフトウェア ディスクイメージタイプ VirtualBoxでの利用
VirtualBox vdi
VMware vmdk
VirtualPC vhd
Parallels hdd
qemu/kvm qcow2 ×
raw image 特になし(慣例的にimgなど) ×

ハードディスクイメージの変換に使うツールですが、VirtualBoxが対応しているディスクイメージとrawイメージについては付属の vboxmanage コマンドを利用して変換できます。 vboxmanage が対応していないディスクイメージについては、qemu/kvmのユーティリティである qemu-img を利用すると変換できます。

qemu/kvmのqcow2形式からVirtualboxのvdi/VMwareのvmdk形式

VirtualboxはVMwareのvmdk形式も利用する事ができるので、qemuのqemu-imgコマンドを使いvmdk形式に変換して利用します。 qemu-imgでvdiに対応したのでそのまま変換できます。

$ qemu-img convert -O vmdk (元イメージファイル名).qcow2 (変換イメージファイル名).vmdk

vdiにしたい場合は、一度rawイメージにしてからvdiに変換します。

$ qemu-img convert -O raw (元イメージファイル名).qcow2 (作業用ファイル名).raw
$ VBoxManage convertfromraw --format VDI (作業用ファイル名).raw (変換イメージファイル名).vdi

変換したイメージを少しコンパクトにしたいなら。

$ VBoxManage modifyhd (変換イメージファイル名).vdi --compact

余談ですが、VMwareの2Gごとに分割されたvmdkイメージを一つにするには、こんな感じにするとよいみたいです(未確認)

$ vmware-vdiskmanager -r (分割イメージファイル名).vmdk -t 0 (書き出すファイル名).vmdk

Virtualboxのvdi形式からqemu/kvmのqcow2形式

VirtualboxのVBoxManageコマンドを使ってrawかvmdk形式に変換してから、qemuのqemu-imgを使ってqcow2形式に変換します。

$ VBoxManage clonehd --format VMDK|VHD|RAW (元イメージファイル名).vdi (作業用ファイル名)
$ qemu-image convert -f vmdk|vhd|raw -O qcow2 (作業用ファイル名) (変換イメージファイル名).qcow2
VBoxManage clonehdを使うときの注意

Virtualbox 2.x系(?)では、VBoxManage clonehdにバグがあり、うまくクローニングできません。少なくとも 2.1/2.2ではダメでした。 clonehdでクローンした後、VBoxManage internalcommands sethduuid を使ってuuidを振りなおすと使えるようになります。

$ VBoxManage internalcommands sethduuid (作業用ファイル名) (2.1/2.2系の場合。3.x系は未確認)

実パーティション(Raw Partition)をディスクイメージに変換する

実パーティションをディスクイメージに変換するには、後述のqemu-nbdとntfsclone/partedを使います。

qemu/kvmのqemu-nbdを使うとネットワークブロックデバイス(nbd)を利用してイメージファイルの中のパーティションを直接操作できます。

参考

まずカーネルモジュールnbdを組み込みます。オプションのmax_partをつけないとパーティションが見えないので必ずつけてください。

# modprobe nbd max_part=16

nbdデバイスができました。

# ls /dev/nbd*
/dev/nbd0  /dev/nbd10  /dev/nbd12  /dev/nbd14  /dev/nbd2  /dev/nbd4  /dev/nbd6  /dev/nbd8
/dev/nbd1  /dev/nbd11  /dev/nbd13  /dev/nbd15  /dev/nbd3  /dev/nbd5  /dev/nbd7  /dev/nbd9

イメージファイルをnbdデバイスに接続します。例では/dev/nbd0にマウントしました。 参照のみで書き込みをしたくない場合は–read-onlyオプションをつけます。

# qemu-nbd -c /dev/nbd0 (イメージファイル).vdi|qcow2

パーティションが見えました。

# ls /dev/nbd*
/dev/nbd0    /dev/nbd1   /dev/nbd11  /dev/nbd13  /dev/nbd15  /dev/nbd3  /dev/nbd5  /dev/nbd7  /dev/nbd9
/dev/nbd0p1  /dev/nbd10  /dev/nbd12  /dev/nbd14  /dev/nbd2   /dev/nbd4  /dev/nbd6  /dev/nbd8

fdisk -lで/dev/nbd0を見てみます。

# fdisk -l /dev/nbd0
Disk /dev/nbd0: 21 GB, 21467980800 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot      Start         End      Blocks   Id  System
/dev/nbd0p1   *           1        2609    20956761    7  HPFS/NTFS

パーティションをマウントしてみました。

# mount -t ntfs /dev/nbd0p1 /mnt/
# ls /mnt/
AUTOEXEC.BAT            IO.SYS        Program Files              WINDOWS       f13531f3d40a89b79498
CONFIG.SYS              MSDOS.SYS     RECYCLER                   boot.ini      ntldr
Documents and Settings  NTDETECT.COM  System Volume Information  bootfont.bin  pagefile.sys

パーティションの操作を止めるにはアンマウントして、qemu-nbdの接続を解除します。

# umount /mnt
# qemu-nbd -d /dev/nbd0

イメージファイルを実パーティションのように扱えるということは、NTFSパーティションをコピーするntfscloneやパーティションを操作するpartedを使い、実パーティションからイメージファイル、イメージファイルから実パーティションといった操作もできます。

Windowsのシステムが入ったパーティーションをイメージファイル化して仮想化ソフトウェアで起動しても、起動しない事がほとんどです。(アクティベーションを除く) これはWindowsのHAL(Hardware Abstraction Layer)が実ハードウェアと仮想化ソフトウェアのハードウェアで違うことによって起こります。

Microsoftが出しているdisk2vhdを使うと、その辺の処理をしてイメージファイル化するので、WindowsパーティーションのP2Vをしたい場合は、そちらを使うほうが良いでしょう。

ntfscloneを使ってntfsパーティションを操作した例をあげます。

nbd0にイメージファイルをマウント。

# qemu-nbd -c /dev/nbd0 VIRTUALDISK.vdi

イメージファイルのパーティション1に対して、実パーティションの/dev/sda1をntfscloneでクローンします。

# ntfsclone -O /dev/nbd0p1 /dev/sda1