(」・ω・)」うー!(/・ω・)/にゃー!

VM Disk Image の Mount 方法いくつかメモ

| Comments

仮想マシンのdisk imageをmountしたいことってよく有るけどよく忘れるのでメモメモ。 libguestfs使ってごにょごにょ、見たいなプログラマブルな話は含まない。

横着する方法

KVM raw image / Xen image

パーティションアライメントの分を考慮すれば簡単に行ける。 1セクタが512byteなら、

1
# mount -o loop,offset=$((63*512)) /path/to/image /mnt

怒られるなら1セクタのsizeが違う可能性が高いので調べる。

1
# /sbin/fdisk -l /path/to/images

とかすれば、1セクタが何byteかわかる。

KVM qcow2 image

基本は同じだけど、qcow2圧縮されてるのでこれを何とかしてから処理する。 qemu-nbdを使えば可能。 kernel moduleとしてnbdが普通は有効になってないことが多いので、これを有効にして使う。

1
2
# modprobe nbd
# qemu-nbd -c /dev/nbd0 /path/to/image.qcow2

これで/dev/nbd0のディスクとして見えるようになるので、あとはraw imageと同様にすればOK.

1
2
# /sbin/fdisk -l /dev/nbd0
# mount -o loop,offset=$((63*512)) /dev/nbd0 /mnt/

外すなら逆手順。

1
2
3
# umount /mnt
# qemu-nbd -d /dev/nbd0
# rmmod nbd

ちゃんとやる方法

適当なoffsetとかでゴツンてやるんじゃなくて、真面目にやるにはどうするか。 単に、mount -o loop,offset=…ってやらずに、kpartxとかを使ってやる、という違い。

kpartxを使うことで、いちいちセクタサイズを気にしなくて良くなるので、自動化するならこっちが便利。

raw image

まずはループデバイスとしてmountしてから、kpartで個別のpartitionにアクセスできるようにする。

1
2
3
4
5
6
7
# losetup -f
/dev/loop0
# losetup /dev/loop0 /path/to/image
# kpartx -av /dev/loop0
add map loop0p1 (253:0): 0 51199092 linear /dev/loop0 63
add map loop0p2 (253:1): 0 4096575 linear /dev/loop0 51199155
# mount /mnt /dev/mapper/loop0p1

これでアクセスできるようになる。 外すときは以下の要領で。

1
2
3
# umount /mnt
# kpart -dv /dev/loop0
# losetup -d /dev/loop0

qcow2 image

要領は同じで、losetupでやる代わりにnbdでやる感じ。

1
2
3
4
5
6
# modprobe nbd
# qemu-nbd -c /dev/nbd0 /path/to/image.qcow2
# kpartx -av /dev/nbd0
add map nbd0p1 (253:0): 0 51199092 linear /dev/nbd0 63
add map nbd0p2 (253:1): 0 4096575 linear /dev/nbd0 51199155
# mount /mnt /dev/mapper/nbd0p1

これでOK。 外すときは以下の通り。

1
2
3
4
# umount /mnt
# kpartx -dv /dev/nbd0
# qemu-nbd -d /dev/nbd0
# rmmod nbd

いじょ。

Comments