検索

仮想化管理ガイド

download PDF
Red Hat Enterprise Linux 6

仮想環境の管理

概要

仮想化管理ガイドでは、ホストの物理マシン、ネットワーク、ストレージ、デバイス、およびゲスト仮想マシンの管理およびトラブルシューティングについて説明します。
注記: 本書は開発中であり、大幅に変更され、プレビューとしてのみ提供されます。含まれる情報および命令は完了とみなされるべきではないため、注意して使用する必要があります。
注記
専門知識を深めるためにも、Red Hat Virtualization (RH318) トレーニングコースも読みください。

第1章 サーバーのベストプラクティス

以下のタスクおよびヒントは、 で Red Hat Enterprise Linux ホストのパフォーマンスを高めるのに役に立ちます。その他のヒントは、『Red Hat Enterprise Linux 仮想化チューニングおよび最適化ガイド』 に記載されています。
  • SELinux を Enforcing モードで実行します。setenforce コマンドを使用して、SELinux が Enforcing モードで実行するように設定します。
    # setenforce 1
    
  • AutoFSNFSFTPHTTPNIStelnetdsendmail などの不要なサービスを削除または無効にします。
  • サーバー上にはプラットフォームの管理に必要な最低限のユーザーアカウントのみを追加します。不要なユーザーアカウントは削除してください。
  • ホストでは不必要なアプリケーションは実行しないようにしてください。ホストでアプリケーションを実行すると仮想マシンのパフォーマンスに影響を与えるため、その影響がサーバーの安定性に及ぶ可能性があります。サーバーがクラッシュする可能性のあるアプリケーションでも、サーバー上のすべての仮想マシンがダウンします。
  • 仮想マシンのインストールおよびイメージには集中管理できる場所を使用します。仮想マシンのイメージは /var/lib/libvirt/images/ に格納します。仮想マシンのイメージをこれ以外のディレクトリーに格納する場合は、そのディレクトリーを SELinux ポリシーに追加し、インストールを開始する前にラベルの再設定を必ず行ってください。集中管理ができる共有可能なネットワークストレージの使用を強くお勧めします。

第2章 sVirt

sVirt は、SELinux と仮想化を統合する Red Hat Enterprise Linux に含まれるテクノロジーです。sVirt は、ゲスト仮想マシンを使用する際のセキュリティーを向上させるために強制アクセス制御 (MAC) を適用します。この統合テクノロジーにより、セキュリティーが向上し、ハイパーバイザーのバグに対してシステムがハードコーディングされます。ホストの物理マシンまたは別のゲスト仮想マシンの攻撃を防ぐことが特に便利です。
本章では、sVirt が Red Hat Enterprise Linux 6 の仮想化テクノロジーと統合する方法を説明します。

非仮想化環境

非仮想化環境では、ホスト物理マシンは互いに物理的に分離されており、各ホスト物理マシンには、Web サーバーや DNS サーバーなどのサービスで設定される自己完結型の環境があります。これらのサービスは、独自のユーザー空間、ホストの物理マシンのカーネルおよび物理ハードウェアに直接通信し、サービスをネットワークに直接提供します。以下のイメージは、仮想化されていない環境を表しています。

??????
ユーザー空間: 全ユーザーモードのアプリケーションと一部のドライバーが実行されるメモリー領域。
???
Web アプリ (Web アプリケーションサーバー): ブラウザーからアクセスできる Web コンテンツを配信します。
??????
ホストカーネル: ホストの物理マシンの特権付きカーネル、カーネル拡張、およびほとんどのデバイスドライバーを実行するために厳密に予約されます。
???
DNS サーバー: DNS レコードを格納し、ユーザーが IP アドレスの代わりに論理名を使用して Web ページにアクセスできるようにします。

仮想化環境

仮想化環境では、複数の仮想オペレーティングシステムを、ホスト物理マシン上にある単一のカーネルで実行できます。以下のイメージは、仮想化環境を表しています。

2.1. セキュリティーおよび仮想化

サービスが仮想化されていない場合は、マシンは物理的に分離されています。通常、エクスプロイトは影響を受けるマシン内に封じ込められ、ネットワーク攻撃は明らかな例外となります。仮想化環境でサービスをグループ化すると、システムに追加の脆弱性が発生します。ハイパーバイザーにゲスト仮想マシンが悪用できるセキュリティー上の欠陥がある場合、このゲスト仮想マシンは、ホスト物理マシンだけでなく、そのホスト物理マシンで実行されている他のゲスト仮想マシンも攻撃できる可能性があります。これらの攻撃はゲスト仮想マシンを超えて拡大する可能性があり、他のゲスト仮想マシンも攻撃にさらされる可能性があります。
sVirt は、ゲスト仮想マシンを分離し、悪用された場合にさらに攻撃を開始する能力を制限するための取り組みです。これは次のイメージに示されています。このイメージでは、攻撃がゲスト仮想マシンから抜け出して他のゲスト仮想マシンに侵入することはできません。
SELinux では、MAC (Mandatory Access Control) の実装で、仮想インスタンスにプラグ可能なセキュリティーフレームワークを導入しました。sVirt フレームワークを使用すると、ゲスト仮想マシンとそのリソースに一意のラベルを付けることができます。ラベルを付けると、異なるゲスト仮想マシン間のアクセスを拒否できるルールを適用できます。

2.2. sVirt のラベル付け

SELinux の保護下にある他のサービスと同様に、sVirt はプロセスベースのメカニズムと制限を使用して、ゲスト仮想マシンに追加のセキュリティーレイヤーを提供します。通常の使用では、sVirt がバックグラウンドで動作していることに気付くことさえありません。本セクションでは、sVirt のラベリング機能を説明します。
次の出力に示すように、sVirt を使用すると、仮想化された各ゲスト仮想マシンプロセスにラベルが付けられ、動的に生成されたレベルで実行されます。各プロセスは、レベルが異なる他の仮想マシンから分離されています。
# ps -eZ | grep qemu

system_u:system_r:svirt_t:s0:c87,c520 27950 ?  00:00:17 qemu-kvm
以下の出力に示すように、実際のディスクイメージには、プロセスに一致するように自動的にラベルが付けられます。
# ls -lZ /var/lib/libvirt/images/*

  system_u:object_r:svirt_image_t:s0:c87,c520   image1
次の表に、sVirt を使用するときに割り当てることができるさまざまなコンテキストラベルの概要を示します。
表2.1 sVirt コンテキストラベル
SELinux コンテキストタイプ/説明
system_u:system_r:svirt_t:MCS1ゲスト仮想マシンのプロセス。MCS1 はランダムな MCS フィールドです。約 500,000 個のラベルがサポートされます。
system_u:object_r:svirt_image_t:MCS1ゲスト仮想マシンのイメージ。これらのイメージの読み取り/書き込みができるのは、同じ MCS フィールドを持つ svirt_t プロセスのみです。
system_u:object_r:svirt_image_t:s0ゲスト仮想マシンの共有の読み取り/書き込みコンテンツ。すべての svirt_t プロセスは svirt_image_t:s0 ファイルに書き込むことができます。
sVirt を使用する場合は、静的ラベリングを実行することもできます。静的ラベルを使用すると、管理者はゲスト仮想マシンの MCS/MLS フィールドなど、特定のラベルを選択できます。静的にラベルを付けた仮想化ゲスト仮想マシンを実行する管理者は、イメージファイルに正しいラベルを設定する必要があります。ゲスト仮想マシンは常にそのラベルで起動し、sVirt システムは静的にラベル付けされた仮想マシンの内容のラベルを変更しません。これにより、MLS 環境で sVirt コンポーネントを実行できます。また、要件に応じて、システムで異なる機密レベルを持つゲスト仮想マシンを複数実行することもできます。

第3章 仮想マシンのクローン作成

ゲストコピーの作成に使用されるゲスト仮想マシンインスタンスには、以下の 2 つのタイプがあります。
  • クローン は、1 台の仮想マシンのインスタンスです。クローンを使用すると、同じ仮想マシンのネットワークを設定したり、別の宛先に配布したりできます。
  • テンプレート は、クローン作成のソースとして使用するように設計された仮想マシンのインスタンスです。テンプレートから複数のクローンを作成し、各クローンにマイナーな変更を加えることができます。これは、この変更がシステムに与える影響を確認する際に役立ちます。
クローンとテンプレートはどちらも仮想マシンインスタンスです。これらの違いは、使用方法にあります。
作成されたクローンが正しく機能するには、通常、クローンを作成する前に、クローンを作成する仮想マシンに固有の情報と設定を削除する必要があります。削除する情報は、クローンの使用方法によって異なります。
削除する情報および設定は、次のいずれかのレベルになります。
  • プラットフォームレベルの情報および設定には、仮想化ソリューションが仮想マシンに割り当てたものが含まれます。例には、ネットワークインターフェイスカード (NIC) の数と、その MAC アドレスが含まれます。
  • ゲストオペレーティングシステムレベル情報および設定には、仮想マシン内で設定されたものが含まれます。例には SSH 鍵が含まれます。
  • アプリケーションレベル情報および設定には、仮想マシンにインストールされているアプリケーションで設定したものが含まれます。例には、アクティベーションコードおよび登録情報が含まれます。
    注記
    情報およびアプローチは各アプリケーションに固有のものであるため、本章には、アプリケーションレベルの削除に関する情報は記載されていません。
その結果、仮想マシン内の情報および設定の一部を削除する必要がありますが、その他の情報および設定は、仮想化環境 (Virtual Machine Manager や VMware など) を使用して仮想マシンから削除する必要があります。

3.1. クローンを作成する仮想マシンの準備

仮想マシンのクローンを作成する前に、ディスクイメージで virt-sysprep ユーティリティーを実行するか、次の手順に従って仮想マシンを準備する必要があります。

手順3.1 クローンを作成する仮想マシンの準備

  1. 仮想マシンのセットアップ

    1. クローンまたはテンプレートに使用する仮想マシンを構築します。
      • クローンに必要なソフトウェアをインストールします。
      • オペレーティングシステムに一意でない設定を設定します。
      • 固有でないアプリケーション設定を設定します。
  2. ネットワーク設定を削除します。

    1. 以下のコマンドを使用して、永続的な udev ルールを削除します。
      # rm -f /etc/udev/rules.d/70-persistent-net.rules
      注記
      udev ルールを削除しない場合は、最初の NIC の名前が eth0 ではなく eth1 になります。
    2. /etc/sysconfig/network-scripts/ifcfg-eth[x] で以下の編集を行い、ifcfg スクリプトから一意のネットワークの詳細を削除します。
      1. HWADDR 行および Static 行を削除します。
        注記
        HWADDR が新しいゲストの MAC アドレスと一致しない場合、ifcfg は無視されます。したがって、ファイルから HWADDR を削除することが重要です。
        DEVICE=eth[x]
        BOOTPROTO=none
        ONBOOT=yes
        #NETWORK=10.0.1.0       <- REMOVE
        #NETMASK=255.255.255.0  <- REMOVE
        #IPADDR=10.0.1.20       <- REMOVE
        #HWADDR=xx:xx:xx:xx:xx  <- REMOVE
        #USERCTL=no             <- REMOVE
        # Remove any other *unique* or non-desired settings, such as UUID.
        
      2. HWADDR または一意の情報が含まれていない DHCP 設定が残っていることを確認します。
        DEVICE=eth[x]
        BOOTPROTO=dhcp
        ONBOOT=yes
        
      3. ファイルに以下の行が含まれていることを確認します。
        DEVICE=eth[x]
        ONBOOT=yes
        
    3. 以下のファイルが存在する場合は、そのファイルに同じ内容が含まれていることを確認してください。
      • /etc/sysconfig/networking/devices/ifcfg-eth[x]
      • /etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
      注記
      NetworkManager または特殊な設定を仮想マシンで使用した場合は、追加の固有情報が ifcfg スクリプトから削除されていることを確認してください。
  3. 登録の詳細を削除します。

    1. 以下のいずれかを使用して、登録の詳細を削除します。
      • Red Hat Network (RHN) 登録済みゲスト仮想マシンの場合は、以下のコマンドを実行します。
        # rm /etc/sysconfig/rhn/systemid
      • Red Hat Subscription Manager (RHSM) の登録済みゲスト仮想マシンの場合は、次のコマンドを使用します。
        • 元の仮想マシンを使用しない場合は、以下のコマンドを実行します。
          # subscription-manager unsubscribe --all
          # subscription-manager unregister
          # subscription-manager clean
        • 元の仮想マシンを使用する場合は、次のコマンドのみを実行します。
          # subscription-manager clean
          注記
          元の RHSM プロファイルはポータルに残ります。
  4. その他の固有の詳細の削除

    1. 次のコマンドを使用して、sshd の公開鍵と秘密鍵のペアを削除します。
      # rm -rf /etc/ssh/ssh_host_*
      注記
      ssh キーを削除すると、このホストを信頼しない ssh クライアントの問題が回避されます。
    2. 複数のマシンで実行している場合に、競合する可能性があるその他のアプリケーション固有の識別子や設定を削除します。
  5. 次回のシステムの起動時に設定ウィザードを実行するように仮想マシンを設定します。

    1. 以下のいずれかの方法で、仮想マシンを次回起動したときに、関連する設定ウィザードが実行されるように設定します。
      • Red Hat Enterprise Linux 6 以前の場合は、以下のコマンドを使用して、root ファイルシステムに .unconfigured という名前の空のファイルを作成します。
        # touch /.unconfigured
      • Red Hat Enterprise Linux 7 の場合は、次のコマンドを実行して、最初の起動ウィザードおよび初期設定ウィザードを有効にします。
        # sed -ie 's/RUN_FIRSTBOOT=NO/RUN_FIRSTBOOT=YES/' /etc/sysconfig/firstboot
        # systemctl enable firstboot-graphical
        # systemctl enable initial-setup-graphical
      注記
      次回の起動時に実行するウィザードは、仮想マシンから削除された設定によって異なります。また、クローンの初回ブートでは、ホスト名を変更することが推奨されます。

3.2. 仮想マシンのクローン作成

クローンの作成を続行する前に、仮想マシンをシャットダウンします。virt-clone または virt-manager を使用して、仮想マシンのクローンを作成できます。

3.2.1. virt-clone を使用したゲストのクローン作成

virt-clone を使用すると、コマンドラインから仮想マシンのクローンを作成できます。
virt-clone を正常に完了するには、root 権限が必要であることに注意してください。
virt-clone コマンドには、コマンドラインで渡すことができるオプションが多数用意されています。これには、一般的なオプション、ストレージ設定オプション、ネットワーク設定オプション、およびその他のオプションが含まれます。--orginal のみが必要です。オプションの一覧を表示するには、次のコマンドを実行します。
# virt-clone --help
また、virt-clone の man ページでは、各コマンドオプション、重要な変数、および例が記載されています。
以下の例は、デフォルト接続で、demo と呼ばれるゲスト仮想マシンのクローンを作成する方法を示しています。これにより、新しい名前とディスククローンパスが自動的に生成されます。

例3.1 virt-clone を使用したゲストのクローン作成

# virt-clone --original demo --auto-clone
以下の例は、demo と呼ばれる QEMU ゲスト仮想マシンのクローンを、複数のディスクで作成する方法を示しています。

例3.2 virt-clone を使用したゲストのクローン作成

# virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/xen/images/newdemo.img --file /var/lib/xen/images/newdata.img

3.2.2. virt-manager を使用したゲストのクローン作成

この手順では、virt-manager ユーティリティーを使用して、ゲスト仮想マシンのクローンを作成する方法を説明します。

手順3.2 virt-manager を使用した仮想マシンのクローンの作成

  1. virt-manager を開く

    virt-manager を起動します。Applications メニューおよび System Tools サブメニューから Virtual Machine Manager アプリケーションを起動します。または、root で virt-manager を実行します。
    Virtual Machine Manager にあるゲスト仮想マシンの一覧から、クローンを作成するゲスト仮想マシンを選択します。
    クローンを作成するゲスト仮想マシンを右クリックし、Clone を選択します。Clone Virtual Machine ウィンドウが開きます。

    図3.1 Clone Virtual Machine ウィンドウ

    Clone Virtual Machine ウィンドウ
  2. クローンの設定

    • クローンの名前を変更する場合は、クローンの新しい名前を入力します。
    • ネットワーク設定を変更する場合は、Details を選択します。
      クローンの新しい MAC アドレスを入力します。
      OK をクリックします。

      図3.2 Change MAC Address ウィンドウ

      Change MAC Address ウィンドウ
    • クローンを作成したゲスト仮想マシンのディスクごとに、次のいずれかのオプションを選択します。
      • Clone this disk - ディスクは、クローンとして作成されたゲスト仮想マシンのクローンとして作成されます。
      • Share disk with guest virtual machine name - ディスクは、クローンを作成されるゲスト仮想マシンとそのクローンで共有されます。
      • Details - ストレージパスの変更 画面を開きます。これにより、ディスクへの新しいパスの選択が可能になります。

        図3.3 Change storage path ウィンドウ

        Change storage path ウィンドウ
  3. ゲスト仮想マシンのクローンを作成する

    Clone をクリックします。

第4章 KVM のライブマイグレーション

本章では、あるホストの物理マシンで実行中のゲスト仮想マシンを別のホスト物理マシンに移行する方法について説明します。いずれのインスタンスでも、ホストの物理マシンが KVM ハイパーバイザーを実行しています。
移行では、ゲスト仮想マシンをあるホストの物理マシンから別のホストの物理マシンに移動するプロセスを説明します。これは、ゲスト仮想マシンがハードウェア上で直接ではなく仮想化環境で実行しているため可能です。移行は、以下の場合に役立ちます。
  • 負荷分散: ゲスト仮想マシンは、ホスト物理マシンが過負荷になった場合、または別のホスト物理マシンが十分に活用されていない場合に、使用率の低いホスト物理マシンに移動できます。
  • ハードウェア独立性: ホストの物理マシンでハードウェアデバイスをアップグレード、追加、または削除する必要がある場合、ゲスト仮想マシンを他のホストの物理マシンに安全に移動できます。つまり、ゲスト仮想マシンでは、ハードウェアの改善のためのダウンタイムが発生しません。
  • 省エネ: ゲスト仮想マシンを他のホスト物理マシンに再配布できるため、電源をオフにして、低使用期間でエネルギーを節約し、コストを削減できます。
  • 地理的な移行: 待ち時間を短縮するため、または深刻な状況では、ゲスト仮想マシンを別の場所に移動できます。
移行は、ゲスト仮想マシンのメモリーと仮想デバイスの状態を移行先ホストの物理マシンに送信することで機能します。共有されたネットワークストレージを使用して、ゲスト仮想マシンのイメージを移行することが推奨されます。仮想マシンを移行するときは、共有ストレージに libvirt が管理するストレージプールを使用することもお勧めします。
移行はライブで実行でき、実行できません。
ライブマイグレーションでは、ゲスト仮想マシンはソースホスト物理マシン上で実行を継続し、そのメモリーページは宛先ホスト物理マシンに順番に転送されます。移行中、KVM は、すでに転送されたページの変更についてソースを監視し、すべての初期ページが転送されたときにこれらの変更の転送を開始します。KVM は、移行中の転送速度も推定するため、転送するデータの残りの量が一定の設定可能な期間 (デフォルトでは 10 ミリ秒) に達すると、KVM が元のゲスト仮想マシンを一時停止し、残りのデータを転送して、移行先ホストの物理マシンで同じゲスト仮想マシンを再開します。
ライブで実行されない移行は、ゲスト仮想マシンを一時停止してから、ゲスト仮想マシンのメモリーのイメージを移行先のホスト物理マシンに移動します。次に、ゲスト仮想マシンが宛先ホスト物理マシンで再開され、ソースホスト物理マシンで使用されていたゲスト仮想マシンのメモリーが解放されます。このような移行を完了するのにかかる時間は、ネットワークの帯域幅と遅延によって異なります。ネットワークが頻繁に使用されているか、帯域幅が狭い場合、移行にははるかに長い時間がかかります。
元のゲスト仮想マシンがページを KVM が宛先ホストの物理マシンに転送するよりも速く変更する場合は、ライブ移行が完了しないため、オフライン移行を使用する必要があります。

4.1. ライブマイグレーションの要件

ゲスト仮想マシンを移行するには、以下が必要です。

移行の要件

  • 次のいずれかのプロトコルを使用して、共有ストレージにインストールされたゲスト仮想マシン。
    • ファイバーチャネルベースの LUN
    • iSCSI
    • FCoE
    • NFS
    • GFS2
    • SCSI RDMA プロトコル (SCSI RCP) - Infiniband アダプターおよび 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル
  • 移行プラットフォームおよびバージョンは、テーブル 表4.1「ライブマイグレーションの互換性」 に対して確認する必要があります。また、Red Hat Enterprise Linux 6 は、共有ストレージ上の raw イメージと qcow2 イメージを使用したゲスト仮想マシンのライブマイグレーションをサポートしていることにも注意してください。
  • 両方のシステムで、適切な TCP/IP ポートが開いている必要があります。ファイアウォールが使用されている場合は、詳細なポート情報の https://access.redhat.com/site/documentation/ で見つかる 『Red Hat Enterprise Linux Virtualization セキュリティーガイド』 を参照してください。
  • 共有ストレージメディアをエクスポートする別のシステム。ストレージは、移行に使用される 2 つのホストマシンのいずれかに配置しないでください。
  • 共有ストレージは、移行元システムと移行先システムの同じ場所にマウントする必要があります。マウントするディレクトリー名は同じである必要があります。別のパスを使用してイメージを保持することもできますが、推奨されません。virt-manager を使用して移行を行う場合は、パス名が同じである必要があることに注意してください。ただし、virsh を使用して移行を実行する場合は、移行を実行するときに --xml オプションまたはプリフックを使用して、さまざまなネットワーク設定とマウントディレクトリーを使用できます。共有ストレージがなくても、オプション --copy-storage-all (非推奨) を使用して移行を成功させることができます。prehooks の詳細は、 libvirt.org を参照してください。XML オプションの詳細については、20章ドメイン XML の操作 を参照してください。
  • パブリックブリッジ + タップネットワーク内の既存のゲスト仮想マシンで移行を試みる場合、移行元と移行先のホスト物理マシンは同じネットワークに配置する必要があります。この手順を行わないと、ゲストの仮想マシンネットワークが移行後に動作しません。
  • Red Hat Enterprise Linux 5 および 6 では、KVM ゲスト仮想マシンのデフォルトのキャッシュモードが none に設定されているため、ディスクの状態に一貫性がありません。キャッシュオプションを none (たとえば、virsh attach-disk cache none を使用) に設定すると、O_DIRECT フラグを使用してゲスト仮想マシンのファイルが開かれます (オープン システムコールを呼び出す場合)。つまり、ホストの物理マシンのキャッシュを回避し、ゲスト仮想マシンでキャッシュのみを提供します。キャッシュモードを none に設定すると、不整合の問題が回避され、使用すると、仮想マシンのライブマイグレーションが可能になります。キャッシュを none に設定する方法は、「ゲストへのストレージデバイスの追加」 を参照してください。
libvirtd サービスが有効になっていて (#chkconfig libvirtd on)、実行されている (#service libvirtd start) ことを確認してください。また、効果的に移行する機能は、/etc/libvirt/libvirtd.conf 設定ファイルのパラメーターの設定に依存することに注意してください。

手順4.1 libvirtd.conf の設定

  1. libvirtd.conf を開くには、root で次のコマンドを実行する必要があります。
    # vim /etc/libvirt/libvirtd.conf
  2. 必要に応じてパラメーターを変更し、ファイルを保存します。
  3. libvirtd サービスを再起動します。
    # service libvirtd restart

4.2. ライブマイグレーションと Red Hat Enterprise Linux バージョンの互換性

ライブマイグレーションは、表 表4.1「ライブマイグレーションの互換性」 のようにサポートされます。
表4.1 ライブマイグレーションの互換性
移行の方法リリースタイプライブ移行のサポート注記
前方メジャーリリース5.x → 6.yサポート対象外
前方マイナーリリース5.x → 5.y (y>x, x>=4)完全対応問題がある場合は報告する必要があります
前方マイナーリリース6.x → 6.y (y>x, x>=0)完全対応問題がある場合は報告する必要があります
後方メジャーリリース6.x → 5.yサポート対象外 
後方マイナーリリース5.x → 5.y (x>y,y>=4)サポート対象既知の問題は、移行に関する問題のトラブルシューティング を参照してください。
後方マイナーリリース6.x → 6.y (x>y, y>=0)サポート対象既知の問題は、移行に関する問題のトラブルシューティング を参照してください。

移行に関する問題のトラブルシューティング

  • SPICE の問題: Red Hat Enterprise Linux 6.0→6.1 からの移行時に、SPICE に互換性のない変更があることが判明しました。このような場合、クライアントは切断してから再接続し、オーディオとビデオが一時的に失われる可能性があります。これは一時的なものであり、すべてのサービスが再開されます。
  • USB の問題: Red Hat Enterprise Linux 6.2 は、移行サポートを含む USB 機能を追加しましたが、USB デバイスをリセットし、デバイス上で実行されているアプリケーションを中止させる特定の警告がないわけではありません。この問題は Red Hat Enterprise Linux 6.4 で修正され、今後のバージョンでは発生しません。6.4 よりも前のバージョンでこれが発生するのを防ぐには、USB デバイスが使用されている間は移行を行いません。
  • 移行プロトコルの問題 - 後方移行が "unknown section error" で終了する場合は、一時的なエラーである可能性があるため、移行プロセスを繰り返すことで問題を修復できます。そうでない場合は、問題を報告してください。

ネットワークストレージの設定

共有ストレージを設定し、共有ストレージにゲスト仮想マシンをインストールします。

あるいは、「共有ストレージの例: 単純な移行のための NFS」 の NFS の例を使用します。

4.3. 共有ストレージの例: 単純な移行のための NFS

重要
この例では、NFS を使用して、ゲスト仮想マシンのイメージを別の KVM ホストの物理マシンと共有します。大規模なインストールでは実用的ではありませんが、移行技術のみを実証することが推奨されます。この例を、複数のゲスト仮想マシンの移行または実行に使用しないでください。また、sync パラメーターが有効になっている必要もあります。これは、NFS ストレージを適切にエクスポートするために必要です。さらに、NFS をソースホスト物理マシンにマウントすることを強くお勧めします。ゲスト仮想マシンのイメージは、ソースホスト物理マシンにある NFS マウントディレクトリーに作成する必要があります。また、NFS ファイルロックは KVM でサポートされていないため、使用しないでください。
大規模なデプロイメントでは、iSCSI ストレージの方が適しています。設定の詳細は、「iSCSI ベースのストレージプール」 を参照してください。
また、このセクションに記載されている手順は、Red Hat ストレージ管理ガイド に記載されている詳細な手順に代わるものではないことに注意してください。NFS の設定、IP テーブルのオープン、およびファイアウォールの設定については、このガイドを参照してください。
  1. ディスクイメージ用のディレクトリーを作成します

    この共有ディレクトリーには、ゲスト仮想マシンのディスクイメージが含まれます。これを行うには、/var/lib/libvirt/images とは異なる場所にディレクトリーを作成します。以下に例を示します。
    # mkdir /var/lib/libvirt-img/images
  2. NFS 設定ファイルに新しいディレクトリーパスを追加します。

    NFS 設定ファイルは、/etc/exports にあるテキストファイルです。ファイルを開き、手順 1 で作成した新しいファイルへのパスを追加して編集します。
    # echo "/var/lib/libvirt-img/images" >> /etc/exports/[NFS-Config-FILENAME.txt]
  3. NFS の起動

    1. iptable (2049 など) の NFS のポートが開いていることを確認し、/etc/hosts.allow ファイルに NFS を追加します。
    2. NFS サービスを開始します。
      # service nfs start
  4. ソースと宛先の両方に共有ストレージをマウントします

    次のコマンドを 2 回実行して、ソースシステムと宛先システムの両方に /var/lib/libvirt/images ディレクトリーをマウントします。ソースシステムで 1 回、宛先システムでもう一度。
    # mount source_host:/var/lib/libvirt-img/images /var/lib/libvirt/images
    警告
    この手順で作成するディレクトリーが、「ライブマイグレーションの要件」 で概説されている要件に準拠していることを確認してください。さらに、ディレクトリーに正しい SELinux ラベルを付ける必要がある場合があります。詳細は、Red Hat Enterprise Linux ストレージ管理ガイド の NFS の章を参照してください。

4.4. virsh を使用した KVM のライブ移行

virsh コマンドを使用すると、ゲスト仮想マシンを別のホスト物理マシンに移行できます。migrate コマンドは、以下の形式のパラメーターを受け付けます。
# virsh migrate --live GuestName DestinationURL
ライブマイグレーションが望ましくない場合は、-live オプションが削除される可能性があることに注意してください。追加オプションは、「virsh migrate コマンドの追加オプション」 に一覧表示されています。
GuestName パラメーターは、移行するゲスト仮想マシンの名前を表します。
DestinationURL パラメーターは、移行先ホストの物理マシンの接続 URL です。移行先システムで同じバージョンの Red Hat Enterprise Linux を実行し、同じハイパーバイザーを使用し、libvirt を実行している必要があります。
注記
通常の移行およびピアツーピア移行の DestinationURL パラメーターには、以下のセマンティクスがあります。
  • 通常の移行: DestinationURL は、ソースゲスト仮想マシンから見たターゲットホスト物理マシンの URL です。
  • ピアツーピアの移行: DestinationURL は、移行元ホストの物理マシンから表示されるターゲットホストの物理マシンの URL です。
コマンドを入力すると、インストール先システムの root パスワードを求められます。
重要
移行を成功させるには、移行元サーバーの /etc/hosts ファイルに移行先ホストの物理マシンのエントリーが必要です。次の例に示すように、宛先ホストの物理マシンの IP アドレスとホスト名をこのファイルに入力し、宛先ホストの物理マシンの IP アドレスとホスト名を置き換えます。
10.0.0.20	host2.example.com

例:virsh を使用したライブマイグレーション

この例では、host1.example.com から host2.example.com に移行します。使用環境に合わせて、ホストの物理マシン名を変更します。この例では、guest1-rhel6-64 という名前の仮想マシンを移行します。

この例では、共有ストレージを完全に設定し、すべての前提条件 (ここでは 移行の要件) を満たしていることを前提としています。
  1. ゲスト仮想マシンが実行していることを確認します。

    移行元システムで、host1.example.com を実行し、guest1-rhel6-64 が実行していることを確認します。
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
  2. ゲスト仮想マシンの移行

    次のコマンドを実行して、ゲスト仮想マシンを移行先 host2.example.com にライブ移行します。リンク先の URL の末尾に /system を追加し、フルアクセスが必要であることを libvirt に指示します。
    # virsh migrate --live guest1-rhel6-64 qemu+ssh://host2.example.com/system
    コマンドを入力すると、インストール先システムの root パスワードを求められます。
  3. 待機

    負荷やゲスト仮想マシンのサイズによっては、移行に時間がかかる場合があります。virsh はエラーのみを報告します。ゲスト仮想マシンは、完全に移行するまで、移行元ホストの物理マシンで実行し続けます。
    注記
    移行中、完了率インジケーターの数は、プロセスが完了する前に複数回減少する可能性があります。これは、移行の開始後に変更されたソースメモリーページを再度コピーする必要があるため、全体的な進行状況の再計算が原因で発生します。したがって、この動作は予期されたものであり、移行に問題があることを示すものではありません。
  4. ゲスト仮想マシンが移行先ホストに到達していることを確認する

    宛先システム host2.example.com から、guest1-rhel6-64 が実行されていることを確認します。
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
これで、ライブマイグレーションが完了しました。
注記
libvirt は、TLS/SSL ソケット、UNIX ソケット、SSH、暗号化されていない TCP など、さまざまなネットワーク方式をサポートしています。他の方法の使用に関する詳細は、5章ゲストのリモート管理 を参照してください。
注記
実行されていないゲスト仮想マシンは、virshmigrate コマンドを使用して移行できません。実行していないゲスト仮想マシンを移行するには、以下のスクリプトを使用する必要があります。
virsh dumpxml Guest1 > Guest1.xml
virsh -c qemu+ssh://<target-system-FQDN>  define Guest1.xml
virsh undefine Guest1

4.4.1. virsh を使用した移行に関する追加のヒント

複数の同時ライブマイグレーションを実行できます。各移行は、個別のコマンドシェルで実行されます。ただし、これは慎重に行ってください。各移行インスタンスでは、双方 (ソースおよびターゲット) から 1 つの MAX_CLIENT を使用するため、注意して計算を行う必要があります。デフォルト設定は 20 であるため、設定を変更せずに 10 インスタンスを実行できます。設定を変更する必要がある場合は、手順 手順4.1「libvirtd.conf の設定」 を参照してください。
  1. 手順4.1「libvirtd.conf の設定」 の説明に従って、libvirtd.conf ファイルを開きます。
  2. Processing controls のセクションを探します。
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 20
    
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
    
  3. max_clients および max_workers パラメーターの設定を変更します。両方のパラメーターの番号が同じであることが推奨されます。max_clients は、移行ごとに 2 つのクライアント (各側に 1 つ) を使用します。max_workers は、実行フェーズ中に移行元で 1 つのワーカーと、移行先で 0 のワーカーを使用し、終了フェーズ中に移行先でワーカーを 1 つ使用します。
    重要
    max_clients パラメーターおよび max_workers パラメーターの設定は、libvirtd サービスへのゲスト仮想マシンのすべての接続の影響を受けます。つまり、同じゲスト仮想マシンを使用しているユーザーで、同時に移行を実行しているすべてのユーザーは、max_clients および max_workers パラメーター設定で設定される制限にも古いことになります。このため、同時ライブマイグレーションを実行する前に、最大値を慎重に検討する必要があります。
  4. ファイルを保存し、サービスを再起動します。
    注記
    起動したにもかかわらず認証されていない ssh セッションが多すぎるために、移行接続が切断する場合があります。デフォルトでは、sshd で許可されるセッションは 10 セッションのみで、常に "pre-authenticated state" となります。この設定は、sshd 設定ファイル (ここでは /etc/ssh/sshd_config) の MaxStartups パラメーターで制御されます。これには調整が必要な場合があります。この制限は DoS 攻撃 (および一般的なリソースの過剰使用) を防ぐために設定されているため、このパラメーターの調整は慎重に行ってください。この値を高く設定しすぎると、目的が無効になります。このパラメーターを変更するには、ファイル/etc/ssh/sshd_configを変更し、MaxStartups 行の先頭から#を削除して、10 (デフォルト値) をより大きな数値に変更します。必ず保存して、sshd サービスを再起動してください。詳細は、sshd_config の man ページを参照してください。

4.4.2. virsh migrate コマンドの追加オプション

--live のほかに、virsh migrate では以下のオプションを利用できます。
  • --direct - 直接移行に使用されます。
  • --p2p - ピアツーピア移行に使用されます。
  • --tunnelled - トンネル化された移行に使用されます。
  • --persistent - ドメインを移行先ホストの物理マシンの永続状態に残します。
  • --undefinesource - ソースホストの物理マシンのゲスト仮想マシンを削除します。
  • --suspend - ドメインを移行先ホストの物理マシンの一時停止状態のままにします。
  • --change-protection - 移行の進行中に、互換性のない設定変更がドメインに行われないように強制します。ハイパーバイザーによるサポートがある場合にこのオプションが暗黙的に有効になりますが、ハイパーバイザーに変更保護の対応がない場合に明示的に使用して移行を拒否できます。
  • --unsafe - すべての安全手順を無視して、強制的に移行を実行します。
  • --verbose - 移行の進行状況を表示します。
  • --abort-on-error - 移行プロセス中にソフトエラー (I/O エラーなど) が発生すると移行を取り消します。
  • --migrateuri: 通常省略される移行 URI です。
  • --domain [string]- ドメイン名、ID、または uuid
  • --desturi[string]: クライアント (通常の移行) またはソース (p2p 移行) から見た宛先ホスト物理マシンの接続 URI
  • --migrateuri: 移行 URI。通常は省略できます。
  • --timeout [seconds]- ライブマイグレーションカウンターが N 秒を超えるとゲスト仮想マシンを強制的に中断します。ライブマイグレーションでのみ使用できます。タイムアウトが開始されると、一時停止されたゲスト仮想マシンで移行が続行されます。
  • --dname [string] - 移行時にゲスト仮想マシンの名前を新規の名前に変更します (サポートされている場合)。
  • --xml - 指定されたファイル名を使用して、宛先で使用する別の XML ファイルを提供できます。このファイル名は、基となるストレージへのアクセスで、ソースと宛先の名前の相違を考慮するなど、ホスト固有のドメイン XML の部分にさらに多くの変更を加えます。このオプションは通常、省略されます。
詳細は、man ページの virsh を参照してください。

4.5. virt-manager を使用した移行

本セクションでは、virt-manager を使用した KVM ゲスト仮想マシンの、ホスト物理マシンから別のホスト物理マシンへの移行を説明します。
  1. virt-manager を開く

    virt-manager を開きます。メインメニューバーから ApplicationsSystem ToolsVirtual Machine Manager を選択して、virt-manager を起動します。

    図4.1 virt-Manager のメインメニュー

    virt-Manager のメインメニュー
  2. ターゲットホストの物理マシンへの接続

    File メニューをクリックしてターゲットホストの物理マシンに接続し、Add Connection をクリックします。

    図4.2 Add Connection ウィンドウの表示

    Add Connection ウィンドウの表示
  3. 接続の追加

    Add Connection ウィンドウが表示されます。

    図4.3 ターゲットホストの物理マシンへの接続の追加

    ターゲットホストの物理マシンへの接続の追加
    以下の詳細を入力します。
    • Hypervisor: QEMU/KVM を選択します。
    • Method: 接続方法を選択します。
    • Username: リモートホストの物理マシンのユーザー名を入力します。
    • Hostname: リモートホストの物理マシンのホスト名を入力します。
    Connect ボタンをクリックします。この例では SSH 接続を使用しているため、次の手順で指定するユーザーのパスワードを入力する必要があります。

    図4.4 パスワードを入力

    パスワードを入力
  4. ゲスト仮想マシンの移行

    ソースホスト物理マシン内のゲストのリストを開き (ホスト名の左側にある小さな三角形をクリック)、移行するゲスト (この例では guest1-rhel6-64) を右クリックして、Migrate をクリックします。

    図4.5 移行するゲストの選択

    移行するゲストの選択
    New Host フィールドで、ドロップダウンリストを使用して、ゲスト仮想マシンの移行先となるホスト物理マシンを選択し、Migrate をクリックします。

    図4.6 移行先ホストの物理マシンの選択と、移行プロセスの開始

    移行先ホストの物理マシンの選択と、移行プロセスの開始
    進捗ウィンドウが表示されます。

    図4.7 進捗ウィンドウ

    進捗ウィンドウ
    virt-manager は、移行先ホストで実行されている、新しく移行されたゲスト仮想マシンを表示するようになりました。これで、ソースホストの物理マシンで実行されていたゲスト仮想マシンがシャットオフ状態で一覧表示されます。

    図4.8 移行先ホストの物理マシンで実行している移行ゲスト仮想マシン

    移行先ホストの物理マシンで実行している移行ゲスト仮想マシン
  5. オプション: ホストの物理マシンのストレージの詳細を表示します。

    Edit メニューで Connection Details をクリックすると、Connection Details ウィンドウが表示されます。
    Storage タブをクリックします。移行先ホストの物理マシンの iSCSI ターゲットの詳細が表示されます。移行したゲスト仮想マシンがストレージを使用するものとして一覧表示されることに注意してください。

    図4.9 ストレージの詳細

    ストレージの詳細
    このホストは、以下の XML 設定で定義されています。

    図4.10 宛先ホスト物理マシンの XML 設定

    
    <pool type='iscsi'>
        <name>iscsirhel6guest</name>
        <source>
            <host name='virtlab22.example.com.'/>
            <device path='iqn.2001-05.com.iscsivendor:0-8a0906-fbab74a06-a700000017a4cc89-rhevh'/>
        </source>
        <target>
            <path>/dev/disk/by-path</path>
        </target>
    </pool>
      ...
    

第5章 ゲストのリモート管理

本セクションでは、ssh または TLS および SSL を使用してゲストをリモートで管理する方法を説明します。SSH の詳細は、Red Hat Enterprise Linux デプロイメントガイド を参照してください。

5.1. SSH を使用したリモート管理

ssh パッケージは、暗号化したネットワークプロトコルを提供し、管理機能をリモート仮想サーバーに安全に送信できます。以下の方法は、SSH 接続上でセキュアにトンネリングされた libvirt 管理接続を使用して、リモートマシンを管理します。すべての認証は、SSHの公開鍵暗号と、ローカルのSSHエージェントが収集したパスワードまたはパスフレーズを使用して行われます。さらに、各ゲストの VNC コンソールは、SSH を介してトンネリングされます。
次のような、仮想マシンをリモート管理するために SSH を使用する際の問題に注意してください。
  • 仮想マシンを管理するには、リモートマシンへの root ログインアクセスが必要です。
  • 初期接続の設定プロセスが遅くなる可能性があります。
  • すべてのホストまたはゲストでユーザーのキーを取り消す標準または簡単な方法はありません。
  • SSH は、リモートマシンの数が多いと適切にスケーリングされません。
注記
Red Hat Virtualization により、多数の仮想マシンのリモート管理が可能になります。詳細については、Red Hat Virtualization のドキュメントを参照してください。
ssh アクセスには、以下のパッケージが必要です。
  • openssh
  • openssh-askpass
  • openssh-clients
  • openssh-server

virt-manager 用にパスワードを使用しないまたはパスワードを使用したSSH アクセスの設定

以下の手順は、ゼロから開始しており、SSH キーが設定されていないことを前提としています。SSH 鍵を設定して別のシステムにコピーしている場合は、この手順をスキップできます。

重要
SSH 鍵はユーザーに依存するため、所有者のみが使用できます。キーの所有者は、キーを生成した人です。キーは共有できません。
リモートホストコンピューターに接続するには、キーを所有するユーザーがvirt-manager を実行する必要があります。つまり、リモートシステムが root 以外のユーザーにより管理されている場合は、virt-manager を非特権モードで実行する必要があります。リモートシステムがローカルの root ユーザーで管理されている場合は、SSH 鍵を root が作成して所有する必要があります。
ローカルホストは、virt-manager を使用する非特権ユーザーとして管理できません。
  1. オプション: ユーザーの変更

    必要に応じてユーザーを変更します。この例では、ローカルの root ユーザーを使用して、その他のホストとローカルホストをリモートで管理します。
    $ su -
  2. SSH 鍵ペアの生成

    virt-manager が使用されているマシンで公開鍵ペアを生成します。この例では、~/.ssh/ ディレクトリーのデフォルトの鍵の場所を使用します。
    # ssh-keygen -t rsa
  3. リモートホストへの鍵のコピー

    パスワードなしのリモートログイン、またはパスフレーズを使用したリモートログインでは、管理対象システムに SSH 鍵を配布する必要があります。ssh-copy-id コマンドを使用して、指定したシステムアドレス (この例では root@host2.example.com) の root ユーザーにキーをコピーします。
    # ssh-copy-id -i ~/.ssh/id_rsa.pub root@host2.example.com
    root@host2.example.com's password:
    
    次に、ssh root@host2.example.com コマンドを使用してマシンにログインし、.ssh/authorized_keys ファイルをチェックインして予期しないキーが追加されていないことを確認します。
    必要に応じて、その他のシステムに対して繰り返します。
  4. オプション: パスフレーズを ssh-agent に追加します。

    以下の手順では、既存の ssh-agent にパスフレーズを追加する方法について説明します。ssh-agent が実行されていない場合、実行に失敗します。エラーや競合を回避するには、SSH パラメーターが正しく設定されていることを確認してください。詳細は、Red Hat Enterprise Linux 導入ガイド を参照してください。
    必要に応じて、SSH キーのパスフレーズを ssh-agent に追加します。ローカルホストで次のコマンドを使用して、パスフレーズ (存在する場合) を追加し、パスワードなしのログインを有効にします。
    # ssh-add ~/.ssh/id_rsa
    SSH キーがリモートシステムに追加されます。

libvirt デーモン (libvirtd)

libvirt デーモンは、仮想マシンを管理するインターフェイスを提供します。管理が必要なすべてのリモートホストに libvirtd デーモンをインストールして実行する必要があります。

$ ssh root@somehost
# chkconfig libvirtd on
# service libvirtd start
libvirtdSSH を設定すると、仮想マシンにリモートでアクセスして管理できるようになります。この時点で、VNC でゲストにアクセスできるようになるはずです。

virt-manager を使用したリモートホストへのアクセス

リモートホストは、virt-manager GUI ツールで管理できます。SSH キーは、パスワードを使用しないログインを機能させるために、virt-manager を実行しているユーザーに属している必要があります。

  1. virt-manager を起動します。
  2. File ->Add Connection メニューを開きます。

    図5.1 Add Connection メニュー

    Add Connection メニュー
  3. ドロップダウンメニューを使用してハイパーバイザータイプを選択し、Connect to remote host チェックボックスをクリックして Connection Method (この場合は Remote tunnel over SSH) を開き、必要な User nameHostname を入力して Connect をクリックします。

5.2. TLS および SSL でのリモート管理

TLS および SSL を使用して仮想マシンを管理できます。TLS および SSL はスケーラビリティーは高くなりますが、SSH よりも複雑になります (「SSH を使用したリモート管理」 を参照)。TLS と SSL は、Web ブラウザーでセキュアな接続に使用されるものと同じ技術です。libvirt 管理接続は受信接続の TCP ポートを開きます。これは、x509 証明書に基づいて安全に暗号化および認証されます。以下の手順では、TLS および SSL 管理用の認証証明書を作成してデプロイする方法を説明します。

手順5.1 TLS 管理用の認証局 (CA) 鍵の作成

  1. 始める前に、certtool ユーティリティーがインストールされていることを確認してください。そうでない場合は、以下を行います。
    # yum install gnutls-utils
  2. 次のコマンドを使用して、秘密鍵を生成します。
    # certtool --generate-privkey > cakey.pem
  3. キーが生成されたら、次のステップは、キーが自己署名できるように署名ファイルを作成することです。作成するには、署名の詳細が含まれるファイルを作成し、ca.info という名前を付けます。このファイルには、以下の内容を記述する必要があります。
    # vim ca.info
    cn = Name of your organization
    ca
    cert_signing_key
    
  4. 以下のコマンドを使用して自己署名キーを生成します。
    # certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
    ファイルが生成されたら、rm コマンドを使用して ca.info ファイルを削除できます。生成プロセスの結果として生成されるファイルの名前は cacert.pem です。このファイルは公開鍵 (証明書) です。読み込んだcakey.pemは秘密鍵です。このファイルは共有スペースに保存しないでください。この鍵は秘密鍵を保持します。
  5. /etc/pki/CA/cacert.pem ディレクトリー内のすべてのクライアントとサーバーに cacert.pem 認証局証明書ファイルをインストールして、CA によって発行された証明書が信頼できることを通知します。このファイルの内容を表示するには、次のコマンドを実行します。
    # certtool -i --infile cacert.pem
    これは、CA の設定に必要なものです。クライアントとサーバーの証明書を発行するために必要となるため、CA の秘密鍵を安全に保持します。

手順5.2 サーバー証明書の発行

この手順では、サーバーのホスト名に設定されている X.509 Common Name (CN) フィールドを使用して証明書を発行する方法を説明します。CN は、クライアントがサーバーへの接続に使用するホスト名と一致する必要があります。この例では、クライアントは URI: qemu://mycommonname/system を使用してサーバーに接続するため、CN フィールドは同一である必要があります (mycommoname)。
  1. サーバーの秘密鍵を作成します。
    # certtool --generate-privkey > serverkey.pem
  2. 最初に server.info というテンプレートファイルを作成して、CA の秘密鍵の署名を生成します。CN がサーバーのホスト名と同じに設定されていることを確認します。
    organization = Name of your organization
    cn = mycommonname
    tls_www_server
    encryption_key
    signing_key
    
  3. 次のコマンドを使用して証明書を作成します。
    # certtool --generate-certificate --load-privkey serverkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \ --template server.info --outfile servercert.pem
  4. これにより、2 つのファイルが生成されます。
    • serverkey.pem - サーバーの秘密鍵
    • servercert.pem - サーバーの公開鍵
    秘密鍵の場所は、秘密にしておきます。ファイルの内容を表示するには、以下のコマンドを実行します。
    # certtool -i --inifile servercert.pem
    このファイルを開く場合、CN= パラメーターは先に設定した CN と同じでなければなりません。(例:mycommonname)
  5. 次の場所にある 2 つのファイルをインストールします。
    • serverkey.pem - サーバーの秘密鍵。このファイルは、/etc/pki/libvirt/private/serverkey.pem に置きます。
    • servercert.pem - サーバーの証明書。サーバーの /etc/pki/libvirt/servercert.pem にインストールします。

手順5.3 クライアント証明書の発行

  1. すべてのクライアント (つまり、virt-manager などの libvirt にリンクされているプログラム) について、X.509 識別名 (DN) が適切な名前に設定された証明書を発行する必要があります。これは、企業レベルで決定する必要があります。
    たとえば、以下の情報が使用されます。
    C=USA,ST=North Carolina,L=Raleigh,O=Red Hat,CN=name_of_client
    このプロセスは、以下の例外を除き、手順5.2「サーバー証明書の発行」 と非常に似ています。
  2. 以下のコマンドを使用して秘密鍵を作成します。
    # certtool --generate-privkey > clientkey.pem
  3. 最初に client.info という名前のテンプレートファイルを作成して、CA の秘密鍵の署名を生成します。ファイルには以下の内容が含まれている必要があります (フィールドは、お住まいの地域/場所に合わせてカスタマイズする必要があります)。
    country = USA
    state = North Carolina
    locality = Raleigh
    organization = Red Hat
    cn = client1
    tls_www_client
    encryption_key
    signing_key
    
  4. 次のコマンドを使用して、証明書に署名します。
    # certtool --generate-certificate --load-privkey clientkey.pem --load-ca-certificate cacert.pem \ --load-ca-privkey cakey.pem --template client.info --outfile clientcert.pem
  5. クライアントマシンに証明書をインストールします。
    # cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem
    # cp clientcert.pem /etc/pki/libvirt/clientcert.pem

5.3. トランスポートモード

リモートマネジメントの場合、libvirt は以下のトランスポートモードに対応します。

Transport Layer Security (TLS)

Transport Layer Security TLS 1.0 (SSL 3.1) が認証され、暗号化された TCP/IP ソケット。通常はパブリックポート番号をリッスンします。これを使用するには、クライアント証明書とサーバー証明書を生成する必要があります。標準のポートは 16514 です。

UNIX ソケット

UNIX ドメインソケットは、ローカルマシンでのみアクセスできます。ソケットは暗号化されず、UNIX の権限または SELinux を使用して認証を行います。通常のソケット名は /var/run/libvirt/libvirt-sock および /var/run/libvirt/libvirt-sock-ro です (読み取り専用接続の場合)。

SSH

SSH (Secure Shell Protocol) 接続で転送されます。Netcat が必要です (ncパッケージ) がインストールされています。libvirt デーモン (libvirtd) は、リモートマシンで実行している必要があります。SSH アクセスには、ポート 22 を開いておく必要があります。ある種の SSH キー管理 (たとえば、ssh-agentユーティリティー) を使用する必要があります。そうしないと、パスワードの入力を求められます。

ext

ext パラメーターは、libvirt のスコープ外の方法でリモートマシンに接続できる外部プログラムに使用されます。このパラメーターはサポートされていません。

TCP

暗号化されていない TCP/IP ソケット。実稼働環境での使用は推奨されていないため、これは通常無効になっていますが、管理者はこれをテストしたり、信頼できるネットワークで使用したりできます。デフォルトのポートは 16509 です。

デフォルトのトランスポートは、その他のトランスポートを指定しないと TLS になります。

リモート URI

URI (Uniform Resource Identifier) は、virsh および libvirt がリモートホストに接続するために使用します。URI は、virsh コマンドの --connect パラメーターとともに使用して、リモートホストで単一コマンドまたは移行を実行することもできます。リモート URI は、通常のローカル URI を取得し、ホスト名またはトランスポート名を追加することで形成されます。特別な場合として、remote の URI スキームを使用すると、リモートの libvirtd サーバーで、最適なハイパーバイザードライバーをプローブするように指示されます。これは、ローカル接続の NULL URI を渡すことに相当します。

libvirt の URI は一般的な形式をとります (角括弧内のコンテンツ "[]" は任意の関数を表します)。
driver[+transport]://[username@][hostname][:port]/path[?extraparameters]
ハイパーバイザー (ドライバー) が QEMU の場合は、パスが必須であることに注意してください。XEN の場合はオプションです。
以下は、有効なリモート URI の例になります。
  • qemu://hostname/
  • xen://hostname/
  • xen+ssh://hostname/
外部の場所を対象とする場合は、トランスポート方法またはホスト名を指定する必要があります。詳細は、http://libvirt.org/guide/html/Application_Development_Guide-Architecture-Remote_URIs.html を参照してください。

リモート管理パラメーターの例

  • SSH トランスポートと SSH ユーザー名 virtuser を使用して、host2 という名前のリモート KVM ホストに接続します。それぞれの connect コマンドは connect [<name>] [--readonly] です。ここで、<name> はここで説明する有効な URI です。virsh connect コマンドの詳細については、「connect」 を参照してください。
    qemu+ssh://virtuser@hot2/
  • TLS を使用して、host2 という名前のホスト上のリモートの KVM ハイパーバイザーに接続します。
    qemu://host2/

テスト例

  • 標準以外の UNIX ソケットを使用して、ローカルの KVM ハイパーバイザーに接続します。この場合は、UNIX ソケットの完全パスが明示的に指定されています。
    qemu+unix:///system?socket=/opt/libvirt/run/libvirt/libvirt-sock
  • 暗号化されていない TCP/IP 接続を使用して、ポート 5000 の IP アドレス 10.1.1.10 のサーバーに libvirt デーモンを接続します。これは、デフォルト設定でテストドライバーを使用します。
    test+tcp://10.1.1.10:5000/default

追加の URI パラメーター

リモートの URI には、追加のパラメーターを追加できます。以下の表 表5.1「追加の URI パラメーター」 では、認識されるパラメーターを説明します。その他のパラメーターはすべて無視されます。パラメーター値は URI エスケープする必要があります (つまり、パラメーターおよび特殊文字が URI 形式に変換される前に疑問符 (?) が追加されることを意味します)。

表5.1 追加の URI パラメーター
名前 トランスポートモード 説明 使用例
name すべてのモード リモートの virConnectOpen 関数に渡される名前。名前は、通常、リモートの URI から transport、hostname、port number、username、および追加のパラメーターを削除して生成されますが、非常に複雑なケースでは、名前を明示的に指定することをお勧めします。 name=qemu:///system
command ssh と ext 外部コマンド。ext トランスポートの場合はこれが必要です。ssh の場合、デフォルトは ssh です。コマンド用に PATH が検索されます。 command=/opt/openssh/bin/ssh
socket unix と ssh UNIX ドメインソケットへのパスで、デフォルトを上書きします。ssh トランスポートの場合は、これがリモートの netcat コマンド (netcat を参照) に渡されます。 socket=/opt/libvirt/run/libvirt/libvirt-sock
netcat ssh
netcat コマンドを使用して、リモートシステムに接続できます。デフォルトの netcat パラメーターは nc コマンドを使用します。SSH トランスポートの場合、libvirt は以下の形式を使用して SSH コマンドを構築します。
command -p port [-l username] hostname
netcat -U ソケット
portusername、および hostname パラメーターは、リモート URI の一部として指定できます。commandnetcat、および socket は、他の追加パラメーターから取得されます。
netcat=/opt/netcat/bin/nc
no_verify tls ゼロ以外の値に設定すると、サーバーの証明書のクライアントチェックが無効になります。クライアントの証明書または IP アドレスのサーバーチェックを無効にするには、libvirtd 設定を変更する必要があります。 no_verify=1
no_tty ssh 0 以外の値に設定すると、リモートマシンに自動的にログインできない場合に ssh がパスワードを要求できなくなります。ターミナル へのアクセスがない場合は、これを使用します。 no_tty=1

第6章 KVM でのオーバーコミット

KVM ハイパーバイザーは、CPU とメモリーを自動的にオーバーコミットします。つまり、仮想化した CPU とメモリーは、システムにある物理リソースよりも仮想マシンに割り当てることができます。これが可能なのは、ほとんどのプロセスが割り当てられたリソースの 100% に常にアクセスするわけではないためです。
その結果、十分に活用されていない仮想化サーバーまたはデスクトップをより少ないホストで実行できるため、多くのシステムリソースが節約され、サーバーハードウェアへの電力、冷却、および投資が削減されます。

6.1. メモリーのオーバーコミット

KVM ハイパーバイザーで実行しているゲスト仮想マシンには、物理 RAM の専用ブロックが割り当てられていません。代わりに、各ゲスト仮想マシンは、ホスト物理マシンの Linux カーネルが、要求された場合にのみメモリーを割り当てる Linux プロセスとして機能します。また、ホストのメモリーマネージャーは、ゲスト仮想マシンのメモリーを、自身の物理メモリーとスワップ領域の間で移動できます。
オーバーコミットを行うには、ホストの物理マシンに、すべてのゲスト仮想マシンに対応する十分なスワップ領域と、ホストの物理マシンのプロセスに十分なメモリーを割り当てる必要があります。基本的には、ホスト物理マシンのオペレーティングシステムには、最大 4GB のメモリーと、最小 4GB のスワップ領域が必要です。スワップパーティションに適したサイズを判断する方法は、Red Hat ナレッジベース を参照してください。
重要
オーバーコミットは、一般的なメモリー問題には理想的な解決策ではありません。メモリー不足に対処するための推奨される方法は、ゲストごとに割り当てるメモリーを減らすか、ホストに物理メモリーを追加するか、スワップスペースを利用することです。
仮想マシンを頻繁にスワップすると、仮想マシンの実行が遅くなります。また、オーバーコミットによりシステムのメモリーが不足 (OOM) する可能性があります。これにより、Linux カーネルが重要なシステムプロセスをシャットダウンする可能性があります。メモリーをオーバーコミットする場合は、十分なテストが行われていることを確認してください。オーバーコミットのサポートについては、Red Hat サポートまでご連絡ください。
オーバーコミットは、すべてのゲスト仮想マシンで機能するわけではありませんが、最小限の集中使用でデスクトップ仮想化セットアップで機能するか、カーネルの同じページのマージ (KSM) で複数の同一のゲスト仮想マシンを実行することがわかっています。
KSM とオーバーコミットの詳細については、7章KSM を参照してください。
重要
デバイスの割り当て が使用中の場合に、割り当てられたデバイスでダイレクトメモリーアクセス (DMA) を有効にするには、仮想マシンのすべてのメモリーを静的に事前に割り当てる必要があるためです。したがって、メモリーのオーバーコミットはデバイス割り当てではサポートされていません。

6.2. 仮想 CPU のオーバーコミット

KVM ハイパーバイザーは、仮想化 CPU のオーバーコミットに対応します。仮想化 CPU は、ゲスト仮想マシンの負荷制限が許す限り、オーバーコミットできます。負荷が 100% に近いと、要求が破棄されたり、使用できない応答時間が発生する可能性があるため、VMSCPU をオーバーコミットする場合は注意してください。
仮想化 CPU (vCPU) は、単一のホスト物理マシンに同じ vCPU を共有しない複数のゲスト仮想マシンがある場合に最適にオーバーコミットされます。 KVM は、1 台の単一ホスト物理マシン上の 1 台の物理 CPU に対して 5 台の VCPU (5 台の仮想マシン上) の比率で、負荷が 100% 未満のゲスト仮想マシンを安全にサポートする必要があります。KVM はすべてのマシンを切り替え、負荷のバランスが取れていることを確認します。
処理コアの物理数を超えてゲスト仮想マシンをオーバーコミットしないでください。たとえば、4 つの vCPU を備えたゲスト仮想マシンは、デュアルコアプロセッサーを備えたホスト物理マシンではなく、クアッドコアホストで実行する必要があります。また、物理プロセッサーコアごとに、割り当てられた vCPU の合計が 10 を超えることは推奨されません。
重要
広範なテストを行わずに、実稼働環境で CPU をオーバーコミットしないでください。処理リソースを 100% 使用するアプリケーションは、オーバーコミットされた環境では不安定になる可能性があります。デプロイ前にテストします。
仮想マシンから最高のパフォーマンスを引き出す方法の詳細については、Red Hat Enterprise Linux 6 仮想化チューニングおよび最適化ガイド を参照してください。

第7章 KSM

共有メモリーの概念は、最新のオペレーティングシステムでは一般的です。たとえば、プログラムが最初に起動されると、そのプログラムはすべてのメモリーを親プログラムと共有します。子プログラムまたは親プログラムがこのメモリーを変更しようとすると、カーネルは新しいメモリー領域を割り当て、元のコンテンツをコピーして、プログラムがこの新しい領域を変更できるようにします。これは、コピーオンライトとして知られています。
KSM は、この概念を逆に使用する新しい Linux 機能です。KSM を使用すると、カーネルはすでに実行中の 2 つ以上のプログラムを検証し、それらのメモリーを比較できます。いずれかのメモリー領域またはページが同一である場合、KSM は複数の同一のメモリーページを 1 つのページに減らします。このページは、コピーオンライトとしてマークされます。ページのコンテンツがゲスト仮想マシンによって変更された場合、そのゲスト仮想マシン用に新しいページが作成されます。
これは、KVM を使用した仮想化に役立ちます。ゲスト仮想マシンが起動すると、親 qemu-kvm プロセスからメモリーのみが継承されます。ゲスト仮想マシンが実行されると、ゲストが同じオペレーティングシステムまたはアプリケーションを実行しているときに、ゲスト仮想マシンのオペレーティングシステムイメージのコンテンツを共有できます。
注記
ページ重複排除テクノロジー (KSM 実装でも使用) は、複数のゲスト間で情報を漏洩するために使用される可能性のあるサイドチャネルを導入する可能性があります。これが懸念される場合は、ゲストごとに KSM を無効にすることができます。
KSM は、メモリーの速度と使用率を強化します。KSM では、共通のプロセスデータがキャッシュまたはメインメモリーに保存されます。これにより、KVM ゲストのキャッシュミスが減少し、一部のアプリケーションとオペレーティングシステムのパフォーマンスが向上します。次に、メモリーを共有すると、ゲストの全体的なメモリー使用量が削減され、リソースの密度と使用率が向上します。
注記
Red Hat Enterprise Linux 6.5 以降、KSM は NUMA に対応しています。これにより、ページのコアレッシング中に NUMA の局所性を考慮できるため、ページがリモートノードに移動されることに関連するパフォーマンスの低下を防ぐことができます。Red Hat は、KSM が使用されている場合に、ノード間のメモリーマージを回避することを推奨します。KSM を使用している場合は、/sys/kernel/mm/ksm/merge_across_nodes0 に変更して、NUMA ノード間でページがマージされないようにします。カーネルメモリーが計算した統計情報は、ノード間での大量のマージ後にはそれぞれの間で相反する場合があります。そのため、KSM デーモンが大量のメモリーをマージすると、numad が混乱する可能性があります。システムに未使用のメモリーが大量にあると、KSM デーモンをオフにして無効にすることでパフォーマンスが高まる場合があります。NUMA の詳細は、Red Hat Enterprise Linux パフォーマンスチューニングガイド を参照してください。
Red Hat Enterprise Linux は、KSM を制御するために 2 つの異なる方法を使用します。
  • ksm サービスは、KSM カーネルスレッドを開始および停止します。
  • ksmtuned サービスは ksm を制御し、調整し、同じページのマージを動的に管理します。ksmtuned サービスは ksm を開始し、メモリー共有が必要ない場合は ksm サービスを停止します。ksmtuned サービスは、retune新しいゲストが作成または破棄されたときに実行するパラメーター。
これらのサービスは両方とも、標準のサービス管理ツールで制御されます。

KSM サービス

ksm サービスは qemu-kvm パッケージに含まれています。KSM は、Red Hat Enterprise Linux 6 ではデフォルトでオフになっています。ただし、Red Hat Enterprise Linux 6 を KVM ホスト物理マシンとして使用する場合は、ksm/ksmtuned サービスによってオンにされる可能性があります。

ksm サービスが開始されていない場合、KSM は 2000 ページのみを共有します。このデフォルトは低く、メモリー節約の利点は限られています。
ksm サービスが開始されると、KSM はホスト物理マシンシステムのメインメモリーの最大半分を共有します。ksm サービスを開始して、KSM がより多くのメモリーを共有できるようにしてください。
# service ksm start
Starting ksm:                                              [  OK  ]
ksm サービスは、デフォルトの起動シーケンスに追加できます。chkconfig コマンドを使用して、ksm サービスを永続化します。
# chkconfig ksm on

KSM チューニングサービス

ksmtuned サービスにはオプションがありません。ksmtuned サービスは、ksm をループして調整します。さらに、ゲスト仮想マシンが作成または破棄されると、ksmtuned サービスに libvirt から通知されます。

# service ksmtuned start
Starting ksmtuned:                                         [  OK  ]
ksmtuned サービスは、retune パラメーターを使用して調整できます。retune パラメーターは、チューニング機能を手動で実行するように ksmtuned に指示します。
ファイル内のパラメーターを変更する前に、明確にする必要のあるいくつかの用語があります。
  • thres: アクティベーションキーのしきい値 (kbytes)KSM サイクルは、全 thres プロセス RSZ の合計にシステムメモリーの合計に qemu-kvm 値が追加されるとトリガーされます。このパラメーターは、KSM_THRES_COEF で定義されたパーセンテージの kbytes と同じです。
/etc/ksmtuned.conf ファイルは、ksmtuned サービスの設定ファイルです。以下のファイル出力は、デフォルトの ksmtuned.conf ファイルです。
# Configuration file for ksmtuned.

# How long ksmtuned should sleep between tuning adjustments
# KSM_MONITOR_INTERVAL=60

# Millisecond sleep between ksm scans for 16Gb server.
# Smaller servers sleep more, bigger sleep less.
# KSM_SLEEP_MSEC=10

# KSM_NPAGES_BOOST is added to the npages value, when free memory is less than thres.
# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY Value given is subtracted to the npages value, when free memory is greater than thres.
# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN is the lower limit for the npages value.
# KSM_NPAGES_MIN=64

# KSM_NAGES_MAX is the upper limit for the npages value.
# KSM_NPAGES_MAX=1250

# KSM_TRES_COEF - is the RAM percentage to be calculated in parameter thres.
# KSM_THRES_COEF=20

# KSM_THRES_CONST - If this is a low memory system, and the thres value is less than KSM_THRES_CONST, then reset thres value to KSM_THRES_CONST value.
# KSM_THRES_CONST=2048

# uncomment the following to enable ksmtuned debug information
# LOGFILE=/var/log/ksmtuned
# DEBUG=1

KSM 変数とモニターリング

KSM は、監視データを /sys/kernel/mm/ksm/ ディレクトリーに保存します。このディレクトリー内のファイルは、カーネルによって更新される、KSM の使用状況と統計の正確な記録です。

以下のリストの変数は、下記のように、/etc/ksmtuned.conf ファイルの設定可能な変数でもあります。

/sys/kernel/mm/ksm/ ファイル

full_scans
フルスキャンが実行されます。
pages_shared
共有されたページの総数。
pages_sharing
現在共有されているページ。
pages_to_scan
スキャンされていないページ。
pages_unshared
共有されなくなったページ。
pages_volatile
揮発性ページの数。
run
KSM プロセスが実行されているかどうか。
sleep_millisecs
スリープのミリ秒。
DEBUG=1 行が /etc/ksmtuned.conf ファイルに追加された場合、KSM チューニングアクティビティーは /var/log/ksmtuned ログファイルに保存されます。ログファイルの場所は、LOGFILE パラメーターを使用して変更することができます。ログファイルの場所を変更することはお勧めできません。SELinux 設定の特別な設定が必要になる場合があります。

KSM の非アクティブ化

KSM にはパフォーマンスのオーバーヘッドがあり、特定の環境またはホストの物理マシンシステムには大きすぎる可能性があります。

KSM は、ksmtuned および ksm サービスを停止することで非アクティブ化できます。サービスを停止すると KSM が非アクティブになりますが、再起動後も持続しません。
# service ksmtuned stop
Stopping ksmtuned:                                         [  OK  ]
# service ksm stop
Stopping ksm:                                              [  OK  ]

chkconfig コマンドを使用して KSM を永続的に非アクティブ化します。サービスを無効にするには、以下のコマンドを実行します。
# chkconfig ksm off
# chkconfig ksmtuned off
重要
KSM であっても、コミットされた RAM にスワップサイズがあれば十分です。KSM は、同一または類似のゲストの RAM 使用量を削減します。十分な swap 領域のない KSM でゲストをオーバーコミットすると可能かもしれませんが、ゲスト仮想マシンのメモリー使用によりページが共有されない可能性があるためです。

第8章 高度なゲスト仮想マシン管理

この章では、ゲスト仮想マシンで利用できるようになるシステムリソースを微調整および制御するための高度な管理ツールについて説明します。

8.1. コントロールグループ (cgroup)

Red Hat Enterprise Linux 6 は、新しいカーネル機能を提供します。control groups は、cgroup と呼ばれることがよくあります。Cgroup を使用すると、CPU 時間、システムメモリー、ネットワーク帯域幅、またはこれらのリソースの組み合わせなどのリソースを、システムで実行されているタスク (プロセス) のユーザー定義グループに割り当てることができます。設定した cgroup を監視したり、特定のリソースへの cgroup のアクセスを拒否したり、実行中のシステムで cgroup を動的に再設定したりすることもできます。
cgroup 機能は libvirt によって完全にサポートされています。デフォルトでは、libvirt は各ゲストをさまざまなコントローラー (メモリー、CPU、blkio、デバイスなど) の個別の制御グループに入れます。
ゲストが開始されると、ゲストはすでに cgroup に含まれています。必要になる可能性がある唯一の設定は、cgroups でのポリシーの設定です。cgroups の詳細は、Red Hat Enterprise Linux リソース管理ガイド を参照してください。

8.2. Huge Page のサポート

本セクションでは、Huge Page のサポートについて説明します。

はじめに

x86 CPU は通常、4kB ページのメモリーに対応しますが、Huge Page と呼ばれる大容量のページを使用できます。KVM ゲストは、Transaction Lookaside Buffer (TLB) に対する CPU キャッシュヒットを増やすことでパフォーマンスを向上させるために、Huge Page メモリーサポートを使用してデプロイできます。特に大容量メモリーとメモリーを大量に消費するワークロードなど、Huge Page によってパフォーマンスが大幅に向上する可能性があります。Red Hat Enterprise Linux 6 は、Huge Page を使用してページサイズを大きくすることにより、大量のメモリーをより効果的に管理できます。

KVM ゲストに巨大なページを使用することにより、ページテーブルに使用されるメモリーが少なくなり、TLB ミスが減少するため、特にメモリーを大量に消費する状況でパフォーマンスが大幅に向上します。

Transparent Huge Pages

Transparent Huge Page (THP) は、アプリケーションに必要な TLB エントリーを減らすカーネル機能です。また、すべての空きメモリーをキャッシュとして使用するようにすることで、パフォーマンスが向上します。

透過的な Huge Page を使用するには、qemu.conf ファイルに特別な設定は必要ありません。/sys/kernel/mm/redhat_transparent_hugepage/enabledalways に設定されている場合、Huge Page はデフォルトで使用されます。
透過的な Huge Page では、hugetlbfs 機能の使用は妨げられません。ただし、hugetlbfs が使用されていない場合、KVM は通常の 4kB ページサイズの代わりに透過的な巨大ページを使用します。
注記
Huge Pages でメモリーパフォーマンスを調整する手順については、Red Hat Enterprise Linux 7 仮想化調整および最適化ガイド を参照してください。

8.3. Hyper-V ハイパーバイザーでのゲスト仮想マシンとしての Red Hat Enterprise Linux の実行

Microsoft Windows Hyper-V ハイパーバイザーを実行する Microsoft Windows ホストの物理マシンで Red Hat Enterprise Linux ゲスト仮想マシンを実行できます。特に、Red Hat Enterprise Linux ゲスト仮想マシンのデプロイおよび管理を容易にするために、以下の機能拡張が追加されました。
  • VMBUS プロトコルのアップグレード - VMBUS プロトコルが Windows 8 レベルにアップグレードされました。この作業の一環として、ゲストで利用可能な全仮想 CPU で VMBUS 割り込みを処理できるようになりました。さらに、Red Hat Enterprise Linux ゲスト仮想マシンと Windows ホストの物理マシン間のシグナルプロトコルが最適化されています。
  • 合成フレームバッファードライバー - Red Hat Enterprise Linux デスクトップユーザー向けのグラフィックパフォーマンスと優れた解決策を提供します。
  • ライブ仮想マシンのバックアップサポート: ライブの Red Hat Enterprise Linux ゲスト仮想マシンの中断のないバックアップサポートをプロビジョニングします。
  • 固定サイズの Linux VHD 動的拡張 - ライブマウントされた固定サイズ Red Hat Enterprise Linux VHD の拡張を可能にします。
詳細については、Windows Server 2012R2Hyper-V での Linux サポートの有効化 を参照してください。
注記
Hyper-V ハイパーバイザーは、ユーザーがディスクの未使用の最後の部分をドロップできるようにすることで、最後のパーティションの後に空き領域がある場合に、Red Hat Enterprise Linux ゲストの GPT パーティションディスクの縮小をサポートします。ただし、この操作はディスク上のセカンダリー GPT ヘッダーをサイレントに削除します。これにより、ゲストがパーティションテーブルを調べるときにエラーメッセージが生成される場合があります (たとえば、parted を使用してパーティションテーブルを印刷する場合)。これは Hyper-V の既知の制限です。回避策として、gdisk のエキスパートメニューと e コマンドを使用して、GPT ディスクを縮小した後にセカンダリー GPT ヘッダーを手動で復元することができます。さらに、Hyper-V マネージャーで展開オプションを使用すると、GPT セカンダリーヘッダーもディスクの端以外の場所に配置されますが、これは parted を使用して移動できます。これらのコマンドの詳細については、gdisk および parted の man ページを参照してください。

8.4. ゲスト仮想マシンのメモリー割り当て

次の手順は、ゲスト仮想マシンにメモリーを割り当てる方法を示しています。この割り当てと割り当ては起動時にのみ機能し、メモリー値への変更は次の再起動まで有効になりません。ゲストごとに割り当てることができる最大メモリーは 4TiB です。ただし、このメモリー割り当てがホストの物理マシンリソースが提供できる量を超えない場合に限ります。
有効なメモリーユニットは以下のとおりです。
  • バイトの場合は b または bytes になります。
  • キロバイトの場合は、KB になります (10 3 または 1,000 バイトのブロック)
  • キビバイトの場合は k または KiB (2 10 または 1024 バイトのブロック)
  • MB メガバイトの場合 (10 6 または 1,000,000 バイトのブロック)
  • メビバイトの場合は M または MiB (220 または 1,048,576 バイトのブロック)
  • GB (ギガバイト) (109 または 1,000,000,000 バイトのブロック)
  • ギビバイトの場合は G または GiB (30 または 1,073,741,824 バイトのブロック)
  • エクサバイトの場合は TB (1012 または 1,000,000,000,000 バイト のブロック)
  • テビバイトの場合は T または TiB (2 40 または 1,099,511,627,776 のブロック)
すべての値は、libvirt により、最も近い kibibyte に丸められます。また、ハイパーバイザーが対応する粒度に丸めることもできます。一部のハイパーバイザーは、4000KiB(4000 x 2 10 または 4,096,000 バイト) などの最小値も適用します。この値の単位は、オプションの属性 memory unit により決定されます。デフォルトは、測定単位としての KiB (キビバイト) になります。この値は、210 または 1024 バイトのブロックで乗算されます。
ゲスト仮想マシンがクラッシュした場合に、オプションの属性dumpCore を使用して、ゲスト仮想マシンのメモリーを、生成されるコアダンプ (dumpCore='on') に含めるか (dumpCore='off') 含まないかを制御できます。デフォルト設定はonしたがって、パラメーターがに設定されていない場合off、ゲスト仮想マシンのメモリーはコアダンプファイルに含まれます。
currentMemory 属性は、ゲスト仮想マシンの実際のメモリー割り当てを決定します。この値は最大割り当てよりも低くなり、ゲスト仮想マシンのメモリーを即座にバルーンアップすることができます。これを省略すると、デフォルトでは memory 要素と同じ値に設定されます。unit 属性の動作は、メモリーと同じです。
このセクションはすべて、以下のようにドメイン XML を変更する必要があります。
<domain>

  <memory unit='KiB' dumpCore='off'>524288</memory>
  <!-- changes the memory unit to KiB and does not allow the guest virtual machine's memory to be included in the generated coredump file -->
  <currentMemory unit='KiB'>524288</currentMemory>
  <!-- makes the current memory unit 524288 KiB -->
  ...
</domain>

8.5. ゲスト仮想マシンの自動起動

本セクションでは、ホストの物理マシンのブートフェーズでゲスト仮想マシンを自動的に起動する方法を説明します。
この例では、virsh を使用してゲスト仮想マシン TestServer を設定して、ホストの物理マシンのブート時に自動的に起動します。
# virsh autostart TestServer
Domain TestServer marked as autostarted
ゲスト仮想マシンがホストの物理マシンで自動的に起動するようになりました。
ゲスト仮想マシンの自動ブートを停止するには、--disable パラメーターを使用します。
# virsh autostart --disable TestServer
Domain TestServer unmarked as autostarted
ゲスト仮想マシンは、ホストの物理マシンで自動的に起動しなくなりました。

8.6. ゲスト仮想マシンの SMART ディスク監視の無効化

SMART ディスクの監視は、仮想ディスクと物理ストレージデバイスがホストの物理マシンにより管理されているため、安全に無効にできます。
# service smartd stop
# chkconfig --del smartd

8.7. VNC サーバーの設定

VNC サーバーを設定するには、System > PreferencesRemote Desktop アプリケーションを使用します。または、vino-preferences コマンドを実行できます。
専用の VNC サーバーセッションを設定するには、以下の手順に従います。
必要に応じて、~/.vnc/xstartup ファイルを作成してから編集し、vncserver が起動するたびに GNOME セッションを開始します。vncserver スクリプトの初回実行時に、VNC セッションに使用するパスワードの入力が求められます。vnc サーバーファイルの詳細は、Red Hat Enterprise Linux インストールガイド を参照してください。

8.8. 新しい一意の MAC アドレスの生成

ゲスト仮想マシン用に新しい、一意の MAC アドレスを生成する必要がある場合があります。書き込み時に新しい MAC アドレスを生成するためのコマンドラインツールはありません。以下のスクリプトは、ゲスト仮想マシンの新規の MAC アドレスを生成することができます。ゲスト仮想マシンの スクリプトを macgen.py として保存します。これで、そのディレクトリーから ./macgen.py を使用してスクリプトを実行でき、新しい MAC アドレスが生成されます。出力の例を以下に示します。
$ ./macgen.py
00:16:3e:20:b0:11
#!/usr/bin/python
# macgen.py script to generate a MAC address for guest virtual machines
#
import random
#
def randomMAC():
	mac = [ 0x00, 0x16, 0x3e,
		random.randint(0x00, 0x7f),
		random.randint(0x00, 0xff),
		random.randint(0x00, 0xff) ]
	return ':'.join(map(lambda x: "%02x" % x, mac))
#
print randomMAC()

8.8.1. ゲスト仮想マシン用に新しい MAC を生成する別の方法

python-virtinst の組み込み モジュールを使用して、ゲスト仮想マシン設定ファイルで使用するための新しい MAC アドレスと UUID を生成することもできます。
# echo  'import virtinst.util ; print\
 virtinst.util.uuidToString(virtinst.util.randomUUID())' | python
# echo  'import virtinst.util ; print virtinst.util.randomMAC()' | python
上記のスクリプトは、以下のようにスクリプトファイルとして実装することもできます。
#!/usr/bin/env python
#  -*- mode: python; -*-
print ""
print "New UUID:"
import virtinst.util ; print virtinst.util.uuidToString(virtinst.util.randomUUID())
print "New MAC:"
import virtinst.util ; print virtinst.util.randomMAC()
print ""

8.9. ゲスト仮想マシンの応答時間の改善

ゲスト仮想マシンは、特定のワークロードや使用パターンで応答する可能性があります。低速または応答しないゲスト仮想マシンを引き起こす可能性のある状況の例:
  • 深刻なオーバーコミットされたメモリー。
  • プロセッサーの使用率が高いオーバーコミットメモリー
  • その他の (qemu-kvm プロセスではない) は、ホストの物理マシンのプロセスがビジー状態または停止している。
KVM ゲスト仮想マシンは Linux プロセスとして機能します。Linux プロセスは、メインメモリー (物理 RAM) に永続的に保持されるわけではなく、特に使用されていない場合はスワップスペース (仮想メモリー) に配置されます。ゲスト仮想マシンが長期間非アクティブである場合、ホストの物理マシンはゲスト仮想マシンを swap に移動する可能性があります。swap は物理メモリーよりも遅くなるため、ゲストが応答していない可能性があります。ゲストがメインメモリーに読み込まれると、この変更が行われます。スワップに使用されるストレージのタイプとコンポーネントのパフォーマンスによっては、ゲスト仮想マシンをスワップからメインメモリーにロードするプロセスに、ゲスト仮想マシンに割り当てられた RAM のギガバイトあたり数秒かかる場合があることに注意してください。
KVM ゲスト仮想マシンプロセスは、メモリーがオーバーコミットされているか、全体的なメモリー使用量に関係なく、スワップに移動される場合があります。
安全でないオーバーコミットレベルを使用したり、スワップをオフにしてゲスト仮想マシンプロセスやその他の重要なプロセスをオーバーコミットしたりすることはお勧めしません。メモリーをオーバーコミットするときは、ホストの物理マシンに十分なスワップスペースがあることを常に確認してください。
KVM でのオーバーコミットの詳細については、6章KVM でのオーバーコミット を参照してください。
警告
仮想メモリーを使用すると、Linux システムはシステム上の物理 RAM よりも多くのメモリーを使用できます。十分に使用されていないプロセスがスワップアウトされるため、アクティブなプロセスがメモリーを使用できるようになり、メモリー使用率が向上します。swap を無効にすると、すべてのプロセスが物理 RAM に保存されるため、メモリー使用率が低下します。
swap がオフになっている場合は、ゲスト仮想マシンをオーバーコミットしないでください。swap を使用せずにゲスト仮想マシンをオーバーコミットすると、ゲスト仮想マシンまたはホストの物理マシンシステムがクラッシュする可能性があります。

8.10. libvirt での仮想マシンタイマー管理

ゲスト仮想マシンでの正確な時間管理は、仮想プラットフォームにおける鍵となる課題です。さまざまなハイパーバイザーが、さまざまな方法で時間管理の問題を処理しようとします。libvirt は、ドメイン XML の <clock> 要素と <timer> 要素を使用して、時間管理のためのハイパーバイザーに依存しない設定設定を提供します。ドメイン XML は、virsh edit コマンドを使用して編集できます。詳しくは、「ゲスト仮想マシンの設定ファイルの編集」 を参照してください。
<clock> 要素は、ゲスト仮想マシンのクロックをホスト物理マシンのクロックと同期させる方法を決定するために使用されます。clock 要素には以下の属性があります。
  • offset は、ゲスト仮想マシンのクロックがホストの物理マシンのクロックからどのようにオフセットされるかを決定します。offset 属性には、以下の値を使用できます。
    表8.1 offset 属性値
    説明
    utcゲスト仮想マシンのクロックは、起動時に UTC に同期されます。
    localtimeゲスト仮想マシンのクロックは、起動時にホストの物理マシンの設定済みタイムゾーンに同期されます (存在する場合)。
    timezoneゲスト仮想マシンのクロックは、timezone 属性で指定された特定のタイムゾーンに同期されます。
    variableゲスト仮想マシンクロックは UTC の任意のオフセットに同期されます。UTC との相対的なデルタは、adjustment 属性を使用して秒単位で指定します。ゲスト仮想マシンは、時間の経過とともにリアルタイムクロック (RTC) を自由に調整でき、次の再起動後にそれが受け入れられることを期待しています。これは、utc モードとは対照的に、リブートごとに RTC の調整が失われます。
    注記
    utc は、デフォルトで仮想マシンのクロックオフセットとして設定されます。ただし、ゲスト仮想マシンのクロックを localtime の値で実行している場合は、ゲスト仮想マシンのクロックをホスト物理マシンのクロックと同期させるため、クロックオフセットを変更して別の値にする必要があります。
  • timezone 属性は、ゲスト仮想マシンクロックに使用されるタイムゾーンを決定します。
  • adjustment 属性は、ゲスト仮想マシンのクロック同期にデルタを提供します。秒単位で、UTC との相対パスになります。

例8.1 常に UTC に同期する

<clock offset="utc" />

例8.2 常にホストの物理マシンのタイムゾーンに同期する

<clock offset="localtime" />

例8.3 任意のタイムゾーンへの同期

<clock offset="timezone" timezone="Europe/Paris" />

例8.4 UTC + 任意のオフセットに同期する

<clock offset="variable" adjustment="123456" />

8.10.1. クロックのタイマー子要素

clock 要素には、ゼロ以上の timer 要素を子として指定できます。timer 要素は、ゲスト仮想マシンのクロック同期に使用されるタイムソースを指定します。timer 要素には以下の属性があります。name のみが必要で、他のすべての属性は任意です。
name 属性は使用する時間ソースの型を決定し、以下のいずれかになります。
表8.2 名前属性値
説明
pitProgrammable Interval Timer - 周期的な割り込みがあるタイマーです。
rtcReal Time Clock - 周期的な割り込みがある継続的に実行するタイマー。
tscTime Stamp Counter: リセットしてからのティック数をカウント、割り込みなし。
kvmclockKVM クロック: KVM ゲスト仮想マシンの推奨されるクロックソース。KVM pvclock または kvm-clock を使用すると、ゲスト仮想マシンがホストの物理マシンのウォールクロックタイムを読み取ることができます。

8.10.2. track

track 属性はタイマーによって追跡されるものを指定します。rtc の名前の値にのみ有効です。
表8.3 属性値を追跡する
説明
boot古い ホストの物理マシン オプションに対応します。これはサポート対象外の追跡オプションです。
guestRTC は常にゲスト仮想マシンの時間を追跡します。
wallRTC は常にホスト時間を追跡します。

8.10.3. tickpolicy

tickpolicy 属性は、ゲスト仮想マシンにティックを渡すために使用されるポリシーを割り当てます。以下の値を使用できます。
表8.4 tickpolicy 属性値
説明
delay通常のレートで配信を継続します (ティックが遅れます)。
catchupキャッチアップするために、より高いレートで配信されます。
mergeティックが 1 つのティックにマージされます。
discard不明なティックはすべて破棄されます。

8.10.4. 頻度、モード、および表示

frequency 属性は固定頻度を設定するために使用されます。Hz で測定されます。この属性は、name 要素に tsc の値がある場合にのみ関連します。他のすべてのタイマーは固定周波数 (pitrtc) で動作します。
mode は、タイムソースがゲスト仮想マシンに公開される方法を決定します。この属性は、tsc の name 値にのみ関係します。その他のタイマーは常にエミュレートされます。コマンドは以下のようになります。<timer name='tsc' frequency='NNN' mode='auto|native|emulate|smpsafe'/>モードの定義は表に記載されます。
表8.5 モード属性値
説明
autoTSC が不安定である場合はネイティブで、ネイティブの TSC アクセスを許可します。
native常にネイティブ TSC アクセスを許可します。
エミュレート常に TSC をエミュレートします。
smpsafe常に TSC およびインロック SMP をエミュレートします。
present は、ゲスト仮想マシンに表示されるデフォルトのタイマーセットを上書きするために使用されます。
表8.6 present 属性値
説明
はいこのタイマーがゲスト仮想マシンに表示されるよう強制します。
いいえこのタイマーをゲスト仮想マシンに表示しないように強制します。

8.10.5. クロック同期の使用例

例8.5 RTC および PIT タイマーとローカルタイムに同期されるクロック

この例では、クロックは RTC および PIT タイマーのローカルタイムに同期されます。
<clock offset="localtime">
	<timer name="rtc" tickpolicy="catchup" track="guest virtual machine" />
	<timer name="pit" tickpolicy="delay" />
	
</clock>
注記
PIT クロックソースは、64 ビットホスト (PIT を使用できない) で実行されている 32 ビットゲストで、次の条件で使用できます。
  • ゲスト仮想マシンには 1 つの CPU のみを指定可能
  • APIC タイマーを無効にする必要があります (noapictimer コマンドラインオプションを使用)
  • ゲストで NoHZ モードを無効にする必要があります (nohz = off コマンドラインオプションを使用)
  • ゲストでは高解像度タイマーモードを無効にする必要があります (highres = off コマンドラインオプションを使用)
  • PIT クロックソースは、高解像度タイマーモードまたは NoHz モードと互換性がありません。

8.11. PMU を使用したゲスト仮想マシンのパフォーマンスの監視

Red Hat Enterprise Linux 6.4 では、テクノロジープレビューとして vPMU(仮想 PMU) が導入されました。vPMU は、Intel の PMU (Performance Monitoring Units) に基づいており、Intel マシンでのみ使用できます。PMU により、ゲスト仮想マシンの動作を示す統計の追跡が可能になります。
パフォーマンス監視を使用すると、開発者はプロファイリングにパフォーマンスツールを使用する一方で、開発者は CPU の PMU カウンターを使用できます。仮想パフォーマンス監視ユニット機能により、仮想マシンユーザーはゲスト仮想マシンで発生する可能性のあるパフォーマンスの問題のソースを特定できるため、KVM ゲスト仮想マシンのプロファイルが改善します。
この機能を有効にするには、-cpu host フラグを設定する必要があります。
この機能は、Red Hat Enterprise Linux 6 を実行しているゲスト仮想マシンでのみサポートされており、デフォルトでは無効になっています。この機能は、Linux perf ツールの使用でのみ機能します。以下のコマンドを使用して、perf パッケージがインストールされていることを確認します。
# yum install perf.
perf コマンドの詳細は、perf の man ページを参照してください。

8.12. ゲスト仮想マシン電源管理

Libvirt のドメイン XML で以下のパラメーターを変更することで、ゲスト仮想マシンのオペレーティングシステムに対して BIOS アドバタイズメントを強制的に有効または無効にできます。
...
  <pm>
    <suspend-to-disk enabled='no'/>
    <suspend-to-mem enabled='yes'/>
  </pm>
  ...
要素 pm S3 (ディスクへのサスペンド) および S4 (メモリーへのサスペンド) ACPI スリープ状態の BIOS サポートを有効 (はい) または無効 (いいえ) にします。何も指定しないと、ハイパーバイザーはデフォルト値のままになります。

第9章 ゲスト仮想マシンデバイスの設定

Red Hat Enterprise Linux 6 は、ゲスト仮想マシンの 3 つのクラスのデバイスに対応します。
  • Emulated devices は、実際のハードウェアを模倣する純粋な仮想デバイスであり、未変更のゲストオペレーティングシステムは標準のインボックスドライバーを使用して動作できるようにします。Red Hat Enterprise Linux 6 は、216 virtio デバイスまで対応します。
  • VirtIO devices は、仮想マシンで最適に動作するように設計された仮想デバイスです。VirtIO デバイスはエミュレートされたデバイスと似ていますが、Linux 以外の仮想マシンには、デフォルトで必要となるドライバーは含まれません。Virtual Machine Manager (virt-manager) や Red Hat Virtualization Hypervisor などの仮想化管理ソフトウェアは、サポートされている Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 6 は、最大 700 の scsi ディスクに対応します。
  • 割り当てられたデバイス は、仮想マシンに公開される物理デバイスです。このメソッドは passthrough としても知られています。デバイスの割り当てにより、仮想マシンはさまざまなタスクで PCI デバイスに排他的にアクセスできるようになり、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように見え、動作します。Red Hat Enterprise Linux 6 は、仮想マシンごとに割り当てられたデバイスを最大 32 個までサポートします。
デバイスの割り当ては、グラフィックデバイスの選択など、PCIe デバイスでサポートされます。Red Hat Enterprise Linux 6 のデバイスの割り当てで、NVIDIA K シリーズ Quadro、GRID、および Tesla グラフィックカード GPU 機能がサポートされるようになりました。パラレル PCI デバイスは、割り当てられたデバイスとしてサポートされる場合がありますが、セキュリティーとシステム設定の競合のために厳しい制限があります。
注記
仮想マシンに接続できるデバイスの数は、いくつかの要因によって異なります。1 つの要因は、QEMU プロセスによって開かれるファイルの数です (/etc/security/limits.conf で設定され、/etc/libvirt/qemu.conf でオーバーライドできます)。他の制限要因には、仮想バスで利用可能なスロット数や、sysctl で設定されたオープンファイルのシステム全体の制限が含まれます。
特定のデバイスの詳細と制限に関する情報は、「Devices」 を参照してください。
Red Hat Enterprise Linux 6 は、仮想マシンに単一の機能スロットとして公開されるデバイスの PCI ホットプラグをサポートします。これを可能にするために、単一機能のホストデバイスや、多機能のホストデバイスの個別の機能を設定できます。デバイスを多機能 PCI スロットとして仮想マシンに公開する設定は、ホットプラグ以外のアプリケーションにのみ推奨されます。
注記
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼できる環境では、管理者は allow_unsafe_interrupts vfio_iommu_type1 モジュールへのオプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。これは、以下を含む /etc/modprobe.d に .conf ファイル (local.conf など) を追加することで、永続的に実行できます。
options vfio_iommu_type1 allow_unsafe_interrupts=1
または sysfs エントリーを使用して動的に同じことを行います。
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

9.1. PCI デバイス

PCI デバイスの割り当ては、Intel VT-d または AMD IOMMU のいずれかに対応するハードウェアプラットフォームでのみ利用できます。PCI デバイスの割り当てを機能させるには、この Intel VT-d または AMD IOMMU の仕様が BIOS で有効になっている必要があります。

手順9.1 PCI デバイス割り当てのための Intel システムの準備

  1. Intel VT-d 仕様を有効にする

    Intel VT-d 仕様では、物理デバイスを仮想マシンに直接割り当てるハードウェアサポートが提供されます。この仕様は、Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するために必要です。
    Intel VT-d 仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。これらの仕様を表示するのに使用される用語はメーカーにより異なります。適切な用語は、システムの製造元のドキュメントを参照してください。
  2. カーネルで Intel VT-d をアクティブにします。

    /etc/sysconfig/grub ファイル内の GRUB_CMDLINX_LINUX 行の末尾に、引用符で囲んで intel_iommu=on パラメーターおよび iommu=pt パラメーターを追加して、カーネル内で Intel VT-d をアクティブにします。
    以下は、Intel VT-d を有効にした修正grubです。
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/
    rhcrashkernel-param || :) rhgb quiet intel_iommu=on"
  3. 設定ファイルの再生成

    以下を実行して /etc/grub2.cfg を再生成します。
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  4. 使用準備完了

    システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。

手順9.2 PCI デバイス割り当て用の AMD システムの準備

  1. AMD IOMMU 仕様を有効にする

    Red Hat Enterprise Linux で PCI デバイスの割り当てを使用するには、AMD IOMMU の仕様が必要です。この仕様は、BIOS で有効にする必要があります。システムの製造元によっては、この仕様をデフォルトで無効にしている場合があります。
  2. IOMMU カーネルサポートの有効化

    システムの起動時に AMD IOMMU 仕様が有効になるように、/etc/sysconfig/grub の GRUB_CMDLINX_LINUX 行の末尾に引用符で囲って amd_iommu=on を追加します。
  3. 設定ファイルの再生成

    以下を実行して /etc/grub2.cfg を再生成します。
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルが/etc/grub2-efi.cfg であることに注意してください。
  4. 使用準備完了

    システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。

9.1.1. virsh を使用した PCI デバイスの割り当て

この手順では、KVM ハイパーバイザーの仮想マシンに PCI デバイスを割り当てる方法を説明します。
この例では、PCI 識別子コード、pci_0000_01_00_0、および完全に仮想化されたゲストマシン guest1-rhel6-64 を持つ PCIe ネットワークコントローラーを使用します。

手順9.3 virsh を使用した PCI デバイスのゲスト仮想マシンへの割り当て

  1. デバイスの識別

    まず、仮想マシンへのデバイス割り当てに指定されている PCI デバイスを特定します。使用可能な PCI デバイスの一覧を表示する場合は、lspci コマンドを実行します。grep を使用して、lspci の出力を絞り込むことができます。
    この例では、以下の出力で強調表示されているイーサネットコントローラーを使用します。
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    このイーサネットコントローラーは、短い識別子 00:19.0 で表示されます。この PCI デバイスを仮想マシンに割り当てるには、virsh が使用する完全な ID を確認する必要があります。
    これを行うには、virsh nodedev-list コマンドを使用して、ホストマシンに接続されている特定タイプ (pci) のデバイスをすべて一覧表示します。次に、使用するデバイスの短い識別子にマップする文字列の出力を調べます。
    この例では、短い識別子 00:19.0 を使用して、イーサネットコントローラーにマップする文字列を示しています。この例では、:. が、完全な識別子では、文字はアンダースコアに置き換えられます。
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    使用するデバイスにマップする PCI デバイス番号を記録します。これは別の手順で必要になります。
  2. デバイス情報の確認

    ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。
    virsh nodedev-dumpxml pci_0000_00_19_0
    <device>
      <name>pci_0000_00_19_0</name>
      <parent>computer</parent>
      <driver>
        <name>e1000e</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>0</bus>
        <slot>25</slot>
        <function>0</function>
        <product id='0x1502'>82579LM Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    注記
    IOMMU グループは、IOMMU からの視認性とデバイスの分離に基づいて決定されます。各 IOMMU グループには、1 つ以上のデバイスを含めることができます。複数のデバイスが存在する場合は、グループ内のすべてのデバイスがゲストに割り当てられるため、IOMMU グループ内のすべてのエンドポイントが要求されます。これは、追加のエンドポイントをゲストに割り当てるか、virsh nodedev-detach を使用してホストドライバーから外すことで実行できます。1 つのグループに含まれるデバイスが複数のゲストに分割されたり、ホストとゲストが分割されたりすることはありません。PCIe root ポート、スイッチポート、ブリッジなどのエンドポイント以外のデバイスは、ホストドライバーから分離しないでください。また、エンドポイントの割り当てに影響を及ぼしません。
    IOMMU グループ内のデバイスは、virsh nodedev-dumpxml 出力の IOMMU グループセクションを使用して決定できます。グループの各メンバーは、別のアドレスフィールドで提供されます。この情報は、sysfs で以下を使用して取得することもできます。
    $ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
    この出力の例を以下に示します。
    0000:01:00.0  0000:01:00.1
    ゲストに 0000.01.00.0 のみを割り当てるには、ゲストを起動する前に、使用されていないエンドポイントをホストから分離する必要があります。
    $ virsh nodedev-detach pci_0000_01_00_1
  3. 必要な設定の詳細を決定する

    設定ファイルに必要な値は、virsh nodedev-dumpxml pci_0000_00_19_0 コマンドの出力を参照してください。
    この例のデバイスは、bus = 0、slot = 25、および function = 0 の値を持ちます。10 進数の設定では、この 3 つの値が使用されます。
    bus='0'
    slot='25'
    function='0'
  4. 設定の詳細の追加

    virsh edit を実行し、仮想マシン名を指定し、<source> セクションにデバイスエントリーを追加して、PCI デバイスをゲスト仮想マシンに割り当てます。
    # virsh edit guest1-rhel6-64
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
         <address domain='0' bus='0' slot='25' function='0'/>
      </source>
    </hostdev>
    または、virsh attach-device を実行して、仮想マシンの名前とゲストの XML ファイルを指定します。
    virsh attach-device guest1-rhel6-64 file.xml
  5. 仮想マシンの起動

    # virsh start guest1-rhel6-64
これにより、PCI デバイスが仮想マシンに正常に割り当てられ、ゲストオペレーティングシステムにアクセスできるようになります。

9.1.2. virt-manager を使用した PCI デバイスの割り当て

PCI デバイスは、グラフィカルvirt-managerツールを使用してゲスト仮想マシンに追加できます。次の手順では、ギガビットイーサネットコントローラーをゲスト仮想マシンに追加します。

手順9.4 virt-manager を使用した PCI デバイスのゲスト仮想マシンへの割り当て

  1. ハードウェア設定を開く

    ゲスト仮想マシンを開き、Add Hardware をクリックして、仮想マシンに新しいデバイスを追加します。

    図9.1 仮想マシンのハードウェア情報ウィンドウ

    The virtual machine hardware window with the Information button selected on the top taskbar and Overview selected on the left menu pane.
  2. PCI デバイスの選択

    左側の Hardware 一覧から PCI Host Device を選択します。
    未使用の PCI デバイスを選択します。別のゲストが使用している PCI デバイスを選択すると、エラーが発生する可能性があります。この例では、予備の 82576 ネットワークデバイスが使用されています。Finish を選択して設定を完了します。

    図9.2 Add new virtual hardware ウィザード

    The Add new virtual hardware wizard with PCI Host Device selected on the left menu pane, showing a list of host devices for selection in the right menu pane.
  3. 新しいデバイスの追加

    セットアップが完了し、ゲスト仮想マシンが PCI デバイスに直接アクセスできるようになりました。

    図9.3 仮想マシンのハードウェア情報ウィンドウ

    The virtual machine hardware window with the Information button selected on the top taskbar and Overview selected on the left menu pane, displaying the newly added PCI Device in the list of virtual machine devices in the left menu pane.
注記
デバイスの割り当てに失敗すると、同じ IOMMU グループに、ホストに依然として接続されているその他のエンドポイントが存在する可能性があります。virt-manager を使用してグループ情報を取得する方法はありませんが、virsh コマンドを使用すると、IOMMU グループの境界を分析したり、必要に応じてデバイスを隔離したりできます。
IOMMU グループの詳細と、virsh を使用してエンドポイントデバイスの割り当てを解除する方法は、「virsh を使用した PCI デバイスの割り当て」注記 を参照してください。

9.1.3. virt-install を使用した PCI デバイスの割り当て

virt-install を使用して PCI デバイスを割り当てるには、--host-device パラメーターを使用します。

手順9.5 virt-install を使用した、仮想マシンへの PCI デバイスの割り当て

  1. デバイスの識別

    ゲスト仮想マシンにデバイス割り当てに指定されている PCI デバイスを特定します。
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    virsh nodedev-list コマンドは、システムに接続されているすべてのデバイスの一覧を表示し、各 PCI デバイスを文字列で識別します。出力を PCI デバイスのみに制限するには、次のコマンドを実行します。
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    PCI デバイス番号を記録します。この番号は他の手順で確認する必要があります。
    ドメイン、バス、および機能の情報は、virsh nodedev-dumpxml コマンドの出力から取得できます。
    # virsh nodedev-dumpxml pci_0000_01_00_0
    <device>
      <name>pci_0000_01_00_0</name>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    注記
    IOMMU グループに複数のエンドポイントがあり、そのすべてがゲストに割り当てられていない場合は、ゲストを起動する前に次のコマンドを実行して、ホストからその他のエンドポイントの割り当てを手動で解除する必要があります。
    $ virsh nodedev-detach pci_0000_00_19_1
    IOMMU グループの詳細は、「virsh を使用した PCI デバイスの割り当て」注記 を参照してください。
  2. デバイスの追加

    virshnodedev コマンドから出力された PCI 識別子を --host-device パラメーターの値として使用します。
    virt-install \
    --name=guest1-rhel6-64 \
    --disk path=/var/lib/libvirt/images/guest1-rhel6-64.img,size=8 \
    --nonsparse --graphics spice \
    --vcpus=2 --ram=2048 \
    --location=http://example1.com/installation_tree/RHEL6.0-Server-x86_64/os \
    --nonetworks \
    --os-type=linux \
    --os-variant=rhel6
    --host-device=pci_0000_01_00_0
  3. インストールを完了する

    ゲストのインストールを完了します。PCI デバイスはゲストに接続する必要があります。

9.1.4. 割り当てられた PCI デバイスの取り外し

ホストの PCI デバイスがゲストマシンに割り当てられると、ホストがそのデバイスを使用できなくなります。このセクションを読んで、virsh または virt-manager を使用してデバイスをゲストからデタッチし、ホストで使用できるようにする方法を学習してください。

手順9.6 virsh を使用したゲストからの PCI デバイスの切り離し

  1. デバイスの取り外し

    次のコマンドを使用して、ゲストの XML ファイルから PCI デバイスを削除し、ゲストから PCI デバイスを切り離します。
    # virsh detach-device name_of_guest file.xml
  2. デバイスをホストに再接続します (オプション)。

    デバイスが managed モードにある場合は、この手順を省略します。デバイスは自動的にホストに戻ります。
    デバイスが managed モードを使用していない場合は、以下のコマンドを使用して PCI デバイスをホストマシンに再接続します。
    # virsh nodedev-reattach device
    たとえば、pci_0000_01_00_0 デバイスーをホストコンピューターに再接続するには、次のコマンドを実行します。
    virsh nodedev-reattach pci_0000_01_00_0
    これで、デバイスがホストで使用できるようになります。

手順9.7 virt-manager を使用したゲストからの PCI デバイスの切り離し

  1. 仮想ハードウェアの詳細画面を開きます。

    virt-manager で、デバイスを含む仮想マシンをダブルクリックします。Show virtual hardware details ボタンを選択すると、仮想ハードウェアの一覧が表示されます。

    図9.4 仮想ハードウェアの詳細ボタン

    The Show virtual hardware details button.
  2. デバイスを選択して削除する

    左側のパネルにある仮想デバイスの一覧から、取り外す PCI デバイスを選択します。

    図9.5 取り外す PCI デバイスの選択

    The PCI device details and the Remove button.
    Remove ボタンをクリックして確定します。これで、デバイスがホストで使用できるようになります。

9.1.5. PCI ブリッジの作成

PCI (Peripheral Component Interconnect) ブリッジは、ネットワークカード、モデム、サウンドカードなどのデバイスに接続するために使用されます。物理デバイスと同様に、仮想デバイスも PCI ブリッジに接続できます。以前は、31 個の PCI デバイスしかゲスト仮想マシンに追加できませんでした。現在、31 番目の PCI デバイスを追加すると、PCI ブリッジが 31 番目のスロットに自動的に配置され、追加した PCI デバイスを PCI ブリッジに移動します。各 PCI ブリッジには、31 の追加デバイス用に 31 個のスロットがあり、すべてがブリッジになることができます。この方法では、ゲスト仮想マシンで 900 を超えるデバイスを使用できます。
注記
ゲスト仮想マシンの実行中は、このアクションを実行できません。シャットダウンするゲスト仮想マシンに PCI デバイスを追加する必要があります。

9.1.6. PCI パススルー

<source> 要素で指定される PCI ネットワークデバイスは、ジェネリックデバイスパススルーを使用してゲストに直接割り当てられます。このデバイスの MAC アドレスは、最初にオプションで設定された値に設定され、そのデバイスの MAC アドレスがオプションで指定された virtualport 要素を使用して 802.1Qbh 対応スイッチに関連付けられます (<type='direct'> ネットワークデバイスの場合は、上記の仮想ポートの例を参照してください)。標準的なシングルポートの PCI イーサネットカードドライバー設計の制限により、この方法で割り当てることができるのは Single Root I/O Virtualization (SR-IOV) virtual function (VF) デバイスのみとなります。標準的なシングルポートの PCI または PCIe イーサネットカードをゲストに割り当てる場合は、従来の <hostdev> デバイス定義を使用します。
従来の/レガシー KVM デバイス割り当てではなく VFIO デバイス割り当てを使用するために (VFIO は UEFI セキュアブートと互換性のあるデバイス割り当ての新しい方法です)、<type='hostdev'> インターフェイスは name 属性を持つオプションのドライバーサブ要素を持つことができます vfio に設定します。従来の KVM デバイス割り当てを使用するには、名前を kvm に設定できます (または、現在、<driver ='kvm'> がデフォルトであるため、単に <driver> 要素を省略します)。
注記
ネットワークデバイスにおけるインテリジェントパススルーは、標準の <hostdev> デバイスの機能と非常に似ています。相違点は、パススルーデバイスに MAC アドレスと<virtualport>を指定できることです。これらの機能が必要ない場合、SR-IOV をサポートしない標準のシングルポート PCI、PCIe、または USB ネットワークカードを使用している場合 (したがって、ゲストドメインに割り当てられた後、リセット中に設定された MAC アドレスが失われます)、または 0.9.11 より前のバージョンの libvirt を使用している場合は、<interface type='hostdev'/> の代わりに、標準の <hostdev> を使用してデバイスをゲストに割り当てる必要があります。

図9.6 PCI デバイスの割り当ての XML 例


     <devices>
    <interface type='hostdev'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>

9.1.7. SR-IOV デバイスを使用した PCI 割り当て (パススルー) の設定

このセクションは、SR-IOV デバイスのみを対象としています。SR-IOV ネットワークカードは、複数の Virtual Functions を提供します。各 VF は、PCI デバイスの割り当てを使用してゲスト仮想マシンに個別に割り当てることができます。割り当てが完了すると、各デバイスは完全な物理ネットワークデバイスとして機能します。これにより、多くのゲスト仮想マシンは、ホスト物理マシン上の単一のスロットのみを使用しながら、直接 PCI デバイス割り当てのパフォーマンス上の利点を得ることができます。
これらの VF は従来の方法でゲスト仮想マシンに <hostdev> 要素を使用して割り当てることができますが、SR-IOV VF ネットワークデバイスには永続的な一意の MAC アドレスがないため、ホストの物理マシンを再起動するたびにゲスト仮想マシンのネットワーク設定を再設定する必要があります。これを解決するには、VF をホスト物理マシンに割り当てる前に MAC アドレスを設定する必要があり、ゲスト仮想マシンが起動するたびにこれを設定する必要があります。この MAC アドレスやその他のオプションを割り当てるには、手順9.8「SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定」の手順を参照してください。

手順9.8 SR-IOV で PCI デバイスを割り当てる MAC アドレス、vLAN、および仮想ポートの設定

<mac><vlan>、および <virtualport> 要素は <hostdev> の有効な子ではないため、<hostdev> 要素は MAC アドレス割り当て、vLAN タグ ID 割り当て、仮想ポート割り当てなどの機能固有の項目には使用できないことに注意してください。これらは <インターフェイス> で有効であるため、新しいインターフェイスタイプのサポートが追加されました (<interface type='hostdev'>)。この新しいインターフェイスデバイスタイプは、<インターフェイス><hostdev> のハイブリッドとして動作します。そのため、libvirt は、ゲスト仮想マシンに PCI デバイスを割り当てる前に、ゲスト仮想マシンの XML 設定ファイルに示されているネットワーク固有のハードウェア/スイッチを初期化します (MAC アドレスの設定、vLAN タグの設定、802.1Qbh スイッチへの関連付けなど)。vLAN タグの設定に関する詳細は、「vLAN タグの設定」 を参照してください。
  1. ゲスト仮想マシンをシャットダウンします。

    virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。
    # virsh shutdown guestVM
  2. 情報の収集

    <interface type='hostdev'> を使用するには、SR-IOV 対応のネットワークカード、Intel VT-d 拡張機能または AMD IOMMU 拡張機能に対応するホストの物理マシンハードウェアが必要で、割り当てる VF の PCI アドレスを把握している必要があります。
  3. 編集する XML ファイルを開く

    # virsh save-image-edit コマンドを実行し、XML ファイルを編集用に開きます (詳細は 「ドメイン XML 設定ファイルの編集」 を参照してください)。ゲスト仮想マシンを以前の実行状態に復元する必要があるため、この場合は --running が使用されます。この例の設定ファイルの名前は guestVM.xml です。ゲスト仮想マシンの名前は guestVM です。
     # virsh save-image-edit guestVM.xml --running 
    guestVM.xmlがデフォルトのエディターで開きます。
  4. XML ファイルの編集

    設定ファイル (guestVM.xml) を更新して、以下のような<devices> エントリーが表示されるようにします。

    図9.7 hostdev インターフェイスタイプのサンプルドメイン XML

    
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well-->
         </source>
         <mac address='52:54:00:6d:90:02'/>                                         <!--sets the mac address-->
         <virtualport type='802.1Qbh'>                                              <!--sets the virtual port for the 802.1Qbh switch-->
           <parameters profileid='finance'/>
         </virtualport>
         <vlan>                                                                     <!--sets the vlan tag-->
          <tag id='42'/>
         </vlan>
       </interface>
       ...
     </devices>
    
    
    MAC アドレスを指定しないと、その他のタイプのインターフェイスデバイスと同様に、MAC アドレスが自動的に生成されることに注意してください。また、<virtualport> 要素は、802.11Qgh ハードウェアスイッチ(802.11Qbg)に接続する場合にのみ使用されます。"VEPA")スイッチは現在サポートされていません。
  5. ゲスト仮想マシンの再起動

    virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。
     # virsh start guestVM 
    ゲスト仮想マシンは起動時に、設定された MAC アドレスを持つ、物理ホストマシンのアダプターにより提供されたネットワークデバイスを認識します。この MAC アドレスは、ゲスト仮想マシンやホストの物理マシンを再起動しても変更されません。

9.1.8. SR-IOV 仮想機能のプールからの PCI デバイス割り当ての設定

特定の Virtual Functions (VF) の PCI アドレスをゲストの設定にハードコーディングすることには、2 つの重大な制限があります。
  • 指定の VF は、ゲスト仮想マシンが起動したときにいつでも利用できる必要があります。つまり、管理者は、各 VF を 1 つのゲスト仮想マシンに永続的に割り当てる必要があります (または、各ゲスト仮想マシンの設定ファイルを変更して、ゲスト仮想マシンが起動するたびに現在使用されていない VF の PCI アドレスを指定します)。
  • ゲスト仮想マシンを別のホスト物理マシンに移動する場合は、そのホスト物理マシンのハードウェアが PCI バス上の同じ場所にある必要があります (または、ゲスト仮想マシンの設定を起動前に変更する必要があります)。
SR-IOV デバイスのすべての VF を含むデバイスプールで libvirt ネットワークを作成することで、この両方の問題を回避できます。完了したら、ゲスト仮想マシンがこのネットワークを参照するように設定します。ゲストを起動するたびに、プールから 1 つの VF が割り当てられ、ゲスト仮想マシンに割り当てられます。ゲスト仮想マシンが停止すると、VF は別のゲスト仮想マシンが使用するためにプールに戻されます。

手順9.9 デバイスプールの作成

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

    virsh shutdown コマンドの使用 (「ゲスト仮想マシンのシャットダウン、再起動、および強制シャットダウン」 を参照)、guestVM という名前のゲスト仮想マシンをシャットダウンします。
    # virsh shutdown guestVM
  2. 設定ファイルの作成

    任意のエディターを使用して、/tmp ディレクトリーに XML ファイル (名前は passthrough.xml など) を作成します。pf dev='eth3' を、ご使用の SR-IOV デバイスの PF の netdev 名に置き換えてください。
    以下は、ホスト物理マシンの "eth3' にある physical function (PF) を持つ SR-IOV アダプターのすべての VF のプールを使用できるようにするネットワーク定義の例です。

    図9.8 サンプルのネットワーク定義ドメイン XML

          
    <network>
       <name>passthrough</name>                                                <!--This is the name of the file you created-->
       <forward mode='hostdev' managed='yes'>
         <pf dev='myNetDevName'/>                                              <!--Use the netdev name of your SR-IOV devices PF here-->
       </forward>
    </network>
          
    
    
  3. 新しい XML ファイルの読み込み

    /tmp/passthrough.xml を、前の手順で作成した XML ファイルの名前と場所に置き換え、次のコマンドを実行します。
    # virsh net-define /tmp/passthrough.xml
  4. ゲストの再起動

    以下の passthrough.xml を、前の手順で作成した XML ファイルの名前に置き換えます。
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. ゲスト仮想マシンの再起動

    virsh start コマンドを実行して、最初の手順でシャットダウンしたゲスト仮想マシンを再起動します (例では、ゲスト仮想マシンのドメイン名として guestVM を使用します)。詳細は、「定義済みドメインの開始」 を参照してください。
     # virsh start guestVM 
  6. デバイスのパススルーの開始

    表示されているデバイスは 1 つだけですが、libvirt は、ゲスト仮想マシンが次のようなドメイン XML のインターフェイス定義で初めて起動されたときに、その PF に関連付けられているすべての VF のリストを自動的に取得します。

    図9.9 インターフェイスネットワーク定義のサンプルドメイン XML

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 検証

    ネットワークを使用する最初のゲストを起動したら、virsh net-dumpxml passthrough コマンドを実行し、これを確認できます。以下のような出力が得られます。

    図9.10 XML ダンプファイルのpassthroughコンテンツ

          
    <network connections='1'>
       <name>passthrough</name>
       <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid>
       <forward mode='hostdev' managed='yes'>
         <pf dev='eth3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
       </forward>
    </network>
          
    
    

9.2. USB デバイス

本セクションでは、USB デバイスを扱うために必要なコマンドについて説明します。

9.2.1. ゲスト仮想マシンへの USB デバイスの割り当て

Web comeras、カードリーダー、キーボード、マウスなどのほとんどのデバイスは、USB ポートとケーブルを使用してコンピューターに接続されます。このようなデバイスをゲスト仮想マシンに渡すには、以下の 2 つの方法があります。
  • USB パススルーを使用する - これにより、デバイスが、ゲスト仮想マシンをホストしているホストの物理マシンに物理的に接続されます。この場合は SPICE は必要ありません。ホストの USB デバイスは、コマンドラインまたは virt-manager を使用してゲストに渡すことができます。virt manager の方向については、「ゲスト仮想マシンへの USB デバイスの接続」 を参照してください。
    注記
    virt-manager は、ホットプラグまたはホットアンプラグデバイスに使用しないでください。USB デバイスをホットプラグまたはホットアンプラグする場合は、手順14.1「ゲスト仮想マシンが使用するホットプラグ USB デバイス」 を参照してください。
  • USB リダイレクトの使用 - USB リダイレクトは、データセンターで実行されているホスト物理マシンがある場合に最適です。ユーザーは、ローカルマシンまたはシンクライアントからゲスト仮想マシンに接続します。このローカルマシンには SPICE クライアントがあります。ユーザーは、任意の USB デバイスをシンクライアントに接続できます。SPICE クライアントは、デバイスをデータセンターのホスト物理マシンにリダイレクトするため、シンクライアントで実行しているゲスト仮想マシンで使用できます。virt-manager を使用した USB リダイレクトの手順については、「ゲスト仮想マシンへの USB デバイスの接続」 を参照してください。TCP プロトコルを使用した USB リダイレクトはできないことに注意してください (BZ#1085318 を参照)。

9.2.2. USB デバイスリダイレクトの制限の設定

リダイレクトから特定のデバイスをフィルターリングするには、フィルタープロパティーを -device usb-redir に渡します。filter プロパティーは、フィルタールールで設定される文字列を取ります。ルールの形式は以下のとおりです。
<class>:<vendor>:<product>:<version>:<allow>
-1 の値を使用して、特定のフィールドに任意の値を受け入れるように指定します。同じコマンドラインで、| を区切り文字として使用し、複数のルールを使用できます。
重要
デバイスがどのルールフィルターにも一致しない場合、そのデバイスのリダイレクトは許可されません。

例9.1 Windows ゲスト仮想マシンを使用したリダイレクトを制限する例

  1. Windows 7 ゲスト仮想マシンを準備します。
  2. 以下のコード抜粋をゲスト仮想マシンのドメイン xml ファイルに追加します。
        <redirdev bus='usb' type='spicevmc'>
          <alias name='redir0'/>
          <address type='usb' bus='0' port='3'/>
        </redirdev>
        <redirfilter>
          <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/>
          <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/>
        </redirfilter>
    
  3. ゲスト仮想マシンを起動し、次のコマンドを実行して設定の変更を確認します。
    #ps -ef | grep $guest_name
    -device usb-redir,chardev=charredir0,id=redir0,/
    filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
  4. USB デバイスをホストの物理マシンに接続し、virt-manager を使用してゲスト仮想マシンに接続します。
  5. メニューで Redirect USB Service をクリックすると、Some USB devices are blocked by host policy というメッセージが表示されます。OK をクリックして確定し、続行します。
    フィルターが有効になります。
  6. フィルターが正しくキャプチャーされていることを確認するには、USB デバイスのベンダーと製品を確認してから、USB リダイレクトを可能にするために、テストの仮想マシンのドメイン XML で次の変更を行います。
       <redirfilter>
          <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/>
          <usbdev allow='no'/>
        </redirfilter>
    
  7. ゲスト仮想マシンを再起動してから、virt-viewer を使用してゲスト仮想マシンに接続します。これで、USB デバイスはトラフィックをゲスト仮想マシンにリダイレクトするようになります。

9.3. デバイスコントローラーの設定

ゲスト仮想マシンのアーキテクチャーによっては、一部のデバイスバスは複数回表示され、仮想デバイスのグループは仮想コントローラーに関連付けられています。通常、libvirt は、明示的な XML マークアップを必要とせずに、自動的にこのようなコントローラーを推測できますが、場合によっては仮想コントローラー要素を明示的に設定する方が良い場合があります。

図9.11 仮想コントローラーのドメイン XML の例


  ...
  <devices>
    <controller type='ide' index='0'/>
    <controller type='virtio-serial' index='0' ports='16' vectors='4'/>
    <controller type='virtio-serial' index='1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </controller>
    ...
  </devices>
  ...
各コントローラーには必須の属性 <controller type> があり、これは次のいずれかになります。
  • ide
  • fdc
  • scsi
  • sata
  • usb
  • ccid
  • virtio-serial
  • pci
<controller> 要素には必須の属性 <controller index> があります。これは、バスコントローラーが発生した順序を表す 10 進数の整数です (<address> 要素のコントローラー属性で使用されます)。<controller type ='virtio-serial'> には、追加のオプション属性 (ports および vectors) が 2 つあります。これは、コントローラーを介して接続できるデバイスの数を制御します。Red Hat Enterprise Linux 6 は、デバイスあたり 32 を超えるベクターの使用をサポートしていないことに注意してください。よりベクトルを使用すると、ゲスト仮想マシンの移行でエラーが発生します。
<controller type ='scsi'> の場合、以下の値を持つことができる任意の属性model モデルがあります。
  • auto
  • buslogic
  • ibmvscsi
  • lsilogic
  • lsisas1068
  • lsisas1078
  • virtio-scsi
  • vmpvscsi
<controller type ='usb'> の場合、以下の値を持つことができる任意の属性model モデルがあります。
  • piix3-uhci
  • piix4-uhci
  • ehci
  • ich9-ehci1
  • ich9-uhci1
  • ich9-uhci2
  • ich9-uhci3
  • vt82c686b-uhci
  • pci-ohci
  • nec-xhci
注記
ゲスト仮想マシンに対して USB バスを明示的に無効にする必要がある場合は、<model='none'> を使用できます。 .
コントローラー自体が PCI バスまたは USB バスにある場合は、オプションのサブ要素 <address> は、「デバイスのアドレスの設定」 に示したセマンティクスを使用して、コントローラーとマスターバスの正確な関係を指定できます。
オプションの sub-element <driver> は、ドライバー固有のオプションを指定できます。現在、コントローラーのキューの数を指定する属性キューのみをサポートしています。パフォーマンスを最適化するには、vCPU の数に一致する値を指定することが推奨されます。
USB コンパニオンコントローラーには、コンパニオンとマスターコントローラーの完全なリレーションを指定するためのオプションのサブ要素 <master> があります。コンパニオンコントローラーはマスターと同じバスにあるため、コンパニオン index は等しい値になります。
使用できる XML の例を以下に示します。

図9.12 USB コントローラーのドメイン XML の例

   
     ...
  <devices>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0' bus='0' slot='4' function='7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
    </controller>
    ...
  </devices>
  ...
   

PCI コントローラーには、以下の値を持つオプションの model 属性があります。
  • pci-root
  • pcie-root
  • pci-bridge
  • dmi-to-pci-bridge
ルートコントローラー (pci-root および pcie-root) には、64 ビット PCI ホールの大きさ (キロバイト単位、または pcihole64unit 属性で指定された単位) を指定するオプションの pcihole64 要素があります。一部のゲスト仮想マシン (Windows Server 2003) は、unit が無効になっていない限り (0 unit='0' に設定)、クラッシュを引き起こす可能性があります。
暗黙的な PCI バスを提供するマシンタイプの場合、index='0' を使用する pci-root コントローラーは自動追加され、PCI デバイスを使用する必要があります。pci-root にはアドレスがありません。PCI ブリッジは、model='pci-root' が提供する 1 つのバスに収まらないデバイスが多すぎる場合、または 0 を超える PCI バス番号が指定されている場合に自動追加されます。PCI ブリッジは手動で指定することもできますが、そのアドレスには、指定されている PCI コントローラーが提供する PCI バスのみが表示されるようにしてください。PCI コントローラーインデックスにギャップがあると、設定が無効になる場合があります。以下の XML サンプルは、<devices> セクションに追加できます。

図9.13 PCI ブリッジのドメイン XML の例


  ...
  <devices>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='pci' index='1' model='pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='off'/>
    </controller>
  </devices>
  ...
暗黙的な PCI Express (PCIe) バスを提供するマシンタイプ (Q35 チップセットに基づくマシンタイプなど) の場合、index='0' を使用する pcie-root コントローラーはドメインの設定に自動的に追加されます。pcie-root にはアドレスはありませんが、31 スロット (1-31 の番号) を提供し、PCIe デバイスの接続にのみ使用できます。pcie-root コントローラーを持つシステムで標準的な PCI デバイスを接続するには、model='dmi-to-pci-bridge' を持つ pci コントローラーが自動的に追加されます。dmi-to-pci-bridge コントローラーは、(pcie-root が提供するように) PCIe スロットに接続し、それ自体で 31 個の標準的な PCI スロットを提供します (これはホットプラグできません)。ゲストシステムにホットプラグ可能な PCI スロットを確保するために、pci-bridge コントローラーも自動的に作成され、自動作成された dmi-to-pci-bridge コントローラーのスロットの 1 つに接続されます。PCI アドレスが libvirt により自動決定されるすべてのゲストデバイスは、この pci-bridge デバイスに配置されます。

図9.14 PCIe (PCI express) のようなドメイン XML

   
     ...
  <devices>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='dmi-to-pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='0xe' function='0'/>
    </controller>
    <controller type='pci' index='2' model='pci-bridge'>
      <address type='pci' domain='0' bus='1' slot='1' function='0'/>
    </controller>
  </devices>
  ...
   

9.4. デバイスのアドレスの設定

多くのデバイスには、ゲスト仮想マシンに提示される仮想バス上のデバイスの場所を説明するのに使用されるオプションの <address> サブ要素があります。入力でアドレス (またはアドレス内の任意の属性) が省略された場合 libvirt は適切なアドレスを生成します。レイアウトをさらに制御する必要がある場合は明示的なアドレスが必要になります。<address> 要素を含むドメイン XML デバイスの例は、図9.6「PCI デバイスの割り当ての XML 例」 を参照してください。
各アドレスには、デバイスが稼働しているバスを説明する必須の属性 type があります。特定のデバイスに使用するアドレスの選択は、デバイスやゲスト仮想マシンのアーキテクチャーによって一部が制約されます。たとえば、<disk> デバイスは type='drive' を使用し、<console> デバイスは i686 または x86_64 ゲスト仮想マシンアーキテクチャー で type='pci' を使用します。各アドレスタイプには、表に記載されているように、バス上のどこにデバイスを配置するかを制御するオプションの属性がさらにあります。
表9.1 サポートされているデバイスのアドレスタイプ
アドレスの種類 説明
type='pci' PCI アドレスには、以下の追加属性があります。
  • ドメイン (2 バイトの 16 進数の整数で、現在 qemu で使用されていません)
  • bus (0 から 0xff までの 16 進数の値)
  • slot (0x0 から 0x1f までの 16 進数の値)
  • 関数 (0 から 7 までの値)
  • PCI 制御レジスターの特定のスロット/機能の多機能ビットをオンにする多機能コントロールは、デフォルトではオフに設定されていますが、複数の機能が使用されるスロットの機能 0 ではオンに設定する必要があります。
type='drive' ドライブアドレスには、以下の追加属性があります。
  • コントローラー (2 桁のコントローラー番号)
  • バス (2 桁のバス番号)
  • ターゲット (2 桁のバス番号)
  • ユニット (バス上の 2 桁のユニット番号)
type='virtio-serial' 各 virtio-serial アドレスには、以下の追加属性があります。
  • コントローラー (2 桁のコントローラー番号)
  • バス (2 桁のバス番号)
  • スロット (バス内の 2 桁のスロット)
type='ccid' スマートカード用の CCID アドレスには、以下の追加属性があります。
  • バス (2 桁のバス番号)
  • スロット属性 (バス内の 2 桁のスロット)
type='usb' USB アドレスには、以下の追加属性があります。
  • bus (0 から 0xfff までの 16 進数の値)
  • ポート (1.2 または 2.1.3.1 などの最大 4 オクテットのドット表記)
type='isa' ISA アドレスには、以下の追加属性があります。
  • iobase
  • irq

9.5. ゲスト仮想マシンでのストレージコントローラーの管理

Red Hat Enterprise Linux 6.4 以降、Red Hat Enterprise Linux6.4 以降を実行しているゲスト仮想マシンに SCSI および virtio-SCSI デバイスを追加することがサポートされています。virtio ディスクとは異なり、SCSI デバイスではゲスト仮想マシンにコントローラーが存在する必要があります。Virtio-SCSI は、SCSI LUN に直接接続する機能を提供し、virtio-blk と比較してスケーラビリティを大幅に向上させます。virtio-SCSI の利点は、28 台のデバイスしか処理できず PCI スロットを使い果たす virtio-blk と比較して、数百台のデバイスを処理できることです。Virtio-SCSI は、次の機能を備えたターゲットデバイスの機能セットを継承できるようになりました。
  • virtio-scsi コントローラーを介して仮想ハードドライブまたは CD を接続します。
  • QEMU scsi-block デバイスを介してホストからゲストに物理 SCSI デバイスをパススルーします。
  • ゲストごとに数百台のデバイスを使用できるようにします。virtio-blk の 28 デバイスの制限からの改善。
本セクションでは、仮想 SCSI コントローラー ("Host Bus Adapter" または HBA とも呼ばれます) を作成し、SCSI ストレージをゲスト仮想マシンに追加するために必要な手順を詳細に説明します。

手順9.10 仮想 SCSI コントローラーの作成

  1. ゲスト仮想マシン (Guest1) の設定を表示し、以前から存在している SCSI コントローラーを検索します。
    # virsh dumpxml Guest1 | grep controller.*scsi
    
    デバイスコントローラーが存在する場合は、このコマンドにより、次のような行が 1 つ以上出力されます。
    <controller type='scsi' model='virtio-scsi' index='0'/>
    
  2. 前の手順でデバイスコントローラーが表示されなかった場合は、以下の手順に従って、新しいファイルにデバイスコントローラーの説明を作成し、仮想マシンに追加します。
    1. 新しいファイルに <controller> 要素を書き込んでデバイスコントローラーを作成し、このファイルに XML 拡張子で保存します。virtio-scsi-controller.xml など。
      <controller type='scsi' model='virtio-scsi'/>
      
    2. virtio-scsi-controller.xml で作成したデバイスコントローラーをゲスト仮想マシン (例: Guest1) に関連付けます。
      # virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
      
      この例では、--config オプションはディスクと同じように動作します。詳細は、手順13.2「ゲストへの物理ブロックデバイスの追加」 を参照してください。
  3. 新しい SCSI ディスクまたは CD-ROM を追加します。新しいディスクは、「 ゲストへのファイルベースストレージの追加」 セクションおよび 「ゲストへのハードドライブおよびその他のブロックデバイスの追加」 セクションの方法を使用して追加できます。SCSI ディスクを作成する場合は、sd で始まるターゲットデバイス名を指定します。
    # virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
    
    ゲスト仮想マシンのドライバーのバージョンによっては、実行中のゲスト仮想マシンで新しいディスクがすぐに検出されない場合があります。Red Hat Enterprise Linux Storage Administration Guide の手順に従います。

9.6. 乱数ジェネレーター (RNG) デバイス

virtio-rng は、仮想 RNG (random number generator) デバイスであり、RNG データをゲスト仮想マシンのオペレーティングシステムにフィードします。これにより、要求に応じてゲスト仮想マシンに新しいエントロピーを提供します。
RNG の使用は、キーボード、マウス、その他の入力などのデバイスがゲスト仮想マシンで十分なエントロピーを生成するのに十分でない場合に特に役立ちます。virtio-rng デバイスは、Red Hat Enterprise Linux と Windows ゲスト仮想マシンの両方で利用できます。Windows 要件のインストール手順については、注記 を参照してください。特に明記されていない限り、以下の説明は Red Hat Enterprise Linux と Windows の両方のゲスト仮想マシンを対象としています。
Linux ゲスト仮想マシンで virtio-rng が有効になっている場合、chardev はゲスト仮想マシンの /dev/hwrng/ の場所に作成されます。次に、この文字 dev を開いて読み取り、ホストの物理マシンからエントロピーをフェッチできます。ゲスト仮想マシンのアプリケーションが virtio-rng デバイスからのランダム性を透過的に使用することで利益を得るには、/dev/hwrng/ からの入力をゲスト仮想マシンのカーネルエントロピープールに中継する必要があります。これは、この場所の情報が rgnd デーモン (rng-tools 内に含まれている) と結合されている場合に実行できます。
この結合により、エントロピーがゲスト仮想マシンの /dev/random ファイルにルーティングされます。このプロセスは、Red Hat Enterprise Linux 6 ゲスト仮想マシンで手動で行います。
Red Hat Enterprise Linux 6 ゲスト仮想マシンは、以下のコマンドを実行して組み合わせます。
# rngd -b -r /dev/hwrng/ -o /dev/random/
詳細は、ここで説明するコマンドオプションの説明は、man rngd コマンドを実行します。その他の例は、手順9.11「コマンドラインツールでの virtio-rng の実装」 で virtio-rng デバイスを設定します。
注記
Windows ゲスト仮想マシンでは、ドライバー viorng をインストールする必要があります。インストールが完了すると、仮想 RNG デバイスは Microsoft が提供する CNG(手動生成)API を使用して機能します。ドライバーがインストールされると、virtrng デバイスが RNG プロバイダーのリストに表示されます。

手順9.11 コマンドラインツールでの virtio-rng の実装

  1. ゲスト仮想マシンをシャットダウンします。
  2. ターミナルウィンドウで、virsh edit domain-name コマンドを使用して、目的のゲスト仮想マシンの XML ファイルを開きます。
  3. <devices> 要素を編集して、以下の内容を追加します。
    
      ...
      <devices>
        <rng model='virtio'>
          <rate period="2000" bytes="1234"/>
          <backend model='random'>/dev/random</backend>
               <source mode='bind' service='1234'>
               <source mode='connect' host='192.0.2.1' service='1234'>
          </backend>
        </rng>
      </devices>
      ...

第10章 qemu-img および QEMU ゲストエージェント

本章では、ゲスト仮想マシンで qemu-img パッケージを使用するための便利なヒントとヒントを紹介します。QEMU トレースイベントと引数に関する情報を探している場合は、次の場所にある README ファイルを参照してください。/usr/share/doc/qemu-*/README.systemtap

10.1. qemu-img の使用

qemu-img コマンドラインツールは、KVM が使用するさまざまなファイルシステムのフォーマット、修正、および検証に使用されます。qemu-img オプションと使用方法を以下に示します。

チェック

ディスクイメージの filename で整合性チェックを実行します。

#  qemu-img check -f qcow2 --output=qcow2 -r all filename-img.qcow2
注記
qcow2 および vdi 形式のみが整合性チェックに対応します。
-r を使用すると、チェック中に見つかった不整合を修復しようとしますが、-r leaks クラスターのリークで使用されると修復され、-r all ですべての種類のエラーが修正されます。これには、間違った修正を選択したり、すでに発生している可能性のある破損の問題を隠したりするリスクがあることに注意してください。

Commit

指定したイメージファイル (filename) に記録された変更を、qemu-img commit コマンドでファイルのベースイメージにコミットします。オプションで、ファイルのフォーマットタイプ (format) を指定します。

 # qemu-img commit [-f format] [-t cache] filename

convert

convert オプションは、認識されているイメージ形式を別のイメージ形式に変換するために使用されます。

コマンド形式:
# qemu-img convert [-c] [-p] [-f format] [-t cache] [-O output_format] [-o options] [-S sparse_size] filename output_filename
-p パラメーターはコマンドの進捗を示し (すべてのコマンドではなく任意)、-S フラグは、ディスクイメージに含まれる sparse file の作成を許可します。ゼロのみを含む (何も含まない) 物理ブロックを除いて、あらゆる目的のスパースファイルは標準ファイルのように機能します。オペレーティングシステムがこのファイルを認識すると、たとえ実際にはディスクを使用していなくても、存在しているものとして扱われ、実際のディスク領域を消費します。ゲスト仮想マシン用のディスクを作成する場合に特に役立ちます。これにより、ディスクに必要なディスク領域よりもはるかに多くのディスク領域が使用されるようになります。たとえば、10Gb のディスクイメージで -S を 50Gb に設定すると、実際には 10Gb しか使用されていなくても、そのディスク領域の 10Gb は 60Gb に見えます。
filename 形式を使用して、ディスクイメージ output_filename をディスクイメージ output_format に変換します。ディスクイメージは、-c オプションで圧縮するか、-o encryption を設定して -o オプションで暗号化できます。-o パラメーターで使用できるオプションは、選択した形式とは異なることに注意してください。
qcow2 形式のみが暗号化または圧縮をサポートします。qcow2 暗号化は、安全な 128 ビット鍵で AES 形式を使用します。qcow2 圧縮は読み取り専用であるため、圧縮したセクターが qcow2 形式から変換されると、非圧縮データとして新しい形式に書き込まれます。
イメージの変換は、qcow または cow など、サイズを大きくできる形式を使用する場合に、小さなイメージを取得する場合にも役立ちます。空のセクターは、宛先イメージから検出され、抑制されます。

Create

サイズsize、フォーマットformat、新しいディスクイメージの ファイル名を作成します。

# qemu-img create [-f format] [-o options] filename [size][preallocation]
ベースイメージが -o backing_file=filename で指定されている場合は、イメージ自体とベースイメージの違いのみが記録されます。バッキングファイルは、commit コマンドを使用しない限り変更されません。この場合、サイズの指定は必要ありません。
事前割り当ては、qcow2 イメージの作成でのみ使用できるオプションです。許可される値には -o preallocation=off|meta|full|falloc が含まれます。事前に割り当てられたメタデータを持つイメージは、イメージよりも大きくなります。ただし、イメージサイズが大きくなると、イメージのサイズが大きくなるとパフォーマンスが向上します。
full 割り当ての使用には、イメージのサイズが大きい場合に時間がかかる可能性があることに注意してください。完全な割り当てと時間が経つ必要がある場合、フラックを使用 falloc 時間を節約できます。

Info

info パラメーターは、ディスクイメージのfilenameに関する情報を表示します。info オプションの形式は、以下のとおりです。

# qemu-img info [-f format] filename
このコマンドは、多くの場合、表示されているサイズとは異なるディスクに予約されているサイズを検出するために使用されます。スナップショットがディスクイメージに保存されている場合は、そのスナップショットも表示されます。このコマンドは、たとえば、ブロックデバイスの qcow2 イメージが使用している領域を表示します。これは、qemu-img を実行して行います。使用中のイメージが、qemu-img check コマンドで qemu-img info コマンドの出力と一致するイメージであることを確認できます。「qemu-img の使用」 を参照してください。
# qemu-img info /dev/vg-90.100-sluo/lv-90-100-sluo
image: /dev/vg-90.100-sluo/lv-90-100-sluo
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 0
cluster_size: 65536

マップ

# qemu-img map [-f format] [--output=output_format] filename コマンドは、イメージファイル名のメタデータとそのバッキングファイルチェーンをダンプします。具体的には、このコマンドは、指定されたファイルのすべてのセクターの割り当て状態を、それをバッキングファイルチェーンに割り当てる最上位のファイルとともにダンプします。たとえば、c.qcow2 → b.qcow2 → a.qcow2 などのチェーンがある場合、a.qcow2 が元のファイルである場合、b.qcow2 は a.qcow2 に加えられた変更で、c.qcow2 は b.qcow2 のデルタファイルになります。このチェーンが作成されると、イメージファイルは通常のイメージデータを保存し、どのファイルの場所とそれがファイルに保存されるかに関する情報も保存されます。この情報は、イメージのメタデータと呼ばれます。-f フォーマットオプションは、指定されたイメージファイルのフォーマットです。raw、qcow2、vhdx、vmdk などの形式を使用できます。可能な出力オプションには、humanjson の 2 つがあります。

  • human がデフォルト設定です。人間の目に読みやすくなるように設計されているため、この形式は解析しないでください。明確さと単純さのために、デフォルトの human フォーマットは、ファイルの既知のゼロ以外の領域のみをダンプします。ファイルの既知のゼロの部分は完全に省略され、同様にチェーン全体に割り当てられていない部分も省略されます。コマンドが実行されると、qemu-img 出力は、データを読み取ることができるファイルと、ファイル内のオフセットを識別します。出力は、4 列のテーブルとして表示されます。最初の 3 つは 16 進数です。
    # qemu-img map -f qcow2 --output=human /tmp/test.qcow2
    Offset          Length          Mapped to       File
    0               0x20000         0x50000         /tmp/test.qcow2
    0x100000        0x80000         0x70000         /tmp/test.qcow2
    0x200000        0x1f0000        0xf0000         /tmp/test.qcow2
    0x3c00000       0x20000         0x2e0000        /tmp/test.qcow2
    0x3fd0000       0x10000         0x300000        /tmp/test.qcow2
    
  • json、つまり JSON (JavaScript Object Notation) は、人間が読むこともできますが、プログラミング言語であるため、解析することも前提に設計されています。たとえば、パーサーで qemu-img map の出力を解析する場合は、オプション --output=json を使用する必要があります。
    # qemu-img map -f qcow2 --output=json /tmp/test.qcow2
    [{ "start": 0, "length": 131072, "depth": 0, "zero": false, "data": true, "offset": 327680},
    { "start": 131072, "length": 917504, "depth": 0, "zero": true, "data": false},
    
    JSON 形式の詳細については、qemu-img (1) の man ページを参照してください。

リベース

イメージのバッキングファイルを変更します。

# qemu-img rebase [-f format] [-t cache] [-p] [-u] -b backing_file [-F backing_format] filename
バッキングファイルの形式が backing_file に変更され (filename の形式がこの機能に対応している場合)、バッキングファイルの形式が backing_format に変更されます。
注記
バッキングファイル (リベース) の変更に対応するのは、qcow2 形式のみです。
rebase が動作できるモードには、SafeUnsafe の 2 つがあります。
Safe モードは、デフォルトで使用され、実際のリベース操作を実行します。新しいバッキングファイルは古いファイルとは異なる場合があり、qemu-img rebase は、ゲストの仮想マシンで認識される filename の内容を変更せずに保持します。これを実現するため、filenamebacking_file と古いバッキングファイルとで異なるクラスターは、すべて filename にマージされてから、バッキングファイルを変更します。
safe モードはイメージの変換に相当する費用のかかる動作であることに注意してください。古いバッキングファイルは、正常に完了するために必要です。
Unsafe モードは、-u オプションが qemu-img rebase に渡される場合に使用されます。このモードでは、ファイルの内容を確認せずに、バッキングファイルの名前と filename の形式のみが変更されます。新しいバッキングファイルが正しく指定されていることを確認してください。指定されていない場合、イメージのゲストに表示されるコンテンツが破損します。
このモードは、バッキングファイルの名前変更や移動に役立ちます。アクセス可能な古いバッキングファイルがなくても使用できます。たとえば、バッキングファイルがすでに移動または名前変更されているイメージを修正するために使用できます。

サイズの変更

サイズ sizeで作成されたかのように、ディスクイメージのfilenameを変更します。バージョンに関係なく、サイズ変更できるのは raw 形式のイメージのみです。Red Hat Enterprise Linux 6.1 以降では、qcow2 フォーマットでイメージを拡大 (縮小はしない) する機能が追加されています。

次のコマンドを使用して、ディスクイメージのfilenameのサイズを size バイトに設定します。
# qemu-img resize filename size
また、ディスクイメージの現在のサイズを基準にしてサイズを変更することもできます。現在のサイズに相対的なサイズを指定するには、バイト数の前に + を付けて拡大するか、- を付けてディスクイメージのサイズをそのバイト数だけ縮小します。ユニットの接尾辞を追加すると、イメージのサイズをキロバイト (K)、メガバイト (M)、ギガバイト (G)、またはテラバイト (T) で設定できます。
# qemu-img resize filename [+|-]size[K|M|G|T]
警告
このコマンドを使用してディスクイメージを縮小する前に、仮想マシン自体の内部でファイルシステムとパーティションツールを使用して、割り当てられたファイルシステムとパーティションサイズを適宜減らす必要があります。そうしないと、データが失われることになります。
このコマンドを使用してディスクイメージを拡張したら、ファイルシステムと仮想マシン内のパーティションツールを使用して、デバイス上の新しい領域の使用を実際に開始する必要があります。

スナップショット

イメージ (ファイル名) の既存のスナップショット (スナップショット) を一覧表示、適用、作成、または削除します。

# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
-l は、指定したディスクイメージに関連付けられているすべてのスナップショットを一覧表示します。apply オプション -a は、ディスクイメージ (filename) を、以前保存したスナップショットの状態に戻します。-c は、イメージ (filename) のスナップショット (snapshot) を作成します。-d は、指定したスナップショットを削除します。

サポート対象の形式

qemu-img は、ファイルを次のいずれかのフォーマットに変換するように設計されています。

raw
Raw ディスクイメージ形式 (デフォルト)これは、ファイルベースで最も高速な形式になります。ファイルシステムがホールをサポートしている場合 (たとえば、Linux の ext2 または ext3、Windows の NTFS)、書き込まれたセクターのみがスペースを予約します。qemu-img info を使用して、イメージが使用する実際のサイズを取得するか、Unix/Linux の ls -ls を取得します。Raw イメージは最適なパフォーマンスを提供しますが、Raw イメージで使用できるのは非常に基本的な機能のみです (たとえば、スナップショットは使用できません)。
qcow2
QEMU イメージ形式。最も汎用性が高く、機能セットが最適な形式です。これを使用して、オプションの AES 暗号化、zlib ベースの圧縮、複数の VM スナップショットのサポート、およびホールをサポートしないファイルシステム (Windows 上の非 NTFS ファイルシステム) で役立つ小さなイメージを使用します。この拡張機能セットはパフォーマンスに影響を与えることに注意してください。
ゲスト仮想マシンまたはホスト物理マシンでの実行には上記の形式のみを使用できますが、qemu-img は、raw、または qcow2 形式に変換するために、以下の形式も認識してサポートします。イメージの形式は、通常、自動的に検出されます。この形式を raw または qcow2 に変換することに加えて、raw または qcow2 から元の形式に戻すことができます。
bochs
Bochs ディスクイメージ形式。
cloop
Linux Compressed Loop イメージ。Knoppix CD-ROM などにある直接圧縮 CD-ROM イメージを再利用する場合にのみ役立ちます。
cow
User Mode Linux Copy On Write イメージ形式。cow 形式は、以前のバージョンとの互換性のためにのみ同梱されています。Windows では動作しません。
dmg
Mac ディスクイメージフォーマット。
nbd
ネットワークブロックデバイス。
parallels
Parallels 仮想化ディスクイメージフォーマット。
qcow
古い QEMU イメージフォーマット。古いバージョンとの互換性にのみ含まれます。
vdi
Oracle VM VirtualBox ハードディスクイメージ形式。
vmdk
VMware 互換のイメージフォーマット (バージョン 1 および 2 の読み取り/書き込みサポート、およびバージョン 3 の読み取り専用サポート)。
vpc
WindowsVirtualPC のディスクイメージフォーマット。vhd、または Microsoft 仮想ハードディスクイメージフォーマットとも呼ばれます。
vvfat
仮想 VFAT ディスクイメージフォーマット。

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

QEMU ゲストエージェントはゲスト内で実行され、ホストマシンが libvirt を使用してゲストオペレーティングシステムにコマンドを発行できるようにします。ゲストオペレーティングシステムは、これらのコマンドに非同期に応答します。本章では、ゲストエージェントが使用できる libvirt コマンドとオプションを説明します。
重要
信頼できるゲストによって実行される場合にのみ、ゲストエージェントに依存することが安全であることに注意してください。信頼できないゲストは、ゲストエージェントプロトコルを悪意を持って無視または悪用する可能性があります。ホストに対するサービス拒否攻撃を防ぐための保護機能が組み込まれていますが、ホストは、操作を期待どおりに実行するためにゲストの協力を必要とします。
QEMU ゲストエージェントを使用して、ゲストの実行中に仮想 CPU(vCPU) を有効または無効にできるため、ホットプラグおよびホットアンプラグ機能を使用せずに vCPU の数を調整できることに注意してください。詳細は、「仮想 CPU 数の設定」 を参照してください。

10.2.1. ゲストエージェントをインストールして有効にする

ゲスト仮想マシンに yum install qemu-guest-agent コマンドでqemu-guest-agentをインストールし、サービス (qemu-guest-agent.service) として起動毎に自動実行されるようにします。

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

ホストマシンは、ホストとゲストマシン間の VirtIO シリアル接続を介してゲストエージェントと通信します。VirtIO シリアルチャネルはキャラクターデバイスドライバー (通常は Unix ソケット) を介してホストに接続し、ゲストはこのシリアルチャネルをリッスンします。次の手順は、ゲストエージェントが使用できるようにホストマシンとゲストマシンをセットアップする方法を示しています。
注記
Windows ゲストで QEMU ゲストエージェントを設定する方法については、こちら の手順を参照してください。。

手順10.1 ゲストエージェントとホスト間の通信の設定

  1. ゲスト XML を開きます

    QEMU ゲストエージェント設定でゲスト XML を開きます。ファイルを開くにはゲスト名が必要です。ホストマシンでコマンド #virsh list を使用して、認識できるゲストを一覧表示します。この例では、ゲストの名前は rhel6 です。
    # virsh edit rhel6
  2. ゲスト XML ファイルを編集します

    次の要素を XML ファイルに追加し、変更を保存します。

    図10.1 ゲスト XML を編集して QEMU ゲストエージェントを設定する

    <channel type='unix'>
       <source mode='bind' path='/var/lib/libvirt/qemu/rhel6.agent'/>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
    
    
  3. ゲストでの QEMU ゲストエージェントの起動

    まだ行っていない場合は、yum install qemu-guest-agent を使用してゲスト仮想マシンにゲストエージェントをダウンロードしてインストールします。インストールしたら、次のようにサービスを開始します。
    # service start qemu-guest-agent
これで、有効な送信によってゲストと通信できます確立されたキャラクターデバイスドライバーに対する libvirt コマンド。

10.2.3. QEMU ゲストエージェントの使用

QEMU ゲストエージェントプロトコル (QEMU GA) パッケージ、qemu-guest-agent は、Red Hat Enterprise Linux 以降で完全にサポートされています。ただし、isa-serial/virtio-serial トランスポートに関しては、次の制限があります。
  • qemu-guest-agentは、クライアントがチャネルに接続したかどうかを検出することはできません。
  • クライアントが、qemu-guest-agent がバックエンドに切断または再接続したかどうかを検出する方法はありません。
  • virtio-serial デバイスがリセットされ、qemu-guest-agentチャネルに接続されていない場合 (通常、再起動またはホットプラグが原因)、クライアントからのデータはドロップされます。
  • virtio-serial デバイスのリセット後に qemu-guest-agent がチャネルに接続した場合、qemu-guest-agent がまだ実行中か接続中かにかかわらず、クライアントからのデータはキューに入れられます (そして利用可能なバッファーを使い切ると最終的にスロットルに入れられます)。

10.2.4. libvirt での QEMU ゲストエージェントの使用

QEMU ゲストエージェントをインストールすると、他のさまざまな libvirt コマンドのパフォーマンスが向上します。ゲストエージェントは、次のvirsh コマンドを拡張します。
  • virsh shutdown --mode=agent - このシャットダウン方法は、virsh shutdown --mode=acpi よりも信頼性が高くなります。QEMU ゲストエージェントで使用する virsh shutdown は、クリーンな状態で協調ゲストをシャットダウンすることが保証されます。エージェントが存在しない場合、libvirt は代わりに ACPI シャットダウンイベントの挿入に依存する必要がありますが、一部のゲストはそのイベントを無視するため、シャットダウンしません。
    virsh reboot と同じ構文で使用できます。
  • virsh snapshot-create --quiesce - スナップショットが作成される前に、ゲストが I / O を安定した状態にフラッシュできるようにします。これにより、fsck を実行したり、データベーストランザクションの一部を失うことなくスナップショットを使用できます。ゲストエージェントは、ゲストの相互作用を提供することで、高レベルのディスクコンテンツの安定性を実現します。
  • virsh setvcpus --guest - CPU をオフラインにするようにゲストに指示します。
  • virsh dompmsuspend - ゲストオペレーティングシステムの電源管理機能を使用して、実行中のゲストを優雅に一時停止します。

10.2.5. ゲスト仮想マシンのディスクバックアップの作成

libvirt は、qemu-ga と通信して、ゲスト仮想マシンのファイルシステムのスナップショットが内部で一貫性を保ち、必要に応じてすぐに使用できるようにします。Red Hat Enterprise Linux 6 の改善により、ファイルレベルとアプリケーションレベルの両方の Synchronization (フラッシュ) が確実に実行されるようになりました。ゲストシステム管理者は、アプリケーション固有のフリーズ/フリーズ解除フックスクリプトを作成してインストールできます。ファイルシステムをフリーズする前に、qemu-gaはメインフックスクリプト (qemu-gaパッケージに含まれています) を起動します。フリーズプロセスでは、ゲスト仮想マシンのアプリケーションがすべて一時的に非アクティブになります。
ファイルシステムがフリーズする直前に、次のアクションが発生します。
  • ファイルシステムアプリケーション/データベースは、作業バッファーを仮想ディスクにフラッシュし、クライアント接続の受け入れを停止します。
  • アプリケーションがデータファイルを一貫した状態にします。
  • メインフックスクリプトが返されます。
  • qemu-ga ファイルシステムをフリーズし、管理スタックがスナップショットを取得します
  • スナップショットが確認されました。
  • ファイルシステムの機能が再開します。
フリーズ解除は逆の順序で行われます。
snapshot-create-as コマンドを使用して、ゲストディスクのスナップショットを作成します。このコマンドの詳細については、「現在のドメインのスナップショットを作成する」 を参照してください。
注記
アプリケーション固有のフックスクリプトでは、データベースと通信するためにスクリプトをソケットに接続する必要がある場合と同様に、正しく実行するために様々な SELinux のパーミッションが必要になることがあります。一般に、ローカル SELinux ポリシーは、そのような目的のために開発およびインストールする必要があります。/etc/qemu-ga/fsfreeze-hook.d/ というラベルが付いた表の行の 表10.1「QEMU ゲストエージェントパッケージの内容」 に一覧表示されている restorecon -FvvR コマンドを実行した後、ファイルシステムノードへのアクセスがすぐに機能するようになります。
qemu-guest-agent バイナリー RPM には、以下のファイルが含まれています。
表10.1 QEMU ゲストエージェントパッケージの内容
File name説明
/etc/rc.d/init.d/qemu-gaQEMU ゲストエージェントのサービス制御スクリプト (start/stop)
/etc/sysconfig/qemu-ga/etc/rc.d/init.d/qemu-ga 制御スクリプトによって読み取られる QEMU ゲストエージェントの設定ファイル。設定は、シェルスクリプトのコメントが記載されたファイルで説明されています。
/usr/bin/qemu-gaQEMU ゲストエージェントのバイナリーファイル。
/usr/libexec/qemu-ga/フックスクリプトのルートディレクトリー。
/usr/libexec/qemu-ga/fsfreeze-hookメインフックスクリプト。ここでは変更は必要ありません。
/usr/libexec/qemu-ga/fsfreeze-hook.d/個々のアプリケーション固有のフックスクリプトのディレクトリー。ゲストシステム管理者は、フックスクリプトを手動でこのディレクトリーにコピーし、適切なファイルモードビットを確認してから、このディレクトリーで restorecon -FvvR を実行する必要があります。
/usr/share/qemu-kvm/qemu-ga/サンプルスクリプトを含むディレクトリー (サンプル目的のみ)ここに含まれるスクリプトは実行されません。
メインフックスクリプトの /usr/libexec/qemu-ga/fsfreeze-hook は、独自のメッセージと、アプリケーション固有のスクリプトの標準出力およびエラーメッセージを、ログファイル /var/log/qemu-ga/fsfreeze-hook.log に記録します。詳細は、wiki.qemu.org または libvirt.org にあるqemu-guest-agentwiki ページを参照してください。

10.3. Windows ゲストでの QEMU ゲストエージェントの実行

Red Hat Enterprise Linux ホストマシンは、ゲストで QEMU ゲストエージェントを実行することにより、Windows ゲストにコマンドを発行できます。これは、Red Hat Enterprise Linux 6.5 以降を実行しているホスト、および次の Windows ゲストオペレーティングシステムでサポートされています。
  • Windows XP Service Pack 3 (VSS はサポートされていません)
  • Windows Server 2003 R2 - x86 および AMD64 (VSS はサポートされていません)
  • Windows Server 2008
  • Windows Server 2008 R2
  • Windows7 - x86 および AMD64
  • Windows Server 2012
  • Windows Server 2012 R2
  • Windows8 - x86 および AMD64
  • Windows8.1 - x86 および AMD64
注記
Windows ゲスト仮想マシンには、Windows 用の QEMU ゲストエージェントパッケージが必要です。qemu-guest-agent-win。このエージェントは、Red Hat Enterprise Linux で実行されている Windows ゲスト仮想マシンの VSS(ボリュームシャドウコピーサービス) サポートに必要です。詳細はこちらの記事を参照してください:

手順10.2 Windows ゲストでの QEMU ゲストエージェントの設定

Red Hat Enterprise Linux ホストマシンで実行されている Windows ゲストの場合は、次の手順に従います。
  1. Red Hat Enterprise Linux ホストマシンを準備します

    次のパッケージが Red Hat Enterprise Linux ホスト物理マシンにインストールされていることを確認してください。
    • virtio-winusr/share/virtio-win/ にあります。
    Windows ゲストのドライバーをコピーするには、次のコマンドを使用して qxl ドライバーの *.iso ファイルを作成します。
    # mkisofs -o /var/lib/libvirt/images/virtiowin.iso /usr/share/virtio-win/drivers
  2. Windows ゲストを準備する

    virtio-serial をインストールしますドライバーを更新するために Windows ゲストに *.iso をマウントすることにより、ゲストのドライバー。ゲストを起動し、次に示すようにドライバーの.iso ファイルをゲストに添付します ( hdb という名前のディスクを使用)。
    # virsh attach-disk guest /var/lib/libvirt/images/virtiowin.iso hdb
    Windows の コントロールパネル を使用してドライバーをインストールするには、次のメニューに移動します。
    • virtio-win ドライバーをインストールするには - ハードウェアとサウンド > デバイスマネージャー > virtio- シリアルドライバー を選択します。
  3. Windows ゲスト XML 設定ファイルを更新します

    Windows ゲストのゲスト XML ファイルは、Red Hat Enterprise Linux ホストマシンにあります。このファイルにアクセスするには、Windows ゲスト名が必要です。ホストマシンで #virsh list コマンドを使用して、認識できるゲストを一覧表示します。この例では、ゲストの名前は win7x86 です。
    #virsh edit win7x86 コマンドを使用して次の要素を XML ファイルに追加し、変更を保存します。ソースソケット名は、この例では win7x86.agent という名前で、ホスト内で一意である必要があることに注意してください。

    図10.2 Windows ゲスト XML を編集して QEMU ゲストエージェントを設定する

       ...
      <channel type='unix'>
          <source mode='bind' path='/var/lib/libvirt/qemu/win7x86.agent'/>
          <target type='virtio' name='org.qemu.guest_agent.0'/>
          <address type='virtio-serial' controller='0' bus='0' port='1'/>
       </channel>
       <channel type='spicevmc'>
          <target type='virtio' name='com.redhat.spice.0'/>
          <address type='virtio-serial' controller='0' bus='0' port='2'/>
       </channel>
       ...
    
    
    
  4. Windows ゲストを再起動します

    Windows ゲストを再起動して、変更を適用します。
    # virsh reboot win7x86
  5. Windows ゲストで QEMU ゲストエージェントを準備します

    Windows ゲストでゲストエージェントを準備するには:
    1. 最新のものをインストールするvirtio-winパッケージ

      Red Hat Enterprise Linux ホストの物理マシンのターミナルウィンドウで次のコマンドを実行して、インストールするファイルを見つけます。以下に示すファイルは、システムが検出したファイルと完全に同じではない場合がありますが、最新の公式バージョンである必要があることに注意してください。
      # rpm -qa|grep virtio-win
      virtio-win-1.6.8-5.el6.noarch
      
      # rpm -iv virtio-win-1.6.8-5.el6.noarch
    2. インストールが完了したことを確認します

      後に virtio-win パッケージのインストールが完了したら、/usr/share/virtio-win/guest-agent/ フォルダーを確認すると、次のような qemu-ga-x64.msi または qemu-ga-x86.msi という名前のファイルが見つかります。
      # ls -l /usr/share/virtio-win/guest-agent/
      
      total 1544
      
      -rw-r--r--. 1 root root 856064 Oct 23 04:58 qemu-ga-x64.msi
      
      -rw-r--r--. 1 root root 724992 Oct 23 04:58 qemu-ga-x86.msi
      
      
    3. .msi ファイルをインストールします

      Windows ゲスト (たとえば、win7x86) から、ファイルをダブルクリックして qemu-ga-x64.msi または qemu-ga-x86.msi をインストールします。インストールされると、システムマネージャー内の Windows ゲストに qemu-ga サービスとして表示されます。この同じマネージャーを使用して、サービスのステータスを監視できます。

10.3.1. Windows ゲストでの QEMUGuestAgent での libvirt コマンドの使用

QEMU ゲストエージェントは、Windows ゲストで次の virsh コマンドを使用できます。
  • virsh shutdown --mode=agent - このシャットダウン方法は、virsh shutdown --mode=acpi よりも信頼性が高くなります。QEMU ゲストエージェントで使用する virsh shutdown は、クリーンな状態で協調ゲストをシャットダウンすることが保証されます。エージェントが存在しない場合、libvirt は代わりに ACPI シャットダウンイベントの挿入に依存する必要がありますが、一部のゲストはそのイベントを無視するため、シャットダウンしません。
    virsh reboot と同じ構文で使用できます。
  • virsh snapshot-create --quiesce - スナップショットが作成される前に、ゲストが I / O を安定した状態にフラッシュできるようにします。これにより、fsck を実行したり、データベーストランザクションの一部を失うことなくスナップショットを使用できます。ゲストエージェントは、ゲストの相互作用を提供することで、高レベルのディスクコンテンツの安定性を実現します。
  • virsh dompmsuspend - ゲストオペレーティングシステムの電源管理機能を使用して、実行中のゲストを優雅に一時停止します。

10.4. デバイスリダイレクトの制限の設定

リダイレクトから特定のデバイスをフィルターリングするには、フィルタープロパティーを -device usb-redir に渡します。filter プロパティーは、フィルタールールで設定される文字列を取ります。ルールの形式は次のとおりです。
<class>:<vendor>:<product>:<version>:<allow>
-1 の値を使用して、特定のフィールドに任意の値を受け入れるように指定します。同じコマンドラインで、| を区切り文字として使用し、複数のルールを使用できます。デバイスがどのフィルタールールにも一致しない場合、リダイレクトは許可されないことに注意してください。

例10.1 Windows ゲスト仮想マシンによるリダイレクトの制限

  1. Windows 7 ゲスト仮想マシンを準備します。
  2. 以下のコード抜粋をゲスト仮想マシンの XML ファイルに追加します。
        <redirdev bus='usb' type='spicevmc'>
          <alias name='redir0'/>
          <address type='usb' bus='0' port='3'/>
        </redirdev>
        <redirfilter>
          <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/>
          <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/>
        </redirfilter>
    
  3. ゲスト仮想マシンを起動し、次のコマンドを実行して設定の変更を確認します。
    # ps -ef | grep $guest_name
    -device usb-redir,chardev=charredir0,id=redir0,/
    filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
  4. USB デバイスをホストの物理マシンに接続し、virt-viewer を使用してゲスト仮想マシンに接続します。
  5. メニューで USB デバイスの選択 をクリックすると、一部の USB デバイスはホストポリシーによってブロックされていますというメッセージが表示されます。OK をクリックして確定し、続行します。
    フィルターが有効になります。
  6. フィルターが正しくキャプチャーされていることを確認するには、USB デバイスのベンダーと製品を確認してから、USB リダイレクトを可能にするために、ホストの物理マシンのドメイン XML で次の変更を行います。
       <redirfilter>
          <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/>
          <usbdev allow='no'/>
        </redirfilter>
    
  7. ゲスト仮想マシンを再起動してから、virt-viewer を使用してゲスト仮想マシンに接続します。これで、USB デバイスはトラフィックをゲスト仮想マシンにリダイレクトするようになります。

10.5. 仮想 NIC に接続しているホスト物理マシンまたはネットワークブリッジの動的な変更

本セクションでは、ゲスト仮想マシンを危険にさらすことなく、ゲスト仮想マシンの実行中にゲスト仮想マシンの vNIC をあるブリッジから別のブリッジに移動する方法を説明します。
  1. 次のような設定で、ゲスト仮想マシンを準備します。
    <interface type='bridge'>
          <mac address='52:54:00:4a:c9:5e'/>
          <source bridge='virbr0'/>
          <model type='virtio'/>
    </interface>
    
  2. インターフェイスを更新するために XML ファイルを準備します。
    # cat br1.xml
    <interface type='bridge'>
          <mac address='52:54:00:4a:c9:5e'/>
          <source bridge='virbr1'/>
          <model type='virtio'/>
    </interface>
    
  3. ゲスト仮想マシンを起動し、ゲスト仮想マシンのネットワーク機能を確認して、ゲスト仮想マシンの vnetX が指定したブリッジに接続されていることを確認します。
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254007da9f2       yes                  virbr0-nic
    
    vnet0
    virbr1          8000.525400682996       yes                  virbr1-nic
    
  4. 次のコマンドを使用して、新しいインターフェイスパラメーターでゲスト仮想マシンのネットワークを更新します。
    # virsh update-device test1 br1.xml 
    
    Device updated successfully
    
    
  5. ゲスト仮想マシンで service network restart を実行します。ゲスト仮想マシンは、virbr1 の新しい IP アドレスを取得します。ゲスト仮想マシンの vnet0 が新しいブリッジ (virbr1) に接続されていることを確認します。
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254007da9f2       yes             virbr0-nic
    virbr1          8000.525400682996       yes             virbr1-nic     vnet0
    

第11章 ストレージの概念

この章では、ストレージデバイスの説明と管理に使用される概念を紹介します。ストレージプールやボリュームなどの用語については、次のセクションで説明します。

11.1. ストレージプール

ストレージプール は、ゲスト仮想マシンにストレージを提供する目的で libvirt によって管理されるファイル、ディレクトリー、またはストレージデバイスです。ストレージプールはローカルにすることも、ネットワーク経由で共有することもできます。ストレージプールは、ゲスト仮想マシンで使用するために、管理者 (多くの場合は専用のストレージ管理者) によって確保されるストレージの量です。ストレージプールは、ストレージ管理者またはシステム管理者によってストレージボリュームに分割され、ボリュームはブロックデバイスとしてゲスト仮想マシンに割り当てられます。要するに、ストレージボリュームはパーティションになり、ストレージプールはディスクになります。ストレージプールは仮想コンテナーですが、次の 2 つの要因で制限されます。つまり、qemu-kvm が許可する最大サイズと、ホストの物理マシンのディスクのサイズです。ストレージプールは、ホストの物理マシン上のディスクのサイズを超えてはなりません。最大サイズは、以下のとおりです。
  • virtio-blk = 2^63 バイトまたは 8 エクサバイト (raw ファイルまたはディスクを使用)
  • Ext4 = ~ 16TB (4KB のブロックサイズを使用)
  • XFS = ~8 エクサバイト
  • qcow2 およびホストのファイルシステムでは、非常に大きなイメージサイズを試行する際に、独自のメタデータとスケーラビリティーを評価/調整する必要があります。raw ディスクを使用すると、スケーラビリティーまたは最大サイズに影響を与えるレイヤーが減ります。
libvirt は、ディレクトリーベースのストレージプールである /var/lib/libvirt/images/ ディレクトリーをデフォルトのストレージプールとして使用します。デフォルトのストレージプールは、別のストレージプールに変更できます。
  • ローカルストレージプール - ローカルストレージプールは、ホストの物理マシンサーバーに直接接続されています。ローカルストレージプールには、ローカルディレクトリー、直接接続されたディスク、物理パーティション、および LVM ボリュームグループが含まれます。これらのストレージボリュームは、ゲスト仮想マシンイメージを格納するか、追加のストレージとしてゲスト仮想マシンに接続されます。ローカルストレージプールはホストの物理マシンサーバーに直接接続されているため、移行や多数のゲスト仮想マシンを必要としない開発、テスト、および小規模な展開に役立ちます。ローカルストレージプールはライブマイグレーションをサポートしていないため、ローカルストレージプールは多くの本番環境には適していません。
  • ネットワーク型 (共有) ストレージプール - ネットワーク型ストレージプールには、標準プロトコルを使用してネットワーク上で共有されるストレージデバイスが含まれます。virt-manager を使用してホスト物理マシン間で仮想マシンを移行する場合はネットワークストレージが必要ですが、virsh を使用して移行する場合は任意です。ネットワークストレージプールは libvirt によって管理されます。ネットワークストレージプールでサポートされているプロトコルは次のとおりです。
    • ファイバーチャネルベースの LUN
    • iSCSI
    • NFS
    • GFS2
    • SCSI RDMA プロトコル (SCSI RCP) - InfiniBand アダプターおよび 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル
注記
マルチパスストレージプールは完全にはサポートされていないため、作成または使用しないでください。

11.2. ボリューム

ストレージプールは、ストレージボリュームに分類されます。ストレージボリュームは、libvirt が処理する物理パーティション、LVM 論理ボリューム、ファイルベースのディスクイメージ、その他のストレージタイプの抽象化です。ストレージボリュームは、基本となるハードウェアに関係なく、ゲスト仮想マシンにローカルストレージデバイスとして提示されます。

ボリュームの参照

特定のボリュームを参照するには、次の 3 つのアプローチが可能です。

ボリュームとストレージプールの名前
ボリュームは、それが属するストレージプールの識別子とともに名前で参照される場合があります。virsh コマンドラインでは、--pool storage_pool volume_name の形式を取ります。
たとえば、guest_images プールの firstimage という名前のボリュームの場合は以下のようになります。
# virsh vol-info --pool guest_images firstimage
Name:           firstimage
Type:           block
Capacity:       20.00 GB
Allocation:     20.00 GB

virsh #
ホスト物理マシンシステム上のストレージへのフルパス
ボリュームは、ファイルシステム上のフルパスによって参照される場合もあります。このアプローチを使用する場合、プール識別子を含める必要はありません。
たとえば、secondimage.img という名前のボリュームは、ホスト物理マシンシステムに /images/secondimage.img として表示されます。このイメージは /images/secondimage.img として参照できます。
# virsh vol-info /images/secondimage.img
Name:           secondimage.img
Type:           file
Capacity:       20.00 GB
Allocation:     136.00 kB
ユニークなボリュームキー
仮想化システムでボリュームが最初に作成されると、一意の識別子が生成され、ボリュームに割り当てられます。一意の識別子は ボリュームキー と呼ばれます。このボリュームキーの形式は、使用するストレージによって異なります。
LVM などのブロックベースのストレージで使用する場合、ボリュームキーは次の形式に従う場合があります。
c3pKz4-qPVc-Xf7M-7WNM-WJc8-qSiz-mtvpGn
ファイルベースのストレージで使用する場合、ボリュームキーは代わりにボリュームストレージへのフルパスのコピーである可能性があります。
/images/secondimage.img
たとえば、ボリュームキーが Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr:
# virsh vol-info Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
Name:           firstimage
Type:           block
Capacity:       20.00 GB
Allocation:     20.00 GB
virsh は、ボリューム名、ボリュームパス、またはボリュームキーを変換するためのコマンドを提供します。
vol-name
ボリュームパスまたはボリュームキーが指定されている場合は、ボリューム名を返します。
# virsh vol-name /dev/guest_images/firstimage
firstimage
# virsh vol-name Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
vol-path
ボリュームキー、またはストレージプール識別子とボリューム名が指定されている場合は、ボリュームパスを返します。
# virsh vol-path Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
/dev/guest_images/firstimage
# virsh vol-path --pool guest_images firstimage
/dev/guest_images/firstimage
vol-key コマンド
ボリュームパス、またはストレージプール識別子とボリューム名が指定されている場合は、ボリュームキーを返します。
# virsh vol-key /dev/guest_images/firstimage
Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr
# virsh vol-key --pool guest_images firstimage
Wlvnf7-a4a3-Tlje-lJDa-9eak-PZBv-LoZuUr

第12章 ストレージプール

この章には、さまざまなタイプのストレージプールを作成する手順が含まれています。ストレージプール は、仮想マシンで使用するために、管理者 (多くの場合は専用のストレージ管理者) によって確保されるストレージの量です。多くの場合、ストレージプールは、ストレージ管理者またはシステム管理者によってストレージボリュームに分割され、ボリュームはブロックデバイスとしてゲスト仮想マシンに割り当てられます。

例12.1 NFS ストレージプール

NFS サーバーを担当するストレージ管理者が、ゲスト仮想マシンのデータを格納するための共有を作成するとします。システム管理者は、共有の詳細を使用してホスト物理マシン上のプールを定義します (nfs.example.com:/path/to/share/vm_data にマウントする必要があります)。プールが開始すると、libvirt は、システム管理者がログインして mount nfs.example.com:/path/to/share /vmdata を実行した場合と同じように、指定したディレクトリーに共有をマウントします。プールが自動開始するように設定されている場合、libvirt は、libvirt の開始時に指定されたディレクトリーに NFS 共有がマウントされていることを確認します。
プールが開始されると、NFS が共有するファイルがボリュームとして報告され、libvirtAPI を使用してストレージボリュームのパスが照会されます。ストレージボリュームのパスは、ゲスト仮想マシンの XML 定義ファイルセクションにコピーできます。このセクションは、ゲスト仮想マシンのブロックデバイスのソースストレージを記述します。NFS を使用すると、libvirt API を使用するアプリケーションは、プールのサイズ (共有の最大ストレージ容量) の制限まで、プール内のボリューム (NFS 共有内のファイル) を作成および削除できます。すべてのプールタイプがボリュームの作成と削除をサポートしているわけではありません。プールを停止すると、開始操作が無効になります。この場合、NFS 共有がアンマウントされます。名前にもかかわらず、共有のデータは破棄操作によって変更されません。詳細については、manvirsh を参照してください。
注記
ゲスト仮想マシンを適切に動作させるために、ストレージプールとボリュームは必要ありません。プールとボリュームは、libvirt が特定のストレージをゲスト仮想マシンで使用できるようにする方法を提供しますが、一部の管理者は独自のストレージを管理することを好み、ゲスト仮想マシンはプールやボリュームを定義しなくても適切に動作します。プールを使用しないシステムでは、システム管理者は、起動時に共有がマウントされるように、ホスト物理マシンの fstab に NFS 共有を追加するなど、好みのツールを使用してゲスト仮想マシンのストレージの可用性を確保する必要があります。
警告
ゲストにストレージプールを作成するときは、セキュリティー上の考慮事項に必ず従ってください。この情報については、『Red Hat Enterprise Linux 仮想化セキュリティーガイド』 を参照してください。https://access.redhat.com/site/documentation/

12.1. ディスクベースのストレージプール

このセクションでは、ゲスト仮想マシン用のディスクベースのストレージデバイスの作成について説明します。
警告
ゲストには、ディスク全体またはブロックデバイス (/dev/sdb など) への書き込みアクセス権を付与しないでください。パーティション (/dev/sdb1 など) または LVM ボリュームを使用します。
ブロックデバイス全体をゲストに渡すと、ゲストはブロックデバイスをパーティションに分割するか、ブロックデバイスに独自の LVM グループを作成します。これにより、ホストの物理マシンがこのようなパーティションや LVM グループを検出し、エラーが発生する場合があります。

12.1.1. virsh を使用したディスクベースのストレージプールの作成

この手順では、virsh コマンドでディスクデバイスを使用して新しいストレージプールを作成します。
警告
ディスクをストレージプール専用にすると、現在ディスクデバイスに保存されているすべてのデータが再フォーマットおよび消去されます。次の手順を開始する前に、ストレージデバイスをバックアップすることを強くお勧めします。
  1. ディスクに GPT ディスクラベルを作成します

    ディスクには、GUID パーティションテーブル (GPT) ディスクラベルを付け直す必要があります。GPT ディスクラベルを使用すると、各デバイスに最大 128 個のパーティションを作成できます。GPT パーティションテーブルは、MS-DOS パーティションテーブルよりもはるかに多くのパーティションのパーティションデータを格納できます。
    # parted /dev/sdb
    GNU Parted 2.1
    Using /dev/sdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) mklabel
    New disk label type? gpt
    (parted) quit
    Information: You may need to update /etc/fstab.
    #
    
  2. ストレージプール設定ファイルを作成します

    新規デバイスに必要なストレージプール情報を含む一時的な XML テキストファイルを作成します。
    ファイルは以下に示す形式で、次のフィールドが含まれている必要があります。
    <name>guest_images_disk</name>
    nameパラメーターは、ストレージプールの名前を決定します。この例では、以下の例で guest_images_disk という名前を使用しています。
    <device path='/dev/sdb'/>
    deviceパラメーターにpath属性を指定すると、ストレージデバイスのデバイスパスが指定されます。この例では、デバイス /dev/sdb を使用しています。
    <target> <path>/dev</path></target>
    ファイルシステム target パラメーターと path サブパラメーターは、このストレージプールで作成されたボリュームを接続するホスト物理マシンファイルシステム上の場所を決定します。
    たとえば、sdb1、sdb2、sdb3 です。以下の例のように /dev/ を使用すると、このストレージプールから作成されたボリュームに /dev/sdb1、/dev/sdb2、/dev/sdb3 としてアクセスできることを意味します。
    <format type='gpt'/>
    formatパラメーターは、パーティションテーブルの種類を指定します。この例では、次の例の gpt を使用して、前の手順で作成した GPT ディスクラベルタイプと一致させます。
    テキストエディターを使用して、ストレージプールデバイスの XML ファイルを作成します。

    例12.2 ディスクベースのストレージデバイスストレージプール

    <pool type='disk'>
      <name>guest_images_disk</name>
      <source>
        <device path='/dev/sdb'/>
        <format type='gpt'/>
      </source>
      <target>
        <path>/dev</path>
      </target>
    </pool>
    
  3. デバイスを接続します

    前の手順で作成した XML 設定ファイルで virshpool-define コマンドを使用して、ストレージプール定義を追加します。
    # virsh pool-define ~/guest_images_disk.xml
    Pool guest_images_disk defined from /root/guest_images_disk.xml
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    inactive   no
    
  4. ストレージプールを起動します。

    virshpool-start コマンドを使用してストレージプールを開始します。virshpool-list--all コマンドを使用してプールが開始されていることを確認します。
    # virsh pool-start guest_images_disk
    Pool guest_images_disk started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    active     no
    
  5. 自動起動をオンにします

    オンにするautostartストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するように libvirtd サービスを設定します。
    # virsh pool-autostart guest_images_disk
    Pool guest_images_disk marked as autostarted
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_disk    active     yes
    
  6. ストレージプールの設定を確認する

    ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のように報告されることを確認しますrunning
    # virsh pool-info guest_images_disk
    Name:           guest_images_disk
    UUID:           551a67c8-5f2a-012c-3844-df29b167431c
    State:          running
    Capacity:       465.76 GB
    Allocation:     0.00
    Available:      465.76 GB
    # ls -la /dev/sdb
    brw-rw----. 1 root disk 8, 16 May 30 14:08 /dev/sdb
    # virsh vol-list guest_images_disk
    Name                 Path
    -----------------------------------------
    
  7. オプション: 一時設定ファイルを削除します

    必要がない場合は、一時ストレージプールの XML 設定ファイルを削除します。
    # rm ~/guest_images_disk.xml
ディスクベースのストレージプールが利用可能になりました。

12.1.2. virsh を使用したストレージプールの削除

次に、virsh を使用してストレージプールを削除する方法を示します。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
    # virsh pool-destroy guest_images_disk
  2. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk

12.2. パーティションベースのストレージプール

このセクションでは、事前にフォーマットされたブロックデバイスであるパーティションをストレージプールとして使用する方法について説明します。
次の例では、ホスト物理マシンに 500GB のハードドライブ (/dev/sdc) が 1 つの 500GB の ext4 フォーマット済みパーティション (/dev/sdc1) にパーティション化されています。以下の手順でストレージプールを設定します。

12.2.1. virt-manager を使用したパーティションベースのストレージプールの作成

この手順では、ストレージデバイスのパーティションを使用して新しいストレージプールを作成します。

手順12.1 virt-manager を使用したパーティションベースのストレージプールの作成

  1. ストレージプールの設定を開きます

    1. virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストの物理マシンを選択します。
      Edit メニューを開き、Connection Details を選択します。

      図12.1 接続の詳細

      接続の詳細
    2. Connection Details ウィンドウの Storage タブをクリックします。

      図12.2 ストレージタブ

      ストレージタブ
  2. 新しいストレージプールを作成します

    1. 新しいプールの追加 (パート 1)

      + ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。
      ストレージプールの Name を選択します。この例では、guest_images_fs という名前を使用します。Typefs: Pre-Formatted Block Device に変更します。

      図12.3 ストレージプールの名前とタイプ

      ストレージプールの名前とタイプ
      Forward ボタンを押して続行します。
    2. 新しいプールの追加 (パート 2)

      Target PathFormat、および Source Path フィールドを変更します。

      図12.4 ストレージプールのパスと形式

      ストレージプールのパスと形式
      ターゲットパス
      Target Path フィールドに、ストレージプールのソースデバイスをマウントする場所を入力します。場所がまだ存在しない場合は、virt-manager がディレクトリーを作成します。
      形式
      Format リストからフォーマットを選択します。デバイスは選択したフォーマットでフォーマットされています。
      この例では、デフォルトの Red Hat Enterprise Linux ファイルシステムである ext4 ファイルシステムを使用しています。
      ソースパス
      Source Path フィールドにデバイスを入力します。
      この例では、/dev/sdc1 デバイスを使用しています。
      詳細を確認し、Finish ボタンを押してストレージプールを作成します。
  3. 新しいストレージプールを確認します

    新しいストレージプールは、数秒後に左側のストレージリストに表示されます。サイズが期待どおりに報告されていることを確認します。この例では 458.20 GB が空き です。State フィールドが新しいストレージプールを Active としてレポートしていることを確認します。
    ストレージプールを選択します。Autostart フィールドで、On Boot 時チェックボックスをクリックします。これにより、libvirtd サービスが開始するたびにストレージデバイスが確実に開始されます。

    図12.5 ストレージリストの確認

    ストレージリストの確認
    これでストレージプールが作成され、Connection Details ウィンドウを閉じます。

12.2.2. virt-manager を使用したストレージプールの削除

この手順は、ストレージプールを削除する方法を示しています。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。

    図12.6 停止アイコン

    停止アイコン
  2. ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。

12.2.3. virsh を使用したパーティションベースのストレージプールの作成

このセクションでは、virsh コマンドを使用したパーティションベースのストレージプールの作成について説明します。
警告
この手順は、ディスク全体をストレージプール (/dev/sdb など) として割り当てるのに使用しないでください。ゲストには、ディスク全体またはブロックデバイスへの書き込みアクセス権を付与しないでください。この方法は、パーティション (たとえば、/dev/sdb1) をストレージプールに割り当てる場合にのみ使用してください。

手順12.2 virsh を使用して事前にフォーマットされたブロックデバイスストレージプールを作成する

  1. ストレージプール定義を作成します

    virsh pool-define-as コマンドを使用して、新しいストレージプール定義を作成します。事前にフォーマットされたディスクをストレージプールとして定義するには、次の 3 つのオプションを提供する必要があります。
    パーティション名
    nameパラメーターは、ストレージプールの名前を決定します。この例では、以下の例で guest_images_fs という名前を使用しています。
    device
    deviceパラメーターにpath属性を指定すると、ストレージデバイスのデバイスパスが指定されます。この例では、パーティション /dev/sdc1 を使用しています。
    mountpoint
    フォーマットされたデバイスがマウントされるローカルファイルシステム上のmountpoint。マウントポイントディレクトリーが存在しない場合、virsh コマンドでディレクトリーを作成できます。
    この例では、ディレクトリー /guest_images が使用されています。
    # virsh pool-define-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
    Pool guest_images_fs defined
    
    これで、新しいプールとマウントポイントが作成されました。
  2. 新しいプールを確認する

    現在のストレージプールを一覧表示します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
  3. マウントポイントを作成します。

    virsh pool-build コマンドを使用して、事前にフォーマットされたファイルシステムストレージプールのマウントポイントを作成します。
    # virsh pool-build guest_images_fs
    Pool guest_images_fs built
    # ls -la /guest_images
    total 8
    drwx------.  2 root root 4096 May 31 19:38 .
    dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
  4. ストレージプールを起動します。

    virsh pool-start コマンドを使用して、ファイルシステムをマウントポイントにマウントし、プールを使用できるようにします。
    # virsh pool-start guest_images_fs
    Pool guest_images_fs started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     no
    
  5. 自動起動をオンにします

    デフォルトでは、virsh で定義されたストレージプールは、libvirtd が起動するたびに自動的に起動するように設定されていません。これを修正するには、virsh pool-autostart コマンドで自動開始を有効にします。ストレージプールは、libvirtd が起動するたびに自動的に起動するようになりました。
    # virsh pool-autostart guest_images_fs
    Pool guest_images_fs marked as autostarted
    
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     yes
    
  6. ストレージプールを確認します。

    ストレージプールが正しく作成され、報告されたサイズが期待どおりで、状態が running と報告されたことを確認します。ファイルシステムのマウントポイントに lost+found ディレクトリーがあり、デバイスがマウントされていることを確認します。
    # virsh pool-info guest_images_fs
    Name:           guest_images_fs
    UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
    State:          running
    Persistent:     yes
    Autostart:      yes
    Capacity:       458.39 GB
    Allocation:     197.91 MB
    Available:      458.20 GB
    # mount | grep /guest_images
    /dev/sdc1 on /guest_images type ext4 (rw)
    # ls -la /guest_images
    total 24
    drwxr-xr-x.  3 root root  4096 May 31 19:47 .
    dr-xr-xr-x. 25 root root  4096 May 31 19:38 ..
    drwx------.  2 root root 16384 May 31 14:18 lost+found
    

12.2.4. virsh を使用したストレージプールの削除

  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
    # virsh pool-destroy guest_images_disk
  2. オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
    # virsh pool-delete guest_images_disk
  3. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk

12.3. ディレクトリーベースのストレージプール

このセクションでは、ゲスト仮想マシンをホスト物理マシン上のディレクトリーに保存する方法について説明します。
ディレクトリーベースのストレージプールは、virt-manager または virsh コマンドラインツールを使用して作成できます。

12.3.1. virt-manager を使用したディレクトリーベースのストレージプールの作成

  1. ローカルディレクトリーを作成します

    1. オプション: ストレージプール用の新しいディレクトリーを作成します

      ストレージプール用のディレクトリーをホスト物理マシンに作成します。この例では、/guest virtual machine_images という名前のディレクトリーを使用しています。
      # mkdir /guest_images
    2. ディレクトリーの所有権を設定する

      ディレクトリーのユーザーとグループの所有権を変更します。ディレクトリーは root ユーザーが所有している必要があります。
      # chown root:root /guest_images
    3. ディレクトリーのアクセス許可を設定する

      ディレクトリーのファイル権限を変更します。
      # chmod 700 /guest_images
    4. 変更を確認します。

      権限が変更されたことを確認します。出力には、正しく設定された空のディレクトリーが表示されます。
      # ls -la /guest_images
      total 8
      drwx------.  2 root root 4096 May 28 13:57 .
      dr-xr-xr-x. 26 root root 4096 May 28 13:57 ..
      
  2. SELinux ファイルコンテキストを設定する

    新しいディレクトリーの正しい SELinux コンテキストを設定します。プールの名前とディレクトリーは一致している必要はないことに注意してください。ただし、ゲスト仮想マシンをシャットダウンすると、libvirt はコンテキストをデフォルト値に戻す必要があります。ディレクトリーのコンテキストによって、このデフォルト値が決まります。ディレクトリー virt_image_t に明示的にラベルを付けることは価値があります。これにより、ゲスト仮想マシンがシャットダウンされると、イメージに virt_image_t というラベルが付けられ、ホスト物理マシンで実行されている他のプロセスから分離されます。
    # semanage fcontext -a -t virt_image_t '/guest_images(/.*)?'
    # restorecon -R /guest_images
    
  3. ストレージプールの設定を開きます

    1. virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストの物理マシンを選択します。
      Edit メニューを開き、Connection Details を選択します。

      図12.7 接続詳細ウィンドウ

      接続詳細ウィンドウ
    2. Connection Details ウィンドウの Storage タブをクリックします。

      図12.8 ストレージタブ

      ストレージタブ
  4. 新しいストレージプールを作成します

    1. 新しいプールの追加 (パート 1)

      + ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。
      ストレージプールの Name を選択します。この例では、guest_images という名前を使用します。Typedir: Filesystem Directory に変更します。

      図12.9 ストレージプールに名前を付ける

      ストレージプールに名前を付ける
      Forward ボタンを押して続行します。
    2. 新しいプールの追加 (パート 2)

      Target Path フィールドを変更します。たとえば、/guest_images
      詳細を確認し、Finish ボタンを押してストレージプールを作成します。
  5. 新しいストレージプールを確認します

    新しいストレージプールは、数秒後に左側のストレージリストに表示されます。サイズが期待どおりに報告されていることを確認します。この例では 36.41 GB の空き 容量です。State フィールドが新しいストレージプールを Active としてレポートしていることを確認します。
    ストレージプールを選択します。Autostart フィールドで、On Boot チェックボックスがオンになっていることを確認します。これにより、libvirtd サービスが開始するたびにストレージプールが確実に開始されます。

    図12.10 ストレージプール情報を確認します

    ストレージプール情報を確認します
    これでストレージプールが作成され、Connection Details ウィンドウを閉じます。

12.3.2. virt-manager を使用したストレージプールの削除

この手順は、ストレージプールを削除する方法を示しています。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。

    図12.11 停止アイコン

    停止アイコン
  2. ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。

12.3.3. virsh を使用したディレクトリーベースのストレージプールの作成

  1. ストレージプール定義を作成します

    virsh pool-define-as コマンドを使用して、新しいストレージプールを定義します。ディレクトリーベースのストレージプールを作成するには、次の 2 つのオプションが必要です。
    • ストレージプールの name
      この例では、guest_images という名前を使用します。この例で使用されている以降のすべての virsh コマンドは、この名前を使用します。
    • ゲストイメージファイルを保存するためのファイルシステムディレクトリーへの path。このディレクトリーが存在しない場合は、virsh が作成します。
      この例では、/guest_images ディレクトリーを使用しています。
     # virsh pool-define-as guest_images dir - - - - "/guest_images"
    Pool guest_images defined
  2. ストレージプールがリストされていることを確認します

    ストレージプールオブジェクトが正しく作成され、状態が次のようにレポートすることを確認します inactive
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images     inactive   no
  3. ローカルディレクトリーを作成します

    次に示すように、virsh pool-build コマンドを使用して、ディレクトリー guest_images のディレクトリーベースのストレージプールを構築します (たとえば)。
    # virsh pool-build guest_images
    Pool guest_images built
    # ls -la /guest_images
    total 8
    drwx------.  2 root root 4096 May 30 02:44 .
    dr-xr-xr-x. 26 root root 4096 May 30 02:44 ..
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images     inactive   no
  4. ストレージプールを起動します。

    virsh コマンド pool-start を使用して、ディレクトリーストレージプールを有効にします。これにより、プールのボリュームをゲストディスクイメージとして使用できるようになります。
    # virsh pool-start guest_images
    Pool guest_images started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default             active     yes
    guest_images    active     no
    
  5. 自動起動をオンにします

    オンにするautostartストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するように libvirtd サービスを設定します。
    # virsh pool-autostart guest_images
    Pool guest_images marked as autostarted
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images         active     yes
    
  6. ストレージプールの設定を確認する

    ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のようにレポートされることを確認しますrunning。ゲスト仮想マシンが実行されていない場合でもプールにアクセスできるようにするには、Persistentyes として報告されていることを確認します。サービス開始時にプールを自動的に起動させたい場合は、Autostartyes と報告されていることを確認します。
    # virsh pool-info guest_images
    Name:           guest_images
    UUID:           779081bf-7a82-107b-2874-a19a9c51d24c
    State:          running
    Persistent:     yes
    Autostart:      yes
    Capacity:       49.22 GB
    Allocation:     12.80 GB
    Available:      36.41 GB
    
    # ls -la /guest_images
    total 8
    drwx------.  2 root root 4096 May 30 02:44 .
    dr-xr-xr-x. 26 root root 4096 May 30 02:44 ..
    #
    
ディレクトリーベースのストレージプールが利用可能になりました。

12.3.4. virsh を使用したストレージプールの削除

次に、virsh を使用してストレージプールを削除する方法を示します。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
    # virsh pool-destroy guest_images_disk
  2. オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
    # virsh pool-delete guest_images_disk
  3. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk

12.4. LVM ベースのストレージプール

本章では、LVM ボリュームグループをストレージプールとして使用する方法について説明します。
LVM ベースのストレージグループは、LVM の完全な柔軟性を提供します。
注記
現在、LVM ベースのストレージプールではシンプロビジョニングはできません。
注記
LVM の詳細は、Red Hat Enterprise Linux ストレージ管理ガイド を参照してください。
警告
LVM ベースのストレージプールには、完全なディスクパーティションが必要です。この手順で新しいパーティション/デバイスをアクティベートすると、パーティションはフォーマットされ、すべてのデータが削除されます。ホストの既存のボリュームグループ (VG) を使用すると、何も消去されません。以下の手順を開始する前に、ストレージデバイスのバックアップを作成することが推奨されます。

12.4.1. LVM ベースのストレージプールの作成 virt-manager を使用します。

LVM ベースのストレージプールは、既存の LVM ボリュームグループを使用することも、空のパーティションに新しい LVM ボリュームグループを作成することもできます。
  1. オプション:LVM ボリューム用の新しいパーティションを作成します

    これらの手順では、新しいハードディスクドライブに新しいパーティションと LVM ボリュームグループを作成する方法について説明します。
    警告
    この手順により、選択したストレージデバイスからすべてのデータが削除されます。
    1. 新しいパーティションの作成

      fdisk コマンドを使用して、コマンドラインから新しいディスクパーティションを作成します。次の例では、ストレージデバイス /dev/sdb にディスク全体を使用する新しいパーティションを作成しています。
      # fdisk /dev/sdb
      Command (m for help):
      
      nを押して、新しいパーティションを作成します。
    2. pを押して、プライマリーパーティションにします。
      Command action
         e   extended
         p   primary partition (1-4)
      
    3. 使用可能なパーティション番号を選択します。この例では、最初のパーティションは次のように入力して選択されます 1
      Partition number (1-4): 1
    4. Enterを押して、デフォルトの最初のシリンダーを入力します。
      First cylinder (1-400, default 1):
      
    5. パーティションのサイズを選択します。この例では、Enter を押してディスク全体を割り当てています。
      Last cylinder or +size or +sizeM or +sizeK (2-400, default 400):
      
    6. t を押して、パーティションの種類を設定します。
      Command (m for help): t
    7. 前の手順で作成したパーティションを選択します。この例では、パーティション番号は 1
      Partition number (1-4): 1
    8. Linux LVM パーティションの場合、8e を入力します。
      Hex code (type L to list codes): 8e
    9. 変更をディスクに書き込んで終了します。
      Command (m for help): w
      Command (m for help): q
    10. 新しい LVM ボリュームグループを作成する

      vgcreate コマンドを使用して新しい LVM ボリュームグループを作成します。この例では、guest_images_lvm という名前のボリュームグループを作成します。
      # vgcreate guest_images_lvm /dev/sdb1
        Physical volume "/dev/vdb1" successfully created
        Volume group "guest_images_lvm" successfully created
      
    新しい LVM ボリュームグループ guest_images_lvm を、LVM ベースのストレージプールに使用できるようになりました。
  2. ストレージプールの設定を開きます

    1. virt-manager のグラフィカルインターフェイスで、メインウィンドウからホストを選択します。
      Edit メニューを開き、Connection Details を選択します。

      図12.12 接続の詳細

      接続の詳細
    2. Storage タブをクリックします。

      図12.13 ストレージタブ

      ストレージタブ
  3. 新しいストレージプールを作成します

    1. ウィザードを開始します

      + ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。
      ストレージプールの Name を選択します。この例では、guest_images_lvm を使用します。次に、Typelogical: LVM Volume Group に変更します。また、

      図12.14 LVM ストレージプールを追加する

      LVM ストレージプールを追加する
      Forward ボタンを押して続行します。
    2. 新しいプールの追加 (パート 2)

      Target Path フィールドを変更します。この例では /guest_images を使用しています。
      次に、Target Path フィールドと Source Path フィールドに入力し、Build Pool チェックボックスをオンにします。
      • Target Path フィールドを使用して、既存の LVM ボリュームグループを選択する 、新しいボリュームグループの名前として使用します。デフォルトの形式は /dev/storage_pool_name
        この例では、/dev/guest_images_lvm という名前の新しいボリュームグループを使用しています。
      • 既存の LVM ボリュームグループが Target Path で使用されている場合、Source Path フィールドはオプションです。
        新しい LVM ボリュームグループの場合は、Source Path フィールドにストレージデバイスの場所を入力します。この例では、空白のパーティション /dev/sdc を使用しています。
      • Build Pool チェックボックスは、virt-manager に新しい LVM ボリュームグループを作成するように指示します。既存のボリュームグループを使用している場合は、Build Pool チェックボックスを選択しないでください。
        この例では、空白のパーティションを使用して新しいボリュームグループを作成しているため、Build Pool チェックボックスをオンにする必要があります。

      図12.15 ターゲットとソースを追加する

      ターゲットとソースを追加する
      詳細を確認し、Finish ボタンを押して LVM ボリュームグループをフォーマットし、ストレージプールを作成します。
    3. フォーマットするデバイスを確認します

      警告メッセージが表示されます。

      図12.16 警告メッセージ

      警告メッセージ
      Yes ボタンを押して、ストレージデバイス上のすべてのデータを消去し、ストレージプールを作成します。
  4. 新しいストレージプールを確認します

    新しいストレージプールは、数秒後に左側のリストに表示されます。詳細が期待どおりであることを確認します。この例では、465.76 GB が空きです。また、State フィールドが新しいストレージプールをActive としてレポートしていることを確認します。
    ストレージプールが libvirtd で自動的に開始されるようにするには、通常、Autostart チェックボックスを有効にすることをお勧めします。

    図12.17 LVM ストレージプールの詳細を確認する

    LVM ストレージプールの詳細を確認する
    タスクが完了したら、ホストの詳細ダイアログを閉じます。

12.4.2. virt-manager を使用したストレージプールの削除

この手順は、ストレージプールを削除する方法を示しています。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。

    図12.18 停止アイコン

    停止アイコン
  2. ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。

12.4.3. virsh を使用した LVM ベースのストレージプールの作成

このセクションでは、virsh コマンドを使用して LVM ベースのストレージプールを作成するために必要な手順の概要を説明します。単一のドライブ (/dev/sdc) からの guest_images_lvm という名前のプールの例を使用します。これは単なる例であり、設定は必要に応じて置き換える必要があります。

手順12.3 virsh を使用した LVM ベースのストレージプールの作成

  1. プール名 guest_images_lvm を定義します。
    # virsh pool-define-as guest_images_lvm logical - - /dev/sdc libvirt_lvm \ /dev/libvirt_lvm
    Pool guest_images_lvm defined
    
  2. 指定された名前に従ってプールを構築します。既存のボリュームグループを使用している場合は、この手順をスキップしてください。
    # virsh pool-build guest_images_lvm
    
    Pool guest_images_lvm built
    
  3. 新しいプールを初期化します。
    # virsh pool-start guest_images_lvm
    
    Pool guest_images_lvm started
    
  4. vgs コマンドを使用してボリュームグループ情報を表示します。
    # vgs
    VG          #PV #LV #SN Attr   VSize   VFree
    libvirt_lvm   1   0   0 wz--n- 465.76g 465.76g
    
  5. 自動的に開始するようにプールを設定します。
    # virsh pool-autostart guest_images_lvm
    Pool guest_images_lvm marked as autostarted
    
  6. virsh コマンドを使用して、使用可能なプールを一覧表示します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_lvm     active     yes
    
  7. 次のコマンドは、このプール内に 3 つのボリューム (volume1volume2、および volume3) を作成する方法を示しています。
    # virsh vol-create-as guest_images_lvm volume1 8G
    Vol volume1 created
    
    # virsh vol-create-as guest_images_lvm volume2 8G
    Vol volume2 created
    
    # virsh vol-create-as guest_images_lvm volume3 8G
    Vol volume3 created
    
  8. virsh コマンドを使用して、このプールで使用可能なボリュームをリストします。
    # virsh vol-list guest_images_lvm
    Name                 Path
    -----------------------------------------
    volume1              /dev/libvirt_lvm/volume1
    volume2              /dev/libvirt_lvm/volume2
    volume3              /dev/libvirt_lvm/volume3
    
  9. 次の 2 つのコマンド (lvscan および lvs) は、新しく作成されたボリュームに関する詳細情報を表示します。
    # lvscan
    ACTIVE            '/dev/libvirt_lvm/volume1' [8.00 GiB] inherit
    ACTIVE            '/dev/libvirt_lvm/volume2' [8.00 GiB] inherit
    ACTIVE            '/dev/libvirt_lvm/volume3' [8.00 GiB] inherit
    
    # lvs
    LV       VG            Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert
    volume1  libvirt_lvm   -wi-a-   8.00g
    volume2  libvirt_lvm   -wi-a-   8.00g
    volume3  libvirt_lvm   -wi-a-   8.00g
    

12.4.4. virsh を使用したストレージプールの削除

次に、virsh を使用してストレージプールを削除する方法を示します。
  1. 同じプールを使用している他のゲストとの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
    # virsh pool-destroy guest_images_disk
  2. オプションで、ストレージプールが存在するディレクトリーを削除する場合は、次のコマンドを使用します。
    # virsh pool-delete guest_images_disk
  3. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk

12.5. iSCSI ベースのストレージプール

このセクションでは、iSCSI ベースのデバイスを使用してゲスト仮想マシンを格納する方法について説明します。
iSCSI (Internet Small Computer System Interface) は、ストレージデバイスを共有するネットワークプロトコルです。iSCSI は、IP 層で SCSI 命令を使用してイニシエーター (ストレージクライアント) をターゲット (ストレージサーバー) に接続します。

12.5.1. ソフトウェア iSCSI ターゲットの設定

scsi-target-utils パッケージは、ソフトウェアでバックアップされた iSCSI ターゲットを作成するためのツールです。

手順12.4 iSCSI ターゲットの作成

  1. 必要なパッケージのインストール

    scsi-target-utils パッケージと依存するすべてのパッケージをインストールします。
    # yum install scsi-target-utils
  2. tgtd サービスを開始します

    tgtd サービスは物理マシンの SCSI ターゲットをホストし、iSCSI プロトコルを使用して物理マシンターゲットをホストします。tgtd サービスを開始し、chkconfig コマンドで再起動した後、サービスを永続化します。
    # service tgtd start
    # chkconfig tgtd on
  3. オプション:LVM ボリュームを作成する

    LVM ボリュームは、iSCSI バッキングイメージに役立ちます。LVM スナップショットとサイズ変更は、ゲスト仮想マシンにとって有益な場合があります。この例では、iSCSI を使用してゲスト仮想マシンをホストするために、RAID5 アレイ上の virtstore という名前の新しいボリュームグループに virtimage1 という名前の LVM イメージを作成します。
    1. RAID アレイを作成する

      ソフトウェア RAID5 アレイの作成については、Red Hat Enterprise Linux デプロイメントガイド で説明されています。
    2. LVM ボリュームグループを作成する

      vgcreate コマンドを使用して、virtstore という名前のボリュームグループを作成します。
      # vgcreate virtstore /dev/md1
    3. LVM 論理ボリュームを作成する

      lvcreate コマンドを使用して、サイズが 20GB の virtstore ボリュームグループに virtimage1 という名前の論理ボリュームグループを作成します。
      # lvcreate --size 20G -n virtimage1 virtstore
      新しい論理ボリューム virtimage1 は、iSCSI で使用する準備ができています。
  4. オプション: ファイルベースのイメージを作成します

    テストにはファイルベースのストレージで十分ですが、実稼働環境や重要な I/O アクティビティーにはお勧めしません。このオプションの手順では、iSCSI ターゲット用に virtimage2.img という名前のファイルベースのイメージを作成します。
    1. イメージの新しいディレクトリーを作成します

      イメージを保存するための新しいディレクトリーを作成します。ディレクトリーには正しい SELinux コンテキストが必要です。
      # mkdir -p /var/lib/tgtd/virtualization
    2. イメージファイルを作成する

      サイズが 10GB の virtimage2.img という名前のイメージを作成します。
      # dd if=/dev/zero of=/var/lib/tgtd/virtualization/virtimage2.img bs=1M seek=10000 count=0
    3. SELinux ファイルコンテキストを設定する

      新しいイメージとディレクトリーの正しい SELinux コンテキストを設定します。
      # restorecon -R /var/lib/tgtd
      新しいファイルベースのイメージ virtimage2.img は、iSCSI で使用する準備ができています。
  5. ターゲットを作成する

    ターゲットは、XML エントリーを /etc/tgt/targets.conf ファイルに追加することで作成できます。target 属性には、iSCSI Qualified Name (IQN) が必要です。IQN の形式は次のとおりです。
    iqn.yyyy-mm.reversed domain name:optional identifier text
    詳細は以下のようになります。
    • yyyy-mmは、デバイスが開始された年と月を表します (例: 2010-05)。
    • 逆ドメイン名 は、逆のホスト物理マシンのドメイン名です (たとえば、IQN の server1.example.comcom.example.server1 になります)。と
    • オプションの識別子テキスト は、スペースを含まない任意のテキスト文字列であり、管理者がデバイスまたはハードウェアを識別するのに役立ちます。
    この例では、server1.example.com のオプションの手順で作成された 2 種類のイメージの iSCSI ターゲットを、オプションの識別子 トライアル を使用して作成します。/etc/tgt/targets.conf ファイルに以下を追加します。
    <target iqn.2010-05.com.example.server1:iscsirhel6guest>
       backing-store /dev/virtstore/virtimage1  #LUN 1
       backing-store /var/lib/tgtd/virtualization/virtimage2.img  #LUN 2
       write-cache off
    </target>
    
    /etc/tgt/targets.conf ファイルにdefault-driver iscsiドライバータイプを iSCSI として設定する行。ドライバーはデフォルトで iSCSI を使用します。
    重要
    この例では、アクセス制御なしでグローバルにアクセス可能なターゲットを作成します。安全なアクセスの実装については、scsi-target-utils を参照してください。
  6. tgtd サービスを再起動します

    tgtd サービスを再起動して、設定の変更を再ロードします。
    # service tgtd restart
  7. iptable の設定

    iptables を使用した iSCSI アクセス用にポート 3260 を開きます。
    # iptables -I INPUT -p tcp -m tcp --dport 3260 -j ACCEPT
    # service iptables save
    # service iptables restart
  8. 新しいターゲットを確認します

    新しいターゲットを表示して、tgt-admin--show コマンドでセットアップが成功したことを確認します。
    # tgt-admin --show
    Target 1: iqn.2010-05.com.example.server1:iscsirhel6guest
    System information:
    Driver: iscsi
    State: ready
    I_T nexus information:
    LUN information:
    LUN: 0
        Type: controller
        SCSI ID: IET     00010000
        SCSI SN: beaf10
        Size: 0 MB
        Online: Yes
        Removable media: No
        Backing store type: rdwr
        Backing store path: None
    LUN: 1
        Type: disk
        SCSI ID: IET     00010001
        SCSI SN: beaf11
        Size: 20000 MB
        Online: Yes
        Removable media: No
        Backing store type: rdwr
        Backing store path: /dev/virtstore/virtimage1
    LUN: 2
        Type: disk
        SCSI ID: IET     00010002
        SCSI SN: beaf12
        Size: 10000 MB
        Online: Yes
        Removable media: No
        Backing store type: rdwr
        Backing store path: /var/lib/tgtd/virtualization/virtimage2.img
    Account information:
    ACL information:
    ALL
    
    警告
    ACL リストは all に設定されています。これにより、ローカルネットワーク上のすべてのシステムがこのデバイスにアクセスできるようになります。実稼働環境用にホスト物理マシンアクセス ACL を設定することをお勧めします。
  9. オプション: テスト検出

    新しい iSCSI デバイスが検出可能かどうかをテストします。
    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    127.0.0.1:3260,1 iqn.2010-05.com.example.server1:iscsirhel6guest
  10. オプション: デバイスの接続をテストします

    新しいデバイス (iqn.2010-05.com.example.server1:iscsirhel6guest) を接続して、デバイスを接続できるかどうかを判断します。
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260] successful.
    デバイスの取り外し
    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel6guest, portal: 10.0.0.1,3260] successful.
これで、iSCSI デバイスを仮想化に使用する準備が整いました。

12.5.2. virt-manager への iSCSI ターゲットの追加

この手順では、virt-manager で iSCSI ターゲットを使用してストレージプールを作成する方法について説明します。

手順12.5 virt-manager への iSCSI デバイスの追加

  1. ホスト物理マシンのストレージタブを開きます

    Connection Details ウィンドウの Storage タブを開きます。
    1. virt-manager を開きます。
    2. メインの virt-manager ウィンドウからホスト物理マシンを選択します。Edit menu をクリックして、Connection Details を選択します。

      図12.19 接続の詳細

      接続の詳細
    3. Storage タブをクリックします。

      図12.20 ストレージメニュー

      ストレージメニュー
  2. 新しいプールの追加 (パート 1)

    + ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。

    図12.21 iscsi ストレージプールの名前とタイプを追加します

    iscsi ストレージプールの名前とタイプを追加します
    ストレージプールの名前を選択し、タイプを iscsi に変更し、Forward を押して続行します。
  3. 新しいプールの追加 (パート 2)

    このメニューのフィールドを完成させるには、「iSCSI ベースのストレージプール」手順12.4「iSCSI ターゲットの作成」 で使用した情報が必要です。
    1. iSCSI ソースとターゲットを入力します。フォーマットはゲスト仮想マシンによって処理されるため、Format オプションは使用できません。Target Path を編集することはお勧めしません。デフォルトのターゲットパス値 /dev/disk/by-path/ は、そのディレクトリーにドライブパスを追加します。ターゲットパスは、移行するすべてのホスト物理マシンで同じである必要があります。
    2. iSCSI ターゲットのホスト名または IP アドレスを入力します。この例では host1.example.com を使用しています。
    3. Source Path フィールドに、iSCSI ターゲット IQN を入力します。「iSCSI ベースのストレージプール」手順12.4「iSCSI ターゲットの作成」 を見ると、これは /etc/tgt/targets.conf ファイルで追加した情報であることがわかります。この例では iqn.2010-05.com.example.server1:iscsirhel6guest を使用しています。
    4. IQN チェックボックスをオンにして、イニシエータの IQN を入力します。この例では iqn.2010-05.com.example.host1:iscsirhel6 を使用しています。
    5. Finish をクリックして、新しいストレージプールを作成します。

    図12.22 iscsi ストレージプールを作成する

    iscsi ストレージプールを作成する

12.5.3. virt-manager を使用したストレージプールの削除

この手順は、ストレージプールを削除する方法を示しています。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。

    図12.23 停止アイコン

    停止アイコン
  2. ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。

12.5.4. virsh を使用した iSCSI ベースのストレージプールの作成

  1. pool-define-as を使用して、コマンドラインからプールを定義します

    ストレージプールの定義は、virsh コマンドラインツールを使用して作成できます。virsh を使用してストレージプールを作成すると、システム管理者がスクリプトを使用して複数のストレージプールを作成する場合に役立ちます。
    virsh pool-define-as コマンドには、次の形式で受け入れられるいくつかのパラメーターがあります。
    virsh pool-define-as name type source-host source-path source-dev source-name target
    パラメーターの説明は次のとおりです。
    type
    このプールを特定のタイプ、たとえば iscsi として定義します
    name
    一意である必要があり、ストレージプールの名前を設定します
    source-host および source-path
    それぞれホスト名と iSCSIIQN
    source-dev および source-name
    これらのパラメーターは iSCSI ベースのプールには必要ありません。フィールドを空白のままにするには、- 文字を使用します。
    target
    ホスト物理マシンに iSCSI デバイスをマウントする場所を定義します
    以下の例では、前の手順と同じ iSCSI ベースのストレージプールを作成します。
    #   virsh pool-define-as --name scsirhel6guest --type iscsi \
         --source-host server1.example.com \
         --source-dev iqn.2010-05.com.example.server1:iscsirhel6guest
         --target /dev/disk/by-path
    Pool iscsirhel6guest defined
  2. ストレージプールがリストされていることを確認します

    ストレージプールオブジェクトが正しく作成され、状態が次のように報告されることを確認しますinactive
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel6guest      inactive   no
  3. ストレージプールを起動します。

    これには、virsh コマンド pool-start を使用します。pool-start は、ディレクトリーストレージプールを有効にし、ボリュームとゲスト仮想マシンに使用できるようにします。
    # virsh pool-start guest_images_disk
    Pool guest_images_disk started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel6guest      active     no
    
  4. 自動起動をオンにします

    オンにするautostartストレージプール用。Autostart は、サービスの開始時にストレージプールを開始するように libvirtd サービスを設定します。
    # virsh pool-autostart iscsirhel6guest
    Pool iscsirhel6guest marked as autostarted
    iscsirhel6guest プールに自動開始が設定されていることを確認します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    iscsirhel6guest      active     yes
    
  5. ストレージプールの設定を確認する

    ストレージプールが正しく作成され、サイズが正しく報告され、状態が次のように報告されることを確認しますrunning
    # virsh pool-info iscsirhel6guest
    Name:           iscsirhel6guest
    UUID:           afcc5367-6770-e151-bcb3-847bc36c5e28
    State:          running
    Persistent:     unknown
    Autostart:      yes
    Capacity:       100.31 GB
    Allocation:     0.00
    Available:      100.31 GB
    
iSCSI ベースのストレージプールが利用可能になりました。

12.5.5. virsh を使用したストレージプールの削除

次に、virsh を使用してストレージプールを削除する方法を示します。
  1. 同じプールを使用している他のゲスト仮想マシンでの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。
    # virsh pool-destroy guest_images_disk
  2. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk

12.6. NFS ベースのストレージプール

この手順では、virt-manager で NFS マウントポイントを使用してストレージプールを作成する方法について説明します。

12.6.1. virt-manager を使用した NFS ベースのストレージプールの作成

  1. ホスト物理マシンのストレージタブを開きます

    Host Details ウィンドウで Storage タブを開きます。
    1. virt-manager を開きます。
    2. メインの virt-manager ウィンドウからホスト物理マシンを選択します。Edit menu をクリックして、Connection Details を選択します。

      図12.24 接続の詳細

      接続の詳細
    3. Storage タブをクリックします。

      図12.25 ストレージタブ

      ストレージタブ
  2. 新しいプールを作成する (パート 1)

    + ボタン (プールの追加ボタン) を押します。Add a New Storage Pool ウィザードが表示されます。

    図12.26 NFS 名とタイプを追加します

    NFS 名とタイプを追加します
    ストレージプールの名前を選択し、Forward を押して続行します。
  3. 新しいプールを作成する (パート 2)

    デバイスのターゲットパス、ホスト名、および NFS 共有パスを入力します。Format オプションを NFS または auto (タイプを検出するため) に設定します。ターゲットパスは、移行するすべてのホスト物理マシンで同一である必要があります。
    NFS サーバーのホスト名または IP アドレスを入力します。この例では server1.example.com を使用しています。
    NFS パスを入力します。この例では /nfstrial を使用しています。

    図12.27 NFS ストレージプールを作成する

    NFS ストレージプールを作成する
    Finish を押して、新しいストレージプールを作成します。

12.6.2. virt-manager を使用したストレージプールの削除

この手順は、ストレージプールを削除する方法を示しています。
  1. 同じプールを使用している他のゲストとの問題を回避するには、ストレージプールを停止し、使用中のリソースを解放することをお勧めします。これを行うには、停止するストレージプールを選択し、ストレージウィンドウの下部にある赤い X アイコンをクリックします。

    図12.28 停止アイコン

    停止アイコン
  2. ごみ箱アイコンをクリックして、ストレージプールを削除します。このアイコンは、最初にストレージプールを停止した場合にのみ有効になります。

12.7. GlusterFS ストレージプール

GlusterFS は、FUSE を使用するユーザースペースファイルシステムです。ゲスト仮想マシンで有効にすると、KVM ホスト物理マシンが 1 つ以上の GlusterFS ストレージボリュームからゲスト仮想マシンイメージを起動し、GlusterFS ストレージボリュームからのイメージをゲスト仮想マシンのデータディスクとして使用できるようになります。
重要
Red Hat Red Hat Enterprise Linux 6 は、ストレージプールでの GlusterFS の使用をサポートしていません。ただし、Red Hat Enterprise Linux 6.5 以降には、libgfapi ライブラリーを使用して GlusterFS で仮想マシンを作成するためのネイティブサポートが含まれています。

12.8. SCSI デバイスでの NPIV 仮想アダプター (vHBA) の使用

NPIV (N_Port ID Virtualization) は、1 つの物理ファイバーチャンネルのホストバスアダプター (HBA) の共有を可能にするソフトウェアテクノロジーです。
これにより、複数のゲストが複数の物理ホストから同じストレージを認識できるため、ストレージの移行パスが容易になります。そのため、正しいストレージパスが指定されていれば、移行を使用してストレージを作成またはコピーする必要はありません。
仮想化では、仮想ホストバスアダプター (vHBA) が仮想マシンの LUN を制御します。各 vHBA は、独自の WWNN(ワールドワイドノード名) と WWPN(ワールドワイドポート名) によって識別されます。ストレージのパスは、WWNN および WWPN の値で決定します。
このセクションでは、仮想マシン上で vHBA を設定するための手順を説明します。Red Hat Enterprise Linux 6 は、ホストの再起動後の永続的な vHBA 設定をサポートしていないことに注意してください。ホストの再起動後に vHBA 関連の設定を確認します。

12.8.1. vHBA の作成

手順12.6 vHBA の作成

  1. ホストシステムで HBA の場所を特定します。

    ホストシステム上の HBA を見つけるには、ホストシステム上の SCSI デバイスを調べ、vport 機能を持つ scsi_host を見つけます。
    以下のコマンドを実行し、scsi_host リストを取得します。
    # virsh nodedev-list --cap scsi_host
    scsi_host0
    scsi_host1
    scsi_host2
    scsi_host3
    scsi_host4
    
    scsi_hostについて、次のコマンドを実行して、デバイス XML の行 <capability type='vport_ops'> を調べます。これは、vport ケーパビリティを持つ scsi_host を示しています。
    # virsh nodedev-dumpxml scsi_hostN
  2. HBA の詳細を確認します。

    virsh nodedev-dumpxml HBA_device コマンドを実行して、HBA の詳細を表示します。
    virsh nodedev-dumpxml コマンドからの XML 出力には、フィールドが一覧表示されます <name><wwnn>、と<wwpn>、vHBA の作成に使用されます。<max_vports> の値は、サポートされる vHBA の最大数を示しています。
     # virsh nodedev-dumpxml scsi_host3
    <device>
      <name>scsi_host3</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
      <parent>pci_0000_10_00_0</parent>
      <capability type='scsi_host'>
        <host>3</host>
        <capability type='fc_host'>
          <wwnn>20000000c9848140</wwnn>
          <wwpn>10000000c9848140</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
        <capability type='vport_ops'>
          <max_vports>127</max_vports>
          <vports>0</vports>
        </capability>
      </capability>
    </device>
    この例では、<max_vports> には、HBA 設定で使用できる仮想ポートが 127 個あることを示しています。<vports> 値は、現在使用されている仮想ポートの数を示します。この値は、vHBA の作成後に更新されます。
  3. vHBA ホストデバイスの作成

    vHBA ホスト用に次のような XML ファイル (この例では vhba_host3.xml という名前) を作成します。
    # cat vhba_host3.xml
       <device>
         <parent>scsi_host3</parent>
         <capability type='scsi_host'>
           <capability type='fc_host'>
           </capability>
         </capability>
       </device>
    <parent> フィールドは、この vHBA デバイスに関連付ける HBA デバイスを指定します。 <device>タグの詳細は、ホスト用の新しい vHBA デバイスを作成するために、次の手順で使用されます。nodedevXML フォーマットの詳細は、http://libvirt.org/formatnode.htmlを参照してください。
  4. vHBA ホストデバイスに新しい vHBA を作成します。

    vhba_host3 に vHBA を作成するには、virshnodedev-create コマンドを使用します。
    # virsh nodedev-create vhba_host3.xml
    Node device scsi_host5 created from vhba_host3.xml
  5. vHBA の確認

    virsh nodedev-dumpxml コマンドを使用して、新しい vHBA の詳細 (scsi_host5) を確認します。
    # virsh nodedev-dumpxml scsi_host5
    <device>
      <name>scsi_host5</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <host>5</host>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>

12.8.2. vHBA を使用したストレージプールの作成

vHBA 設定を保持するために、vHBA に基づいて libvirt ストレージプールを定義することをお勧めします。
ストレージプールを使用することには、2 つの主な利点があります。
  • libvirt コードは、virsh コマンドの出力を使用すると、LUN のパスを簡単に見つけることができます。また、
  • 仮想マシンの移行には、ターゲットマシンで同じ vHBA 名を持つストレージプールの定義と起動のみが必要です。これを行うには、仮想マシンの XML 設定で、vHBA LUN、libvirt ストレージプール、およびボリューム名を指定する必要があります。例は、「vHBALUN を使用するように仮想マシンを設定する」 を参照してください。
  1. SCSI ストレージプールを作成する

    vHBA 設定を作成するには、まず vHBA に基づいて libvirt 'scsi' ストレージプール XML ファイルを以下のフォーマットで作成します。
    注記
    手順12.6「vHBA の作成」 で作成した vHBA をホスト名として使用することを確認し、vHBA 名 scsi_hostNhostN に修正してストレージプール設定に使用します。この例では、vHBA の名前は scsi_host5 であり、Red Hat Enterprise Linux6 libvirt ストレージプールで <adaptername='host5'/> として指定されています。
    <path>の値には、システム上の /dev/disk/by-{path|id|uuid|label} の いずれかの場所など、安定した場所を使用することをお勧めします。<path>および<target>内の要素の詳細は、http://libvirt.org/formatstorage.htmlを参照してください。
    この例では、'scsi'ストレージプールの名前は vhbapool_host3.xml です。
      <pool type='scsi'>
         <name>vhbapool_host3</name>
         <uuid>e9392370-2917-565e-692b-d057f46512d6</uuid>
         <capacity unit='bytes'>0</capacity>
         <allocation unit='bytes'>0</allocation>
         <available unit='bytes'>0</available>
         <source>
           <adapter name='host5'/>
         </source>
          <target>
            <path>/dev/disk/by-path</path>
            <permissions>
              <mode>0700</mode>
              <owner>0</owner>
              <group>0</group>
            </permissions>
          </target>
        </pool>
  2. プールを定義する

    ストレージプール (この例では vhbapool_host3 という名前) を定義するには、virshpool-define コマンドを使用します。
             # virsh pool-define vhbapool_host3.xml
             Pool vhbapool_host3 defined from vhbapool_host3.xml
    
  3. プールを開始します

    次のコマンドでストレージプールを開始します。
    # virsh pool-start vhbapool_host3
    Pool vhbapool_host3 started
    
  4. 自動起動を有効にする

    最後に、後続のホストの再起動で仮想マシンで使用する vHBA が自動的に定義されるようにするには、ストレージプールの自動開始機能を設定します (この例では、vhbapool_host3 という名前のプールに対して)。
    # virsh pool-autostart vhbapool_host3

12.8.3. vHBALUN を使用するように仮想マシンを設定する

vHBA のストレージプールが作成されたら、vHBALUN を仮想マシン設定に追加します。
  1. 利用可能な LUN を見つける

    まず、virsh vol-list コマンドを使用して、vHBA で使用可能な LUN のリストを生成します。以下に例を示します。
    # virsh vol-list vhbapool_host3
     Name                 Path
    ------------------------------------------------------------------------------
     unit:0:4:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
     unit:0:5:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
    表示される LUN 名のリストは、仮想マシン設定でディスクボリュームとして使用できます。
  2. vHBALUN を仮想マシンに追加します

    仮想マシンの XML で指定して、仮想マシン に vHBA LUN を追加します。
    • <disk>パラメーターに、lun または disk としてデバイスタイプを指定し
    • は、<source> パラメーターでソースデバイスを指定します。これは、/dev/sdaN として入力することも、udev によって生成されたシンボリックリンクとして /dev/disk/by-path|by-id|by-uuid|by-label として入力することもできます。これは、virsh vol-list pool コマンドを実行することで見つけることができます。
    以下に例を示します。
       <disk type='block' device='lun'>
         <driver name='qemu' type='raw'/>
         <source dev='/dev/disk/by-path/pci-0000\:04\:00.1-fc-0x203400a0b85ad1d7-lun-0'/>
         <target dev='sda' bus='scsi'/>
       </disk>
    
    

12.8.4. vHBA ストレージプールを破棄する

vHBA ストレージプールは、virshpool-destroy コマンドで破棄できます。
# virsh pool-destroy vhbapool_host3
次のコマンドで vHBA を削除します
# virsh nodedev-destroy scsi_host5
プールと vHBA が破棄されたことを確認するには、次のコマンドを実行します。
# virsh nodedev-list --cap scsi_host
scsi_host5 結果のリストに表示されなくなります。

第13章 ボリューム

13.1. ボリュームの作成

このセクションでは、ブロックベースのストレージプール内にディスクボリュームを作成する方法を示します。以下の例では、virsh vol-create-as コマンドは、guest_images_disk ストレージプール内に GB 単位の特定のサイズのストレージボリュームを作成します。このコマンドは必要なボリュームごとに繰り返されるため、例に示すように 3 つのボリュームが作成されます。
# virsh vol-create-as guest_images_disk volume1 8G
Vol volume1 created

# virsh vol-create-as guest_images_disk volume2 8G
Vol volume2 created

# virsh vol-create-as guest_images_disk volume3 8G
Vol volume3 created

# virsh vol-list guest_images_disk
Name                 Path
-----------------------------------------
volume1              /dev/sdb1
volume2              /dev/sdb2
volume3              /dev/sdb3

# parted -s /dev/sdb print
Model: ATA ST3500418AS (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
2      17.4kB  8590MB  8590MB               primary
3      8590MB  17.2GB  8590MB               primary
1      21.5GB  30.1GB  8590MB               primary

13.2. クローンボリューム

新しいボリュームは、複製されるボリュームと同じストレージプール内のストレージから割り当てられます。virsh vol-clone には、クローンを作成するボリュームを含むストレージプールの名前を指定する --pool 引数が必要です。コマンドの残りの部分では、クローンを作成するボリューム (volume3) と、クローンを作成した新しいボリュームの名前 (clone1) を指定します。virsh vol-list コマンドは、ストレージプール (guest_images_disk) に存在するボリュームを一覧表示します。
# virsh vol-clone --pool guest_images_disk volume3 clone1
Vol clone1 cloned from volume3

# virsh vol-list guest_images_disk
Name                 Path
-----------------------------------------
volume1              /dev/sdb1
volume2              /dev/sdb2
volume3              /dev/sdb3
clone1               /dev/sdb4


# parted -s /dev/sdb print
Model: ATA ST3500418AS (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    File system  Name     Flags
1      4211MB  12.8GB  8595MB  primary
2      12.8GB  21.4GB  8595MB  primary
3      21.4GB  30.0GB  8595MB  primary
4      30.0GB  38.6GB  8595MB  primary

13.3. ゲストへのストレージデバイスの追加

このセクションでは、ゲストへのストレージデバイスの追加について説明します。追加のストレージは、必要な場合にのみ追加できます。

13.3.1. ゲストへのファイルベースストレージの追加

ファイルベースのストレージは、ゲストの仮想化ハードドライブとして機能するホスト物理マシンのファイルシステムに保存されるファイルのコレクションです。ファイルベースのストレージを追加するには、次の手順を実行します。

手順13.1 ファイルベースのストレージの追加

  1. ストレージファイルを作成するか、既存のファイル (IMG ファイルなど) を使用します。次のコマンドは両方とも、ゲストの追加ストレージとして使用できる 4GB のファイルを作成することに注意してください。
    • ファイルベースのストレージイメージには、事前に割り当てられたファイルをお勧めします。次に示すように、次の dd コマンドを使用して、事前に割り当てられたファイルを作成します。
      # dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1M count=4096
    • または、事前に割り当てられたファイルの代わりにスパースファイルを作成します。スパースファイルははるかに高速に作成され、テストに使用できますが、データの整合性とパフォーマンスの問題があるため、実稼働環境にはお勧めしません。
      # dd if=/dev/zero of=/var/lib/libvirt/images/FileName.img bs=1M seek=4096 count=0
  2. 新しいファイルに <disk> 要素を書き込んで、追加のストレージを作成します。この例では、このファイルは NewStorage.xml と呼ばれます。
    <disk> 要素は、ディスクのソースと仮想ブロックデバイスのデバイス名を記述します。デバイス名は、ゲスト内のすべてのデバイスで一意である必要があり、ゲストが仮想ブロックデバイスを見つけるバスを識別します。次の例では、ソースが FileName.img という名前のファイルベースのストレージコンテナーである virtio ブロックデバイスを定義しています。
    <disk type='file' device='disk'>
       <driver name='qemu' type='raw' cache='none'/>
       <source file='/var/lib/libvirt/images/FileName.img'/>
       <target dev='vdb'/>
    </disk>
    
    デバイス名は hd または sd で始めることもでき、それぞれ IDE と SCSI ディスクを識別します。設定ファイルには、新しいデバイスのバス上の位置を指定する <address> サブ要素を含めることもできます。virtio ブロックデバイスの場合、これは PCI アドレスである必要があります。<address> サブ要素を省略すると、libvirt は次に使用可能な PCI スロットを見つけて割り当てることができます。
  3. 次のように CD-ROM を接続します。
    <disk type='file' device='cdrom'>
       <driver name='qemu' type='raw' cache='none'/>
       <source file='/var/lib/libvirt/images/FileName.img'/>
       <readonly/>
       <target dev='hdc'/>
    </disk >
    
  4. NewStorage.xml で定義されたデバイスをゲスト (Guest1) とともに追加します。
    # virsh attach-device --config Guest1 ~/NewStorage.xml
    注記
    この変更は、ゲストが破棄されて再起動された後にのみ適用されます。さらに、永続デバイスは、永続ドメイン、つまり virsh define コマンドで設定が保存されたドメインにのみ追加できます。
    ゲストが実行中で、ゲストが破棄されるまで新しいデバイスを一時的に追加する場合は、-config オプションを省略します。
    # virsh attach-device Guest1 ~/NewStorage.xml
    注記
    virsh コマンドを使用すると、XML ファイルを作成しなくても、より単純な構文で限られた数のパラメーターを設定できる attach-disk コマンドを使用できます。attach-disk コマンドは、次に示すように、前述の attach-device コマンドと同様の方法で使用されます。
    # virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img vdb --cache none --driver qemu --subdriver raw
    
    virsh attach-disk コマンドは --config オプションも受け入れることに注意してください。
  5. ゲストマシンを起動します (現在実行されていない場合)。
    # virsh start Guest1
    注記
    次の手順は Linux ゲスト固有です。他のオペレーティングシステムは、さまざまな方法で新しいストレージデバイスを処理します。その他のシステムについては、そのオペレーティングシステムのドキュメントを参照してください。
  6. ディスクドライブのパーティション分割

    これで、ゲストには /dev/vdb というハードディスクデバイスがあります。。必要に応じて、このディスクドライブをパーティションに分割し、パーティションをフォーマットします。追加したデバイスが表示されない場合は、ゲストのオペレーティングシステムのディスクホットプラグに問題があることを示しています。
    1. 新しいデバイスの fdisk を起動します。
      # fdisk /dev/vdb
      Command (m for help):
      
    2. 新しいパーティションのために、n と入力します。
    3. 次のように表示されます。
      Command action
      e   extended
      p   primary partition (1-4)
      
      プライマリーパーティションには、p と入力します。
    4. 使用可能なパーティション番号を選択します。この例では、1を入力して、最初のパーティションを選択します。
      Partition number (1-4): 1
    5. Enterを押して、デフォルトの最初のシリンダーを入力します。
      First cylinder (1-400, default 1):
    6. パーティションのサイズを選択します。この例では、Enter を押してディスク全体を割り当てます。
      Last cylinder or +size or +sizeM or +sizeK (2-400, default 400):
    7. t を入力して、パーティションタイプを設定します。
      Command (m for help): t
    8. 前の手順で作成したパーティションを選択します。この例では、パーティションが 1 つしか作成されておらず、fdisk がパーティション 1 を自動的に選択したため、パーティション番号は 1 です。
      Partition number (1-4): 1
    9. Linux パーティションの場合は 83 と入力します。
      Hex code (type L to list codes): 83
    10. w と入力して変更を書き込み、終了します。
      Command (m for help): w
      
    11. ext3 ファイルシステムで新しいパーティションをフォーマットします。
      # mke2fs -j /dev/vdb1
  7. マウントディレクトリーを作成し、ゲストにディスクをマウントします。この例では、ディレクトリーは myfiles にあります。
    # mkdir /myfiles
    # mount /dev/vdb1 /myfiles
    
    これで、ゲストは追加の仮想化されたファイルベースのストレージデバイスを使用できます。ただし、ゲストの /etc/fstab ファイルで定義されていない限り、このストレージは再起動後に永続的にマウントされないことに注意してください。
    /dev/vdb1    /myfiles    ext3     defaults    0 0

13.3.2. ゲストへのハードドライブおよびその他のブロックデバイスの追加

システム管理者は、追加のハードドライブを使用して、ゲストのストレージスペースを増やすか、システムデータをユーザーデータから分離するかを選択できます。

手順13.2 ゲストへの物理ブロックデバイスの追加

  1. この手順では、ホスト物理マシン上のハードドライブをゲストに追加する方法について説明します。これは、CD-ROM、DVD、フロッピーデバイスを含むすべての物理ブロックデバイスに適用されます。
    ハードディスクデバイスをホストの物理マシンに物理的に接続します。ドライブにデフォルトでアクセスできない場合は、ホスト物理マシンを設定します。
  2. 次のいずれかを行います。
    1. 新しいファイルに disk 要素を書き込んで、追加のストレージを作成します。この例では、このファイルは NewStorage.xml と呼ばれます。次の例は、ホスト物理マシンパーティション /dev/sr0 用の追加のデバイスベースのストレージコンテナーを含む設定ファイルセクションです。
      <disk type='block' device='disk'>
            <driver name='qemu' type='raw' cache='none'/>
            <source dev='/dev/sr0'/>
            <target dev='vdc' bus='virtio'/>
      </disk>
      
    2. 前のセクションの手順に従って、デバイスをゲスト仮想マシンに接続します。または、virsh attach-disk示されているように、コマンド:
      # virsh attach-disk Guest1 /dev/sr0 vdc
      
      次のオプションが使用可能であることに注意してください。
      • virsh attach-disk コマンドは、図のように --config--type、および --mode オプションも受け付けます。
        virsh attach-disk Guest1 /dev/sr0 vdc --config --type cdrom --mode readonly
      • さらに、 --type、デバイスがハードディスクの場合は、--type disk も受け付けます。
  3. ゲスト仮想マシンには、Linux では /dev/vdc (またはゲスト仮想マシン OS が選択するものに応じて同様のもの) または Windows では D: drive (たとえば) と呼ばれる新しいハードディスクデバイスがあります。これで、ゲスト仮想マシンのオペレーティングシステムの標準手順に従って、ゲスト仮想マシンからディスクを初期化できます。例は、手順13.1「ファイルベースのストレージの追加」 を参照してください。
    警告
    ゲストにブロックデバイスを追加するときは、セキュリティー上の考慮事項に必ず従ってください。この情報については、『Red Hat Enterprise Linux 仮想化セキュリティーガイド』 を参照してください。https://access.redhat.com/site/documentation/
    重要
    ゲスト仮想マシンには、ディスク全域、またはブロックデバイス全域 (例: /dev/sdb) への書き込みアクセス権を付与しないでください。ブロックデバイス全域にアクセスを持つゲスト仮想マシンは、ボリュームラベルを修正できる場合があり、これがホスト物理マシンシステムの攻撃に使用される可能性があります。パーティション (例: /dev/sdb1) または LVM ボリュームを使用して、この問題を回避してください。

13.4. ボリュームの削除と削除

このセクションでは、virsh vol-delete コマンドを使用してブロックベースのストレージプールからディスクボリュームを削除する方法を示します。この例では、ボリュームは volume 1 であり、ストレージプールは guest_images です。
# virsh vol-delete --pool guest_images volume1
Vol volume1 deleted

第14章 virsh を使用したゲスト仮想マシンの管理

virsh は、ゲスト仮想マシンとハイパーバイザーを管理するためのコマンドラインインターフェイスツールです。virsh コマンドラインツールは libvirt 管理 API に基づいて構築されており、qemu-kvm コマンドおよびグラフィカルな virt-manager アプリケーションの代替として機能します。virsh コマンドは、特権のないユーザーが読み取り専用モードで使用することも、root アクセスで完全な管理機能を使用することもできます。virsh コマンドは、仮想化管理のスクリプトを作成するのに理想的です。

14.1. 一般的なコマンド

このセクションのコマンドは、どのドメインにも固有ではないため、一般的なものです。

14.1.1. help

$ virsh help command | group help コマンドは、オプションの有無にかかわらず使用できます。オプションなしで使用すると、すべてのコマンドが 1 行に 1 つずつ一覧表示されます。オプションとともに使用すると、カテゴリーにグループ化され、各グループのキーワードが表示されます。
特定のオプション専用のコマンドを表示するには、そのグループのキーワードをオプションとして指定する必要があります。以下に例を示します。
$ virsh help pool
 Storage Pool (help keyword 'pool'):
    find-storage-pool-sources-as   find potential storage pool sources
    find-storage-pool-sources      discover potential storage pool sources
    pool-autostart                 autostart a pool
    pool-build                     build a pool
    pool-create-as                 create a pool from a set of args
    pool-create                    create a pool from an XML file
    pool-define-as                 define a pool from a set of args
    pool-define                    define (but don't start) a pool from an XML file
    pool-delete                    delete a pool
    pool-destroy                   destroy (stop) a pool
    pool-dumpxml                   pool information in XML
    pool-edit                      edit XML configuration for a storage pool
    pool-info                      storage pool information
    pool-list                      list pools
    pool-name                      convert a pool UUID to pool name
    pool-refresh                   refresh a pool
    pool-start                     start a (previously defined) inactive pool
    pool-undefine                  undefine an inactive pool
    pool-uuid                      convert a pool name to pool UUID
同じコマンドをコマンドオプションとともに使用すると、その 1 つの特定のコマンドに関するヘルプ情報が得られます。以下に例を示します。
$ virsh help vol-path
  NAME
    vol-path - returns the volume path for a given volume name or key

  SYNOPSIS
    vol-path <vol> [--pool <string>]

  OPTIONS
    [--vol] <string>  volume name or key
    --pool <string>  pool name or uuid

14.1.2. 終了して終了します

quit コマンドと exit コマンドは、ターミナルを閉じます。以下に例を示します。
$ virsh exit
$ virsh quit

14.1.3. version

version コマンドは、現在の libvirt バージョンを表示し、ビルドの作成元に関する情報を表示します。以下に例を示します。
$ virsh version
Compiled against library: libvirt 1.1.1
Using library: libvirt 1.1.1
Using API: QEMU 1.1.1
Running hypervisor: QEMU 1.5.3

14.1.4. 引数の表示

virsh echo [--shell][--xml][arg] コマンドは、指定された引数をエコーまたは表示します。エコーされた各引数はスペースで区切られます。--shell オプションを使用すると、出力は必要に応じて一重引用符で囲まれるため、シェルコマンドでの再利用に適しています。--xml オプションを使用すると、出力は XML ファイルでの使用に適したものになります。たとえば、virsh echo --shell "hello world" というコマンドは、出力 'hello world' を送信します。

14.1.5. connect

ハイパーバイザーセッションに接続します。シェルが最初に起動されたとき、このコマンドは、URI パラメーターが -c コマンドによって要求されたときに自動的に実行されます。URI は、ハイパーバイザーへの接続方法を指定します。最も一般的に使用される URI は以下のとおりです。
  • xen:/// - ローカルの Xen ハイパーバイザーに接続します。
  • qemu:///system- ルートとしてローカルで QEMU および KVM ドメインを監視するデーモンに接続します。
  • xen:///session- ユーザーとしてローカルでユーザーの QEMU および KVM ドメインのセットに接続します。
  • lxc:/// - ローカルの Linux コンテナーに接続します。
追加の値は、libvirt の Web サイト http://libvirt.org/uri.html で入手できます。
コマンドは次のように実行できます。
$ virsh connect {name|URI}
ここで、{name} は、ハイパーバイザーのマシン名 (ホスト名) または URL (virsh uri コマンドの出力) です。読み取り専用接続を開始するには、上記のコマンドに --readonly を追加します。URI の詳細については、リモート URI を参照してください。URI がわからない場合は、virsh uri コマンドを実行すると以下のようなメッセージが表示されます。
$ virsh uri
qemu:///session

14.1.6. 基本情報の表示

次のコマンドを使用して、基本情報を表示できます。
  • $ hostname- ハイパーバイザーのホスト名を表示します
  • $ sysinfo- 利用可能な場合、ハイパーバイザーのシステム情報の XML 表現を表示します

14.1.7. NMI の挿入

$ virsh inject-nmi [domain] は、NMI (マスク不可割り込み) メッセージをゲスト仮想マシンに挿入します。これは、回復不能なハードウェアエラーなど、応答時間が重要な場合に使用されます。このコマンドを実行するには:
$ virsh inject-nmi guest-1

14.2. virsh を使用したデバイスの接続および更新

ストレージデバイスの取り付けについては、以下を参照してください。「 ゲストへのファイルベースストレージの追加」

手順14.1 ゲスト仮想マシンが使用するホットプラグ USB デバイス

次の手順は、USB デバイスをゲスト仮想マシンに接続する方法を示しています。これは、ゲスト仮想マシンがホットプラグ手順として実行されているときに実行することも、ゲストがシャットオフされているときに実行することもできます。エミュレートするデバイスは、ホストの物理マシンに接続する必要があります。
  1. 次のコマンドを使用して、接続する USB デバイスを見つけます。
    # lsusb -v
    
    idVendor           0x17ef Lenovo
    idProduct          0x480f Integrated Webcam [R5U877]
    
    
  2. XML ファイルを作成し、論理名 (usb_device.xml など) を付けます。検索で表示されたとおりにベンダー ID と製品 ID をコピーしてください。

    図14.1 USB デバイスの XML スニペット

    
       <hostdev mode='subsystem' type='usb' managed='yes'>
          <source>
            <vendor id='0x17ef'/>
            <product id='0x480f'/>
          </source>
        </hostdev>
      ...
    
    
  3. 次のコマンドでデバイスを接続します。
    # virsh attach-device rhel6 --file usb_device.xml --config
    この例では、rhel6 はゲスト仮想マシンの名前であり、usb_device.xml は前の手順で作成したファイルです。次回の再起動時に変更を有効にする場合は、--config オプションを使用します。この変更を永続的にする場合は、--persistent オプションを使用します。変更を現在のドメインで有効にする場合は、--current オプションを使用します。詳細については、Virsh の man ページを参照してください。
  4. デバイスを切り離す (ホットアンプラグ) 場合は、次のコマンドを実行します。
    # virsh detach-device rhel6 --file usb_device.xml
    この例では、rhel6 はゲスト仮想マシンの名前であり、usb_device.xml は前の手順で添付したファイルです。

14.3. インターフェイスデバイスの接続

virsh attach-interfacedomain type source コマンドは、次のオプションを使用できます。
  • --live- - 実行中のドメインから値を取得します
  • --config - システムの次回起動時に使用する値を取得します。
  • --current- - 現在のドメインの状態に応じて値を取得します
  • --persistent- - オフラインドメインの場合は --config のように動作し、実行中のドメインの場合は --live のように動作します。
  • --target - ゲスト仮想マシンのターゲットデバイスを示します。
  • --mac- - これを使用して、ネットワークインターフェイスの MAC アドレスを指定します
  • --script - これは、デフォルトのパスの代わりに、ブリッジを処理するスクリプトファイルへのパスを指定します。
  • --model- - これを使用してモデルタイプを指定します。
  • --inbound - インターフェイスの着信帯域幅を制御します。指定できる値は、averagepeak、および burst です。
  • --outbound - インターフェイスのアウトバウンド帯域幅を制御します。指定できる値は、averagepeak、および burst です。
type は、物理ネットワークデバイスを示す network、またはデバイスへの bridge を示すブリッジのいずれかです。source はデバイスのソースです。接続したデバイスを削除する場合は、virsh detach-device を実行します。

14.4. CDROM のメディアの変更

CDROM のメディアを別のソースまたはフォーマットに変更する
# change-media domain path source --eject --insert --update --current --live --config --force
  • --path - ディスクデバイスの完全修飾パスまたはターゲットが含まれる文字列
  • --source - メディアのソースが含まれる文字列
  • --eject- - メディアを排出します
  • --insert - メディアを挿入します
  • --update- - メディアを更新します
  • --current - --live および --config のいずれかまたは両方を指定できます。これは、ハイパーバイザードライバーの実装に依存します。
  • --live- - 実行中のドメインのライブ設定を変更します
  • --config- - 永続的な設定を変更し、次回の起動時に影響が観察されます
  • --force- - メディアの変更を強制します

14.5. ドメインコマンド

これらのコマンドのほとんどは、指定されたドメインを直接操作するため、ドメイン名が必要です。ドメインは、短整数 (0,1,2 ...)、名前、または完全な UUID として指定できます。

14.5.1. 起動時に自動的に開始されるドメインの設定

$ virsh autostart [--disable] domain は、起動時に指定されたドメインを自動的に開始します。--disable オプションを使用すると、自動起動が無効になります。
# virsh autostart rhel6
上記の例では、ホストの物理マシンが起動すると、rhel6 ゲスト仮想マシンが自動的に起動します。
# virsh autostart rhel6 --disable
上記の例では、自動起動機能が無効になっており、ホスト物理マシンの起動時にゲスト仮想マシンが自動的に起動しなくなりました。

14.5.2. ゲスト仮想マシンのシリアルコンソールの接続

$ virsh console <domain> [--devname <string>] [--force] [--safe] コマンドは、ゲスト仮想マシンの仮想シリアルコンソールを接続します。オプションの --devname <string> パラメーターは、ゲスト仮想マシンに設定された代替コンソール、シリアル、またはパラレルデバイスのデバイスエイリアスを参照します。このパラメーターを省略すると、プライマリーコンソールが開きます。--force オプションは、コンソール接続を強制するか、disconnect と一緒に使用すると、接続を切断します。--safe オプションを使用すると、安全なコンソール処理がサポートされている場合にのみゲストが接続できます。
$ virsh console virtual_machine --safe

14.5.3. XML ファイルを使用したドメインの定義

define <FILE> コマンドは、XML ファイルからドメインを定義します。この場合のドメイン定義は登録されていますが、開始されていません。ドメインがすでに実行されている場合、変更は次回の起動時に有効になります。

14.5.4. ドメインの説明とタイトルの編集と表示

次のコマンドは、ドメインの説明とタイトルを表示または変更するために使用されますが、設定はしません。
# virsh desc [domain-name] [[--live] [--config] | [--current]] [--title] [--edit] [--new-desc New description or title message]
これらの値は、ドメインを簡単に識別できるように任意のテキストデータを保存できるユーザーフィールドです。理想的には、タイトルは短くする必要がありますが、これは libvirt によって強制されません。
オプション --live または --config は、このコマンドがドメインのライブ定義または永続定義のどちらで機能するかを選択します。--live--config の両方が指定されている場合、最初に --config オプションが実装され、コマンドに入力された説明が、ライブ設定と永続設定設定の両方に適用される新しい設定設定になります。--current オプションは、現在の状態の設定を変更または取得し、永続的ではありません。--live--config--current の いずれも指定されていない場合、--current オプションが使用されます。--edit オプションは、現在の説明またはタイトルの内容を含むエディターを開き、内容を後で保存することを指定します。--title オプションを使用すると、ドメインのタイトルフィールドのみが表示または変更され、説明は含まれません。また、コマンドで --edit--new-desc も使用されていない場合は、説明のみが表示され、変更できません。
たとえば、次のコマンドは、ゲスト仮想マシンのタイトルを testvm から TestVM-4F に変更し、説明を 4 階 の GuestVM に変更します。
$ virsh desc testvm --current --title TestVM-4F --new-desc Guest VM on fourth floor

14.5.5. デバイスブロック統計の表示

このコマンドは、実行中のドメインのブロック統計を表示します。ドメイン名とデバイス名の両方が必要です (デバイスを一覧表示するには、virsh domblklist を使用します)。この場合、ブロックデバイスは一意のターゲット名 (<target dev='name'/>) またはソースファイル (< source file ='name'/>) です。すべてのハイパーバイザーがすべてのフィールドを表示できるわけではないことに注意してください。出力が最も読みやすい形式で表示されるようにするには、次のように --human オプションを使用します。
# virsh domblklist rhel6
Target     Source
------------------------------------------------
vda        /VirtualMachines/rhel6.img
hdc        -

# virsh domblkstat --human rhel6 vda
Device: vda
 number of read operations:      174670
 number of bytes read:           3219440128
 number of write operations:     23897
 number of bytes written:        164849664
 number of flush operations:     11577
 total duration of reads (ns):   1005410244506
 total duration of writes (ns):  1085306686457
 total duration of flushes (ns): 340645193294

14.5.6. ネットワーク統計の取得

domnetstat [domain][interface-device] コマンドは、特定のドメインで実行されている特定のデバイスのネットワークインターフェイス統計を表示します。
# domifstat rhel6 eth0

14.5.9. ネットワークインターフェイスの帯域幅パラメーターの設定

domiftune は、ゲスト仮想マシンのネットワークインターフェイス帯域幅パラメーターを設定します。以下の形式を使用する必要があります。
#virsh domiftune domain interface-device [[--config] [--live] | [--current]] [--inbound average,peak,burst] [--outbound average,peak,burst]
必須パラメーターはゲスト仮想マシンのドメイン名とインターフェイスデバイスのみで、--config--live--current の機能は 「スケジュールパラメーターの設定」 と同じです。制限が指定されていない場合は、現在のネットワークインターフェイス設定をクエリーします。それ以外の場合は、以下のオプションで制限を変更します。
  • <interface-device> これは必須であり、ドメインのネットワークインターフェイスの帯域幅パラメーターを設定またはクエリーします。interface-device は、インターフェイスのターゲット名 (<target dev='name'/>) または MAC アドレスにすることができます。
  • --inbound または --outbound が指定されていない場合、このコマンドは帯域幅設定をクエリーして表示します。それ以外の場合は、インバウンドまたはアウトバウンドの帯域幅を設定します。average、peak、burst は、attach-interface コマンドの場合と同じです。「インターフェイスデバイスの接続」 を参照してください。

14.5.10. 実行中のドメインのメモリー統計の取得

このコマンドは、使用しているハイパーバイザーに応じてさまざまな結果を返す場合があります。
dommemstat [domain] [--period (sec)][[--config][--live]|[--current]] は、実行中のドメインのメモリー統計情報を表示します。--period オプションを使用するには、秒単位の期間が必要です。このオプションを 0 より大きい値に設定すると、バルーンドライバーは追加の統計を返します。これは、後続の domemstat コマンドにより表示されます。--period オプションを 0 に設定すると、バルーンドライバーの収集は停止しますが、バルーンドライバーの統計情報はクリアされません。バルーンドライバーの収集期間を設定するために --period オプションも設定しないと、--live--config--current オプションを使用することはできません。--live オプションが指定されている場合、実行中のゲストの収集期間のみが影響を受けます。--config オプションを使用すると、永続ゲストの次回の起動に影響します。--current オプションを使用すると、現在のゲストの状態に影響します
--live オプションおよび --config オプションの両方を使用できますが、--current は使用できません。オプションが指定されていない場合、ゲストの状態によって動作が異なります。
#virsh domemstat rhel6 --current

14.5.11. ブロックデバイスのエラーの表示

このコマンドは、I/O エラーのためにドメインが一時停止していることをレポートする domstate の後に使用するのが最適です。domblkerror domain コマンドは、特定のドメインでエラー状態にあるすべてのブロックデバイスを表示し、デバイスが報告しているエラーメッセージを表示します。
# virsh domblkerror rhel6

14.5.12. ブロックデバイスのサイズの表示

この場合、ブロックデバイスは一意のターゲット名 (<target dev='name'/>) またはソースファイル (< source file ='name'/>) です。リストを取得するには、domblklist を実行します。この domblkinfo には ドメイン 名が必要です。
# virsh domblkinfo rhel6

14.5.13. ドメインに関連付けられたブロックデバイスの表示

domblklist domain --inactive --details は、指定されたドメインに関連付けられているすべてのブロックデバイスのテーブルを表示します。
--inactive を指定すると、次回のシステムの起動時に使用されるデバイスが結果に表示されます。また、ドメインで現在使用中のデバイスは表示されません。--details を指定すると、ディスクのタイプとデバイス値がテーブルに含まれます。この表に表示される情報は、 domblkinfo および snapshot-create で使用できます。
#domblklist rhel6 --details

14.5.14. ドメインに関連付けられた仮想インターフェイスの表示

domiflist コマンドを実行すると、指定したドメインに関連付けられているすべての仮想インターフェイスの情報を表示するテーブルが表示されます。domiflist には ドメイン 名が必要であり、オプションで --inactive オプションを使用できます。
--inactive を指定すると、次回のシステムの起動時に使用されるデバイスが結果に表示されます。また、ドメインで現在使用中のデバイスは表示されません。
仮想インターフェイスの MAC アドレスを必要とするコマンド (detach-interfacedomif-setlink など) は、このコマンドによって表示される出力を受け入れます。

14.5.15. blockcommit を使用してバッキングチェーンを短縮する

このセクションでは、virsh blockcommit を使用してバッキングチェーンを短縮する方法を示します。バッキングチェーンの背景については、「ライブブロックコピーを使用したディスクイメージ管理」を参照してください。
blockcommit は、チェーンの一部からバッキングファイルにデータをコピーし、コミットされた部分をバイパスするためにチェーンの残りの部分をピボットできるようにします。たとえば、これが現在の状態であるとします。
      base ← snap1 ← snap2 ← active.
blockcommit を使用すると、snap2 のコンテンツが snap1 に移動します。これにより、チェーンから snap2 を削除できるため、バックアップが非常に速くなります。

手順14.2 virsh blockcommit

  • 以下のコマンドを実行します。
    # virsh blockcommit $dom $disk -base snap1 -top snap2 -wait -verbose
    snap2 の内容が snap1 に移動し、以下のような結果になります。
    base ← snap1 ← active.Snap2 が無効になり、削除できるようになりました。
    警告
    blockcommit-baseオプションに依存するすべてのファイルを破壊します (-topオプションに依存するファイル以外は、それらのファイルがベースを指すようになったため)。これを回避するには、複数のゲストが共有するファイルに変更をコミットしないでください。-verboseオプションにより、進捗状況を画面上に出力することができます。

14.5.16. ブロックプルを使用してバッキングチェーンを短縮する

blockpull は、以下のアプリケーションで使用できます。
  • バッキングイメージチェーンからのデータをイメージに入力して、イメージをフラット化します。これにより、イメージファイルは自己完結型になり、背面イメージに依存しなくなり、以下のようになります。
    • 前: base.img ← Active
    • 後: base.img がゲストで使用されなくなり、Active にすべてのデータが含まれるようになりました。
  • バッキングイメージチェーンの一部を平坦化します。これを使用すると、スナップショットをトップレベルイメージに平坦化し、以下のようになります。
    • 前: base ← sn1 ←sn2 ← active
    • 後: base.img ← active.アクティブには、sn1 および sn2 のすべてのデータが含まれるようになりました。また、ゲストでは sn1 も sn2 も使用されないことに注意してください。
  • ディスクイメージを、ホストの新しいファイルシステムに移動します。これにより、ゲストの実行中にイメージファイルを移動できます。以下のようになります。
    • 前 (元のイメージファイル) - /fs1/base.vm.img
    • 後: /fs2/active.vm.qcow2 が新しいファイルシステムになり、/fs1/base.vm.img が使用されなくなります。
  • コピー後のストレージ移行を使用したライブマイグレーションに役立ちます。ディスクイメージは、ライブマイグレーションの完了後に、移行元ホストから移行先ホストにコピーされます。
    要するに、こういうことです: 前: /source-host/base.vm.img 後: /destination-host/active.vm.qcow2/source-host/base.vm.img は使用されなくなりました。

手順14.3 ブロックプルを使用してバッキングチェーンを短縮する

  1. blockpull を実行する前にこのコマンドを実行すると役立つ場合があります。
    # virsh snapshot-create-as $dom $name - disk-only
  2. チェーンが次のようになっている場合: base ← snap1 ← snap2 ← active 次を実行します。
    # virsh blockpull $dom $disk snap1
    このコマンドは、snap2 からデータをアクティブにプルすることで、snap1 のバッキングファイルをアクティブな状態にします。その結果、base ← snap1 ← active になります。
  3. blockpullが完了すると、チェーンに追加イメージを作成したスナップショットのlibvirt追跡は役に立ちなくなります。次のコマンドを使用して、古いスナップショットの追跡を削除します。
    # virsh snapshot-delete $dom $name - metadata
blockpull 追加アプリケーションは、以下のように実行できます。
  • 単一のイメージをフラット化し、そのバッキングイメージチェーンからのデータを取り込むには: # virsh blockpull example-domain vda - wait
  • バッキングイメージチェーンの一部をフラット化するには: # virsh blockpull example-domain vda - base /path/to/base.img - wait
  • ディスクイメージをホスト上の新しいファイルシステムに移動するには: # virsh snapshot-create example-domaine - xmlfile /path/to/new.xml - disk-only に続いて # virsh blockpull example-domain vda - wait
  • コピー後のストレージ移行でライブ移行を使用する
    • destination 実行時:
       # qemu-img create -f qcow2 -o backing_file=/source-host/vm.img /destination-host/vm.qcow2
    • ソース実行時:
      # virsh migrate example-domain
    • destination 実行時:
      # virsh blockpull example-domain vda - wait

14.5.17. blockresize を使用してドメインパスのサイズを変更する

blockresize は、ドメインの実行中にドメインのブロックデバイスのサイズを変更するために使用できます。これには、一意のターゲット名 (<target dev="name"/>) またはソースファイルにも対応するブロックデバイスの絶対パスが使用されます。(<source file="name"/>)。これは、ドメインに接続されているディスクデバイスの 1 つに適用できます (コマンド domblklist を使用して、特定のドメインに関連付けられているすべてのブロックデバイスの簡単な情報を示すテーブルを出力できます)。
注記
ライブイメージのサイズを変更すると、イメージのサイズは常に変更されますが、ゲストはすぐにはサイズを変更しない場合があります。最近のゲストカーネルでは、virtio-blk デバイスのサイズが自動的に更新されます (古いカーネルではゲストを再起動する必要があります)。SCSI デバイスの場合は、echo > /sys/class/scsi_device/0:0:0:0/device/rescan コマンドを使用して、ゲストの再スキャンを手動でトリガーする必要があります。さらに、IDE では、新しいサイズを取得する前にゲストを再起動する必要があります。
  • 次のコマンドを実行します: blockresize [domain] [path size]。ここで、
    • Domain は、サイズを変更するドメインの一意のターゲット名またはソースファイルです
    • Path size はスケーリングされた整数であり、接尾辞がない場合、デフォルトで KiB (1024 バイトのブロック) になります。バイトには B の接尾辞を使用する必要があります。

14.5.18. ライブブロックコピーを使用したディスクイメージ管理

注記
ライブブロックコピーは、Red Hat EnterpriseLinux で提供されているバージョンの KVM ではサポートされていない機能です。ライブブロックコピーは、RedHat Virtualization に付属しているバージョンの KVM で利用できます。この機能をサポートするには、このバージョンの KVM が物理ホストマシンで実行されている必要があります。詳細については、Red Hat の担当者にお問い合わせください。
ライブブロックコピーを使用すると、使用中のゲストディスクイメージを宛先イメージにコピーし、ゲストの実行中にゲストディスクイメージを宛先ゲストイメージに切り替えることができます。ライブマイグレーションがホストのメモリーとレジストリーの状態を移動する間、ゲストは共有ストレージに保持されます。ライブブロックコピーを使用すると、ゲストの実行中にゲストコンテンツ全体をその場で別のホストに移動できます。ライブブロックコピーは、永続的な共有ストレージを必要とせずにライブ移行に使用することもできます。この方法では、移行後、ゲストの実行中にディスクイメージが移行先ホストにコピーされます。
ライブブロックコピーは、次のアプリケーションで特に役立ちます。
  • ゲストイメージをローカルストレージから中央の場所に移動する
  • メンテナーンスが必要な場合、パフォーマンスを損なうことなく、ゲストを別の場所に移動できます
  • 速度と効率のためにゲストイメージの管理を可能にします
  • ゲストをシャットダウンせずにイメージ形式の変換を行うことができます

例14.1 ライブブロックコピーを使用した例

この例は、ライブブロックコピーが実行されたときに何が起こるかを示しています。この例には、ソースと宛先の間で共有されるバッキングファイル (ベース) があります。また、ソースにのみ存在し、コピーする必要がある 2 つのオーバーレイ (sn1 と sn2) があります。
  1. 最初のバッキングファイルチェーンは次のようになります。
    base ← sn1 ← sn2
    コンポーネントは以下のとおりです。
    • ベース - 元のディスクイメージ
    • sn1 - ベースディスクイメージから取得された最初のスナップショット
    • sn2 - 最新のスナップショット
    • アクティブ - ディスクのコピー
  2. イメージのコピーが sn2 の上に新しいイメージとして作成されると、結果は次のようになります。
    base ← sn1 ← sn2 ← active
  3. この時点で、読み取り権限はすべて正しい順序であり、自動的に設定されます。書き込み権限が適切に設定されていることを確認するために、ミラーメカニズムはすべての書き込みを sn2 とアクティブの両方にリダイレクトし、sn2 とアクティブがいつでも同じように読み取るようにします (このミラーメカニズムは、ライブブロックコピーとイメージストリーミングの本質的な違いです)。
  4. すべてのディスククラスターをループするバックグラウンドタスクが実行されます。クラスターごとに、次のケースとアクションが考えられます。
    • クラスターはすでにアクティブに割り当てられており、何もする必要はありません。
    • bdrv_is_allocated() を使用して、バッキングファイルチェーンを追跡します。クラスターが (共有されている) ベースから読み取られる場合、何もする必要はありません。
    • bdrv_is_allocated() バリアントが実行可能でない場合は、イメージをリベースし、読み取りデータをベースの書き込みデータと比較して、コピーが必要かどうかを判断します。
    • 他のすべての場合は、クラスターを active にコピーします
  5. コピーが完了すると、アクティブのバッキングファイルがベースに切り替えられます (リベースと同様)
一連のスナップショットの後でバッキングチェーンの長さを短くするには、blockcommit および blockpull のコマンドが役立ちます。詳細は、「blockcommit を使用してバッキングチェーンを短縮する」 を参照してください。

14.5.19. グラフィック表示への接続の URI の表示

virsh domdisplay コマンドを実行すると、URI が出力されます。この URI を使用して、VNC、SPICE、または RDP を介してドメインのグラフィック表示に接続できます。--include-password オプションを使用すると、SPICE チャネルのパスワードが URI に含まれます。

14.5.20. ドメイン取得コマンド

次のコマンドは、特定のドメインに関するさまざまな情報を表示します
  • virsh domhostname domain は、ハイパーバイザーが公開できる場合、指定されたドメインのホスト名を表示します。
  • virsh dominfo domain は、指定されたドメインに関する基本情報を表示します。
  • virsh domuid domain|ID は、指定されたドメイン名または ID を UUID に変換します。
  • virsh domid domain|ID は、指定されたドメイン名または UUID を ID に変換します。
  • virsh domjobabort domain は、指定されたドメインで現在実行中のジョブを中止します。
  • virsh domjobinfo domain は、移行統計情報など、指定されたドメインで実行されているジョブに関する情報を表示します
  • virsh domname domain ID|UUID は、指定されたドメイン ID または UUID をドメイン名に変換します。
  • virsh domstate domain は、指定されたドメインの状態を表示します。--reason オプションを使用すると、表示された状態の理由も表示されます。
  • virsh domcontrol domain は、ドメインの制御に使用された VMM へのインターフェイスの状態を表示します。OK でも Error でもない状態の場合は、制御インターフェイスが表示状態に入ってから経過した秒数も出力されます。

例14.2 統計的フィードバックの例

ドメインに関する情報を取得するには、次のコマンドを実行します。
# virsh domjobinfo rhel6
Job type:         Unbounded
Time elapsed:     1603         ms
Data processed:   47.004 MiB
Data remaining:   658.633 MiB
Data total:       1.125 GiB
Memory processed: 47.004 MiB
Memory remaining: 658.633 MiB
Memory total:     1.125 GiB
Constant pages:   114382
Normal pages:     12005
Normal data:      46.895 MiB
Expected downtime: 0            ms
Compression cache: 64.000 MiB
Compressed data:  0.000 B
Compressed pages: 0
Compression cache misses: 12005
Compression overflows: 0

14.5.21. QEMU 引数のドメイン XML への変換

virsh domxml-from-native は、libvirt が使用できる libvirt ドメイン XML を使用して、既存の QEMU 引数のセットをゲスト description に変換する方法を提供します。このコマンドは、libvirt で管理できるように、コマンドラインから起動した既存の qemu ゲストを変換する場合にのみ使用することを目的としています。ここで説明する方法を使用して、新規ゲストを作成することはできません。新しいゲストは、virsh または virt-manager のいずれかを使用して作成する必要があります。追加情報は ここにあります。
次の args ファイルを持つ QEMU ゲストがいるとします。
 $ cat demo.args
LC_ALL=C
PATH=/bin
HOME=/home/test
USER=test
LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
これをドメイン XML ファイルに変換して、ゲストを libvirt で管理できるようにするには、次のコマンドを実行します。
$ virsh domxml-from-native qemu-argv demo.args
このコマンドは、上記の args ファイルを次のドメイン XML ファイルに変換します。

<domain type='qemu'>
  <uuid>00000000-0000-0000-0000-000000000000</uuid>
  <memory>219136</memory>
  <currentMemory>219136</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='i686' machine='pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/bin/qemu</emulator>
    <disk type='block' device='disk'>
      <source dev='/dev/HostVG/QEMUGuest1'/>
      <target dev='hda' bus='ide'/>
    </disk>
  </devices>
</domain>

14.5.22. ドメインのコアのダンプファイルの作成

分析できるように、ドメインのコアを含むダンプファイルを作成する必要がある場合があります (特にトラブルシューティングの場合)。この場合、virsh dump domain corefilepath --bypass-cache --live |--crash |--reset --verbose --memory-only を実行すると、ドメインコアが corefilepath で指定されたファイルにダンプされます。一部のハイパーバイザーが提供する場合があることに注意してください。このアクションに対する制限があり、corefilepath パラメーターで指定されたファイルとパスに対する適切なアクセス許可を手動で確認する必要がある場合があります。このコマンドは、SR-IOV デバイスやその他のパススルーデバイスでサポートされます。次のオプションがサポートされており、次の効果があります。
  • --bypass-cache 保存されたファイルには、ファイルシステムキャッシュは含まれません。このオプションを選択すると、ダンプ操作が遅くなる可能性があることに注意してください。
  • --live は、ドメインの実行を継続するときにファイルを保存し、ドメインを一時停止または停止しません。
  • --crash は、ダンプファイルの保存中にドメインを一時停止状態のままにするのではなく、クラッシュ状態にします。
  • --reset ダンプファイルが正常に保存されると、ドメインがリセットされます。
  • --verbose は、ダンププロセスの進捗を表示します。
  • --memory-only ダンプファイルに保存される情報は、ドメインのメモリーと CPU 共通レジスタファイルのみです。
プロセス全体が domjobinfo コマンドを使用してモニターでき、domjobabort コマンドを使用してキャンセルできることに注意してください。

14.5.23. 仮想マシンの XML ダンプの作成 (設定ファイル)

virsh を使用してゲスト仮想マシンの XML 設定ファイルを出力します。
# virsh dumpxml {guest-id, guestname or uuid}
このコマンドは、ゲスト仮想マシンの XML 設定ファイルを標準出力 (stdout) に出力します。出力をファイルにパイプすることでデータを保存できます。出力を guest.xml というファイルにパイプする例:
# virsh dumpxml GuestID > guest.xml
このファイル guest.xml は、ゲスト仮想マシンを再作成できます (参照 「ゲスト仮想マシンの設定ファイルの編集」。この XML 設定ファイルを編集して、追加のデバイスを設定したり、追加のゲスト仮想マシンをデプロイしたりできます。
virsh dumpxml 出力の例:
# virsh dumpxml guest1-rhel6-64
<domain type='kvm'>
  <name>guest1-rhel6-64</name>
  <uuid>b8d7388a-bbf2-db3a-e962-b97ca6e514bd</uuid>
  <memory>2097152</memory>
  <currentMemory>2097152</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.2.0'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none' io='threads'/>
      <source file='/home/guest-images/guest1-rhel6-64.img'/>
      <target dev='vda' bus='virtio'/>
      <shareable/<
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <interface type='bridge'>
      <mac address='52:54:00:b9:35:a9'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='tablet' bus='usb'/>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <sound model='ich6'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>
      <model type='cirrus' vram='9216' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </memballoon>
  </devices>
</domain>
<shareable/> フラグが設定されていることに注意してください。これは、デバイスがドメイン間で共有されることが期待されていることを示します (ハイパーバイザーと OS がこれをサポートしていると仮定)。つまり、そのデバイスのキャッシュを非アクティブ化する必要があります。

14.5.24. 設定ファイルからのゲスト仮想マシンの作成

ゲスト仮想マシンは、XML 設定ファイルから作成できます。以前に作成したゲスト仮想マシンから既存の XML をコピーするか、dumpxml オプションを使用できます (参照 「仮想マシンの XML ダンプの作成 (設定ファイル)」)。XML ファイルから virsh を使用してゲスト仮想マシンを作成するには:
# virsh create configuration_file.xml

14.6. ゲスト仮想マシンの設定ファイルの編集

dumpxml オプションを使用する代わりに (参照 「仮想マシンの XML ダンプの作成 (設定ファイル)」)、ゲスト仮想マシンは、実行中またはオフライン中に編集できます。virsh edit コマンドは、この機能を提供します。たとえば、rhel6 という名前のゲスト仮想マシンを編集するには、以下を実行します。
# virsh edit rhel6
これにより、テキストエディターが開きます。デフォルトのテキストエディターは $EDITOR シェルパラメーターです (デフォルトでは vi に設定されています)。

14.6.1. KVM ゲスト仮想マシンへの複合 PCI デバイスの追加

このセクションでは、多機能 PCI デバイスを KVM ゲスト仮想マシンに追加する方法を示します。
  1. virsh edit [guestname] コマンドを実行して、ゲスト仮想マシンの XML 設定ファイルを編集します。
  2. アドレスタイプタグに、function='0x0'multifunction='on' エントリーを追加します。
    これにより、ゲスト仮想マシンで多機能 PCI デバイスを使用できるようになります。
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-1.img'/>
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/
    </disk>
    
    2 つの機能を持つ PCI デバイスの場合は、XML 設定ファイルを修正して、最初のデバイスと同じスロット番号と、別の機能番号 (function='0x1' など) を持つ 2 番目のデバイスを追加します。
    以下に例を示します。
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-1.img'/>
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </disk>
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-2.img'/>
    <target dev='vdb' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </disk>
    
  3. KVM ゲスト仮想マシンからの lspci 出力は次のことを示しています。
    $ lspci
    
    00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device
    00:05.1 SCSI storage controller: Red Hat, Inc Virtio block device
    

14.6.2. 実行中のドメインを停止して後で再起動する

virsh managedsave domain --bypass-cache --running | --paused | --verbose は、実行中のドメインを保存および破棄 (停止) して、後で同じ状態から再起動できるようにします。virsh start コマンドと併用すると、この保存ポイントから自動的に開始されます。--bypass-cache オプションとともに使用すると、保存によってファイルシステムのキャッシュが回避されます。このオプションを使用すると、保存プロセスの速度が低下する可能性があることに注意してください。
--verbose は、ダンププロセスの進捗を表示します。
通常の条件では、管理保存は、保存が完了したときにドメインが置かれている状態によって決定される実行状態と一時停止状態のどちらを使用するかを決定します。ただし、これは、--running オプションを使用して、実行状態のままにする必要があることを示したり、--paused オプションを使用して、一時停止状態のままにすることを示したりして上書きできます。
管理対象の保存状態を削除するには、virsh managedsave-remove コマンドを使用します。これにより、ドメインが次に起動したときに、ドメインが強制的にフルブートします。
管理保存プロセス全体は、domjobinfo コマンドを使用して監視できます。domjobabort コマンドを使用して監視を中止することもできます。

14.6.3. 指定されたドメインの CPU 統計情報の表示

virsh cpu-stats domain --total start count コマンドは、指定されたドメインの CPU 統計情報を提供します。デフォルトでは、すべての CPU の統計および合計が表示されます。--total オプションは、合計統計のみを表示します。

14.6.4. スクリーンショットの保存

virsh screenshot コマンドは現在のドメインコンソールのスクリーンショットを取り、それをファイルに保存します。ただし、ハイパーバイザーがドメインに対してより多くの表示をサポートしている場合は、--screen を使用して画面 ID を指定すると、キャプチャする画面を指定できます。複数のグラフィックカードがあり、デバイスの前にヘッドが番号付けされている場合、画面 ID5 は 2 番目のカードの 2 番目のヘッドをアドレス指定します。

14.6.5. 指定されたドメインへのキーストロークの組み合わせの送信

virsh send-key domain --codeset --holdtime keycode を使用すると、シーケンスを keycode として特定のドメインに送信できます。
キーコード は、数値または対応する コードセット のシンボリック名になります。複数の キーコード を指定すると、すべてがゲスト仮想マシンに同時に送信されるため、順不同で受信されることがあります。個別のキーコードが必要な場合は、send-key コマンドを複数回送信する必要があります。
# virsh send-key rhel6 --holdtime 1000 0xf
--holdtime を指定すると、各キーストロークは指定した時間 (ミリ秒単位) 保持されます。--codeset ではコードセットを指定できます。デフォルトは Linux ですが、以下のオプションを使用できます。
  • linux - このオプションを選択すると、シンボリック名が対応する Linux キー定数マクロ名に一致するようになります。数値は、Linux 汎用入力イベントサブシステムが提供するものになります。
  • xt - XT キーボードコントローラーで定義する値を送信します。シンボリック名は記載されていません。
  • atset1 - 数値は、AT キーボードコントローラー、set1 (XT 互換セット) で定義されるものです。atset1 から拡張されたキーコードは、XT コードセットの拡張キーコードとは異なる場合があります。シンボリック名は記載されていません。
  • atset2 - 数値は、AT キーボードコントローラー、set 2 で定義されるものです。シンボリック名は記載されていません。
  • atset3 - 数値は、AT キーボードコントローラー、set 3 (PS/2 互換) で定義されるものです。シンボリック名は記載されていません。
  • os_x - 数値は、OS-X キーボード入力サブシステムで定義されるものです。シンボリック名は、対応する OS-X の鍵定数マクロ名と一致します。
  • xt_kbd - 数値は、Linux KBD デバイスーで定義されるものです。これは、元の XT コードセットのバリアントですが、拡張キーコードのエンコードが異なります。シンボリック名は記載されていません。
  • win32 - 数値は、Win32 キーボード入力サブシステムで定義されるものです。シンボリック名は、対応する Win32 鍵定数マクロ名と一致します。
  • usb - 数値は、キーボード入力の USB HID で定義されるものです。シンボリック名は記載されていません。
  • rfb - 数値は、raw キーコードを送信するために RFB 拡張で定義されるものです。これは XT コードセットのバリアントですが、拡張キーコードでは、最初のバイトの上位ビットではなく、2 番目のビットセットの下位ビットが使用されます。シンボリック名は記載されていません。

14.6.6. プロセス信号名を仮想プロセスに送信する

virsh send-process-signal domain-ID PID signame コマンドを使用すると、指定されたシグナル (signame で識別) が仮想ドメイン (ドメイン ID で指定) で実行され、プロセス ID(PID) で識別されるプロセスに送信されます。
整数信号定数またはシンボリック信号名のいずれかをこの方法で送信できます。したがって、たとえば、次の両方のコマンドは、rhel6 ドメインのプロセス ID 187kill シグナルを送信します。
# virsh send-process-signal rhel6 187 kill
# virsh send-process-signal rhel6 187 9
使用可能なシグナルとその使用法の完全なリストについては、virsh(1) および signal(7) のマニュアルページを参照してください。

14.6.7. VNC ディスプレイの IP アドレスとポート番号の表示

virsh vncdisplay は、指定されたドメインの VNC ディスプレイの IP アドレスとポート番号を出力します。情報が利用できない場合は、終了コード 1 が表示されます。
# virsh vncdisplay rhel6
127.0.0.1:0

14.7. NUMA ノード管理

このセクションには、NUMA ノード管理に必要なコマンドが含まれています。

14.7.1. ノード情報の表示

nodeinfo コマンドは、モデル番号、CPU 数、CPU の種類、物理メモリーのサイズなど、ノードに関する基本情報を表示します。出力は virNodeInfo 構造に対応します。具体的には、"CPU socket(s)" フィールドは NUMA セルごとの CPU ソケット数を示します。
$ virsh nodeinfo
CPU model:           x86_64
CPU(s):              4
CPU frequency:       1199 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         3715908 KiB

14.7.2. NUMA パラメーターの設定

virsh numatune は、指定されたドメインの NUMA パラメーターを設定または取得できます。ドメイン XML ファイル内では、これらのパラメーターは <numatune> 要素内にネストされています。オプションを使用しない場合は、現在の設定のみが表示されます。numatune domain コマンドには指定されたドメインが必要であり、次のオプションを選択できます。
  • --mode - モードは、strictインターリーブ、または 推奨 のいずれかに設定できます。実行中のドメインは、ドメインが strict モードで開始されていない限り、ライブ中にモードを変更することはできません。
  • --nodeset には、ドメインを実行するためにホスト物理マシンによって使用される NUMA ノードのリストが含まれています。この一覧には、それぞれがコンマで区切られたノードが含まれ、ノード範囲に使用されるダッシュ-と、ノードの除外に使用されるカレット^ も含まれています。
  • インスタンスごとに使用できるオプションは、次の 3 つのうち 1 つだけです。
    • --config は、永続ゲスト仮想マシンの次回の起動時に有効になります。
    • --live は、実行中のゲスト仮想マシンのスケジューラー情報を設定します。
    • --current は、ゲスト仮想マシンの現在の状態に影響を及ぼします。

14.7.3. NUMA セルの空きメモリー量の表示

virsh freecell は、指定された NUMA セル内に、マシンで利用可能なメモリー容量を表示します。このコマンドは、指定したオプションに応じて、マシンで利用可能なメモリーを、3 つの異なるディスプレイのいずれかに表示します。オプションを使用しない場合は、マシンの空きメモリーの合計が表示されます。--all オプションを使用すると、各セルの空きメモリーとマシンの合計空きメモリーが表示されます。数値引数を使用するか、セル番号とともに --cellno オプションを使用すると、指定したセルの空きメモリーが表示されます。

14.7.4. CPU リストの表示

nodecpumap コマンドは、ノードがオンラインであるかどうかに関係なく、ノードで使用可能な CPU の数を表示し、現在オンラインである CPU の数も一覧表示します。
$ virsh nodecpumap
   CPUs present: 4
   CPUs online: 1
   CPU map: y

14.7.5. CPU 統計の表示

nodecpustats コマンドは、CPU が指定されている場合、指定された CPU に関する統計情報を表示します。そうでない場合は、ノードの CPU ステータスが表示されます。パーセントを指定すると、1 秒間隔で記録された各タイプの CPU 統計のパーセンテージが表示されます。
この例は、CPU が指定されていないことを示しています。
$ virsh nodecpustats
user:               1056442260000000
system:              401675280000000
idle:               7549613380000000
iowait:               94593570000000
この例は、CPU 番号 2 の統計パーセンテージを示しています。
$ virsh nodecpustats 2 --percent
usage:            2.0%
user:             1.0%
system:           1.0%
idle:            98.0%
iowait:           0.0%
ゲスト仮想マシンの設定ファイルの on_reboot 要素を変更することで、再起動中のゲスト仮想マシンの動作を制御できます。

14.7.6. ホスト物理マシンの一時停止

nodesuspend コマンドは、ホスト物理マシンを、Suspend-to-RAM(s3)、Suspend-to-Disk (s4)、または Hybrid-Suspend と同様のシステム全体のスリープ状態にし、Real-Time-Clock をセットアップします。設定された期間が経過した後にノードをウェイクアップします。--target オプションは、次のいずれかに設定できます。memdisk、またhybrid。これらのオプションは、メモリー、ディスク、または 2 つの組み合わせを一時停止するように設定することを示します。--duration を設定すると、設定した期間が終了した後に起動するようにホスト物理マシンに指示します。秒単位で設定されます。継続時間は 60 秒より長くすることをお勧めします。
$ virsh nodesuspend disk 60

14.7.7. ノードメモリーパラメーターの設定および表示

node-memory-tune [shm-pages-to-scan] [shm-sleep-milisecs] [shm-merge-across-nodes] コマンドが表示され、ノードメモリーパラメーターを設定できるようになります。このコマンドで設定できるパラメーターは 3 つあります。
  • shm-pages-to-scan - 共有メモリーサービスがスリープ状態になる前にスキャンするページ数を設定します。
  • shm-sleep-milisecs - 次のスキャンの前に共有メモリーサービスがスリープするミリ秒数を設定します
  • shm-merge-across-nodes - 別の NUMA ノードのページをマージできるかどうかを指定します。許可される値は 01です。0 に設定すると、マージ可能なページのみが、同じ NUMA ノードのメモリー領域に存在するページのみです。1 に設定すると、全 NUMA ノードのページをマージすることができます。デフォルト設定は次のとおりです1

14.7.8. ホストノードでのデバイスの作成

virsh nodedev-create file コマンドを使用すると、ホストの物理マシンにデバイスを作成し、ゲスト仮想マシンに割り当てることができます。libvirt は通常、使用可能なホストノードを自動的に検出しますが、このコマンドを使用すると、libvirt が検出しなかったホストハードウェアを登録できます。ファイル には、ノードデバイスの最上位 <デバイス> の XML の説明が含まれている必要があります。
このデバイスを停止するには、nodedev-destroy device コマンドを使用します。

14.7.9. ノードデバイスの切り離し

virsh nodedev-detach は、nodedev をホストから切り離して、<hostdev> パススルーを介してゲストが安全に使用できるようにします。このアクションは nodedev-reattach コマンドで元に戻すことができますが、マネージドサービスでは自動的に実行されます。このコマンドは、nodedev-dettach も受け入れます。
異なるドライバーは、デバイスが異なるダミーデバイスにバインドされることを想定していることに注意してください。--driver オプションを使用すると、目的のバックエンドドライバーを指定できます。

14.7.10. デバイスの設定設定の取得

virsh nodedev-dumpxml [device] コマンドは、指定されたノード <デバイス>の XML 設定ファイルをダンプします。XML 設定には、デバイス名、たとえばデバイスを所有するバス、ベンダー、製品 ID などの情報が含まれます。引数の device は、デバイス名にすることも、WWNN | WWPN 形式の WWN の組み合わせにすることもできます (HBA のみ)。

14.7.11. ノード上のデバイスの一覧表示

virsh nodedev-list cap --tree コマンドは、libvirt によって認識されているノードで使用可能なすべてのデバイスを一覧表示します。cap は、機能タイプでリストをフィルターリングするために使用されます。各タイプはコンマで区切られ、--tree と一緒に使用することはできません。--tree オプションを使用すると、次のように出力がツリー構造になります。
   #  virsh nodedev-list --tree
   computer
  |
  +- net_lo_00_00_00_00_00_00
  +- net_macvtap0_52_54_00_12_fe_50
  +- net_tun0
  +- net_virbr0_nic_52_54_00_03_7d_cb
  +- pci_0000_00_00_0
  +- pci_0000_00_02_0
  +- pci_0000_00_16_0
  +- pci_0000_00_19_0
  |   |
  |   +- net_eth0_f0_de_f1_3a_35_4f

(this is a partial screen)

14.7.12. ノードのリセットのトリガー

nodedev-reset nodedev コマンドは、指定された nodedev のデバイスリセットをトリガーします。このコマンドを実行すると、ゲスト仮想マシンパススルーとホスト物理マシンの間でノードデバイスを転送する前に役立ちます。libvirt 必要に応じてこのアクションを暗黙的に実行しますが、このコマンドを使用すると、必要に応じて明示的にリセットできます。

14.8. ゲスト仮想マシンの起動、一時停止、再開、保存、および復元

このセクションでは、ゲスト仮想マシンの起動、一時停止、再開、保存、および復元に関する情報を提供します。

14.8.1. 定義済みドメインの開始

virsh start domain --console --paused --autodestroy --bypass-cache --force-boot --pass-fds コマンドは、定義済みで非アクティブのドメインを起動します。この仮想マシンのステータスは、最後の管理保存状態または起動直後から非アクティブになっています。このコマンドは、次のオプションを選択できます。
  • --console - コンソールに接続しているドメインを起動します
  • --console - これがドライバーによってサポートされている場合、ドメインを起動してから一時停止状態にします
  • --autodestroy - virsh セッションが閉じるか、libvirt への接続が閉じるか、それ以外の場合は終了すると、ゲスト仮想マシンは自動的に破棄されます
  • --bypass-cache - ドメインが管理された保存状態にある場合に使用されます。これを使用すると、システムキャッシュを回避して、ゲスト仮想マシンが復元されます。これにより、復元プロセスが遅くなることに注意してください。
  • --force-boot - managedsave オプションをすべて破棄し、新規ブートが実行されます。
  • --pass-fds - は、ゲスト仮想マシンに渡される、コンマで区切られた追加オプションのリストです。

14.8.2. ゲスト仮想マシンの一時停止

virsh を使用してゲスト仮想マシンを一時停止します。
# virsh suspend {domain-id, domain-name or domain-uuid}
ゲスト仮想マシンが一時停止状態の場合、システム RAM は消費されますが、プロセッサーリソースは消費されません。ゲスト仮想マシンが一時停止されている間は、ディスクとネットワークの I / O は発生しません。この操作はすぐに実行され、ゲスト仮想マシンは resume で再起動できます (「ゲスト仮想マシンの再開」) オプション。

14.8.3. 実行中のドメインの一時停止

virsh dompmsuspend domain --duration --target コマンドは、実行中のドメインを取得して一時停止し、3 つの可能な状態 (S3、S4、または 2 つのハイブリッド) のいずれかに配置できるようにします。
# virsh dompmsuspend rhel6 --duration 100 --target mem
このコマンドは、次のオプションを使用できます。
  • --duration - 状態変更の期間を秒単位で設定します
  • --target - mem (suspend to RAM (S3))disk (suspend to disk (S4)) または hybrid (hybrid suspend) のいずれかを使用できます。

14.8.4. pmsuspend 状態からドメインをウェイクアップする

このコマンドは、設定された期間の期限が切れるのを待つのではなく、pmsuspend 状態にあるゲストにウェイクアップアラートを挿入します。ドメインが実行されている場合、この操作は失敗しません。
# dompmwakeup rhel6
このコマンドには、ドメインの名前 (たとえば、次に示すように rhel6) が必要です。

14.8.5. ドメインの定義を解除する

# virsh undefine domain --managed-save --snapshots-metadata --storage --remove-all-storage --wipe-storage
このコマンドは、ドメインの定義を解除します。実行中のドメインで動作することはできますが、実行中のドメインを停止せずに一時的なドメインに変換します。ドメインが非アクティブの場合、ドメイン設定は削除されます。
このコマンドは、次のオプションを選択できます。
  • --managed-save - このオプションは、管理対象の保存イメージもクリーンアップされることを保証します。このオプションを使用しない場合、管理対象の保存イメージを使用してドメインの定義を解除しようとすると失敗します。
  • --snapshots-metadata - このオプションは、非アクティブなドメインの定義を解除するときに、スナップショット (snapshot-list で示される) もクリーンアップされることを保証します。設定ファイルにスナップショットメタデータが含まれている非アクティブなドメインの定義を解除しようとすると失敗することに注意してください。このオプションが使用され、ドメインがアクティブである場合、それは無視されます。
  • --storage - このオプションを使用する場合は、ボリュームターゲット名またはストレージボリュームのソースパスをコンマで区切って指定し、未定義のドメインと一緒に削除する必要があります。このアクションでは、ストレージボリュームを削除する前にそのストレージボリュームの定義が解除されます。これは、非アクティブなドメインでのみ実行できることに注意してください。これは、libvirt で管理されるストレージボリュームでのみ機能することに注意してください。
  • --remove-all-storage - ドメインの定義を解除することに加えて、関連するすべてのストレージボリュームが削除されます。
  • --wipe-storage - ストレージボリュームを削除する以外にも、コンテンツをワイプします。

14.8.6. ゲスト仮想マシンの再開

resume オプションを使用して、中断されたゲスト仮想マシンを virsh で復元します。
# virsh resume {domain-id, domain-name or domain-uuid}
この操作は即時であり、ゲスト仮想マシンのパラメーターは suspend および resume 操作のために保持されます。

14.8.7. ゲスト仮想マシンを保存する

virsh コマンドを使用して、ゲスト仮想マシンの現在の状態をファイルに保存します。
# virsh save {domain-name|domain-id|domain-uuid} state-file --bypass-cache --xml --running --paused --verbose
これにより、指定したゲスト仮想マシンが停止し、データがファイルに保存されます。ゲスト仮想マシンで使用されているメモリーの量を考えると、時間がかかる場合があります。復元を使用して、ゲスト仮想マシンの状態を restore できます (「ゲスト仮想マシンを復元する」) オプション。保存は一時停止に似ていますが、ゲスト仮想マシンを一時停止するだけでなく、ゲスト仮想マシンの現在の状態が保存されます。
virsh save コマンドは、次のオプションを使用できます。
  • --bypass-cache - 復元を実行してファイルシステムキャッシュを回避しますが、このオプションを使用すると復元動作が遅くなる可能性があることに注意してください。
  • --xml - このオプションは、XML ファイル名とともに使用する必要があります。通常、このオプションは省略されますが、ドメイン XML のホスト固有の部分のみを変更し、復元したゲスト仮想マシンで使用するための代替 XML ファイルを提供するために使用できます。たとえば、ゲストの保存後に取得されたディスクスナップショットによる、基になるストレージのファイル名の違いを説明するために使用できます。
  • --running - は、保存イメージに記録された状態をオーバーライドして、ドメインを実行中として開始します。
  • --paused - 保存イメージに記録された状態をオーバーライドして、ドメインを一時停止として開始します。
  • --verbose - 保存の進捗を表示します。
ゲスト仮想マシンを XML ファイルから直接復元する場合は、virsh restore コマンドがそれを実行します。domjobinfo でプロセスをモニターし、domjobabort でこれをキャンセルできます。

14.8.8. ゲストの復元に使用されるドメイン XML ファイルの更新

virsh save-image-define file xml --running|--paused コマンドは、指定されたファイルが後で virsh restore コマンドで使用されるときに使用されるドメイン XML ファイルを更新します。xml 引数は、ドメイン XML のホスト物理マシン固有の部分のみが変更された代替 XML を含む XML ファイル名である必要があります。たとえば、ゲストを保存した後に、基となるストレージのディスクスナップショットを作成することで生じるファイルの命名の相違点を説明するために使用できます。ドメインを実行状態または一時停止状態に復元する必要があるかどうかを、イメージの保存で記録します。オプション --running または --paused を使用すると、使用する状態が決まります。

14.8.9. ドメイン XML ファイルの抽出

save-image-dumpxml file --security-info コマンドは、保存された状態ファイル (virsh save コマンドで使用) が参照されたときに有効だったドメイン XML ファイルを抽出します。--security-info オプションを使用すると、ファイルにセキュリティー上の機密情報が含まれます。

14.8.10. ドメイン XML 設定ファイルの編集

save-image-edit file --running --paused コマンドは、virsh save コマンドによって作成された保存済み ファイルに関連付けられている XML 設定ファイルを編集します。
保存イメージには、ドメインを --running 状態または --paused 状態のどちらに復元する必要があるかが記録されることに注意してください。これらのオプションを使用しない場合、状態はファイル自体によって決定されます。--running または --paused を選択すると、virsh restore が使用する必要のある状態を上書きできます。

14.8.11. ゲスト仮想マシンを復元する

virsh save コマンドで以前に保存したゲスト仮想マシンを復元します (「ゲスト仮想マシンを保存する」) virshを使用する:
# virsh restore state-file
これにより、保存されたゲスト仮想マシンが再起動します。これには時間がかかる場合があります。ゲスト仮想マシンの名前と UUID は保持されますが、新しい ID に割り当てられます。
virsh restore state-file コマンドは、次のオプションを使用できます。
  • --bypass-cache - 復元を実行してファイルシステムキャッシュを回避しますが、このオプションを使用すると復元動作が遅くなる可能性があることに注意してください。
  • --xml - このオプションは、XML ファイル名とともに使用する必要があります。通常、このオプションは省略されますが、ドメイン XML のホスト固有の部分のみを変更し、復元したゲスト仮想マシンで使用するための代替 XML ファイルを提供するために使用できます。たとえば、ゲストの保存後に取得されたディスクスナップショットによる、基になるストレージのファイル名の違いを説明するために使用できます。
  • --running - は、保存イメージに記録された状態をオーバーライドして、ドメインを実行中として開始します。
  • --paused - 保存イメージに記録された状態をオーバーライドして、ドメインを一時停止として開始します。

14.9. ゲスト仮想マシンのシャットダウン、再起動、および強制シャットダウン

このセクションでは、ゲスト仮想マシンのシャットダウン、リブート、および強制シャットダウンに関する情報を提供します。

14.9.1. ゲスト仮想マシンのシャットダウン

virsh shutdown コマンドを使用して、ゲスト仮想マシンをシャットダウンします。
# virsh shutdown {domain-id, domain-name or domain-uuid} [--mode method]
ゲスト仮想マシンの設定ファイルの on_shutdown パラメーターを変更することで、ゲスト仮想マシンの再起動の動作を制御できます。

14.9.2. Red Hat Enterprise Linux 7 ホストでの Red Hat Enterprise Linux 6 ゲストのシャットダウン

Minimal installation を使用して Red Hat Enterprise Linux 6 ゲスト仮想マシンをインストールしても、acpid パッケージ はインストールされません。Red Hat Enterprise Linux 7 は、systemd に引き継がれたため、このパッケージを必要としなくなりました。ただし、Red Hat Enterprise Linux 7 ホストで実行されている Red Hat Enterprise Linux 6 ゲスト仮想マシンには引き続き必要です。
acpid パッケージがないと、virsh shutdown コマンドの実行時に Red Hat Enterprise Linux 6 ゲスト仮想マシンはシャットダウンしません。virsh shutdown は、ゲスト仮想マシンを適切にシャットダウンするように設計されています。
virsh shutdown を使用すると、システム管理がより簡単かつ安全になります。virsh shutdown コマンドを使用して正常にシャットダウンしない場合は、システム管理者がゲスト仮想マシンに手動でログインするか、Ctrl-Alt-Del のキーの組み合わせを各ゲスト仮想マシンに送信する必要があります。
注記
その他の仮想化オペレーティングシステムは、この問題の影響を受ける可能性があります。virsh shutdown コマンドでは、ACPI のシャットダウン要求を処理するようにゲスト仮想マシンのオペレーティングシステムを設定する必要があります。多くのオペレーティングシステムでは、ACPI のシャットダウン要求を受け入れるために、ゲスト仮想マシンのオペレーティングシステムで追加の設定が必要です。

手順14.4 Red Hat Enterprise Linux 6 ゲストの回避策

  1. acpid パッケージのインストール

    acpid サービスは、ACPI 要求をリッスンして処理します。
    ゲスト仮想マシンにログインし、ゲスト仮想マシンに acpid パッケージをインストールします。
    # yum install acpid
  2. acpid サービスを有効にする

    ゲスト仮想マシンの起動シーケンス中にacpidサービスを開始するように設定し、サービスを開始します。
    # chkconfig acpid on
    # service acpid start
  3. ゲストドメイン xml の準備

    ドメインの XML ファイルを編集して、次の要素を追加します。virtio シリアルポートを org.qemu.guest_agent.0 に置き換え、$guestname の代わりにゲストの名前を使用します。

    図14.2 ゲスト XML の置き換え

    
    <channel type='unix'>
       <source mode='bind' path='/var/lib/libvirt/qemu/{$guestname}.agent'/>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
        
    
    
  4. QEMU ゲストエージェントのインストール

    QEMU ゲストエージェント (QEMU-GA) をインストールし、指示に従ってサービスを開始します。10章qemu-img および QEMU ゲストエージェント。Windows ゲストを実行している場合は、本章にもそのための手順があります。
  5. ゲストをシャットダウンします

    1. 以下のコマンドを実行します。
      # virsh list --all  - this command lists all of the known domains
         Id Name              State
      ----------------------------------
         rhel6                running
      
    2. ゲスト仮想マシンのシャットダウン
      # virsh shutdown rhel6
      
      Domain rhel6 is being shutdown
      
    3. ゲスト仮想マシンがシャットダウンするまで数秒待ちます。
      # virsh list --all
       Id Name                 State
      ----------------------------------
        . rhel6                shut off
      
    4. 編集した XML ファイルを使用して、rhel6 という名前のドメインを開始します。
      # virsh start rhel6
    5. rhel6 ゲスト仮想マシンの acpi をシャットダウンします。
      # virsh shutdown --mode acpi rhel6 
    6. すべてのドメインを再度一覧表示し、rhel6 が一覧に含まれていることを確認し、シャットダウンしていることを示します。
      # virsh list --all
         Id Name                 State
      ----------------------------------
         rhel6                shut off
      
    7. 編集した XML ファイルを使用して、rhel6 という名前のドメインを開始します。
      # virsh start rhel6
    8. rhel6 ゲスト仮想マシンゲストエージェントをシャットダウンします。
      # virsh shutdown --mode agent rhel6
    9. ドメインを一覧表示します。rhel6 はまだリストに含まれており、シャットオフされていることを示しているはずです。
      # virsh list --all
         Id Name                 State
      ----------------------------------
         rhel6                shut off
      
ゲスト仮想マシンは、上記の回避策を使用せずに、連続したシャットダウンの virsh shutdown コマンドを使用してシャットダウンします。
上記の方法の他に、libvirt-guests サービスを停止することで、ゲストを自動的にシャットダウンできます。この方法に関する詳細は、「libvirt-guests 設定設定の操作」 を参照してください。

14.9.3. libvirt-guests 設定設定の操作

libvirt-guests サービスには、ゲストが適切にシャットダウンするように設定できるパラメーターがあります。これは、libvirt インストールの一部で、デフォルトでインストールされるパッケージです。このサービスは、ホストのシャットダウン時にゲストをディスクに自動的に保存し、ホストの再起動時にゲストをシャットダウン前の状態に復元します。デフォルトでは、この設定はゲストを一時停止するように設定されています。ゲストをシャットオフする場合は、libvirt-guests 設定ファイルのパラメーターの 1 つを変更する必要があります。

手順14.5 ゲストの正常なシャットダウンを可能にするための libvirt-guests サービスパラメーターの変更

ここで説明する手順では、ホストの物理マシンが停止している場合、電源が切れている場合、または再起動が必要な場合に、ゲスト仮想マシンを正常にシャットダウンできるようにします。
  1. 設定ファイルを開きます。

    設定ファイルは /etc/sysconfig/libvirt-guests にあります。ファイルを編集し、コメントマーク (#) を削除し、ON_SHUTDOWN=suspendON_SHUTDOWN=shutdown に変更します。変更を保存することを忘れないでください。
    $ vi /etc/sysconfig/libvirt-guests
    
    # URIs to check for running guests
    # example: URIS='default xen:/// vbox+tcp://host/system lxc:///'
    #URIS=default
    
    # action taken on host boot
    # - start   all guests which were running on shutdown are started on boot
    #           regardless on their autostart settings
    # - ignore  libvirt-guests init script won't start any guest on boot, however,
    #           guests marked as autostart will still be automatically started by
    #           libvirtd
    #ON_BOOT=start
    
    # Number of seconds to wait between each guest start. Set to 0 to allow
    # parallel startup.
    #START_DELAY=0
    
    # action taken on host shutdown
    # - suspend   all running guests are suspended using virsh managedsave
    # - shutdown  all running guests are asked to shutdown. Please be careful with
    #             this settings since there is no way to distinguish between a
    #             guest which is stuck or ignores shutdown requests and a guest
    #             which just needs a long time to shutdown. When setting
    #             ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a
    #             value suitable for your guests.
    ON_SHUTDOWN=shutdown
    
    # If set to non-zero, shutdown will suspend guests concurrently. Number of
    # guests on shutdown at any time will not exceed number set in this variable.
    #PARALLEL_SHUTDOWN=0
    
    # Number of seconds we're willing to wait for a guest to shut down. If parallel
    # shutdown is enabled, this timeout applies as a timeout for shutting down all
    # guests on a single URI defined in the variable URIS. If this is 0, then there
    # is no time out (use with caution, as guests might not respond to a shutdown
    # request). The default value is 300 seconds (5 minutes).
    #SHUTDOWN_TIMEOUT=300
    
    # If non-zero, try to bypass the file system cache when saving and
    # restoring guests, even though this may give slower operation for
    # some file systems.
    #BYPASS_CACHE=0
    ???
    URIS - checks the s