21.4. guestfish シェル

guestfish はインタラクティブシェルで、コマンドラインまたはシェルスクリプトからゲスト仮想マシンのファイルシステムにアクセスするために使用することができます。libguestfs API の機能はすべてシェルで利用することができます。
仮想マシンのディスクイメージを表示または編集する場合は、次のコマンドを入力します。パスは目的のディスクイメージに置き換えてください。
$ guestfish --ro -a /path/to/disk/image
--ro は、ディスクイメージを読み取り専用で開くという意味です。このモードは書き込みアクセスを許可しないため、常に安全なモードになります。ゲスト仮想マシンが実行中ではないことが 確実な 場合か、またはライブゲスト仮想マシンにディスクイメージが接続されていない場合以外は、このオプションは省略しないでください。ライブゲスト仮想マシンの編集には libguestfs は使用できません。無理に編集を行おうとするとディスクは破損し、元に戻せなくなります。
/path/to/disk/image は、そのディスクへのパスになります。ファイル、ホスト物理マシンの論理ボリューム (/dev/VG/LV など)、ホスト物理マシンのデバイス (/dev/cdrom)、または 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>
プロンプト時に run と入力してライブラリーを開始し、ディスクイメージを接続します。これを初めて行う場合には 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-deviceslist-partitionslvspvsvfs-typefile などがあります。以下のように 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".
ファイルシステムの実際の内容を表示するには、まずファイルシステムをマウントする必要があります。
ファイルやディレクトリーを表示してダウンロードする場合は、lsllcatmoredownloadtar-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 バックエンドを起動する必要があるため、run オプションを使用する場合は -i コマンドは必要ありません。-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
ファイルを編集するコマンドには editvi、および emacs などがあります。ファイルやディレクトリーを作成するコマンドには writemkdirupload、および tar-in など多数あります。

21.4.4. guestfish を使用したその他の動作

ファイルシステムの形式、パーティションの作成、LVM 論理ボリュームの作成およびサイズ変更などその他多くの動作を mkfspart-addlvresizelvcreatevgcreatepvcreate などのコマンドを使って実行することができます。

21.4.5. guestfish を使用したシェルスクリプトの作成

インタラクティブな guestfish の使い方に慣れたら、 必要に応じてシェルスクリプトを作成すると便利です。以下に新しい MOTD (本日のメッセージ) をゲストに追加する簡単なシェルスクリプトを示します。
#!/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 カ所あります。
  1. 2 番目の例には --ro オプションがありません。ゲスト仮想マシンへの書き込み権限を与えるためです。
  2. aug-get コマンドが aug-set コマンドに変わっています。値を新たに取得するのではなく、それを修正するためです。新しい値は "gb" になります (引用符を含む)。
  3. Augeas によって変更をディスクに書き込むよう aug-save コマンドが使用されています。

注記

Augeas の詳細については、Web サイト http://augeas.net をご覧ください。
guestfish では本ガイドでは取り上げきれないほどの多くのことができます。たとえば、ディスクイメージをゼロから作成することができます。
guestfish -N fs
または、ディスクイメージからディレクトリー全体をコピーします。
><fs> copy-out /home /tmp/home
詳細については guestfish(1) の man ページをご覧ください。