試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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」も含めて削る