ウェブサイト検索

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-tools

Archlinuxでは、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ツールをインストールする方法と、それらの一部を使用する方法を学びました。ディスクイメージ上のファイルシステムおよびパーティションを一覧表示する方法、ホストシステム上でゲストファイルシステムをマウントおよびアンマウントする方法、ホストからゲストファイルを直接編集する方法、最後にゲストファイルシステムからファイルをコピーする方法を見てきました。

関連記事: