KVMなどで使われているqcow2形式のディスクイメージは、単純なディスクイメージと異なり、そのままループバックに繋いでもマウントすることができません。中身を編集するには、qemu-nbd コマンドを使って nbd (Network Block Device) 経由で扱います。nbd は、ネットワーク経由でローカルディスク上にあるディスクイメージをリモートからブロックデバイスとして扱えるようにするための機能がメインのものですが、今回はローカルにあるqcow2のディスクイメージをマウントするのに使うので、ネットワークはあまり関係ありません。
今回は、Ubuntu のクラウド向けの qcow2 ディスクイメージ precise-server-cloudimg-amd64-disk1.img をマウントしてみます。
qemu-utils パッケージがインストールされていない場合はインストールします。
# apt-get install qemu-utils
nbd カーネルモジュールをロードします。
# modprobe nbd
ロードが正常に完了すると、/dev/nbd0 や /dev/nbd1 といったデバイスが見えます。
# ls /dev/nbd* /dev/nbd0 /dev/nbd1 /dev/nbd11 /dev/nbd13 /dev/nbd15 /dev/nbd3 /dev/nbd5 /dev/nbd7 /dev/nbd9 /dev/nbd0p1 /dev/nbd10 /dev/nbd12 /dev/nbd14 /dev/nbd2 /dev/nbd4 /dev/nbd6 /dev/nbd8
/dev/nbd0 に ディスクイメージを繋ぎます。
※ファイル名は絶対パスを書かないとエラーになるので、pwd
を付けています。
# qemu-nbd --connect=/dev/nbd0 `pwd`/precise-server-cloudimg-amd64-disk1.img
connectすると、パーティションがある場合は自動的にパーティションに応じたデバイスが自動的に作らるので、kpartxは不要です。
# ls /dev/nbd0* /dev/nbd0 /dev/nbd0p1
いまどのデバイスを使っているかは、コマンドでは確認できそうにないですが、プロセスをgrepして確認可能です。
# ps -ef | grep [q]emu-nbd root 11461 1 0 10:49 ? 00:00:00 qemu-nbd --connect=/dev/nbd0 /home/share/img/precise-server-cloudimg-amd64-disk1.img
後は、/dev/nbd0p1 を適当にマウントすれば中身が見られます。
# mkdir /mnt/tmp # mount /dev/nbd0p1 /mnt/tmp
ディスクイメージのデフォルトのパスワード変更したいなら、chroot して passwd コマンド叩けば、イメージ起動後にコンソールからログインできるようにもなります。
# chroot /mnt/tmp # passwd ubuntu # exit
後始末は、アンマウントして、disconnectします。disconnectの時は、デバイス名の前に"="は不要です。
# umount /mnt/tmp # qemu-nbd --disconnect /dev/nbd0 /dev/nbd0 disconnected