Menu Close
Settings Close

Language and Page Formatting Options

Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

仮想化の導入および管理ガイド

Red Hat Enterprise Linux 7

RHEL 物理マシンでの仮想マシンのインストール、設定、および管理

概要

本ガイドでは、Red Hat Enterprise Linux 7 マシンを仮想化ホストシステムとして機能するように設定する方法と、KVM ハイパーバイザーを使用してゲスト仮想マシンをインストールおよび設定する方法を説明します。他のトピックには、PCI デバイスの設定、SR-IOV、ネットワーク、ストレージ、デバイス、およびゲストの仮想マシン管理やトラブルシューティング、互換性、制限が含まれます。ゲスト仮想マシンで実行する必要のある手順は、明示的に記載されています。
重要
本ガイドのすべての手順は、特に記載がない限り、AMD64 または Intel 64 のホストマシンで実行することが意図されています。AMD64 および Intel 64 以外のアーキテクチャーで Red Hat Enterprise Linux 7 仮想化を使用する場合は、付録B 複数のアーキテクチャー上での KVM 仮想化の使用 を参照してください。
Red Hat が提供する仮想化ソリューションの概要は、Red Hat Enterprise Linux 7 Virtualization Getting Started Guide を参照してください。

パート I. デプロイメント

この部分では、仮想ホストシステムとして機能する Red Hat Enterprise Linux 7 マシンをインストールして設定する方法と、KVM ハイパーバイザーを使用してゲスト仮想マシンをインストールして設定する方法を説明します。

第1章 システム要件

仮想化は、Intel 64 および AMD64 アーキテクチャー上の Red Hat Enterprise Linux 7 の KVM ハイパーバイザーで利用できます。本章では、仮想マシン (VM とも呼ばれる)のシステム要件を紹介します。
仮想化パッケージのインストール方法は、2章仮想化パッケージのインストールを参照してください。

1.1. ホストシステム要件

ホストシステムの最小要件

  • 6 GB の空きディスク容量
  • 2 GB RAM
ゲストの仮想マシン要件の概要は、7章KVM でのオーバーコミット を参照してください。

1.2. KVM ハイパーバイザーの要件

KVM ハイパーバイザーには、以下が必要です。
  • x86 ベースのシステム用の Intel VT-x および Intel 64 の仮想化拡張機能を搭載した Intel プロセッサー。
  • AMD-V および AMD64 仮想化拡張機能を搭載した AMD プロセッサー。
完全仮想化には、仮想化拡張機能 (Intel VT-x または AMD-V) が必要です。次のコマンドを入力して、システムにハードウェア仮想化拡張機能があるかどうか、およびそれらが有効になっているかどうかを確認します。

手順1.1 仮想化拡張機能の検証

  1. CPU 仮想化拡張機能が利用可能であることを確認します。

    次のコマンドを実行して、CPU 仮想化拡張機能が利用可能であることを確認します。
    $ grep -E 'svm|vmx' /proc/cpuinfo
  2. 出力を分析します。

    • 以下の例では、Intel VT-x 拡張機能を持つ Intel プロセッサーを示すvmx エントリーが含まれています。
      flags   : fpu tsc msr pae mce cx8 vmx apic mtrr mca cmov pat pse36 clflush
      dts acpi mmx fxsr sse sse2 ss ht tm syscall lm constant_tsc pni monitor ds_cpl
      vmx est tm2 cx16 xtpr lahf_lm
      
    • 以下の例では、AMD-V 拡張機能を持つ AMD プロセッサーを示すsvm エントリーが含まれています。
      flags   :  fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush
      mmx fxsr sse sse2 ht syscall nx mmxext svm fxsr_opt lm 3dnowext 3dnow pni cx16
      lahf_lm cmp_legacy svm cr8legacy ts fid vid ttp tm stc
      
    grep -E 'svm|vmx' /proc/cpuinfo コマンドが出力を返す場合、プロセッサーにはハードウェア仮想化の拡張機能が含まれます。状況によっては、製造元が BIOS で仮想化拡張機能を無効にする場合があります。拡張機能が表示されない、または完全仮想化が機能しない場合は、BIOS 設定ユーティリティーで拡張機能を有効にする手順の 手順A.3「BIOS での仮想化拡張機能の有効化」 を参照してください。
  3. KVM カーネルモジュールが読み込まれていることを確認します。

    追加の確認として、以下のコマンドを使用して、kvm モジュールがカーネルに読み込まれていることを確認します。
    # lsmod | grep kvm
    出力に kvm_intel または kvm_amd が含まれる場合は、kvm ハードウェア仮想化モジュールが読み込まれます。
注記
virsh ユーティリティー (libvirt-client パッケージにより提供) では、以下のコマンドを使用して、システムの仮想化機能の完全な一覧を出力できます。
# virsh capabilities

1.3. KVM ゲスト仮想マシンの互換性

Red Hat Enterprise Linux 7 サーバーには、特定のサポート制限があります。
以下の URL では、Red Hat Enterprise Linux のプロセッサーとメモリーの制限を説明します。
以下の URL は、Red Hat Enterprise Linux KVM ホストで実行することが認定されているゲストオペレーティングシステムの一覧です。
注記
KVM ハイパーバイザーの制限およびサポート制限の詳細は、付録C 仮想化の制限を参照してください。

1.4. サポートされているゲスト CPU モデル

すべてのハイパーバイザーには、ゲストにデフォルトで表示される CPU 機能に関する独自のポリシーがあります。 ハイパーバイザーによりゲストに提示される CPU 機能のセットは、ゲスト仮想マシンの設定で選択された CPU モデルによって異なります。

1.4.1. ゲスト CPU モデルの一覧表示

アーキテクチャータイプで対応している CPU モデルの一覧を表示するには、virsh cpu-models architecture を実行します。以下は例になります。
$ virsh cpu-models x86_64
486
pentium
pentium2
pentium3
pentiumpro
coreduo
n270
core2duo
qemu32
kvm32
cpu64-rhel5
cpu64-rhel6
kvm64
qemu64
Conroe
Penryn
Nehalem
Westmere
SandyBridge
Haswell
athlon
phenom
Opteron_G1
Opteron_G2
Opteron_G3
Opteron_G4
Opteron_G5
$ virsh cpu-models ppc64
POWER7
POWER7_v2.1
POWER7_v2.3
POWER7+_v2.1
POWER8_v1.0
対応している CPU モデルと機能の一覧は、/usr/share/libvirt/ にある cpu_map.xml ファイルに記載されています。
# cat /usr/share/libvirt/cpu_map.xml
ゲストの CPU モデルおよび機能は、ドメイン XML ファイルの <cpu> セクションで変更できます。詳細は、「CPU モデルとトポロジー」 を参照してください。
ホストモデルは、必要に応じて、指定した機能セットを使用するように設定できます。詳細は、「指定した CPU の機能セットの変更」 を参照してください。

第2章 仮想化パッケージのインストール

仮想化を使用するには、コンピューターに Red Hat 仮想化パッケージがインストールされている必要があります。仮想化パッケージは、Red Hat Enterprise Linux のインストール時、またはインストール後に、yum コマンドと Subscription Manager アプリケーションを使用してインストールできます。
KVM ハイパーバイザーは、kvm カーネルモジュールとともにデフォルトの Red Hat Enterprise Linux カーネルを使用します。

2.1. Red Hat Enterprise Linux のインストール中の仮想化パッケージのインストール

本セクションでは、Red Hat Enterprise Linux のインストール時に仮想化パッケージをインストールする方法を説明します。
注記
Red Hat Enterprise Linux のインストールの詳細は、Red Hat Enterprise Linux 7 Installation Guide を参照してください。
重要
Anaconda インターフェースでは、Red Hat Enterprise Linux Server のインストール時に Red Hat 仮想化パッケージをインストールするオプションのみが提供されます。
Red Hat Enterprise Linux Workstation をインストールする場合、Red Hat 仮想化パッケージはワークステーションのインストールが完了しないとインストールできません。「既存の Red Hat Enterprise Linux システムへの仮想化パッケージのインストール」を参照してください。

手順2.1 仮想化パッケージのインストール

  1. ソフトウェアの選択

    Installation Summary 画面までのインストール手順に従います。

    図2.1 Installation Summary 画面

    イメージは、インストールの概要 画面を示しています。ここでは、グループヘッダーの下に、設定可能なオプションの一覧を表示しています。ローカリゼーション の見出しの下に、日付と時刻、言語サポート、および キーボード があります。ソフトウェア の見出しの下に、インストールソース および ソフトウェアの選択 があります。システム の見出しの下に、インストール先 および インストール先 があります。
    インストールの概要 画面で、ソフトウェアの選択 を選択します。ソフトウェアの選択 画面が開きます。
  2. サーバータイプおよびパッケージグループの選択

    Red Hat Enterprise Linux 7 は、基本的な仮想化パッケージのみ、またはグラフィカルユーザーインターフェースを介してゲストの管理を可能にするパッケージでインストールできます。次のいずれかを行います。
    • 最小限の仮想化ホストをインストールします
      ベース環境ペインの 仮想化ホスト ラジオボタンを選択し、選択した環境のアドオン ペインの 仮想化プラットフォーム チェックボックスを選択します。これにより、virsh を使用して実行、またはネットワーク経由でリモートで実行できる基本的な仮想化環境がインストールされます。

      図2.2 ソフトウェアの選択の画面で選択した仮想化ホスト

      イメージ は、2 つの見出しの下にオプションを一覧表示する ソフトウェアの選択 のスクリーンを示しています。ベース環境 および 選択した環境のアドオン。仮想化ホスト は、ベース環境 のオプションから強調表示され、仮想化プラットフォーム は 選択した環境のアドオン のオプションから強調表示されています。
    • グラフィカルユーザーインターフェースを使用した仮想化ホストのインストール
      ベース環境ペインの サーバー (GUI 使用) ラジオボタンを選択し、選択した環境のアドオン ペインの 仮想化クライアント仮想化ハイパーバイザー、および 仮想化ツール のチェックボックスを選択します。これにより、仮想化環境に加えて、ゲスト仮想マシンのインストールおよび管理用のグラフィカルツールがインストールされます。

      図2.3 ソフトウェア選択画面で GUI が選択されているサーバー

      イメージ は、2 つの見出しの下にオプションを一覧表示する ソフトウェアの選択 のスクリーンを示しています。ベース環境 および 選択した環境のアドオン。サーバー (GUI 使用) は、ベース環境 のオプションの中から強調表示されており、仮想化クライアント、仮想化ハイパーバイザー、仮想化ツール は、選択した環境のアドオン のオプションの中から強調表示されています。
  3. インストールの終了

    完了 をクリックして、インストールを続行します。
重要
仮想化パッケージの更新を受信するには、有効な Red Hat Enterprise Linux サブスクリプションが必要です。

2.1.1. キックスタートファイルを使用した KVM パッケージのインストール

キックスタートファイルを使用して、仮想化パッケージで Red Hat Enterprise Linux をインストールする場合は、キックスタートファイルの %packages セクションに以下のパッケージグループを追加します。
@virtualization-hypervisor
@virtualization-client
@virtualization-platform
@virtualization-tools
キックスタートファイルを使用したインストールの詳細は、Red Hat Enterprise Linux 7 Installation Guide を参照してください。

2.2. 既存の Red Hat Enterprise Linux システムへの仮想化パッケージのインストール

本セクションでは、既存の Red Hat Enterprise Linux 7 システムに KVM ハイパーバイザーをインストールする手順を説明します。
パッケージをインストールするには、マシンを登録し、Red Hat カスタマーポータルにサブスクライブする必要があります。Red Hat Subscription Manager を使用して登録する場合は、subscription-manager register コマンドを実行し、プロンプトに従います。または、アプリケーション → デスクトップの システムツール で Red Hat Subscription Manager アプリケーションを実行して登録します。
有効な Red Hat サブスクリプションをお持ちでない場合は、Red Hat オンラインストア にアクセスして取得してください。Red Hat カスタマーポータルへのシステムの登録およびサブスクライブの詳細は、https://access.redhat.com/solutions/253273 を参照してください。

2.2.1. 仮想化パッケージの手動インストール

Red Hat Enterprise Linux で仮想化を使用するには、少なくとも以下のパッケージをインストールする必要があります。
  • qemu-kvm:このパッケージは、ユーザーレベルの KVM エミュレーターを使用し、ホストとゲスト仮想マシン間の通信を容易にします。
  • qemu-img:このパッケージは、ゲスト仮想マシンのディスク管理を提供します。
    注記
    qemu-img パッケージは qemu-kvm パッケージの依存関係としてインストールされます。
  • libvirt:このパッケージは、ハイパーバイザーおよびホストシステムと対話するためにサーバーおよびホスト側のライブラリーを提供し、ライブラリー呼び出しの処理、仮想マシンの管理およびハイパーバイザーの制御を行う libvirtd デーモンも提供します。
これらのパッケージをインストールするには、以下のコマンドを入力します。
# yum install qemu-kvm libvirt
いくつかの追加の仮想化管理パッケージも利用可能であり、仮想化を使用する場合に推奨されます。
  • virt-install:このパッケージは、コマンドラインからの仮想マシンを作成するための virt-install コマンドを提供します。
  • libvirt-python:このパッケージには、Python プログラミング言語で書かれているアプリケーションが libvirt API で提供されるインターフェースを使用できるようにするモジュールが含まれています。
  • virt-manager:このパッケージには、Virtual Machine Manager と呼ばれる virt-manager ツールが含まれます。これは、仮想マシンを管理するためのグラフィカルツールです。管理 API として libvirt-client ライブラリーを使用します。
  • libvirt-client:このパッケージは、libvirt サーバーにアクセスするためのクライアント側の API とライブラリーを提供します。libvirt-client パッケージには、コマンドラインまたは特別な仮想化シェルから仮想マシンとハイパーバイザーを管理および制御する virsh コマンドラインツールが含まれます。
以下のコマンドを使用すると、推奨される仮想化パッケージをすべてインストールできます。
# yum install virt-install libvirt-python virt-manager virt-install libvirt-client

2.2.2. 仮想化パッケージグループのインストール

仮想化パッケージは、パッケージグループからインストールすることもできます。yum grouplist hidden commad を実行すると、利用可能なグループの一覧を表示できます。
利用可能なパッケージグループの完全なリスト、以下の表では、仮想化パッケージグループと、そのパッケージグループが提供するものについて説明しています。

表2.1 仮想化パッケージグループ

パッケージグループ 説明 必須パッケージ オプションパッケージ
Virtualization Hypervisor 可能な限り最小の仮想化ホストのインストール libvirt、qemu-kvm、qemu-img qemu-kvm-tools
Virtualization Client 仮想化インスタンスのインストールおよび管理を行うクライアント gnome-boxes、virt-install、virt-manager、virt-viewer、qemu-img virt-top、libguestfs-tools、libguestfs-tools-c
Virtualization Platform 仮想マシンおよびコンテナーへのアクセスと制御を行うインターフェースを提供します。 libvirt、libvirt-client、virt-who、qemu-img fence-virtd-libvirt、fence-virtd-multicast、fence-virtd-serial、libvirt-cim、libvirt-java、libvirt-snmp、perl-Sys-Virt
Virtualization Tools オフラインの仮想イメージ管理用ツール libguestfs、qemu-img libguestfs-java、libguestfs-tools、libguestfs-tools-c
パッケージグループをインストールするには、yum group install package_group コマンドを実行します。たとえば、すべてのパッケージタイプを含む Virtualization Tools パッケージグループをインストールするには、次のコマンドを実行します。
# yum group install "Virtualization Tools" --setopt=group_package_types=mandatory,default,optional
パッケージグループのインストールに関する詳細は、「 How to install a group of packages with yum on Red Hat Enterprise Linux?」を参照してください。ナレッジベース記事。

第3章 仮想マシンの作成

Red Hat Enterprise Linux 7 ホストシステムに virtualization packages をインストールしたら、virt-manager インターフェースを使用して、仮想マシンを作成し、ゲストオペレーティングシステムをインストールできます。あるいは、パラメーターの一覧またはスクリプトを使用して、virt-install コマンドラインユーティリティを使用できます。この章では、両方の方法について説明します。

3.1. ゲスト仮想マシンのデプロイメントに関する考慮事項

ゲスト仮想マシンを作成する場合は、さまざまな要因を考慮してください。仮想マシンのロールはデプロイメントの前に評価する必要がありますが、変数ファクター (負荷、クライアント量) に基づく定期的な監視と評価も行う必要があります。要因は以下のとおりです。
パフォーマンス
ゲスト仮想マシンは、目的のタスクに基づいてデプロイおよび設定する必要があります。一部のゲストシステム (データベースサーバーを実行しているゲストなど) では、パフォーマンスに関する特別な考慮事項が必要になる場合があります。ゲストは、そのロールと、予測されるシステム負荷に基づいて、より多くの割り当てられた CPU またはメモリーを必要とする場合があります。
入出力の要件と入出力の種類
ゲスト仮想マシンによっては、I/O 要件が特に高い場合や、I/O のタイプ (通常のディスクブロックサイズのアクセスやクライアント数など) に基づいて、さらに検討または予測が必要になる場合があります。
ストレージ
ゲスト仮想マシンによっては、ストレージまたは高速なディスクタイプへのより高い優先度のアクセスが必要な場合や、ストレージの領域への排他的アクセスが必要な場合があります。ゲストが使用するストレージの量も定期的に監視され、ストレージのデプロイメントおよびメンテナンスの際に考慮される必要があります。Red Hat Enterprise Linux 7 Virtualization Security Guide で説明されているすべての考慮事項を必ずお読みください。また、物理ストレージが仮想ストレージのオプションを制限する可能性があることを理解しておくことが重要です。
ネットワークとネットワークインフラストラクチャー
使用環境によっては、ゲスト仮想マシンの中には、他のゲストよりも速いネットワークリンクが必要なものもあります。帯域幅または遅延は、特に要件や負荷の変更として、ゲストのデプロイメントおよびメンテナンスを行う際の要因となることがよくあります。
要件の要求
virtio ドライブがディスク全体でバックアップされており、ディスクデバイスパラメーターが ドメイン XML ファイルlun に設定されている場合は、virtio ドライブのゲスト仮想マシンにのみ SCSI 要求を発行できます。以下に例を示します。
<devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='block' device='lun'>

3.2. virt-install を使用したゲストの作成

virt-install コマンドを使用すると、コマンドラインから仮想マシンを作成し、その仮想マシンにオペレーティングシステムをインストールできます。virt-install は、対話式に使用することも、スクリプトの一部として使用して仮想マシンの作成を自動化することもできます。対話式のグラフィカルインストールを使用している場合は、virt-viewer をインストールしてから virt-install を実行してください。また、キックスタートファイルを使用した virt-install を使用して、仮想マシンのオペレーティングシステムの自動インストールを起動できます。
注記
virt-install コマンドの中には、正常に完了するために root 特権が必要なものがあります。
virt-install ユーティリティーは、多くのコマンドラインオプションを使用します。ただし、ほとんどのvirt-installオプションは必要ありません。
仮想ゲストマシンのインストールに必要な主なオプションは以下のとおりです。
--name
仮想マシンの名前。
--memory
ゲストに割り当てるメモリーの量 (MiB)。
ゲストストレージ
次のいずれかのゲストストレージオプションを使用します。
  • --disk
    仮想マシンのストレージ設定の詳細--disk none オプションを使用すると、仮想マシンが作成されますが、ディスク領域はありません。
  • --filesystem
    仮想マシンゲストのファイルシステムのパス。
インストール方法
次のいずれかのインストール方法を使用します。
  • --location
    インストールメディアの場所。
  • --cdrom
    仮想 CD-ROM デバイスとして使用されるファイルまたはデバイス。これは、ISOイメージへのパス、または最小ブートISOイメージをフェッチまたはアクセスするためのURLにすることができます。ただし、物理ホストの CD-ROM または DVD-ROM デバイスは使用できません。
  • --pxe
    PXE 起動プロトコルを使用して、ゲストのインストールプロセスを開始する初期 ramdisk とカーネルを読み込みます。
  • --import
    OS のインストールプロセスをスキップし、既存のディスクイメージの周囲にゲストを構築します。起動に使用されるデバイスは、disk または filesystem オプションで指定された最初のデバイスです。
  • --boot
    インストール後の仮想マシンの起動設定このオプションにより、起動デバイスの順序を指定し、オプションのカーネル引数を指定して BIOS 起動メニューを有効にし、カーネルと initrd を永続的に起動できます。
オプションの一覧を表示するには、次のコマンドを実行します。
# virt-install --help
オプションの属性の一覧を表示するには、次のコマンドを実行します。
# virt install --option=?
また、virt-install の man ページでは、各コマンドオプション、重要な変数、および例が説明されています。
virt-install を実行する前に、qemu-img を使用してストレージオプションを設定する必要がある場合もあります。qemu-img の使用方法は、14章qemu-img の使用 を参照してください。

3.2.1. ISO イメージからの仮想マシンのインストール

以下の例では、ISO イメージから仮想マシンをインストールします。
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --cdrom /path/to/rhel7.iso \ 
  --os-variant rhel7 
--cdrom /path/to/rhel7.iso オプションは、指定した場所に CD または DVD イメージから仮想マシンをインストールすることを指定します。

3.2.2. 仮想マシンイメージのインポート

以下の例では、仮想ディスクイメージから仮想マシンをインポートします。
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk /path/to/imported/disk.qcow \ 
  --import \ 
  --os-variant rhel7 
--import オプションは、--disk /path/to/imported/disk.qcow オプションで指定した仮想ディスクイメージから仮想マシンをインポートすることを指定します。

3.2.3. ネットワークからの仮想マシンのインストール

以下の例では、ネットワークの場所から仮想マシンをインストールします。
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 
--location http://example.com/path/to/os オプションは、インストールツリーが指定したネットワークロケーションにあることを指定します。

3.2.4. PXE を使用した仮想マシンのインストール

PXE ブートプロトコルを使用して仮想マシンをインストールする場合は、ブリッジネットワークを指定する --network オプションと、--pxe オプションの両方を指定する必要があります。
以下の例では、PXE を使用して仮想マシンをインストールします。
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --network=bridge:br0 \ 
  --pxe \ 
  --os-variant rhel7 

3.2.5. キックスタートを使用した仮想マシンのインストール

以下の例では、キックスタートファイルを使用して仮想マシンをインストールします。
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 \
  --initrd-inject /path/to/ks.cfg \ 
  --extra-args="ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8" 
initrd-inject オプションおよび extra-args オプションでは、キックスターターファイルを使用して仮想マシンをインストールすることを指定します。

3.2.6. ゲストの作成時のゲスト仮想マシンネットワークの設定

ゲスト仮想マシンを作成する場合は、仮想マシンのネットワークを指定および設定できます。このセクションでは、ゲスト仮想マシンの各メインネットワークタイプのオプションを説明します。

NAT を使用したデフォルトネットワーク

デフォルトネットワークは、libvirtd のネットワークアドレス変換 (NAT) 仮想ネットワークスイッチを使用します。NAT の詳細は「libvirt を使用した NAT (ネットワークアドレス変換)」 を参照してください。
NAT を使用したデフォルトネットワークでゲスト仮想マシンを作成する前に、libvirt-daemon-config-network パッケージがインストールされていることを確認してください。
ゲスト仮想マシンに NAT ネットワークを設定するには、virt-install に次のオプションを使用します。
--network default
注記
network オプションを指定しない場合は、ゲスト仮想マシンが NAT を使用したデフォルトネットワークで設定されます。

DHCP によるブリッジネットワーク

ブリッジネットワーク用に設定すると、ゲストは外部の DHCP サーバーを使用します。ホストに静的ネットワーク設定があり、ゲストがローカルエリアネットワーク (LAN) との完全な着信接続および発信接続を必要とする場合は、このオプションを使用してください。ゲスト仮想マシンでライブマイグレーションを実行する場合に使用します。ゲスト仮想マシンに DHCP を使用したブリッジネットワークを設定するには、次のオプションを使用します。
--network br0
注記
virt-install を実行する前に、ブリッジを個別に作成する必要があります。ネットワークブリッジの作成方法は、「Red Hat Enterprise Linux 7 ホストでのブリッジネットワークの設定」 を参照してください。

静的 IP アドレスを持つブリッジネットワーク

ブリッジネットワークは、静的 IP アドレスを使用するようにゲストを設定するためにも使用できます。ゲスト仮想マシンに静的 IP アドレスを使用してブリッジネットワークを設定するには、次のオプションを使用します。
--network br0 \
--extra-args "ip=192.168.1.2::192.168.1.1:255.255.255.0:test.example.com:eth0:none"
ネットワークブートオプションの詳細は、Red Hat Enterprise Linux 7 Installation Guide を参照してください。

ネットワークなし

ネットワークインターフェースを使用せずにゲスト仮想マシンを設定する場合は、次のオプションを使用します。
--network=none

3.3. virt-manager を使用したゲストの作成

Virtual Machine Manager (virt-manager とも呼ばれる) は、ゲスト仮想マシンを作成および管理するグラフィカルツールです。
本セクションでは、virt-manager を使用して、Red Hat Enterprise Linux 7 ホストに Red Hat Enterprise Linux 7 ゲスト仮想マシンをインストールする方法を説明します。
この手順では、KVM ハイパーバイザーおよびその他の必要なパッケージがインストールされ、ホストが仮想化用に設定されていることを前提としています。仮想化パッケージのインストール方法は、2章仮想化パッケージのインストール を参照してください。

3.3.1. virt-manager インストールの概要

New VM ウィザードでは、仮想マシンの作成プロセスが 5 つの手順に分けられます。
  1. ハイパーバイザーとインストールタイプの選択
  2. インストールメディアの場所と設定
  3. メモリーおよび CPU オプションの設定
  4. 仮想マシンのストレージの設定
  5. 仮想マシンの名前、ネットワーク、アーキテクチャー、およびその他のハードウェア設定の構成
続行する前に、virt-manager がインストールメディア (ローカルまたはネットワーク上) にアクセスできることを確認してください。

3.3.2. virt-manager を使用した Red Hat Enterprise Linux 7 ゲストの作成

この手順では、ローカルに保存されたインストール DVD または DVD イメージを使用して、Red Hat Enterprise Linux 7 ゲスト仮想マシンを作成する方法を説明します。Red Hat Enterprise Linux 7 の DVD イメージは、Red Hat カスタマーポータル から入手できます。
注記
SecureBoot を有効にして仮想マシンをインストールする場合は、virt-manager を使用した SecureBoot Red Hat Enterprise Linux 7 ゲストの作成 を参照してください。

手順3.1 ローカルインストールメディアを使用した virt-manager での Red Hat Enterprise Linux 7 ゲスト仮想マシンの作成

  1. オプション:準備

    仮想マシンのストレージ環境を準備します。ストレージの準備の詳細は、13章仮想マシン用のストレージの管理 を参照してください。
    重要
    ゲスト仮想マシンの保存には、さまざまなストレージタイプを使用できます。ただし、仮想マシンで移行機能を使用できるようにするには、ネットワークストレージに仮想マシンを作成する必要があります。
    Red Hat Enterprise Linux 7 には、少なくとも 1GB のストレージ領域が必要です。ただし、Red Hat Enterprise Linux 7 のインストールおよびこのガイドの手順には、Red Hat は、少なくとも 5GB のストレージ領域を使用することを推奨します。
  2. virt-manager を開き、ウィザードを起動します。

    root で virt-manager コマンドを実行するか、ApplicationsSystem ToolsVirtual Machine Manager を開き、virt-manager を開きます。

    図3.1 Virtual Machine Manager ウィンドウ

    Virtual Machine Manager ウィンドウ
    必要に応じて、ハイパーバイザーを選択し、Connect ボタンをクリックして、リモートハイパーバイザーを開きます。
    をクリックし、新しい仮想化ゲストウィザードを開始します。
    New VM ウィンドウが開きます。
  3. インストールタイプを指定します。

    インストールタイプを選択します。
    ローカルインストールメディア (ISO イメージまたは CDROM)
    この方法では、インストールディスクのイメージ (.iso など) を使用します。ただし、ホスト CD-ROM または DVD-ROM デバイスを使用することは、できません
    ネットワークインストール (HTTP、FTP、または NFS)
    この方法では、ミラーリングした Red Hat Enterprise Linux または Fedora インストールツリーを使用してゲストをインストールします。インストールツリーには、HTTP、FTP、または NFS のいずれかを介してアクセスできる必要があります。
    Network Install を選択した場合は、インストール URL と、カーネルオプション (必要な場合) を指定します。
    ネットワーク起動 (PXE)
    この方法では、PXE (Preboot eXecution Environment) サーバーを使用して、ゲスト仮想マシンをインストールします。PXE サーバーの設定については、Red Hat Enterprise Linux 7 Installation Guide で説明されています。ネットワークブートを使用してインストールするには、ゲストに、ルーティング可能な IP アドレスまたは共有ネットワークデバイスが必要です。
    Network Boot を選択した場合は、手順 5 に進みます。すべての手順が完了すると、DHCP 要求が送信され、有効な PXE サーバーが見つかると、ゲスト仮想マシンのインストールプロセスが開始します。
    既存のディスクイメージのインポート
    この方法を使用すると、新しいゲスト仮想マシンを作成し、(インストール済みの起動可能なオペレーティングシステムを含む) ディスクイメージを読み込むことができます。

    図3.2 仮想マシンのインストール方法

    仮想マシンのインストール方法
    進む をクリックして続けます。
  4. インストールソースを選択します。

    1. Local install media (ISO image or CDROM) を選択した場合は、目的のローカルインストールメディアを指定します。

      図3.3 ローカル ISO イメージのインストール

      ローカル ISO イメージのインストール
      警告
      このオプションは、現在 GUI にありますが、ホストの物理 CD-ROM または DVD デバイスからインストールすることはできません。そのため、Use CDROM or DVD オプションを選択すると、仮想マシンのインストールに失敗します。詳しくは、Red Hat ナレッジベースを参照してください。
      ISO イメージからインストールする場合は、Use ISO image を選択し、Browse... ボタンをクリックして、Locate media volume ウィンドウを開きます。
      使用するインストールイメージを選択し、Choose Volume をクリックします。
      Locate media volume ウィンドウにイメージが表示されない場合は、Browse Local ボタンをクリックして、インストールイメージがあるホストマシン、またはインストールディスクが含まれる DVD ドライブを参照します。インストールディスクが含まれるインストールイメージまたは DVD ドライブを選択し、Open をクリックします。使用するボリュームが選択され、Create a new virtual machine ウィザードに戻ります。
      重要
      ISO イメージファイルおよびゲストストレージイメージの場合、推奨される使用場所は /var/lib/libvirt/images/ です。それ以外の場所では、SELinux による追加の設定が必要になる場合があります。SELinux の設定方法の詳細は、Red Hat Enterprise Linux Virtualization Security Guide または Red Hat Enterprise Linux SELinux User's and Administrator's Guide を参照してください。
    2. Network Install を選択した場合は、インストールソースの URL と、必要なカーネルオプション (存在する場合) を入力します。URL は、インストールツリーの root ディレクトリーを指している必要があります。このディレクトリーは、HTTP、FTP、または NFS のいずれかを介してアクセスできなければなりません。
      キックスタートインストールを実行するには、カーネルオプションで ks= から始まるキックスタートファイルの URL を指定します。

      図3.4 ネットワークキックスタートインストール

      ネットワークキックスタートインストール
      注記
      カーネルオプションの一覧は、 Red Hat Enterprise Linux 7 Installation Guide を参照してください。
    次に、インストールの OS typeVersion を設定します。仮想マシンに適したオペレーティングシステムの種類を選択していることを確認します。これは、手動で指定するか、Automatically detect operating system based on install media チェックボックスを選択して指定します。
    進む をクリックして続けます。
  5. メモリー (RAM) および仮想 CPU の設定

    仮想マシンに割り当てる CPU の数とメモリー量 (RAM) を指定します。ウィザードには、割り当てることができる CPU の数とメモリーの量が表示されます。この値は、ホストのパフォーマンスやゲストのパフォーマンスに影響を及ぼします。
    仮想マシンを効率的かつ効果的に実行するには、十分な物理メモリー (RAM) が必要です。Red Hat は、仮想マシンに 512MB 以上の RAM をサポートします。Red Hat では、各論理コアに 1024MB 以上の RAM を使用することを推奨しています。
    仮想マシンに十分な仮想 CPU を割り当てます。仮想マシンでマルチスレッドアプリケーションを実行している場合は、ゲスト仮想マシンが効率的に実行するために必要な仮想 CPU の数を割り当てます。
    ホストシステムで利用可能な物理プロセッサー (またはハイパースレッド) よりも多くの仮想 CPU を割り当てることはできません。利用可能な仮想 CPU の数は、Up to X available フィールドに記載されています。

    図3.5 メモリーおよび CPU の設定

    メモリーおよび CPU の設定
    メモリーと CPU の設定が完了したら、Forward をクリックして続行します。
    注記
    メモリーおよび仮想 CPU はオーバーコミットできます。オーバーコミットの詳細は、7章KVM でのオーバーコミット を参照してください。
  6. ストレージを設定します。

    仮想マシンおよび必要なアプリケーションに十分な領域を有効にして割り当てます。デスクトップインストールの場合は 5GB 以上、最小インストールの場合は 1GB 以上を割り当てます。

    図3.6 仮想ストレージの設定

    仮想ストレージの設定
    注記
    ライブおよびオフラインの移行では、仮想マシンを共有ネットワークストレージにインストールする必要があります。仮想マシンの共有ストレージの設定方法は、「共有ストレージの例単純な移行の NFS」 を参照してください。
    1. デフォルトのローカルストレージの場合

      Create a disk image on the computer's hard drive のラジオボタンを選択して、デフォルトストレージプールの /var/lib/libvirt/images/ ディレクトリーにファイルベースのイメージを作成します。作成するディスクイメージのサイズを入力します。Allocate entire disk now チェックボックスを選択すると、指定したサイズのディスクイメージが即座に作成されます。そうでない場合、ディスクイメージはいっぱいになると大きくなります。
      注記
      ストレージプールは仮想コンテナーですが、次の 2 つの要因で制限されます。つまり、qemu-kvm が許可する最大サイズと、ホストの物理マシンのディスクのサイズです。ストレージプールは、ホストの物理マシン上のディスクのサイズを超えてはなりません。最大サイズは、以下のとおりです。
      • virtio-blk = 2^63 バイトまたは 8 エクサバイト (raw ファイルまたはディスクを使用)
      • Ext4 = ~ 16TB (4KB のブロックサイズを使用)
      • XFS = ~8 エクサバイト
      • qcow2 およびホストのファイルシステムでは、非常に大きなイメージサイズを試行する際に、独自のメタデータとスケーラビリティーを評価/調整する必要があります。raw ディスクを使用すると、スケーラビリティーまたは最大サイズに影響を与えるレイヤーが減ります。
      Forward を選択して、ローカルハードドライブにディスクイメージを作成します。または、Select managed or other existing storage を選択し、Browse を選択して管理ストレージを設定します。
    2. ストレージプールを使用する場合

      Select managed or other existing storage を選択してストレージプールを使用する場合は、Browse をクリックして Locate or create storage volume ウィンドウを開きます。

      図3.7 Choose Storage Volume ウィンドウ

      Choose Storage Volume ウィンドウ
      1. Storage Pools 一覧からストレージプールを選択します。
      2. オプション: をクリックして、新しいストレージボリュームを作成します。Add a Storage Volume のスクリーンが表示されます。新しいストレージボリュームの名前を入力します。
        Format ドロップダウンメニューから形式オプションを選択します。形式のオプションには、raw、qcow2、 および qedなどがあります。必要に応じてその他のフィールドを調整します。ここで使用される qcow2 バージョンはバージョン 3 であることに注意してください。qcow バージョンを変更するには、「target 要素の設定」 を参照してください。

        図3.8 Add a Storage Volume ウィンドウ

        Add a Storage Volume ウィンドウ
    新しいボリュームを選択し、Choose volume をクリックします。次に、Finish をクリックして、New VM ウィザードに戻ります。進む をクリックして続けます。
  7. 名前を付けて最終設定を行います。

    仮想マシンに名前を付けます。仮想マシン名には、文字、数字、およびアンダースコア (_)、ピリオド (.)、およびハイフン (-) を含めることができます。仮想マシンを移行するには、仮想マシンの名前は一意でなければならず、数字のみの名前は使用できません。
    デフォルトで、仮想マシンは 'default' というネットワークの Network Address Translation (NAT) を使用して作成されます。ネットワークの選択を変更するには、Network selection をクリックしてホストデバイスとソースモードを選択します。
    仮想マシンの設定を確認し、必要に応じて Finish をクリックします。指定したネットワーク設定、仮想化の種類、およびアーキテクチャーを持つ仮想マシンが作成されます。

    図3.9 設定の確認

    設定の確認
    あるいは、仮想マシンのハードウェアをさらに設定する場合は、Customize configuration before install のチェックボックスにチェックを入れ、ゲストのストレージまたはネットワークデバイスを変更するか、準仮想化 (virtio) ドライバーを使用するか、またはデバイスを追加します。これにより、別のウィザードが開き、仮想マシンのハードウェア設定の追加、削除、および設定ができるようになります。
    注記
    Red Hat Enterprise Linux 4 または Red Hat Enterprise Linux 5 のゲスト仮想マシンは、グラフィカルモードではインストールできません。このため、ビデオカードとして、「QXL」ではなく「Cirrus」を選択する必要があります。
    仮想マシンのハードウェアを設定したら、Apply をクリックします。virt-manager は、指定したハードウェア設定で仮想マシンを作成します。
    警告
    リモートメディアから、TCP/IP 接続を設定せずに Red Hat Enterprise Linux 7 ゲスト仮想マシンをインストールすると、インストールに失敗します。ただし、このような状況で Red Hat Enterprise Linux 5 または 6 のゲスト仮想マシンをインストールすると、インストーラーは "Configure TCP/IP" のインターフェースを開きます。
    この相違点の詳細は、the related knowledgebase article を参照してください。
    Finish をクリックして、Red Hat Enterprise Linux インストールシーケンスに進みます。Red Hat Enterprise Linux 7 のインストール方法の詳細は、Red Hat Enterprise Linux 7 Installation Guide を参照してください。
これで、ISO インストールディスクイメージから、Red Hat Enterprise Linux 7 ゲスト仮想マシンが作成されます。

3.4. virt-install インストールオプションと virt-manager インストールオプションの比較

この表では、仮想マシンのインストール時に、同等である virt-installvirt-manager のインストールオプションを比較するためのクイックリファレンスを提供します。
ほとんどのvirt-installオプションは必要ありません。最低要件は、--name--memory、guest storage (--disk--filesystem または --disk none)、およびインストールメソッド (--location--cdrom--pxe--import、または boot) です。これらのオプションは、引数でさらに指定されます。コマンドオプションと関連する引数の完全なリストを表示するには、次のコマンドを入力します。
# virt-install --help
virt-manager では、少なくとも名前、インストール方法、メモリー (RAM)、vCPU、ストレージが必要です。

表3.1 ゲストインストール用の virt-install と virt-manager の設定の比較

仮想マシンでの設定 virt-install オプション virt-manager インストールウィザードのラベルと手順番号
Virtual machine name --name、-n 名前 (手順 5)
割り当てる RAM (MiB) --ram, -r メモリー (RAM) (手順 3)
ストレージ - ストレージメディアを指定 --disk この仮想マシンのストレージを有効にする → コンピューターのハードドライブにディスクイメージを作成するか、管理対象またはその他の既存のストレージを選択します (手順 4)
ストレージ - ホストディレクトリーをゲストにエクスポートします。 --filesystem この仮想マシンでストレージを有効にする → 管理対象ストレージまたはその他の既存ストレージを選択します (手順 4)
ストレージ - ゲストにローカルディスクストレージを設定しません。 --nodisks 「この仮想マシンのストレージを有効にする」チェックボックスの選択を解除します (手順 4)。
インストールメディアの場所 (ローカルインストール) --file ローカルインストールメディア → インストールメディアの場所 (手順 1-2)
配布ツリーを使用したインストール (ネットワークインストール) --location ネットワークインストール → URL (手順 1-2)
PXE を使用したゲストのインストール --pxe ネットワークブート (手順 1)
vCPU の数 --vcpus CPU (手順 3)
ホストネットワーク --network 高度なオプションドロップダウンメニュー (手順 5)
オペレーティングシステムのバリアント/バージョン --os-variant バージョン (手順 2)
グラフィカル表示の方法 --graphics、--nographics * virt-manager は、GUI インストールのみを提供します。

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

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

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

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

手順4.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 プロファイルはポータルに残ります。クローン作成後に仮想マシンで RHSM 登録を再アクティベートするには、次の手順を行います。
          1. カスタマー ID コードを取得します。
            # subscription-manager identity
            subscription-manager identity: 71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
            
          2. 取得した ID コードを使用して仮想マシンを登録します。
            # subscription-manager register --consumerid=71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
  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
      注記
      次回の起動時に実行するウィザードは、仮想マシンから削除された設定によって異なります。また、クローンの初回起動時には、ホスト名を変更することが推奨されます。

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

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

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

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

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

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

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

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

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

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

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

  1. virt-manager を開く

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

    図4.1 Clone Virtual Machine ウィンドウ

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

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

      図4.2 Change MAC Address ウィンドウ

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

        図4.3 Change storage path ウィンドウ

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

    Clone をクリックします。

第5章 KVM 準仮想化 (virtio) ドライバー

準仮想化ドライバーはゲストのパフォーマンスを向上し、ゲスト I/O レイテンシーを下げ、ベアメタルレベルまでスループットを増加させます。I/O 負荷の高いタスクおよびアプリケーションを実行する完全に仮想化されたゲストには、準仮想化ドライバーを使用することが推奨されます。
Virtio ドライバーは、KVM ホストで実行しているゲスト仮想マシンで利用可能な、KVM の準仮想化デバイスドライバーです。これらのドライバーは、virtio パッケージに同梱されています。virtio パッケージは、ブロック (ストレージ) デバイスおよびネットワークインターフェースコントローラーに対応しています。
注記
PCI デバイスは、仮想システムのアーキテクチャーにより制限されます。割り当てられたデバイスを使用する場合の追加の制限は、16章ゲスト仮想マシンのデバイス設定 を参照してください。

5.1. 既存のストレージデバイスへの KVM virtio ドライバーの使用

ゲストに接続されている既存のハードディスクデバイスを変更して、仮想 IDE ドライバーの代わりに virtio ドライバーを使用できます。このセクションの例では、libvirt 設定ファイルを編集します。これらの手順を実行するためにゲスト仮想マシンをシャットダウンする必要はありませんが、ゲストが完全にシャットダウンされて再起動されるまで、変更は適用されないことに注意してください。

手順5.1 既存のデバイスへの KVM virtio ドライバーの使用

  1. 続行する前に、適切なドライバー (viostor) がインストールされていることを確認してください。
  2. root で virsh edit guestname コマンドを実行し、使用しているデバイスの XML 設定ファイルを編集します。たとえば、virsh edit guest1 です。設定ファイルは、/etc/libvirt/qemu/ ディレクトリーにあります。
  3. 以下は、仮想化 IDE ドライバーを使用したファイルベースのブロックデバイスです。これは、virtio ドライバーを使用しない仮想マシンの一般的なエントリーです。
    <disk type='file' device='disk'>
    	 ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='hda' bus='ide'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  4. bus= エントリーを virtio に変更して、virtio デバイスを使用するエントリーを変更します。ディスクが以前 IDE だった場合は、hdahdb、または hdc のようなターゲットがあることに注意してください。bus=virtio に変更する場合は、それに応じてターゲットを vdavdb、または vdc に変更する必要があります。
    <disk type='file' device='disk'>
       ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='vda' bus='virtio'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  5. ディスク タグ内の アドレス タグを削除します。これは、この手順が機能するために必ず行う必要があります。libvirt は、仮想マシンが次に起動したときに、アドレス タグを適切に再生成します。
あるいは、virt-managervirsh attach-disk、または virsh attach-interface は、virtio ドライバーを使用して新しいデバイスを追加できます。
Virtio の使用方法は、libvirt の Web サイトを参照してください。 http://www.linux-kvm.org/page/Virtio

5.2. 新しいストレージデバイス用に KVM virtio ドライバーを使用する

この手順では、virt-manager で KVM virtio ドライバーを使用して新しいストレージデバイスを作成する方法を説明します。
あるいは、virsh attach-disk コマンドまたは virsh attach-interface コマンドを使用して、virtio ドライバーを使用してデバイスを接続できます。
重要
新しいデバイスのインストールを続行する前に、ドライバーがゲストにインストールされていることを確認します。ドライバーが利用できない場合は、デバイスが認識されず、動作しません。

手順5.2 virtio ストレージドライバーを使用したストレージデバイスの追加

  1. virt-manager でゲストの名前をダブルクリックして、ゲスト仮想マシンを開きます。
  2. をクリックして、Show virtual hardware details タブを開きます。
  3. Show virtual hardware details タブで、Add Hardware ボタンをクリックします。
  4. ハードウェアタイプの選択

    Hardware typeとして Storage を選択します。

    図5.1 Add new virtual hardware ウィザード

    Storage で hardware type が選択されている Add new virtual hardware ウィザード。
  5. ストレージデバイスとドライバーを選択します。

    新しいディスクイメージを作成するか、ストレージプールボリュームを選択します。
    Device typeDisk device に設定し、 Bus typeVirtIO に設定して、virtio ドライバーを使用します。

    図5.2 Add new virtual hardware ウィザード

    Create a disk image on the computer's hard drive が選択されている Add new virtual hardware ウィザードの Storage ウィンドウ。
    Finish をクリックして手順を完了します。

手順5.3 virtio ネットワークドライバーを使用したネットワークデバイスの追加

  1. virt-manager でゲストの名前をダブルクリックして、ゲスト仮想マシンを開きます。
  2. をクリックして、Show virtual hardware details タブを開きます。
  3. Show virtual hardware details タブで、Add Hardware ボタンをクリックします。
  4. ハードウェアタイプの選択

    NetworkHardware type を選択します。

    図5.3 Add new virtual hardware ウィザード

    Network で hardware type が選択されている Add new virtual hardware ウィザード。
  5. ネットワークデバイスとドライバーを選択します。

    Device modelvirtio に設定して、virtio ドライバーを使用します。必要な Host device を選択します。

    図5.4 Add new virtual hardware ウィザード

    Add new virtual hardware ウィザードの Network ウィンドウで、Device model が virtio に設定されている
    Finish をクリックして手順を完了します。
すべての新規デバイスが追加されたら、仮想マシンを再起動します。ゲストを再起動するまで、仮想マシンがデバイスを認識しない場合があります。

5.3. ネットワークインターフェースデバイス用の KVM virtio ドライバーの使用

ネットワークインターフェースが KVM virtio ドライバーを使用する場合、KVM はネットワークハードウェアをエミュレートしないため、処理のオーバーヘッドがなくなり、ゲストパフォーマンスが向上します。Red Hat Enterprise Linux 7 では、virtio がデフォルトのネットワークインターフェースタイプとして使用されます。ただし、システムで設定が異なる場合は、以下の手順を使用できます。
  • ゲストに virtio ネットワークデバイスを接続 するには、model --virtio オプションを指定して、virsh attach-interface コマンドを実行します。
    または、virt-manager インターフェースで、ゲストの Virtual hardware details 画面に移動し、Add Hardware をクリックします。Add New Virtual Hardware 画面で Network を選択し、Device modelvirtio に変更します。
  • 既存インターフェースのタイプを virtio に変更するするには、virsh edit コマンドを使用して、目的のゲストの XML 設定を変更し、model type 属性を virtio に変更します。以下に例を示します。
      <devices>
        <interface type='network'>
          <source network='default'/>
          <target dev='vnet1'/>
          <model type='virtio'/>
          <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
        </interface>
      </devices>
      ...
    
    または、virt-manager インターフェースで、ゲストの Virtual hardware details 画面に移動し、NIC アイテムを選択して、Device modelvirtio に変更します。
注記
ゲスト内のネットワークインターフェースの名前が再起動後も維持されない場合は、ゲストに提示されるすべてのインターフェースが同じデバイスモデル(できればvirtio-net)であることを確認してください。詳細は、Red Hat ナレッジベースを参照してください。

第6章 Network Configuration

本章では、libvirt ベースのゲスト仮想マシンが使用する一般的なネットワーク設定を紹介します。
Red Hat Enterprise Linux 7 では、仮想化に次のネットワークセットアップをサポートします。
  • ネットワークアドレス変換 (NAT) を使用した仮想ネットワーク
  • PCI デバイスの割り当てを使用して直接割り当てた物理デバイス
  • PCIe SR-IOV を使用して直接割り当てられた仮想機能
  • ブリッジネットワーク
外部ホストがゲスト仮想マシンのネットワークサービスにアクセスできるようにするには、NAT を有効にするか、ネットワークブリッジングを有効にするか、PCI デバイスを直接割り当てる必要があります。

6.1. libvirt を使用した NAT (ネットワークアドレス変換)

ネットワーク接続を共有する最も一般的な方法の 1 つは、ネットワークアドレス変換 (NAT) 転送 (仮想ネットワークとも呼ばれます) を使用することです。

ホストの設定

すべての標準的なlibvirt インストールでは、デフォルトの仮想ネットワークとして、仮想マシンに NAT ベースの接続が提供されます。virsh net-list --all コマンドで使用できることを確認します。

# virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes
確認できない場合は、ゲストの XML 設定ファイル (/etc/libvirtd/qemu/myguest.xml など) で以下を使用できます。
# ll /etc/libvirt/qemu/
total 12
drwx------. 3 root root 4096 Nov  7 23:02 networks
-rw-------. 1 root root 2205 Nov 20 01:20 r6.4.xml
-rw-------. 1 root root 2208 Nov  8 03:19 r6.xml
デフォルトネットワークは、/etc/libvirt/qemu/networks/default.xml から定義されます。
デフォルトのネットワークを自動的に起動するように設定します。
# virsh net-autostart default
Network default marked as autostarted
デフォルトのネットワークを起動します。
# virsh net-start default
Network default started
libvirt のデフォルトネットワークが実行すると、分離されたブリッジデバイスが表示されます。このデバイスには、物理インターフェイスが追加されていません。新しいデバイスは、NAT および IP 転送を使用して物理ネットワークに接続します。新規インターフェースを追加しないでください。
# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes
libvirt は、INPUTFORWARDOUTPUT、 および POSTROUTING チェーンの virbr0 デバイスに接続されているゲスト仮想マシンとの間のトラフィックを許可するiptableルールを追加します。次に、libvirtip_forward パラメーターの有効化を試みます。他のアプリケーションではip_forward が無効になる場合があるため、最善の選択肢は、以下を /etc/sysctl.conf に追加することです。
 net.ipv4.ip_forward = 1

ゲスト仮想マシンの設定

ホストの設定が完了したら、ゲスト仮想マシンは、その名前を基にして仮想ネットワークに接続できます。ゲストを 'default' の仮想ネットワークに接続するには、ゲストの XML 設定ファイル (/etc/libvirtd/qemu/myguest.xml など) で以下を使用できます。

<interface type='network'>
   <source network='default'/>
</interface>
注記
MAC アドレスの定義はオプションです。定義しない場合は、MAC アドレスが自動的に生成され、ネットワークが使用するブリッジデバイスの MAC アドレスとして使用されます。MACアドレスを手動で設定すると、環境全体で一貫性や簡単な参照を維持したり、競合の可能性が非常に低い場合に役立つ場合があります。
<interface type='network'>
  <source network='default'/>
  <mac address='00:16:3e:1a:b3:4a'/>
</interface>

6.2. vhost-net の無効化

vhost-net モジュールは、virtio ネットワーク用のカーネルレベルのバックエンドです。これは、ユーザー空間 (QEMU プロセス) からカーネル (vhost-net ドライバー) に virtio パケット処理タスクを移動することで仮想化オーバーヘッドを低減します。vhost-net は virtio ネットワークインターフェースでのみ利用できます。vhost-net カーネルモジュールが読み込まれていると、すべての virtio インターフェースでデフォルトで有効になりますが、vhost-net の使用時に特定のワークロードでパフォーマンスが低下する場合は、インターフェース設定で無効にできます。
具体的には、UDPトラフィックがホストマシンからそのホスト上のゲスト仮想マシンに送信される場合、ゲスト仮想マシンが受信データをホストマシンが送信する速度よりも遅い速度で処理すると、パフォーマンスが低下する可能性があります。この場合は、vhost-net を有効にすると、UDP ソケットの受信バッファーがより速くオーバーフローし、パケットロスが大きくなります。そのため、このような状況では vhost-net を無効にしてトラフィックを遅くし、全体的なパフォーマンスを向上させることが推奨されます。
vhost-net を無効にするには、ゲスト仮想マシンの XML 設定ファイルの <interface> サブ要素を変更し、次のようにネットワークを定義します。
<interface type="network">
   ...
   <model type="virtio"/>
   <driver name="qemu"/>
   ...
</interface>
ドライバー名を qemu に設定すると、パケット処理が QEMU ユーザー空間に強制され、そのインターフェースの vhost-net を事実上無効にします。

6.3. vhost-net のゼロコピーの有効化

Red Hat Enterprise Linux 7 では、vhost-net zero-copy はデフォルトで無効にされています。永続的にこの動作を有効にするには、以下の内容で、/etc/modprobe.d に新しいファイルvhost-net.confを追加します。
options vhost_net  experimental_zcopytx=1
これを再び無効にする場合は、以下を実行してください。
modprobe -r vhost_net
modprobe vhost_net experimental_zcopytx=0
最初のコマンドは古いファイルを削除し、2 番目のコマンドは新しいファイルを作成して (上記のように)、ゼロコピーを無効にします。これを使用しても有効にできますが、変更は永続化されません。
これが有効になったことを確認するには、cat /sys/module/vhost_net/parameters/experimental_zcopytx の出力を確認します。以下が表示されます。
$ cat /sys/module/vhost_net/parameters/experimental_zcopytx
0

6.4. ブリッジネットワーク

ブリッジネットワーク (ネットワークブリッジングまたは仮想ネットワークスイッチングとも呼ばれます) は、仮想マシンのネットワークインターフェースを、物理インターフェースと同じネットワークに配置するために使用されます。ブリッジは最小限の設定でネットワークに仮想マシンを表示できるため、管理オーバーヘッドが低減し、ネットワークの複雑さが低減します。ブリッジにはコンポーネントと設定変数がほとんど含まれていないため、必要に応じて、理解とトラブルシューティングが簡単な透過的なセットアップを提供します。
ブリッジは、標準の Red Hat Enterprise Linux ツール、virt-manager、または libvirt を使用して仮想化環境で設定できます。以下のセクションで説明します。
ただし、仮想環境であっても、ホストオペレーティングシステムのネットワークツールを使用すると、ブリッジをより簡単に作成できます。このブリッジ作成方法の詳細については、Red Hat Enterprise Linux 7 Networking Guide を参照してください。

6.4.1. Red Hat Enterprise Linux 7 ホストでのブリッジネットワークの設定

ブリッジネットワークは、仮想化管理ツールとは無関係に、Red Hat Enterprise Linux ホストの仮想マシン用に設定できます。この設定は、仮想化ブリッジがホストの唯一のネットワークインターフェースである場合、またはホストの管理ネットワークインターフェースである場合に、主に推奨されます。
仮想化ツールを使用せずにネットワークブリッジを設定する方法は、Red Hat Enterprise Linux 7 Networking Guide を参照してください。

6.4.2. Virtual Machine Manager を使用したブリッジネットワーク

本セクションでは、virt-manager を使用して、ホストマシンのインターフェースからゲスト仮想マシンへのブリッジを作成する方法を説明します。
注記
ご使用の環境によっては、Red Hat Enterprise Linux 7 で libvirt ツールでブリッジを設定する際に、ネットワークマネージャーを無効にする必要があります。これは Red Hat では推奨されていません。libvirt で作成したブリッジでは、ネットワーク接続を維持するために、ブリッジに対して libvirtd を実行する必要があります。
ブリッジの作成後に libvirt を使用して仮想マシンのインターフェースをブリッジに追加しながら、Red Hat Enterprise Linux 7 Networking Guideの説明に従って物理 Red Hat Enterprise Linux ホストでブリッジネットワークを設定することが推奨されます。

手順6.1 virt-manager を使用したブリッジの作成

  1. virt-manager のメインメニューで、Edit ⇒ Connection Details をクリックして、Connection Details ウィンドウを開きます。
  2. ネットワークインターフェース タブをクリックします。
  3. 画面下部の+をクリックして、新しいネットワークインターフェースを設定します。
  4. Interface type ドロップダウンメニューで Bridge を選択し、Forward をクリックして続行します。

    図6.1 ブリッジの追加

    ブリッジの追加
    1. Name フィールドに、ブリッジの名前 (br0 など) を入力します。
    2. ドロップダウンメニューから、Start mode を選択します。以下のいずれかを選択します。
      • none - ブリッジを非アクティブにします。
      • onboot - 次回のゲスト仮想マシンの再起動時にブリッジをアクティブにします。
      • hotplug - ゲストの仮想マシンが実行中であっても、ブリッジをアクティブにします。
    3. すぐにブリッジを有効にするには、Activate now のチェックボックスを選択します。
    4. IP settings または Bridge settings のいずれかを設定する場合は、適切な Configure ボタンをクリックします。別のウィンドウが開いて、必要な設定を指定します。必要な変更を加え、完了したら OK をクリックします。
    5. 仮想マシンに接続する物理インターフェースを選択します。 インターフェースが現在別のゲスト仮想マシンで使用されている場合は、警告メッセージが表示されます。
  5. Finish をクリックすると、ウィザードが閉じ、Connections メニューに戻ります。

    図6.2 ブリッジの追加

    ブリッジの追加
使用するブリッジを選択し、Apply をクリックして、ウィザードを終了します。
インターフェースを停止するには、Stop Interface キーを選択します。ブリッジが停止したら、インターフェースを削除する Delete Interface キーを選択します。

6.4.3. libvirt を使用したブリッジネットワーク

ご使用の環境によっては、Red Hat Enterprise Linux 7 で libvirt を使用してブリッジを設定する際に、ネットワークマネージャーを無効にする必要があります。これは Red Hat では推奨されていません。これには、ブリッジを動作させるために libvirtd が実行している必要があります。
Red Hat Enterprise Linux 7 Networking Guide の説明に従って、物理 Red Hat Enterprise Linux ホストでブリッジネットワークを設定することが推奨されます。
重要
libvirt は、新しいカーネル調整可能パラメーターを利用して、ホストブリッジ転送データベース (FDB) エントリーを管理できるようになりました。これにより、複数の仮想マシンをブリッジする際にシステムのネットワークパフォーマンスが改善される可能性があります。ホストコンピューターの XML 設定ファイルで、ネットワークの <bridge> 要素の macTableManager 属性を 'libvirt' に設定します。
<bridge name='br0' macTableManager='libvirt'/>
これにより、すべてのブリッジポートでラーニング (flood) モードが無効になり、libvirt は必要に応じて FDB にエントリーを追加または削除します。MAC アドレス用の適切なフォワーディングポートを学習するオーバーヘッドを取り除くとともに、これにより、カーネルはブリッジをネットワークに接続する物理デバイスで無差別モードを無効にし、オーバーヘッドをさらに削減できます。

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

7.1. はじめに

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

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

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

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

KVM ハイパーバイザーは、仮想化 CPU (vCPU) のオーバーコミットに対応します。仮想化 CPU は、ゲスト仮想マシンの負荷制限が許す限り、オーバーコミットできます。負荷が 100% に近いと、要求が破棄されたり、使用できない応答時間が発生する可能性があるため、vCPU をオーバーコミットする場合は注意してください。
Red Hat Enterprise Linux 7 では、SMP (対称型マルチプロセッシング) 仮想マシンと呼ばれる複数の vCPU でゲストをオーバーコミットすることができます。ただし、仮想マシンで、物理 CPU にあるコアよりも多くのコアを実行すると、パフォーマンスが低下する場合があります。
たとえば、vCPU が 4 つある仮想マシンは、デュアルコアプロセッサーを搭載したホストマシンではなく、クアッドコアホストで実行してください。処理コアの物理数を超えて SMP 仮想マシンをオーバーコミットすると、プログラムの CPU 時間が必要な時間よりも短くなるため、パフォーマンスが大幅に低下します。また、物理プロセッサーコアごとに、割り当てられた vCPU の合計が 10 を超えることは推奨されません。
SMP ゲストでは、処理オーバーヘッドの一部が発生します。CPU オーバーコミットは、SMP のオーバーヘッドを増加させます。これは、タイムスライシングを使用してリソースをゲストに割り当てると、ゲスト内の CPU 間の通信が遅くなる可能性があるためです。このオーバーヘッドは、vCPU の数が多いゲストや、オーバーコミット率が高いゲストで増加します。
仮想化されたCPUは、単一のホストに複数のゲストがあり、各ゲストにホストCPUの数と比較して少数のvCPUがある場合に、最適にオーバーコミットされます。KVMは、1つのホスト上の1つの物理CPUに対して5つのvCPU(5つの仮想マシン上)の比率で100%未満の負荷を持つゲストを安全にサポートする必要があります。KVM ハイパーバイザーは、すべての仮想マシンを切り替えて、負荷のバランスがとれていることを確認します。
パフォーマンスを最大化するために、Red Hat では、各ゲスト内にあるプログラムを実行するのに必要な数の vCPU のみをゲストに割り当てることを推奨しています。
重要
オーバーコミットされた環境では、メモリーを 100% 使用するアプリケーションや処理リソースが不安定になる可能性があります。CPU のオーバーコミット率および SMP の量はワークロードに依存するため、詳細なテストを行わずに実稼働環境でメモリーまたは CPU をオーバーコミットしないでください。

第8章 KVM ゲストのタイミング管理

仮想化には、ゲスト仮想マシンでの時間管理に関するいくつかの課題が含まれます。
  • 割り込みは、すべてのゲスト仮想マシンに常に同時に瞬時に配信されるとは限りません。これは、仮想マシンの割り込みは真の割り込みではないためです。代わりに、ホストマシンによりゲスト仮想マシンに挿入されます。
  • ホストは、別のゲスト仮想マシンを実行している場合や、別のプロセスの場合があります。したがって、割り込みにより通常必要とされる正確なタイミングは、常に可能となるとは限りません。
正確な時刻管理が行われていないゲスト仮想マシンでは、セッションの有効性、移行、およびその他のネットワークアクティビティがタイムスタンプに依存して正しい状態を維持するため、ネットワークアプリケーションとプロセスで問題が発生する可能性があります。
KVM は、ゲスト仮想マシンに準仮想化クロック (kvm-clock) を提供することで、この問題を回避します。ただし、ゲストの移行など、時間管理の不正確さによって影響を受ける可能性のあるアクティビティを試行する前に、タイミングをテストすることは依然として重要です。
重要
上記の問題を回避するには、ホストとゲスト仮想マシンで、ネットワークタイムプロトコル (NTP) を設定する必要があります。Red Hat Enterprise Linux 6 以前を使用するゲストでは、NTP が ntpd サービスにより実装されます。詳細は、Red Hat Enterprise 6 Deployment Guide を参照してください。
Red Hat Enterprise Linux 7 を使用するシステムの場合、NTP の時刻同期サービスは、ntpd または chronyd サービスによって提供できます。Chrony には、仮想マシンに利点があることに注意してください。詳細は、Red Hat Enterprise Linux 7 System Administrator's Guide の Configuring NTP Using the chrony Suite および Configuring NTP Using ntpd セクションを参照してください。

ゲスト仮想マシンの時間同期のメカニズム

デフォルトでは、ゲストは次のようにハイパーバイザーと時刻を同期します。

  • ゲストシステムの起動時に、ゲストはエミュレートリアルタイムクロック (RTC) から時間を読み取ります。
  • NTP プロトコルが開始すると、ゲストクロックが自動的に同期します。その後、通常のゲスト操作時に、NTP はゲストでクロック調整を実行します。
  • 一時停止または復元プロセス後にゲストを再開する場合は、管理ソフトウェアー (virt-manager など) がゲストのクロックを指定した値に同期させるコマンドを実行する必要があります。この同期は、QEMU ゲストエージェントがゲストにインストールされており、この機能に対応している場合にのみ機能します。ゲストのクロックが同期する値は、通常、ホストのクロック値です。

Constant タイムスタンプカウンター (TSC)

最新の Intel および AMD の CPU では、Constant TSC (Time Stamp Counter) が提供されます。消費電力ポリシーに従うなど、CPU コア自体の周波数が変更しても、Constant TSC のカウント周波数は変化しません。TSC を KVM ゲストのクロックソースとして使用するには、Constant TSC 周波数の CPU が必要です。

constant_tsc フラグが存在する場合、CPU には一定のタイムスタンプカウンターがあります。CPU に constant_tsc フラグがあるかどうかを確認するには、次のコマンドを実行します。
$ cat /proc/cpuinfo | grep constant_tsc
いずれかの出力が得られると、CPU には constant_tsc ビットがあります。出力が表示されない場合は、以下の手順に従ってください。

Constant タイムスタンプカウンターを使用しないホストの設定

TSC の周波数が一定でないシステムは、仮想マシンのクロックソースとして TSC を使用できないため、追加の設定が必要になります。電源管理機能は正確な時間管理を妨げるため、ゲスト仮想マシンが KVM で時間を正確に保持するには、無効にする必要があります。

重要
この手順は、AMD リビジョン F の CPU のみを対象としています。
CPU に constant_tsc ビットがない場合は、 で省電力機能をすべて無効にしてください。各システムには、時間を維持するために使用するいくつかのタイマーがあります。TSC はホストで安定していません。これは、cpufreqの変更、ディープ C ステート、またはより高速な TSC を使用したホストへの移行が原因である場合があります。ディープ C のスリープ状態は、TSC を停止する可能性があります。 ディープC状態を使用するカーネルを防ぐには、processor.max_cstate=1 をカーネルブートに追加します。この変更を永続化するには、/etc/default/grubfile で GRUB_CMDLINE_LINUX キーの値を変更します。たとえば、システムの起動ごとに緊急モードを有効にする場合は、以下のようにエントリーを編集します。
GRUB_CMDLINE_LINUX="emergency"
GRUB 2 ブートメニューに複数のパラメーターを追加する際と同様に、GRUB_CMDLINE_LINUX キーには複数のパラメーターを指定できることに注意してください。
cpufreq を無効にする (constant_tsc を使用しないホストでのみ必要) には、kernel-tools をインストールして、cpupower.service (systemctl enable cpupower.service) を有効にします。ゲスト仮想マシンが起動するたびにこのサービスを無効にする場合は、/etc/sysconfig/cpupower の設定ファイルを変更して CPUPOWER_START_OPTS および CPUPOWER_STOP_OPTS を変更します。有効な制限は、/sys/devices/system/cpu/cpuid/cpufreq/scaling_available_governors ファイルに記載されています。このパッケージの詳細、または電源管理およびガバナーの詳細は、Red Hat Enterprise Linux 7 Power Management Guide を参照してください。

8.1. ホスト全体の時間同期

KVMゲストの仮想ネットワークデバイスはハードウェアタイムスタンプをサポートしていません。つまり、NTPやPTPなどのネットワークプロトコルを使用するゲストのクロックを数十マイクロ秒よりも高い精度で同期することは困難です。
ゲストの同期をより正確に行う必要がある場合は、NTP または PTP を使用してホストのクロックをハードウェアのタイムスタンプと同期させ、ゲストをホストに直接同期させることが推奨されます。Red Hat Enterprise Linux 7.5 以降では、マイクロ秒未満の精度でゲストをホストに同期できるようにする仮想 PTP ハードウェアクロック (PHC) が提供されます。
重要
PHC が適切に機能するようにするには、ホストとゲストの両方がオペレーティングシステム (OS) として RHEL 7.5 以降を使用している必要があります。
PHC デバイスを有効にするには、ゲスト OS で次の手順を実行します。
  1. 再起動後に読み込むptp_kvm モジュールを設定します。
    # echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
  2. /dev/ptp0 クロックを chrony 設定のリファレンスとして追加します。
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. chrony デーモンを再起動します。
    # systemctl restart chronyd
  4. host-guest の時刻同期が正しく設定されていることを確認するには、ゲストで chronyc sources コマンドを使用します。この出力は、以下のようになります。
    # chronyc sources
    210 Number of sources = 1
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    #* PHC0                          0   2   377     4     -6ns[   -6ns] +/-  726ns
    

8.2. Red Hat Enterprise Linux ゲストに必要な時間管理パラメーター

特定の Red Hat Enterprise Linux ゲスト仮想マシンでは、システム時間を正しく同期させるために追加のカーネルパラメーターが必要です。このパラメーターは、ゲスト仮想マシンの /etc/grub2.cfg ファイルの /kernel 行の末尾に追加することで設定できます。
注記
Red Hat Enterprise Linux 5.5 以降、Red Hat Enterprise Linux 6.0 以降、および Red Hat Enterprise Linux 7 では、kvm-clock がデフォルトのクロックソースとして使用されます。kvm-clock を実行するとカーネルパラメーターを追加する必要がなくなるため、Red Hat では推奨しています。
以下の表は、Red Hat Enterprise Linux のバージョンと、指定したシステムで必要なパラメーターを一覧表示しています。

表8.1 カーネルパラメーターの要件

Red Hat Enterprise Linux のバージョン ゲストカーネルの追加パラメーター
7.0 以降 (AMD64 および Intel 64 システム、kvm-clock 使用) 追加のパラメーターは必要ありません。
6.1 以降 (AMD64 および Intel 64 システム、kvm-clock 使用) 追加のパラメーターは必要ありません。
6.0 (AMD64 および Intel 64 システム、kvm-clock 使用) 追加のパラメーターは必要ありません。
6.0 (AMD64 および Intel 64 システム、kvm-clock 使用せず) notsc lpj=n
注記
lpj パラメーターでは、ゲスト仮想マシンを実行している特定の CPU の jiffy あたりのループ数 値と同じ数値が必要です。この値がわからない場合は、lpj パラメーターを設定しないでください。

8.3. スチールタイムアカウンティング

スチールタイムは、ホストが提供していないゲスト仮想マシンが必要とする CPU 時間の量です。スチールタイムは、ホストがこれらのリソースを別の場所 (たとえば、別のゲスト) に割り当てるときに発生します。
スチールタイムは、/proc/stat の CPU 時間フィールドで報告されます。これは、top および vmstat などのユーティリティーにより自動的に報告されます。これは、"%st" または "st" 列で表示されます。これは、オフにできないことに注意してください。
スチールタイムが長くなると CPU 競合が発生するため、ゲストのパフォーマンスが低下する可能性があります。CPU の競合を軽減するには、ゲストの CPU 優先度または CPU クォータを上げるか、ホストで実行するゲストを減らします。

第9章 libvirt でのネットワークブート

ゲストの仮想マシンは、PXE を有効にして起動できます。PXE を使用すると、ゲスト仮想マシンを起動して、ネットワーク自体から設定を読み込むことができます。本セクションでは、libvirt で PXE ゲストを設定する基本的な設定手順を説明します。
本セクションでは、ブートイメージまたは PXE サーバーの作成は説明しません。これは、プライベートネットワークまたはブリッジネットワークで libvirt を設定し、PXE ブートを有効にしてゲスト仮想マシンを起動する方法を説明するために使用されます。
警告
以下の手順は、例としてのみ提供されます。続行する前に、十分なバックアップがあることを確認してください。

9.1. ブートサーバーの準備

本章の手順を実行するには、以下が必要になります。
  • PXE サーバー (DHCP および TFTP) - libvirt の内部サーバー、手動で設定した dhcpd および tftpd、dnsmasq、Cobbler が設定したサーバー、またはその他のサーバーを指します。
  • ブートイメージ - たとえば、手動または Cobbler で設定した PXELINUX。

9.1.1. プライベートの libvirt ネットワークに PXE ブートサーバーを設定する

この例では、デフォルト のネットワークを使用します。以下の手順を実行します。

手順9.1 PXE ブートサーバーの設定

  1. PXE ブートイメージおよび設定を /var/lib/tftpboot に置きます。
  2. 以下のコマンドを実行します。
    # virsh net-destroy default
    # virsh net-edit default
  3. デフォルト ネットワークの設定ファイルの <ip> 要素を編集して、適切なアドレス、ネットワークマスク、DHCP アドレス範囲、および起動ファイルを追加します。BOOT_FILENAME は、ゲスト仮想マシンの起動に使用するファイル名を表します。
    <ip address='192.168.122.1' netmask='255.255.255.0'>
       <tftp root='/var/lib/tftpboot' />
       <dhcp>
          <range start='192.168.122.2' end='192.168.122.254' />
          <bootp file='BOOT_FILENAME' />
       </dhcp>
    </ip>
  4. 以下を実行します。
    # virsh net-start default
  5. PXE を使用してゲストを起動します (「PXE を使用したゲストの起動」 を参照)。

9.2. PXE を使用したゲストの起動

本セクションでは、PXE でゲスト仮想マシンを起動する方法を説明します。

9.2.1. ブリッジネットワークの使用

手順9.2 PXE およびブリッジネットワークを使用したゲストの起動

  1. ネットワークで PXE ブートサーバーが使用できるように、ブリッジが有効になっていることを確認します。
  2. PXE 起動が有効になっているゲスト仮想マシンを起動します。以下のコマンド例に示すように、virt-install コマンドを使用して、PXE ブートが有効になっている新しい仮想マシンを作成できます。
    virt-install --pxe --network bridge=breth0 --prompt
    または、以下の例のように、ゲストネットワークがブリッジネットワークを使用するように設定されており、XML ゲスト設定ファイルの <os> 要素内に <boot dev='network'/> 要素があることを確認します。
    <os>
       <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
       <boot dev='network'/>
       <boot dev='hd'/>
    </os>
    <interface type='bridge'>
       <mac address='52:54:00:5a:ad:cb'/>
       <source bridge='breth0'/>
       <target dev='vnet0'/>
       <alias name='net0'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

9.2.2. プライベートの libvirt ネットワークの使用

手順9.3 プライベートの libvirt ネットワークの使用

  1. 「プライベートの libvirt ネットワークに PXE ブートサーバーを設定する」 に示すように、libvirt で PXE ブートを設定します。
  2. PXE 起動を有効にして libvirt を使用してゲスト仮想マシンを起動します。virt-install コマンドを使用して、PXE を使用して新しい仮想マシンを作成/インストールできます。
    virt-install --pxe --network network=default --prompt
または、以下の例のように、ゲストネットワークがプライベート libvirt ネットワークを使用するように設定されており、XML ゲスト設定ファイルの <os> 要素内に <boot dev='network'/> 要素があることを確認します。
<os>
   <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
   <boot dev='network'/>
   <boot dev='hd'/>
</os>
また、ゲスト仮想マシンがプライベートネットワークに接続されていることを確認します。
<interface type='network'>
   <mac address='52:54:00:66:79:14'/>
   <source network='default'/>
   <target dev='vnet0'/>
   <alias name='net0'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

第10章 ハイパーバイザーおよび仮想マシンの登録

Red Hat Enterprise Linux 6 および 7 では、すべてのゲスト仮想マシンが特定のハイパーバイザーにマッピングされ、すべてのゲストに同じレベルのサブスクリプションサービスが割り当てられるようにする必要があります。これを行うには、インストールされて登録されている各 KVM ハイパーバイザーで、すべてのゲスト仮想マシンを自動的に検出するサブスクリプションエージェントをインストールする必要があります。これにより、ホストにあるマッピングファイルが作成されます。このマッピングファイルにより、すべてのゲスト仮想マシンに次の利点があります。
  • 仮想システムに固有のサブスクリプションは簡単に利用でき、関連するすべてのゲスト仮想マシンに適用できます。
  • ハイパーバイザーから継承できるすべてのサブスクリプションのメリットは、すぐに利用でき、関連するすべてのゲスト仮想マシンに適用できます。
注記
本章で説明する情報は、Red Hat Enterprise Linux のサブスクリプションのみを対象としています。Red Hat Virtualization サブスクリプションまたは Red Hat Satellite サブスクリプションもある場合は、それらのサブスクリプションで提供される virt-who 情報も参照してください。Red Hat Subscription Management の詳細は、カスタマーポータルの Red Hat Subscription Management ガイドを参照してください。

10.1. ホストの物理マシンに virt-who をインストールする

  1. KVM ハイパーバイザーの登録

    ホスト物理マシンの root ユーザーで、ターミナルで subscription-manager register [options] コマンドを実行して、KVM Hypervisor を登録します。# subscription-manager register --help メニューを使用すると、より多くのオプションを使用できます。ユーザーネームおよびパスワードを使用している場合は、Subscription Manager アプリケーションが認識している認証情報を使用します。初めてサブスクライブする際に、ユーザーアカウントがない場合は、カスタマーサポートにご連絡ください。たとえば、仮想マシンを 'admin' として登録 (パスワードは 'secret') するには、次のコマンドを送信します。
    [root@rhel-server ~]# subscription-manager register --username=admin --password=secret --auto-attach
  2. virt-who パッケージをインストールします。

    ホストの物理マシンで次のコマンドを実行して、virt-who パッケージをインストールします。
    # yum install virt-who
  3. virt-who 設定ファイルの作成

    ハイパーバイザーごとに、/etc/virt-who.d/ ディレクトリーに設定ファイルを追加します。ファイルには、少なくとも以下のスニペットが含まれている必要があります。
    [libvirt]
    type=libvirt
    
    virt-who の設定の詳細は、virt-who の設定」 を参照してください。
  4. virt-who サービスを再起動します。

    ホストの物理マシンで次のコマンドを実行して、virt-who サービスを起動します。
    # systemctl start virt-who.service
    # systemctl enable virt-who.service
  5. virt-who サービスがゲスト情報を受信していることを確認する

    この時点で、virt-who サービスは、ホストからドメインの一覧の収集を開始します。ホストの物理マシンの /var/log/rhsm/rhsm.log ファイルを確認して、ゲスト仮想マシンの一覧がファイルに含まれていることを確認します。以下に例を示します。
    2015-05-28 12:33:31,424 DEBUG: Libvirt domains found: [{'guestId': '58d59128-cfbb-4f2c-93de-230307db2ce0', 'attributes': {'active': 0, 'virtWhoType': 'libvirt', 'hypervisorType': 'QEMU'}, 'state': 5}]
    

手順10.1 カスタマーポータルでのサブスクリプションの管理

  1. ハイパーバイザーのサブスクライブ

    仮想マシンはハイパーバイザーと同じサブスクリプションのメリットを享受するため、ハイパーバイザーに有効なサブスクリプションがあり、仮想マシンがサブスクリプションを使用できることが重要です。
    1. カスタマーポータルへのログイン

      Red Hat カスタマーポータルで Red Hat アカウントの認証情報を指定してログインします。
    2. Systems リンクをクリックします。

      My Subscriptions インターフェースの Systems セクションに移動します。
    3. ハイパーバイザーを選択します。

      Systems ページには、サブスクライブしているすべてのシステムの表があります。ハイパーバイザーの名前 (localhost.localdomain など) を選択します。表示された詳細ページで Attach a subscription をクリックし、一覧表示されたすべてのサブスクリプションを選択します。Attach Selected をクリックします。これにより、ホストの物理サブスクリプションがハイパーバイザーに割り当てられ、ゲストがサブスクリプションを利用できるようになります。
  2. ゲスト仮想マシンのサブスクライブ - 初めての使用

    この手順は、新しいサブスクリプションを持っていて、これまでゲスト仮想マシンをサブスクライブしたことがない人を対象としています。仮想マシンを追加する場合は、この手順をスキップします。virt-who サービスを実行しているマシンで、ハイパーバイザープロファイルに割り当てられたサブスクリプションを使用するには、ゲスト仮想マシンのターミナルで次のコマンドを実行して自動サブスクライブします。
    [root@virt-who ~]# subscription-manager attach --auto
  3. 追加のゲスト仮想マシンのサブスクライブ

    初めて仮想マシンをサブスクライブする場合は、この手順を省略してください。仮想マシンを追加する場合、このコマンドを実行しても、必ずしも同じサブスクリプションがゲスト仮想マシンに再接続されるとは限らないことに注意してください。これは、すべてのサブスクリプションを削除してから自動登録を許可して、指定したゲスト仮想マシンに必要なものを解決できるようにすると、以前とは異なるサブスクリプションが使用される可能性があるためです。これはシステムには影響を及ぼさない可能性がありますが、注意してください。以下で説明されていない手動の接続手順を使用して仮想マシンを接続した場合は、自動接続が機能しないため、これらの仮想マシンを手動で再接続する必要があります。次のコマンドを使用して、最初に古いゲストのサブスクリプションを削除してから、自動アタッチを使用してすべてのゲストにサブスクリプションを割り当てます。ゲスト仮想マシンで次のコマンドを実行します。
    [root@virt-who ~]# subscription-manager remove --all
    [root@virt-who ~]# subscription-manager attach --auto
  4. サブスクリプションが割り当てられていることを確認する

    ゲスト仮想マシンで次のコマンドを実行して、サブスクリプションがハイパーバイザーに割り当てられていることを確認します。
    [root@virt-who ~]# subscription-manager list --consumed
    以下のような出力が表示されます。サブスクリプションの詳細に注意してください。'Subscription is current' と表示されるはずです。
    [root@virt-who ~]# subscription-manager list --consumed
    +-------------------------------------------+
       Consumed Subscriptions
    +-------------------------------------------+
    Subscription Name:	Awesome OS with unlimited virtual guests
    Provides: 		Awesome OS Server Bits
    SKU: 			awesomeos-virt-unlimited
    Contract: 		0
    Account: 		######### Your account number #####
    Serial: 		######### Your serial number ######
    Pool ID: 		XYZ123
    Provides Management: 	No
    Active: 		True
    Quantity Used: 		1
    Service Level:
    Service Type:
    Status Details:		Subscription is current
    Subscription Type:
    Starts: 		01/01/2015
    Ends: 			12/31/2015
    System Type: 		Virtual
    
    ???
    The ID for the subscription to attach to the system is displayed here. You will need this ID if you need to attach the subscription manually.
    ???
    Indicates if your subscription is current. If your subscription is not current, an error message appears. One example is Guest has not been reported on any host and is using a temporary unmapped guest subscription. In this case the guest needs to be subscribed. In other cases, use the information as indicated in 「サブスクリプションステータスエラーが表示された場合の対応」.
  5. 追加のゲストを登録

    ハイパーバイザーに新しいゲスト仮想マシンをインストールする場合は、ゲスト仮想マシンで次のコマンドを実行して、新しい仮想マシンを登録し、ハイパーバイザーに割り当てたサブスクリプションを使用する必要があります。
    # subscription-manager register
    # subscription-manager attach --auto
    # subscription-manager list --consumed

10.1.1. virt-who の設定

virt-who サービスは、以下のファイルを使用して設定します。
  • /etc/virt-who.conf - 接続されているハイパーバイザーで変更を確認する間隔など、一般的な設定情報が含まれます。
  • /etc/virt-who.d/hypervisor_name.conf - 特定のハイパーバイザーの設定情報が含まれます。
ハイパーバイザー設定ファイルと、virt-who.confに必要なスニペットを生成する Web ベースのウィザードが提供されます。ウィザードを実行する場合は、カスタマーポータルの Red Hat Virtualization Agent (virt-who) Configuration Helper を参照します。
ウィザードの 2 ページ目で、次のオプションを選択します。
  • Where does your virt-who report to?:Subscription Asset Manager
  • Hypervisor Type: libvirt
ウィザードに従って設定を完了します。設定が正しく行われると、virt-who は選択したサブスクリプションを、指定されたハイパーバイザーにある既存および今後のゲストに自動的に提供します。
ハイパーバイザー設定ファイルの詳細は、virt-who-config の man ページを参照してください。

10.2. 新しいゲスト仮想マシンの登録

登録済みで実行中のホストで、新しいゲスト仮想マシンを作成する場合は、virt-who サービスも実行している必要があります。これにより、virt-who サービスがゲストをハイパーバイザーにマップできるため、システムが仮想システムとして適切に登録されます。仮想マシンを登録するには、次のコマンドを実行します。
[root@virt-server ~]# subscription-manager register --username=admin --password=secret --auto-attach

10.3. ゲスト仮想マシンエントリーの削除

ゲスト仮想マシンが実行されている場合は、ターミナルウィンドウでゲストの root として次のコマンドを実行して、システムの登録を解除します。
[root@virt-guest ~]# subscription-manager unregister
ただし、システムが削除された場合、仮想サービスは、サービスが削除されたか、一時停止したかを認識できません。この場合は、以下の手順に従って、サーバー側からシステムを手動で削除する必要があります。
  1. サブスクリプションマネージャーへのログイン

    サブスクリプションマネージャーは、Red Hat カスタマーポータルにあります。画面最上部にあるログインアイコンをクリックし、ユーザー名とパスワードを使用してカスタマーポータルにログインします。
  2. Subscriptions タブをクリックします。

    Subscriptions タブをクリックします。
  3. Systems リンクをクリックします。

    ページを下にスクロールして、Systems をクリックします。
  4. システムを削除します。

    システムプロファイルを削除するには、テーブルで指定したシステムのプロファイルを検索し、その名前の横にあるチェックボックスを選択して、Delete をクリックします。

10.4. 手動での virt-who のインストール

本セクションでは、ハイパーバイザーが提供するサブスクリプションを手動で割り当てる方法を説明します。

手順10.2 サブスクリプションを手動で割り当てる方法

  1. サブスクリプション情報の一覧を表示し、プール ID を見つけます。

    最初に、仮想タイプで利用可能なサブスクリプションを一覧表示する必要があります。以下のコマンドを実行します。
    [root@server1 ~]# subscription-manager list --avail --match-installed | grep 'Virtual' -B12
    Subscription Name: Red Hat Enterprise Linux ES (Basic for Virtualization)
    Provides:          Red Hat Beta
                       Oracle Java (for RHEL Server)
                       Red Hat Enterprise Linux Server
    SKU:               -------
    Pool ID:           XYZ123
    Available:         40
    Suggested:         1
    Service Level:     Basic
    Service Type:      L1-L3
    Multi-Entitlement: No
    Ends:              01/02/2017
    System Type:       Virtual
    
    表示されたプール ID をメモします。この ID は、次の手順で必要に応じてコピーします。
  2. プール ID を使用したサブスクリプションの割り当て

    前の手順でコピーしたプール ID を使用して、attach コマンドを実行します。プール ID XYZ123 を、取得したプール ID に置き換えます。以下のコマンドを実行します。
    [root@server1 ~]# subscription-manager attach --pool=XYZ123
    
    Successfully attached a subscription for: Red Hat Enterprise Linux ES (Basic for Virtualization)
    

10.5. virt-who のトラブルシューティング

10.5.1. ハイパーバイザーのステータスが赤である理由

シナリオ:サーバー側で、サブスクリプションを持たないハイパーバイザーにゲストをデプロイします。24 時間後、ハイパーバイザーはステータスを赤で表示します。この状況を改善するには、そのハイパーバイザーのサブスクリプションを取得する必要があります。または、サブスクリプションを使用してゲストをハイパーバイザーに永続的に移行します。

10.5.2. サブスクリプションステータスエラーが表示された場合の対応

シナリオ:以下のエラーメッセージのいずれかが表示されます。
  • System not properly subscribed
  • Status unknown
  • Late binding of a guest to a hypervisor through virt-who (host/guest mapping)
エラーの理由を調べるには、/var/log/rhsm/ ディレクトリーにある rhsm.log という名前の virt-who ログファイルを開きます。

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

QEMU ゲストエージェント、SPICE エージェントなどの Red Hat Enterprise Linux のエージェントをデプロイすると、仮想化ツールをシステムでより最適に実行できます。これらのエージェントは、本章で説明します。
注記
ホストおよびゲストのパフォーマンスをさらに最適化および調整する方法は、Red Hat Enterprise Linux 7 Virtualization Tuning and Optimization Guide を参照してください。

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

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

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

ホストマシンは、ホストとゲストマシン間の VirtIO シリアル接続を介して QEMU ゲストエージェントと通信します。VirtIO シリアルチャネルはキャラクターデバイスドライバー (通常は Unix ソケット) を介してホストに接続し、ゲストはこのシリアルチャネルをリッスンします。
注記
qemu-guest-agentは、ホストが VirtIO シリアルチャンネルをリッスンしているかどうかを検出しません。ただし、このチャネルの現在の使用法はホストからゲストへのイベントをリッスンすることであるため、リスナーなしでチャネルに書き込むことによってゲスト仮想マシンが問題に遭遇する可能性は非常に低くなります。また、qemu-guest-agent プロトコルには、コマンド実行時にホスト物理マシンがゲスト仮想マシンを強制的に再同期させる同期マーカー (synchronization marker) が含まれ、libvirt がこのマーカーをすでに使用しているため、ゲスト仮想マシンは、保留中の未配信の応答を安全に破棄することができます。

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

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

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

  1. 仮想マシンのシャットダウン

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

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

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

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

    ゲストで QEMU ゲストエージェントサービスを起動します。
    # systemctl start qemu-guest-agent
または、次の手順で、実行中のゲストに QEMU ゲストエージェントを設定できます。

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

  1. QEMU ゲストエージェントの XML ファイルの作成

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

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

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

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

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

  1. 仮想マシンのシャットダウン

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

    ゲストウィンドウ上部の電球アイコンをクリックして、仮想マシンのハードウェアの詳細を開きます。
    Add Hardware ボタンをクリックして Add New Virtual Hardware ウィンドウを開き、Channel を選択します。
    Name ドロップダウンリストから QEMU ゲストエージェントを選択し、Finish をクリックします。

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

    QEMU ゲストエージェントチャネルデバイスの選択
  3. 仮想マシンの起動

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

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

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

11.2. 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 domfsfreeze および virsh domfsthaw - ゲストファイルシステムを分離して静止します。
  • virsh domfstrim - ファイルシステムをトリミングするようにゲストに指示します。
  • virsh domtime - ゲストの時計をクエリーまたは設定します。
  • virsh setvcpus --guest - CPUをオフラインにするようにゲストに指示します。
  • virsh domifaddr --source agent - ゲストエージェントを介してゲストオペレーティングシステムの IP アドレスを問い合わせます。
  • virsh domfsinfo - 実行中のゲストでマウントされているファイルシステムの一覧を表示します。
  • virsh set-user-password - ゲストのユーザーアカウントのパスワードを設定します。

11.2.1. ゲストディスクのバックアップの作成

libvirt は、qemu-guest-agent と通信して、ゲスト仮想マシンファイルシステムのスナップショットが内部的に整合性があり、必要に応じて使用できるようにすることができます。ゲストシステム管理者は、アプリケーション固有のフリーズ/フリーズ解除フックスクリプトを作成してインストールできます。ファイルシステムをフリーズする前に、qemu-guest-agent はメインフックスクリプト (qemu-guest-agent パッケージに含まれる) を呼び出します。フリーズプロセスでは、ゲスト仮想マシンのアプリケーションがすべて一時的に非アクティブになります。
スナップショットプロセスは、以下の手順で構成されます。
  • ファイルシステムアプリケーション/データベースは、作業バッファーを仮想ディスクにフラッシュし、クライアント接続の受け入れを停止します。
  • アプリケーションがデータファイルを一貫した状態にします。
  • メインフックスクリプトが返されます。
  • qemu-guest-agent がファイルシステムをフリーズし、、管理スタックがスナップショットを取得します。
  • スナップショットが確認されました。
  • ファイルシステムの機能が再開します。
フリーズ解除は逆の順序で行われます。
ゲストのファイルシステムのスナップショットを作成するには、virsh snapshot-create --quiesce --disk-only コマンドを実行します (または、virsh snapshot-create-as guest_name --quiesce --disk-only を実行します。詳細は 「現在のゲスト仮想マシンのスナップショットの作成」 を参照)。
注記
アプリケーション固有のフックスクリプトでは、データベースと通信するためにスクリプトをソケットに接続する必要がある場合と同様に、正しく実行するために様々な SELinux のパーミッションが必要になることがあります。一般に、ローカル SELinux ポリシーは、そのような目的のために開発およびインストールする必要があります。/etc/qemu-ga/fsfreeze-hook.d/ というラベルが付いた表の行の 表11.1「QEMU ゲストエージェントパッケージの内容」 に一覧表示されている restorecon -FvvR コマンドを実行した後、ファイルシステムノードへのアクセスがすぐに機能するようになります。
qemu-guest-agent バイナリー RPM には、以下のファイルが含まれます。

表11.1 QEMU ゲストエージェントパッケージの内容

File name 説明
/usr/lib/systemd/system/qemu-guest-agent.service QEMU ゲストエージェントのサービス制御スクリプト (start/stop)
/etc/sysconfig/qemu-ga /usr/lib/systemd/system/qemu-guest-agent.service 制御スクリプトにより読み込まれる QEMU ゲストエージェントの設定ファイル。設定は、シェルスクリプトのコメントが記載されたファイルで説明されています。
/usr/bin/qemu-ga QEMU ゲストエージェントのバイナリーファイル。
/etc/qemu-ga フックスクリプトのルートディレクトリー。
/etc/qemu-ga/fsfreeze-hook メインフックスクリプト。ここでは変更は必要ありません。
/etc/qemu-ga/fsfreeze-hook.d 個々のアプリケーション固有のフックスクリプトのディレクトリー。ゲストシステム管理者は、フックスクリプトを手動でこのディレクトリーにコピーし、適切なファイルモードビットを確認してから、このディレクトリーで restorecon -FvvR を実行する必要があります。
/usr/share/qemu-kvm/qemu-ga/ サンプルスクリプトを含むディレクトリー (サンプル目的のみ)ここに含まれるスクリプトは実行されません。
メインフックスクリプトの /etc/qemu-ga/fsfreeze-hook は、独自のメッセージと、アプリケーション固有のスクリプトの標準出力およびエラーメッセージを、ログファイル /var/log/qemu-ga/fsfreeze-hook.log に記録します。詳細は、libvirt アップストリームの Web サイト を参照してください。

11.3. SPICE エージェント

SPICE エージェントは、ゲストオペレーティングシステムと SPICE クライアントの統合を支援することで、virt-manager などのグラフィカルアプリケーションの実行をより円滑に支援します。
たとえば、virt-manager でウィンドウのサイズを変更する場合、SPICEエージェントはクライアントの解像度に対するXセッションの解像度の自動調整を可能にします。SPICE エージェントは、ホストとゲスト間のコピーアンドペーストにも対応しており、マウスカーソルの遅延を防ぎます。
SPICE エージェントの機能に関するシステム固有の情報は、spice-vdagent パッケージの README ファイルを参照してください。

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

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

手順11.4 Linux ゲストで virsh を使用したゲストエージェントとホスト間の通信の設定

  1. 仮想マシンのシャットダウン

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

    ゲストの XML ファイルを編集して、SPICE エージェントの詳細を追加します。
    # virsh edit rhel7
    ゲストの XML ファイルに以下を追加し、変更を保存します。
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  3. 仮想マシンの起動

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

    ゲスト仮想マシンに SPICE エージェントがインストールされていない場合はインストールします。
    # yum install spice-vdagent
  5. ゲストで SPICE エージェントを起動します。

    ゲストで SPICE エージェントサービスを起動します。
    # systemctl start spice-vdagent
または、次の手順で、実行中のゲストに SPICE エージェントを設定できます。

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

  1. SPICE エージェントの XML ファイルの作成

    # cat agent.xml
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  2. SPICE エージェントの仮想マシンへの割り当て

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

    ゲスト仮想マシンに SPICE エージェントがインストールされていない場合はインストールします。
    # yum install spice-vdagent
  4. ゲストで SPICE エージェントを起動します。

    ゲストで SPICE エージェントサービスを起動します。
    # systemctl start spice-vdagent

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

  1. 仮想マシンのシャットダウン

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

    ゲストウィンドウ上部の電球アイコンをクリックして、仮想マシンのハードウェアの詳細を開きます。
    Add Hardware ボタンをクリックして Add New Virtual Hardware ウィンドウを開き、Channel を選択します。
    Name ドロップダウンリストから SPICE エージェントを選択し、チャネルアドレスを変更して、Finish をクリックします。

    図11.2 SPICE エージェントのチャネルデバイスの選択

    SPICE エージェントのチャネルデバイスの選択
  3. 仮想マシンの起動

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

    ゲストを virt-manager で開き、ゲスト仮想マシンにインストールされていない場合は SPICE エージェントをインストールします。
    # yum install spice-vdagent
  5. ゲストで SPICE エージェントを起動します。

    ゲストで SPICE エージェントサービスを起動します。
    # systemctl start spice-vdagent
これで、rhel7 仮想マシンに SPICE エージェントが設定されます。

第12章 Nested Virtualization

12.1. 概要

Red Hat Enterprise Linux 7.5 以降、nested virtualization は KVM ゲスト仮想マシンのテクノロジープレビューとして利用できます。この機能では、物理ホスト (レベル 0 または L0) で実行しているゲスト仮想マシン (レベル 1 または L1) がハイパーバイザーとして機能し、独自のゲスト仮想マシン (L2) を作成できます。
ネストされた仮想化は、制約のある環境でのハイパーバイザーのデバッグや、限られた量の物理リソースでの大規模な仮想展開のテストなど、さまざまなシナリオで役立ちます。ただし、ネストされた仮想化は、実稼働ユーザー環境では対応しておらず、推奨されていないため、主に開発とテストを目的としています。
ネストされた仮想化は、ホストの仮想化拡張機能に依存して機能します。また、Red Hat Enterprise Linux ではサポートされていない QEMU Tiny Code Generator (TCG) エミュレーションを使用して仮想環境でゲストを実行することと混同しないでください。

12.2. 設定

次の手順に従って、ネストされた仮想化を有効にし、設定し、起動します。
  1. 有効にする:この機能は、デフォルトでは無効になっています。これを有効にするには、L0 ホストの物理マシンで次の手順を使用します。
    Intel の場合:
    1. ネストされた仮想化がホストシステムで利用可能であるかどうかを確認します。
      $ cat /sys/module/kvm_intel/parameters/nested
      このコマンドが Y または 1 を返すと、機能が有効になります。
      コマンドが 0 または N を返す場合は、手順 ii および iii を使用します。
    2. kvm_intel モジュールをアンロードします。
      # modprobe -r kvm_intel
    3. ネスト機能をアクティブにします。
      # modprobe kvm_intel nested=1
    4. ネスト機能は、L0 ホストの次回起動時まで有効になります。永続的に有効にするには、以下の行を /etc/modprobe.d/kvm.conf ファイルに追加します。
      options kvm_intel nested=1
    AMD の場合:
    1. ネストされた仮想化がシステムで利用可能であるかどうかを確認します。
      $ cat /sys/module/kvm_amd/parameters/nested
      このコマンドが Y または 1 を返すと、機能が有効になります。
      コマンドが 0 または N を返す場合は、手順 ii および iii を使用します。
    2. kvm_amd モジュールをアンロードします。
      # modprobe -r kvm_amd
    3. ネスト機能をアクティブにします。
      # modprobe kvm_amd nested=1
    4. ネスト機能は、L0 ホストの次回起動時まで有効になります。永続的に有効にするには、以下の行を /etc/modprobe.d/kvm.conf ファイルに追加します。
      options kvm_amd nested=1
  2. 以下のいずれかの方法で、ネストした仮想化用に L1 仮想マシンを設定します。
    virt-manager
    1. 目的のゲストの GUI を開き、Show Virtual Hardware Details アイコンをクリックします。
    2. Processor メニューを選択し、Configuration セクションで、Model フィールドに host-passthrough と入力し (ドロップダウン選択を使用しません)、Apply をクリックします。
    ドメイン XML
    ゲストのドメイン XML ファイルに、次の行を追加します。
    <cpu mode='host-passthrough'/>
    ゲストの XML 設定ファイルに <cpu> 要素がすでに含まれる場合は、これを書き直してください。
  3. ネストされた仮想化の使用を開始するするには、L1 ゲスト内に L2 ゲストをインストールします。これには、L1 ゲストのインストールと同じ手順に従います。詳細は 3章仮想マシンの作成 を参照してください。

12.3. 制限事項

  • L0 ホストおよび L1 ゲストで Red Hat Enterprise Linux 7.2 以降を実行することが強く推奨されます。L2 ゲストには、Red Hat がサポートするゲストシステムを含めることができます。
  • L1 または L2 ゲストの移行はサポートされていません。
  • ハイパーバイザーとしての L2 ゲストの使用および L3 ゲストの作成はサポートされていません。
  • ホストで利用可能な機能がすべて L1 ハイパーバイザーで使用できる訳ではありません。たとえば、IOMMU/VT-d や APICv は、L1 ハイパーバイザーでは使用できません。
  • ネストされた仮想化を使用するには、ホストの CPU に必要な機能フラグが必要です。L0 ハイパーバイザーおよび L1 ハイパーバイザーが正しく設定されているかを確認するには、L0 および L1 の両方で cat /proc/cpuinfo コマンドを使用し、両方のハイパーバイザーの各 CPU に次のフラグが記載されていることを確認します。
    • Intelの場合 - -vmx (ハードウェア仮想化)およびept (拡張ページテーブル)
    • AMD の場合 - svm (vmx と同等) および npt (ept と同等)

パート II. 管理

このパートでは、仮想マシンの管理に関連するトピックを取り上げ、仮想ネットワーク、ストレージ、PCI割り当てなどの仮想化機能がどのように機能するかを説明します。また、このパートでは、qemu-img ツール、virt-manager ツール、および virsh ツールを使用したデバイスおよびゲストの仮想マシンの管理方法も説明します。

第13章 仮想マシン用のストレージの管理

本章では、仮想マシンのストレージについて説明します。仮想ストレージは、仮想マシンの接続に割り当てられた物理ストレージから抽象化されます。ストレージは、準仮想化またはエミュレートのブロックデバイスドライバーを使用して仮想マシンに接続されています。

13.1. ストレージの概念

storage pool は、ゲスト仮想マシンが使用するために確保するストレージの量です。ストレージプールは、ストレージボリュームに分類されます。各ストレージボリュームは、ゲストバスのブロックデバイスとしてゲスト仮想マシンに割り当てられます。
ストレージプールとボリュームは、libvirt を使用して管理されます。libvirt のリモートプロトコルを使用すると、ゲスト仮想マシンのライフサイクルのあらゆる側面、およびゲスト仮想マシンに必要なリソースの設定を管理できます。この操作は、リモートホストで実行できます。そして、libvirt を使用した管理アプリケーション (Virtual Machine Manager など) は、ゲスト仮想マシンにホスト物理マシンを設定するために必要なすべてのタスクを実行できるようにします。これには、シェルアクセスやその他の制御チャネルを必要とせずに、リソースの割り当て、ゲスト仮想マシンの実行、シャットダウン、リソースの割り当て解除などが含まれます。
libvirt の API を使用すると、ストレージプールのボリューム一覧を照会したり、ストレージプールの容量、割り当て、利用可能なストレージに関する情報を取得したりできます。ストレージプール内のストレージボリュームは、スパースボリュームで異なる可能性がある割り当てや容量などの情報を取得するためにクエリーされることがあります。
注記
スパースボリュームの詳細は、Virtualization Getting Started Guide を参照してください。
ストレージプールがこれに対応する場合は、libvirt API を使用してストレージボリュームを作成、クローン、サイズ変更、および削除できます。API は、ストレージボリュームへのデータのアップロード、ストレージボリュームからのデータのダウンロード、またはストレージボリュームからのデータの消去にも使用できます。
ストレージプールを起動すると、ドメイン XML 内のボリュームへのホストパスの代わりに、ストレージプール名とストレージボリューム名を使用して、ストレージボリュームをゲストに割り当てることができます。
注記
ドメインXML の詳細は、23章ドメイン XML の操作 を参照してください。
ストレージプールは停止 (破棄) できます。これによりデータの抽象化は削除されますが、データは保持されます。
たとえば、mount -t nfs nfs.example.com:/path/to/share /path/to/data を使用する NFS サーバー。ストレージ管理者は、仮想化ホストで NFS ストレージプールを定義して、エクスポートしたサーバーパスおよびクライアントターゲットパスを記述できます。これにより、libvirt が起動した場合、または必要に応じてlibvirt が実行中に、libvirt がマウントを実行します。NFS サーバーがエクスポートしたディレクトリーが含まれるファイルは、NFS ストレージプールのストレージボリュームとして一覧表示されます。
ストレージボリュームをゲストに追加する際、管理者がターゲットパスをボリュームに追加する必要はありません。名前でストレージプールとストレージボリュームを追加する必要があります。したがって、ターゲットクライアントのパスが変更しても、仮想マシンには影響を及ぼしません。
ストレージプールが開始すると、libvirt は、システム管理者がログインして mount nfs.example.com:/path/to/share /vmdata を実行した場合と同じように、指定したディレクトリーに共有をマウントします。ストレージプールが自動起動するように設定されている場合は、libvirt が起動したときに、指定したディレクトリーに NFS 共有ディスクがマウントされていることが libvirt により確認されます。
ストレージプールが起動すると、NFS 共有ディスクのファイルはストレージボリュームとして報告され、ストレージボリュームのパスは、libvirt の API を使用してクエリーできます。ストレージボリュームのパスは、ゲスト仮想マシンの XML 定義のセクションにコピーできます。このセクションは、ゲスト仮想マシンのブロックデバイスのソースストレージを記述します。NFS の場合、libvirt の API を使用するアプリケーションは、プールのサイズの制限 (共有ストレージの容量) まで、ストレージプール (NFS 共有のファイル) でストレージボリュームを作成して削除できます。
ボリュームの作成および削除は、すべてのストレージプールタイプで対応しているわけではありません。ストレージプールを停止する (pool-destroy) と、開始操作を取り消します。この場合は、NFS 共有のマウントを解除します。コマンドの名前が記載されているにも関わらず、共有上のデータは destroy 操作で修正されません。詳細は、man virsh を参照してください。

手順13.1 ストレージの作成と割り当て

この手順により、仮想マシンゲストのストレージを作成および割り当てるために必要な手順の概要がわかります。
  1. ストレージプールの作成

    利用可能なストレージメディアから、1 つ以上のストレージプールを作成します。詳細は、「ストレージプールの使用」 を参照してください。
  2. ストレージボリュームの作成

    利用可能なストレージプールから、ストレージボリュームを 1 つ以上作成します。詳細は、「ストレージボリュームの使用」 を参照してください。
  3. 仮想マシンへのストレージデバイスの割り当て

    ストレージボリュームから抽象化されたストレージデバイスを、ゲスト仮想マシンに割り当てます。詳細は、「ゲストへのストレージデバイスの追加」 を参照してください。

13.2. ストレージプールの使用

本セクションでは、仮想マシンでストレージプールを使用する方法を説明します。概念的な情報 に加えて、virsh コマンドと Virtual Machine Manager を使用してストレージプールを 作成設定、および削除 するための詳細な手順を提供します。

13.2.1. ストレージプールの概念

ストレージプールは、仮想マシンにストレージを提供するために、libvirt が管理するファイル、ディレクトリー、またはストレージデバイスです。ストレージプールは、仮想マシンイメージを保存するストレージボリュームに分割されるか、追加のストレージとして仮想マシンに割り当てられます。複数のゲストで同じストレージプールを共有できるため、ストレージリソースの割り当てを改善できます。
ストレージプールは、ローカルまたはネットワークベース (共有) にできます。
ローカルストレージのプール
ローカルストレージプールは、ホストサーバーに直接割り当てることができます。これには、ローカルデバイスのローカルディレクトリー、直接接続したディスク、物理パーティション、および論理ボリューム管理 (LVM) ボリュームグループが含まれます。ローカルストレージプールは、移行や大量の仮想マシンを必要としない開発、テスト、および小規模なデプロイメントに役立ちます。ローカルストレージプールは、ライブマイグレーションに使用できないため、多くの実稼働環境には適していない場合があります。
ネットワーク (共有) ストレージプール
ネットワークストレージプールには、標準プロトコルを使用してネットワーク経由で共有されるストレージデバイスが含まれます。virt-manager を使用してホスト間で仮想マシンを移行する場合はネットワークストレージが必要ですが、virsh を使用して移行する場合は任意です。
仮想マシンの移行の詳細は、15章KVM の移行 を参照してください。
以下は、Red Hat Enterprise Linux が対応しているストレージプールのタイプの一覧です。
  • ディレクトリーベースのストレージプール
  • ディスクベースのストレージプール
  • パーティションベースのストレージプール
  • GlusterFS ストレージプール
  • iSCSI ベースのストレージプール
  • LVM ベースのストレージプール
  • NFS ベースのストレージプール
  • SCSI デバイスを使用した vHBA ベースのストレージプール
以下は、Red Hat Enterprise Linux で対応していないlibvirtストレージプールタイプの一覧です。
  • マルチパスベースのストレージプール
  • RBD ベースのストレージプール
  • sheepdog ベースのストレージプール
  • vstorage ベースのストレージプール
  • ZFS ベースのストレージプール
注記
対応していないストレージプールタイプの一部は、Virtual Machine Manager インターフェースに表示されます。ただし、これを使用することはできません。

13.2.2. ストレージプールの作成

本セクションでは、virsh および Virtual Machine Manager を使用してストレージプールを作成する方法を説明します。virsh を使用すると、すべてのパラメーターを指定できますが、Virtual Machine Manager を使用すると、より単純なストレージプールを作成するためのグラフィックメソッドが提供されます。

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

注記
本セクションでは、例としてパーティションベースのストレージプールの作成を示します。

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

  1. 推奨事項を読み、前提条件がすべて満たされていることを確認します。

    ストレージプールによっては、このガイドでは特定の方法に従うことが推奨されます。また、一部のタイプのストレージプールには前提条件があります。推奨事項および前提条件 (存在する場合) を表示する場合は、「ストレージプール固有のもの」 を参照してください。
  2. ストレージプールの定義

    ストレージプールは永続的または一時的なものにできます。永続ストレージプールは、ホストマシンのシステムを再起動しても維持します。一時的なストレージプールは、ホストが再起動すると削除されます。
    次のいずれかを行います。
    • XML ファイルを使用してストレージプールを定義します。
      a.新規デバイスに必要なストレージプール情報を含む一時的な XML ファイルを作成します。
      XML ファイルには、ストレージプールのタイプに基づいた特定のフィールドが含まれている必要があります。詳細は、「ストレージプール固有のもの」 を参照してください。
      以下は、ストレージプール定義の XML ファイルの例を示しています。この例では、ファイルは ~/guest_images.xml に保存されています。
      <pool type='fs'>
        <name>guest_images_fs</name>
        <source>
          <device path='/dev/sdc1'/>
        </source>
        <target>
          <path>/guest_images</path>
        </target>
      </pool>
      b.virsh pool-define コマンドを使用して、永続ストレージプールを作成するか、virsh pool-create コマンドを使用して一時ストレージプールを作成して起動します。
      # virsh pool-define ~/guest_images.xml
      Pool defined from guest_images_fs
      
      または
      # virsh pool-create ~/guest_images.xml
      Pool created from guest_images_fs
      c.手順 a で作成した XML ファイルを削除します。
    • virsh pool-define-as コマンドを使用して、永続ストレージプールを作成するか、virsh pool-create-as コマンドを使用して一時的なストレージプールを作成します。
      以下の例では、永続化した後、/guest_images ディレクトリーから /dev/sdc1 にマッピングされた一時的なファイルシステムベースのストレージプールを作成します。
      # virsh pool-define-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs defined
      または
      # virsh pool-create-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs created
      注記
      virsh インターフェースを使用する場合、コマンド内のオプション名は任意です。オプション名を使用しない場合は、指定する必要のないフィールドにハイフンを使用します。
  3. プールが作成されたことを確認します。

    virsh pool-list --allを使用して、存在するすべてのストレージプールの一覧を表示します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
  4. ストレージプールのターゲットパスを定義します。

    virsh pool-build コマンドを使用して、フォーマット済みファイルシステムのストレージプール用のストレージプールターゲットパスを作成し、ストレージソースデバイスを初期化し、データのフォーマットを定義します。次に、virsh pool-list を使用して、ストレージプールが一覧表示されていることを確認します。
    # 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
    
    注記
    ターゲットパスの構築は、ディスクベース、ファイルシステムベース、論理ストレージプールにのみ必要です。libvirt は、overwrite オプションが指定されている場合を除き、ソースストレージデバイスのデータフォーマットが、選択したストレージプールタイプと異なることを検出すると、ビルドに失敗します。
  5. ストレージプールを起動します。

    virsh pool-start コマンドを使用して、ソースデバイスを使用できるように準備します。
    実行されるアクションは、ストレージプールのタイプによって異なります。たとえば、ファイルシステムベースのストレージプールの場合、virsh pool-start コマンドはファイルシステムをマウントします。LVM ベースのストレージプールの場合、virsh pool-start コマンドは、vgchange コマンドを使用してボリュームグループをアクティブにします。
    次に、virsh pool-list command を使用して、ストレージプールがアクティブであることを確認します。
    # 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
    
    注記
    virsh pool-start コマンドは、永続ストレージプールにのみ必要です。一時的なストレージプールは、作成時に自動的に起動します。
  6. 自動起動を有効にする (オプション)

    デフォルトでは、virsh で定義されたストレージプールは、libvirtd が起動するたびに自動的に起動するように設定されていません。virsh pool-autostart を使用すると、ストレージプールを自動的に起動するように設定できます。
    # 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
    
    ストレージプールは、libvirtd が起動するたびに自動的に起動するようになりました。
  7. ストレージプールを確認します。

    ストレージプールが正しく作成され、報告されたサイズが期待どおりで、状態が 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
    

13.2.2.2. Virtual Machine Manager を使用したストレージプールの作成

注記
このセクションでは、例としてディスクベースのストレージプールの作成について説明します。

手順13.3 Virtual Machine Manager を使用したストレージプールの作成

  1. ストレージプールを作成するメディアを準備します。

    これは、ストレージプールのタイプにより異なります。詳細は 「ストレージプール固有のもの」 を参照してください。
    この例では、GUID Partition Table でディスクに再ラベル付けする必要がある場合があります。
  2. ストレージ設定を開く

    1. Virtual Machine Manager で、設定するホスト接続を選択します。
      Edit メニューを開き 、Connection Details を選択します。
    2. Connection Details ウィンドウの Storage タブをクリックします。

      図13.1 ストレージタブ

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

    注記
    Virtual Machine Manager を使用して、永続ストレージプールのみを作成できます。一時ストレージプールは、virsh を使用してのみ作成できます。
    1. 新しいストレージプールの追加 (パート 1)

      ウィンドウんの下部の ボタンをクリックします。Add a New Storage Pool ウィザードが表示されます。
      ストレージプールの Name を入力します。この例では、guest_images_fs という名前を使用します。
      Type ドロップダウンリストから、作成するストレージプールの種類を選択します。この例ではfs:Pre-Formatted Block Device を使用します。

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

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

      図13.3 ストレージプールのパス

      ストレージプールのパス
      関連するパラメーターを使用してストレージプールを設定します。各タイプのストレージプールのパラメーターの詳細は、「ストレージプール固有のもの」 を参照してください。
      ストレージプールの種類によっては、Build Pool チェックボックスが表示されます。ストレージからストレージプールを構築する場合は、Build Pool チェックボックスをチェックします。
      詳細を確認し、Finish をクリックしてストレージプールを作成します。

13.2.3. ストレージプール固有のもの

このセクションでは、前提条件、パラメーター、および追加情報を含む、各タイプのストレージプールに固有の情報を説明します。これには、以下のトピックが含まれます。

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

パラメーター
以下の表は、ディレクトリーベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.1 ディレクトリーベースのストレージプールのパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='dir'> [type] directory dir:ファイルシステムディレクトリー
ストレージプールの名前 <name>name</name> [name] name Name (名前)
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>target_path</path>
</target>

target path_to_pool ターゲットパス
virsh を使用してストレージプールを作成する場合は、プールが作成されたことの確認して 続行します。
以下は、/guest_images ディレクトリーに基づいたストレージプールの XML ファイルの例です。
<pool type='dir'>
  <name>dirpool</name>
  <target>
    <path>/guest_images</path>
  </target>
</pool>
以下は、/guest_images ディレクトリーに基づいてストレージプールを作成するコマンドの例になります。
# virsh pool-define-as dirpool dir --target "/guest_images"
Pool FS_directory defined
以下の図は、/guest_images ディレクトリーに基づいてストレージプールを作成するための、Virtual Machine Manager の Add a New Storage Pool ダイアログボックスの例を示しています。

図13.4 新しいディレクトリーベースのストレージプールの例を追加します。

新しいディレクトリーベースのストレージプールの例を追加します。

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

推奨事項
ディスクベースのストレージプールを作成する前に、以下の点に注意してください。
  • 使用されている libvirt のバージョンに応じて、ディスクをストレージプール専用にすると、現在ディスクデバイスに格納されているすべてのデータが再フォーマットされて消去される可能性があります。ストレージプールを作成する前に、ストレージデバイスのデータのバックアップを作成することを強く推奨します。
  • ゲストには、ディスク全体またはブロックデバイス (/dev/sdb など) への書き込みアクセス権を付与しないでください。パーティション (/dev/sdb1 など) または LVM ボリュームを使用します。
    ブロックデバイス全体をゲストに渡すと、ゲストはブロックデバイスをパーティションに分割するか、ブロックデバイスに独自の LVM グループを作成します。これにより、ホストの物理マシンがこのようなパーティションや LVM グループを検出し、エラーが発生する場合があります。
前提条件
注記
本セクションの手順は、virsh pool-build コマンドを実行しない場合に限り必要になります。
ホストディスクにディスクベースのストレージプールを作成する前に、ディスクに、GUID Partition Table (GPT) ディスクラベルを付けて再ラベル付けする必要があります。GPT ディスクラベルは、各デバイスに最大 128 個のパーティションを作成できます。
# 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.
#
ディスクに再ラベル付けしたら、ストレージプールの定義 でストレージプールの作成を続行します。
パラメーター
以下の表は、ディスクベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.2 ディスクベースのストレージプールのパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='disk'> [type] disk disk:物理ディスクデバイス
ストレージプールの名前 <name>name</name> [name] name Name (名前)
ストレージデバイスを指定するパス。たとえば、/dev/sdb

<source>
  <device path=/dev/sdb/>
<source>

source-dev path_to_disk ソースパス
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>/path_to_pool</path>
</target>

target path_to_pool ターゲットパス
virsh を使用してストレージプールを作成する場合は、ストレージプールの定義 に進みます。
以下は、ディスクに基づいたストレージプールに対する XML ファイルの例です。
<pool type='disk'>
  <name>phy_disk</name>
  <source>
    <device path='/dev/sdb'/>
    <format type='gpt'/>
  </source>
  <target>
    <path>/dev</path>
  </target>
</pool>
以下は、ディスクベースのストレージプールを作成するコマンドの例です。
# virsh pool-define-as phy_disk disk --source-format=gpt --source-dev=/dev/sdb --target /dev
Pool phy_disk defined
以下の図は、ディスクベースのストレージプールを作成するための、仮想マシン XML 設定 Virtual Machine Manager の Add a New Storage Pool ダイアログボックスの例を示しています。

図13.5 新しいディスクベースのストレージプールの例を追加します。

新しいディスクベースのストレージプールの例を追加します。

13.2.3.3. ファイルシステムベースのストレージプール

推奨事項
このセクションの手順に従って、ディスク全体 (/dev/sdb など) をストレージプールとして割り当てないでください。ゲストには、ディスク全体またはブロックデバイスへの書き込みアクセス権を付与しないでください。この方法は、パーティション (/dev/sdb1 など) をストレージプールに割り当てる場合に限り使用してください。
前提条件
注記
これは、virsh pool-build コマンドを実行しない場合にのみ必要になります。
パーティションからストレージプールを作成するには、ファイルシステムを ext4 にフォーマットします。
# mkfs.ext4 /dev/sdc1
ファイルシステムをフォーマットしたら、ストレージプールの定義 でストレージプールの作成を続行します。
パラメーター
以下の表は、パーティションからファイルシステムベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.3 ファイルシステムベースのストレージプールパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='fs'> [type] fs fs:フォーマット済みブロックデバイス
ストレージプールの名前 <name>name</name> [name] name Name (名前)
パーミッションを指定するパス。たとえば、/dev/sdc1

<source>
  <device path='source_path' />

[source] path_to_partition ソースパス
ファイルシステムのタイプ (ext4 など)。

  <format type='fs_type' />
</source>

[ソースフォーマット]FS-format 該当なし
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>/path_to_pool</path>
</target>

[target] path_to_pool ターゲットパス
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
次に示すのは、ファイルシステムベースのストレージプールの XML ファイルの例です。
<pool type='fs'>
  <name>guest_images_fs</name>
  <source>
    <device path='/dev/sdc1'/>
    <format type='auto'/>
  </source>
  <target>
    <path>/guest_images</path>
  </target>
</pool>
以下は、パーティションベースのストレージプールを作成するコマンドの例です。
# virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
Pool guest_images_fs defined
以下の図は、ファイルシステムベースのストレージプールを作成するための、仮想マシン XML 設定Virtual Machine Managerの Add a New Storage Pool ダイアログボックスの例を示しています。

図13.6 新しいファイルシステムベースのストレージプールの例を追加します。

新しいファイルシステムベースのストレージプールの例を追加します。

13.2.3.4. GlusterFS ベースのストレージプール

推奨事項
GlusterFS は、ユーザー空間のファイルシステム (FUSE) を使用するユーザー空間のファイルシステムです。
前提条件
GlusterFS ベースのストレージプールをホストに作成する前に、Gluster サーバーを準備する必要があります。

手順13.4 Gluster サーバーの準備

  1. 次のコマンドを使用してそのステータスを一覧表示して、Gluster サーバーの IP アドレスを取得します。
    # gluster volume status
    Status of volume: gluster-vol1
    Gluster process						Port	Online	Pid
    ------------------------------------------------------------------------------
    Brick 222.111.222.111:/gluster-vol1 			49155	Y	18634
    
    Task Status of Volume gluster-vol1
    ------------------------------------------------------------------------------
    There are no active volume tasks
    
  2. glusterfs-fuse パッケージがインストールされていない場合はインストールします。
  3. virt_use_fusefs ブール値が有効になっていない場合は有効にします。有効になっていることを確認します。
    # setsebool virt_use_fusefs on
    # getsebool virt_use_fusefs
    virt_use_fusefs --> on
    
必要なパッケージがインストールされ、有効になったことを確認したら、ストレージプールの作成を続行して、ストレージプールの定義 でストレージプールを作成します。
パラメーター
以下の表は、GlusterFS ベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.4 GlusterFS ベースのストレージプールパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='gluster'> [type] gluster Gluster:Gluster ファイルシステム
ストレージプールの名前 <name>name</name> [name] name Name (名前)
Gluster サーバーのホスト名または IP アドレス

<source>
  <hostname='hostname' />

source-host hostname ホスト名
Gluster サーバーの名前   <name='Gluster-name' /> source-name Gluster-name ソース名
ストレージプールに使用される Gluster サーバーのパス。

  <dir path='Gluster-path' />
</source>

source-path Gluster-path ソースパス
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
以下は、GlusterFS ベースのストレージプールの XML ファイルの例になります。
<pool type='gluster'>
  <name>Gluster_pool</name>
  <source>
    <host name='111.222.111.222'/>
    <dir path='/'/>
    <name>gluster-vol1</name>
  </source>
</pool>
以下は、GlusterFS ベースのストレージプールを作成するコマンドの例になります。
# pool-define-as --name Gluster_pool --type gluster --source-host 111.222.111.222 --source-name gluster-vol1 --source-path /
Pool Gluster_pool defined
以下の図は、GlusterFS ベースのストレージプールを作成するための、仮想マシン XML 設定 Virtual Machine ManagerAdd a New Storage Pool ダイアログボックスの例を示しています。

図13.7 新しい GlusterFS ベースのストレージプールの例を追加します。

新しい GlusterFS ベースのストレージプールの例を追加します。

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

推奨事項
iSCSI (Internet Small Computer System Interface) は、ストレージデバイスを共有するネットワークプロトコルです。iSCSI は、IP 層で SCSI 命令を使用してイニシエーター (ストレージクライアント) をターゲット (ストレージサーバー) に接続します。
iSCSI ベースのデバイスを使用してゲスト仮想マシンを保存することで、iSCSI をブロックストレージデバイスとして使用するなど、より柔軟なストレージオプションが可能になります。iSCSI デバイスは、Linux-IO (LIO) ターゲットを使用します。これは、Linux 用のマルチプロトコル SCSI ターゲットです。LIO は、iSCSI に加えて、FCoE (Fibre Channel and Fibre Channel over Ethernet) にも対応します。
前提条件
iSCSI ベースのストレージプールを作成する前に、iSCSI ターゲットを作成する必要があります。iSCSIターゲットは、targetcli パッケージを使用して作例されます。これは、ソフトウェアで対応している iSCSI ターゲットを作成するためのコマンドセットを提供します。

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

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

    # yum install targetcli
  2. targetcli コマンドセットの起動

    # targetcli
  3. ストレージオブジェクトの作成

    ストレージプールを使用して、3 つのストレージオブジェクトを作成します。
    1. ブロックストレージオブジェクトの作成
      1. /backstores/block ディレクトリーに移動します。
      2. create コマンドを実行します。
        # create [block-name][filepath]
        以下は例になります。
        # create block1 dev=/dev/sdb1
    2. fileio オブジェクトの作成
      1. /fileio ディレクトリーに移動します。
      2. create コマンドを実行します。
        # create [fileio-name][image-name] [image-size]
        以下は例になります。
        # create fileio1 /foo.img 50M
    3. ramdisk オブジェクトの作成
      1. /ramdisk ディレクトリーに移動します。
      2. create コマンドを実行します。
        # create [ramdisk-name] [ramdisk-size]
        以下は例になります。
        # create ramdisk1 1M
    4. この手順で作成したディスクの名前を書き留めておきます。これらは後で使用されます。
  4. iSCSI ターゲットの作成

    1. /iscsi ディレクトリーに移動します。
    2. ターゲットの作成には、以下の 2 つの方法があります。
      • パラメーターを指定せずに create コマンドを実行します。
        iSCSI qualified name (IQN) は自動的に生成されます。
      • IQN とサーバーを指定して create コマンドを実行します。以下は例になります。
        # create iqn.2010-05.com.example.server1:iscsirhel7guest
  5. ポータル IP アドレスの定義

    iSCSI 経由でブロックストレージをエクスポートするには、最初にポータル、LUN、および access control lists ACL を設定する必要があります。
    ポータルには、ターゲットが監視する IP アドレスと TCP、および接続するイニシエーターが含まれます。iSCSI はポート 3260 を使用します。このポートはデフォルトで設定されています。
    ポート 3260 への接続:
    1. /tpg ディレクトリーに移動します。
    2. 以下のコマンドを実行します。
      # portals/ create
      このコマンドを実行すると、ポート 3260 をリッスンしている利用可能な IP アドレスがすべて使用できるようになります。
      ポート 3260 をリッスンする IP アドレスを 1 つだけにする場合は、コマンドの末尾に IP アドレスを追加します。以下は例になります。
      # portals/ create 143.22.16.33
  6. LUN の設定と、ストレージオブジェクトのファブリックへの割り当て

    この手順では、ストレージオブジェクトの作成 で作成したストレージオブジェクトを使用します。
    1. ポータルの IP アドレスの定義 で作成した TPG の luns ディレクトリーに移動します。以下は例になります。
      # iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
    2. 最初の LUN を ramdisk に割り当てます。以下は例になります。
      # create /backstores/ramdisk/ramdisk1
    3. 2 番目の LUN をブロックディスクに割り当てます。以下は例になります。
      # create /backstores/block/block1
    4. 3 番目の LUN を fileio ディスクに割り当てます。以下は例になります。
      # create /backstores/fileio/fileio1
    5. 作成される LUN の一覧を表示します。
      /iscsi/iqn.20...csirhel7guest ls
      
      o- tgp1 ............................................................[enabled, auth]
        o- acls...................................................................[0 ACL]
        o- luns..................................................................[3 LUNs]
        | o- lun0......................................................[ramdisk/ramdisk1]
        | o- lun1...............................................[block/block1 (dev/vdb1)]
        | o- lun2................................................[fileio/file1 (foo.img)]
        o- portals.............................................................[1 Portal]
          o- IP-ADDRESS:3260.........................................................[OK]
      
  7. 各イニシエーターの ACL の作成

    イニシエーターの接続時に認証を有効にします。指定した LUN を、指定したイニシエーターに制限することもできます。ターゲットとイニシエーターには一意の名前があります。iSCSI イニシエーターは IQN を使用します。
    1. イニシエーター名を使用して、iSCSI イニシエーターの IQN を検索します。以下は例になります。
      # cat /etc/iscsi/initiator2.iscsi
      InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
      このIQNは、ACLを作成するために使用されます。
    2. acls ディレクトリーへ移動します。
    3. 次のいずれかを実行してACLを作成します。
      • パラメーターを指定せずに create コマンドを実行して、すべての LUN およびイニシエーターに ACL を作成します。
        # create
      • 特定の LUN およびイニシエーターに ACL を作成し、iSCSI インティエーターの IQN を指定して create コマンドを実行します。以下は例になります。
        # create iqn.2010-05.com.example.server1:888
      • すべてのイニシエーターに 1 つのユーザー ID とパスワードを使用するように、カーネルターゲットを設定します。
        # set auth userid=user_ID
        # set auth password=password
        # set attribute authentication=1
        # set attribute generate_node_acls=1
    この手順を完了したら、ストレージプールをセキュリティー保護 して続行します。
  8. 設定を保存します。

    以前の起動設定を上書きして、設定を永続化します。
    # saveconfig
  9. サービスを有効にします。

    次回の起動時に保存した設定を適用するには、サービスを有効にします。
    # systemctl enable target.service
オプションの手順
iSCSI ベースのストレージプールを作成する前に、iSCSI ターゲットで実行できるオプションの手順が多数あります。

手順13.6 RAID アレイでの論理ボリュームの設定

  1. RAID5 アレイの作成

    RAID5 アレイの作成方法は、Red Hat Enterprise Linux 7 Storage Administration Guide を参照してください。
  2. RAID5 アレイに LVM 論理ボリュームを作成する

    RAID5 アレイで LVM 論理ボリュームを作成する方法は、Red Hat Enterprise Linux 7 Logical Volume Manager Administration Guide を参照してください。

手順13.7 検出可能性のテスト

  • 新しい iSCSI デバイスが検出可能であることを確認します。

    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    143.22.16.33:3260,1 iqn.2010-05.com.example.server1:iscsirhel7guest

手順13.8 デバイスの接続のテスト

  1. 新しい iSCSI デバイスの接続

    新しいデバイス (iqn.2010-05.com.example.server1:iscsirhel7guest) を接続して、デバイスを接続できるかどうかを判断します。
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.
    
  2. デバイスの取り外し

    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.

手順13.9 iSCSI ストレージプールで libvirt のシークレットを使用する

注記
この手順は、iSCSI ターゲットの作成 時に、user_ID および password が定義される場合に必要です。
ユーザー名とパスワードのパラメーターは、iSCSI ストレージプールを保護するため、virsh で設定できます。これは、プールを定義する前または後に設定できますが、認証設定を有効にするにはプールを起動する必要があります。
  1. libvirt の秘密ファイルを作成する

    チャレンジハンドシェイク認証プロトコル (CHAP) のユーザー名を使用して、libvirt シークレットファイルを作成します。以下は例になります。
    <secret ephemeral='no' private='yes'>
        <description>Passphrase for the iSCSI example.com server</description>
        <usage type='iscsi'>
            <target>iscsirhel7secret</target>
        </usage>
    </secret>
  2. シークレットの定義

    # virsh secret-define secret.xml
  3. UUID の確認

    # virsh secret-list
    UUID                                  Usage
    --------------------------------------------------------------------------------
    2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. UID へのシークレットの割り当て

    以下のコマンドを使用して、前の手順の出力の UUID に、シークレットを割り当てます。これにより、CHAP ユーザー名とパスワードが、libvirt が制御するシークレット一覧にあることが保証されます。
    # MYSECRET=`printf %s "password123" | base64`
    # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
  5. ストレージプールに認証エントリーを追加します。

    virsh edit を使用して、ストレージプールの XML ファイル内の <source> エントリーを変更し、authentication typeusername、および secret usage を指定して <auth> 要素を追加します。
    以下は例になります。
    <pool type='iscsi'>
      <name>iscsirhel7pool</name>
        <source>
           <host name='192.168.122.1'/>
           <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
           <auth type='chap' username='redhat'>
              <secret usage='iscsirhel7secret'/>
           </auth>
        </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
    注記
    サブ要素 <auth> は、ゲスト XML 内の <pool> 要素および <disk> 要素の異なる場所に存在します。<pool> の場合は、<auth><source> 要素内に指定されます。認証は一部のプールソース (iSCSI および RBD) のプロパティーであるため、これはプールソースの検索場所を説明する要素となります。ドメインのサブ要素である <disk> の場合、iSCSI ディスクまたは RBD ディスクに対する認証は、ディスクのプロパティーになります。
    また、ディスクのサブ要素 <auth> は、ストレージプールのサブ要素とは異なります。
    <auth username='redhat'>
      <secret type='iscsi' usage='iscsirhel7secret'/>
    </auth>
  6. 変更を有効にします。

    この変更をアクティブにするには、ストレージプールを起動する必要があります。
    • ストレージプールが起動していない場合は、virsh を使用したストレージプールの作成 の手順に従ってストレージプールを定義し、起動します。
    • プールがすでに起動している場合は、次のコマンドを入力してストレージプールを停止し、再起動します。
      # virsh pool-destroy iscsirhel7pool
      # virsh pool-start iscsirhel7pool
パラメーター
以下の表は、iSCSI ベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.5 iSCSI ベースのストレージプールパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='iscsi'> [type] iscsi iscsi: iSCSI ターゲット
ストレージプールの名前 <name>name</name> [name] name Name (名前)
ホストの名前。

<source>
  <host name='hostname' />

source-host hostname ホスト名
iSCSI IQN

  device path="iSCSI_IQN" />
</source>

source-dev iSCSI_IQN ソース IQN
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>/dev/disk/by-path</path>
</target>

target path_to_pool ターゲットパス
(必要に応じて) iSCSI イニシエーターの IQN。これは、ACL が LUN を特定のイニシエーターに制限する場合に限り必要です。

<initiator>
  <iqn name='initiator0' />
</initiator>

以下の注記を参照してください。 イニシエーター IQN
注記
iSCSI イニシエーターの IQN は、virsh find-storage-pool-sources-as iscsi コマンドを使用して指定できます。
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
以下は、iSCSI ベースのストレージプールの XML ファイルの例になります。
<pool type='iscsi'>
  <name>iSCSI_pool</name>
  <source>
    <host name='server1.example.com'/>
    <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>

以下は、iSCSI ベースのストレージプールを作成するコマンドの例になります。
# virsh pool-define-as --name iSCSI_pool --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
Pool iSCSI_pool defined
以下の図は、iSCSI ベースのストレージプールを作成するための、仮想マシン XML 設定 Virtual Machine Manager の Add a New Storage Pool ダイアログボックスの例を示しています。

図13.8 新しい iSCSI ベースのストレージプールの例を追加します。

新しい iSCSI ベースのストレージプールの例を追加します。

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

推奨事項
LVM ベースのストレージプールを作成する前に、以下の点に注意してください。
  • LVM ベースのストレージプールは、LVM の柔軟性を完全には提供しません。
  • libvirt は、シン論理ボリュームに対応しますが、シンストレージプールの機能は提供しません。
  • LVM ベースのストレージプールは、ボリュームグループです。Logical Volume Manager コマンド、または virsh コマンドを使用して、ボリュームグループを作成できます。virsh インターフェースを使用してボリュームグループを管理する場合は、virsh コマンドを使用してボリュームグループを作成します。
    ボリュームグループの詳細は、Red Hat Enterprise Linux Logical Volume Manager Administration Guide を参照してください。
  • LVM ベースのストレージプールには、完全なディスクパーティションが必要です。この手順で新しいパーティションまたはデバイスをアクティベートすると、パーティションはフォーマットされ、すべてのデータが削除されます。ホストの既存のボリュームグループ (VG) を使用すると、何も消去されません。以下の手順を開始する前に、ストレージデバイスのバックアップを作成することが推奨されます。
    LVM ボリュームグループの作成方法は、Red Hat Enterprise Linux Logical Volume Manager Administration Guide を参照してください。
  • 既存の VG に LVM ベースのストレージプールを作成する場合は、pool-build コマンドを実行しないでください。
仮想マシンが準備されたことを確認したら、ストレージプールの定義 でストレージプールの作成を続行します。
パラメーター
以下の表は、LVM ベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.6 LVM ベースのストレージプールパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='logical'> [type] logical logical:LVM Volume Group
ストレージプールの名前 <name>name</name> [name] name Name (名前)
ストレージプールのデバイスのパス

<source>
  <device path='device_path' />

source-dev device_path ソースパス
ボリュームグループの名前   <name='VG-name' /> source-name VG-name ソースパス
仮想グループの形式

  <format type='lvm2' />
</source>

source-format lvm2 該当なし
ターゲットパス

<target>
  <path='target-path' />
</target>

target target-path ターゲットパス
注記
論理ボリュームグループが複数のディスクパーティションで作成されている場合は、複数のソースデバイスが一覧表示されている可能性があります。以下は例になります。
<source>
  <device path='/dev/sda1'/>
  <device path='/dev/sdb3'/>
  <device path='/dev/sdc2'/>
  ...
  </source>
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
以下は、LVM ベースのストレージプールの XML ファイルの例です。
<pool type='logical'>
  <name>guest_images_lvm</name>
  <source>
    <device path='/dev/sdc'/>
    <name>libvirt_lvm</name>
    <format type='lvm2'/>
  </source>
  <target>
    <path>/dev/libvirt_lvm</path>
  </target>
</pool>
以下は、LVM ベースのストレージプールを作成するコマンドの例です。
# virsh pool-define-as guest_images_lvm logical --source-dev=/dev/sdc --source-name libvirt_lvm --target /dev/libvirt_lvm
Pool guest_images_lvm defined
以下の図は、LVM ベースのストレージプールを作成するための、仮想マシン XML 設定 Virtual Machine Manager の Add a New Storage Pool ダイアログボックスの例を示しています。

図13.9 新しい LVM ベースのストレージプールの例を追加します。

新しい LVM ベースのストレージプールの例を追加します。

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

前提条件
NFS (Network File System) ベースのストレージプールを作成するには、ホストマシンで NFS サーバーを使用するように設定しておく必要があります。NFS の詳細は、Red Hat Enterprise Linux Storage Administration Guide を参照してください。
NFS サーバーが適切に設定されていることを確認したら、ストレージプールの定義 でストレージプールの作成を続行します。
パラメーター
以下の表は、NFS ベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.7 NFS ベースのストレージプールパラメーター

説明XMLpool-define-asVirtual Machine Manager
ストレージプールのタイプ <pool type='netfs'> [type] netfs netfs:Network Exported Directory
ストレージプールの名前 <name>name</name> [name] name Name (名前)
マウントポイントが置かれている NFS サーバーのホスト名。これは、ホスト名または IP アドレスになります。

<source>
  <host name='host_name' />

source-host host_name ホスト名
NFS サーバーで使用されるディレクトリー

  <dir path='source_path' />
</source>

source-path source_path ソースパス
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>/target_path</path>
</target>

target target_path ターゲットパス
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
以下は、NFS ベースのストレージプールの XML ファイルの例です。
<pool type='netfs'>
  <name>nfspool</name>
  <source>
    <host name='localhost'/>
    <dir path='/home/net_mount'/>
  </source>
  <target>
    <path>/var/lib/libvirt/images/nfspool</path>
  </target>
</pool>
以下は、NFS ベースのストレージプールを作成するコマンドの例です。
# virsh pool-define-as nfspool netfs --source-host localhost --source-path /home/net_mount --target /var/lib/libvirt/images/nfspool
Pool nfspool defined
以下の図は、NFS ベースのストレージプールを作成するための、仮想マシン XML 設定 Virtual Machine Managerの Add a New Storage Pool ダイアログボックスの例を示しています。

図13.10 新しい NFS ベースのストレージプールの追加の例

新しい NFS ベースのストレージプールの追加の例

13.2.3.8. SCSI デバイスを使用する vHBA ベースのストレージプール

注記
Virtual Machine Manager を使用し、SCSI デバイスを使用して vHBA ベースのストレージプールを作成することはできません。
推奨事項
N_Port ID Virtualization (NPIV) は、1 つの物理ファイバーチャンネルのホストバスアダプター (HBA) の共有を可能にするソフトウェアテクノロジーです。これにより、複数のゲストが複数の物理ホストから同じストレージを認識できるため、ストレージの移行パスが容易になります。そのため、正しいストレージパスが指定されていれば、移行を使用してストレージを作成またはコピーする必要はありません。
仮想化では、仮想ホストバスアダプター、または vHBA が、仮想マシンの論理ユニット番号 (LUN) を制御します。複数の KVM ゲスト間でファイバーチャネルデバイスパスを共有するホストには、仮想マシンごとに vHBA を作成する必要があります。1 つの vHBA を、複数の KVM ゲストで使用することはできません。
NPIV の各 vHBA は、その親 HBA と、独自の World Wide Node Name (WWNN) および World Wide Port Name (WWPN) で識別されます。ストレージのパスは、WWNN および WWPN の値で決定します。親 HBA は、scsi_host# または WWNN/WWPN ペアとして定義できます。
注記
親 HBA が scsi_host# として定義され、ハードウェアがホストマシンに追加されている場合、scsi_host# の割り当てが変更される可能性があります。したがって、WWNN/WWPN のペアを使用して親 HBA を定義することが推奨されます。
これは、vHBA 設定を保持するため、vHBA に基づいて libvirt ストレージプールを定義することが推奨されます。
libvirt ストレージプールを使用すると、主に以下の利点があります。
  • libvirt コードは、virsh コマンドの出力を使用すると、LUN のパスを簡単に見つけることができます。
  • 仮想マシンの移行には、ターゲットマシンで同じ vHBA 名を持つストレージプールの定義と起動のみが必要です。これを行うには、仮想マシンの XML 設定で、vHBA LUN、libvirt ストレージプール、およびボリューム名を指定する必要があります。例は、「SCSI デバイスを使用する vHBA ベースのストレージプール」 を参照してください。
注記
vHBA を作成する前に、ホストの LUN でストレージアレイ (SAN) 側のゾーンを設定して、ゲスト間の分離を提供し、データの破損を防ぐことが推奨されます。
永続的な vHBA 設定を作成するには、最初に以下の形式を使用して、libvirt 'scsi' ストレージプール XML ファイルを作成します。同じ物理 HBA 上のストレージプールを使用する 1 つの vHBA を作成する場合は、システムの /dev/disk/by-{path|id|uuid|label} のような場所など、<path> 値に安定した場所を使用することが推奨されます。
同じ物理 HBA 上でストレージプールを使用する複数の vHBA を作成する場合は、<path> フィールドの値を /dev/ のみにする必要があります。それ以外の場合は、ストレージプールボリュームが 1 つの vHBA からしか確認できず、NPIV 構成で、ホストのデバイスを複数のゲストに公開することができません。
<path> および <target> の要素の詳細は、アップストリームの libvirt ドキュメント を参照してください。
前提条件
vHBA を作成し、SCSI デバイスを使用して vHBA ベースのストレージプールを作成できるようにしてある。

手順13.10 vHBA の作成

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

    ホストシステムの HBA を特定するには、virsh nodedev-list --cap vports コマンドを使用します。
    以下の例は、vHBA に対応する HBA が 2 つ搭載されているホストを示しています。
    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
    
  2. HBA の詳細を確認します。

    virsh nodedev-dumpxml HBA_device コマンドを実行して、HBA の詳細を表示します。
    # virsh nodedev-dumpxml scsi_host3
    コマンドからの出力には、<name> フィールド、<wwnn> フィールド、および <wwpn> フィールドの一覧が表示されます。これは、vHBA を作成するために使用されます。<max_vports> は、対応している vHBA の最大数を示します。以下は例になります。
    <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>
        <unique_id>0</unique_id>
        <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 です。
    次の例では、scsi_host3 を使用して親 vHBA を説明します。
    # cat vhba_host3.xml
    <device>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    次の例では、WWNN/WWPN のペアを使用して親 vHBA を説明します。
    # cat vhba_host3.xml
    <device>
      <name>vhba</name>
      <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    注記
    WWNN および WWPN の値は、手順13.10「vHBA の作成」 に表示される HBA の詳細にある値と一致する必要があります。
    <parent> フィールドは、この vHBA デバイスに関連付ける HBA デバイスを指定します。<device> タグの詳細は、ホスト用の新しい vHBA デバイスを作成するために、次の手順で使用されます。nodedev XML 形式の詳細は、libvirt アップストリームページ を参照してください。
  4. vHBA ホストデバイスに新しい vHBA を作成します。

    vhba_host3 に基づいて vHBA を作成するには、virsh nodedev-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>
        <unique_id>2</unique_id>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>
vHBA を確認したら、ストレージプールの定義 でストレージプールの作成を続行します。
パラメーター
以下の表は、vHBA ベースのストレージプールを作成する場合に必要な、XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションのパラメーターの一覧を示しています。

表13.8 vHBA ベースのストレージプールパラメーター

説明XMLpool-define-as
ストレージプールのタイプ <pool type='scsi'> scsi
ストレージプールの名前 <name>name</name> --adapter-name name
vHBA の識別子。parent 属性はオプションです。

<source>
  <adapter type='fc_host'
  [parent=parent_scsi_device]
  wwnn='WWNN'
  wwpn='WWPN' />
</source>

[--adapter-parent parent]
--adapter-wwnn wwnn
--adapter-wpnn wwpn

ターゲットを指定するパス。ストレージプールに使用されるパスになります。

<target>
  <path>target_path</path>
</target>

target path_to_pool
重要
<path> フィールドが /dev/ の場合、libvirt は、ボリュームデバイスパスで一意の短いデバイスパスを生成します。たとえば、/dev/sdc です。それ以外の場合は、物理ホストパスが使用されます。たとえば、/dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0 などです。一意の短いデバイスパスを使用すると、複数のストレージプールで、同じボリュームを複数のゲストに一覧表示できます。物理ホストのパスを複数のゲストで使用すると、デバイスタイプが重複していることを示す警告が発生することがあります。
注記
parent 属性は、<adapter> フィールドで、パスを変更して NPIV LUN を使用できる物理 HBA の親を識別するために使用できます。このフィールドの scsi_hostN は、vports 属性および max_vports 属性と組み合わせて、親 ID を完了します。parent 属性、parent_wwnn 属性、parent_wwpn 属性、または parent_fabric_wwn 属性では、ホストの再起動後に同じHBAが使用されるというさまざまな程度の保証を提供します。
  • parentを指定しないと、libvirt は、NPIV に対応する最初の scsi_hostN アダプターを使用します。
  • parent のみが指定されている場合、設定に SCSI ホストアダプターを追加すると、問題が発生する可能性があります。
  • parent_wwnn または parent_wwpn を指定した場合は、ホストの再起動後に同じ HBA が使用されます。
  • parent_fabric_wwn を使用する場合は、ホストの再起動後、使用されているscsi_hostNに関係なく、同じファブリックの HBA が選択されます。
virsh を使用してストレージプールを作成する場合は、ストレージプールが作成されたことの確認 に進みます。
以下は、vHBA ベースのストレージプールの XML ファイルの例です。最初の例は、HBA にある唯一のストレージプールの例です。2 つ目は、単一の vHBA を使用し、parent 属性を使用して、SCSI ホストデバイスを識別するいくつかのストレージプールの 1 つであるストレージプールの例になります。
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
以下は、vHBA ベースのストレージプールを作成するコマンドの例です。
# virsh pool-define-as vhbapool_host3 scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/by-path
Pool vhbapool_host3 defined
注記
virsh では、parent_wwnn 属性、parent_wwpn 属性、または parent_fabric_wwn 属性を定義する方法は提供されていません。
vHBA LUN を使用するように仮想マシンを設定する
vHBA 用にストレージプールを作成したら、vHBA LUN を仮想マシンの設定に追加する必要があります。
  1. 仮想マシンの XML に、仮想マシンにディスクボリュームを作成します。
  2. <source> パラメータで、storage poolstorage volume を指定します。
以下は例になります。
<disk type='volume' device='disk'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0'/>
  <target dev='hda' bus='ide'/>
</disk>
disk の代わりにlun デバイスーを指定するには、以下の例を参照してください。
<disk type='volume' device='lun' sgio='unfiltered'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0' mode='host'/>
  <target dev='sda' bus='scsi'/>
  <shareable />
</disk>
SCSI LUN ベースのストレージをゲストに追加する XML 設定例は、「ゲストへの SCSI LUN ベースのストレージの追加」 を参照してください。
ハードウェア障害が発生した場合に、LUN への再接続が成功するように、fast_io_fail_tmo オプションおよび dev_loss_tmo オプションを変更することが推奨されます。詳細は、Reconnecting to an exposed LUN after a hardware failure を参照してください。

13.2.4. ストレージプールの削除

virsh または Virtual Machine Manager を使用して、ストレージプールを削除できます。

13.2.4.1. ストレージプールを削除するための前提条件

削除するストレージプールを使用するその他のゲスト仮想マシンに悪影響を及ぼさないようにするには、ストレージプールを停止して、ストレージプールによって使用されているリソースを解放することをお勧めします。

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

  1. 定義したストレージプールの一覧を表示します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_pool    active     yes
    
  2. 削除するストレージプールを停止します。
    # virsh pool-destroy guest_images_disk
  3. (任意) ストレージプールの種類によっては、ストレージプールが含まれるディレクトリーを削除できる場合があります。
    # virsh pool-delete guest_images_disk
  4. ストレージプールの定義を削除します。
    # virsh pool-undefine guest_images_disk
  5. プールが定義されていないことを確認します。
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    
    

13.2.4.3. Virtual Machine Manager を使用したストレージプールの削除

  1. Connection Details ウィンドウ の Storage タブにあるストレージプール一覧で、削除するストレージプールを選択します。
  2. Storage ウィンドウの下部にある をクリックします。これによりストレージプールが停止し、使用中のリソースがすべて解放されます。
  3. をクリックします。
    注記
    アイコンは、ストレージプールが停止している場合にのみ有効になります。
    ストレージプールが削除されます。

13.3. ストレージボリュームの使用

このセクションでは、ストレージボリュームの使用方法を説明します。ここでは、概念情報と、virsh コマンドおよび Virtual Machine Manager を使用してストレージボリュームを作成、設定、および削除する方法を詳細に説明します。

13.3.1. ストレージボリュームの概念

ストレージプールは、ストレージボリュームに分類されます。ストレージボリュームは、libvirt が処理する物理パーティション、LVM 論理ボリューム、ファイルベースのディスクイメージ、その他のストレージタイプの抽象化です。ストレージボリュームは、基本となるハードウェアに関係なく、ゲスト仮想マシンにローカルストレージデバイスとして提示されます。
注記
以下のセクションでは、virsh がストレージボリュームの管理で使用するコマンドと引数をすべて含んでいるわけではありません。詳細は、「ストレージボリュームコマンド」 を参照してください。
ホストマシンでは、ストレージボリュームは、その名前と、そこから派生するストレージプールの識別子で参照されます。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
追加のパラメーターおよび引数は、「ボリューム情報の一覧表示」 を参照してください。

13.3.2. ストレージボリュームの作成

本セクションでは、virsh および Virtual Machine Manager を使用して、ストレージプールからストレージボリュームを作成する方法を説明します。ストレージボリュームを作成したら、ストレージデバイスをゲストに追加することができます。

13.3.2.1. virsh を使用したストレージボリュームの作成

次のいずれかを行います。
  • XML ファイルを使用してストレージボリュームを定義します。
    a.新規デバイスに必要なストレージボリューム情報を含む一時 XML ファイルを作成します。
    XML ファイルには、以下を含む特定のフィールドが含まれている必要があります。
    • 名前 - ストレージプールの名前。
    • 割り当て - ストレージボリュームのストレージ割り当ての合計数。
    • 容量 - ストレージボリュームの論理容量。ボリュームがスパースの場合、この値は allocation の値とは異なります。
    • ターゲット - ホストシステムのストレージボリュームのパス、さらに任意でそのパーミッションとラベル。
    以下は、ストレージボリューム定義の XML ファイルの例です。この例では、ファイルは ~/guest_volume.xml に保存されます。
      <volume>
        <name>volume1</name>
        <allocation>0</allocation>
        <capacity>20G</capacity>
        <target>
          <path>/var/lib/virt/images/sparse.img</path>
        </target>
      </volume>
    
    b.virsh vol-create コマンドを使用して、XML ファイルに基づいてストレージボリュームを作成します。
    # virsh vol-create guest_images_dir ~/guest_volume.xml
      Vol volume1 created
    
    c.手順 a で作成した XML ファイルを削除します。
  • virsh vol-create-as を実行して、ストレージボリュームを作成します。
    # virsh vol-create-as guest_images_dir volume1 20GB --allocation 0
  • virsh vol-clone コマンドを使用して、既存のストレージボリュームのクローンを作成します。virsh vol-clone コマンドは、クローンを作成するストレージボリュームを含むストレージプールと、新しく作成したストレージボリュームの名前を指定する必要があります。
    # virsh vol-clone --pool guest_images_dir volume1 clone1

13.3.2.2. Virtual Machine Manager を使用したストレージボリュームの作成

手順13.11 Virtual Machine Manager を使用したストレージボリュームの作成

  1. ストレージ設定を開く

    1. Virtual Machine ManagerEdit メニューを開き、Connection Details を選択します。
    2. Connection Details ウィンドウの Storage タブをクリックします。

      図13.11 ストレージタブ

      ストレージタブ
      Connection Details ウィンドウの左側のペインには、ストレージプールの一覧が表示されます。
  2. ストレージボリュームを作成するストレージプールを選択します。

    ストレージプールの一覧で、ストレージボリュームを作成するストレージプールをクリックします。
    選択したストレージプールに設定したストレージボリュームは、画面下部の Volumes ペインに表示されます。
  3. 新しいストレージボリュームの追加

    Volumes 一覧の上にある ボタンをクリックします。Add a Storage Volume のダイアログが表示されます。

    図13.12 ストレージボリュームの作成

    ストレージボリュームの作成
  4. ストレージボリュームの設定

    以下のパラメーターを使用して、ストレージボリュームを設定します。
    • Name フィールドにストレージプールの名前を入力します。
    • Format 一覧からストレージボリュームの形式を選択します。
    • Max Capacity フィールドに、ストレージボリュームの最大サイズを入力します。
  5. 作成を終了します。

    Finish をクリックします。Add a Storage Volume のダイアログが閉じ、ストレージボリュームが Volumes 一覧に表示されます。

13.3.3. ストレージボリュームの表示

ストレージプールから複数のストレージボリュームを作成できます。virsh vol-list を使用して、ストレージプールのストレージボリュームを一覧表示することもできます。以下の例では、guest_images_disk に 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              /home/VirtualMachines/guest_images_dir/volume1
volume2              /home/VirtualMachines/guest_images_dir/volume2
volume3              /home/VirtualMachines/guest_images_dir/volume3

13.3.4. データの管理

このセクションでは、ストレージボリュームのデータの管理について説明します。
注記
ストレージボリュームの種類によっては、データ管理コマンドに対応していないものもあります。詳細は、以下のセクションを参照してください。

13.3.4.1. ストレージボリュームのワイプ

ストレージボリュームのデータにアクセスできないようにするには、virsh vol-wipe コマンドを使用して、ストレージボリュームをワイプできます。
virsh vol-wipe コマンドを実行して、ストレージボリュームをワイプします。
# virsh vol-wipe new-vol vdisk
デフォルトでは、データはゼロで上書きされます。ただし、ストレージボリュームをワイプする方法は複数指定できます。virsh vol-wipe コマンドのすべてのオプションの詳細は、「ストレージボリュームのコンテンツの削除」 を参照してください。

13.3.4.2. ストレージボリュームへのデータのアップロード

virsh vol-upload コマンドを使用すると、指定したローカルファイルからストレージボリュームにデータをアップロードできます。
# virsh vol-upload --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
以下は、主なvirsh vol-uploadオプションです。
  • --pool pool-or-uuid - ボリュームが存在するストレージプールの名前または UUID です。
  • vol-name-or-key-or-path - アップロードするボリュームの名前または鍵またはパスです。
  • --offset bytes データの書き込みを開始するストレージボリュームの位置。
  • --length length - アップロードするデータ量の上限です。
    注記
    local-file が指定した--lengthよりも大きい場合は、エラーが発生します。

例13.1 ストレージボリュームへのデータのアップロード

# virsh vol-upload sde1 /tmp/data500m.empty disk-pool
この例のsde1 は、disk-pool ストレージプールのボリュームです。/tmp/data500m.empty のデータが sde1 にコピーされます。

13.3.4.3. ストレージボリュームへのデータのダウンロード

virsh vol-download を使用すると、ストレージボリュームから、指定したローカルファイルにデータをダウンロードできます。
# vol-download --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
以下は、主なvirsh vol-downloadオプションです。
  • --pool pool-or-uuid - ボリュームが存在するストレージプールの名前または UUID です。
  • vol-name-or-key-or-path - ダウンロードするボリュームの名前、鍵、またはパスを指定します。
  • --offset - データの読み込みを開始するストレージボリュームの位置です。
  • --length length - ダウンロードするデータ量の上限です。

例13.2 ストレージボリュームからのデータのダウンロード

# virsh vol-download sde1 /tmp/data-sde1.tmp disk-pool
この例のsde1 は、disk-pool ストレージプールのボリュームです。sde1 のデータは、/tmp/data-sde1.tmp にダウンロードされます。

13.3.4.4. ストレージボリュームのサイズ変更

vol-resize コマンドを使用すると、指定したストレージボリュームの容量のサイズを変更できます。
# virsh vol-resize --pool pool-or-uuid vol-name-or-path pool-or-uuid capacity --allocate --delta --shrink
capacityはバイト単位で表されます。このコマンドには、ボリュームが存在するストレージプールの名前または UUID である --pool pool-or-uuid が必要です。また、このコマンドでサイズを変更するには、ボリュームのvol-name-or-key-or-path、名前、鍵、またはパスが必要です。
--allocate が指定されていない限り、新しい容量はスパースである可能性があります。通常、容量は新しいサイズになりますが、--delta が存在する場合は、既存のサイズに追加されます。--shrink が存在しない限り、ボリュームを縮小しようとすると失敗します。
--shrink が指定され、負の符号が必要ない場合を除き、容量 を負にすることはできません。容量 は、拡張整数で、接尾辞がない場合はデフォルトでバイトになります。さらに、このコマンドは、アクティブなゲストが使用していないストレージボリュームに対してのみ安全であることに注意してください。ライブサイズの変更については、「ゲスト仮想マシンのブロックデバイスのサイズの変更」 を参照してください。

例13.3 ストレージボリュームのサイズを変更

たとえば、50M のストレージボリュームを作成した場合は、次のコマンドを使用して 100M にサイズを変更できます。
# virsh vol-resize --pool disk-pool sde1 100M

13.3.5. ストレージボリュームの削除

virsh または Virtual Machine Manager を使用して、ストレージボリュームを削除できます。
注記
削除するストレージボリュームを使用するゲスト仮想マシンに悪影響を及ぼさないようにするには、これを使用するリソースを解放することをお勧めします。

13.3.5.1. virsh を使用したストレージボリュームの削除

virsh vol-delete コマンドを使用して、ストレージボリュームを削除します。このコマンドは、ストレージボリュームの名前またはパスと、ストレージボリュームの抽象化の元となるストレージプールを指定する必要があります。
以下の例では、guest_images_dir ストレージプールから volume_name ストレージボリュームを削除します。
# virsh vol-delete volume_name --pool guest_images_dir
  vol volume_name deleted

13.3.5.2. Virtual Machine Manager を使用したストレージボリュームの削除

手順13.12 Virtual Machine Manager を使用したストレージボリュームの削除

  1. ストレージ設定を開く

    1. Virtual Machine ManagerEdit メニューを開き、Connection Details を選択します。
    2. Connection Details ウィンドウの Storage タブをクリックします。

      図13.13 ストレージタブ

      ストレージタブ
      Connection Details ウィンドウの左側のペインには、ストレージプールの一覧が表示されます。
  2. 削除するストレージボリュームを選択します。

    1. ストレージプールの一覧で、ストレージボリュームが抽象化されたストレージプールをクリックします。
      選択したストレージプールに設定されているストレージボリュームの一覧が、画面下部の Volumes ペインに表示されます。
    2. 削除するストレージボリュームを選択します。
  3. ストレージボリュームを削除します。

    1. ボタン (Volumes 一覧の上) をクリックします。確認ダイアログが表示されます。
    2. Yes をクリックします。選択したストレージボリュームが削除されます。

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

virsh または Virtual Machine Manager を使用して、ストレージデバイスをゲスト仮想マシンに追加できます。

13.3.6.1. virsh を使用したゲストへのストレージデバイスの追加

ストレージデバイスをゲスト仮想マシンに追加するには、attach-disk コマンドを使用します。追加するディスクに関する情報を含む引数は、XML ファイルまたはコマンドラインで指定できます。
以下は、ストレージの定義があるサンプルの XML ファイルです。
<disk type='file' device='disk>'>
  <driver name='qemu' type='raw' cache='none'/>
  <source file='/var/lib/libvirt/images/FileName.img'/>
  <target dev='vdb' bus='virtio'/>
</disk>
次のコマンドは、NewStorage.xml と呼ばれる XML ファイルを使用して、ディスクを Guest1 に割り当てます。
# virsh attach-disk --config Guest1 ~/NewStorage.xml
次のコマンドは、xml ファイルを使用せずに、ディスクを Guest1 に割り当てます。
# virsh attach-disk --config Guest1 --source /var/lib/libvirt/images/FileName.img --target vdb

13.3.6.2. Virtual Machine Manager を使用したゲストへのストレージデバイスの追加

ストレージボリュームをゲスト仮想マシンに追加するか、デフォルトのストレージデバイスを作成してゲスト仮想マシンに追加できます。
13.3.6.2.1. ゲストへのストレージボリュームの追加
ゲスト仮想マシンにストレージボリュームを追加するには、次のコマンドを実行します。
  1. 仮想マシンのハードウェアの詳細ウィンドウで Virtual Machine Manager を開きます。

    root で virt-manager コマンドを実行するか、ApplicationsSystem ToolsVirtual Machine Manager を開き、virt-manager を開きます。

    図13.14 Virtual Machine Manager ウィンドウ

    Virtual Machine Manager ウィンドウ
    ストレージボリュームを追加するゲスト仮想マシンを選択します。
    Open をクリックします。仮想マシンのウィンドウが開きます。
    をクリックします。ハードウェアの詳細ウィンドウが表示されます。

    図13.15 Hardware Details ウィンドウ

    Hardware Details ウィンドウ
  2. Add New Virtual Hardware ウィンドウが開きます。

    Add Hardware をクリックします。Add New Virtual Hardware ウィンドウが表示されます。
    ハードウェアタイプペインで Storage が選択されていることを確認します。

    図13.16 Add New Virtual Hardware ウィンドウ

    Add New Virtual Hardware ウィンドウ
  3. ストレージボリュームの一覧を表示します。

    Select or create custom storage オプションのボタンを選択します。
    Manage をクリックします。Choose Storage Volume ダイアログが表示されます。

    図13.17 Select Storage Volume ウィンドウ

    Select Storage Volume ウィンドウ
  4. ストレージボリュームを選択します。

    Select Storage Volume ウィンドウの左側にあるリストからストレージプールを選択します。選択したストレージプールのストレージボリュームの一覧が、Volumes 一覧に表示されます。
    注記
    ストレージプールは、Select Storage Volume ウィンドウから作成できます。詳細は、「Virtual Machine Manager を使用したストレージプールの作成」 を参照してください。
    Volumes 一覧からストレージボリュームを選択します。
    注記
    Select Storage Volume ウィンドウから、ストレージボリュームを作成できます。詳細は、「Virtual Machine Manager を使用したストレージボリュームの作成」 を参照してください。
    Choose Volume をクリックします。Select Storage Volume ウィンドウが閉じます。
  5. ストレージボリュームの設定

    Device type 一覧からデバイスタイプを選択します。使用可能なタイプは以下のとおりです。ディスクデバイス、フロッピーデバイス、および LUN パススルー。
    Bus type 一覧からバスの種類を選択します。利用可能なバスの種類は、選択したデバイスタイプによって異なります。
    Cache mode一覧からキャッシュモードを選択します。利用可能なキャッシュモードは以下のとおりです。Hypervisor default、none、writethrough、writeback、directsync、unsafe
    Finish をクリックします。Add New Virtual Hardware ウィンドウが閉じます。
13.3.6.2.2. ゲストへのデフォルトストレージの追加
デフォルトのストレージプールは、/var/lib/libvirt/images/ ディレクトリーのファイルベースのイメージです。
ゲスト仮想マシンにデフォルトストレージを追加するには、次のコマンドを実行します。
  1. 仮想マシンのハードウェアの詳細ウィンドウで Virtual Machine Manager を開きます。

    root で virt-manager コマンドを実行するか、ApplicationsSystem ToolsVirtual Machine Manager を開き、virt-manager を開きます。

    図13.18 Virtual Machine Manager ウィンドウ

    Virtual Machine Manager ウィンドウ
    ストレージボリュームを追加するゲスト仮想マシンを選択します。
    Open をクリックします。仮想マシンのウィンドウが開きます。
    をクリックします。ハードウェアの詳細ウィンドウが表示されます。

    図13.19 Hardware Details ウィンドウ

    Hardware Details ウィンドウ
  2. Add New Virtual Hardware ウィンドウが開きます。

    Add Hardware をクリックします。Add New Virtual Hardware ウィンドウが表示されます。
    ハードウェアタイプペインで Storage が選択されていることを確認します。

    図13.20 Add New Virtual Hardware ウィンドウ

    Add New Virtual Hardware ウィンドウ
  3. ゲスト用のディスクの作成

    Create a disk image for the virtual machine が選択できることを確認します。
    Create a disk image for the virtual machine オプションボタンの下にあるテキストボックスに、作成するディスクのサイズを入力します。
    Finish をクリックします。Add New Virtual Hardware ウィンドウが閉じます。

13.3.6.3. ゲストへの SCSI LUN ベースのストレージの追加

ホスト SCSI LUN を完全にゲストに公開する方法は複数あります。SCSI LUN をゲストに公開すると、ゲストの LUN に対して SCSI コマンドを直接実行できるようになります。これは、ゲスト間で LUN を共有したり、ホスト間でファイバーチャネルストレージを共有したりする手段として役立ちます。
SCSI LUN ベースのストレージの詳細は、vHBA-based storage pools using SCSI devices を参照してください。
重要
オプションの sgio 属性は、非特権 SCSI ジェネリック I/O (SG_IO) コマンドでdevice='lun'ディスクをフィルターにかけるかどうかを制御します。sgio 属性は 'filtered' または 'unfiltered' に指定できますが、SG_IO ioctl コマンドが永続予約でゲストを通過できるようにするには、'unfiltered' に設定する必要があります。
sgio='unfiltered' の設定に加えて、<shareable> 要素を設定してゲスト間で LUN を共有する必要があります。指定されていない場合、sgio 属性のデフォルトは 'filtered' になります。
<disk> XML 属性の device='lun' は、次のゲストディスク設定で有効です。
  • <source dev='/dev/disk/by-{path|id|uuid|label}'/>type='block'
    <disk type='block' device='lun' sgio='unfiltered'>
      <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'/>
      <shareable/>
    </disk>
    注記
    <source>デバイス名のコロンの前にあるバックスラッシュは必須です。
  • <source protocol='iscsi'... />type='network'
    <disk type='network' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-net-pool/1'>
        <host name='example.com' port='3260'/>
        <auth username='myuser'>
          <secret type='iscsi' usage='libvirtiscsi'/>
        </auth>
      </source>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  • type='volume' (iSCSI または NPIV/vHBA のソースプールを SCSI ソースプールとして使用する場合)。
    以下の XML 例は、iSCSI ソースプール (名前は iscsi-net-pool) を SCSI ソースプールとして使用するゲストを示しています。
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-net-pool' volume='unit:0:0:1' mode='host'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    注記
    <source> タグ内の mode= オプションはオプションになりますが、使用する場合は 'direct' ではなく 'host' に設定する必要があります。'host' に設定すると、libvirt はローカルホストデバイスへのパスを見つけます。'direct' に設定すると、libvirt はソースプールのソースホストデータを使用してデバイスへのパスを生成します。
    上記の例の iSCSI プール (iscsi-net-pool) の設定は、以下のようになります。
    # virsh pool-dumpxml iscsi-net-pool
    <pool type='iscsi'>
      <name>iscsi-net-pool</name>
      <capacity unit='bytes'>11274289152</capacity>
      <allocation unit='bytes'>11274289152</allocation>
      <available unit='bytes'>0</available>
      <source>
        <host name='192.168.122.1' port='3260'/>
        <device path='iqn.2013-12.com.example:iscsi-chap-netpool'/>
        <auth type='chap' username='redhat'>
          <secret usage='libvirtiscsi'/>
        </auth>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0755</mode>
        </permissions>
      </target>
    </pool>
    iSCSI ソースプールで利用可能な LUN の詳細を確認するには、次のコマンドを実行します。
    # virsh vol-list iscsi-net-pool
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:1           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-1
    unit:0:0:2           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-2
  • type='volume' (NPIV/vHBA ソースプールを SCSI ソースプールとして使用する場合)。
    以下の XML の例は、NPIV/vHBA ソースプール (名前は vhbapool_host3) を SCSI ソースプールとして使用するゲストを示しています。
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    上記の例の NPIV/vHBA プール (vhbapool_host3) の設定は、以下のようになります。
    # virsh pool-dumpxml vhbapool_host3
    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <capacity unit='bytes'>0</capacity>
      <allocation unit='bytes'>0</allocation>
      <available unit='bytes'>0</available>
      <source>
        <adapter type='fc_host' parent='scsi_host3' managed='yes' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee045d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0700</mode>
          <owner>0</owner>
          <group>0</group>
        </permissions>
      </target>
    </pool>
    vHBA で利用可能な LUN の詳細を確認するには、次のコマンドを入力します。
    # virsh vol-list vhbapool_host3
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
    unit:0:1:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
    SCSI デバイスで NPIV vHBA を使用する方法は、「SCSI デバイスを使用する vHBA ベースのストレージプール」 を参照してください。
以下の手順は、SCSI LUN ベースのストレージデバイスをゲストに追加する例を示しています。上記のいずれかの<disk device='lun'> ゲストディスク設定は、この方法で割り当てることができます。使用環境に応じて、設定を置き換えます。

手順13.13 SCSI LUN ベースのストレージのゲストへの割り当て

  1. <disk> 要素を新しいファイルに書き込んでデバイスファイルを作成し、このファイルに XML 拡張子 (この例では sda.xml) を付けて保存します。
    # cat sda.xml
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  2. sda.xml で作成したデバイスをゲスト仮想マシン (Guest1 など) に関連付けます。
    # virsh attach-device --config Guest1 ~/sda.xml
    注記
    --config を指定して virsh attach-device コマンドを実行すると、ゲストを再起動してデバイスをゲストに永続的に追加する必要があります。また、--config の代わりに --persistent オプションを使用することもできます。これを使用すると、デバイスをゲストにホットプラグできます。
または、virt-manager を使用して、 SCSI LUN ベースのストレージをゲストに接続または設定できます。virt-manager を使用してこれを設定する場合は、Add Hardware ボタンをクリックし、必要なパラメーターを持つ仮想ディスクを追加するか、このウィンドウで既存の SCSI LUN デバイスの設定を変更します。Red Hat Enterprise Linux 7.2 以降では、virt-manager で SGIO 値を設定することもできます。

図13.21 virt-manager を使用した SCSI LUN ストレージの設定

virt-manager を使用した SCSI LUN ストレージの設定

ハードウェア障害後に公開されたLUNに再接続する

公開されているファイバーチャネル (FC) LUN への接続が、ハードウェア (ホストバスアダプターなど) の障害により失われた場合は、ハードウェアの障害が修正されても、ゲストで公開されている LUN が、引き続き障害として表示されることがあります。これを防ぐには、dev_loss_tmo オプションおよび fast_io_fail_tmo カーネルオプションを変更します。
  • dev_loss_tmo は、SCSI デバイスに障害が発生してから、SCSI レイヤーが障害としてマークされるまでの待ち時間を制御します。タイムアウトを防ぐため、最大値 (2147483647) に設定することが推奨されます。
  • fast_io_fail_tmoは、SCSIデバイスに障害が発生してからI / OにフェイルバックするまでにSCSI層が待機する時間を制御します。dev_loss_tmo がカーネルに無視されないようにするには、このオプションの値を dev_loss_tmo より小さい値に設定します。
dev_loss_tmo および fast_io_fail を変更するには、以下のいずれかの操作を行います。
  • /etc/multipath.conf ファイルを編集し、defaults セクションに値を設定します。
    defaults {
    ...
    fast_io_fail_tmo     20
    dev_loss_tmo    infinity
    }
    
  • dev_loss_tmo および fast_io_fail は、以下のように、FC ホストまたはリモートポートのレベルで設定します。
    # echo 20 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/fast_io_fail_tmo
    # echo 2147483647 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
dev_loss_tmo および fast_io_fail の新しい値が有効であることを確認するには、以下のコマンドを使用します。
# find /sys -name dev_loss_tmo -print -exec cat {} \;
パラメーターが正しく設定されていれば、出力は以下のようになります (pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0 の代わりに、適切なデバイスが使用されます)。
# find /sys -name dev_loss_tmo -print -exec cat {} \;
...
/sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
2147483647
...

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

virtio ディスクとは異なり、SCSI デバイスではゲスト仮想マシンにコントローラーが存在する必要があります。本セクションでは、仮想 SCSI コントローラー ("Host Bus Adapter" または HBA とも呼ばれます) を作成し、SCSI ストレージをゲスト仮想マシンに追加するために必要な手順を詳細に説明します。

手順13.14 仮想 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 オプションはディスクと同じように動作します。詳細は、「ゲストへのストレージデバイスの追加」 を参照してください。
  3. 新しい SCSI ディスクまたは CD-ROM を追加します。新規ディスクは、「ゲストへのストレージデバイスの追加」 の方法を使用して追加できます。SCSI ディスクを作成する場合は、sd で始まるターゲットデバイス名を指定します。
    注記
    各コントローラーでサポートされる制限は 1024 virtio-scsi ディスクですが、ホストで利用可能なその他のリソース (ファイル記述子など) が使い切られ、ディスクが少なくなる可能性があります。
    詳細は、以下の Red Hat Enterprise Linux 6 ホワイトペーパーを参照してください。Red Hat Enterprise Linux カーネル仮想マシンの次世代ストレージインターフェース: virtio-scsi
    virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
    ゲスト仮想マシンのドライバーのバージョンによっては、実行中のゲスト仮想マシンで新しいディスクがすぐに検出されない場合があります。Red Hat Enterprise Linux Storage Administration Guide の手順に従います。

13.3.7. ゲストからのストレージデバイスの削除

virsh または Virtual Machine Manager を使用して、仮想ゲストマシンからストレージデバイスを削除できます。

13.3.7.1. virsh を使用した仮想マシンからのストレージの削除

以下の例では、Guest1 仮想マシンから vdb ストレージボリュームを削除します。
# virsh detach-disk Guest1 vdb

13.3.7.2. Virtual Machine Manager を使用した仮想マシンからのストレージの削除

手順13.15 Virtual Machine Manager を使用した仮想マシンからのストレージの削除

Virtual Machine Manager を使用してゲスト仮想マシンからストレージを削除するには、次のコマンドを実行します。
  1. 仮想マシンのハードウェアの詳細ウィンドウで Virtual Machine Manager を開きます。

    root で virt-manager コマンドを実行するか、ApplicationsSystem ToolsVirtual Machine Manager を開き、virt-manager を開きます。
    ストレージデバイスを削除するゲスト仮想マシンを選択します。
    Open をクリックします。仮想マシンのウィンドウが開きます。
    をクリックします。ハードウェアの詳細ウィンドウが表示されます。
  2. ゲスト仮想マシンからストレージを削除します。

    ハードウェアの詳細ペインの左側にあるハードウェアのリストから、ストレージデバイスを選択します。
    削除 をクリックします。確認ダイアログが表示されます。
    Yes をクリックします。ストレージがゲスト仮想マシンから削除されます。

第14章 qemu-img の使用

qemu-img コマンドラインツールは、KVM が使用するさまざまなファイルシステムのフォーマット、修正、および検証に使用されます。qemu-img のオプションおよび使用方法は、以下のセクションで強調表示されています。
警告
qemu-img を使用して、実行中の仮想マシンなど、使用中のイメージを修正しないでください。イメージが破壊される可能性があります。また、別のプロセスにより変更されているイメージをクエリーすると、状態が不整合になる可能性があることに注意してください。

14.1. ディスクイメージの確認

ファイル名が imgname のディスクイメージで整合性チェックを実行する場合。
# qemu-img check [-f format] imgname
注記
整合性チェックには、選択した形式のグループのみが対応します。対応する形式には、qcow2vdivhdxvmdk、および qed が含まれます。

14.2. イメージへの変更の確定

指定したイメージファイル (imgname) に記録された変更を、qemu-img commit コマンドでファイルのベースイメージにコミットします。必要に応じて、ファイル形式タイプ (fmt) を指定します。
 # qemu-img commit [-f fmt] [-t cache] imgname

14.3. イメージの比較

指定した 2 つのイメージファイル (imgname1 および imgname2) の内容を、qemu-img compare コマンドで比較します。必要に応じて、ファイルの形式タイプ (fmt) を指定します。イメージの形式と設定は異なります。
一方のイメージの末尾以後の領域に、大きい方のイメージに割り当てられていないセクターまたはゼロになっているセクターのみが含まれる場合、デフォルトでは、異なるサイズのイメージは同一と見なされます。また、一方のイメージにセクターが割り当てられておらず、他方のセクターに含まれるバイト数がゼロの場合は、等しいと評価されます。-s オプションを指定しても、イメージのサイズが異なる場合、またはセクターが 1 つのイメージに割り当てられており、2 番目のイメージには割り当てられていない場合に、イメージは同一とは見なされません。
 # qemu-img compare [-f fmt] [-F fmt] [-p] [-s] [-q] imgname1 imgname2
qemu-img compare コマンドは、以下の終了コードのいずれかで終了します。
  • 0 - イメージは同一です。
  • 1 - イメージが異なります。
  • 2 - イメージの 1 つを開いている際にエラーが発生しました。
  • 3 - セクター割り当ての確認中にエラーが発生しました。
  • 4 - データの読み取り中にエラーが発生しました。

14.4. イメージのマッピング

qemu-img map コマンドを使用すると、指定したイメージファイル (imgname) のメタデータと、そのバッキングファイルチェーンをダンプできます。ダンプは、(imgname) 内のすべてのセクターの割り当て状態を示し、最上位のファイルをバッキングファイルチェーンで割り当てています。必要に応じて、ファイル形式タイプ (fmt) を指定します。
 # qemu-img map [-f fmt] [--output=fmt] imgname
出力形式には、human 形式と json 形式の 2 つがあります。

14.4.1. human 形式

デフォルト形式 (human) は、ゼロ以外で割り当てられたファイル部分のみをダンプします。この出力により、データの読み取り元となるファイルと、ファイル内のオフセットが識別されます。各行には、4 つのフィールドが含まれます。以下は、出力の例になります。
Offset          Length          Mapped to       File
0               0x20000         0x50000         /tmp/overlay.qcow2
0x100000        0x10000         0x95380000      /tmp/backing.qcow2
最初の行は、イメージのオフセット 0 から始まる 0x20000 (131072) バイトが、オフセット 0x50000 (327680) から始まる tmp/overlay.qcow2 (raw 形式で開かれた) で利用可能であることを示しています。圧縮、暗号化、または raw 形式で利用できないデータは、human 形式が指定されているとエラーを発生させます。
注記
ファイル名には改行文字を使用できます。そのため、スクリプトでhuman 形式の出力を解析しても安全ではありません。

14.4.2. json 形式

json を指定すると、JSON 形式の辞書の配列を返します。human オプションに記載されている情報のほかに、以下の情報が含まれます。
  • data - セクターにデータが含まれるかどうかを示すブール値フィールドです。
  • zero - データがゼロとして読み取られることが知られているかどうかを示すブール値フィールドです。
  • depth - filename のバッキングファイルの深さです。
注記
json オプションが指定されている場合、offset フィールドはオプションになります。
qemu-img map コマンドとその他のオプションの詳細は、関連する man ページを参照してください。

14.5. イメージの修正

イメージファイルのイメージ形式固有のオプションを修正します。必要に応じて、ファイル形式タイプ (fmt) を指定します。
# qemu-img amend [-p] [-f fmt] [-t cache] -o options filename
注記
この操作は、qcow2 ファイル形式でのみ対応しています。

14.6. 既存のイメージを別の形式に変換

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

14.7. 新しいイメージまたはデバイスの作成とフォーマット

サイズが size で形式が format の新しいディスクイメージfilenameを作成します。
# qemu-img create [-f format] [-o options] filename [size]
ベースイメージが -o backing_file=filename で指定されている場合は、イメージ自体とベースイメージの違いのみが記録されます。バッキングファイルは、commit コマンドを使用しない限り変更されません。この場合、サイズの指定は必要ありません。

14.8. イメージ情報の表示

info パラメーターは、ディスクイメージのfilenameに関する情報を表示します。info オプションの形式は、以下のとおりです。
# qemu-img info [-f format] filename
このコマンドは、多くの場合、表示されているサイズとは異なるディスクに予約されているサイズを検出するために使用されます。スナップショットがディスクイメージに保存されている場合は、そのスナップショットも表示されます。このコマンドは、たとえば、ブロックデバイスの qcow2 イメージが使用している領域を表示します。これは、qemu-img を実行して行います。使用中のイメージが、qemu-img check コマンドで qemu-img info コマンドの出力と一致するイメージであることを確認できます。
# 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

14.9. イメージのバックアップファイルの再生

qemu-img rebase は、イメージのバッキングファイルを変更します。
# qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] 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 の形式のみが変更されます。新しいバッキングファイルが正しく指定されていることを確認してください。指定されていない場合、イメージのゲストに表示されるコンテンツが破損します。
このモードは、バッキングファイルの名前変更や移動に役立ちます。アクセス可能な古いバッキングファイルがなくても使用できます。たとえば、バッキングファイルがすでに移動または名前変更されているイメージを修正するために使用できます。

14.10. ディスクイメージのサイズ変更

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

14.11. スナップショットの一覧表示、作成、適用、および削除

qemu-img snapshot コマンドとは異なるパラメーターを使用して、指定したイメージ (filename) の既存のスナップショット (snapshot) の一覧表示、適用、作成、または削除を行うことができます。
# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
指定できる引数は以下のとおりです。
  • -l は、指定したディスクイメージに関連付けられているすべてのスナップショットを一覧表示します。
  • apply オプション -a は、ディスクイメージ (filename) を、以前保存したスナップショットの状態に戻します。
  • -c は、イメージ (filename) のスナップショット (snapshot) を作成します。
  • -d は、指定したスナップショットを削除します。

14.12. 対応する qemu-img 形式

qemu-img コマンドのいずれかで形式が指定されている場合、次の形式タイプを使用できます。
  • raw - raw ディスクイメージ形式 (デフォルト)これは、ファイルベースで最も高速な形式になります。ファイルシステムがホール (ext2 や ext3 など ) に対応している場合は、書き込まれたセクターのみが領域を確保します。qemu-img info を使用して、イメージが使用する実際のサイズを取得するか、Unix/Linux の ls -ls を取得します。raw イメージは最適なパフォーマンスを提供しますが、raw イメージでは非常に基本的な機能しか利用できません。たとえば、スナップショットは利用できません。
  • qcow2 - QEMU イメージ形式。最も汎用性が高く、機能セットが最適な形式です。これを使用して、オプションの AES 暗号化、zlib ベースの圧縮、複数の仮想マシンスナップショットへの対応、および小規模イメージを取得します。これは、ホールに対応していないファイルシステムで役に立ちます 。この拡張機能セットはパフォーマンスに影響を与えることに注意してください。
    ゲスト仮想マシンまたはホスト物理マシンでの実行には上記の形式のみを使用できますが、qemu-img は、raw、または qcow2 形式に変換するために、以下の形式も認識してサポートします。イメージの形式は、通常、自動的に検出されます。この形式を raw または qcow2 に変換することに加えて、raw または qcow2 から元の形式に戻すことができます。Red Hat Enterprise Linux 7 に同梱される qcow2 バージョンは 1.1 であることに注意してください。以前のバージョンの Red Hat Enterprise Linux に同梱されている形式は 0.10 です。イメージファイルは、以前のバージョンの qcow2 に戻すことができます。使用しているバージョンを確認するには、qemu-img info qcow2 [imagefilename.img] コマンドを実行します。qcow バージョンを変更するには、「target 要素の設定」 を参照してください。
  • bochs - Bochs ディスクイメージ形式。
  • cloop - Linux Compressed Loop イメージ。Knoppix CD-ROM などにある直接圧縮 CD-ROM イメージを再利用する場合にのみ役立ちます。
  • cow - User Mode Linux Copy On Write イメージ形式。cow 形式は、以前のバージョンとの互換性のためにのみ同梱されています。
  • dmg - Mac ディスクイメージ形式。
  • nbd - ネットワークブロックデバイス。
  • parallels - パラレル仮想化ディスクイメージ形式。
  • qcow - 古い QEMU イメージ形式。古いバージョンとの互換性にのみ含まれます。
  • qed - 古い QEMU イメージ形式。古いバージョンとの互換性にのみ含まれます。
  • vdi - Oracle VM VirtualBox ハードディスクイメージ形式。
  • vhdx - Microsoft Hyper-V virtual hard disk-X ディスクイメージ形式。
  • vmdk - VMware 3 および 4 互換のイメージ形式。
  • vfat - Virtual VFAT ディスクイメージ形式。

第15章 KVM の移行

本章では、KVM ハイパーバイザーを実行しているホストの物理マシンから、別のホストにゲスト仮想マシンを移行する方法を説明します。仮想マシンはハードウェアで直接実行するのではなく、仮想化環境で実行するため、ゲストの移行が可能になります。

15.1. 移行の定義と利点

移行は、ゲスト仮想マシンのメモリーと仮想デバイスの状態を移行先ホストの物理マシンに送信することで機能します。ネットワーク上の共有ストレージを使用して、移行するゲストのイメージを保存することが推奨されます。仮想マシンを移行する場合は、共有ストレージに libvirt が管理する ストレージプール を使用することも推奨されます。
移行は、ライブ (実行中) ゲストおよび 非ライブ (シャットダウン) ゲストの両方で実行できます。
live migrationでは、ゲスト仮想マシンが移行元ホストマシンで実行し続け、ゲストのメモリーページが移行先ホストマシンに転送されます。移行中、KVMは、すでに転送されたページの変更についてソースを監視し、すべての初期ページが転送されたときにこれらの変更の転送を開始します。KVM は、移行中の転送速度も推定するため、転送するデータの残りの量が一定の設定可能な期間 (デフォルトでは 10ミリ秒) に達すると、KVM が元のゲスト仮想マシンを一時停止し、残りのデータを転送して、移行先ホストの物理マシンで同じゲスト仮想マシンを再開します。
一方、non-live migration (オフライン移行) はゲスト仮想マシンを一時停止し、ゲストのメモリーを移行先ホストマシンにコピーします。その後、移行先ホストマシンでゲストが再開し、移行元ホストマシンで使用していたゲストのメモリーが解放されます。このような移行を完了するためにかかる時間は、ネットワークの帯域幅と遅延にのみ依存します。ネットワークが頻繁に使用されているか、帯域幅が狭い場合、移行にははるかに長い時間がかかります。元のゲスト仮想マシンが、KVM が宛先ホスト物理マシンに転送できる速度よりも速くページを変更する場合は、ライブマイグレーションが完了しないため、オフラインマイグレーションを使用する必要があります。
移行は、以下の場合に役立ちます。
Load balancing
ゲスト仮想マシンは、ホストマシンが過負荷になった場合、または別のホストマシンが十分に活用されていない場合に、使用率の低いホスト物理マシンに移動できます。
ハードウェアの非依存性
ホストの物理マシンでハードウェアデバイスのアップグレード、追加、または削除が必要になった場合は、ゲスト仮想マシンを別のホストの物理マシンに安全に再配置できます。つまり、ゲスト仮想マシンでは、ハードウェアの改善のためのダウンタイムが発生しません。
エネルギー節約
仮想マシンは他のホスト物理マシンに再配布できるため、アンロードしたホストシステムの電源を電力使用量の少ない時間帯に切ることで、節電やコスト削減が可能になります。
地理的な移行
仮想マシンは、待ち時間を短縮するため、または他の理由で必要な場合に、別の場所に移動できます。

15.2. 移行の要件および制限

KVM の移行を使用する前に、システムが移行の要件を満たしていることを確認し、その制限事項について理解しておく必要があります。

移行の要件

  • 次のいずれかのプロトコルを使用して、共有ストレージにインストールされたゲスト仮想マシン。
    • ファイバーチャネルベースの LUN
    • iSCSI
    • NFS
    • GFS2
    • SCSI RDMA プロトコル (SCSI RCP) - Infiniband アダプターおよび 10GbE iWARP アダプターで使用されるブロックエクスポートプロトコル
  • libvirtd サービスが有効で、実行していることを確認します。
    # systemctl enable libvirtd.service
    # systemctl restart libvirtd.service
  • 効果的に移行する機能は、/etc/libvirt/libvirtd.conf ファイル内のパラメーター設定により異なります。このファイルを編集するには、以下の手順を使用します。

    手順15.1 libvirtd.conf の設定

    1. libvirtd.conf を開くには、root で次のコマンドを実行する必要があります。
      # vim /etc/libvirt/libvirtd.conf
    2. 必要に応じてパラメーターを変更し、ファイルを保存します。
    3. libvirtd サービスを再起動します。
      # systemctl restart libvirtd
  • 移行プラットフォームとバージョンは、表15.1「ライブマイグレーションの互換性」 に対してチェックする必要があります。
  • 共有ストレージメディアをエクスポートする別のシステムを使用してください。ストレージは、移行に使用される 2 台のホスト物理マシンのいずれにも存在しないようにする必要があります。
  • 共有ストレージは、移行元システムと移行先システムの同じ場所にマウントする必要があります。マウントするディレクトリー名は同じである必要があります。別のパスを使用してイメージを保持することもできますが、推奨されません。virt-manager を使用して移行を実行する場合は、パス名が同じである必要があります。virsh を使用して移行を実行する場合は、--xml オプションまたは pre-hooks で別のネットワーク設定とマウントディレクトリーを使用できます。pre-hooks の詳細は libvirt upstream documentation を参照し、XML オプションの詳細は23章ドメイン XML の操作 を参照してください。
  • パブリックブリッジ + タップネットワーク内の既存のゲスト仮想マシンで移行を試行する場合、移行元ホストマシンと移行先ホストマシンが同じネットワークに存在する必要があります。この手順を行わないと、ゲストの仮想マシンネットワークが移行後に動作しません。

移行の制限

  • KVM に基づく仮想化技術を使用する Red Hat Enterprise Linux でゲスト仮想マシンの移行を使用する場合には、以下の制限があります。
    • ポイントツーポイント移行 – 送信元ハイパーバイザーから宛先ハイパーバイザーを指定するには手動で実行する必要があります
    • 検証またはロールバックは利用できません
    • ターゲットの決定は手動でのみ行うことができます。
    • ストレージの移行は Red Hat Enterprise Linux 7™ ではライブで実行できませんが、ゲスト仮想マシンの電源がオフのときにストレージを移行できます。ライブストレージの移行は、Red Hat Virtualization™ で利用できます。詳細は、サービス担当者にお問い合わせください。
注記
virtio デバイスを含むゲストマシンを移行する場合は、いずれかのプラットフォームの virtio デバイスのベクトル数を 32 以下に設定してください。詳細は、「Devices」 を参照してください。

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

ライブマイグレーションは、表15.1「ライブマイグレーションの互換性」 に示すようにサポートされています。

表15.1 ライブマイグレーションの互換性

移行の方法 リリースタイプ ライブ移行のサポート 備考
前方 メジャーリリース 6.5+ → 7.x 完全対応 問題がある場合は報告する必要があります
後方 メジャーリリース 7.x → 6.y サポート対象外
前方マイナーリリース7.x → 7.y (7.0 → 7.1)完全対応問題がある場合は報告する必要があります
後方マイナーリリース7.y → 7.x (7.1 → 7.0)完全対応問題がある場合は報告する必要があります

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

  • 移行プロトコルの問題 - 後方移行が "unknown section error" で終了する場合は、一時的なエラーである可能性があるため、移行プロセスを繰り返すことで問題を修復できます。そうでない場合は、問題を報告してください。
  • オーディオデバイスに関する問題 - Red Hat Enterprise Linux 6.x から Red Hat Enterprise Linux 7.y への移行時に、es1370 オーディオカードに対応しなくなった点に注意してください。代わりに ac97 オーディオカードを使用してください。
  • ネットワークカードに関する問題 - Red Hat Enterprise Linux 6.x から Red Hat Enterprise Linux 7.y に移行する際に、pcnet ネットワークカードおよび ne2k_pci ネットワークカードに対応しなくなった点に注意してください。代わりに virtio-net ネットワークデバイスを使用してください。

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

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

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

15.4. 共有ストレージの例単純な移行の NFS

重要
この例では、NFS を使用して、ゲスト仮想マシンのイメージを別の KVM ホストの物理マシンと共有します。大規模なインストールでは実用的ではありませんが、移行技術のみを実証することが推奨されます。この例を、複数のゲスト仮想マシンの移行または実行に使用しないでください。また、synch パラメーターが有効になっている必要があります。これは、NFS ストレージを適切にエクスポートするために必要です。
大規模なデプロイメントでは、iSCSI ストレージの方が適しています。設定の詳細は、「iSCSI ベースのストレージプール」 を参照してください。
NFS の設定、IP テーブルの開放、およびファイアウォールの設定の詳細は、Red Hat Linux Storage Administration Guide を参照してください。
KVM では対応していないため、NFS ファイルのロック機能を使用しない。
  1. libvirt イメージディレクトリーのエクスポート

    移行には、移行ターゲットシステムとは別のシステムにストレージを置く必要があります。別のシステムでは、デフォルトのイメージディレクトリーを /etc/exports ファイルに追加して、ストレージをエクスポートします。
    /var/lib/libvirt/images *.example.com(rw,no_root_squash,sync)
    必要に応じて hostname パラメーターを変更します。
  2. NFS の起動

    1. NFS パッケージがインストールされていない場合は、インストールします。
      # yum install nfs-utils
    2. iptable (2049 など) の NFS のポートが開いていることを確認し、/etc/hosts.allow ファイルに NFS を追加します。
    3. NFS サービスを開始します。
      # systemctl start nfs-server
  3. 移行元と移行先の共有ストレージをマウントします。

    移行元システムおよび移行先システムで、/var/lib/libvirt/images ディレクトリーをマウントします。
    # mount storage_host:/var/lib/libvirt/images /var/lib/libvirt/images
    警告
    移行元ホストの物理マシンのディレクトリーは、移行先ホストの物理マシンのディレクトリーとまったく同じである必要があります。これは、すべてのタイプの共有ストレージに適用されます。ディレクトリーが同じである必要があります。そうでないと、virt-manager による移行が失敗します。

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

virsh コマンドを使用すると、ゲスト仮想マシンを別のホスト物理マシンに移行できます。migrate コマンドは、以下の形式のパラメーターを受け付けます。
# virsh migrate --live GuestName DestinationURL
ライブマイグレーションが必要ない場合に、--live オプションが削除される可能性がある点に注意してください。追加オプションは、「virsh migrate コマンドの追加オプション」 に一覧表示されています。
GuestName パラメーターは、移行するゲスト仮想マシンの名前を表します。
DestinationURL パラメーターは、宛先ホスト物理マシンの接続 URL です。移行先システムで同じバージョンの Red Hat Enterprise Linux を実行し、同じハイパーバイザーを使用し、libvirt を実行している必要があります。
注記
通常の移行と peer2peer の移行の DestinationURL パラメーターのセマンティックは異なります。
  • 通常の移行 - DestinationURL は、移行元ゲスト仮想マシンから見た、移行先ホストの物理マシンの URL です。
  • peer2peer 移行:DestinationURL は、移行元ホストの物理マシンから見た、移行先ホストの物理マシンの URL です。
コマンドを入力すると、インストール先システムの root パスワードを求められます。
重要
移行を成功させるには、名前解決が両方 (移行元と移行先) で機能している必要があります。両側が互いを見つけられるようにする必要があります。名前解決が機能していることを確認するために、一方を他方に ping できることを確認してください。

例: 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-rhel7-64 qemu+ssh://host2.example.com/system
    コマンドを入力すると、インストール先システムの root パスワードを求められます。
  3. 待機

    負荷やゲスト仮想マシンのサイズによっては、移行に時間がかかる場合があります。virsh はエラーのみを報告します。ゲスト仮想マシンは、完全に移行するまで、移行元ホストの物理マシンで実行し続けます。
  4. ゲスト仮想マシンが移行先ホストに到達していることを確認する

    移行先システムから、host2.example.comguest1-rhel7-64 が実行していることを確認します。
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
    
これで、ライブマイグレーションが完了しました。
注記
libvirt は、TLS/SSL ソケット、UNIX ソケット、SSH、暗号化されていない TCP など、さまざまなネットワーク方式をサポートしています。他の方法の使用方法は、18章ゲストのリモート管理 を参照してください。
注記
実行中でないゲスト仮想マシンは、次のコマンドを使用して移行できます。
# virsh migrate --offline --persistent 

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

複数の同時ライブマイグレーションを実行できます。各移行は、個別のコマンドシェルで実行されます。ただし、これは慎重に行ってください。各移行インスタンスでは、双方 (ソースおよびターゲット) から 1 つの MAX_CLIENT を使用するため、注意して計算を行う必要があります。デフォルト設定は 20 であるため、設定を変更せずに 10 インスタンスを実行できます。設定を変更する必要がある場合は、手順15.1「libvirtd.conf の設定」 の手順を参照してください。
  1. 手順15.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 = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # 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 パラメーターの設定で設定された制限に従います。このため、同時ライブマイグレーションを実行する前に、最大値を慎重に検討する必要があります。
    重要
    max_clients パラメーターは、libvirt への接続を許可するクライアントの数を制御します。一度に多数のコンテナーを起動すると、この制限に簡単に到達して超過する可能性があります。max_clients パラメーターの値は、これを回避するために増やすことができますが、増やすと、インスタンスに対する DoS (DoS) 攻撃に対してシステムが脆弱になる可能性があります。この問題を軽減するために、Red Hat Enterprise Linux 7.0 では、許可されているものの、まだ認証されていない接続の制限を指定する新しい max_anonymous_clients 設定が導入されました。ワークロードに合わせて、max_clientsmax_anonymous_clients を組み合わせて実装できます。
  4. ファイルを保存し、サービスを再起動します。
    注記
    起動したにもかかわらず認証されていない ssh セッションが多すぎるために、移行接続が切断する場合があります。デフォルトでは、sshd で許可されるセッションは 10 セッションのみで、常に "pre-authenticated state" となります。この設定は、sshd 設定ファイル (ここでは /etc/ssh/sshd_config) の MaxStartups パラメーターで制御されます。これには調整が必要な場合があります。この制限は DoS 攻撃 (および一般的なリソースの過剰使用) を防ぐために設定されているため、このパラメーターの調整は慎重に行ってください。この値を高く設定しすぎると、目的が無効になります。このパラメーターを変更するには、ファイル/etc/ssh/sshd_configを変更し、MaxStartups 行の先頭から#を削除して、10 (デフォルト値) をより大きな数値に変更します。必ず保存して、sshd サービスを再起動してください。詳細は、man ページの sshd_config を参照してください。

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

--live のほかに、virsh migrate では以下のオプションを利用できます。
  • --direct - 直接移行に使用されます。
  • --p2p - ピアツーピア移行に使用されます。
  • --tunneled - トンネルマイグレーションに使用されます。
  • --offline - 移行先のドメインを起動せず、また、移行元ホストで停止することなく、ドメイン定義を移行します。オフラインマイグレーションは、非アクティブなドメインで使用できるため、--persistent オプションで使用する必要があります。
  • --persistent - 移行先ホストの物理マシンでドメインを永続的な状態にします。
  • --undefinesource - 移行元ホストの物理マシンでドメインの定義を解除する
  • --suspend - ドメインを移行先ホスト物理マシンで一時停止したままにします。
  • --change-protection - 移行の進行中に、互換性のない設定変更がドメインに行われないように強制します。ハイパーバイザーによるサポートがある場合にこのフラグが暗黙的に有効になりますが、ハイパーバイザーに変更保護の対応がない場合に明示的に使用して移行を拒否できます。
  • --unsafe - すべての安全手順を無視して、強制的に移行を実行します。
  • --verbose - 移行の進行状況を表示します。
  • --compressed - ライブマイグレーション中に繰り返し転送する必要があるメモリーページの圧縮をアクティブにします。
  • --abort-on-error - 移行中にソフトエラー (I/O エラーなど) が発生すると、移行をキャンセルします。
  • --domain [name] - ドメインネーム、ID、または UUID を設定します。
  • --desturi [URI] - クライアント (通常の移行) またはソース (p2p 移行) から見た宛先ホストの接続 URI。
  • --migrateuri [URI] - 移行 URI です。通常は省略できます。
  • --graphicsuri [URI] - シームレスなグラフィックス移行に使用されるグラフィックス URI。
  • --listen-address [address] - 移行先のハイパーバイザーが着信時にバインドするリッスンアドレスを設定します。
  • --timeout [seconds] - ライブマイグレーションカウンターが N 秒を超えると、ゲスト仮想マシンが強制的にサスペンドします。ライブマイグレーションでのみ使用できます。タイムアウトが開始されると、一時停止されたゲスト仮想マシンで移行が続行されます。
  • --dname [newname] - 移行中にドメインの名前を変更するために使用されますが、通常は省略できます。
  • --xml [filename] - 指定されたファイル名を使用して、宛先で使用する別の XML ファイルを提供できます。このファイル名は、基となるストレージへのアクセスで、ソースと宛先の名前の相違を考慮するなど、ホスト固有のドメイン XML の部分にさらに多くの変更を加えます。このオプションは通常、省略されます。
  • --migrate-disks [disk_identifiers] - このオプションを使用して、移行中にコピーするディスクを選択できます。これにより、特定のディスクをコピーするのが望ましくない場合 (特定のディスクが宛先にすでに存在している場合や、そのディスクが役に立たなくなった場合など) に、より効率的なライブマイグレーションを行うことができます。[disk_identifiers] は、移行するディスクのコンマ区切りの一覧に置き換える必要があります。この一覧は、ドメイン XML ファイルの <target dev= /> 行の引数で識別されます。
また、次のコマンドも役に立ちます。
  • virsh migrate-setmaxdowntime [domain] [downtime] - 別のホストにライブマイグレーションされているドメインで許容されるダウンタイムの上限を設定します。指定されたダウンタイムはミリ秒単位で表されます。指定するドメインは、移行するドメインと同じである必要があります。
  • virsh migrate-compcache [domain] --size - ライブマイグレーション中に繰り返し転送されるメモリーページを圧縮するために使用されるキャッシュのサイズ (バイト) を設定または取得します。--size を使用しないと、圧縮キャッシュの現在のサイズが表示されます。--size を使用し、バイト単位で指定すると、ハイパーバイザーは、指定されたサイズに合わせて圧縮を変更するように求められます。これに続いて、現在のサイズが表示されます。--size 引数は、ドメインがライブマイグレーション中に、マイグレーションの進捗状況と、domjobinfoから取得される圧縮キャッシュミスの数の増加への反応として使用されることになっています。
  • virsh migrate-setspeed [domain] [bandwidth] - 別のホストに移行される指定されたドメインの移行帯域幅を Mib /秒で設定します。
  • virsh migrate-getspeed [domain] - 指定されたドメインで使用可能な最大移行帯域幅を Mib /秒で取得します。
詳細は、 移行の制限 または virsh の man ページを参照してください。

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

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

    virt-manager インターフェース で、File メニューを選択して、ターゲットホストの物理マシンに接続し、Add Connection をクリックします。
  2. 接続の追加

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

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

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

    図15.2 パスワードを入力

    パスワードを入力
  3. 共有ストレージの設定

    移行元ホストと移行先ホストの両方が、ストレージ (NFS の使用 など) を共有していることを確認します。
  4. ゲスト仮想マシンの移行

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

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

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

    図15.4 進捗ウィンドウ

    進捗ウィンドウ
    移行が問題なく終了すると、virt-manager は、移行先ホストで実行している、新しく移行したゲスト仮想マシンを表示します。

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

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

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

Red Hat Enterprise Linux 7 は、ゲスト仮想マシン用に 3 つのクラスのデバイスに対応します。
  • エミュレートされたデバイス は、実際のハードウェアを模倣する純粋な仮想デバイスで、変更されていないゲストオペレーティングシステムが標準のインボックスドライバーを使用してそれらを操作できるようにします。
  • Virtio デバイス (paravirtualized とも呼ばれます) は、純粋に仮想マシンで最適に機能するように設計された仮想デバイスです。Virtio デバイスはエミュレートされたデバイスに似ていますが、Linux 以外の仮想マシンには、デフォルトで必要なドライバーが含まれません。Virtual Machine Manager (virt-manager) や Red Hat Virtualization Hypervisor などの仮想化管理ソフトウェアは、サポートされている Linux 以外のゲストオペレーティングシステム用にこれらのドライバーを自動的にインストールします。Red Hat Enterprise Linux 7 は、最大 216 の virtio デバイスに対応します。詳細は、5章KVM 準仮想化 (virtio) ドライバー. を参照してください。
  • 割り当てられたデバイス は、仮想マシンに公開される物理デバイスです。この方法は passthrough としても知られています。デバイスの割り当てにより、仮想マシンはさまざまなタスクで PCI デバイスに排他的にアクセスできるようになり、PCI デバイスがゲストオペレーティングシステムに物理的に接続されているかのように見え、動作します。Red Hat Enterprise Linux 7 は、仮想マシンごとに最大 32 の割り当てられたデバイスをサポートします。
    デバイスの割り当ては、一部のグラフィックデバイス を含む PCIe デバイスでサポートされています。パラレルPCIデバイスは、割り当てられたデバイスとしてサポートされる場合がありますが、セキュリティとシステム構成の競合のために厳しい制限があります。
Red Hat Enterprise Linux 7 は、単一機能スロットとして仮想マシンに公開されるデバイスの PCI ホットプラグに対応します。これを可能にするために、単一機能のホストデバイスや、多機能のホストデバイスの個別の機能を設定できます。デバイスを多機能PCIスロットとして仮想マシンに公開する構成は、ホットプラグ以外のアプリケーションにのみ推奨されます。
特定のデバイスおよび関連の制限の詳細は、「Devices」 を参照してください。
注記
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼されている環境では、vfio_iommu_type1 モジュールへの allow_unsafe_interrupts を使用した 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

16.1. PCI デバイス

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

手順16.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 iommu=pt"
  3. 設定ファイルの再生成

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

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

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

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

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

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

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

    システムを再起動して、変更を有効にします。これで、システムで PCI デバイスの割り当てが可能になります。
注記
IOMMU の詳細は、付録E IOMMU グループの使用 を参照してください。

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

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

手順16.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 コマンドの出力から取得できます。

    図16.1 ダンプの内容

    
    # 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 を実行し、仮想マシン名を指定し、<devices> セクションにデバイスエントリーを追加して、PCI デバイスをゲスト仮想マシンに割り当てます。以下は例になります。
    # virsh edit guest1-rhel7-64

    図16.2 PCI デバイスの追加

    
    <devices>
    	[...]
     <hostdev mode='subsystem' type='pci' managed='yes'>
       <source>
          <address domain='0' bus='0' slot='25' function='0'/>
       </source>
     </hostdev>
     [...]
    </devices>
    
    または、virsh attach-device を実行して、仮想マシンの名前とゲストの XML ファイルを指定します。
    virsh attach-device guest1-rhel7-64 file.xml
    注記
    PCI デバイスには、デバイスファームウェアまたはデバイス用の起動前ドライバー (PXE など) を提供するための オプションの読み取り専用メモリー (ROM) モジュール (オプション ROM または 拡張 ROM としても知られている) が含まれます。通常、このオプション ROM は、PCI デバイスの割り当てを使用して物理 PCI デバイスを仮想マシンに接続する際に、仮想環境でも機能します。
    ただし、オプション ROM が必要ない場合があります。これにより、仮想マシンの起動に時間がかかったり、デバイスが提供する起動前ドライバーが仮想化と互換性がなくなり、ゲスト OS の起動に失敗する可能性があります。この場合、Red Hat は、仮想マシンからオプション ROM をマスクすることを推奨します。改善点を報告する場合は、以下のように行います。
    1. ホストで、割り当てるデバイスに拡張 ROM ベースアドレスレジスタ (BAR) があることを確認します。これを行うには、デバイスに対して lspci -v コマンドを使用し、以下を含む行の出力を確認します。
      Expansion ROM at
    2. <rom bar='off'/> 要素を、ゲストの XML 設定の <hostdev> 要素の子として追加します。
      <hostdev mode='subsystem' type='pci' managed='yes'>
        <source>
           <address domain='0' bus='0' slot='25' function='0'/>
        </source>
        <rom bar='off'/>
      </hostdev>
      
  5. 仮想マシンの起動

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

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

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

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

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

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

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

    トップのタスクバーで情報ボタンが選択され、左側のメニューペインで Overview が選択されている仮想マシンのハードウェアウィンドウ。
  2. PCI デバイスの選択

    左側の Hardware 一覧から PCI Host Device を選択します。
    未使用の PCI デバイスを選択します。現在、別のゲストが使用している PCI デバイスを選択すると、エラーが発生することに注意してください。この例では、予備のオーディオコントローラーが使用されています。Finish を選択して設定を完了します。

    図16.4 Add new virtual hardware ウィザード

    左側のメニューペインで PCI Host Device が選択されている Add new virtual hardware ウィザード。右側のメニューペインで、選択するホストデバイスの一覧が表示されています。
  3. 新しいデバイスの追加

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

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

    上部のタスクバーで Information ボタンが選択され、左側のメニューペインで Overview が選択された仮想マシンハードウェアウィンドウ。左側のメニューペインの仮想マシンデバイスのリストに新しく追加されたPCIデバイスが表示されます。
注記
デバイスの割り当てに失敗すると、同じ IOMMU グループに、ホストに依然として接続されているその他のエンドポイントが存在する可能性があります。virt-manager を使用してグループ情報を取得する方法はありませんが、virsh コマンドを使用すると、IOMMU グループの境界を分析したり、必要に応じてデバイスを隔離したりできます。
IOMMU グループの詳細と、virsh を使用してエンドポイントデバイスの割り当てを解除する方法は、「virsh を使用した PCI デバイスの割り当て」注記 を参照してください。

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

virt-install でゲストをインストールする際に、PCI デバイスを割り当てることができます。これには、--host-device パラメータを使用します。

手順16.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

    図16.6 PCI デバイスファイルの内容

    
    <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. デバイスの追加

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

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

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

ホストの PCI デバイスがゲストマシンに割り当てられると、ホストがそのデバイスを使用できなくなります。PCI デバイスが managed モード (ドメインの XML ファイルmanaged='yes' パラメーターを使用して設定) の場合は、ゲストマシンに接続し、ゲストマシンの接続を解除し、必要に応じてホストマシンに再度接続します。PCI デバイスが managed モードではない場合は、ゲストマシンから PCI デバイスの接続を解除し、virsh または virt-manager を使用して再度接続できます。

手順16.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
    これで、デバイスがホストで使用できるようになります。

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

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

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

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

    Show virtual hardware details ボタン。
  2. デバイスを選択して削除する

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

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

    PCI デバイスの詳細と、Remove ボタン。
    Remove ボタンをクリックして確定します。これで、デバイスがホストで使用できるようになります。

16.1.5. PCI ブリッジ

PCI (Peripheral Component Interconnect) ブリッジは、ネットワークカード、モデム、サウンドカードなどのデバイスに接続するために使用されます。物理デバイスと同様に、仮想デバイスも PCI ブリッジに接続できます。以前は、31 個の PCI デバイスしかゲスト仮想マシンに追加できませんでした。現在、31 番目の PCI デバイスを追加すると、PCI ブリッジが 31 番目のスロットに自動的に配置され、追加した PCI デバイスを PCI ブリッジに移動します。各 PCI ブリッジには、31 の追加デバイス用に 31 個のスロットがあり、すべてがブリッジになることができます。この方法では、ゲスト仮想マシンで 900 を超えるデバイスを使用できます。
PCI ブリッジの XML 設定の例は、Domain XML example for PCI Bridge を参照してください。この設定は自動的に設定されるため、手動で調整することはお勧めしません。

16.1.6. PCI デバイスの割り当ての制限

PCI デバイスの割り当て (仮想マシンへの PCI デバイスの割り当て) では、ホストシステムが AMD IOMMU または Intel VT-d をサポートして、PCIe デバイスのデバイス割り当てを有効にする必要があります。
Red Hat Enterprise Linux 7 では、ゲストデバイスドライバーによる PCI 設定領域のアクセスが制限されています。この制限により、拡張 PCI 設定領域にあるデバイスの機能や、機能に依存するドライバーが設定に失敗する場合があります。
Red Hat Enterprise Linux 7 仮想マシンには、割り当てられているデバイスの合計が 32 個までに制限されています。これは、仮想マシンに存在する PCI ブリッジの数や、これらの機能を組み合わせて多機能スロットを作成する方法に関係なく、合計 32 の PCI 機能に変換されます。
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼されている環境では、管理者が vfio_iommu_type1 モジュールへの allow_unsafe_interrupts オプションを使用して、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

16.2. SR-IOV デバイスを使用した PCI デバイスの割り当て

PCI ネットワークデバイス (<source> 要素によりドメイン XML で指定) は、直接デバイス割り当て (passthrough と呼ばれることもあります) を使用して、ゲストに直接接続できます。 標準的なシングルポートの PCI イーサネットカードドライバー設計の制限により、この方法で割り当てることができるのは Single Root I/O Virtualization (SR-IOV) virtual function (VF) デバイスのみとなります。標準的なシングルポートの PCI または PCIe イーサネットカードをゲストに割り当てる場合は、従来の <hostdev> デバイス定義を使用します。

図16.9 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>
PCI-SIG (PCI Special Interest Group) が開発した SR-IOV (Single Root I/O Virtualization) 仕様は、単一デバイスを複数の仮想マシンに共有できる PCI デバイス割り当てタイプの標準です。SR-IOV は、仮想マシンのデバイスパフォーマンスを改善します。

図16.10 SR-IOV の仕組み

SR-IOV の仕組み
SR-IOVを使用すると、単一の root 機能(たとえば、単一のイーサネットポート)を複数の個別の物理デバイスとして表示できます。SR-IOV 機能を持つ物理デバイスは、PCI 設定領域に複数の機能として表示されるように設定できます。各デバイスには、ベースアドレスレジスタ (BAR) を含む独自の設定領域があります。
SR-IOV は、次の 2 つの PCI 機能を使用します。
  • Physical Function (PF) は、SR-IOV 機能を含む完全な PCIe デバイスです。物理機能は、検出、管理、および通常の PCI デバイスとして設定されます。物理機能は、仮想機能を割り当てることにより、SR-IOV機能を設定および管理します。
  • 仮想機能 (VF) は、I/O のみを処理する単純な PCIe 機能です。各仮想機能は、物理機能から派生しています。デバイスに含まれる仮想機能の数は、デバイスのハードウェアにより制限されます。単一のイーサネットポートである物理デバイスは、仮想マシンで共有できる多くの仮想機能にマップできます。
ハイパーバイザーは、1 つ以上の仮想機能を仮想マシンに割り当てることができます。その後、仮想機能の設定領域が、ゲストに提示される設定領域に割り当てられます。
仮想機能にはリアルハードウェアリソースが必要であるため、各仮想機能は一度に 1 つのゲストにのみ割り当てることができます。仮想マシンには、複数の仮想機能を設定できます。仮想機能は、通常のネットワークカードがオペレーティングシステムに表示されるのと同じ方法で、ネットワークカードとして表示されます。
SR-IOV ドライバーはカーネルで実装されます。コア実装はPCIサブシステムに含まれていますが、物理機能(PF)デバイスと仮想機能(VF)デバイスの両方のドライバーサポートも必要です。SR-IOV 対応デバイスは、PF から VF を割り当てることができます。VF は、キューやレジスタセットなどのリソースにより、物理 PCI デバイスにバッキングされている PCI デバイスとして表示されます。

16.2.1. SR-IOV の利点

SR-IOVデバイスは、単一の物理ポートを複数の仮想マシンと共有できます。
SR-IOV VF が仮想マシンに割り当てられている場合は、(仮想マシンに透過的に) VF を残しているすべてのネットワークトラフィックを特定の VLAN に配置するように設定できます。仮想マシンは、トラフィックが VLAN にタグ付けされていることを検出できないため、このタグを変更したり、削除したりできません。
仮想機能は、準仮想化ドライバーおよびエミュレートされたアクセスよりもネイティブに近いパフォーマンスを発揮し、パフォーマンスを向上させます。仮想機能は、データがハードウェアによって管理および制御されるのと同じ物理サーバー上の仮想マシン間のデータ保護を提供します。
この機能により、データセンター内のホストで仮想マシンの密度を上げることができます。
SR-IOV は、複数のゲストがあるデバイスの帯域幅をより有効に利用できます。

16.2.2. SR-IOV の使用

本セクションでは、PCI パススルーを使用して、SR-IOV 対応マルチポートネットワークカードの仮想機能を、ネットワークデバイスとして仮想マシンに割り当てる方法を説明します。
SR-IOV 仮想機能 (VF) は、virsh edit コマンドまたは virsh attach-device コマンドで <hostdev> にデバイスエントリーを追加することで、仮想マシンに割り当てることができます。ただし、これは通常のネットワークデバイスとは異なり、SR-IOV VF ネットワークデバイスには永続的な一意の MAC アドレスがなく、ホストを再起動するたびに新しい MAC アドレスが割り当てられるため、問題になることがあります。このため、システムの再起動後にゲストに同じ VF が割り当てられた場合でも、ホストの再起動時に、ゲストのネットワークアダプターが新しい MAC アドレスを持つと判断します。その結果、ゲストは毎回新しいハードウェアが接続されていると考え、通常はゲストのネットワーク設定を再設定する必要があります。
libvirt には、<interface type='hostdev'> インターフェースデバイスが含まれます。このインターフェースデバイスを使用すると、libvirt は、最初に、示されたネットワーク固有のハードウェアおよびスイッチの初期化 (MAC アドレス、VLAN タグ、802.1Qbh 仮想ポートパラメーターの設定など) を実行し、次にゲストに PCI デバイスを割り当てます。
<interface type='hostdev'> インターフェースを使用するには、以下が必要です。
  • SR-IOV 対応のネットワークカード、
  • Intel VT-d 拡張機能または AMD IOMMU 拡張機能のいずれかに対応するホストハードウェア
  • 割り当てる VF の PCI アドレス。
重要
仮想マシンへの SR-IOV デバイスの割り当てには、ホストハードウェアが Intel VT-d または AMD IOMMU 仕様に対応している必要があります。
Intel または AMD システムに SR-IOV ネットワークデバイスを接続する場合は、以下の手順を行います。

手順16.8 Intel または AMD システムでの SR-IOV ネットワークデバイスの接続

  1. BIOS およびカーネルで、Intel VT-d または AMD IOMMU の仕様を有効にします。

    Intel システムでは、BIOS で Intel VT-d が有効になっていない場合は有効にします。BIOS およびカーネルで Intel VT-d を有効にする場合は、手順16.1「PCIデバイス割り当てのためのIntelシステムの準備」 を参照してください。
    Intel VT-d が既に有効で機能している場合は、この手順をスキップしてください。
    AMD システムでは、BIOS で AMD IOMMU 仕様が有効になっていない場合は有効にします。BIOS で IOMMU を有効にする方法は、手順16.2「PCI デバイス割り当て用の AMD システムの準備」 を参照してください。
  2. サポートの確認

    SR-IOV 機能のある PCI デバイスが検出されたかどうかを確認します。この例では、SR-IOV に対応する Intel 82576 ネットワークインターフェースカードを一覧表示します。lspci コマンドを使用して、デバイスが検出されたかどうかを確認します。
    # lspci
    03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    この出力は、その他のデバイスをすべて削除するように変更されていることに注意してください。
  3. 仮想機能のアクティブ化

    以下のコマンドを実行します。
    # echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs
  4. 仮想機能を永続化します。

    再起動後も仮想機能を永続化するには、選択したエディターを使用して、以下のような udev ルールを作成します。ここでは、ネットワークインターフェースカードでサポートされている制限まで、予定している数の VF (この例では 2) を指定します。以下の例では、enp14s0f0 を PF ネットワークデバイス名に置き換え、ENV{ID_NET_DRIVER} の値を、使用中のドライバーに合わせて調整します。
    # vim /etc/udev/rules.d/enp14s0f0.rules
    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe",
    ATTR{device/sriov_numvfs}="2"
    
    これにより、システムの起動時に機能が有効になります。
  5. 新しい仮想機能の検査

    lspci コマンドを使用して、Intel 82576 ネットワークデバイスに追加した仮想機能の一覧を表示します。(もしくは、grep を使用して Virtual Function を検索し、仮想機能に対応するデバイスを検索します。)
    # lspci | grep 82576
    0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    PCI デバイスの識別子は、lspci コマンドの -n パラメーターで確認できます。物理機能は、0b:00.0 および 0b:00.1 に対応します。説明には、すべての仮想機能のVirtual Functionが記載されています。
  6. デバイスが virsh で存在することを確認します。

    libvirt サービスは、仮想マシンにデバイスを追加する前にデバイスを認識しておく必要があります。libvirt は、lspci 出力と同様の表記を使用します。lspci出力内の句読点文字 (: および .) はすべて、アンダースコア (_) に変更されます。
    virsh nodedev-list コマンドと grep コマンドを使用して、利用可能なホストデバイスの一覧から Intel 82576 ネットワークデバイスをフィルターにかけます。0b は、この例題の Intel 82576 ネットワークデバイス用のフィルターです。これはシステムにより異なるため、デバイスが追加される可能性があります。
    # virsh nodedev-list | grep 0b
    pci_0000_0b_00_0
    pci_0000_0b_00_1
    pci_0000_0b_10_0
    pci_0000_0b_10_1
    pci_0000_0b_10_2
    pci_0000_0b_10_3
    pci_0000_0b_10_4
    pci_0000_0b_10_5
    pci_0000_0b_10_6
    pci_0000_0b_11_7
    pci_0000_0b_11_1
    pci_0000_0b_11_2
    pci_0000_0b_11_3
    pci_0000_0b_11_4
    pci_0000_0b_11_5
    仮想機能と物理機能の PCI アドレスがリストに含まれている必要があります。
  7. virsh でデバイスの詳細を取得する

    pci_0000_0b_00_0 は、物理機能のいずれかで、pci_0000_0b_10_0 は、その物理機能に対応する最初の仮想機能です。virsh nodedev-dumpxml を実行すると、両方のデバイスの情報が表示されます。
    # virsh nodedev-dumpxml pci_0000_03_00_0
    <device>
      <name>pci_0000_03_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:00.0</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='virt_functions'>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x4'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x6'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x4'/>
        </capability>
        <iommuGroup number='14'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </iommuGroup>
      </capability>
    </device>
    # virsh nodedev-dumpxml pci_0000_03_11_5
    <device>
      <name>pci_0000_03_11_5</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:11.5</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igbvf</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>17</slot>
        <function>5</function>
        <product id='0x10ca'>82576 Virtual Function</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='phys_function'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </capability>
        <iommuGroup number='35'>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x5'/>
        </iommuGroup>
      </capability>
    </device>
    この例では、手順 8 で作成した仮想マシンに、仮想機能 pci_0000_03_10_2 を追加します。仮想機能の busslot、および function パラメーターは、デバイスを追加するために必要です。
    このパラメーターは、/tmp/new-interface.xml などの一時 XML ファイルにコピーします。
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
         </source>
       </interface>
    注記
    仮想マシンが起動すると、物理アダプターが提供するタイプのネットワークデバイスと、設定された MAC アドレスが表示されます。この MAC アドレスは、ホストおよびゲストの再起動後も変更されません。
    以下の <interface> の例は、オプションの <mac address><virtualport>、および <vlan> 要素のシンタックスを示しています。実際には、例にあるように、両方の要素を同時に使用するのではなく、<vlan> 要素または <virtualport> 要素のいずれかを使用します。
    ...
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
         <mac address='52:54:00:6d:90:02'>
         <vlan>
            <tag id='42'/>
         </vlan>
         <virtualport type='802.1Qbh'>
           <parameters profileid='finance'/>
         </virtualport>
       </interface>
       ...
     </devices>
    MAC アドレスを指定しないと、MAC アドレスが自動的に生成されます。<virtualport> 要素は、802.11Qbh ハードウェアスイッチに接続する場合にのみ使用されます。<vlan> 要素は、VLAN タグ付けされた 42 に、ゲストのデバイスを透過的に配置します。
  8. 仮想マシンへの仮想機能の追加

    上の手順で作成した一時ファイルを使用し、次のコマンドを実行して仮想マシンに仮想機能を追加します。これにより、新しいデバイスがすぐに接続され、以降のゲストの再起動のために保存されます。
    virsh attach-device MyGuest /tmp/new-interface.xml --live --config
    
    virsh attach-device--live を指定すると、新しいデバイスが実行中のゲストに接続されます。--config オプションを使用すると、今後ゲストを再起動しても新しいデバイスを使用できるようになります。
    注記
    --live オプションは、ゲストの実行中にのみ使用できます。--live オプションが 実行中でないゲストで使用された場合、virsh はエラーを返します。
仮想マシンが新しいネットワークインターフェースカードを検出します。この新しいカードは、SR-IOV デバイスの仮想機能です。

16.2.3. SR-IOVデバイスを使用したPCI割り当ての設定

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

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

<hostdev> 要素は、MAC アドレスの割り当て、vLAN タグ ID の割り当て、仮想ポートの割り当てなどの機能固有の項目には使用できません。これは、<mac> 要素、<vlan> 要素、および <virtualport> 要素が <hostdev> の有効な子ではないためです。代わりに、この要素は hostdev インターフェースタイプ <interface type='hostdev'> と一緒に使用できます。このデバイスタイプは、<インタフェース><hostdev> を組み合わせたものとして動作します。そのため、libvirt は、ゲスト仮想マシンに PCI デバイスを割り当てる前に、ゲスト仮想マシンの XML 設定ファイルに示されているネットワーク固有のハードウェア/スイッチを初期化します (MAC アドレスの設定、vLAN タグの設定、802.1Qbh スイッチへの関連付けなど)。vLAN タグの設定方法は、「vLAN タグの設定」 を参照してください。
  1. 情報の収集

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

    virsh shutdown コマンドを使用して、ゲスト仮想マシンをシャットダウンします (ここでは guestVM という名前)。
    # virsh shutdown guestVM
  3. 編集する XML ファイルを開く

    # virsh edit guestVM.xml
    オプション:virsh save コマンドによって作成された XML 設定ファイルの場合は、次のコマンドを実行します。
    # virsh save-image-edit guestVM.xml --running 
    この例では、guestVM.xml の設定ファイルがデフォルトのエディターで開きます。詳細は、「ゲスト仮想マシンの設定の編集」 を参照してください。
  4. XML ファイルの編集

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

    図16.11 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 アドレスを指定しない場合は、他のタイプのインターフェースデバイスと同様に自動的に生成されます。また、<virtualport> 要素は、802.11Qgh ハードウェアスイッチに接続する場合にのみ使用されます。802.11 Qbg (「VEPA」としても知られている) スイッチには現在対応していません。
  5. ゲスト仮想マシンを再起動します。

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

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

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

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

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

    virsh shutdown コマンドを使用して、ゲスト仮想マシンをシャットダウンします (ここでは guestVM という名前)。
    # virsh shutdown guestVM
  2. 設定ファイルの作成

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

    図16.12 サンプルのネットワーク定義ドメイン 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のリストを自動的に取得します。

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

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

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

    図16.14 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>
          
    
    

16.2.5. SR-IOV の制限

SR-IOV は、以下のデバイスでの徹底したテストのみが行われています。
  • Intel® 82576NS ギガビットイーサネットコントローラー (igb ドライバー)
  • Intel® 82576EB ギガビットイーサネットコントローラー (igb ドライバー)
  • Intel® 82599ES 10 ギガビットイーサネットコントローラー (ixgbe ドライバー)
  • Intel® 82599EB 10 ギガビットイーサネットコントローラー (ixgbe ドライバー)
その他の SR-IOV デバイスは動作するかもしれませんが、リリース時にはテストされていません。

16.3. USB デバイス

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

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

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

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

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

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

  1. ゲスト仮想マシンを準備します。
  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. メニューの USB device selection をクリックします。以下のメッセージが表示されます。"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 デバイスはトラフィックをゲスト仮想マシンにリダイレクトするようになります。

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

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

図16.15 仮想コントローラーのドメイン 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> 要素のコントローラー属性で使用されます)。