kvm ( qemu-kvm ) の仮想ディスク・イメージ

qemu-img  qemu-nbd kpartx

QEMUは多くのディスクイメージをサポートします。 増加するディスクイメージ(空でないセクターが書き込まれるごとに大きくなる)や、圧縮された、暗号化されたディスクイメージを含みます。

仮想ディスクイメージの作成やコンバートするコマンドとして qemu-img をつかいます。現時点での「qemu-img バージョン 0.15.1」では、以下のフォーマットをサポートしているようです。httpとかftpとかありますね。これはどんな形式か今度調べてみますわ。

Supported formats:
rbd tftp ftps ftp https http host_cdrom host_floppy host_device
file blkverify sheepdog blkdebug nbd parallels qed qcow2 vvfat
vpc bochs dmg cloop vmdk vdi qcow cow raw

この中で raw qcow2 qcow cow vmdk cloop 形式を説明します。

  • raw
    Raw ディスクイメージフォーマット(デフォルト)。このフォーマットは単純なディスク・イメージで、ddコマンドで出力する形式と同じであり、他の仮想エミュレータに簡単にコンバート可能です。ユーザーのファイルシステムが holes(例えば、Linux での ext2 や ext3 で、Windows での NTFS で)をサポートしていれば、 書き込まれたセクターのみがスペースを保存します。qemu-img info を使用して、イメージ又は Unix/Linux 上で ls -ls で使用されている本当のサイズを知ることができます。また、linux上のmountコマンドで -t loop とし ループバックデバイスとして簡単にマウントできます。
  • qcow2
    QEMU イメージフォーマットは最も柔軟性のあり、kvmを使用するにあたって一般的なフォーマットです。より小さなイメージ (例えば Windows で使用フィルシステムが holes をサポートしない場合)、オプションの AES 暗号化、zlib ベースの圧縮、及び 複数 VM スナップショットのサポートなどを得るのに使用します。
  • qcow
    旧来の QEMU イメージフォーマットです。古いバージョンとの互換性の為にのみ含まれています。
  • cow
    ユーザーモード Linux Copy On Write イメージフォーマットです。cow フォーマットは以前のバージョンとの互換性の為にのみ含まれています。Windows では機能しません。
  • vmdk
    VMware 3 と 4 の互換イメージフォーマットです。
  • cloop
    cloopは圧縮ループイメージで、Debian系の1CD,DVD Linuxとして有名なKNOPPIXのルートファイルシステムとして利用されていることで有名であり、圧縮したままディスクイメージとしてマウントできます。使用例としては Knoppix の CD-ROMやDVDディスクやイメージファイルを起動する時くらいです。

※ 以下 OS環境 Fedora 16 64bit にて検証

仮想ディスク・イメージ qemu-img コマンド

使い方: qemu-img command [command options]

qcow2形式(サイズ増加形式)で4GBサイズを作成
# qemu-img create -f qcow2 qcow2.img 4G

イメージの情報を確認
# qemu-img info qcow2.img

kvmの起動例
# qemu-kvm -m 1024 -cpu core2duo -hda qcow2.img -cdrom DVD.iso

qcow2形式のマウント

qcow2形式のイメージファイルをスタンドアローン起動Linuxからマウントしてみる。

qcow2形式のマウントはqemu-nbdをつかう。qemu-nbdはqemuで用いられる特殊なVMディスク(qcow2フォーマット,例えば差分形式であったり暗号化されていたりする)をループバックマウントするためのツールです。

nbdモジュールのロード、/dev/nbd0にマッピング接続。
# modprobe nbd
//connect
# qemu-nbd -c /dev/nbd0 qcow2.img

プロセスを確認するとqemu-nbdが駐在してる
# ps ax | grep qemu-nbd

fsidkでパーティション情報を読み取る
# fdisk -lu /dev/nbd0

ループバックでマウント。fdiskで得たセクタ情報を元にする。
# mount -o loop,offset=$((63*512)) /dev/nbd0 /mnt/nbd1

/dev/nbd0のマッピングを切断。
// disconnect
# qemu-nbd -d /dev/nbd0

qemu-nbdプロセスが終了していることを確認する
# ps ax | grep qemu-nbd

kpartxコマンドでフォーマットする

fdiskやpartinfoのようなコマンドがあればオフセットを知るのは容易かと思うが、kpartxというコマンド使うことでより容易に(オフセットを計算せずに)任意のパーティションをマウントできる。kpartxはパーティション毎のブロック・デバイス・ファイルを /dev/mapper/の下に生成できる。

kpartxを使ってqemu-nbdのマッピング接続からマッパーデバイスを作成する(/dev/mapper/nbd0p1)
# kpartx -a /dev/nbd0

フォーマットしてみる
# mkfs.ext3 /dev/mapper/nbd0p1

マウントしてみる
# mount -t ext3 /dev/mapper/nbd0p1 /mnt/nbd

確認
# df -hT
ファイルシス       タイプ   サイズ  使用  残り 使用% マウント位置
rootfs             rootfs     110G   17G   92G   16% /
devtmpfs           devtmpfs   7.7G     0  7.7G    0% /dev
tmpfs              tmpfs      7.8G  236K  7.8G    1% /dev/shm
/dev/sda2          ext4       110G   17G   92G   16% /
tmpfs              tmpfs      7.8G   50M  7.7G    1% /run
tmpfs              tmpfs      7.8G     0  7.8G    0% /sys/fs/cgroup
tmpfs              tmpfs      7.8G     0  7.8G    0% /media
/dev/sda1          ext4       2.0G  145M  1.8G    8% /boot
/dev/mapper/nbd0p1 ext3       4.0G   73M  3.7G    2% /mnt/nbd

マッパーデバイスを解除
# kpartx -d /dev/nbd0

仮想ディスク・イメージのその他

今回は qemu-img で qcow2形式を作成、qemu-nbdでスタンドアローン起動のOSでマッピング・マウント、そしてkpartxで仮想ディスク・イメージをマッパーデバイスに割り当てしフォーマットしてみた。

この他、「別の形式タイプを扱うこと」や「仮想イメージのスナップショットをとる」などいろいろできるので、試してみるといいと思う。

補足だが、qemu-imgコマンドは、VmWare のイメージファイル(vmdk)をコンバート(変換)することができる。( qemu-img convert ) そしてXenはraw形式をサポートしている。

関連したページ

nexia access map
x