libguestfs の使用は、 AMD64/Intel 64 アーキテクチャのみで完全サポートされています。
ディスクイメージファイルと定義ファイルは、いずれも Linux 環境では単純なファイルとして存在しているものです。そのため、さまざまなツールを利用してアクセスしたり、編集や書き込みを行ったりすることができます。正しく使用している限りにおいては、これらのツールを利用することでゲスト側を管理することができるようになります。しかしながら、これらのツールを正しく使用していても、リスク無しにディスクイメージを編集することはできません。ゲスト側のディスクイメージを編集する場合、下記のようなリスクが発生します:
データの破壊 : ホストマシンとクラスタ内の別ノードで同時にアクセスしてしまうと、仮想化による保護レイヤを迂回してしまうことになるため、データが失われたり破壊されたりしてしまいます。
セキュリティ : ループバックデバイスを利用したディスクイメージのマウントは、 root 権限が必要な作業です。ただし、イメージのマウントが成功してしまうと、他のユーザからディスクの内容にアクセスできてしまう場合があります。
管理上の作業ミス : 仮想化レイヤの迂回には仮想化のコンポーネントやツールに対する高度な理解が必要となります。イメージを仮想化コンポーネントから切り離して編集を行い、編集完了後に仮想化コンポーネントに戻す作業は、時として作業ミスを引き起こしやすくなっています。
libguestfs は C 言語で記述されたライブラリで、仮想マシン (VM ゲスト) のディスクイメージを安全に作成したり、アクセスや修正を行ったりする機能を提供するように設計されています。また libguestfs には、 Perl , Python , Ruby の言語バインディングも用意されています。 libguestfs は root 権限を使用せずに VM ゲスト のディスクイメージにアクセスする機能を提供しているほか、不正なディスクイメージへのアクセスを防ぐための多階層の防御を提供しています。
libguestfs は VM ゲスト のディスクイメージとその内容にアクセスしたり、それらを修正したりするための多数のツールを提供しています。これらのツールには、ゲスト内のファイルを表示したり編集したりするツールのほか、スクリプトを利用して VM ゲスト の変更を行ったり、ディスクの使用率に関する統計情報の監視やゲストの作成、 V2V もしくは P2V の移行を行う機能、バックアップの実施や VM ゲスト の複製、ディスクのフォーマットやサイズ変更などの機能が含まれています。
動作中の仮想マシンが使用しているディスクイメージに対しては、 libguestfs ツールを使用してはなりません。動作中の状態のままディスクイメージにアクセスしてしまうと、 VM ゲスト のディスクを破壊する結果になります。 libguestfs ツールからアクセスしようとすると、対象の仮想マシンが動作中であればエラーを表示しようとしますが、完全な仕組みではないことに注意してください。
なお、ほとんどのコマンドには --ro
(読み込み専用) オプションが用意されています。このオプションを指定すると、動作中の仮想マシンのディスクイメージにアクセスすることができます。ただし、仮想マシン側の動作によってファイルが正しく読み込めなくなってしまうことがありますが、ディスクが破壊されてしまうリスクはありません。
libguestfs は 4 個のパッケージから構成されています:
libguestfs0
: メインの C 言語ライブラリです。
guestfs-data
: イメージを起動する際に使用するアプライアンスファイルが含まれています (/usr/lib64/guestfs
ディレクトリ内に保存されています) 。
guestfs-tools
: 中枢となる guestfs ツールやマニュアルページ、そして /etc/libguestfs-tools.conf
の設定ファイルが含まれています。
guestfs-winsupport
: guestfs ツールから Windows ゲストのファイルにアクセスするための機能が含まれています。このパッケージは、 Windows ゲストを KVM に移行する場合など、 Windows ゲストにアクセスする場合にのみ必要となります。
guestfs ツールをお使いのシステムにインストールするには、下記を実行します:
>
sudo
zypper in guestfs-tools
guestfs-tools パッケージ内にあるツールを使用することで、仮想マシンのディスクイメージにアクセスしたり、ディスクイメージを編集したりすることができます。この機能は、ディスクイメージの一貫性を損なうことがないようにするセーフガード付きのわかりやすいシェルインターフェイスを介して提供されていて、ここから guestfs API の全ての機能を利用することができます。また、マシンにインストールされているファイルと /usr/lib64/guestfs
内のファイルを使用することで、その場でアプライアンスを作成することもできます。
guestfs ツールは下記のファイルシステムに対応しています:
Ext2, Ext3, Ext4
Xfs
Btrfs
複数のディスク形式にも対応しています:
raw
qcow2
guestfs では Windows* のファイルシステム (VFAT, NTFS) のほか、 BSD* や Apple* のファイルシステムにも対応していますし、その他のディスクイメージ形式 (VMDK, VHDX) にも対応しています。ですが、これらのファイルシステムとディスクイメージ形式は、いずれも openSUSE Leap ではサポート対象外となります。
virt-rescue
#Edit sourcevirt-rescue
はレスキュー CD と同様の機能を提供する仕組みですが、仮想マシン向けに動作し、 CD を使用せずに作業を行うことができます。 virt-rescue
はユーザに対してレスキューシェルを提供し、仮想マシンやディスクイメージ内に存在する問題を調査し、修正する機能を提供します。
>
virt-rescue -a sles.qcow2
Welcome to virt-rescue, the libguestfs rescue shell.
Note: The contents of / are the rescue appliance.
You need to mount the guest's partitions under /sysroot
before you can examine them. A helper script for that exists:
mount-rootfs-and-do-chroot.sh /dev/sda2
><rescue>
[ 67.194384] EXT4-fs (sda1): mounting ext3 file system
using the ext4 subsystem
[ 67.199292] EXT4-fs (sda1): mounted filesystem with ordered data
mode. Opts: (null)
mount: /dev/sda1 mounted on /sysroot.
mount: /dev bound on /sysroot/dev.
mount: /dev/pts bound on /sysroot/dev/pts.
mount: /proc bound on /sysroot/proc.
mount: /sys bound on /sysroot/sys.
Directory: /root
Thu Jun 5 13:20:51 UTC 2014
(none):~ #
これで VM ゲスト をレスキューモードでアクセスすることができるようになります:
(none):~ # cat /etc/fstab devpts /dev/pts devpts mode=0620,gid=5 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 tmpfs /run tmpfs noauto 0 0 /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1
virt-resize
#Edit sourcevirt-resize
は仮想マシンのディスクのサイズを変更するためのツールで、サイズの拡張や縮小だけでなく、ディスク内のパーティションのサイズ変更や削除にも対応しています。
手順例: 仮想マシンのディスクサイズの拡張
まずは仮想マシンの電源を落としてシャットオフ状態にします。その後、仮想マシンのディスクイメージ内にあるパーティションのサイズを読み取ります:
>
virt-filesystems --long --parts --blkdevs -h -a sles.qcow2
Name Type MBR Size Parent
/dev/sda1 partition 83 16G /dev/sda
/dev/sda device - 16G -
virt-resize
はディスクイメージを直接書き換えることはできません。その代わり、サイズ変更後のディスクを用意して対応します。たとえば truncate
コマンドを利用して、適切なサイズの仮想ディスクを作成します:
>
truncate -s 32G outdisk.img
あとは virt-resize
コマンドを利用して、ディスクイメージのサイズを変更します。このとき、入力元と出力先のディスクイメージをそれぞれ指定する必要があることに注意してください:
>
virt-resize --expand /dev/sda1 sles.qcow2 outdisk.img
Examining sles.qcow2 ...
**********
Summary of changes:
/dev/sda1: This partition will be resized from 16,0G to 32,0G. The
filesystem ext3 on /dev/sda1 will be expanded using the 'resize2fs'
method.
**********
Setting up initial partition table on outdisk.img ...
Copying /dev/sda1 ...
◐ 84%
⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒════════⟧ 00:03
Expanding /dev/sda1 using the 'resize2fs' method ...
Resize operation completed with no errors. Before deleting the old
disk, carefully check that the resized disk boots and works correctly.
あとはイメージのサイズが想定通りになっていることを確認します:
>
virt-filesystems --long --parts --blkdevs -h -a outdisk.img
Name Type MBR Size Parent
/dev/sda1 partition 83 32G /dev/sda
/dev/sda device - 32G -
新しいディスクイメージを利用して VM ゲスト を起動して、正しく動作することを確認してください。古いイメージの削除は、動作確認が完了してから実施してください。
さまざまな管理作業を単純化するための guestfs ツールも用意されています。これにはたとえばファイルの閲覧や編集、仮想マシン内の情報採取などが含まれています。
virt-filesystems
#Edit sourceこのツールは、ディスクイメージや仮想マシン内にある、ファイルシステムやパーティション、論理ボリュームなどの情報を表示することができます。
>
virt-filesystems -l -a sles.qcow2
Name Type VFS Label Size Parent
/dev/sda1 filesystem ext3 - 17178820608 -
virt-ls
#Edit sourcevirt-ls
コマンドは、仮想マシンやディスクイメージ内にあるファイルの名前やサイズ、チェックサムや拡張属性などを出力します。複数のディレクトリを指定することもでき、この場合はそれぞれの出力が繋げられて出力されます。 libvirt のゲスト側からディレクトリの一覧を表示したい場合は、 -d
オプションを指定してゲストの名前を入力してください。ディスクイメージから表示したい場合は、 -a
オプションをお使いください。
>
virt-ls -h -lR -a sles.qcow2 /var/log/
d 0755 776 /var/log
- 0640 0 /var/log/NetworkManager
- 0644 23K /var/log/Xorg.0.log
- 0644 23K /var/log/Xorg.0.log.old
d 0700 482 /var/log/YaST2
- 0644 512 /var/log/YaST2/_dev_vda
- 0644 59 /var/log/YaST2/arch.info
- 0644 473 /var/log/YaST2/config_diff_2017_05_03.log
- 0644 5.1K /var/log/YaST2/curl_log
- 0644 1.5K /var/log/YaST2/disk_vda.info
- 0644 1.4K /var/log/YaST2/disk_vda.info-1
[...]
virt-cat
#Edit sourcevirt-cat
はファイルの内容を出力するためのコマンドラインツールで、仮想マシンの名前やディスクイメージを指定して処理を行います。複数のファイル名を指定した場合は、それぞれが繋げられた状態で出力されます。また、ファイル名はフルパスでなければなりません (つまり、 '/' で始まるルートディレクトリからのパスを指定する必要があります) 。
>
virt-cat -a sles.qcow2 /etc/fstab
devpts /dev/pts devpts mode=0620,gid=5 0 0
proc /proc proc defaults 0 0
virt-df
#Edit sourcevirt-df
は仮想マシンのファイルシステム内での空き容量を表示するためのコマンドラインツールです。その他のツールとは異なり、仮想マシンに割り当てられたサイズを表示するだけでなく、ディスクイメージ内でどれだけの領域を使用しているのかを表示することができます。
>
virt-df -a sles.qcow2
ファイルシステム 1K-ブロック 使用 使用可能 使用%
sles.qcow2:/dev/sda1 16381864 520564 15022492 4%
virt-edit
#Edit sourcevirt-edit
は仮想マシン (またはディスクイメージ) 内に存在するファイルを編集するためのコマンドラインツールです。
virt-tar-in/out
#Edit sourcevirt-tar-in
は非圧縮の TAR 書庫を仮想マシンのディスクイメージもしくは指定した名前の仮想マシンに展開します。 virt-tar-out
はその逆で、仮想マシンのディスクイメージや仮想マシンのディレクトリを TAR 書庫にまとめます。
>
virt-tar-out -a sles.qcow2 /home homes.tar
virt-copy-in/out
#Edit sourcevirt-copy-in
はローカルのディスク内にあるファイルやディレクトリを仮想マシンのディスクイメージもしくは指定した名前の仮想マシンにコピーします。 virt-copy-out
はその逆で、仮想マシンのディスクイメージもしくは指定した名前の仮想マシンから、ファイルやディレクトリをローカルのディスクにコピーします。
>
virt-copy-in -a sles.qcow2 data.tar /tmp/>
virt-ls -a sles.qcow2 /tmp/ .ICE-unix .X11-unix data.tar
virt-log
#Edit sourcevirt-log
は指定した名前の libvirt 仮想マシンもしくはディスクイメージ内にあるログファイルを表示します。 guestfs-winsupport パッケージがインストールされていれば、 Windows の仮想マシンディスクイメージから、イベントログの内容を表示することもできます。
>
virt-log -a windows8.qcow2
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Events>
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"><System><Provider Name="EventLog"></Provider>
<EventID Qualifiers="32768">6011</EventID>
<Level>4</Level>
<Task>0</Task>
<Keywords>0x0080000000000000</Keywords>
<TimeCreated SystemTime="2014-09-12 05:47:21"></TimeCreated>
<EventRecordID>1</EventRecordID>
<Channel>System</Channel>
<Computer>windows-uj49s6b</Computer>
<Security UserID=""></Security>
</System>
<EventData><Data><string>WINDOWS-UJ49S6B</string>
<string>WIN-KG190623QG4</string>
</Data>
<Binary></Binary>
</EventData>
</Event>
...
guestfish
#Edit sourceguestfish
は仮想マシンのファイルシステムを調査したり修正したりするためのシェルおよびコマンドラインツールです。 libguestfs を使用し、 guestfs API の全ての機能を提供します。
使用例:
>
guestfish -a disk.img <<EOF
run
list-filesystems
EOF
guestfish 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> add sles.qcow2 ><fs> run ><fs> list-filesystems /dev/sda1: ext3 ><fs> mount /dev/sda1 / cat /etc/fstab devpts /dev/pts devpts mode=0620,gid=5 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs noauto 0 0 debugfs /sys/kernel/debug debugfs noauto 0 0 usbfs /proc/bus/usb usbfs noauto 0 0 tmpfs /run tmpfs noauto 0 0 /dev/disk/by-id/ata-QEMU_HARDDISK_QM00001-part1 / ext3 defaults 1 1
libguestfs には、 Xen の仮想マシンや物理マシンを KVM のゲストに変換する機能が用意されています。 下記の章では、物理マシン (ベアメタルマシン) を KVM の仮想マシンに変換する特殊な使用例を説明しています。
ただし、物理マシンから KVM 仮想マシンへの変換は、 openSUSE Leap ではサポート対象外となっており、技術プレビューとしての提供にとどまっています。
物理マシンの変換に際しては、まず物理マシンに関する情報収集を行い、それを変換サーバに送信する必要があります。この作業は、対象のマシン内で virt-p2v
と KIWI NG を実行することで行うことができます。
まずは必要なパッケージをインストールします:
>
sudo
zypper in virt-p2v kiwi-desc-isoboot
ここで説明している手順は、起動可能な DVD を作成するための ISO イメージの作成手順となります。この方法以外にも、 PXE 起動イメージを作成する方法もあります。 KIWI NG での PXE 起動イメージの構築方法について、詳しくは man virt-p2v-make-kiwi
をお読みください。
KIWI NG の設定を作成します:
>
virt-p2v-make-kiwi -o /tmp/p2v.kiwi
-o
オプションを指定することで、 KIWI NG の設定ファイルの出力先を指定しています。
生成された設定内にある config.xml
ファイルを必要に応じて修正します。たとえば config.xml
ファイルを編集して、システムのキーボードレイアウトを調整するなどの処理があります。
kiwi
を利用して ISO イメージを構築します:
>
kiwi --build /tmp/p2v.kiwi1 \
-d /tmp/build2 \
--ignore-repos \
--add-repo http://(リポジトリのパス)3 \
--type iso
ISO イメージを DVD もしくは USB メモリに書き込みます。このメディアから起動を行うことで、変換対象のマシンを起動することができます。
システムを起動すると、 変換サーバ の接続詳細を尋ねられます。このサーバは、 virt-v2v
パッケージがインストールされたマシンを意味します。
DHCP クライアントよりも複雑なネットワーク設定を行っている場合は、
ボタンを押して、 YaST のネットワーク設定ダイアログを開いてください。ボタンを押して、ウイザードの次の手順に進みます。
変換対象のディスクとネットワークインターフェイスを選択したあと、 CPU の割当数やメモリ、仮想マシン名などの仮想マシン向けのデータを設定します。
何も指定しない場合、作成されたディスクイメージ形式は既定で raw になります。これは の項目内で形式を指定することで、変更を行うことができます。
仮想マシンの生成方法には 2 種類の仕組みがあります。それぞれ ローカル および libvirt 出力と呼ばれます。前者の場合、仮想マシンのディスクイメージと設定の出力先を の項目に指定します。これらは virsh
を利用することで、 libvirt の管理する仮想マシンにすることができます。後者の場合は 内に定義されたプール内にディスクイメージを配置して、新しく libvirt の管理する仮想マシンを作成します。
を押して開始してください。
btrfs をルートパーティションとしているイメージ (openSUSE Leap の既定値です) に対して guestfs ツールを使用すると、下記のようなエラーメッセージが表示されることがあります:
>
virt-ls -a /path/to/sles12sp2.qcow2 /
virt-ls: multi-boot operating systems are not supported
If using guestfish '-i' option, remove this option and instead
use the commands 'run' followed by 'list-filesystems'.
You can then mount file systems you want by hand using the
'mount' or 'mount-ro' command.
If using guestmount '-i', remove this option and choose the
filesystem(s) you want to see by manually adding '-m' option(s).
Use 'virt-filesystems' to see what file systems are available.
If using other virt tools, multi-boot operating systems won't work
with these tools. Use the guestfish equivalent commands
(see the virt tool manual page).
これは一般に、ゲスト内にスナップショットが存在することによって発生します。この場合、どのスナップショットから起動すべきなのかが判断できないことを表しています。特定のスナップショットを指定して起動する場合は、 -m
オプションを指定してください:
>
virt-ls -m /dev/sda2:/:subvol=@/.snapshots/2/snapshot -a /path/to/sles12sp2.qcow2 /
libguestfs アプライアンス内で問題を分析する場合、環境変数 LIBGUESTFS_DEBUG=1 を指定すると、デバッグメッセージを出力することができます。出力されるコマンドや API コールを guestfish でのコマンドに似た形式で出力したい場合は、環境変数 LIBGUESTFS_TRACE=1 を指定してください。
libguestfs-test-tool
#Edit sourcelibguestfs-test-tool
ツールは、 libguestfs の基本的な機能が動作しているかどうかを確認するためのテストプログラムです。大量の分析用メッセージと guestfs 環境詳細が出力され、テストイメージを作成して開始しようとします。テストが問題なく完了すると、下記のようなメッセージが末尾付近に現れるはずです:
===== TEST FINISHED OK =====