libguestfsツールを使用して仮想マシンのディスクイメージにアクセスし、変更する
以前の記事では、コマンドラインからkvm仮想マシンを作成する方法を見ましたが、今回はチュートリアルとして、最も一般的に使用されるLinuxディストリビューション上のlibguestfsパッケージの一部であるユーティリティを使用して、仮想マシンのディスクイメージにアクセスし、変更する方法を学びます。これらのツールを使用することで、さまざまな作業を行うことができます。
私たちは、ゲストディスクイメージに存在するファイルシステムをリストするために使用できるvirt-filesystemsや、ホストシステム上にマウントするためのguestmountなど、いくつかの項目に焦点を当てます。
このチュートリアルでは、次のことを学びます。
- 最も使用されているLinuxディストリビューションのいくつかにlibguestfs-toolsをインストールする方法
- ゲストディスクイメージに存在するパーティションとファイルシステムをリストする方法
- ホストシステム上でゲストファイルシステムをマウントおよびアンマウントする方法
- ホストシステムからゲストファイルを編集する方法
- ゲストシステムにファイルをコピーする方法とゲストシステムからファイルをコピーする方法
インストール
このチュートリアルで話すツールを、最も使用されているLinuxディストリビューションの公式リポジトリからネイティブパッケージマネージャを使って直接インストールできます。たとえばFedoraでは、dnfを使用します。このディストリビューションでは、ユーティリティはlibguestパッケージに含まれています:
sudo dnf install libguestfs
Debian系のディストリビューションやDebian自体では、インストールを実行するためにaptラッパーを使用できます。パッケージの名前はlibguestfs-toolsです。
sudo apt install libguestfs-toolsArchlinuxでは、Fedoraと同様に、パッケージはlibguestfsと呼ばれています。pacmanを使用してインストールを行うことができます。
sudo pacman -Sy libguestfsこのパッケージは、私たちが仮想マシンのディスクイメージと対話し、とても便利な作業を行うことができる多くのユーティリティを提供します。いくつかの例を見始める前に注意点があります:libvirtを使用して上記のユーティリティのいずれかを呼び出そうとすると、次のエラーメッセージが表示されます:
libguestfs: error: could not create appliance through libvirt.この問題の解決策は、コマンドを呼び出すために使用しているシェルで LIBGUESTFS_BACKEND 変数を「direct」に設定してエクスポートすることによって、qemuを直接実行することです。あるいは、それを私たちの環境の一部にすることもできます:
export LIBGUESTFS_BACKEND=directゲストパーティションとファイルシステムのリスト
virt-filesystems ユーティリティを使用すると、仮想マシンのディスクイメージ上に存在するファイルシステム、パーティション、およびブロックデバイスをリストすることができます。その使用例をいくつか見てみましょう。このツールは、スイートに含まれるほぼすべてのツールと同様に、基本的に2つの方法で使用できます。最初の方法は、-d オプションを使用して仮想マシンのドメインを渡すことです。この戦略が採用されると、ゲストが使用しているすべてのディスクが分析されます:
virt-filesystems [options] -d <domain>私たちが使用できるもう一つの戦略は、-aオプションの引数として、ユーティリティにディスクイメージのパスを直接提供することです:
virt-filesystems [options] -a /path/to/disk仮想化された Fedora 35 システムで、fedora35.qcow2 ディスクイメージを使用して、コマンドが返すものをテストしてみましょう。ディスク上のすべてのファイルシステムを一覧表示するには、次のように実行します:
virt-filesystems -a fedora35.qcow2
/dev/sda1
/dev/sda2コマンドは2つのファイルシステムを発見しました。さらに情報を取得するために、-lオプション(--longの省略形)を追加することができます。
virt-filesystems -la fedora35.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext4 - 1020702720 -
/dev/sda2 filesystem ext4 - 20038230016 -
ご覧の通り、ファイルシステムの種類やサイズなどの詳細が含まれています。ファイルシステムのサイズを人間が読みやすい形式にするために(第四列)、コマンドに-hオプションを追加できます。出力は次のようになります:
virt-filesystems -lha fedora35.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext4 - 973M -
/dev/sda2 filesystem ext4 - 19G -
デフォルトではマウント可能なファイルシステムのみがリストに表示されます。非マウント可能なファイルシステム(例えばスワップ)もリストに表示させるには、--extraオプションを使用できます。
デバイスタイプの指定
上で見たように、このユーティリティのデフォルトの動作は、ディスクイメージ上に存在するファイルシステムを表示することです。しかし、リストに明示的に表示する「エンティティ」のタイプを指定することができます。例えば、ディスクイメージ上に存在するパーティションのリストを取得するには、--partitionsオプションを使用します。
virt-filesystems --partitions -la fedora35.qcow2
Name Type MBR Size Parent
/dev/sda1 partition 83 1073741824 /dev/sda
/dev/sda2 partition 83 20400046080 /dev/sda
同様に、論理ボリューム(--logical-volumes)、ボリュームグループ(--volume-groups)、または物理ボリューム(--physical-volumes)を視覚化することができます。すべてを含めるには、単に--allオプションを使用すればよいです。
virt-filesystems --all -la fedora35.qcow2そのようにすると、出力リストにいくつかのエントリが複数回表示されることがあります:例えば、/dev/sda1 はパーティションですが、ext4 ファイルシステムを含んでいます。
Name Type VFS Label MBR Size Parent
/dev/sda1 filesystem ext4 - - 1020702720 -
/dev/sda2 filesystem ext4 - - 20038230016 -
/dev/sda1 partition - - 83 1073741824 /dev/sda
/dev/sda2 partition - - 83 20400046080 /dev/sda
/dev/sda device - - - 21474836480 -
出力をCSV形式でフォーマットする
前の例で見たように、virt-filesystemsによって生成される出力はデフォルトでリスト形式ですが、--csvオプションを使用することで、CSV(カンマ区切り値)形式を使用することができます。
virt-filesystems --all --csv -la fedora35.qcow2
Name,Type,VFS,Label,MBR,Size,Parent
/dev/sda1,filesystem,ext4,,,1020702720,
/dev/sda2,filesystem,ext4,,,20038230016,
/dev/sda1,partition,,,83,1073741824,/dev/sda
/dev/sda2,partition,,,83,20400046080,/dev/sda
/dev/sda,device,,,,21474836480,ホスト上でゲストファイルシステムのマウントとアンマウント
guestmountおよびguestunmountユーティリティを使用することにより、ホスト上でゲストファイルシステムをそれぞれマウントおよびアンマウントすることが可能です。ゲストシステムが実行中の場合、ファイルシステムは常に読み取り専用モードでマウントする必要があります。そうしないと、ファイルシステムが破損する可能性があります。そのため、書き込み操作を行う必要がある場合は、最初に仮想マシンをシャットダウンする必要があります。
ゲストファイルシステムは、FUSE(ユーザースペースのファイルシステム)を使用して、ホスト上に非ルートユーザーとしてマウントすることができます。この場合、マウントポイントとして使用されるディレクトリの所有者である必要があるのはそのユーザーです。
以前見た fedora35.qcow2 ディスクイメージを使用した実践的な例を見てみましょう。 virt-filesystems の出力から、/dev/sda1 に ext4 ファイルシステムが存在することがわかります。ここでは、mountpoint というディレクトリを作成し、ゲストファイルシステムを読み取り専用モードでマウントします。
mkdir mountpoint
guestmount -a fedora35.qcow2 -m /dev/sda1 --ro mountpoint上記のコマンドを見てみましょう。前の例と同様に、-aオプションを使用してディスクイメージのパスを指定しました。一方、-mオプションを使用してマウントすべきゲストファイルシステムを指定し、--roで読み取り専用モードでマウントすることを指定しました。最後に、ホストファイルシステムのどこにマウントするかを指定しました。
ls -l mountpoint
total 110224
-rw-r--r--. 1 root root 240738 Feb 23 18:25 config-5.16.11-200.fc35.x86_64
drwxr-xr-x. 3 root root 17 Feb 27 15:51 efi
drwx------. 5 root root 97 Feb 27 15:56 grub2
-rw-------. 1 root root 62396530 Feb 27 15:55 initramfs-0-rescue-c4f17c4c03ad474cb43ee9e586b29d0c.img
-rw-------. 1 root root 21517654 Feb 27 15:57 initramfs-5.16.11-200.fc35.x86_64.img
drwxr-xr-x. 3 root root 21 Feb 27 15:52 loader
lrwxrwxrwx. 1 root root 47 Feb 27 15:52 symvers-5.16.11-200.fc35.x86_64.gz -> /lib/modules/5.16.11-200.fc35.x86_64/symvers.gz
-rw-------. 1 root root 5958331 Feb 23 18:25 System.map-5.16.11-200.fc35.x86_64
-rwxr-xr-x. 1 root root 11371408 Feb 27 15:54 vmlinuz-0-rescue-c4f17c4c03ad474cb43ee9e586b29d0c
-rwxr-xr-x. 1 root root 11371408 Feb 23 18:25 vmlinuz-5.16.11-200.fc35.x86_64
ゲストファイルシステムを再帰的にマウントしたい場合はどうでしょうか?例えば、ゲスト内部で/dev/sda1がブートパーティションを表し、/bootにマウントされているとします。一方、ルートパーティションは/dev/sda2であるため、ホスト上でこのマウントスキームを再現したい場合は、最初にそれをマウントする必要があります。以下のコマンドを使えば簡単にできます:
guestmount -a fedora35.qcow2 -m /dev/sda2 -m /dev/sda1:/boot --ro mountpoint上記では、マウントしたい各ファイルシステムごとに2回、-mオプションを使用しました。/dev/sda1:/bootという表記を使用することで、/dev/sda1ファイルシステムを/bootにマウントすべきであると宣言しました。ここでの「/boot」は、ゲストのマウントポイントです。
ゲストファイルシステムのアンマウント
ゲストファイルシステムをアンマウントするには、guestunmountを使用できます。使い方は非常にシンプルで、ユーティリティを呼び出し、マウントポイントを引数として渡すだけです。この場合、次のように実行します:
guestunmount mountpointゲストシステム内のファイルを編集する
virt-editユーティリティを使用すると、ホストシステムから仮想マシンディスク内のファイルを直接変更できます。前述のように、仮想マシンが実行中にファイルを変更することは危険であるため、そのような操作を行う前にゲストシステムを停止する必要があります。
virt-editを使用してファイルを編集するのは非常に簡単です。前の例と同様に、ディスクイメージまたはゲストシステムドメインのパスと、ファイル自体のパスを提供します。例として、“fedora”ドメインで識別されるゲストの/etc/fstabファイルを編集するには、以下のコマンドを実行します:
virt-edit -d fedora /etc/fstabファイルはホストファイルシステムの /tmp ディレクトリにコピーされ、デフォルトのエディタで開かれます。複数のファイルを1つのコマンドで指定することができ、それらは次々と開かれます(最初のファイルが閉じられた後に2番目のファイルが開かれますなど…):
virt-edit -d fedora /etc/fstab /etc/crypttabゲストシステムへのファイルのコピーとコピーアウト
仮想マシンのディスクイメージ間でファイルをコピーするには、それぞれ virt-copy-in と virt-copy-out ユーティリティを使用できます。再度、-d オプションでドメインを指定し、その後にコピーするファイルまたはファイル群を指定し、最後に宛先ディレクトリを指定することができます。
コマンドがどのように機能するかを示すための例よりも良いものはありません。たとえば、「fedora」ドメインに関連付けられたゲストシステムから、ホストファイルシステム内の現在の作業ディレクトリに/etc/fstabファイルをコピーしたいとします。ここでは、virt-copy-outを呼び出す方法を示します:
virt-copy-out -d fedora /etc/fstab .ホストからゲスト仮想マシンのファイルシステムに1つ以上のファイルをコピーするには、代わりにvirt-copy-inを使用します。現在のディレクトリにある「fstab」ファイルをゲストファイルシステムの/etc/ディレクトリに戻すために、私たちは以下の手順を行います:
virt-copy-in -d fedora fstab /etc/締めくくりの考え
このチュートリアルでは、最も一般的に使用されるLinuxディストリビューションのいくつかにlibguestfsツールをインストールする方法と、それらの一部を使用する方法を学びました。ディスクイメージ上のファイルシステムおよびパーティションを一覧表示する方法、ホストシステム上でゲストファイルシステムをマウントおよびアンマウントする方法、ホストからゲストファイルを直接編集する方法、最後にゲストファイルシステムからファイルをコピーする方法を見てきました。
