KVMゲストOSイメージをCentOSでループバックマウント(Windows/NTFS, Linux/XFS)

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 コマンドで実施しようとするとうまくいきませんでした。

# losetup -f /images/guest1.raw
# 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と書かれているので、

718848 * 512 = 368050176

を 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 されたことが原因のようです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする