KVM ゲスト OS イメージを CentOS/RHEL からループバックマウントする
KVM のゲストイメージを起動したくないけど、ゲストイメージの中身にある大事なファイルを取り出したい!というときはイメージファイルをループバックマウントすると良いでしょう。
ループバックマウントとは、(ブロックデバイスではなく、)ファイルシステム上のファイルを、ファイルシステム上にマウントすることです。
前提条件として、イメージファイルは(qcow2 などでは無く) raw 形式である必要があります。必要に応じて qemu-convert で形式変換しましょう。
Linux/XFSイメージ編〜
マウント手順
KVM 等のゲスト OS のイメージはブーダブルディスクイメージですので、最初がブートセクタだったり、管理系のパーティションがあったりします。
kpartx コマンドを使うと、そのイメージファイルのパーティション状況に応じて、パーティション毎にループバックデバイスファイルとして定義してくれます。
[root@kvm1 ~]# kpartx -av /images/guest1.raw add map loop0p1 (253:3): 0 209713119 linear /dev/loop0 2048
/dev/mapper/ 配下に loop*** というファイルが出来ることを確認します。複数のパーティションがあるときは複数のループバックデバイスファイルが出来ます。
[root@kvm1 ~]# ls /dev/mapper/ cl-root cl-swap cl-var control loop0p1 loop0p2 loop0p3
/mnt/test に適したループバックデバイスをマウントします。これでゲストOSの中身が見えるようになります。
[root@kvm1 ~]# mount /dev/mapper/loop0p3 /mnt/test [root@kvm1 ~]# cd /mnt/test/ [root@kvm1 test]# ls bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr
※ このケースでは losetup コマンドで実施しようとするとうまくいきませんでした。
# mount /images/guest1.raw /mnt/test -o loop
mount: /dev/loop0 is write-protected, mounting read-only
mount: unknown filesystem type '(null)'
アンマウント手順
# umount /mnt/test # kpartx -d guest1.raw loop deleted : /dev/loop0
Windows/NTFSイメージ編〜
Windows の場合、kpartx が使えませんでした。
[root@localhost ~]# kpartx -av win_image.raw Warning: Disk has a valid GPT signature but invalid PMBR. Assuming this disk is *not* a GPT disk anymore. Use gpt kernel option to override. Use GNU Parted to correct disk. add map loop0p1 (253:3): 0 104851456 linear /dev/loop0 2048 [root@localhost ~]#
なので真面目に開始位置を探ってマウントする、という方法を使います。
ですがその前に、Windows の場合は NTFS ファイルですので、CentOS や RHEL から標準ではマウントできません。
まずは必要パッケージをインストールします。
[root@localhost ~]# yum -y install epel-release [root@localhost ~]# yum -y install ntfsprogs
まずは普通にマウントを試みます。
[root@localhost work]# mount -t ntfs-3g -o loop win_image.raw /mnt/test NTFS signature is missing. Failed to mount '/dev/loop1': 無効な引数です The device '/dev/loop1' doesn't seem to have a valid NTFS. Maybe the wrong device is used? Or the whole disk instead of a partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?
マウントに失敗しました。これはファイルの最初のセクターが NTFS が始まっていないからです。エラーを回避するには NTFS が開始する位置を、offset オプションで決め打ちで指定する必要があります。
まずはファイルのパーティション情報を見てみます。
[root@localhost work]# fdisk -l -u win_image.raw Disk win_image.raw: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト Disk label type: dos ディスク識別子: 0x9b236d62 デバイス ブート 始点 終点 ブロック Id システム win_image.raw1 * 2048 718847 358400 7 HPFS/NTFS/exFAT win_image.raw2 718848 209711103 104496128 7 HPFS/NTFS/exFAT
1つ目は Windows の『システムで予約済み』の領域です。2つ目が C ドライブになっています。
始点が 718848 となっていますがこれがセクター番号です。1セクターが 512 byteと書かれているので、
を offset として指定します。
[root@localhost work]# mount -t ntfs-3g -o loop,offset=368050176 win_image.raw /mnt/test The disk contains an unclean file system (0, 0). Metadata kept in Windows cache, refused to mount. Falling back to read-only mount because the NTFS partition is in an unsafe state. Please resume and shutdown Windows fully (no hibernation or fast restarting.)
マウントできました。が、読み込み専用になってしまいました。
このイメージが高速スタートアップが有効な状態、もしくはハイバネーション( Hibernate ) された状態で shutdown されたことが原因のようです。
コメント