Man On a Mission

システム運用屋が、日々のあれこれを記録していくブログです。情報処理技術者試験の話題多し。高度試験の攻略なども。最近はやや歴史づいてます…。

【Linux】KVMの仮想ハードディスクイメージをマウントする

以前、ディスクイメージファイルをマウントする方法について記事を書きました。
同様のパターンとしてKVMの仮想ハードディスクイメージをマウントしたいケースがあります。

KVMの仮想ハードディスクイメージをマウントしたい場合、raw形式であれば普通にループバックデバイスとしてマウント出来ますが、qcow2形式だとそうはいきません。
qcow2形式は、暗号化されていたり差分形式をとっていたりするためです。

とはいえ、どうにもならないわけではありません。qcow2形式のディスクイメージをマウントしたい場合は、nbd(Network Block Device)経由で行います。

そんなわけで、本日の記事はKVMのraw形式ディスクイメージ、qcow2形式ディスクイメージそれぞれのマウント方法について書きます。
なお、いつもの通り、この記事での例はUbuntuによるものです。

 ちなみに、普通のディスクイメージをマウントする方法について書いた過去記事はこちら。

oplern.hatenablog.com

oplern.hatenablog.com

ループバックデバイスの使い方を知らない方は、上記の記事からどうぞ。

raw形式の場合

raw形式のディスクイメージファイルであれば、以前紹介した記事の手法でいけます。
(下記例では、kpartxを使用)

# kpartx -av /var/lib/libvirt/images/raw_hdd.img
add map loop0p1 (252:0): 0 48232448 linear /dev/loop0 2048
add map loop0p2 (252:1): 0 2 linear /dev/loop0 48236542
add map loop0p5 : 0 4190208 linear /dev/loop0 48236544

# mount /dev/mapper/loop0p1 /mnt/hddimage/
$ ls /mnt/hddimage/
bin  boot  cdrom  dev  etc  home  initrd.img  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  sys  tmp  usr  var  vmlinuz

普通にOK。

qcow2形式の場合

qcow2形式のディスクイメージファイルの場合は、前述の通り、nbd経由でマウントします。
「nbd」というのは、Network Block Deviceの略で、その名の通りネットワーク上にある他マシンのブロックデバイス*1をネットワーク経由でローカルのブロックデバイスに見せかけるものです。
qemu-nbdというツールを使って、qcow2ディスクイメージをnbdクライアントとして扱うことでマウントします。

qemu-nbdがインストールされている必要があります。
qemu-nbdはqemu-utilsというパッケージに含まれますので、インストールされてなければ入れましょう。

# apt-get install qemu-utils

nbdを利用しますので、nbdカーネルモジュールをロードする必要があります。

# modprobe nbd

ロードすると、/dev下にnbdデバイスが現れます。

$ ls /dev/nbd*
/dev/nbd0  /dev/nbd10  /dev/nbd12  /dev/nbd14  /dev/nbd2  /dev/nbd4  /dev/nbd6  /dev/nbd8
/dev/nbd1  /dev/nbd11  /dev/nbd13  /dev/nbd15  /dev/nbd3  /dev/nbd5  /dev/nbd7  /dev/nbd9

では、qemu-nbdを利用して、とりあえずnbd0にディスクイメージを接続しましょう。

# qemu-nbd --connect=/dev/nbd0 /var/lib/libvirt/images/qcow2_hdd.img

qcow2に複数パーティションがあっても、kpartxなどを利用する必要はありません。
自動的にパーティションごとのデバイスを作ってくれます。下記例では/dev/nbd0p1が一つ目のパーティションです。

$ ls /dev/nbd0*
/dev/nbd0  /dev/nbd0p1  /dev/nbd0p2  /dev/nbd0p5

後は、マウントするだけです。

# mount /dev/nbd0p1 /mnt/hddimage/
$ ls /mnt/hddimage/
bin   cdrom  etc   initrd.img      lib    lost+found  mnt  proc  run   srv  tmp  var      vmlinuz.old
boot  dev    home  initrd.img.old  lib64  media       opt  root  sbin  sys  usr  vmlinuz

使い終わったら、アンマウントと併せてqemu-nbdでdisconnectしましょう。

# umount /mnt/hddimage 
# qemu-nbd --disconnect /dev/nbd0
/dev/nbd0 disconnected

 

 

*1:ハードディスクやCD/DVDドライブなどのこと