21.4. guestfish シェル
guestfish は、コマンドラインまたはシェルスクリプトから、ゲスト仮想マシンファイルシステムにアクセスするために使用できるインタラクティブなシェルです。libguestfs API の機能はすべて、シェルから利用できます。
仮想マシンのディスクイメージの表示または編集を開始するには、次のコマンドを実行して、使用するディスクイメージのパスを置き換えます。
$ guestfish --ro -a /path/to/disk/image
--ro は、ディスクイメージが読み取り専用で開かれていることを意味します。このモードは常に安全ですが、書き込みアクセスは許可しません。ゲスト仮想マシンが実行されていないことが確実な場合、またはディスクイメージがライブゲスト仮想マシンに接続されていない場合にのみ、このオプションを省略してください。libguestfs を使用してライブゲスト仮想マシンを編集することはできません。これを試みると、ディスクが破損し、元に戻せなくなります。
/path/to/disk/image は、ディスクへのパスです。これには、ファイル、ホストの物理マシン論理ボリューム (/dev/VG/LV など)、または SAN LUN (/dev/sdf3) があります。
注記
libguestfs および guestfish には root 権限は必要ありません。アクセスされているディスクイメージが root から読み取りまたは書き込み、あるいは両方を必要とする場合にのみ、これらを root として実行する必要があります。
guestfish を対話的に起動すると、以下のプロンプトが表示されます。
$ guestfish --ro -a /path/to/disk/image
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
><fs>
プロンプトで 実行 と入力して、ライブラリーを開始し、ディスクイメージを割り当てます。これは、最初に実行するときに最大 30 秒かかることがあります。その後の起動は、非常に速く完了します。
注記
libguestfs は、KVM (利用可能な場合) などのハードウェア仮想化アクセラレーションを使用して、このプロセスを高速化します。
run コマンドを入力すると、以下のセクションで示すように、他のコマンドを使用できます。
21.4.1. guestfish を使用したファイルシステムの表示
このセクションでは、guestfish でファイルシステムを表示する方法を説明します。
21.4.1.1. 手動によるリスト表示と表示
list-filesystems コマンドは、libguestfs が検出したファイルシステムのリストを表示します。この出力は、Red Hat Enterprise Linux 4 ディスクイメージを示しています。
><fs> run ><fs> list-filesystems /dev/vda1: ext3 /dev/VolGroup00/LogVol00: ext3 /dev/VolGroup00/LogVol01: swap
その他の便利なコマンドは、list-devices、list-partitions、lvs、pvs、vfs-type、および file です。help command と入力すると、以下の出力のように、コマンドの詳細とヘルプを表示できます。
><fs> help vfs-type NAME vfs-type - get the Linux VFS type corresponding to a mounted device SYNOPSIS vfs-type mountable DESCRIPTION This command gets the filesystem type corresponding to the filesystem on "device". For most filesystems, the result is the name of the Linux VFS module which would be used to mount this filesystem if you mounted it without specifying the filesystem type. For example a string such as "ext3" or "ntfs".
ファイルシステムの実際の内容を表示するには、最初にマウントする必要があります。
ls、ll、cat、そのmore、download、tar-out などの guestfish コマンドを使用して、ファイルおよびディレクトリーを表示およびダウンロードできます。
注記
このシェルには、現在の作業ディレクトリーの概念はありません。通常のシェルとは異なり、cd コマンドを使用してディレクトリーを変更することはできません。すべてのパスは、先頭のスラッシュ (/) 文字で始まる完全修飾する必要があります。Tab 鍵を使用して、パスを完成させます。
guestfish シェルを終了するには、exit と入力するか、Ctrl+d と入力します。
21.4.1.2. guestfish 検査経由
ファイルシステムを手動でリスト表示してマウントする代わりに、guestfish 自体がイメージを検証して、ゲスト仮想マシンのようにファイルシステムをマウントできます。これを行うには、コマンドラインに -i を追加します。
$ guestfish --ro -a /path/to/disk/image -i
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
Operating system: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
/dev/VolGroup00/LogVol00 mounted on /
/dev/vda1 mounted on /boot
><fs> ll /
total 210
drwxr-xr-x. 24 root root 4096 Oct 28 09:09 .
drwxr-xr-x 21 root root 4096 Nov 17 15:10 ..
drwxr-xr-x. 2 root root 4096 Oct 27 22:37 bin
drwxr-xr-x. 4 root root 1024 Oct 27 21:52 boot
drwxr-xr-x. 4 root root 4096 Oct 27 21:21 dev
drwxr-xr-x. 86 root root 12288 Oct 28 09:09 etc
...
インスペクションおよびマウントを実行するために、guestfish は libguestfs バックエンドを起動する必要があるため、-i オプションを使用する場合は run コマンドを使用する必要はありません。-i オプションは、多くの一般的な Linux ゲスト仮想マシンで機能します。
21.4.1.3. 名前によるゲスト仮想マシンのアクセス
ゲスト仮想マシンは、libvirt として知られる名前 (つまり virsh list --all にあるように) を指定するとコマンドラインからアクセスできます。-d オプションを使用して、ゲスト仮想マシンに名前 (-i オプションの有無にかかわらず) でアクセスします。
$ guestfish --ro -d GuestName -i
21.4.2. guestfish を使用したファイルの追加
guestfish でファイルを追加するには、完全な URI が必要です。ファイルは、ローカルファイル、ネットワークブロックデバイス (NBD) またはリモートブロックデバイス (RBD) に置かれたファイルのいずれかになります。
URI に使用する形式は、以下のいずれかになります。ローカルファイルの場合は ///: を使用します。
- guestfish -a disk.img
- guestfish -a file:///directory/disk.img
- guestfish -a nbd://example.com[:port]
- guestfish -a nbd://example.com[:port]/exportname
- guestfish -a nbd://?socket=/socket
- guestfish -a nbd:///exportname?socket=/socket
- guestfish -a rbd:///pool/disk
- guestfish -a rbd://example.com[:port]/pool/disk
21.4.3. guestfish を使用したファイルの変更
ファイルを変更したり、ディレクトリーを作成したり、ゲスト仮想マシンにその他の変更を加えたりする場合は、最初に本セクションの冒頭にある ゲスト仮想マシンをシャットダウンする必要がある に関する警告に留意してください。guestfish で実行中のディスクを編集または変更すると、ディスクが 破損します。ここでは、
/boot/grub/grub.conf
ファイルーを編集する例を説明します。ゲスト仮想マシンがシャットダウンしていることを確認したら、以下のようなコマンドを使用して書き込みアクセスを取得するために --ro フラグを省略できます。
$ guestfish -d RHEL3 -i
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
Operating system: Red Hat Enterprise Linux AS release 3 (Taroon Update 9)
/dev/vda2 mounted on /
/dev/vda1 mounted on /boot
><fs> edit /boot/grub/grub.conf
ファイルを編集するコマンドには、edit、vi、および emacs が含まれます。write、mkdir、upload、tar-in など、ファイルとディレクトリーを作成する多くのコマンドも存在します。
21.4.4. guestfish でのその他のアクション
また、mkfs、part-add、lvresize、lvcreate、vgcreate、pvcreate などのコマンドを使用して、ファイルシステムのフォーマットを設定し、パーティションを作成し、LVM 論理ボリュームなどのサイズを変更できます。
21.4.5. guestfish によるシェルスクリプト設定
guestfish を対話的に使用することに慣れたら、必要に応じてシェルスクリプトの記述が役に立つ場合があります。以下は、新しい MOTD (message of the day) をゲストに追加する単純なシェルスクリプトです。
#!/bin/bash - set -e guestname="$1" guestfish -d "$guestname" -i <<'EOF' write /etc/motd "Welcome to Acme Incorporated." chmod 0644 /etc/motd EOF
21.4.6. Augeas スクリプトと libguestfs スクリプト
libguestfs と Augeas を組み合わせると、Linux ゲスト仮想マシンの設定を操作するスクリプトを作成する場合に役立ちます。たとえば、次のスクリプトは、Augeas を使用してゲスト仮想マシンのキーボード設定を解析し、レイアウトを出力します。この例は、Red Hat Enterprise Linux を実行しているゲスト仮想マシンでのみ機能することに注意してください。
#!/bin/bash - set -e guestname="$1" guestfish -d "$1" -i --ro <<'EOF' aug-init / 0 aug-get /files/etc/sysconfig/keyboard/LAYOUT EOF
Augeas は、設定ファイルの変更にも使用できます。上記のスクリプトを修正して、キーボードレイアウトを変更できます。
#!/bin/bash - set -e guestname="$1" guestfish -d "$1" -i <<'EOF' aug-init / 0 aug-set /files/etc/sysconfig/keyboard/LAYOUT '"gb"' aug-save EOF
2 つのスクリプト間で、以下の 3 つの変更が行われたことに注意してください。
- 2 番目の例では --ro オプションが削除され、ゲスト仮想マシンに書き込む機能が利用できるようになりました。
- aug-get コマンドが、フェッチではなく値を変更するように aug-set に変更されました。新しい値は"gb" (引用符を含む) になります。
- ここでは aug-save コマンドを使用しているため、Augeas は変更をディスクに書き込みます。
注記
Augeas の詳細は、Web サイト http://augeas.net を参照してください。
guestfish には、本書で説明する以上の機能があります。たとえば、最初からディスクイメージを作成する場合は、次のコマンドを実行します。
guestfish -N fs
または、ディスクイメージからディレクトリー全体をコピーする場合は、次のコマンドを実行します。
><fs> copy-out /home /tmp/home
詳細は、man ページの guestfish(1) を参照してください。