どこかに向かうらしい話

迷走エンジニアの放浪記

KVM便利コマンド - libguestfs

libguestfs

「libguestfs」パッケージとは、仮想マシンのディスクイメージにアクセスするライブラリです。
ホストマシンのコンソールから仮想マシン上でcatやlsなどのコマンドを発行するのもログインが生じたりとひと手間なことがあったりしますが、そのような手間がなく行うことができるようにするライブラリです。

情報は以下のURLに存在し、このサイトの情報をまとめております。
libguestfs, library for accessing and modifying VM disk images

パッケージに含まれる「virt-edit」コマンドにより、停止した仮想マシンに対するファイルの変更を直接行うことが出来ます。
「libguestfs」パッケージは、以下のコマンドでインストール可能です。

# yum install libguestfs libguestfs-tools libguestfs-tools-c

実際のところはKVMだけでなく、XenVirtualBox VDI, VMWareでも使えるみたいですが、自分がKVM使いなので、KVM以外には言及しません。
特に個人的によく用いている「virt-ls」「virt-cat」「virt-edit」「virt-copy-in」「virt-copy-out」を取り上げます。

virt-ls

単一のディレクトリまたは複数のディレクトリを(再帰的に)一覧表示します。

構文

virt-ls [--options] -d <domain_name> <dir> [<dir> ...]
virt-ls [--options] -a \<img_name\>.img [-a <img_name>.img ...] <dir> [<dir> ...]

ドメインmyDomainの /home配下にあるファイルとディレクトリの一覧を出力します。

# virt-ls -R -d myDomain /home/

ドメインmyDomainの /home配下にあるファイルとディレクトリの一覧の出力を、lessコマンドに引き渡すことにより、ファイルの内容をページ単位で自由に閲覧できるようにします。

# virt-ls -R -d myDomain /home/ | less

ドメインmyDomainのすべてのsetuidまたはsetgidプログラムを一覧表示します。

# virt-ls -lR -d myDomain /home/ | grep '^- [42]'

virt-cat

単一ファイルをダウンロードしてゲストに表示します。

構文

virt-cat [--options] -d <domain_name> <file_name> [<file_name> ...]
virt-cat [--options] -a <img_name>.img [-a <img_name>.img ...] <file_name> [<file_name> ...]

ドメインmyDomainの/etc/fstabファイルの内容を出力します。

# virt-cat -d myDomain /etc/fstab

ディスクイメージdisk.imgのsyslog messagesの末尾を出力します。

# virt-cat -a disk.img /var/log/messages | tail

virt-edit

ゲスト内の単一ファイルをインテラクティブに編集することができます。

構文

virt-edit [--options] -d <domain_name> <file_name> [<file_name> ...]
virt-edit [--options] -a <img_name>.img [-a <img_name>.img ...] <file_name> [<file_name> ...]
virt-edit [-d <domain_name>|-a <img_name>.img] <file_name> -e 'expr'

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。


ドメインmyDomainに対して、対話的にファイル/boot/grub/grub.confを編集します。

# virt-edit -d myDomain /boot/grub/grub.conf

ドメインmyDomainに対して、対話的にファイル/etc/passwdを編集します。

# virt-edit -d myDomain /etc/passwd

ゲストOSがWindowsの場合は、Windowsのパスを指定してください。

# virt-edit -d mywindomain 'c:\autoexec.bat'

virt-edit には、 単一ファイルに一方的に直接変更を加えることができる別モードもあります。
この非インテラクティブなモードで編集を行う場合は -e オプションを使用します。
たとえば、 このコマンドでは Linux ゲストの root パスワードをパスワードなしに変更します。

# virt-edit -d myDomain /etc/inittab -e 's/^id:.*/id:5:initdefault:/'

virt-copy-in

仮想マシンの指定したディレクトリに対し、ホストマシンのファイルやディレクトリをコピーすることができます。

構文

virt-copy-in -a <img_name>.img <file_name>|<dir> [<file_name>|<dir> ...] <dst_dir>
virt-copy-in -d <domain_name> <file_name>|<dir> [<file_name>|<dir> ...] <dst_dir>

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。

ドメインmyDomain内にある/etc/resolv.confを、ホストマシンに存在する/etc/resolv.confを用いてアップデートします。

# virt-copy-in -d myDomain resolv.conf /etc

ドメインmyDomain内にあるhomeディレクトリに、ホストマシンの/homeの情報を展開します。

# virt-copy-in -d myDomain skel /home

virt-copy-out

仮想マシンの指定したディレクトリに存在するファイルやディレクトリを、ホストマシンの指定したディレクトリをコピーすることができます。

構文

virt-copy-out -a <img_name>.img <file_name>|<dir> [<file_name>|<dir> ...] <local_dir>
virt-copy-out -d <domain_name> <file_name>|<dir> [<file_name>|<dir> ...] <local_dir>

警告

稼働中の仮想マシンに対して、このコマンドを使用してはいけません。
仮想マシン内のディスクが破損する恐れがあるため、必ず仮想マシンの停止した状態で実行してください。

ドメインmyDomainの/home以下をホストマシンのhomesディレクトリ以下にコピーします。

# mkdir homes
# virt-copy-out -d myDomain /home homes