qemu-imgで作ったディスクを手でマウントする

タイトル通り。
LVM使ってなかったら普通にoffsetつけてmountすればいいけど、ディスクイメージの中のsda2がLVMだったりした時の方法がわからなかったのでメモ。

loopデバイスにbindする。

# losetup /dev/loop0 rhel6.0-x86-base.img

partitionを読み込む

# kpartx -a /dev/loop0

vgscan

# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg_rhel60" using metadata type lvm2
:

見えた。

一応vgdisplayでも確認

# vgdisplay
  --- Volume group ---
  VG Name               vg_rhel60
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               3.51 GB
  PE Size               4.00 MB
  Total PE              898
  Alloc PE / Size       898 / 3.51 GB
  Free  PE / Size       0 / 0
  VG UUID               Bm5xYQ-GM7B-b6XC-RsRP-CCLS-H2L8-jtPNUU
:

ディスクイメージの中のvgをactiveに

# vgchange -ay vg_rhel60
  2 logical volume(s) in volume group "vg_rhel60" now active

mount

# mount /dev/vg_rhel60/lv_root /mnt/image/

中身を確認

# ls /mnt/image/
bin   cgroup  etc   lib         media  opt   root  selinux  sys  usr
boot  dev     home  lost+found  mnt    proc  sbin  srv      tmp  var

umountしてdeactiveして読み込んだパーティション消してloopのunbind

# umount /mnt/image/
# vgchange -an vg_rhel60
  0 logical volume(s) in volume group "vg_rhel60" now active
# kpartx -d /dev/loop0
# losetup -d /dev/loop0


上は簡単な例。
ディスクイメージにあるvgnameが他に見えてるvgnameと被ってると面倒臭いことになる。
例えばホストもゲストもRHEL5でVG名をデフォルトのままにしてると両方VolGroupNNとかになってて大変。
そんな時はUUIDを指定してvgnameを変更してあげればよい。

# vgdisplay
  --- Volume group ---
  VG Name               VolGroup00
:
  VG UUID               8hHQhB-ad0O-IKv0-cW0q-4HEI-P3l5-DVRd7K
# vgrename 8hHQhB-ad0O-IKv0-cW0q-4HEI-P3l5-DVRd7K YourGroup00
# vgchange -ay /dev/YourGroup00

まー、そんなことしなくてもはじめからvirt-xxxなコマンド使ってればよかったんやけど、やってしまったものはしょうがないのでこのままもう少しいじってみる。