2013年01月08日

QCOW2 形式の仮想ディスクを作成する

QEMU のイメージファイル(仮想ディスクとして使用)を配布する際には、実際に使ったぶんだけファイルサイズが大きくなる(あるいは、別ファイルに差分だけを書き出せる)、QCOW2 形式(QEMU Copy-On-Write image file format version 2)が便利です。

buildroot でビルドした rootfs.tar から、QCOW2 形式のイメージファイルを作った時のメモです。


環境は Ubuntu 12.04 64bit です。

追記:kpartx は不要でした。

qemu-img、qemu-nbd、kpartx をインストールして、nbd (Network Block Device) を準備します。
$ sudo apt-get install qemu-utils kpartx
$ sudo modprobe nbd max_part=16
qemu-img で QCOW2 形式のイメージファイルを作成します。ここではとりあえず 4GB で作成しました。
(ヘッダを作るだけなので、4GB でも、100GB でも、この段階では 136KB のファイルができるだけです。)
$ qemu-img create -f qcow2 rootfs.qcow2 4G
QCOW2 形式のファイルを 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 ができるようです。
作成したパーティションにアクセスするために、kpartx を使用して、/dev/mapper/ 以下にマウントします。
$ sudo kpartx -a /dev/nbd0
1 番目のパーティション(今回は 1 つしかありませんが)を、mkfs.ext3 で ext3 ファイルシステムにフォーマットします。
$ sudo mkfs.ext3 /dev/mapper/nbd0p1
$ sudo mkfs.ext3 /dev/nbd0p1
後は、適当なところに mount して、ファイルをコピーします。(同じ手順で、既存の QCOW2 イメージファイルから、ファイルを取り出すこともできます。)
ここでコピーしたサイズぶんだけ、イメージファイルが大きくなります。
終わったら umount します。
$ sudo mkdir /mnt/rootfs
$ 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/
後始末をして終了です。 追記:kpartx は不要です。nbd0 を切断すると、自動的に nbd0p1 も消滅するようです。
$ sudo kpartx -d /dev/nbd0
$ sudo qemu-nbd --disconnect /dev/nbd0
参考:saito's memo ホーム > ARM > ARMエミュレーション

トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード