仮想マシン の中にあるファイルが必要になった場合、そのためだけに 仮想マシン を起動してというのはナンセンス。 QCOW2 仮想ディスク を直接マウントしてその中身を閲覧 編集 する方法を調べてみました。
libguestfsのインストール
QEMU-KVM環境の入ったUbuntu 18.04には、既にlibguestfs-toolsパッケージはインストール済みでした。
1 2 3 4 5 6 7 8 9 10 11 |
$ uname -a Linux WS-0300u 4.15.0-52-generic #56-Ubuntu SMP Tue Jun 4 22:49:08 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.6 LTS Release: 18.04 Codename: bionic $ sudo apt install libguestfs-tools libguestfs-tools はすでに最新バージョン (1:1.36.13-1ubuntu3.3) です。 |
guestmountでQCOW2仮想ディスクをマウント
以前、QEMU-KVMでXAMPP環境を構築した仮想マシンのQCOW2仮想ディスク(20GB程度)をマウントしてみます。
1 2 |
$ sudo guestmount -a /str500/conv1/xampp1.qcow2 -m /dev/mapper/ubuntu--vg-ubuntu--lv /mnt/tmp $ |
コマンドを発行してからプロンプトが戻ってくるまで数秒掛かることもありますが、エラーなくプロンプトが戻ってくればマウントは成功しています。特権ユーザでマウントしているので中に入るのも特権ユーザで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ls -l /mnt ls: '/mnt/tmp' にアクセスできません: 許可がありません drwxr-xr-x 2 root root 4096 Jul 6 2021 dav drwxr-xr-x 2 root root 4096 Feb 4 2021 part d????????? ? ? ? ? ? tmp $ sudo -i # ls -l /mnt drwxr-xr-x 2 root root 4096 Jul 6 2021 dav drwxr-xr-x 2 root root 4096 Feb 4 2021 part drwxr-xr-x 20 root root 4096 Jul 5 2021 tmp # cd /mnt/tmp # ls bin cdrom etc lib lib64 lost+found mnt proc run snap swap.img tmp var boot dev home lib32 libx32 media opt root sbin srv sys usr |
アンマウントは guestumount コマンドで。
1 |
$ sudo guestunmount /mnt/tmp |
ちなみに上述の例では、予めマウントしたいパーティションが分かっていたので -m オプションでそれを指定しましたが、よく分からない場合は -i オプションで良きに計らってもらうのが便利です。
1 |
$ sudo guestmount -a /str500/conv1/xampp1.qcow2 -i /mnt/tmp |
この guestmount では、QCOW2以外にもVMwareのVMDK形式などにも対応しているようなので、別の機会に試してみたいと思います。
参考) qemu-nbdを使う手法は…
QCOW2ファイルをマウントするもう1つの方法に、 qemu-nbd が挙げられます。
使い方は先ず、 modprobe でネットワークブロックデバイスを用意して、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ sudo modprobe nbd max_part=8 $ ls -l /dev/nbd* brw-rw---- 1 root disk 43, 0 Nov 27 16:31 /dev/nbd0 brw-rw---- 1 root disk 43, 16 Nov 27 16:31 /dev/nbd1 brw-rw---- 1 root disk 43, 160 Nov 27 16:31 /dev/nbd10 brw-rw---- 1 root disk 43, 176 Nov 27 16:31 /dev/nbd11 brw-rw---- 1 root disk 43, 192 Nov 27 16:31 /dev/nbd12 brw-rw---- 1 root disk 43, 208 Nov 27 16:31 /dev/nbd13 brw-rw---- 1 root disk 43, 224 Nov 27 16:31 /dev/nbd14 brw-rw---- 1 root disk 43, 240 Nov 27 16:31 /dev/nbd15 brw-rw---- 1 root disk 43, 32 Nov 27 16:31 /dev/nbd2 brw-rw---- 1 root disk 43, 48 Nov 27 16:31 /dev/nbd3 brw-rw---- 1 root disk 43, 64 Nov 27 16:31 /dev/nbd4 brw-rw---- 1 root disk 43, 80 Nov 27 16:31 /dev/nbd5 brw-rw---- 1 root disk 43, 96 Nov 27 16:31 /dev/nbd6 brw-rw---- 1 root disk 43, 112 Nov 27 16:31 /dev/nbd7 brw-rw---- 1 root disk 43, 128 Nov 27 16:31 /dev/nbd8 brw-rw---- 1 root disk 43, 144 Nov 27 16:31 /dev/nbd9 |
ネットワークブロックデバイスにQCOW2ファイルを、 qemu-nbd コマンドで引き当てます。
1 2 3 4 5 6 |
$ sudo qemu-nbd --connect=/dev/nbd0 /str500/conv1/xampp1.qcow2 $ ls -l /dev/nbd0* brw-rw---- 1 root disk 43, 0 Nov 27 16:31 /dev/nbd0 brw-rw---- 1 root disk 43, 1 Nov 27 16:31 /dev/nbd0p1 brw-rw---- 1 root disk 43, 2 Nov 27 16:31 /dev/nbd0p2 brw-rw---- 1 root disk 43, 3 Nov 27 16:31 /dev/nbd0p3 |
パーティション単位のデバイスを通常の mount コマンドでマウントするだけなのですが…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sudo mount /dev/nbd0p2 /mnt/tmp $ ls /mnt/tmp System.map-5.4.0-164-generic config-5.4.0-80-generic initrd.img-5.4.0-80-generic vmlinuz-5.4.0-167-generic System.map-5.4.0-167-generic grub initrd.img.old vmlinuz-5.4.0-80-generic System.map-5.4.0-80-generic initrd.img lost+found vmlinuz.old config-5.4.0-164-generic initrd.img-5.4.0-164-generic vmlinuz config-5.4.0-167-generic initrd.img-5.4.0-167-generic vmlinuz-5.4.0-164-generic $ sudo umount /mnt/tmp $ sudo mount /dev/nbd0p1 /mnt/tmp mount: /mnt/tmp: wrong fs type, bad option, bad superblock on /dev/nbd0p1, missing codepage or helper program, or other error. $ sudo mount /dev/nbd0p3 /mnt/tmp mount: /mnt/tmp: 未知のファイルシステムタイプ 'LVM2_member' です. |
LVMパーティションは正しく扱えないのかも知れません。加えて libguestfs に比べて qemu-nbd は、マウントするまでの手数が多くなってしまうので、正直あまり使う気にはなりませんでした。
最後に、ネットワークブロックデバイスの取り外します。
1 2 |
$ sudo qemu-nbd --disconnect /dev/nbd0 /dev/nbd0 disconnected |