QEMUのrawディスクイメージに関する覚え書き(後半)
「QEMUのrawディスクイメージに関する覚え書き(前半)」の続き。
rawイメージの中にアクセスする(続き)
パーティションテーブルから開始位置を取得する
losetupを用いてイメージに接続し、マウントしたい領域の開始位置を取得する。
パーティション内のファイルシステムにアクセスする場合とLVMの論理ボリューム内のファイルシステムにアクセスする場合とで作業の流れは異なる。
作業の注意としては、仮想マシン上のOSが動作している最中に読み書きモードでマウントしない。
仮想マシン停止時に読み書きモードでマウントする場合、下に書いているmountのマウントオプションroを外す。*1
$ LOOPDEV=$(/sbin/losetup -f) $ [[ ${?} -eq 0 ]] && sudo /sbin/losetup ${LOOPDEV} [rawファイル] $ /sbin/fdisk -lu ${LOOPDEV} Disk /dev/loop3: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders, total 8388608 sectors Units = セクタ数 of 1 * 512 = 512 bytes Disk identifier: 0x000a2c3b デバイス Boot Start End Blocks Id System /dev/loop3p1 * 63 208844 104391 83 Linux /dev/loop3p2 208845 8385929 4088542+ 8e Linux LVM
今回は/dev/loop3が使用されている。
パーティション内のファイルシステムをマウント
この時点では、通常のパーティションのほうはoffset指定(開始位置をずらす)によるマウントを行うことで内容にアクセスできる。「/dev/loop3p1」のパーティションのファイルシステムがext2の場合
$ sudo mount -t ext2 -o ro,loop,offset=$((63 * 512)) [rawファイル] [マウントポイント]
でマウントすることができる。
LVM 物理ボリューム(PV:Physical Volume)として使用されているパーティションの場合
しかし、(rawハードディスクイメージ内の)LVM 物理ボリュームとして使用されているパーティションはそのまま開くことはできない。
これを使用するためには、losetupをoffset指定付きで再び実行し、物理ボリューム全体をループバックデバイスに関連付ける(接続する)。
まず、一度先頭からループバック接続していたものを切断して
$ sudo /sbin/losetup -d ${LOOPDEV}
次に、offset指定をして再接続する。上の例では開始位置が「208845」のため、
$ LOOPDEV=$(/sbin/losetup -f) $ [[ ${?} -eq 0 ]] && sudo /sbin/losetup -o $((208845 * 512)) ${LOOPDEV} [rawファイル]
のようにする。すると
$ sudo /sbin/lvmdiskscan /dev/ramdisk [ 4.00 MB] /dev/loop0 [ 2.27 MB] /dev/ram [ 4.00 MB] (中略) /dev/loop3 [ 3.90 GB] LVM physical volume (中略) 0 LVM physical volume whole disks 1 LVM physical volume $ sudo /sbin/pvscan PV /dev/loop3 VG VolGroupCentOS lvm2 [3.88 GB / 0 free] Total: 1 [3.88 GB] / in use: 1 [3.88 GB] / in no VG: 0 [0 ] $ sudo /sbin/vgscan Reading all physical volumes. This may take a while... Found volume group "VolGroupCentOS" using metadata type lvm2 $ sudo /sbin/lvscan inactive '/dev/VolGroupCentOS/LogVolRootfs' [3.50 GB] inherit inactive '/dev/VolGroupCentOS/LogVolSwap' [384.00 MB] inherit
(ホストOS上の)検出コマンドから認識されているのが分かる。あとは利用可能な状態にしてマウントするだけ。
$ sudo /sbin/lvchange -a y /dev/VolGroupCentOS/LogVolRootfs $ sudo /sbin/lvscan ACTIVE '/dev/VolGroupCentOS/LogVolRootfs' [3.50 GB] inherit inactive '/dev/VolGroupCentOS/LogVolSwap' [384.00 MB] inherit $ sudo mount -t ext3 -o ro /dev/VolGroupCentOS/LogVolRootfs [ルートファイルシステムのマウントポイント] $ ls [ルートファイルシステムのマウントポイント] bin dev home lib64 media mnt poweroff root selinux sys usr boot etc lib lost+found misc opt proc sbin srv tmp var
これでやっとルート部分の内容にアクセスできるようになった。
作業後は後始末。
$ sudo umount [ルートファイルシステムのマウントポイント] $ sudo /sbin/lvchange -a n /dev/VolGroupCentOS/LogVolRootfs $ sudo /sbin/losetup -d ${LOOPDEV} $ unset LOOPDEV
もし、物理ボリュームが複数のパーティションにまたがっている場合、全ての物理ボリュームに対してlosetupで接続することになる?(未確認)
関連記事:
*1:「-o ro,loop,offset=...」と書かれているところは「-o loop,offset=...」にして、「-o ro」とだけ書かれているところは「-o」も含めて削る