2013年01月08日
QCOW2 形式の仮想ディスクを作成する
QEMU のイメージファイル(仮想ディスクとして使用)を配布する際には、実際に使ったぶんだけファイルサイズが大きくなる(あるいは、別ファイルに差分だけを書き出せる)、QCOW2 形式(QEMU Copy-On-Write image file format version 2)が便利です。
buildroot でビルドした rootfs.tar から、QCOW2 形式のイメージファイルを作った時のメモです。
buildroot でビルドした rootfs.tar から、QCOW2 形式のイメージファイルを作った時のメモです。
環境は Ubuntu 12.04 64bit です。
追記:kpartx は不要でした。
qemu-img、qemu-nbd、kpartx をインストールして、nbd (Network Block Device) を準備します。
(ヘッダを作るだけなので、4GB でも、100GB でも、この段階では 136KB のファイルができるだけです。)
作成したパーティションにアクセスするために、kpartx を使用して、/dev/mapper/ 以下にマウントします。
ここでコピーしたサイズぶんだけ、イメージファイルが大きくなります。
終わったら umount します。
追記:kpartx は不要でした。
qemu-img、qemu-nbd
$ sudo apt-get install qemu-utilsqemu-img で QCOW2 形式のイメージファイルを作成します。ここではとりあえず 4GB で作成しました。kpartx$ sudo modprobe nbd max_part=16
(ヘッダを作るだけなので、4GB でも、100GB でも、この段階では 136KB のファイルができるだけです。)
$ qemu-img create -f qcow2 rootfs.qcow2 4GQCOW2 形式のファイルを Linux 上で扱うために、qemu-nbd というツールを使用して、イメージファイルを /dev/nbd0 に接続します。
$ sudo qemu-nbd --connect=/dev/nbd0 `pwd`/rootfs.qcow2後は普通に fdisk でパーティションを作成します。
$ sudo fdisk /dev/nbd0 Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): Using default value 1 First sector (2048-8388607, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-8388607, default 8388607): Using default value 8388607 Command (m for help): w追記:何もしなくても、/dev/nbd0p1 ができるようです。
1 番目のパーティション(今回は 1 つしかありませんが)を、mkfs.ext3 で ext3 ファイルシステムにフォーマットします。$ sudo kpartx -a /dev/nbd0
後は、適当なところに mount して、ファイルをコピーします。(同じ手順で、既存の QCOW2 イメージファイルから、ファイルを取り出すこともできます。)$ sudo mkfs.ext3 /dev/mapper/nbd0p1$ sudo mkfs.ext3 /dev/nbd0p1
ここでコピーしたサイズぶんだけ、イメージファイルが大きくなります。
終わったら umount します。
$ sudo mkdir /mnt/rootfs後始末をして終了です。 追記:kpartx は不要です。nbd0 を切断すると、自動的に nbd0p1 も消滅するようです。$ sudo mount /dev/mapper/nbd0p1 /mnt/rootfs$ sudo mount /dev/nbd0p1 /mnt/rootfs $ sudo tar xf buildroot-2012.11/output/images/rootfs.tar -C /mnt/rootfs/ $ sudo umount /mnt/rootfs/
参考:saito's memo ホーム > ARM > ARMエミュレーション$ sudo kpartx -d /dev/nbd0$ sudo qemu-nbd --disconnect /dev/nbd0