仮想マシンの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
|
いじょ。