第11章 QEMU ゲストエージェントおよび SPICE エージェントによる仮想化の強化

QEMU ゲストエージェントや SPICE エージェントなどの Red Hat Enterprise Linux のエージェントは、システム上で仮想化ツールをより最適に実行するのに役立ちます。本章では、これらのエージェントについて説明します。

注記

ホストおよびゲストのパフォーマンスをさらに最適化し、調整するには、『Red Hat Enterprise Linux 7 仮想化のチューニングと最適化ガイド』を参照してください。

11.1. QEMU ゲストエージェント

QEMU ゲストエージェントは、ゲスト内で実行され、ホストマシンが libvirt を使用してゲストオペレーティングシステムに対してコマンドを実行できるようにします。これにより、ファイルシステムのフリーズおよびフリーズ解除などの機能を容易に実行できます。ゲストオペレーティングシステムはその後、これらのコマンドに非同期的に応答します。QEMU ゲストエージェントパッケージの qemu-guest-agent はデフォルトで Red Hat Enterprise Linux 7 にインストールされます。
このセクションでは、libvirt コマンドとゲストエージェントが利用できる各種オプションについて説明します。

重要

信頼されるゲストによって実行される場合にのみ、QEMU ゲストエージェントは安全であることに注意してください。信頼されていないゲストはゲストエージェントのプロトコルを悪意のある方法で無視したり、これを誤用したりする可能性があります。ホスト上のサービス拒否攻撃を回避するためのビルトイン保護プログラムは存在しますが、ホストは、操作が予想どおりに実行されるためにゲストの連携を必要とします。
QEMU ゲストエージェントは、ゲストの実行中に仮想 CPU (vCPU) を有効/無効にするために使用できるため、ホットプラグおよびホットアンプラグ機能を使用せずに vCPU の数を調整できます。詳細は 「仮想 CPU 数の設定」 を参照してください。

11.1.1. QEMU ゲストエージェントとホスト間の通信設定

ホストマシンは、ホストとゲストマシン間の VirtIO シリアル接続で QEMU ゲストエージェントと通信します。VirtIO シリアルチャンネルは、キャラクターデバイスドライバー (通常 Unix ソケット) 経由でホストに接続し、ゲストはこのシリアルチャンネルでリッスンします。

注記

qemu-guest-agent は、ホストが VirtIO シリアルチャネルをリッスンしているかどうかを検知しません。ただし、このチャネルは現在ホストとゲスト間のイベントをリッスンするために使用されるため、リスナーのないチャネルに書き込みすることでゲスト仮想マシンに問題が発生する可能性は極めて低くなります。さらに、qemu-guest-agent プロトコルには、コマンドの実行時にホスト物理マシンがゲスト仮想マシンを強制的に同期に戻すことができる同期マーカーが含まれています。libvirt はこれらのマーカーをすでに使用しているため、ゲスト仮想マシンは保留状態の未達の応答を安全に破棄することができます。

11.1.1.1. Linux ゲスト上での QEMU ゲストエージェントの設定

QEMU ゲストエージェントは実行中またはシャットダウンした仮想マシンで設定できます。実行中のゲストに設定される場合、ゲストはゲストエージェントをすぐに使用し始めます。ゲストがシャットダウンしている場合は、QEMU ゲストエージェントが次回の起動時に有効にされます。
virsh または virt-manager を使用すると、ゲストと QEMU ゲストエージェント間の通信を設定できます。以下に、QEMU ゲストエージェントを Linux ゲストで設定する方法を説明します。

手順11.1 シャットダウンした Linux ゲストで virsh を使用したゲストエージェントとホスト間の通信設定

  1. 仮想マシンをシャットダウンします。

    QEMU ゲストエージェントを設定する前に、仮想マシン (この例では rhel7) がシャットダウンしていることを確認します。
    # virsh shutdown rhel7 
  2. QEMU ゲストエージェントチャンネルをゲスト XML 設定に追加します。

    QEMU ゲストエージェントの詳細を追加できるようゲストの XML ファイルを編集します。
    # virsh edit rhel7
    以下をゲストの XML ファイルに追加し、変更を保存します。
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  3. 仮想マシンを起動します。

    # virsh start rhel7
  4. ゲストに QEMU ゲストエージェントをインストールします。

    QEMU ゲストエージェントがゲスト仮想マシンにまだインストールされていない場合は、これをインストールします。
    # yum install qemu-guest-agent
  5. ゲスト内の QEMU ゲストエージェントを起動します。

    ゲスト内の QEMU ゲストエージェントサービスを起動します。
    # systemctl start qemu-guest-agent
別の方法として、以下のステップに従って QEMU ゲストエージェントを実行中のゲストで設定することもできます。

手順11.2 実行中の Linux ゲストでのゲストエージェントとホスト間の通信設定

  1. QEMU ゲストエージェントの XML ファイルを作成します。

    # cat agent.xml
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  2. QEMU ゲストエージェントを仮想マシンに割り当てます。

    以下のコマンドを実行して、QEMU ゲストエージェントを実行中の仮想マシン (この例では rhel7) に割り当てます。
    # virsh attach-device rhel7 agent.xml
  3. ゲストに QEMU ゲストエージェントをインストールします。

    QEMU ゲストエージェントがゲスト仮想マシンにまだインストールされていない場合は、これをインストールします。
    # yum install qemu-guest-agent
  4. ゲスト内の QEMU ゲストエージェントを起動します。

    ゲスト内の QEMU ゲストエージェントサービスを起動します。
    # systemctl start qemu-guest-agent

手順11.3 virt-manager を使用した QEMU ゲストエージェントとホスト間の通信設定

  1. 仮想マシンをシャットダウンします。

    QEMU ゲストエージェントの設定前に仮想マシンがシャットダウンしていることを確認します。
    仮想マシンをシャットダウンするには、Virtual Machine Manager の仮想マシンの一覧からシャットダウンする仮想マシンを選択し、メニューバーにあるスイッチアイコンをクリックします。
  2. QEMU ゲストエージェントチャンネルをゲストに追加します。

    ゲストウインドウの上部にある電球アイコンをクリックして仮想マシンのハードウェアの詳細画面を開きます。
    ハードウェアを追加 ボタンをクリックして 新しい仮想ハードウェアを追加 ウインドウを開き、チャンネル を選択します。
    名前 ドロップダウンリストから QEMU ゲストエージェントを選択し、完了 をクリックします。
    QEMU ゲストエージェントチャンネルデバイスの選択

    図11.1 QEMU ゲストエージェントチャンネルデバイスの選択

  3. 仮想マシンを起動します。

    仮想マシンを起動するには、Virtual Machine Managerの仮想マシンのリストから起動する仮想マシンを選択し、メニューバーの をクリックします。
  4. ゲストに QEMU ゲストエージェントをインストールします。

    virt-manager でゲストを開き、QEMU ゲストエージェントがゲスト仮想マシンにまだインストールされていない場合は、インストールします。
    # yum install qemu-guest-agent
  5. ゲスト内の QEMU ゲストエージェントを起動します。

    ゲスト内の QEMU ゲストエージェントサービスを起動します。
    # systemctl start qemu-guest-agent
QEMU ゲストエージェントが rhel7 仮想マシンに設定されました。