qemu-system-アーキテクチャ (たとえば qemu-system-x86_64) で仮想マシンを起動した場合、ユーザ側からの操作を受け付けるためのモニタコンソールが起動されます。モニタコンソール内ではコマンドを入力して実行することができますので、ここからリムーバブルメディアの変更やスクリーンショットの採取、オーディオのキャプチャなど、仮想マシンに対するさまざまな制御を行うことができます。
下記の章では、便利な QEMU のモニタコマンドとその用途を説明しています。全てのコマンドを一覧で表示したい場合は、 QEMU モニタのコマンドラインで help と入力して実行してください。
libvirt 向けにはモニタコンソールが提供されない件についてモニタコンソールにアクセスするには、仮想マシンを qemu-system-アーキテクチャ コマンドで直接起動し、グラフィカルな出力を組み込みの QEMU ウインドウ内に表示させる必要があります。
仮想マシンを libvirt (たとえば virt-manager) で起動している場合で、 VNC や Spice セッション経由で出力を表示させている場合は、モニタコンソールに直接アクセスすることはできません。ただし、 virsh で下記のように入力して実行することで、モニタコマンドを送信することができます:
# virsh qemu-monitor-command コマンドモニタコンソールへのアクセス方法は、仮想マシンの出力に使用しているディスプレイデバイスの種類によって異なります。ディスプレイに関する詳細は、 36.3.2.2項 「ディスプレイのオプション」 をお読みください。たとえば -display gtk オプションを利用してモニタを表示させている場合、 Ctrl–Alt–2 を押すことでモニタコンソールを表示させることができます。同様に -nographic オプションを利用している場合は、 Ctrl–A C を押すことでモニタコンソールに切り替えることができます。
コンソールの使用方法についてヘルプを表示したい場合は、 help もしくは ? と入力して実行します。特定のコマンドに対するヘルプを表示したい場合は、 help コマンド のように入力して実行してください。
ゲストシステムに関する情報を取得したい場合は、 info を使用します。オプションを何も指定しないで実行すると、指定可能なオプションの一覧が表示されます。オプションでは、表示したい情報を指定します:
info versionQEMU のバージョンを表示します。
info commands利用可能な QMP コマンドの一覧を表示します。
info networkネットワークの状態を表示します。
info chardevキャラクタデバイスを表示します。
info blockハードディスクやフロッピィディスク、 CD-ROM ドライブなどのブロックデバイスに関する情報を表示します。
info blockstatsブロックデバイスに関する読み書きの統計情報を表示します。
info registersCPU レジスタを表示します。
info cpus利用可能な CPU に関する情報を表示します。
info historyコマンドラインの履歴を表示します。
info irq輪の込みに関する統計情報を表示します。
info pici8259 (PIC) の状態を表示します。
info pciPCI の情報を表示します。
info tlb仮想メモリから物理メモリへのマッピング情報を表示します。
info mem有効な仮想メモリマッピングを表示します。
info jit動的なコンパイラの情報を表示します。
info kvmKVM の情報を表示します。
info numaNUMA の情報を表示します。
info usbゲスト USB デバイスの情報を表示します。
info usbhostホスト USB デバイスの情報を表示します。
info profileプロファイル情報を表示します。
info captureキャプチャ (オーディオ採取) 情報を表示します。
info snapshots現時点で保存されている仮想マシンのスナップショットを表示します。
info status現在の仮想マシンの状態に関する情報を表示します。
info miceどのマウスがイベントを受信しているのかを表示します。
info vncVNC サーバの状態を表示します。
info name現在の仮想マシンの名前を表示します。
info uuid現在の仮想マシンの UUID を表示します。
info usernetユーザネットワークスタックの接続情報を表示します。
info migrate移行の状態を表示します。
info balloonバルーンデバイスの情報を表示します。
info qtreeデバイスツリーを表示します。
info qdmqdev デバイスモデルリストを表示します。
info romsROM を表示します。
info migrate_cache_size現時点での移行 xbzrle ( 「Xor Based Zero Run Length Encoding」 ) のキャッシュサイズを表示します。
info migrate_capabilitiesxbzrle 圧縮などのさまざまな移行機能の状態を表示します。
info mtreeVM ゲスト のメモリ階層構造を表示します。
info trace-events利用可能なトレースイベントとその状態を表示します。
VNC のパスワードを変更するには、 change vnc password と入力して実行し、新しいパスワードを入力します:
(qemu) change vnc password Password: ******** (qemu)
ゲストの動作中に新しいディスクを接続 (ホットプラグ) したい場合は、 drive_add と device_add の各コマンドを使用します。まずは新しいドライブを定義し、それをバス (この例では 0) に接続する流れになります:
(qemu) drive_add 0 if=none,file=/tmp/test.img,format=raw,id=disk1 OK
ブロックサブシステムへの問い合わせを行うことで、新しいデバイスが追加されていることを確認することができます:
(qemu) info block [...] disk1: removable=1 locked=0 tray-open=0 file=/tmp/test.img ro=0 drv=raw \ encrypted=0 bps=0 bps_rd=0 bps_wr=0 iops=0 iops_rd=0 iops_wr=0
新しいドライブを定義したら、あとはゲスト側からアクセスすることができるようにするため、接続を行います。通常のデバイスであれば virtio-blk-pci もしくは scsi-disk のいずれかをドライバとして使用します。指定可能な値の一覧を表示するには、下記のように入力して実行します:
(qemu) device_add ? name "VGA", bus PCI name "usb-storage", bus usb-bus [...] name "virtio-blk-pci", bus virtio-bus
後は下記のようにしてデバイスを追加するだけです:
(qemu) device_add virtio-blk-pci,drive=disk1,id=myvirtio1
下記のように入力して実行すると、接続されたことを確認することができます:
(qemu) info pci
[...]
Bus 0, device 4, function 0:
SCSI controller: PCI device 1af4:1001
IRQ 0.
BAR0: I/O at 0xffffffffffffffff [0x003e].
BAR1: 32 bit memory at 0xffffffffffffffff [0x00000ffe].
id "myvirtio1"device_add で追加したデバイスは、 device_del で削除を行うことができます。詳しくは QEMU のモニタコマンドラインから help device_del と入力して実行することで表示される、ヘルプをお読みください。
リムーバブルデバイスのメディアを取り出すには、 eject デバイス名 コマンドを使用します。必要であれば -f オプションを追加して、強制的に取り出すこともできます。
リムーバブルメディア (たとえば CD-ROM) のメディアを交換したい場合は、 change デバイス名 コマンドを使用します。リムーバブルメディアの名前は、 info block コマンドで確認することができます:
(qemu)info blockide1-cd0: type=cdrom removable=1 locked=0 file=/dev/sr0 ro=1 drv=host_device(qemu)change ide1-cd0 /path/to/image
モニタコンソールを使用することで、キーボードやマウスの入力を擬似することができます。たとえば、お使いのグラフィカルユーザインターフェイス側で認識されてしまうようなキー入力、たとえば X Window であれば Ctrl–Alt–F1 を VM ゲスト に送信したい場合、 sendkey キー入力 のように入力して実行することで、擬似的にキー入力を送信することができます:
sendkey ctrl-alt-f1
キー入力 の箇所で指定可能なキー名の一覧を表示するには、 sendkey と入力して <Tab> を押します。
マウスを制御したい場合は、下記のようなコマンドを使用することができます:
mouse_move DX dy [ DZ ]dx, dy (およびホイールスクロール dz) の分だけ、有効なマウスポインタを移動します。
mouse_button 値マウスボタンの押下状態を変更します (1=左, 2=中央, 4=右) 。
mouse_set インデックスイベントを受信するマウスを選択します。デバイスのインデックス番号は、 info mice コマンドで取得することができます。
仮想マシンを -balloon virtio オプション付きで起動している場合 (準仮想化デバイスが有効化されている場合) 、利用可能なメモリを動的に変更することができるようになります。バルーンデバイスの有効化に関する詳細については、 35.1項 「qemu-system-ARCH を利用した基本的なインストール」 をお読みください。
モニタコンソール内でバルーンデバイスに関する情報を取得したり、バルーンデバイスが有効化されているかどうかを調べたりしたい場合は、 info balloon コマンドを実行します:
(qemu) info balloon
バルーンデバイスが有効化されていれば、 balloon メモリ量 (MB 単位) を入力して実行することで、メモリ量を変更することができます:
(qemu) balloon 400
仮想マシンのメモリをディスクやコンソール出力に保存したい場合は、下記のコマンドをお使いください:
memsave アドレス サイズ ファイル名アドレス で指定したアドレスを開始点として、 サイズ で指定したサイズ分の仮想メモリダンプを ファイル名 のファイルに保存します。
pmemsave アドレス サイズ ファイル名アドレス で指定したアドレスを開始点として、 サイズ で指定したサイズ分の物理メモリダンプを ファイル名 のファイルに保存します。
アドレス で指定したアドレスを開始点として、 書式 文字列に従って仮想メモリダンプを出力します。このとき、 書式 には カウント, 形式, サイズ をそれぞれ指定します:
カウント パラメータには表示すべき項目数を指定します。
形式 には x (16 進数), d (符号付き 10 進数), u (符号無し 10 進数), o (8 進数), c (char 型) or i (アセンブラインストラクション) のいずれかを指定します。
サイズ パラメータには b (8 ビット), h (16 ビット), w (32 ビット) ,g (64 ビット) のいずれかを指定します。 x86 の場合、 i で h や w を指定することで、 16 ビットと 32 ビットのインストラクションサイズを選択することができます。
アドレス で指定したアドレスを開始点として、 書式 文字列に従って物理メモリダンプを出力します。このとき、 書式 には カウント, 形式, サイズ をそれぞれ指定します:
カウント パラメータには表示すべき項目数を指定します。
形式 には x (16 進数), d (符号付き 10 進数), u (符号無し 10 進数), o (8 進数), c (char 型) or i (アセンブラインストラクション) のいずれかを指定します。
サイズ パラメータには b (8 ビット), h (16 ビット), w (32 ビット) ,g (64 ビット) のいずれかを指定します。 x86 の場合、 i で h や w を指定することで、 16 ビットと 32 ビットのインストラクションサイズを選択することができます。
QEMU モニタ内でのスナップショット管理機能は、 SUSE ではサポートしていません。本章内での情報は、特定の用途で役に立つものです。
仮想マシン のスナップショット機能は、 CPU やメモリ、書き込み可能な全てのディスクの内容を含む、仮想マシン内の全情報のスナップショットです。仮想マシンのスナップショット機能を使用するには、少なくとも 1 台以上のリムーバブルでない書き込み可能メディアが存在し、かつそれが qcow2 ディスク形式を使用していなければなりません。
スナップショット機能は、お使いの仮想マシンの状態を保存したい場合に便利な機能です。たとえば仮想サーバ内のネットワークサービスを設定していて、何か実験やテストなどを行ってサーバを不安定にしてしまうようなことを行いたい場合、あとから元の状態にすぐに安定状態に戻す用途で使用したりすることができます。また、仮想マシンの電源を落としてスナップショットを採取することで、バックアップとして使用することもできます。本章では前者について説明しています。後者については 35.2.3項 「qemu-img を利用した仮想マシンのスナップショット管理」 で説明しています。
QEMU モニタ内でスナップショットを管理するコマンドとして、下記のようなものが用意されています:
savevm 名前新しい仮想マシンのスナップショットを採取し、 名前 で指定した名前で保存します。既に同名のスナップショットが存在している場合は、上書きされます。
loadvm 名前名前 で指定した名前の仮想マシンスナップショットを読み込みます。
delvm仮想マシンのスナップショットを削除します。
info snapshots利用可能なスナップショットについて情報を表示します。
(qemu) info snapshots Snapshot list: ID1 TAG2 VM SIZE3 DATE4 VM CLOCK5 1 booting 4.4M 2013-11-22 10:51:10 00:00:20.476 2 booted 184M 2013-11-22 10:53:03 00:02:05.394 3 logged_in 273M 2013-11-22 11:00:25 00:04:34.843 4 ff_and_term_running 372M 2013-11-22 11:12:27 00:08:44.965
仮想マシンの一時停止や再開を行いたい場合は、下記のようなコマンドを使用します:
stop仮想マシンの動作を一時的に停止します。
cont一時停止していた仮想マシンを再開します。
system_reset仮想マシンをリセットします。物理マシンでリセットボタンを押した場合と同じ動作になります。これにより、ファイルシステムが不安定な状態になる可能性があります。
system_powerdownマシンに対して ACPI のシャットダウン要求を送信します。物理マシンで電源ボタンを押した場合と同じ動作になります。
q または quitQEMU を即時に終了します。
ライブマイグレーションを行うことで、一方のホストシステムから他方のホストシステムに対して、仮想マシンを動作させた状態のまま移動することができます。恒久的にホストを移動することができるほか、メンテナンスなどで一時的に移動することもできます。
ライブマイグレーションを行う際の要件は下記のとおりです:
16.2項 「移行における要件」 に示されている全ての要件が満たされていること。
移行元と移行先の VM ホストサーバ で、同じ CPU 機能を有していること。
AHCI インターフェイスや VirtFS 機能、 -mem-path コマンドラインオプションを指定していないこと (いずれもライブマイグレーションとは互換性がありません) 。
移行元と移行先のホストが同じ方法で起動していること。
QEMU のコマンドラインオプション -snapshot は移行に際して使用すべきではありません (サポート対象外でもあります) 。
openSUSE Leap では postcopy モードはサポートしていません。これは技術プレビューとしてのみ提供されているものです。 postcopy モードに関する詳細は、 https://wiki.qemu.org/Features/PostCopyLiveMigration (英語) をお読みください。
また、さらに詳しい推奨条件が https://www.linux-kvm.org/page/Migration に書かれています。
ライブマイグレーションは下記の手順で行います:
移行元のホストで仮想マシンのインスタンスが動作していることを確認します。
移行先のホストで、仮想マシンを frozen listening (凍結待ち受け) モードで起動します。具体的には移行元のホストのコマンドラインパラメータに加えて、 -incoming tcp:IP:ポート のパラメータを追加します。ここで、 IP には IP アドレスを、 ポート には移行を待ち受けるポートをそれぞれ指定します。なお、 IP アドレスに 0 を指定した場合、全てのインターフェイスで待ち受けることになります。
移行元のホストでモニタコンソールを表示させ、 migrate -d tcp:移行先_IP : ポート のように入力して実行し、ライブマイグレーションを開始します。
ライブマイグレーションの状態を確認したい場合は、移行元のホストのモニタコンソールで info migrate コマンドを実行します。
ライブマイグレーションをキャンセルするには、移行元のホストのモニタコンソールで migrate_cancel コマンドを実行します。
ライブマイグレーションで許容できる最大限のダウンタイムを秒単位で指定したい場合は、 migrate_set_downtime 秒数 のように入力して実行します。
ライブマイグレーションの最大速度をバイト毎秒単位で指定したい場合は、 migrate_set_speed バイト毎秒 のように入力して実行します。
QMP は JSON ベースのプロトコルで、 libvirt のようなアプリケーションと動作中の QEMU インスタンスの間で通信を行うことができるプロトコルです。 QMP プロトコルを使用することで、 QEMU モニタにさまざまな方法でアクセスすることができるようになります。
QMP を使用する際の最も柔軟な方法は、 -mon オプションを指定する方法です。下記の例では、標準入出力を利用して QMP のインスタンスを作成しています。ただし、下記の例では -> がクライアントから QEMU のインスタンス宛のデータを、 <- が QEMU から返された出力をそれぞれ表しています。
>sudoqemu-system-x86_64 [...] \ -chardev stdio,id=mon0 \ -mon chardev=mon0,mode=control,pretty=on <- { "QMP": { "version": { "qemu": { "micro": 0, "minor": 0, "major": 2 }, "package": "" }, "capabilities": [ ] } }
QMP の接続が確立すると、 QMP は "ようこそ" メッセージを送信し、機能ネゴシエーションモードに移行します。このモードでは、 qmp_capabilities コマンドのみを動作させることができます。機能ネゴシエーションモードを終了して通常のコマンドモードに移行したい場合は、まず qmp_capabilities コマンドを送信しなければなりません:
-> { "execute": "qmp_capabilities" }
<- {
"return": {
}
}なお、 "return": {} は QMP の成功応答を意味します。
QMP ではコマンドにパラメータを指定することができます。たとえば CD-ROM ドライブのメディアを取り出したい場合は、下記のように入力して送信します:
->{ "execute": "eject", "arguments": { "device": "ide1-cd0" } }
<- {
"timestamp": {
"seconds": 1410353381,
"microseconds": 763480
},
"event": "DEVICE_TRAY_MOVED",
"data": {
"device": "ide1-cd0",
"tray-open": true
}
}
{
"return": {
}
}標準入出力を使用する代わりに、 QMP インターフェイスをネットワークソケットに接続して使用することもできます:
>sudoqemu-system-x86_64 [...] \ -chardev socket,id=mon0,host=localhost,port=4444,server,nowait \ -mon chardev=mon0,mode=control,pretty=on
あとは telnet を起動してポート 4444 に接続します:
> telnet localhost 4444
Trying ::1...
Connected to localhost.
Escape character is '^]'.
<- {
"QMP": {
"version": {
"qemu": {
"micro": 0,
"minor": 0,
"major": 2
},
"package": ""
},
"capabilities": [
]
}
}必要であれば、複数のモニタインターフェイスを同時に作成することもできます。下記の例では、 「通常の」 QEMU モニタコマンドを解釈する HMP インスタンスを標準入出力に作成し、追加でローカルホストのポート 4444 に QMP インスタンスを作成しています:
>sudoqemu-system-x86_64 [...] \ -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \ -chardev socket,id=mon1,host=localhost,port=4444,server,nowait \ -mon chardev=mon1,mode=control,pretty=on
QEMU を起動する際に -qmp オプションを指定することで、 Unix ソケットを作成することができます:
>sudoqemu-system-x86_64 [...] \ -qmp unix:/tmp/qmp-sock,server --monitor stdio QEMU waiting for connection on: unix:./qmp-sock,server
上記の例で作成した /tmp/qmp-sock を介して QEMU インスタンスと通信を行うには、同じホスト内でもう 1 つの端末を開いて、 nc コマンド (詳しくは man 1 nc をお読みください) を使用します:
>sudonc -U /tmp/qmp-sock <- {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 2} [...]
libvirt の virsh コマンド経由での QMP アクセス #Edit sourcelibvirt (詳しくは パートII「libvirt を利用した仮想マシンの管理」 をお読みください) 内で仮想マシンを動作させている場合は、 virsh qemu-monitor-command を実行することで、動作中のゲストと通信を行うことができます:
>sudovirsh qemu-monitor-command vm_guest1 \ --pretty '{"execute":"query-kvm"}' <- { "return": { "enabled": true, "present": true }, "id": "libvirt-8" }
上記の例では、ホスト側に KVM を動作させる機能が存在しているかどうかと、 KVM が有効化されているかどうかを調べる、シンプルな query-kvm コマンドを実行しています。
JSON 形式ではなく分かりやすい QEMU 出力を使用したい場合は、 --hmp オプションを指定して実行してください:
>sudovirsh qemu-monitor-command vm_guest1 --hmp "query-kvm"