Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
コンテンツコンテンツ
仮想化ガイド
  1. 前書き
  2. I 概要
    1. 1 仮想化技術
    2. 2 仮想化シナリオ
    3. 3 Xen 仮想化の紹介
    4. 4 KVM 仮想化の紹介
    5. 5 仮想化ツール
    6. 6 仮想化コンポーネントのインストール
  3. II libvirt を利用した仮想マシンの管理
    1. 7 libvirt デーモン
    2. 8 VM ホストサーバ の準備
    3. 9 ゲストのインストール
    4. 10 基本的な VM ゲスト の管理
    5. 11 接続と認可
    6. 12 高度なストレージ設定
    7. 13 仮想マシンマネージャ を利用した仮想マシンの設定
    8. 14 virsh を利用した仮想マシンの設定
    9. 15 AMD SEV-SNP による仮想マシンのセキュリティ強化
    10. 16 VM ゲスト の移行
    11. 17 Xen から KVM への移行ガイド
  4. III 全ハイパーバイザ共通の機能
    1. 18 ディスクのキャッシュモード
    2. 19 VM ゲスト の時刻設定
    3. 20 libguestfs
    4. 21 QEMU ゲストエージェント
    5. 22 ソフトウエア TPM エミュレータ
    6. 23 VM ゲスト に対するクラッシュダンプの作成
  5. IV Xen を利用した仮想マシンの管理
    1. 24 仮想マシンホストの設定
    2. 25 仮想ネットワーク
    3. 26 仮想環境の管理
    4. 27 Xen 内でのブロックデバイス
    5. 28 仮想化: オプション設定
    6. 29 管理作業
    7. 30 XenStore: ドメイン間で共有される設定データベース
    8. 31 Xen の高可用性仮想化ホストとしての使用
    9. 32 Xen: 準仮想化 (PV) ゲストから完全仮想化 (FV/HVM) ゲストへの変換
  6. V QEMU を利用した仮想マシンの管理
    1. 33 QEMU の概要
    2. 34 KVM VM ホストサーバ の構築
    3. 35 ゲストのインストール
    4. 36 qemu-system-ARCH を利用した仮想マシンの実行
    5. 37 QEMU モニタを利用した仮想マシンの管理
  7. VI トラブルシューティング
    1. 38 内蔵ヘルプとパッケージのドキュメンテーション
    2. 39 システム情報とログの収集
  8. 用語集
  9. A NVIDIA カードに対する GPU パススルー の設定
  10. B GNU ライセンス
ナビゲーション
適用先 openSUSE Leap 15.7

37 QEMU モニタを利用した仮想マシンの管理 Edit source

qemu-system-アーキテクチャ (たとえば qemu-system-x86_64) で仮想マシンを起動した場合、ユーザ側からの操作を受け付けるためのモニタコンソールが起動されます。モニタコンソール内ではコマンドを入力して実行することができますので、ここからリムーバブルメディアの変更やスクリーンショットの採取、オーディオのキャプチャなど、仮想マシンに対するさまざまな制御を行うことができます。

注記
注記

下記の章では、便利な QEMU のモニタコマンドとその用途を説明しています。全てのコマンドを一覧で表示したい場合は、 QEMU モニタのコマンドラインで help と入力して実行してください。

37.1 モニタコンソールへのアクセス Edit source

ヒント
ヒント: libvirt 向けにはモニタコンソールが提供されない件について

モニタコンソールにアクセスするには、仮想マシンを qemu-system-アーキテクチャ コマンドで直接起動し、グラフィカルな出力を組み込みの QEMU ウインドウ内に表示させる必要があります。

仮想マシンを libvirt (たとえば virt-manager) で起動している場合で、 VNC や Spice セッション経由で出力を表示させている場合は、モニタコンソールに直接アクセスすることはできません。ただし、 virsh で下記のように入力して実行することで、モニタコマンドを送信することができます:

# virsh qemu-monitor-command コマンド

モニタコンソールへのアクセス方法は、仮想マシンの出力に使用しているディスプレイデバイスの種類によって異なります。ディスプレイに関する詳細は、 36.3.2.2項 「ディスプレイのオプション」 をお読みください。たとえば -display gtk オプションを利用してモニタを表示させている場合、 CtrlAlt2 を押すことでモニタコンソールを表示させることができます。同様に -nographic オプションを利用している場合は、 CtrlA C を押すことでモニタコンソールに切り替えることができます。

コンソールの使用方法についてヘルプを表示したい場合は、 help もしくは ? と入力して実行します。特定のコマンドに対するヘルプを表示したい場合は、 help コマンド のように入力して実行してください。

37.2 ゲストシステムに関する情報の取得 Edit source

ゲストシステムに関する情報を取得したい場合は、 info を使用します。オプションを何も指定しないで実行すると、指定可能なオプションの一覧が表示されます。オプションでは、表示したい情報を指定します:

info version

QEMU のバージョンを表示します。

info commands

利用可能な QMP コマンドの一覧を表示します。

info network

ネットワークの状態を表示します。

info chardev

キャラクタデバイスを表示します。

info block

ハードディスクやフロッピィディスク、 CD-ROM ドライブなどのブロックデバイスに関する情報を表示します。

info blockstats

ブロックデバイスに関する読み書きの統計情報を表示します。

info registers

CPU レジスタを表示します。

info cpus

利用可能な CPU に関する情報を表示します。

info history

コマンドラインの履歴を表示します。

info irq

輪の込みに関する統計情報を表示します。

info pic

i8259 (PIC) の状態を表示します。

info pci

PCI の情報を表示します。

info tlb

仮想メモリから物理メモリへのマッピング情報を表示します。

info mem

有効な仮想メモリマッピングを表示します。

info jit

動的なコンパイラの情報を表示します。

info kvm

KVM の情報を表示します。

info numa

NUMA の情報を表示します。

info usb

ゲスト USB デバイスの情報を表示します。

info usbhost

ホスト USB デバイスの情報を表示します。

info profile

プロファイル情報を表示します。

info capture

キャプチャ (オーディオ採取) 情報を表示します。

info snapshots

現時点で保存されている仮想マシンのスナップショットを表示します。

info status

現在の仮想マシンの状態に関する情報を表示します。

info mice

どのマウスがイベントを受信しているのかを表示します。

info vnc

VNC サーバの状態を表示します。

info name

現在の仮想マシンの名前を表示します。

info uuid

現在の仮想マシンの UUID を表示します。

info usernet

ユーザネットワークスタックの接続情報を表示します。

info migrate

移行の状態を表示します。

info balloon

バルーンデバイスの情報を表示します。

info qtree

デバイスツリーを表示します。

info qdm

qdev デバイスモデルリストを表示します。

info roms

ROM を表示します。

info migrate_cache_size

現時点での移行 xbzrle ( Xor Based Zero Run Length Encoding ) のキャッシュサイズを表示します。

info migrate_capabilities

xbzrle 圧縮などのさまざまな移行機能の状態を表示します。

info mtree

VM ゲスト のメモリ階層構造を表示します。

info trace-events

利用可能なトレースイベントとその状態を表示します。

37.3 VNC パスワードの変更 Edit source

VNC のパスワードを変更するには、 change vnc password と入力して実行し、新しいパスワードを入力します:

(qemu) change vnc password
Password: ********
(qemu)

37.4 デバイスの管理 Edit source

ゲストの動作中に新しいディスクを接続 (ホットプラグ) したい場合は、 drive_adddevice_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 block
ide1-cd0: type=cdrom removable=1 locked=0 file=/dev/sr0 ro=1 drv=host_device
(qemu) change ide1-cd0 /path/to/image

37.5 キーボードとマウスの制御 Edit source

モニタコンソールを使用することで、キーボードやマウスの入力を擬似することができます。たとえば、お使いのグラフィカルユーザインターフェイス側で認識されてしまうようなキー入力、たとえば X Window であれば CtrlAltF1 を 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 コマンドで取得することができます。

37.6 利用可能なメモリの変更 Edit source

仮想マシンを -balloon virtio オプション付きで起動している場合 (準仮想化デバイスが有効化されている場合) 、利用可能なメモリを動的に変更することができるようになります。バルーンデバイスの有効化に関する詳細については、 35.1項 「qemu-system-ARCH を利用した基本的なインストール」 をお読みください。

モニタコンソール内でバルーンデバイスに関する情報を取得したり、バルーンデバイスが有効化されているかどうかを調べたりしたい場合は、 info balloon コマンドを実行します:

(qemu) info balloon

バルーンデバイスが有効化されていれば、 balloon メモリ量 (MB 単位) を入力して実行することで、メモリ量を変更することができます:

(qemu) balloon 400

37.7 仮想マシンのメモリダンプ Edit source

仮想マシンのメモリをディスクやコンソール出力に保存したい場合は、下記のコマンドをお使いください:

memsave アドレス サイズ ファイル名

アドレス で指定したアドレスを開始点として、 サイズ で指定したサイズ分の仮想メモリダンプを ファイル名 のファイルに保存します。

pmemsave アドレス サイズ ファイル名

アドレス で指定したアドレスを開始点として、 サイズ で指定したサイズ分の物理メモリダンプを ファイル名 のファイルに保存します。

x / 書式 アドレス

アドレス で指定したアドレスを開始点として、 書式 文字列に従って仮想メモリダンプを出力します。このとき、 書式 には カウント, 形式, サイズ をそれぞれ指定します:

カウント パラメータには表示すべき項目数を指定します。

形式 には x (16 進数), d (符号付き 10 進数), u (符号無し 10 進数), o (8 進数), c (char 型) or i (アセンブラインストラクション) のいずれかを指定します。

サイズ パラメータには b (8 ビット), h (16 ビット), w (32 ビット) ,g (64 ビット) のいずれかを指定します。 x86 の場合、 ihw を指定することで、 16 ビットと 32 ビットのインストラクションサイズを選択することができます。

xp / 書式 アドレス

アドレス で指定したアドレスを開始点として、 書式 文字列に従って物理メモリダンプを出力します。このとき、 書式 には カウント, 形式, サイズ をそれぞれ指定します:

カウント パラメータには表示すべき項目数を指定します。

形式 には x (16 進数), d (符号付き 10 進数), u (符号無し 10 進数), o (8 進数), c (char 型) or i (アセンブラインストラクション) のいずれかを指定します。

サイズ パラメータには b (8 ビット), h (16 ビット), w (32 ビット) ,g (64 ビット) のいずれかを指定します。 x86 の場合、 ihw を指定することで、 16 ビットと 32 ビットのインストラクションサイズを選択することができます。

37.8 仮想コンソールのスナップショットの管理 Edit source

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

1

スナップショットに対して自動的に割り当てられる識別番号です。通常は 1 ずつ加算されます。

2

スナップショットの説明文字列です。 ID を分かりやすく説明したものと言えます。

3

スナップショットが占有しているディスク領域のサイズです。動作中のアプリケーションが多くのメモリを確保しているほど、スナップショットのサイズも大きくなります。

4

スナップショットを採取した日時を表します。

5

その時点での仮想マシンのクロック状態を表しています。

37.9 仮想マシンの一時停止と再開 Edit source

仮想マシンの一時停止や再開を行いたい場合は、下記のようなコマンドを使用します:

stop

仮想マシンの動作を一時的に停止します。

cont

一時停止していた仮想マシンを再開します。

system_reset

仮想マシンをリセットします。物理マシンでリセットボタンを押した場合と同じ動作になります。これにより、ファイルシステムが不安定な状態になる可能性があります。

system_powerdown

マシンに対して ACPI のシャットダウン要求を送信します。物理マシンで電源ボタンを押した場合と同じ動作になります。

q または quit

QEMU を即時に終了します。

37.10 ライブマイグレーション Edit source

ライブマイグレーションを行うことで、一方のホストシステムから他方のホストシステムに対して、仮想マシンを動作させた状態のまま移動することができます。恒久的にホストを移動することができるほか、メンテナンスなどで一時的に移動することもできます。

ライブマイグレーションを行う際の要件は下記のとおりです:

  • 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 に書かれています。

ライブマイグレーションは下記の手順で行います:

  1. 移行元のホストで仮想マシンのインスタンスが動作していることを確認します。

  2. 移行先のホストで、仮想マシンを frozen listening (凍結待ち受け) モードで起動します。具体的には移行元のホストのコマンドラインパラメータに加えて、 -incoming tcp:IP:ポート のパラメータを追加します。ここで、 IP には IP アドレスを、 ポート には移行を待ち受けるポートをそれぞれ指定します。なお、 IP アドレスに 0 を指定した場合、全てのインターフェイスで待ち受けることになります。

  3. 移行元のホストでモニタコンソールを表示させ、 migrate -d tcp:移行先_IP : ポート のように入力して実行し、ライブマイグレーションを開始します。

  4. ライブマイグレーションの状態を確認したい場合は、移行元のホストのモニタコンソールで info migrate コマンドを実行します。

  5. ライブマイグレーションをキャンセルするには、移行元のホストのモニタコンソールで migrate_cancel コマンドを実行します。

  6. ライブマイグレーションで許容できる最大限のダウンタイムを秒単位で指定したい場合は、 migrate_set_downtime 秒数 のように入力して実行します。

  7. ライブマイグレーションの最大速度をバイト毎秒単位で指定したい場合は、 migrate_set_speed バイト毎秒 のように入力して実行します。

37.11 QMP - QEMU マシンプロトコル Edit source

QMP は JSON ベースのプロトコルで、 libvirt のようなアプリケーションと動作中の QEMU インスタンスの間で通信を行うことができるプロトコルです。 QMP プロトコルを使用することで、 QEMU モニタにさまざまな方法でアクセスすることができるようになります。

37.11.1 標準入出力経由での QMP アクセス Edit source

QMP を使用する際の最も柔軟な方法は、 -mon オプションを指定する方法です。下記の例では、標準入出力を利用して QMP のインスタンスを作成しています。ただし、下記の例では -> がクライアントから QEMU のインスタンス宛のデータを、 <- が QEMU から返された出力をそれぞれ表しています。

> sudo qemu-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": {
    }
}

37.11.2 Telnet 経由での QMP アクセス Edit source

標準入出力を使用する代わりに、 QMP インターフェイスをネットワークソケットに接続して使用することもできます:

> sudo qemu-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 インスタンスを作成しています:

> sudo qemu-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

37.11.3 Unix ソケット経由での QMP アクセス Edit source

QEMU を起動する際に -qmp オプションを指定することで、 Unix ソケットを作成することができます:

> sudo qemu-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 をお読みください) を使用します:

> sudo nc -U /tmp/qmp-sock
<- {"QMP": {"version": {"qemu": {"micro": 0, "minor": 0, "major": 2} [...]

37.11.4 libvirtvirsh コマンド経由での QMP アクセス Edit source

libvirt (詳しくは パートII「libvirt を利用した仮想マシンの管理」 をお読みください) 内で仮想マシンを動作させている場合は、 virsh qemu-monitor-command を実行することで、動作中のゲストと通信を行うことができます:

> sudo virsh qemu-monitor-command vm_guest1 \
--pretty '{"execute":"query-kvm"}'
<- {
    "return": {
        "enabled": true,
        "present": true
    },
    "id": "libvirt-8"
}

上記の例では、ホスト側に KVM を動作させる機能が存在しているかどうかと、 KVM が有効化されているかどうかを調べる、シンプルな query-kvm コマンドを実行しています。

ヒント
ヒント: 読みやすい出力の生成方法について

JSON 形式ではなく分かりやすい QEMU 出力を使用したい場合は、 --hmp オプションを指定して実行してください:

> sudo virsh qemu-monitor-command vm_guest1 --hmp "query-kvm"
このページを印刷