Red Hat Training

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

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

Red Hat Enterprise Linux 7

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

Jiri Herrmann

Red Hat Customer Content Services

Parth Shah

Red Hat Customer Content Services

Yehuda Zimmerman

Red Hat Customer Content Services

Laura Novich

Red Hat Customer Content Services

Dayle Parker

Red Hat Customer Content Services

Scott Radvan

Red Hat Customer Content Services

Tahlia Richardson

Red Hat Customer Content Services

概要

本ガイドでは、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 仮想化スタートガイド』 を参照してください

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

第1章 システム要件

仮想化は、Intel 64 および AMD64 アーキテクチャーで、Red Hat Enterprise Linux 7 の KVM ハイパーバイザーで利用できます。本章では、仮想マシン(仮想マシン)を実行するためのシステム要件を説明します。

1.1. ホストシステム要件

最小ホストシステム要件

  • 6 GB の空きディスク領域
  • 2 GB の RAM

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. 出力の分析

    • 以下の出力例では vmx エントリーが含まれており、Intel VT-x 拡張機能を持つ Intel プロセッサーを示します。
      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
      
    • 以下の出力例では svm エントリーが含まれており、AMD-V 拡張を持つ AMD プロセッサーを示します。
      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 ホストでの実行が認定されているゲストオペレーティングシステムを一覧表示します。

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 インストールガイド』を参照してください
重要
Anaconda インターフェースは、Red Hat Enterprise Linux Server のインストール時に Red Hat 仮想化パッケージをインストールするオプションのみを提供します。
Red Hat Enterprise Linux Workstation のインストール時に、Red Hat Virtualization パッケージはワークステーションインストールの完了後のみインストールできます。を参照してください。 「既存の Red Hat Enterprise Linux システムへの仮想化パッケージのインストール」

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

  1. ソフトウェアの選択

    インストールの 概要画面まで、インストール 手順に従います。

    図2.1 インストールの概要画面

    イメージには Installation Summary 画面が表示され、グループの見出しで設定可能なオプションを一覧表示します。ローカライゼーション 見出しの 日付および時間、言語サポート、およびキーボードSoftware の見出し - インストールソース と ソフトウェアの選択。システム 見出しで、インストール先 と ネットワークとホスト名が表示されます。
    インストール概要 画面で、ソフトウェアの選択 をクリックします。ソフトウェアの選択 画面が開きます。
  2. サーバータイプおよびパッケージグループを選択します

    基本的な仮想化パッケージのみ、またはグラフィカルユーザーインターフェースを使用してゲストを管理できるパッケージとともに、Red Hat Enterprise Linux 7 をインストールできます。以下のいずれかを行います。
    • 最小仮想化ホストのインストール
      ベース環境 ペインで Virtualization Host ラジオボタンを選択し、Add-Ons for Selected Environment ペインで Virtualization Platform チェックボックスを選択します。これにより、virsh またはネットワーク上でリモートで実行できる基本的な仮想化環境がインストールされます。

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

      イメージは ソフトウェア選択 画面を表示します。この画面には、ベース環境 と選択した環境の アドオンの 2 つの見出しのオプションが表示され ます。仮想化ホスト は Base Environment の下のオプションから強調表示され、仮想 化 Platform は 選択した環境の Add-Ons の下のオプションから強調表示されます。
    • グラフィカルユーザーインターフェースを使用した仮想化ホストのインストール
      Base Environment ペインと VirtualizationClient、仮想化ハイパーバイザー、および Virtualization Tools のチェックボックスに、選択した環境 ペインの Server with GUI ラジオボタンを選択します。これにより、ゲスト仮想マシンをインストールし、管理するためのグラフィカルツールと共に仮想化環境がインストールされます。

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

      イメージは ソフトウェア選択 画面を表示します。この画面には、ベース環境 と選択した環境の アドオンの 2 つの見出しのオプションが表示され ます。サーバー(GUI )は、Base Environment、Virtualization Client、Virtualization Hypervisor、および Virtualization Tools の下のオプションから強調表示され、選択した環境の Add-Ons の下の オプションから強調表示されます。
  3. インストールの最終処理

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

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

キックスタートファイルを使用して仮想化パッケージで Red Hat Enterprise Linux をインストールするには、キックスタートファイルの %packages セクションに以下のパッケージグループを追加します。
@virtualization-hypervisor
@virtualization-client
@virtualization-platform
@virtualization-tools

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

本セクションでは、既存の Red Hat Enterprise Linux 7 システムに KVM ハイパーバイザーをインストールする手順を説明します。
パッケージをインストールするには、Red Hat カスタマーポータルにマシンを登録し、サブスクライブする必要があります。Red Hat Subscription Manager を使用して登録するには、subscription-manager register コマンドを実行してプロンプトに従います。または、デスクトップの ApplicationsSystem Tools から 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: このパッケージは、仮想マシンマネージャーと呼ばれる 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. 仮想化パッケージグループのインストール

仮想化パッケージは、パッケージグループからもインストールできます。以下の表は、仮想化パッケージグループと、そのグループが提供する内容を示しています。

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

パッケージグループ 説明 必須パッケージ オプションパッケージ
仮想化ハイパーバイザー 最小限の仮想化ホストのインストール libvirt、qemu-kvm、qemu-img qemu-kvm-tools
仮想化クライアント 仮想化インスタンスをインストールおよび管理するためのクライアント 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
仮想化ツール オフラインの仮想イメージ管理ツール libguestfs、qemu-img libguestfs-java, libguestfs-tools, libguestfs-tools-c
パッケージグループをインストールするには、yum groupinstall package_group コマンドを実行します。--optional オプションを使用して、パッケージグループにオプションパッケージをインストールします。たとえば、すべての任意のパッケージを含む Virtualization Tools パッケージグループをインストールするには、以下を実行します。
# yum groupinstall "Virtualization Tools" --optional

第3章 仮想マシンの作成

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

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

ゲスト仮想マシンを作成する前に、さまざまな要因を考慮する必要があります。仮想マシンのロールはデプロイメント前に評価されますが、変数要素(負荷、クライアントの量)に基づく定期的な監視と評価も実施する必要があります。要因には、以下が含まれます。
パフォーマンス
ゲスト仮想マシンは、目的のタスクに基づいてデプロイして設定する必要があります。一部のゲストシステム(たとえば、データベースサーバーを実行するゲスト)では、特別なパフォーマンスの考慮事項が必要になる場合があります。ゲストには、ロールおよび展開されたシステム負荷に基づいて、さらに割り当てられた CPU またはメモリーが必要になる場合があります。
Input/Output の要件およびタイプ
ゲスト仮想マシンの中には、とくに高い入出力要件があるものや、入出力タイプ (例: 通常のディスクブロックサイズのアクセスまたはクライアント数) に応じてさらに注意や追加の予測が必要なものもあります。
ストレージ
ゲスト仮想マシンによっては、ストレージまたは高速のディスクタイプへの優先度の高いアクセスが必要になる場合があります。また、ストレージのエリアへの排他的アクセスが必要になる場合があります。ゲストによって使用されるストレージの量は、ストレージのデプロイと維持時に定期的に監視し、考慮に入れる必要があります。『Red Hat Enterprise Linux 7 Virtualization セキュリティーガイド』で説明されているすべての考慮事項を確認してください。物理ストレージが仮想ストレージでオプションを制限する可能性があることにも留意してください。
ネットワークおよびネットワークインフラストラクチャー
一部のゲスト仮想マシンでは、環境によっては、他のゲストよりも高速なネットワークリンクが必要になる場合があります。帯域幅またはレイテンシーは、特に要件や負荷の変更など、ゲストのデプロイと維持の際の要素が多いです。
要求要件
SCSI 要求は、virtio ドライブがディスク全体でサポートされ、ディスクデバイスパラメーターは ドメイン XML ファイルLUN に設定されている場合のみ、virtio ドライブ上のゲスト仮想マシンにのみ発行できます。以下に例を示します。
<devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='block' device='lun'>

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

virt-install コマンドを使用して仮想マシンを作成し、コマンドラインからその仮想マシンにオペレーティングシステムをインストールできます。virt-install は、対話またはスクリプトの一部として使用して、仮想マシンの作成を自動化できます。対話型のグラフィカルインストールを使用している場合は、virt-install を実行する前にvirt-viewer がインストールされている必要があります。さらに、キックスタートファイルで virt-install を使用して、仮想マシンのオペレーティングシステムの無人インストールを開始できます。
注記
一部の virt-install コマンドが正常に完了するには、root 権限が必要になる場合があります。
virt-install ユーティリティーは、複数のコマンドラインオプションを使用します。ただし、ほとんどの virt-install オプションは必要ありません。
ゲスト仮想マシンのインストールに必要な主なオプションは以下のとおりです。
--name
仮想マシンの名前。
--memory
ゲストに割り当てるメモリー(RAM)の容量を MiB 単位で指定します。
ゲストストレージ
以下のゲストストレージオプションのいずれかを使用します。
  • --disk
    仮想マシンのストレージ設定の詳細。--disk none オプションを使用する場合は、ディスク領域のない仮想マシンが作成されます。
  • --filesystem
    仮想マシンゲストのファイルシステムへのパス。
インストール方法
以下のインストール方法の 1 つを使用します。
  • --location
    インストールメディアの場所。
  • --cdrom
    仮想 CD-ROM デバイスとして使用されるファイルまたはデバイス。ISO イメージのパスや、最小限のブート ISO イメージの取得またはアクセスに使用する URL を指定できます。ただし、物理ホスト CD-ROM または DVD-ROM デバイスにすることはできません
  • --pxe
    PXE ブートプロトコルを使用して、ゲストのインストールプロセスを開始する初期 ramdisk とカーネルを読み込みます。
  • --import
    OS インストールプロセスを省略し、既存のディスクイメージに関連するゲストを構築します。ブートに使用するデバイスは、disk または filesystem オプションで指定した最初のデバイスです。
  • --boot
    仮想マシンのインストール後起動設定。このオプションでは、ブートデバイスの順序を指定し、任意のカーネル引数でカーネルと initrd を永続的に起動し、BIOS 起動メニューを有効にします。
オプションの完全な一覧を表示するには、以下のコマンドを入力します。
# virt-install --help
オプションの属性の完全な一覧を表示するには、以下のコマンドを入力します。
# virt install --option=?
man ページの virt-install では、各コマンドオプション、重要な変数、および例も説明されています。
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 オプションは、インストールツリーが指定したネットワーク上にあることを指定します。

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

PXE ブートプロトコルを使用して仮想マシンをインストールする場合は、ブリッジネットワークと --pxe オプションを指定する --network オプションの両方を指定する必要があります。
以下の例では、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 を使用した Network Address Translation (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"

ネットワークなし

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

3.3. virt-manager でゲストの作成

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

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

新規仮想マシンウィザードにより、仮想マシンの作成プロセスが 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. オプション: Preparation

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

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

    図3.1 Virtual Machine Manager ウィンドウ

    Virtual Machine Manager ウィンドウ
    必要に応じて、ハイパーバイザーを選択して、接続 ボタンをクリックして、リモートハイパーバイザーを開きます。
    をクリックし、新しい仮想化ゲストウィザードを起動します。
    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 インストールガイド』』で説明しています。ネットワークブートを使用してインストールするには、ゲストにはルーティング可能な IP アドレスまたは共有ネットワークデバイスが必要です。
    Network Boot を選択した場合は、STEP 5 に進みます。手順がすべて完了したら、DHCP 要求が送信され、有効な PXE サーバーにゲスト仮想マシンのインストールプロセスが開始します。
    既存のディスクイメージのインポート
    この方法では、新しいゲスト仮想マシンを作成し、そこにディスクイメージ (インストール済みの起動可能なオペレーティングシステムを含む) をインポートできます。

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

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

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

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

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

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

      ネットワークキックスタートのインストール
    次に、インストールの OS タイプと バージョンを設定します。仮想マシンに適したオペレーティングシステムタイプを選択します。これは、手動指定するか、インストールメディアに基づいてオペレーティングシステムを自動検出して選択したりできます
    進む をクリックして続行します。
  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. ストレージの設定

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

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

    仮想ストレージの設定
    注記
    ライブマイグレーションおよびオフラインの移行では、仮想マシンを共有ネットワークストレージにインストールする必要があります。「共有ストレージの例: シンプル移行用 NFS」
    1. デフォルトのローカルストレージの使用

      コンピューターのハードドライブラジオボタンにディスクイメージの作成 を選択して、デフォルトストレージプール (/var/lib/libvirt/images/ ディレクトリー)でファイルベースのイメージを作成します。作成するディスクイメージのサイズを入力します。ディスク全体の割り当て チェックボックスが選択されると、指定したサイズのディスクイメージがすぐに作成されます。そうでない場合は、ディスクイメージは入力時に拡張されます。
      注記
      ストレージプールは仮想コンテナーですが、qemu-kvm が許容する最大サイズと、ホストの物理マシンのディスクのサイズという 2 つの要素によって制限されます。ストレージプールは、ホストの物理マシンのディスクサイズを超えることはできません。最大サイズは以下のとおりです。
      • virtio-blk = 2^63 バイトまたは 8 つのエクサバイト(raw ファイルまたはディスクを使用)
      • Ext4 = ~ 16 TB (using 4 KB block size)
      • xfs = ~8 Exabytes
      • qcow2 およびホストファイルシステムは独自のメタデータを維持します。イメージサイズの大きさを試する場合には、スケーラビリティーを評価/調整する必要があります。raw ディスクを使用すると、スケーラビリティーや最大サイズに影響を与える可能性のある層が少なくなります。
      Forward をクリックして、ローカルのハードドライブにディスクイメージを作成します。または、Select managed or other existing storage を選択してから 参照 を選択して、管理対象ストレージを設定します。
    2. ストレージプールあり

      Select managed or other existing storage を選択してストレージプールを使用する場合は、Browse をクリックして Locate を開くか、ストレージボリュームウィンドウを作成します

      図3.7 Choose Storage Volume ウィンドウ

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

        図3.8 ストレージボリュームの追加 ウィンドウ。

        ストレージボリュームの追加 ウィンドウ。
    新しいボリュームを選択し、ボリュームの選択 をクリックします。次に、Finish をクリックして New VM ウィザードに戻ります。進む をクリックして続行します。
  7. 名前と最終設定

    仮想マシンに名前を付けます。仮想マシン名には、アンダースコア(_)、ピリオド(.)、およびハイフン(-)の文字を含めることができます。仮想マシンを移行するには、仮想マシンの名前は一意でなければならず、数字のみの名前は使用できません。
    デフォルトでは、仮想マシンは「default」と呼ばれるネットワークのネットワークアドレス変換(NAT)で作成されます。ネットワークの選択を変更するには、ネットワークの選択 をクリックして、ホストデバイスおよびソースモードを選択します。
    仮想マシンの設定を確認し、問題がなければ Finish をクリックします。これにより、指定したネットワーク設定、仮想化タイプ、およびアーキテクチャーで仮想マシンが作成されます。

    図3.9 設定の確認

    設定の確認
    仮想マシンのハードウェアをさらに設定するには、インストール前に Customize configuration をオンにしてゲストのストレージまたはネットワークデバイスの変更、準仮想化(virtio)ドライバーを使用するか、または追加デバイスを追加します。これにより、仮想マシンのハードウェア設定の追加、削除、設定を可能にする別のウィザードが開きます。
    注記
    Red Hat Enterprise Linux 4 または Red Hat Enterprise Linux 5 のゲスト仮想マシンは、グラフィカルモードでインストールできません。したがって、ビデオカードとして「QXL」ではなく「Cirrus」を選択する必要があります。
    仮想マシンのハードウェアの設定後、適用を クリックします。次に、virt-manager は、指定したハードウェア設定で仮想マシンを作成します。
    警告
    リモートのメディアから Red Hat Enterprise Linux 7 ゲスト仮想マシンをインストールする際に、TCP/IP 接続を設定せずに、インストールに失敗します。ただし、このような状況では、Red Hat Enterprise Linux 5 または 6 のゲスト仮想マシンをインストールすると、「Configure TCP/IP」インターフェースが開きます。
    Finish をクリックして、Red Hat Enterprise Linux インストールシーケンスに進みます。Red Hat Enterprise Linux 7 のインストール方法は『Red Hat Enterprise Linux 7 インストールガイド』を参照してください
Red Hat Enterprise Linux 7 のゲスト仮想マシンが ISO インストールディスクイメージから作成されるようになりました。

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

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

表3.1 ゲストインストールに対する virt-install および virt-manager 設定の比較

仮想マシンの設定 virt-install オプション virt-manager installation wizard label and step number
仮想マシン名 --name, -n 名前 (ステップ 5)
割り当てる RAM (MiB) --ram, -r メモリー (RAM) (ステップ 3)
ストレージ - ストレージメディアの指定 --disk Enable storage for this virtual machine → Create a disk image on the computer's hard drive, or Select managed or other existing storage(step 4)
ストレージ: ホストディレクトリーをゲストにエクスポートします。 --filesystem この仮想マシンのストレージの有効化 → Select managed または他の既存のストレージ(手順 4)
ストレージ - ゲストでローカルディスクストレージがありません。 --nodisks 「この仮想マシンにストレージデバイスを割り当てます。」チェックボックスの選択解除 (ステップ 4)
インストールメディアの場所 (ローカルインストール) --file ローカルインストールメディア → インストールメディアを使用している(steps 1-2)
ディストリビューションツリーを使用したインストール(ネットワークインストール) --location ネットワークインストール → URL(steps 1-2)
PXE を使用したゲストのインストール --pxe ネットワークブート (ステップ 1)
仮想 CPU 数 --vcpus CPU (ステップ 3)
ホストのネットワーク --network 「詳細なオプション (Advanced options)」ドロップダウンメニュー (ステップ 5)
オペレーティングシステムのバリアント/バージョン --os-variant バージョン (ステップ 2)
グラフィカル表示の方法 --graphics, --nographics * virt-manager は GUI インストールのみを提供

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

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

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. ifcfg スクリプトから固有のネットワークの詳細を削除するには、以下の設定を /etc/sysconfig/network-scripts/ifcfg-eth[x] にします
      1. HWADDR および静的行の削除
        注記
        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. DHCP 設定には、HWADDR や固有の情報が含まれないままであることを確認します。
        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. お客様のアイデンティティーコードを取得します。
            # 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 以前では、以下のコマンドを使用して、.unconfigured という名前のルートファイルシステムに空のファイルを作成します。
        # touch /.unconfigured
      • Red Hat Enterprise Linux 7 の場合は、以下のコマンドを実行して初回起動および initial-setup ウィザードを有効にします。
        # 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 コマンドは、コマンドラインで渡すことができるオプションを多数提供します。これらのオプションには、一般的なオプション、ストレージ設定オプション、ネットワーク設定オプションなどが含まれます。--original のみが必要になります。オプションの完全な一覧を表示するには、以下のコマンドを入力します。
# virt-clone --help
man ページの virt-clone には、各コマンドオプション、重要な変数、および例も説明されています。
以下の例は、デフォルトの接続で「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. open virt-manager

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

    図4.1 仮想マシンのクローンウィンドウ

    仮想マシンのクローンウィンドウ
  2. クローンを設定します。

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

      図4.2 MAC アドレスウィンドウの変更

      MAC アドレスウィンドウの変更
    • クローン作成されたゲスト仮想マシンのそれぞれのディスクに対して、以下のオプションのいずれかを選択します。
      • このディスクのクローン - クローン作成されたゲスト仮想マシンのディスクのクローン作成
      • ゲスト仮想マシン名と共にディスクを共有します。ディスクは、クローン作成されるゲスト仮想マシンとそのクローンで共有されます。
      • 詳細: ディスクの新しいパスを選択できるストレージパスの変更ウィンドウを開きます。

        図4.3 ストレージパスウィンドウの変更

        ストレージパスウィンドウの変更
  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 は 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 であった場合、hda、hdb、または h dc と同様のターゲットがあります。bus=virtio に変更する場合は 、それに応じてターゲットをvda、vdb、またはdNSName に変更する必要があります
    <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-manager、virsh attach-disk、または virsh attach-interface は、virtio ドライバーを使用して新しいデバイスを追加できます。
Virtio の使用に関する詳細は、libvirt の Web サイトを参照してください。 http://www.linux-kvm.org/page/Virtio

5.2. 新規ストレージデバイスでの KVM virtio ドライバーの使用

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

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

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

    ハードウェアタイプ としてストレージ を選択します。

    図5.1 Add new virtual hardware ウィザード

    Add new virtual hardware wizard with Storage selected as the hardware type.
  5. ストレージデバイスおよびドライバーを選択します。

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

    図5.2 Add New Virtual Hardware ウィザード

    Add new virtual hardware wizard Storage ウィンドウ(コンピューターのハードドライブのハードドライブにディスクイメージの作成)が選択されています。
    Finish をクリックして 手順を完了します。

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

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

    ハードウェアタイプ として Network を選択します。

    図5.3 Add new virtual hardware ウィザード

    Add new virtual hardware wizard with Network selected as the hardware type.
  5. ネットワークデバイスおよびドライバーを選択します。

    virtio ドライバーを使用するようにデバイスモデルを virtio に設定します。必要な ホストデバイス を選択します。

    図5.4 Add new virtual hardware ウィザード

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

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

ネットワークインターフェースが KVM virtio ドライバーを使用する場合、KVM は、処理のオーバーヘッドを削除し、ゲストのパフォーマンスを増大させるネットワークハードウェアをエミュレートしません。Red Hat Enterprise Linux 7 では、virtio がデフォルトのネットワークインターフェース種別として使用されます。ただし、システムでこの設定が異なる場合は、以下の手順を使用できます。
  • virtio ネットワークデバイスをゲストに割り当てるには 、virsh attach-interface コマンドに model --virtio オプションを使用します。
    または、virt-manager インターフェースで、ゲストの仮想ハードウェアの詳細画面に移動し、ハードウェア の追加 をクリックします。Add New Virtual Hardware 画面で Network を選択し、デバイスモデルvirtio に変更します。
  • 既存のインターフェースの種類を virtio に変更するには 、virsh edit コマンドを使用して、目的のゲストの XML 設定を編集し、モデルタイプ属性を 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 インターフェースで、ゲストの仮想ハードウェア情報画面に移動し、NIC 項目を選択し 、Device modelvirtio に変更します。
注記
ゲスト内のネットワークインターフェースの命名の一貫性が保たれていない場合は、ゲストに提示されるすべてのインターフェースが同じデバイスモデルの一部 (virtio-net )となるようにしてください。詳細は、Red Hat ナレッジベース を参照してください。

第6章 ネットワーク設定

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

6.1. libvirt を使用した Network Address Translation (NAT)

ネットワーク接続を共有する最も一般的な方法の 1 つは、Network Address Translation (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 は、INPUT、FORWARD、OUTPUT、および POSTROUTING チェーンで、ゲスト仮想マシンの virbr0 デバイスへの/接続を許可する iptables ルールを追加します。次に libvirtip_forward パラメーターの有効化を試みます。他のアプリケーションによっては ip_forward を無効にする可能性があるため、最適なオプションは /etc/sysctl.conf に追加します。
 net.ipv4.ip_forward = 1

ゲスト仮想マシンの設定

ホストの設定が完了すると、ゲスト仮想マシンをその名前に基づいて仮想ネットワークに接続できます。ゲストを「デフォルト」仮想ネットワークに接続するには、ゲストの 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 プロセス)およびカーネルに virtio パケット処理タスクを移動することで仮想化のオーバーヘッドを軽減します (vhost-net ドライバー)。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 zero-copy の有効化

Red Hat Enterprise Linux 7 では、vhost-net のゼロコピーはデフォルトで無効になっています。このアクションを永続的に有効にするには、以下のコンテンツで新しいファイル vhost-net.conf/etc/modprobe.d に追加します。
options vhost_net  experimental_zcopytx=1
これを再度無効にする場合は、以下を実行できます。
modprobe -r vhost_net
modprobe vhost_net experimental_zcopytx=0
1 つ目のコマンドは古いファイルを削除し、2 つ目のファイルが新しいファイル(上記のように)を作成し、zero-copy を無効にします。有効にすることもできますが、変更は永続的ではありません。
これが有効になっていることを確認するには、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 ネットワークガイド』を参照してください

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

ブリッジネットワークは、仮想化管理ツールとは関係なく、Red Hat Enterprise Linux ホストの仮想マシンに設定することができます。この設定は、仮想化ブリッジがホストのネットワークインターフェースである場合や、ホストの管理ネットワークインターフェースである場合に主に推奨されます。

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

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

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

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

    図6.1 ブリッジの追加

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

    図6.2 ブリッジの追加

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

6.4.3. libvirt でのブリッジネットワーク

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

第7章 KVM を使用したオーバーコミット

7.1. はじめに

KVM ハイパーバイザーは、CPU とメモリーを自動的にオーバーコミットします。つまり、システムに物理リソースよりも多くの仮想 CPU とメモリーを仮想マシンに割り当てることができます。これは、ほとんどのプロセスが、割り当てられたリソースを常に 100% にアクセスできないために可能です。
その結果、使用率の低い仮想化サーバーまたはデスクトップを少ないホストで実行できます。これにより、複数のシステムリソースを節約し、サーバーハードウェアで権限が少なくなります。

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

KVM ハイパーバイザーで実行しているゲスト仮想マシンには、物理 RAM の専用ブロックが割り当てられていません。代わりに、各ゲスト仮想マシンは Linux プロセスとして機能し、ホストの物理マシンの Linux カーネルが、要求される場合にのみメモリーを割り当てます。ホストのメモリーマネージャーに加えて、ゲスト仮想マシンのメモリーを独自の物理メモリーとスワップ領域間で移動できます。
オーバーコミットには、すべてのゲスト仮想マシンおよびホストの物理マシンのプロセスに十分なメモリーに対応するために、ホストの物理マシンで十分な swap 領域が必要になります。基本的なルールとして、ホスト物理マシンのオペレーティングシステムには、最大 4 GB のメモリーと最小 4 GB のスワップ領域が必要です。swap パーティションに適したサイズを判断する方法は、Red Hat ナレッジベースを参照してください
重要
オーバーコミットは、一般的なメモリー問題には理想的なソリューションではありません。メモリー不足の処理の推奨方法は、ゲストごとにメモリー量を割り当て、ホストに物理メモリーを追加したり、swap 領域を利用する方法が推奨されます。
仮想マシンは、スワップが頻繁に発生する場合は時間がかかります。また、オーバーコミットにより、システムがメモリー不足(OOM)が実行される可能性があり、Linux カーネルが重要なシステムプロセスをシャットダウンする可能性があります。メモリーをオーバーコミットする場合には、十分なテストが実行されます。オーバーコミットに関するサポートについては、Red Hat サポートにお問い合わせください。
オーバーコミットはすべての仮想マシンでは機能しませんが、最小限の集約型の使用方法を持つデスクトップ仮想化の設定作業や、KSM で同一のゲストを複数実行するために確認されています。KSM およびオーバーコミットの詳細は、『Red Hat Enterprise Linux 7 仮想化のチューニングと最適化ガイド』を参照してください
重要
メモリーのオーバーコミットは、デバイスの割り当てではサポートされていません。これは、デバイスの割り当て が使用されている場合は、割り当てられたデバイスで直接メモリーアクセス(DMA)を有効にするために、すべての仮想マシンメモリーが静的に割り当てられている必要があるためです。

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

KVM ハイパーバイザーは、仮想化 CPU(vCPU)のオーバーコミットに対応します。仮想化 CPU は、ゲスト仮想マシンが許可するような負荷制限があるため、オーバーコミットできます。ほぼ 100% を読み込むと要求がドロップされる可能性があるため、仮想 CPU をオーバーコミットする場合は注意が必要です。
Red Hat Enterprise Linux 7 では、対称型マルチプロセッシング(SMP)仮想マシンと呼ばれる、複数の vCPU を持つゲストをオーバーコミットできます。ただし、物理 CPU に存在するよりも多くのコアを実行する場合は、パフォーマンスが低下する可能性があります。
たとえば、4 つの vCPU を持つ仮想マシンは、デュアルコアプロセッサーがクアッドコアホストであるホストマシンでは実行しないでください。SMP 仮想マシンのオーバーコミットすると、処理コア数を超えた SMP 仮想マシンが、プログラムが必要以上の CPU 時間が短縮されるため、パフォーマンスが大幅に低下します。また、物理プロセッサーコアごとに、10 個以上の仮想 CPU を割り当てることは推奨されません。
SMP ゲストでは、一部の処理オーバーヘッドが継承されます。リソースをゲストに割り当てるために時間を確保することで、ゲスト内で CPU 間の通信が遅くなるため、CPU のオーバーコミットにより SMP のオーバーヘッドが増大する可能性があります。このオーバーヘッドは、仮想 CPU の数が多いゲストや、オーバーコミットの比率が大きい場合に増加します。
1 台のホストに複数のゲストがあり、各ゲストにホスト CPU の数と比較して、仮想 CPU 数はオーバーコミットされます。KVM は、1 台のホストで 5 つの vCPU(5 台の仮想マシン)の物理 CPU の比率で 100% で負荷のあるゲストを安全にサポートする必要があります。KVM ハイパーバイザーはすべての仮想マシン間で切り替わり、負荷がバランスになっていることを確認します。
Red Hat は、最適なパフォーマンスを得るために、ゲストを各ゲスト内で実行するのに必要な仮想 CPU をいくつだけに割り当てることを推奨します。
重要
100% メモリーまたは処理リソースを使用するアプリケーションがオーバーコミット環境では不安定になる可能性があります。CPU のオーバーコミット比率と SMP の量はワークロードに依存するため、テストを広範囲にせず、本番環境でメモリーまたは CPU をオーバーコミットしないでください。

第8章 KVM ゲストの管理

仮想化は、ゲスト仮想マシンでの時間管理にいくつかの課題を伴います。
  • すべてのゲスト仮想マシンに、割り込みを常に同時に配信することはできません。これは、仮想マシンの割り込みが割り込みが true ではないのでです。代わりに、ホストマシンによってゲスト仮想マシンに挿入されます。
  • ホストは別のゲスト仮想マシン(または別のプロセス)を実行する場合があります。そのため、通常、割り込みで必要な正確なタイミングは常に実行可能なとは限りません。
正確な時間を維持することなくゲスト仮想マシンが問題となる可能性があり、セッションの有効性、移行、その他のネットワークアクティビティーはタイムスタンプに依存して正しい状態になる可能性があります。
KVM は、準仮想化クロック(kvm-clock)でゲスト仮想マシンを提供することにより、これらの問題を回避できます。ただし、ゲストのマイグレーションなど、不正確な保持時間を維持することで影響を受ける可能性のあるアクティビティーを試みる前に、タイミングをテストすることが重要になります。
重要
上記の問題を回避するには、ネットワークおよびゲスト仮想マシンで Network Time Protocol(NTP)を設定する必要があります。Red Hat Enterprise Linux 6 以前を使用するゲストでは、NTP は ntpd サービスにより実装されます。詳細は、『Red Hat Enterprise 6 デプロイメントガイド』を参照してください
Red Hat Enterprise Linux 7 を使用するシステムでは、ntpd または chronyd サービスにより、NTP 時間同期サービスを提供できます。Chrony には、仮想マシンに関する利点があります。詳細は、『 Red Hat Enterprise Linux 7 システム管理者のガイド』の「 chrony スイートを 使用した NTP 設定」および 「 ntpd を使用した NTP の設定」セクションを参照してください。

ゲスト仮想マシンの時刻同期の mechanics

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

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

Constant Time Stamp Counter(TSC)

最新の Intel および AMD CPU は、一定の Time Stamp Counter(TSC)を提供します。定数 TSC のカウント頻度は、CPU コア自体が省電力ポリシーに準拠する頻度は変わることはありません。KVM ゲストのクロックソースとして TSC を使用するには、常に TSC 周波数がある CPU が必要です。

constant_tsc フラグが存在する場合は、CPU に定数 Time Stamp Counter があります。CPU に constant_tsc フラグがあるかどうかを確認するには、以下のコマンドを実行します。
$ cat /proc/cpuinfo | grep constant_tsc
出力を指定すると、CPU には constant_tsc ビットがあります。出力がない場合は、以下の手順に従います。

Constant Time Stamp Counter のないホストの設定

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

重要
これらの手順は、AMD リビジョン F CPU のみを対象としています。
CPU に constant_tsc ビットがない場合は、電源管理機能をすべて無効にします。各システムには、時間を維持するために使用するタイマーが複数あります。TSC はホストで安定していません。これは、CPUfreq の変更、ディープ C 状態、またはより高速な TSC のホストへの移行によって引き起こされたことにあります。ディープ C スリープ状態は TSC を停止できます。 カーネルがディープ C 状態を使用しないため、カーネル起動に processor.max_cstate=1 を追加します。この変更を永続的にするには、/etc/default/grubファイルの 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 電源管理ガイド』を参照してください

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. chrony 設定への参照として /dev/ptp0 クロックを追加します。
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. chrony デーモンを再起動します。
    # systemctl restart chronyd
  4. ホストとゲストの時刻同期が正しく設定されていることを確認するには、ゲストで 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 バージョン ゲストの追加カーネルパラメーター
AMD64 および Intel 64 システム上の 7.0 およびそれ以降 (kvm-clock を実行) 追加のパラメーターは必要ありません
kvm-clock 搭載の AMD64 システムおよび Intel 64 システムでは、6.1 以降 追加のパラメーターは必要ありません。
kvm-clock 搭載の AMD64 システムおよび Intel 64 システムで 6.0 追加のパラメーターは必要ありません。
kvm-clock のない AMD64 システムおよび Intel 64 システムで 6.0 notsc lpj=n
注記
lpj パラメーターには、ゲスト仮想マシンを実行する特定の CPU の jiffy 値ごとにループ と同じ数値が必要です。この値が分からない場合は、lpj パラメーターを設定しないでください。

8.3. steal Time Accounting

steal time は、ホストが提供していないゲスト仮想マシンに必要な CPU 時間です。ホストが、別のゲストにこのようなリソースを割り当てると、遅延が発生する時間が発生します。
時間が /proc/stat の CPU 時間フィールドに報告されます。topvmstat などのユーティリティーによって自動的に報告されます。これは「%st」または「st」列として表示されます。オフにできないことに注意してください。
多数の時間は CPU 競合を示し、ゲストのパフォーマンスが低下する可能性があります。CPU の競合を使用するには、ゲストの CPU 優先度または CPU クォータを増やしたり、ホスト上でゲストが少なくしたりします。

第9章 libvirt を使ったネットワーク起動

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

9.1. アプリケーションサーバーの準備

本章のステップを実行するには、以下が必要となります。
  • PXE サーバー (DHCP および TFTP) - これは libvirt 内部サーバー、手動設定のDHCP および TFTP、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. 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 ハイパーバイザーですべてのゲスト仮想マシン(VM)を自動的に検出するサブスクリプションエージェントをインストールする必要があります。これにより、ホストに配置されたマッピングファイルが作成されます。このマッピングファイルは、すべてのゲスト仮想マシンが以下の利点に対応するようにします。
  • 仮想システム固有のサブスクリプションはすぐに利用でき、関連するすべてのゲスト仮想マシンに適用できます。
  • ハイパーバイザーから継承できるサブスクリプションの利点はすべて読み取れており、関連するすべてのゲスト仮想マシンに適用できます。
注記
本章の情報は、Red Hat Enterprise Linux サブスクリプションのみに限定されます。Red Hat Virtualization のサブスクリプションまたは Red Hat Satellite サブスクリプションがある場合は、これらのサブスクリプションで提供される virt-who の情報を確認する必要があります。Red Hat Subscription Management の詳細は、カスタマーポータルの『Red Hat Subscription Management Guide』 も参照してください。

10.1. ホスト物理マシンへの virt-who のインストール

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

    ホスト物理マシンの root ユーザーとしてターミナルで subscription-manager register [options] コマンドを実行し、KVM ハイパーバイザーを登録します。# 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 インターフェースの システム セクションに移動します
    3. ハイパーバイザーの選択

      システム ページには、サブスクライブしている全システムの表があります。ハイパーバイザーの名前(例: localhost.localdomain)をクリックします。開いた詳細ページで、Attach a subscription をクリックし、一覧表示されるすべてのサブスクリプションを選択します。選択項目を追加 をクリックします。これにより、ゲストがサブスクリプションを活用できるように、ホストの物理サブスクリプションをハイパーバイザーに割り当てます。
  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                                             1 
    Provides Management: 	No
    Active: 		True
    Quantity Used: 		1
    Service Level:
    Service Type:
    Status Details:		Subscription is current                       2 
    Subscription Type:
    Starts: 		01/01/2015
    Ends: 			12/31/2015
    System Type: 		Virtual
    
    1
    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.
    2
    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 番目のページで、以下のオプションを選択します。
  • virt-who が報告先: Subscription Asset Manager
  • ハイパーバイザーのタイプ:libvirt
ウィザードに従って設定を完了します。設定が適切に実行されると、virt-who は指定されたハイパーバイザー上の既存および今後のゲストに選択したサブスクリプションを自動的に提供します。
ハイパーバイザー設定ファイルの詳細は、man ページの virt-who-config を参照してください。

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. Subscription Manager にログインします。

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

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

    ページを下方向にスクロールし、System リンクをクリックします
  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 でサブスクリプションを割り当てます。

    前のステップでコピーした Pool ID を使用して、attach コマンドを実行します。Pool IDXYZ123 を取得した Pool 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 時間後に、ハイパーバイザーのステータスは red と表示されます。この状況に対応するには、そのハイパーバイザーのサブスクリプションを取得する必要があります。または、ゲストをサブスクリプションのあるハイパーバイザーに永続的に移行します。

10.5.2. サブスクリプションのステータスエラーがあります。どうすればよいでしょうか?

シナリオ: 以下のエラーメッセージのいずれかが表示されます。
  • System not properly subscribed (システムが正しくサブスクライブされていません)
  • Status unknown (ステータス不明)
  • virt-who によるゲストからハイパーバイザーへのゲストのバインディング(ホスト/ゲストのマッピング)
このエラーの理由を確認するには、/var/log/rhsm/ ディレクトリーにある rhsm.log という virt-who ログファイルを開きます。

第11章 QEMU ゲストエージェントおよび SPICE エージェントを使用した仮想化の強化

QEMU ゲストエージェントや SPICE エージェントなど、Red Hat Enterprise Linux のエージェントは、システムでより最適に仮想化ツールの実行を図るためにデプロイ可能です。これらのエージェントは、本章で説明します。

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

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

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

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

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

QEMU ゲストエージェントは、実行中またはシャットダウン仮想マシンで設定できます。実行中のゲストに設定すると、ゲストはゲストエージェントをすぐに使い始める。ゲストがシャットダウンした場合、QEMU ゲストエージェントは次回の起動時に有効になります。
virsh または virt-manager を使用して、ゲストと QEMU ゲストエージェント間の通信を設定することができます。以下の手順では、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 QEMU ゲストエージェントと virt-managerでホスト間の通信の設定

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

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

    ゲストウィンドウの上部にある lightbulb アイコンをクリックして、仮想マシンのハードウェア情報を開きます。
    ハードウェアの追加 ボタンをクリックして 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
QEMU ゲストエージェントが rhel7 仮想マシンで設定されるようになりました。

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

QEMU ゲストエージェントをインストールすると、さまざまな libvirt コマンドがより強力なものになります。ゲストエージェントは、以下の virsh コマンドを強化します。
  • virsh shutdown --mode=agent - このシャットダウン方法は、QEMU ゲストエージェントで使用される virsh shutdown で、クリーンな状態で Cooperative ゲストをシャットダウンすることが保証されているため、virsh shutdown の方が信頼性が高くなります。エージェントが存在しない場合は、代わりに ACPI シャットダウンイベントの挿入に依存する必要がありますが、ゲストによってはそのイベントを無視するため、シャットダウンしません。
    virsh reboot に同じ構文と一緒に使用できます。
  • virsh snapshot-create --quiesce - スナップショットが作成される前に、ゲストが I/O を安定した状態にフラッシュできるようにします。これにより、一部のデータベーストランザクションを実行することなく、スナップショットを使用できます。ゲストエージェントは、ゲストが稼働させることで、高いレベルのディスクコンテンツの安定性を確保します。
  • virsh domfsfreeze および virsh domfsthaw: ゲストファイルシステムを分離してある。
  • virsh domfstrim - ゲストがファイルシステムをトリミングする。
  • virsh domtime - Queries か、ゲストのクロックを設定します。
  • virsh setvcpus --guest - ゲストがオフラインで、CPU を取得します。
  • virsh domifaddr --source エージェント - ゲストエージェント経由でゲストオペレーティングシステムの IP アドレスをクエリーします。
  • virsh domfsinfo - 実行中のゲストにマウントされたファイルシステムの一覧を表示します。
  • virsh set-user-password - ゲスト内のユーザーアカウントのパスワードを設定します。

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

libvirt qemu-guest-agent と通信して、ゲスト仮想マシンファイルシステムのスナップショットが内部内部かつ必要に応じて使用できる状態になるようにすることができます。ゲストシステム管理者は、アプリケーション固有の freeze/thaw フックスクリプトを作成およびインストールできます。ファイルシステムを解放する前に、qemu-guest-agent はメインフックスクリプト( qemu-guest-agent パッケージに含まれる)を起動します。解放プロセスでは、すべてのゲスト仮想マシンアプリケーションを一時的に非アクティブにします。
スナップショットプロセスは、以下の手順で構成されます。
  • ファイルシステムアプリケーション/データベースは、作業バッファーを仮想ディスクにフラッシュし、クライアント接続の受け入れを停止
  • アプリケーションはそれらのデータファイルを一貫性のある状態にします。
  • メインフックスクリプトが返されます。
  • qemu-guest-agent ファイルシステムをフリーズし、管理スタックがスナップショットを作成する
  • スナップショットの確認
  • ファイルシステムの機能が再開します。
Thaing は逆順で行われます。
ゲストファイルシステムのスナップショットを作成する場合は、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 ゲストエージェントパッケージの内容

ファイル名 説明
/usr/lib/systemd/system/qemu-guest-agent.service QEMU ゲストエージェントのサービス制御スクリプト(start/stop)。
/etc/sysconfig/qemu-ga QEMU ゲストエージェントの設定ファイルは、/usr/lib/systemd/system/qemu-guest-agent.service コントロールスクリプトで読み込まれるためです。この設定は、シェルスクリプトコメントを含むファイルに記載されています。
/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. ゲスト XML 設定に SPICE エージェントチャンネルを追加する

    ゲストの 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 実行中の Linux ゲストでの SPICE エージェントとホスト間の通信設定

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

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

    以下のコマンドを使用して、実行中の仮想マシン(この例では rhel7)に SPICE エージェントをアタッチします。
    # 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 エージェントチャンネルを追加する

    ゲストウィンドウの上部にある lightbulb アイコンをクリックして、仮想マシンのハードウェア情報を開きます。
    ハードウェアの追加 ボタンをクリックして 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
SPICE エージェントが rhel7 仮想マシンで設定されるようになりました。

第12章 ネストされた仮想化

12.1. 概要

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

12.2. 設定

以下の手順に従って、ネストされた仮想化の使用を有効化、設定、および開始します。
  1. Enable: 機能はデフォルトで無効になっています。これを有効にするには、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 (Hardware Virtualization) およびept (拡張ページテーブル)の場合
    • AMD の場合 - svm (vmx と同等)および npt (ept と同等)

パート II. 管理

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

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

13.1. ストレージの概念

ストレージプールは、ゲスト仮想マシンで使用するために作成できるストレージの量です。ストレージプールはストレージボリュームに分類されます。各ストレージボリュームは、ゲストバス上のブロックデバイスとしてゲスト仮想マシンに割り当てられます。
ストレージプールとボリュームは、libvirt を使用して管理されます。libvirtのリモートプロトコルを使用すると、ゲスト仮想マシンのライフサイクルのすべての側面やゲスト仮想マシンで必要なリソースの設定を管理できます。この操作は、リモートホストで実行できます。その結果、libvirtVirtual Machine Manager などの管理アプリケーションは、ユーザーがゲスト仮想マシンのホストの物理マシンを設定するために必要なすべてのタスクを実行できるようにします。これには、シェルアクセスやその他の制御チャネルを必要とせず、ゲスト仮想マシンの実行、シャットダウン、リソースの割り当てなどが含まれます。
libvirt API を使用して、ストレージプールのボリューム一覧を照会したり、ストレージプールの容量、割り当て、利用可能なストレージに関する情報を取得したりできます。ストレージプールのストレージボリュームは、スパースボリュームで異なる可能性がある割り当てや容量などの情報を取得するためにクエリーされることがあります。
ストレージプールがこれに対応する場合は、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. ストレージプールの使用

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

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

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.で作成した 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 コマンドで、ボリュームグループ usng をアクティブにします
    virsh pool-list コマンドを使用して、ストレージプールがアクティブであることを確認します。
    # 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. ストレージプールを確認します。

    ストレージプールが正しく作成され、報告されたサイズが期待どおりで、状態が 実行中 と報告されたことを確認します。ファイルシステムのターゲットパスに「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. 仮想マシンマネージャーでのストレージプールの作成

注記
ここでは、例としてディスクベースのストレージプールを作成します。

手順13.3 仮想マシンマネージャーでのストレージプールの作成

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

    これは、異なるタイプのストレージプールによって異なります。詳細はを参照してください 「ストレージプールの詳細」
    この例では、GUID パーティションテーブルでディスクを再ラベルする必要がある場合があります
  2. ストレージ設定を開きます。

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

      図13.1 ストレージタブ

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

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

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

      図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-as仮想マシンマネージャー
ストレージプールの種類 <pool type='dir'> [type] ディレクトリー dir: ファイルシステムディレクトリー
ストレージプールの名前 <name>name</name> [name] name 名前
ターゲットを指定するパス。ストレージプールに使用されるパスになります。

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

target path_to_pool ターゲットパス
以下は、/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 ディレクトリーに基づいてストレージプールを作成するための新規ストレージプールの追加 ダイアログボックスを示しています。

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

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

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

推奨情報
ディスクベースのストレージプールを作成する前に、以下の点に注意してください。
  • 使用されている libvirt のバージョンによっては、ディスクをストレージプール専用にすると、現在ディスクデバイスに保存されているすべてのデータが再フォーマットされて消去される可能性があります。ストレージプールを作成する前に、ストレージデバイスのデータのバックアップを作成することを強く推奨します。
  • ゲストには、ディスク全体またはブロックデバイス (/dev/sdbなど)への書き込みアクセス権を付与しないでください。パーティション( /dev/sdb1など)または LVM ボリュームを使用します。
    ブロックデバイス全体をゲストに渡すと、ゲストがパーティションに分割するか、独自の LVM グループを作成します。これにより、ホストの物理マシンがこれらのパーティションまたは LVM グループを検出し、エラーが発生する可能性があります。
前提条件
注記
本セクションの手順は、virsh pool-build コマンドを実行しなかった場合にのみ必要です。
ホストディスクにディスクベースのストレージプールを作成する前に、ディスクを GUID パーティションテーブル(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-as仮想マシンマネージャー
ストレージプールの種類 <pool type='disk'> [type] ディスク ディスク: 物理ディスクデバイス
ストレージプールの名前 <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 ターゲットパス
以下は、ディスクベースのストレージプールの 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 gpt --source-dev=/dev/sdb --target /dev
Pool phy_disk defined
以下のイメージには、ディスクベースのストレージプールを作成する、仮想マシンの XML設定の仮想マシンマネージャーの新規ストレージプールの追加 ダイアログボックスの例を示しています。

図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-as仮想マシンマネージャー
ストレージプールの種類 <pool type='fs'> [type] fs fs: 事前定義のブロックデバイス
ストレージプールの名前 <name>name</name> [name] name 名前
パーティションを指定するパス。たとえば、/dev/sdc1 です。

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

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

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

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

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

[target] path_to_pool ターゲットパス
以下は、ファイルシステムベースのストレージプールに対する 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設定の仮想マシンマネージャーで、ファイルシステムベースのストレージプールを作成する新規ストレージプールの追加 ダイアログボックスの例を示しています。

図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-as仮想マシンマネージャー
ストレージプールの種類 <pool type='gluster'> [type] gluster Gluster: Gluster ファイルシステム
ストレージプールの名前 <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 ソースパス
以下は、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 設定マネージャーの例を紹介します。

図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 修飾名 (IQN)が自動的に生成されます。
      • IQN およびサーバーを指定して create コマンドを実行します。以下に例を示します。
        # create iqn.2010-05.com.example.server1:iscsirhel7guest
  5. ポータルの IP アドレスの定義

    iSCSI でブロックストレージをエクスポートするには、ポータル、LUN、およびアクセス制御リストの ACL を先に設定する必要があります。
    ポータルには、ターゲットモニターする IP アドレスと TCP と、接続するイニシエーターが含まれます。iSCSI は、ポート 3260 を使用します。このポートは、デフォルトで設定されます。
    ポート 3260 に接続するには、以下を実行します。
    1. /tpg ディレクトリーに移動します。
    2. 以下のコマンドを実行します。
      # portals/ create
      このコマンドは、ポート 3260 をリッスンするすべての IP アドレスを有効にします。
      1 つの IP アドレスだけがポート 3260 をリッスンするようにするには、コマンドの最後に IP アドレスを追加します。以下に例を示します。
      # portals/ create 143.22.16.33
  6. LUN を設定し、ストレージオブジェクトをファブリックに割り当てます。

    この手順では、ストレージオブジェクトの 作成で作成されたストレージオブジェクト を使用します。
    1. # 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 はtiator で指定されるように変更することもできます。ターゲットとイニシエーターには一意の名前があります。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
      • すべてのイニシエーターに単一のユーザー 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.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 ストレージプールを保護するため、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 typeusernamesecret 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> 要素内の異なる場所に存在します。認証は一部のプールソース(iSCSI および RBD)のプロパティーであるため、<pool> では <auth><source> 要素内で指定されます。ドメインのサブ要素である <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-as仮想マシンマネージャー
ストレージプールの種類 <pool type='iscsi'> [type] iscsi iscsi: iSCSI ターゲット
ストレージプールの名前 <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 は、iscsi コマンドの virsh find-storage-pool-sources-as を使用して指定できます。
以下は、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 コマンドを使用してボリュームグループを作成します。
  • LVM ベースのストレージプールには、完全なディスクパーティションが必要です。この手順で新しいパーティションまたはデバイスをアクティベートすると、パーティションはフォーマットされ、すべてのデータが削除されます。ホストの既存のボリュームグループ(VG)を使用すると、何も消去されません。以下の手順を開始する前に、ストレージデバイスをバックアップすることが推奨されます。
  • 既存の VG に LVM ベースのストレージプールを作成する場合は、pool-build コマンドは実行しないでください。
ボリュームグループの準備が整ったら、ストレージプールを 定義してストレージプールの作成を継続します。
パラメーター
以下の表は、LVM ベースのストレージプールを作成するために XML ファイル、virsh pool-define-as コマンド、および Virtual Machine Manager アプリケーションに必要なパラメーターの一覧です。

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

説明XMLpool-define-as仮想マシンマネージャー
ストレージプールの種類 <pool type='logical'> [type] 論理 論理: LVM ボリュームグループ
ストレージプールの名前 <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
以下のイメージには、仮想マシン XML 設定マネージャーの、LVMベースのストレージプールを作成する新規ストレージプールの追加ダイアログボックスの例を、以下に示します。

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

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

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

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

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

説明XMLpool-define-as仮想マシンマネージャー
ストレージプールの種類 <pool type='netfs'> [type] netfs NETFS: ネットワークのエクスポートディレクトリー
ストレージプールの名前 <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 ターゲットパス
以下は、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 ベースのストレージプールを作成する新しいStorage Pool ダイアログボックスの仮想マシン XML 設定マネージャーの例を紹介します。

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

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

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

注記
仮想マシンマネージャーを使用して、SCSI デバイスを使用して vHBA ベースのストレージプールを作成することはできません。
推奨情報
NPIV(N_Port ID Virtualization)は、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 ストレージプールを使用することには 2 つの主な利点があります。
  • 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 構成で、ホストのデバイスを複数のゲストに公開することができません。
前提条件
SCSI デバイスを使用して vHBA ベースのストレージプールを作成する前に、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
    コマンドからの出力には、vHBA の作成に使用される <name><wwnn>、および <wwpn> フィールドが一覧表示されます。<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 の値は、表示されている HBA 手順13.10「vHBA の作成」
    <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 です。それ以外の場合は、物理ホストパスが使用されます。For example, /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0.一意の短いデバイスパスを使用すると、複数のストレージプールで、同じボリュームを複数のゲストに一覧表示できます。物理ホストのパスを複数のゲストで使用すると、デバイスタイプが重複していることを示す警告が発生することがあります。
注記
parent 属性は、パスを変更して、NPIV LUN の使用元となる物理 HBA の親を識別するには <adapter> フィールドで使用できます。このフィールド scsi_hostN は、親 ID を完了するために、vports 属性および max_vports 属性と組み合わされます。parentparent_wwnnparent_wwpn、または parent_fabric_wwn 属性は、ホストの再起動後に同じ HBA が使用されることを保証するさまざまなレベルを提供します。
  • parent を指定しないと、libvirt は NPIV に対応する最初の scsi_hostN アダプターを使用します。
  • parent のみを指定すると、設定に SCSI ホストアダプターを追加すると、問題が発生する可能性があります。
  • parent_wwnn または parent_wwpn を指定すると、ホストの再起動後に同じ HBA が使用されます。
  • parent_fabric_wwn を使用する場合、ホストの再起動後に、使用されている scsi_hostN に関係なく、同じファブリックで HBA が選択されます。
以下は、vHBA ベースのストレージプールの XML ファイルの例です。最初の例は、HBA にある唯一のストレージプールの例です。2 つ目の例は、vHBA を 1 つ使用し、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_wwnnparent_wwpn、または parent_fabric_wwn 属性を定義する方法を提供しません。
vHBA LUN を使用するように仮想マシンを設定する手順
vHBA のストレージプールを作成した後、vHBA LUN を仮想マシンの設定に追加する必要があります。
  1. 仮想マシンの XML で、仮想マシン上にディスクボリュームを作成します。
  2. <source> パラメーターで storage pool および storage 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 オプションを編集することが推奨されます。詳細は、「 ハードウェア障害後の公開される LUN への接続」を 参照してください。

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. 仮想マシンマネージャーでストレージプールの削除

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

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

本セクションでは、ストレージボリュームの使用方法を説明します。virsh コマンドおよび仮想マシンマネージャーを使用してストレージボリュームの作成、設定、および削除に関する概念、情報、および説明を提供します。

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 ファイルには、以下を含む特定のフィールドが含まれている必要があります。
    • 名前 - ストレージボリュームの名前。
    • 割り当て - ストレージボリュームのストレージ割り当ての合計数。
    • 容量 - ストレージボリュームの論理容量。ボリュームがスパースの場合、この値は 割り当て の値とは異なります。
    • ターゲット - ホストシステムのストレージボリュームのパス、さらに任意でそのパーミッションとラベル。
    以下は、ストレージボリューム定義の 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.で作成した 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. 仮想マシンマネージャーを使用したストレージボリュームの作成

手順13.11 仮想マシンマネージャーを使用したストレージボリュームの作成

  1. ストレージ設定を開きます。

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

      図13.11 ストレージタブ

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

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

    ボリューム 一覧の上にある ボタンをクリックします。ストレージボリュームの追加 ダイアログが表示されます。

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

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

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

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

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 バイト、データの書き込みを開始するストレージボリュームの位置。
  • --length - アップロードするデータのサイズの上限。
    注記
    local-file が指定の --length を超えると、エラーが発生します。

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

# virsh vol-upload sde1 /tmp/data500m.empty disk-pool
この例のde1 は、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 - ダウンロードされるデータ量の上限。

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

# virsh vol-download sde1 /tmp/data-sde1.tmp disk-pool
この例のde1 は、disk-pool ストレージプールのボリュームです。insde1 のデータは /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
容量はバイト単位で表現されます。このコマンドでは、ボリュームが置かれているストレージプールの名前または 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. 仮想マシンマネージャーを使用したストレージボリュームの削除

手順13.12 仮想マシンマネージャーを使用したストレージボリュームの削除

  1. ストレージ設定を開きます。

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

      図13.13 ストレージタブ

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

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

    1. ボタンをクリックします(ボリューム一覧を 格納 します)。確認ダイアログが表示されます。
    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. 仮想マシンマネージャーを使用したゲストへのストレージデバイスの追加

ストレージボリュームをゲスト仮想マシンに追加したり、デフォルトのストレージデバイスをゲスト仮想マシンに作成および追加することができます。
13.3.6.2.1. ストレージボリュームのゲストへの追加
ストレージボリュームをゲスト仮想マシンに追加するには、以下を行います。
  1. 仮想マシンハードウェア情報への Open Virtual Machine Manager

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

    図13.14 Virtual Machine Manager ウィンドウ

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

    図13.15 ハードウェアの詳細ウィンドウ

    ハードウェアの詳細ウィンドウ
  2. 新しい仮想ハードウェアの追加 ウィンドウを開く

    ハードウェアの追加 をクリックします。Add New Virtual Hardware ウィンドウが表示されます。
    ハードウェア種別ペインにストレージが選択されていることを確認します

    図13.16 新しい仮想ハードウェアの追加 ウィンドウ

    新しい仮想ハードウェアの追加 ウィンドウ
  3. ストレージボリュームの一覧を表示します。

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

    図13.17 Select Storage Volume ウィンドウ

    Select Storage Volume ウィンドウ
  4. ストレージボリュームの選択

    Select Storage Volume ウィンドウの左側の一覧からストレージプールを選択します。選択したストレージプールのストレージボリュームの一覧が、ボリューム の一覧に表示されます
    注記
    ストレージプールは Select Storage Volume ウィンドウから作成できます。「仮想マシンマネージャーでのストレージプールの作成」
    ボリューム リストからストレージボリュームを選択します
    注記
    Select Storage Volume ウィンドウでストレージボリュームを作成できます。「仮想マシンマネージャーを使用したストレージボリュームの作成」
    Choose Volume をクリックします。Select Storage Volume ウィンドウが閉じます。
  5. ストレージボリュームの設定

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

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

    図13.18 Virtual Machine Manager ウィンドウ

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

    図13.19 ハードウェアの詳細ウィンドウ

    ハードウェアの詳細ウィンドウ
  2. 新しい仮想ハードウェアの追加 ウィンドウを開く

    ハードウェアの追加 をクリックします。Add New Virtual Hardware ウィンドウが表示されます。
    ハードウェア種別ペインにストレージが選択されていることを確認します

    図13.20 新しい仮想ハードウェアの追加 ウィンドウ

    新しい仮想ハードウェアの追加 ウィンドウ
  3. ゲストのディスクを作成します。

    Create a disk image for the virtual machine オプションを確認します。
    仮想マシンオプションの Create a disk image ボタンの下の、テキストボックスに作成するディスクのサイズを入力します。
    Finish をクリックします。新しい仮想ハードウェアの追加 ウィンドウが閉じます。

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

ホスト SCSI LUN を完全にゲストに公開する方法は複数あります。SCSI LUN をゲストに公開すると、SCSI コマンドをゲストの LUN で直接実行する機能を提供します。これは、ゲスト間で LUN を共有する手段や、ホスト間でファイバーチャネルストレージを共有する手段に役立ちます。
SCSI LUN ベースのストレージプールの詳細は、「 SCSI デバイスを使用した vHBA ベースのストレージプール」を参照して ください。
重要
オプションの sgio 属性は、デバイス='lun' ディスクに対して、権限のない SCSI Generical I/O(SG_IO)コマンドがフィルターされるかどうかを制御します。sgio 属性は 'filtered' または ' unfiltered' として指定できますが、SG_IO ioctl コマンドが永続予約中のゲストを介して渡されるように、'unfiltered ' に設定する必要があります。
sgio='unfiltered を設定する場合に加え、<shareable> 要素はゲスト間で LUN を共有するように設定する必要があります。指定されていない場合、sgio 属性はデフォルトで 'filtered' に設定されます。
<disk> XML 属性 device='lun' は、以下のゲストディスク設定に対して有効です。
  • type='block' for <source dev='/dev/disk/by-{path|id|uuid|label}'/>
    <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> デバイス名内のコロンの前にあるバックスラッシュが必要です。
  • type='network' for <source protocol='iscsi'... />
    <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>
  • iSCSI または NPIV/vHBA ソースプールを SCSI ソースプールとして使用する場合は type='volume' と入力します。
    以下の 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= オプションはオプションですが、使用する場合は、'host' に設定し、' direct' を設定することはできません。「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
  • NPIV/vHBA ソースプールを SCSI ソースプールとして使用する場合は、type='volume' を入力します
    以下の XML 例は、SCSI ソースプールとして NPIV/vHBA ソースプール(名前: vhbapool_host3)を使用するゲストを示しています。
    <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 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 オプションを使用することもできます。これを使用して、デバイスをゲストにホットプラグすることもできます。
または、SCSI LUN ベースのストレージは、virt-manager を使用してゲスト上で接続または設定できます。virt-manager を使用してこれを設定するには、ハードウェアの追加 ボタンをクリックして必要なパラメーターで仮想ディスクを追加するか、またはこの画面から既存の SCSI LUN デバイスの設定を変更します。Red Hat Enterprise Linux 7.2 以降では、SGIO の値を virt-manager で設定することもできます。

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

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

ハードウェア障害後の公開される LUN への再接続

ハードウェア(ホストバスアダプターなど)の失敗により、公開された Fiber Channel(FC)LUN への接続が失われた場合、ハードウェア障害の修正後も、ゲストに公開された LUN が失敗する可能性があります。これを防ぐには、カーネルオプション dev_loss_tmo および fast_io_fail_tmo を編集します。
  • dev_loss_tmo は、SCSI デバイスが失敗した後に SCSI 層が待機してから、失敗としてマークする時間を制御します。タイムアウトを防ぐには、オプションを 2147483647 という最大値に設定することが推奨されます。
  • fast_io_fail_tmo は、SCSI デバイスが失敗した後に SCSI レイヤーが I/O に失敗します。カーネルが 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
    }
    
  • FC ホストまたはリモートポートのレベルで dev_loss_tmo および fast_io_fail を設定します。以下に例を示します。
    # 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 ストレージ管理ガイド』 の手順に従ってください

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

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

13.3.7.1. virsh で仮想マシンからのストレージの削除

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

13.3.7.2. 仮想マシンマネージャーを使用する仮想マシンからのストレージの削除

手順13.15 仮想マシンマネージャーを使用する仮想マシンからのストレージの削除

仮想マシンマネージャーを使用してゲスト仮想マシンからストレージを削除するには、以下を実行します。
  1. 仮想マシンハードウェア情報への Open 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
注記
選択した形式グループのみが整合性チェックをサポートします。これには、qcow2vdi、vhdx vmdk、qed が含まれ ます

14.2. イメージへの変更のコミット

qemu-img commit コマンドを使用して、指定したイメージファイル(imgname )に記録した変更をファイルのベースイメージにコミットします。オプションで、ファイルのフォーマットタイプ(fmt)を指定します。
 # qemu-img commit [-f fmt] [-T cache] imgname

14.3. イメージの比較

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

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

qemu-img map コマンドを使用すると、指定されたイメージファイル(imgname)およびそのバッキングファイルチェーンのメタデータをダンプできます。ダンプには、バッキングファイルチェーンでこれを割り当てる最上部にあるimgname(左端の)セクターの割り当て状態が表示されます。オプションで、ファイルのフォーマットタイプ(fmt)を指定します。
 # qemu-img map [-f fmt] [--output=fmt] imgname
出力形式、人間の形式、および json 形式には、以下の 2 つの出力形式があります。

14.4.1. ヒューマンフォーマット

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

14.4.2. json 形式

json オプションが指定されている場合、出力は JSON 形式のディクショナリーの配列を返します。ヒューマンオプションで提供される情報のほかに、出力には以下の情報が含まれます。
  • 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 Formats」
# qemu-img convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-S sparse_size] filename output_filename
-p パラメーターは、(すべてのコマンドに対してオプションではなく)コマンドの進捗を示し、-S フラグを使用するとディスクイメージ内に含まれるスパースファイルの作成が可能となります。ゼロ(つまり何もない)だけが含まれる物理ブロックを除く、標準ファイルと同様、すべての目的ファイルのスパースファイルを使用します。オペレーティングシステムがこのファイルを確認すると、それが存在するものとして扱い、実際のディスク領域を取得している場合でも、実際のディスク容量は引き継がれません。これは、ゲスト仮想マシンのディスクを作成する場合に特に便利です。これにより、ディスクはそれよりも多くのディスク領域を取得していると表示されました。たとえば、-S を 10Gb のディスクイメージで 50Gb に設定すると、10Gb のディスク領域のみが実際に使用されている場合でも、60Gb のディスク領域が 60Gb となります。
output_format 形式を使用して、ディスクイメージ filename をディスクイメージ output_filename に変換します。ディスクイメージはオプションで -c オプションで圧縮するか、-o encryption を設定することで -o オプションで暗号化できます。-o パラメーターで利用可能なオプションは、選択した形式とは異なることに注意してください。
qcow2 形式および qcow2 形式のみが、暗号化または圧縮に対応します。qcow2 暗号化は、安全な 128 ビットキーで AES 形式を使用します。qcow2 圧縮は読み取り専用であるため、圧縮したセクターが qcow2 形式から変換されると、圧縮されていないデータとして新しい形式に書き込まれます。
また、qcowcow などの拡張可能な形式を使用する場合も、イメージの変換が小さいイメージを取得するのに役立ちます。空のセクターは検出され、宛先イメージから抑制されます。

14.7. 新規イメージまたはデバイスの作成およびフォーマット

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

14.8. イメージ情報の表示

info パラメーターは、ディスクイメージのファイル名に関する情報を表示します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 リベースにより、イメージのバッキングファイルが変更されます。
# qemu-img rebase [-f fmt] [-T cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
バッキングファイルは backing_file に変更して (ファイル名の形式が機能をサポートする場合 )、バッキングファイル形式は backing_format に変更されています。
注記
qcow2 形式のみが、バッキングファイル(リベース)の変更に対応しています。
リベースが動作できる 2 つの異なるモード (安全 および unsafe)があります
セーフモードはデフォルトで使用し、実際のリベース操作を実行します。新しいバッキングファイルは古いファイルとは異なる場合があり、qemu-img rebase コマンドは 、ファイル名のゲスト仮想マシンに表示されるコンテンツを変更せずに維持します。そのために、ファイル名の backing_file と古いバッキングファイル 間で異なるクラスターは filename にマージされ、バッキングファイルへの変更が行われる前にファイル名にマージされます。
セーフモードはコストのかかる操作で、イメージ変換が困難である点に注意してください。正常に完了するには、古いバッキングファイルが必要です。
-u オプションが qemu-img リベースに渡されると 、安全でないモードが使用されます。このモードでは、ファイルコンテンツに対するチェックが行わ れなくても、バッキングのファイル名とファイル名の形式のみが変更され ます。新規バッキングファイルが正しく指定される場合や、イメージのゲストに表示されるコンテンツが破損していることを確認します。
このモードは、バッキングファイルの名前変更または移動に役立ちます。これは、アクセス可能な古いバッキングファイルなしで使用できます。たとえば、バッキングファイルがすでに移動しているか、名前が変更されたイメージを修正するために使用できます。

14.10. ディスクイメージのサイジング

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

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

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

14.12. サポートされている qemu-img Formats

qemu-img コマンドのいずれかに形式を指定すると、以下の形式を使用できます。
  • raw: Raw ディスクイメージの形式(デフォルト)。これは、最も高速なファイルベースの形式です。ファイルシステムが hole(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 「ターゲット要素の設定」
  • Bochs - ディスクイメージ形式をキャッシュします。
  • cloop - Linux Compressed Loop イメージは、Knoppix CD-ROMs などの直接圧縮された CD-ROM イメージのみを再利用する場合に便利です。
  • COW - ユーザーモードの Linux Copy On Write イメージ形式。cow 形式は、以前のバージョンとの互換性のためにのみ含まれています。
  • DMG - Mac ディスクイメージ形式。
  • NBD - ネットワークブロックデバイス
  • parallels - Parallels 仮想化ディスクイメージの形式。
  • QCOW: 以前の QEMU イメージ形式古いバージョンとの互換性のためにのみ含まれました。
  • QED: 古い QEMU イメージ形式。古いバージョンとの互換性のためにのみ含まれました。
  • vdi - Oracle VM VirtualBox のハードディスク形式
  • VHDX - Microsoft Hyper-V 仮想ハードディスク/X ディスクイメージ形式。
  • VMDK - VMware 3 および 4 と互換性のあるイメージ形式。
  • vvfat - Virtual VFAT ディスクイメージの形式。

第15章 KVM の移行

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

15.1. 移行の定義および利点

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

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 のヘルプとともに、異なるネットワーク設定とマウントディレクトリーを使用できます。プレホックの詳細は、libvirt のアップストリームドキュメントおよび XML オプションの詳細については、23章ドメイン XML の操作
  • パブリックブリッジ+tap ネットワークの既存のゲスト仮想マシンで移行を試行する場合、移行元および移行先ホストマシンが同じネットワークにある必要があります。そうでない場合は、移行後にゲスト仮想マシンのネットワークが動作しません。

移行の制限

  • ゲスト仮想マシンの移行には、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 ライブマイグレーションの互換性

移行の方法 リリースタイプ ライブマイグレーション対応の有無 注記
前方 メジャーリリース 6.5+ → 7.x 完全サポート 問題がある場合はご報告ください。
Backward メジャーリリース 7.x → 6.y サポート対象外
進むマイナーリリース7.x → 7.y(7.0 → 7.1)完全対応問題がある場合はご報告ください。
Backwardマイナーリリース7.y → 7.x(7.1 → 7.0)完全対応問題の報告

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

  • 移行プロトコルの問題: 後方互換性が「unknown」セクションエラーで終了すると、移行プロセスを繰り返すと、一時的なエラーになる可能性があるため、問題を修復できます。そうでない場合は、問題を報告します。
  • オーディオデバイスの問題 - Red Hat Enterprise Linux 6.x から Red Hat Enterprise Linux 7.y に移行する際に、es1370 audio カードに対応しなくなったことに注意してください。代わりに 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 ベースのストレージプール」
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. iptables の NFS のポート(例: 2049) のポートが開いていることを確認し、/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 です。
  • ピア2peer 移行: 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 にライブマイグレーションします。libvirt の完全なアクセスが必要であることを伝えるために、宛先 URL の最後に /system を追加します。
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    コマンドを実行すると、宛先システムの root パスワードの入力が求められます。
  3. wait

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

    宛先システムの host2.example.com から guest1-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 での移行に関する追加のヒント

各移行が別のコマンドシェルで実行される複数の同時ライブマイグレーションを実行できます。ただし、これは注意して実行する必要があり、各移行インスタンスはそれぞれの MAX_CLIENT(ソースおよびターゲット)を使用するため、注意して計算する必要があります。デフォルト設定が 20 の場合、設定を変更せずにインスタンスを 10 台実行するだけで十分です。手順15.1「libvirtd.conf の設定」
  1. の説明に従って、libvirtd.conf 手順15.1「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 つのクライアントを使用し、max_workers は実行フェーズに 1 つのワーカーを使用し、実行フェーズ中に宛先に 0 ワーカー、終了フェーズ中に 1 つのワーカーを使用します。
    重要
    max_clients および max_workers パラメーターの設定は、libvirtd サービスへのすべてのゲスト仮想マシン接続の影響を受けます。つまり、同じゲスト仮想マシンを使用しているユーザーであれば、同時に移行が行われているユーザーは max_clients および max_workers パラメーター設定に設定された制限も明確になります。このため、同時ライブマイグレーションを実行する前に、最大値を慎重に検討する必要があります。
    重要
    max_clients パラメーターは、libvirt に接続可能なクライアントの数を制御します。多数のコンテナーを一度に起動すると、この制限から簡単に到達して超過できます。これを回避するために max_clients パラメーターの値が増える可能性がありますが、これにより、インスタンスに対するサービス拒否(DoS)攻撃に対して脆弱となる可能性があります。この問題を軽減するために、Red Hat Enterprise Linux 7.0 に新しい max_anonymous_clients 設定が導入されました。この構成は、受け入れられても認証された接続の制限を指定するものです。max_clientsmax_anonymous_clients の組み合わせを実装して、ワークロードに応じて実装できます。
  4. ファイルを保存して、サービスを再起動します。
    注記
    起動した ssh セッションが多すぎるが、まだ認証されていないため、移行接続がドロップされる場合もあります。デフォルトでは、sshd は、いつでもセッションを「事前認証」するのを許可します。この設定は、sshd 設定ファイル(ここでは /etc/ssh/sshd_config)の MaxStartups パラメーターで制御されます。これには、調整が必要になる場合があります。DoS 攻撃(通常はリソースを過剰に活用)しないように制限があるため、このパラメーターを調整する際には注意してください。この値を高すぎると、その目的がなくなります。このパラメーターを変更するには、/etc/ssh/sshd_config ファイルを編集し、MaxStartups 行の先頭に # を削除し、10 (デフォルト値)を高い数に変更します。ファイルを保存して sshd サービスを再起動します。詳細は、man ページの sshd_config を参照してください。

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

virsh migrate では、--live オプションも使用できます。
  • --direct - 直接移行に使用されます。
  • --p2p - used for peer-to-peer migration
  • --tunneled - トンネル化した移行に使用されます。
  • --offline - 宛先でドメインを起動したり、移行元ホストで停止せずにドメイン定義を移行します。オフラインマイグレーションは、非アクティブなドメインと併用できます。また、--persistent オプションと併用する必要があります。
  • --persistent - ドメインを移行先ホストの物理マシンで永続化します。
  • --undefinesource - ソースホストの物理マシンのドメインの定義を解除します。
  • --suspend - 移行先ホストの物理マシンでドメインが一時停止したままになります。
  • --change-protection - 移行中に互換性のない設定変更がドメインに加えられないように強制します。このフラグは、ハイパーバイザーでサポートされる場合に暗黙的に有効になりますが、ハイパーバイザーで変更した保護サポートがない場合、このフラグを明示的に使用して移行を拒否することができます。
  • --unsafe - 移行を強制し、すべての安全手順を無視します。
  • --verbose - 発生時に移行の進捗を表示します。
  • --compressed - ライブマイグレーション中に繰り返し転送する必要があるメモリーページの圧縮を有効にします。
  • --abort-on-error - 移行中にソフトエラー(例: I/O エラー)が発生した場合に移行を取り消します。
  • --domain [name] - ドメイン名、id、または uuid を設定します。
  • --desturi [URI]: クライアント(通常の移行)またはソース(p2p migration)で表示される宛先ホストの接続 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/sec の移行帯域幅を設定します。
  • virsh migrate-getspeed [domain] - 指定したドメインの Mib/sec で利用可能な最大移行帯域幅を取得します。
詳細は、man 移行の制限 virsh を参照してください。

15.6. virt-manager での移行

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

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

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

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

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

    図15.2 パスワードを入力してください

    パスワードを入力してください
  3. 共有ストレージの設定

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

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

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

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

    図15.4 進捗ウィンドウ

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

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

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

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

Red Hat Enterprise Linux 7 は、ゲスト仮想マシンの 3 つのクラスのデバイスをサポートします。
  • エミュレートされたデバイスは、真理的なハードウェアを模倣した仮想デバイスで、標準のインボックスドライバーを使用して、ゲストオペレーティングシステムでそれらと連携できるようにします。
  • VirtIO デバイス (準仮想化とも呼ばれる)は、仮想マシンで最適に機能するように設計された仮想デバイスです。virtio デバイスはエミュレートされたデバイスと似ていますが、Linux 以外の仮想マシンにはデフォルトで必要なドライバーが含まれません。仮想マシンマネージャー(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 スロットを仮想マシンに公開する設定は、スナップショット以外のアプリケーションのみに推奨されます。
注記
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼できる環境では、管理者は vfio_iommu_type1 モジュールに allow_unsafe_interrupts オプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。これは、.conf ファイル(例: local.conf)を、以下の内容を含む /etc/modprobe.d に追加して永続的に実行できます。
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 デバイスの割り当てが可能になりました。

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

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

手順16.3 virsh でゲスト仮想マシンへの PCI デバイスの割り当て

  1. デバイスの特定

    まず、仮想マシンへのデバイスの割り当て用に指定された PCI デバイスを特定します。lspci コマンドを使用して、利用可能な PCI デバイスを一覧表示します。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 で使用される全識別子を検出する必要があります。
    これには、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 ルートポート、スイッチポート、ブリッジなどの非エンドポイントデバイスは、ホストドライバーから切り離してはならず、エンドポイントの割り当てを干渉しません。
    IOMMU グループ内のデバイスは、virsh nodedev-dumpxml 出力の iommuGroup セクションを使用して判断できます。グループの各メンバーは、別個の "address" フィールドで提供されます。この情報は、次の使用による 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 デバイスには、オプションの読み取り専用メモリー(ROM)モジュール (オプション ROM または拡張 ROM とも呼ばれる)が含まれており、デバイスのファームウェアやブートドライバー(PXE など)を配信することができます。通常、PCI デバイスの割り当てを使用して物理 PCI デバイスを仮想マシンに割り当てる際に、このオプション ROM も仮想化環境で機能します。
    ただし、オプション ROM は不要な場合があり、これにより仮想マシンが起動速度が遅くなったり、デバイスが提供するブート前のドライバーが仮想化と互換性のない可能性があります。これにより、ゲスト OS の起動が失敗する可能性があります。このような場合、Red Hat は、仮想マシンから ROM オプションをマスクさせることを推奨します。これを行うには、以下の手順を実施します。
    1. ホストで、割り当てるデバイスに BAR(拡張 ROM ベースアドレスレジスター)があることを確認します。これには、デバイスの 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 デバイスの割り当て

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

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

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

    ゲスト仮想マシンを開き、ハードウェアの追加 ボタンをクリックして、新しいデバイスを仮想マシンに追加します。

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

    トップタスクバーと Overview の左側にあるメニューで選択した情報ボタンのある仮想マシンのハードウェアウィンドウ。
  2. PCI デバイスの選択

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

    図16.4 Add new virtual hardware ウィザード

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

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

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

    左側のメニューペインで選択した上位タスクバーと概要で情報ボタンが選択した仮想マシンのハードウェアウィンドウが表示され、左側のメニューペインの仮想マシンデバイスの一覧に新しい追加した PCI デバイスが表示されます。
注記
デバイスの割り当てに失敗する場合、ホストにアタッチされている同じ IOMMU グループ内に他のエンドポイントが存在する可能性があります。virt-manager を使用してグループ情報を取得する方法はありませんが、virsh コマンドを使用して IOMMU グループの境界を分析できます。また、必要に応じて、squester デバイスを使用します。
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
  2. デバイスの追加

    virsh nodedev コマンドの出力を --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 デバイスが管理モードにある場合は (ドメイン XML ファイルの managed='yes' パラメーターを使用して設定)、ゲストマシンに接続してゲスト仮想マシンからデタッチし、必要に応じてホストマシンに再アタッチします。PCI デバイスが管理モードにない場合は、PCI デバイスをゲスト仮想マシンから切断し、virsh または virt-manager で再接続できます。

手順16.6 virsh でゲストから PCI デバイスのデタッチ

  1. デバイスの接続を解除します。

    ゲストの XML ファイルを削除して、以下のコマンドで 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 デバイスの詳細および削除ボタン。
    削除 ボタンをクリックして確定します。デバイスがホストで利用できるようになりました。

16.1.5. PCI ブリッジ

PCI(peripheral Component Interconnects)ブリッジは、ネットワークカード、モデム、サウンドカードなどのデバイスにアタッチするために使用されます。物理対応と同様に、仮想デバイスを PCI Bridge にもアタッチできます。以前は、すべてのゲスト仮想マシンに 31 個の PCI デバイスしか追加できませんでした。31st PCI デバイスが追加されると、PCI ブリッジが 31st スロットに自動的に配置され、追加の PCI デバイスを PCI ブリッジに移動するようになりました。各 PCI ブリッジには 31 スロットが追加されたので、このデバイスはすべてブリッジが可能です。これにより、ゲスト仮想マシンで 900 を超えるデバイスを利用できます。
PCI ブリッジの XML 設定例については、「 ドメイン XML の例」を参照してください。この設定は自動で設定されており、手動で調整することは推奨されません。

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

PCI デバイスの割り当て(PCI デバイスを仮想マシンにアタッチ)では、PCI デバイスのデバイス割り当てを有効にするために AMD IOMMU または Intel VT-d サポートを持つホストシステムが必要です。
Red Hat Enterprise Linux 7 では、ゲストデバイスドライバーによる PCI 設定領域へのアクセスが限定されています。この制限により、ドライバーが拡張された PCI 設定領域にあるデバイス機能に依存する可能性があり、設定に失敗することがあります。
Red Hat Enterprise Linux 7 仮想マシンごとに割り当てられたデバイスの合計は 32 に制限されます。これにより、仮想マシンに存在する PCI ブリッジの数や、マルチ機能スロットの作成方法にかかわらず、PCI 機能の合計が 32 合計に変換されます。
デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼できる環境では、管理者は vfio_iommu_type1 モジュールに allow_unsafe_interrupts オプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。これは、.conf ファイル(例: local.conf)を、以下の内容を含む /etc/modprobe.d に追加して永続的に実行できます。
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 ネットワークデバイス <(ソース要素で指定> )は、ダイレクトデバイス割り当て (パススルーと呼ばれることもある)を使用してゲストに直接接続できます。 標準のシングルポート PCI イーサネットカードドライバー設計の制限により、SR-IOV (Single Root I/O Virtualization ) 仮想機能(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)によって開発され、Single Root I/O Virtualization(SR-IOV)仕様は、1 つのデバイスを複数の仮想マシンに共有できる PCI デバイス割り当てタイプの標準です。SR-IOV により、仮想マシンのデバイスパフォーマンスが向上します。

図16.10 SR-IOV の仕組み

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

16.2.1. SR-IOV の利点

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

16.2.2. SR-IOV の使用

このセクションでは、SR-IOV 対応マルチポートネットワークカードの Virtual Function をネットワークデバイスとして仮想マシンに割り当てるための PCI パススルーの使用について説明します。
virsh edit または virsh attach-device コマンドで <hostdev> にデバイスエントリーを追加すると、SR-IOV Virtual Function(VF)を仮想マシンに割り当てることができます。ただし、通常のネットワークデバイスとは異なり、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 拡張をサポートするホストハードウェア
  • 割り当てられる仮想機能の PCI アドレス
重要
SR-IOV デバイスを仮想マシンに割り当てるには、ホストハードウェアが Intel VT-d または AMD IOMMU 仕様に対応している必要があります。
SR-IOV ネットワークデバイスを Intel または AMD システムに割り当てるには、以下の手順を実行します。

手順16.8 SR-IOV ネットワークデバイスをIntel または AMD システムに割り当てる

  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 仕様がまだ有効にされていない場合は有効にします。手順16.2「PCI デバイス割り当て用の AMD システムの準備」 で IOMMU の有効化に関する手順を参照してください。
  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. Virtual Function を永続化する

    リブート全体で Virtual Function を永続化するには、選択したエディターを使用して、以下のような 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. 新しい Virtual Function の検証

    lspci コマンドを使用して、Intel 82576 ネットワークデバイスに接続された、新しく追加した Virtual Function を一覧表示します。(代わりに grep を使用して Virtual Function を検索し、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 パラメーターと共に確認することができます。Physical Function は、0b:00.0 および 0b:00.1 に対応します。この説明では、すべての Virtual Function の 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
    Virtual Function および Physical Function の PCI アドレスは、一覧にする必要があります。
  7. virsh でデバイスの詳細を取得

    pci_0000_0b_00_0 は Physical Function の 1 つであり、pci_0000_0b_10_0 はその Physical Function 向けに最初に対応する Virtual Function です。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 の仮想マシンに Virtual Function pci_0000_03_10_2 を追加します。Virtual Function の 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 アドレスを指定しない場合、これは自動的に生成されます。<virtualport> 要素は、802.11Qbh ハードウェアスイッチに接続する場合にのみ使用されます。<vlan> 要素は、ゲストのデバイスを VLAN タグが 42 に透過的に設定します。
  8. 仮想マシンへの Virtual Function の追加

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

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

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

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

<mac<>、vlan、および> <virtualport> <要素は、hostdev> の子ではないため、MAC アドレス割り当て、vLAN タグ ID の割り当て、仮想ポートの割り当てなどの関数固有のアイテムには、hostdev <を使用することはできません。>代わりに、これらの要素は hostdev インターフェースタイプ: <interface type='hostdev'> で使用できます。このデバイスタイプは、<インターフェース> および <hostdev> のハイブリッドとして機能します。したがって、PCI デバイスをゲスト仮想マシンに割り当てる前に、libvirt は(MAC アドレスの設定、vLAN タグの設定、またはゲスト仮想マシンの XML 設定ファイル内の 802.1Qbh スイッチの設定)を示すネットワーク固有のハードウェア/スイッチを初期化します。vLAN 「vLAN タグの設定」
  1. Gather information

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

    # virsh shutdown guestVM
  3. XML ファイルを開いて編集します。

    virsh save-image-edit コマンドを実行して、編集するために XML ファイルを開きます (詳細は、--running オプションを参照 「ゲスト仮想マシン設定の編集」 )。この例の設定ファイルの名前は guestVM.xml です。
     # virsh save-image-edit guestVM.xml
    --running
    デフォルトのエディターで guestVM.xml が開きます。
  4. XML ファイルの編集

    設定ファイル(guestVM.xml) <を更新し、以下のようなデバイスエントリーを設定します>

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

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

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

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

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

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

    # virsh shutdown guestVM
  2. 設定ファイルを作成します。

    任意のエディターを使用して、/tmp ディレクトリーに XML ファイル(例: passthrough.xml )を作成します。pf dev='eth3' は、ご自分の SR-IOV デバイスの Physical Function (PF)の netdev 名に置き換えます。
    以下は、SR-IOV アダプターのすべての VF のプールとホストの物理マシンの PF(eth3')と共に利用可能なネットワーク定義の例です。

    図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. デバイス用のパススルーの開始

    単一デバイスのみが表示されていますが、libvirt はゲスト仮想マシンの初回起動時に、PF に関連付けられたすべての VF の一覧を自動的に派生させます。この起動には、以下のようなドメイン XML 内のインターフェース定義が使用されます。

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

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

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

    図16.14 XML ダンプファイルパススルーの内容

          
    <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 Gigabit Ethernet Controller(igb ドライバー)
  • Intel® 82576EB Gigabit Ethernet Controller(igb ドライバー)
  • Intel® 82599ES 10 Gigabit Ethernet Controller(ixgbe ドライバー)
  • Intel® 82599EB 10 Gigabit Ethernet Controller(ixgbe ドライバー)
他の SR-IOV デバイスが機能する可能性がありますが、リリース時にテストされていません。

16.3. USB デバイス

このセクションでは、USB デバイスの処理に必要なコマンドを扱います。

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

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

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

リダイレクトから特定のデバイスを絞り込み、フィルタープロパティーを -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 デバイス選択をクリックすると、「Some USB devices are blocked by host policy」というメッセージが表示されます。OK をクリックして確定し、続行します。
    フィルターは有効になります。
  6. フィルターが正常に USB デバイスベンダーおよび製品を適切に確認するには、ホスト物理マシンのドメイン XML で以下の変更を加えて、USB リダイレクトを許可します。
       <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>
  ...
<各コントローラーには必須属性コントローラーのタイプがあり>、次のいずれかでなければなりません。
  • IDE
  • fdc
  • scsi
  • sata
  • usb
  • ccid
  • virtio-serial
  • pci
<コントローラー要素には <>、バスコントローラーが発生した順序 <(アドレス要素のコントローラー属性に使用する> 10 進数の整数)を記述する必須の属性コントローラーインデックスがあります><controller type ='virtio-serial'> の場合に、2 つのオプションの属性 (名前ポートと ベクター )があり、コントローラーを介して接続できるデバイスの数を制御します。
<コントローラータイプが ='scsi'> の場合、任意の属性モデルがあり、以下の値を使用できます。
  • 自動
  • buslogic
  • ibmvscsi
  • lsilogic
  • lsisas1068
  • lsisas1078
  • virtio-scsi
  • vmpvscsi
<コントローラータイプが ='usb'> の場合、オプションの属性モデルモデルがあり、以下の値を使用できます。
  • piix3-uhci
  • piix4-uhci
  • ehci
  • ich9-ehci1
  • ich9-uhci1
  • ich9-uhci2
  • ich9-uhci3
  • vt82c686b-uhci
  • pci-ohci
  • nec-xhci
ゲスト仮想マシンで USB <バスを明示的に無効にする必要がある場合は、model='none'> を使用できます。 .
PCI バスまたは USB <バス上のデバイス自体のコントローラーの場合、オプションのサブ要素アドレスで>、コントローラーの正確な関係をマスターバスに指定できます(例: 「デバイスのアドレスの設定」
<オプションのサブ要素ドライバーは>、ドライバー固有のオプションを指定できます。現在、コントローラーにキューの数を指定する属性キューのみをサポートしています。最適なパフォーマンスを得るには、仮想 CPU の数に一致する値を指定することが推奨されます。
USB コンパニオンコントローラーには、オプションのサブ要素 <マスターがあり>、企業とマスターコントローラーへの正確な関係を指定します。コンパニオンコントローラーはマスターと同じバスにあるため、コンパニオンのインデックス値は同等でなければなりません
使用できる XML の例は次のとおりです。

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

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

PCI コントローラーには、以下のオプションのモデル属性があり、以下の値を使用できます。
  • pci-root
  • pcie-root
  • pci-bridge
  • dmi-to-pci-bridge
暗黙的な PCI バスを提供するマシンタイプでは、index='0' が設定された pci-root コントローラーが auto-added で、PCI デバイスを使用する必要があります。pci-root にはアドレスがありません。model='pci-root' によって提供される 1 つのバスに収まるデバイスまたはゼロよりも大きい PCI バス番号が指定されている場合は、PCI ブリッジは自動的に追加されます。PCI ブリッジは手動で指定することもできますが、アドレスはすでに指定された PCI コントローラーによって提供される PCI バスのみを認識する必要があります。PCI コントローラーインデックスにギャップを残すと、設定が無効である可能性があります。以下の XML <の例は、devices> セクションに追加できます。

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


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

図16.18 PCIe(PCI express)のドメイン XML の例

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

以下の XML 設定は、USB 3.0 / xHCI エミュレーションに使用されます。

図16.19 USB3/xHCI デバイスに対するドメイン XML の例

   
     ...
  <devices>
    <controller type='usb' index='3' model='nec-xhci'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0f' function='0x0'/>
    </controller>
  </devices>
    ...

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

<多くのデバイスには、任意でアドレスサブ要素があり>、デバイスがゲスト仮想マシンに提示される仮想バスに配置されています。アドレス(またはアドレス内の任意の属性)が入力で省略すると、libvirt は適切なアドレスを生成しますが、レイアウトをさらに制御する必要がある場合は明示的なアドレスが必要です。<アドレス要素が含まれるドメイン> XML デバイス例は、図16.9「PCI デバイス割り当ての XML の例」
すべてのアドレスには、デバイスがどのバス上にあるかを記述する必須の属性タイプです。特定のデバイスに使用するアドレスの選択は、デバイスおよびゲスト仮想マシンのアーキテクチャーによって制限されます。<たとえば、ディスクデバイスは> type='drive' <を使用し、コンソールデバイスは> i686 または x86_64 ゲスト仮想マシンアーキテクチャーでは type='pci' を使用します。各アドレスタイプには、テーブルで説明されているようにデバイスの配置先を制御する任意の属性があります。

表16.1 対応デバイスアドレスタイプ

アドレスタイプ 説明
type='pci' PCI アドレスには以下の追加属性が含まれます。
  • domain (2 バイト 16 進数整数。現在 qemu で使用されていません)
  • bus (0 から 0xff までの 16 進数値)
  • slot (0x0 から 0x1f までの 16 進数値)
  • function (0 から 7 までの値)
  • multifunction は、PCI コントロールレジスターに特定のスロット/機能のマルチファンクションビットをオンにするように制御します。この属性は、デフォルトで 'off' になりますが、マルチファンクションが使用されるスロットのファンクション 0 では 'on' に設定する必要があります。
type='drive' ドライブアドレスには、以下の追加属性が含まれます。
  • controller (2 桁のコントローラー番号)
  • bus (2 桁のバス番号)
  • target (2 桁のバス番号)
  • unit (バス上の 2 桁のユニット番号)
type='virtio-serial' それぞれの virtio-serial アドレスには、以下の追加属性があります。
  • コントローラー(2 桁のコントローラー番号)
  • バス(2 桁のバス番号)
  • slot (バス内の 2 桁のスロット)
type='ccid' smart-cards の CCID アドレスには、以下の追加属性が含まれます。
  • バス(2 桁のバス番号)
  • スロット属性(バス内の 2 桁のスロット)
type='usb' USB アドレスには以下の追加属性が含まれます。
  • bus (0 から 0xfff までの 16 進数)
  • port (1.2 または 2.1.3.1 などの最高 4 つのオクテットからなるドット区切りの表記)
type='isa' ISA アドレスには以下の追加属性が含まれます。
  • iobase
  • irq

16.6. 乱数ジェネレーターデバイス

オペレーティングシステムのセキュリティーには、乱数ジェネレーターが非常に重要です。仮想オペレーティングシステムのセキュリティーを保護するために、Red Hat Enterprise Linux 7 には virtio-rng が含まれています。仮想ハードウェアの乱数ジェネレーターデバイスでは、要求時に新しいエントロピーを提供することができます。
ホストの物理マシンで、ハードウェア RNG インターフェースは /dev/hwrng に chardev を作成し、これを開き、ホストの物理マシンからエントロピーをフェッチできます。rngd デーモンとの連携では、ホストの物理マシンからのエントロピーはランダム性のプライマリーソースであるゲスト仮想マシンの /dev/random にルーティングできます。
乱数ジェネレーターの使用は、キーボード、マウス、その他の入力などのデバイスが、ゲスト仮想マシンで十分なエントロピーを生成するのに十分な場合にとくに便利です。仮想乱数ジェネレーターデバイスを使用すると、ホストの物理マシンは、ゲスト仮想マシンのオペレーティングシステムにエントロピーを通過できます。 この手順は、コマンドラインまたは virt-manager インターフェースを使って実行できます。手順は、以下を参照してください。virtio-rng の詳細は、「Red Hat Enterprise Linux Virtual Machines: Access to Random Numbers Made Easy 」を参照してください。

手順16.11 Virtual Machine Manager を使用した virtio-rng の実装

  1. ゲスト仮想マシンをシャットダウンします。
  2. ゲスト仮想マシンを選択し、Edit メニューから Virtual Machine Details を選択し、指定されたゲスト仮想マシンの Details ウィンドウを開きます。
  3. ハードウェアの追加 ボタンをクリックします。
  4. Add New Virtual Hardware ウィンドウで RNG を選択し、Random Number Generator ウィンドウを開きます。

    図16.20 乱数ジェネレーターウィンドウ

    乱数ジェネレーターウィンドウ
    目的のパラメーターを入力し、終了したら「完了 」をクリックします。virtio-rng 要素

手順16.12 コマンドラインツールを使用した virtio-rng の実装

  1. ゲスト仮想マシンをシャットダウンします。
  2. virsh edit domain-name コマンドを使用して、目的のゲスト仮想マシンの XML ファイルを開きます。
  3. <devices> 要素を編集して以下を追加します。

    図16.21 乱数ジェネレーターデバイス

    
      ...
      <devices>
        <rng model='virtio'>
          <rate period='2000' bytes='1234'/>
          <backend model='random'>/dev/random</backend>
          <!-- OR -->
          <backend model='egd' type='udp'>
            <source mode='bind' service='1234'/>
            <source mode='connect' host='1.2.3.4' service='1234'/>
          </backend>
        </rng>
      </devices>
      ...
    乱数ジェネレーターデバイスは、以下の XML 属性および要素を許可します。

    virtio-rng 要素

    • <model> - 必要な model 属性は、RNG デバイスのタイプを指定します。
    • <バックエンドモデル>: <バックエンド要素は>、ゲストに使用するエントロピーのソースを指定します。ソースモデルは model 属性を使用して設定されます。サポートされているソースモデルには、'random' および 'egd' が含まれます。
      • <backend model='random'> - <このバックエンド種別は>、非ブロッキング文字デバイスが入力であることを想定します。このようなデバイスの例は、/dev/random および /dev/urandom です<ファイル名は、backend> 要素の内容として指定されます。ファイル名を指定しないと、ハイパーバイザーのデフォルトが使用されます。
      • <backend model='egd': このバックエンドは>、EGD プロトコルを使用してソースに接続します。ソースはキャラクターデバイスとして指定されます。詳細は、キャラクターデバイスホストの物理マシンインターフェース を参照してください。

16.7. GPU デバイスの割り当て

GPU をゲストに割り当てるには、以下のいずれかの方法を使用します。
  • GPU PCI デバイスの割り当て - この方法を使用すると、ホストから GPU デバイスを削除して、1 つのゲストに割り当てることができます。
  • NVIDIA vGPU Assignment: この方法により、物理 GPU から複数の 仲介デバイス を作成し、これらのデバイスを仮想 GPU として複数のゲストに割り当てることができます。これは、選択した NVIDIA GPU でのみサポートされ、単一のゲストに割り当てられる仲介デバイスは 1 つだけです。

16.7.1. GPU PCI デバイスの割り当て

Red Hat Enterprise Linux 7 は、VGA 以外のグラフィックデバイスとして、以下の PCIe ベースの GPU デバイスの PCI デバイス割り当てをサポートします。
  • Nvidia Quadro K-Series、M-Series、PSeries、および以降のアーキテクチャー(モデル 2000 シリーズ以降)
  • Nvidia Tesla K-Series, M-Series, and later architecture
現在、標準のエミュレートされた VGA インターフェースのいずれかに加えて、最大 2 つの GPU を仮想マシンに割り当てることができます。エミュレーションされた VGA は、起動前およびインストールに使用され、NVIDIA グラフィックドライバーが読み込まれると NVIDIA GPU が引き継ぎます。
GPU をゲスト仮想マシンに割り当てるには、ホストマシンで I/O Memory Management Unit(IOMMU) を有効にし、lspci コマンドを使用して GPU デバイスを特定し、ホストからデバイスの割り当て、ゲストにアタッチ、ゲストへの Xorg を設定します。

手順16.13 ホストマシンカーネルでの IOMMU サポートの有効化

  1. カーネルコマンドラインの編集

    Intel VT-d システムの場合は、intel_iommu=on および iommu=pt パラメーターをカーネルコマンドラインに追加して IOMMU をアクティベートします。AMD-Vi システムの場合、必要なオプションは iommu=pt のみになります。このオプションを有効にするには、以下のように GRUB_CMDLINX_LINUX 行を /etc/sysconfig/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"
    
  2. ブートローダー設定を再生成します。

    カーネルコマンドラインへの変更を適用するには、grub2-mkconfig コマンドを使用してブートローダー設定を再生成します。
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルは /etc/grub2-efi.cfg である必要があることに注意してください。
  3. ホストを再起動します。

    変更を有効にするには、ホストマシンを再起動します。
    # reboot

手順16.14 GPU デバイスのホスト物理マシンドライバーへのバインディングの除外

GPU 割り当ての場合、ホストドライバーはデバイスの動的なバインド解除をサポートしないことが多いため、デバイスをホストドライバーへのバインドから除外することをお勧めします。
  1. PCI バスアドレスを特定します。

    PCI バスアドレスおよびデバイスの ID を特定するには、以下の lspci コマンドを実行します。この例では、NVIDIA Quadro カードまたは GRID カードなどの VGA コントローラーが使用されます。
    # lspci -Dnn | grep VGA
    0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    
    生成される検索は、このデバイスの PCI バスアドレスが 0000:02:00.0 で、デバイスの PCI ID が 10de:11fa であることが示されます。
  2. ネイティブのホストマシンドライバーが GPU デバイスを使用しないように

    ネイティブのホストマシンドライバーが GPU デバイスを使用しないようにするには、pci-stub ドライバーと共に PCI ID を使用できます。そのためには、pci-stub.ids オプションを値として、/etc/sysconfig/grub 設定ファイルにある GRUB_CMDLINX_LINUX 行に追加します。以下に例を示します。
    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 pci-stub.ids=10de:11fa"
    
    pci-stub 用に新たな PCI ID を追加するには、それらをコンマで区切ります。
  3. ブートローダー設定を再生成します。

    このオプションを含めるために grub2-mkconfig を使用してブートローダー設定を再生成します。
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI ベースのホストを使用している場合は、ターゲットファイルは /etc/grub2-efi.cfg である必要があることに注意してください。
  4. ホストマシンを再起動します。

    変更を反映するために、ホストマシンを再起動します。
    # reboot

手順16.15 任意設定: GPU IOMMU 設定の編集

GPU デバイスを割り当てる前に、ゲスト上で GPU が適切に動作するよう IOMMU 設定の変更が必要になることがあります。
  1. GPU の XML 情報の表示

    XML 形式で GPU の設定を表示するには、pci_ を追加して区切り文字をアンダースコアに変換して PCI バスアドレスを libvirt 互換形式に変換する必要があります。この例では、( 前の手順で取得した)0000:02:00.0 バスアドレスで特定された GPU PCI デバイスが pci_0000_02_00_0 になります。virsh nodedev-dumpxml でデバイスの libvirt アドレスを使用して、XML 設定を表示します。
    # virsh nodedev-dumpxml pci_0000_02_00_0
    
    <device>
     <name>pci_0000_02_00_0</name>
     <path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path>
     <parent>pci_0000_00_03_0</parent>
     <driver>
      <name>pci-stub</name>
     </driver>
     <capability type='pci'>
      <domain>0</domain>
      <bus>2</bus>
      <slot>0</slot>
      <function>0</function>
      <product id='0x11fa'>GK106GL [Quadro K4000]</product>
      <vendor id='0x10de'>NVIDIA Corporation</vendor>
         <!-- pay attention to the following lines -->
      <iommuGroup number='13'>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      </iommuGroup>
      <pci-express>
       <link validity='cap' port='0' speed='8' width='16'/>
       <link validity='sta' speed='2.5' width='16'/>
      </pci-express>
     </capability>
    </device>
    XML の <iommuGroup> 要素をメモします。iommuGroup は、IOMMU 機能と PCI バストポロジーにより他のデバイスから分離されているデバイスのセットを示します。iommuGroup 内のすべてのエンドポイントデバイス(PCIe ルートポート、ブリッジ、またはスイッチポートではないデバイス)は、ゲストに割り当てるために、ネイティブホストドライバーからバインドを解除する必要があります。上記の例では、グループは GPU デバイス(0000:02:00.0)およびコンパニーオデバイス(0000:02:00.1)で構成されています。付録E IOMMU グループの使用
  2. IOMMU 設定の調整

    この例では、レガシー割り込みサポートのハードウェアの問題が原因で、NVIDIA オーディオ機能の割り当てには対応していません。また、GPU オーディオ機能は通常、GPU 自体を使用しないと役立ちません。したがって、GPU をゲストに割り当てるには、まずオーディオ機能をネイティブホストドライバーから分離する必要があります。これは、以下のいずれかを使用して実行できます。

手順16.16 GPU の割り当て

GPU は、以下のいずれかの方法でゲストに割り当てることができます。
  1. 仮想マシンマネージャーインターフェースの使用「virt-manager を使用した PCI デバイスの割り当て」
  2. GPU の XML 設定フラグメントを作成し、virsh attach-device で接続する。
    1. 以下のようにデバイスの XML を作成します。
      
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
    2. ファイルに保存して、virsh attach-device [domain] [file] --persistent を実行して、ゲスト設定に XML を追加します。割り当てられた GPU は、ゲストマシンの既存のエミュレートされたグラフィックスデバイスに加えて追加されます。割り当てられた GPU は、仮想マシンでセカンダリーグラフィックデバイスとして処理されます。プライマリーグラフィックデバイスとしての使用がサポートされず、ゲストの XML でエミュレートされたグラフィックスデバイスは削除しないでください。
  3. virsh edit コマンドを使用してゲスト XML 設定を編集し、適切な XML セグメントを手動で追加します。

手順16.17 ゲストでの Xorg 設定の統一

ゲストの GPU の PCI バスアドレスは、ホスト上で異なります。ホストが GPU を適切にを使用できるようにするには、ゲストの Xorg ディスプレイサーバーを設定し、割り当てられた GPU アドレスを使用するように設定します。
  1. ゲストで lspci コマンドを使用して、GPU の PCI バスアクres を決定します。
    # lspci | grep VGA
    00:02.0 VGA compatible controller: Device 1234:111
    00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
    
    この例では、バスアドレスは 00:09.0 です。
  2. ゲストの /etc/X11/xorg.conf ファイルで、以下のように検出されたアドレスを使用して BusID オプションを追加します。
    		Section "Device"
    		    Identifier     "Device0"
    		    Driver         "nvidia"
    		    VendorName     "NVIDIA Corporation"
    		    BusID          "PCI:0:9:0"
    		EndSection
    
    重要
    手順 1 で検出されたバスアドレスが 16 進数の場合は、区切り文字間の値を 10 進数システムに変換する必要があります。たとえば、00:0a.0 を PCI:0:10:0 に変換する必要があります。
注記
ゲストで割り当てられた NVIDIA GPU を使用する場合、NVIDIA ドライバーのみがサポートされます。その他のドライバーは機能せず、エラーを生成する可能性があります。Red Hat Enterprise Linux 7 ゲストでは、インストール時にカーネルコマンドラインで modprobe.blacklist=nouveau オプションを使用して、nouveau ドライバーをブラックリストに指定できます。 他のゲスト仮想マシンの詳細は、オペレーティングシステム固有のドキュメントを参照してください。
ゲストオペレーティングシステムによっては、NVIDIA ドライバーがロードされた場合、ゲストはエミュレートされたグラフィックスと割り当てられたグラフィックの両方を同時に使用してサポートするか、エミュレートされたグラフィックスを無効にする可能性があります。割り当てられたグラフィックフレームバッファーへのアクセスは、virt-manager などのアプリケーションでは提供されません。割り当てられた GPU が物理ディスプレイに接続されていない場合、GPU デスクトップにアクセスするためにゲストベースのリモーティングソリューションが必要な場合があります。すべての PCI デバイス割り当てと同様に、GPU が割り当てられたゲストの移行はサポートされず、各 GPU は単一のゲストによって排他的な所有されます。ゲストオペレーティングシステムによっては、GPU のホットプラグサポートを利用できます。

16.7.2. NVIDIA vGPU の割り当て

NVIDIA vGPU 機能により、物理 GPU デバイスを仲介デバイスとして参照される複数の仮想デバイスに分割できます。この仲介デバイスは、仮想 GPU として複数のゲストに割り当てることができます。その結果、このゲストは、1 つの物理 GPU のパフォーマンスを共有します。
重要
この機能は、NVIDIA GPU の限定セットでのみ利用できます。このデバイスの最新の一覧は、NVIDIA GPU ソフトウェアのドキュメント を参照してください

16.7.2.1. NVIDIA vGPU の設定

仮想 GPU 機能を設定するには、最初に GPU デバイスの NVIDIA vGPU ドライバーを取得して、仲介デバイスを作成し、使用するゲストマシンに割り当てる必要があります。
  1. NVIDIA vGPU ドライバーを取得して、システムにインストールします。手順は NVIDIA ドキュメント を参照してください
  2. NVIDIA ソフトウェアのインストーラーが /etc/modprobe.d/nvidia-installer-disable-nouveau.conf ファイルを作成しなかった場合は、/etc/modprobe.d/ ディレクトリーに (任意の名前).conf ファイルを作成します。ファイルに以下の行を追加します。
    blacklist nouveau
    options nouveau modeset=0
    
    
  3. 現在のカーネル用に初期 ramdisk を再生成してから再起動します。
    # dracut --force
    # reboot
    仲介デバイスで、以前のサポート対象のカーネルバージョンを使用する必要がある場合は、インストールしたすべてのカーネルバージョンに対して初期 ramdisk を再生成します。
    # dracut --regenerate-all --force
    # reboot
  4. nvidia_vgpu_vfio モジュールがカーネルにより読み込まれており、nvidia-vgpu-mgr.service サービスが実行されていることを確認します。
    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio 45011 0
    nvidia 14333621 10 nvidia_vgpu_vfio
    mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
    vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
    # systemctl status nvidia-vgpu-mgr.service
    nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
     Main PID: 1553 (nvidia-vgpu-mgr)
     [...]
    
  5. デバイスの UUID を /sys/class/mdev_bus/pci_dev/mdev_supported_types/type-id/create に書き込みます。pci_dev は、ホスト GPU の PCI アドレスで、type-id はホスト GPU タイプの ID です。
    以下の例は、NVIDIA Tesla P4 カードの vGPU タイプ nvidia-63 の仲介デバイスを作成する方法を示しています。
    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
    # echo "30820a6f-b1a5-4503-91ca-0c10ba58692a" > /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/nvidia-63/create
    特定デバイスの type-id 値は、section 1.3.1 を参照してください。仮想 GPU ソフトウェアドキュメントの「仮想 GPU のタイプ 」Linux ゲストでは、GRID P4-2Q などの Q シリーズ NVIDIA vGPU のみが仲介デバイス GPU タイプとして対応されます。
  6. 次の行を、vGPU リソースを共有するゲストの XML 設定の <devices/> セクションに追加します。前の手順でuuidgen コマンドで生成した UUID 値を使用します。各 UUID は、一度に 1 つのゲストにしか割り当てることができません。
    
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>
    
    重要
    割り当てられたゲストで vGPU 仲介デバイスが正しく動作するようにするには、ゲストに対して NVIDIA vGPU ゲストソフトウェアライセンスを設定する必要があります。詳細および手順は、NVIDIA の仮想 GPU ソフトウェアのドキュメント を参照してください

16.7.2.2. NVIDIA vGPU を使用したビデオストリーミング用の VNC コンソールの設定および使用

Red Hat Enterprise Linux 7.7 以降では、Virtual Network Computing(VNC)コンソールは、NVIDIA vGPU などの GPU ベースの仲介デバイスで使用できます。これにより、VNC を使用して、NVIDIA vGPU デバイスが提供するアクセラレートグラフィカル出力を表示できます。
警告
この機能は現在テクノロジープレビューとして提供されており、Red Hat ではサポートされていません。したがって、実稼働環境では以下の手順を使用することはあまり推奨していません。
仮想マシンの VNC コンソールで vGPU 出力レンダリングを設定するには、以下を行います。
  1. の説明に従って、NVIDIA vGPU ドライバーをインストールし、システムに NVIDIA vGPU 「NVIDIA vGPU の設定」。仲介デバイスの XML 設定に display='on' パラメーターが含まれることを確認します。以下に例を示します。
    			
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
       <source>
          <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
       </source>
    </hostdev>
    
  2. 必要に応じて、仮想マシンのビデオモデルタイプを none に設定します。以下に例を示します。
    			
    <video>
       <model type='none'/>
    </video>
    
    これが指定されていない場合、2 つの異なるディスプレイ出力を使用できます。1 つはエミュレートされた Cirrus または QXL カード、NVIDIA vGPU からの出力です。また、model type='none' を使用すると、現在ドライバーが初期化されるまで起動グラフィカル出力を確認できないことに注意してください。これにより、表示される最初のグラフィカル出力がログイン画面になります。
  3. 仮想マシンのグラフィックタイプの XML 設定が vnc であることを確認します。
    以下に例を示します。
    			
    <graphics type='vnc' port='-1' autoport='yes'>
    	 <listen type='address'/>
    </graphics>
    
  4. 仮想マシンを起動します。
  5. VNC ビューアーのリモートデスクトップクライアントを使用して、仮想マシンに接続します。
    注記
    仮想マシンが、プライマリービデオデバイスとしてエミュレートされた VGA で設定され、セカンダリーデバイスとして vGPU をセカンダリーデバイスとして設定する場合は、ctrl+alt+2 キーボードショートカットを使用して、仮想 GPU ディスプレイに切り替えます。

16.7.2.3. NVIDIA vGPU デバイスの削除

仲介 vGPU デバイスを削除するには、デバイスが非アクティブのときに次のコマンドを使用します。uuid は、デバイスの UUID (30820a6f-b1a5-4503-91ca-0c10ba58692a など)に置き換えます。
# echo 1 > /sys/bus/mdev/devices/uuid/remove
ゲストで現在使用されている vGPU デバイスを削除しようとすると、以下のエラーが発生することに注意してください。
echo: write error: Device or resource busy

16.7.2.4. NVIDIA vGPU 機能のクエリー

特定のタイプの仲介デバイスの作成など、システムの仲介デバイスに関する追加情報を取得するには、virsh nodedev-list --cap mdev_types コマンドおよび virsh nodedev-dumpxml コマンドを使用します。たとえば、以下では、Tesla P4 カードで利用可能な vGPU タイプが表示されます。

$ virsh nodedev-list --cap mdev_types
pci_0000_01_00_0
$ virsh nodedev-dumpxml pci_0000_01_00_0
<...>
  <capability type='mdev_types'>
    <type id='nvidia-70'>
      <name>GRID P4-8A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-69'>
      <name>GRID P4-4A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-67'>
      <name>GRID P4-1A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-65'>
      <name>GRID P4-4Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-63'>
      <name>GRID P4-1Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-71'>
      <name>GRID P4-1B</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-68'>
      <name>GRID P4-2A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
    <type id='nvidia-66'>
      <name>GRID P4-8Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-64'>
      <name>GRID P4-2Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
  </capability>
</...>

16.7.2.5. NVIDIA vGPU のリモートデスクトップストリームサービス

Red Hat Enterprise Linux 7 上の NVIDIA vGPU 機能とテスト済みのリモートデスクトップストリーミングサービスは次のとおりです。
  • HP-RGS
  • Mechdyne TGX - 現在 Windows Server 2016 ゲストで Mechdyne TGX を使用することはできません。
  • NICE DCV - このストリーミングサービスを使用する場合、動的解像度を使用すると真っ黒な画面が表示されることがあるため、Red Hat は固定解像度設定の使用を推奨します。

16.7.2.6. NVIDIA vGPU を使用したビデオストリーミング向けの VNC コンソールのセットアップ

はじめに

Red Hat Enterprise Linux 8 では、Virtual Network Computing(VNC)コンソールは、NVIDIA vGPU などの GPU ベースの仲介デバイスで使用できます。これにより、VNC を使用して、NVIDIA vGPU デバイスが提供するアクセラレートグラフィカル出力を表示できます。
重要
この機能はテクノロジープレビューであるため、Red Hat ではサポートされていません。したがって、実稼働環境では以下の手順を使用することはあまり推奨していません。

設定

仮想マシンの VNC コンソールで vGPU 出力レンダリングを設定するには、以下を行います。
  1. NVIDIA vGPU ドライバーをインストールし、の説明に従って NVIDIA vGPU 「NVIDIA vGPU の割り当て」。仲介デバイスの XML 設定に display='on' パラメーターが含まれることを確認します。以下に例を示します。
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
     <source>
        <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
     </source>
    </hostdev>
  2. 必要に応じて、仮想マシンのビデオモデルタイプを none に設定します。以下に例を示します。
    <video>
     <model type='none'/>
    </video>
  3. 仮想マシンのグラフィックタイプの XML 設定が spice または vnc であることを確認します。
    spice の例:
    <graphics type='spice' autoport='yes'>
     <listen type='address'/>
     <image compression='off'/>
    </graphics>
    vnc の例:
    <graphics type='vnc' port='-1' autoport='yes'>
     <listen type='address'/>
    </graphics>
  4. 仮想マシンを起動します。
  5. 前の手順で設定したグラフィックプロトコルに適したクライアントを使用して、仮想マシンに接続します。
    • VNC の場合は、VNC ビューアー のリモートデスクトップクライアントを使用します。仮想マシンに、プライマリービデオデバイスとしてエミュレートされた VGA で、および vGPU をセカンダリーとして設定している場合は、ctrl+alt+2 キーボードのショートカットを使用して、仮想 GPU ディスプレイに切り替えます。
    • SPICE の場合は、virt-viewer アプリケーションを使用します。

第17章 仮想ネットワーク

本章では、 libvirt を使った仮想ネットワークの作成、 起動、停止、削除、変更などを行なう際に理解しておく必要がある概念について説明します。
詳細は libvirt についての参照情報の章を参照してください。

17.1. 仮想ネットワークスイッチ

Libvirt 仮想ネットワークは、仮想ネットワークスイッチの概念を使用します。仮想ネットワークスイッチは、仮想マシン(ゲスト)の接続先となるホストの物理マシンサーバーで動作するソフトウェア構築です。ゲストのネットワークトラフィックは、このスイッチを介して転送されます。

図17.1 2 台のゲストを含めた仮想ネットワークスイッチ

2 台のゲストを含めた仮想ネットワークスイッチ
Linux ホストの物理マシンサーバーは、仮想ネットワークスイッチをネットワークインターフェースとして表します。libvirtd デーモン(libvirt)を最初にインストールして起動すると、仮想ネットワークスイッチを表すデフォルトのネットワークインターフェースが virbr0 になります。
この virbr0 インターフェースは、他のインターフェースと同様に ip コマンドを使用して表示できます。
 $ ip addr show virbr0
 3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
     link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

17.2. ブリッジモード

ブリッジ モードを使用すると、すべてのゲスト仮想マシンがホストの物理マシンと同じサブネットに表示されます。同じ物理ネットワークにあるその他のすべての物理マシンは、仮想マシンを認識し、仮想マシンにアクセスできます。ブリッジングは、OSI ネットワークモデルのレイヤー 2 で動作します。

図17.2 ブリッジモードの仮想ネットワークスイッチ

ブリッジモードの仮想ネットワークスイッチ
ハイパーバイザーで複数の物理インターフェースを使用する場合は、ボンドで複数のインターフェースを結合します。ボンドがブリッジに追加され、ゲスト仮想マシンもブリッジに追加されます。ただし、ボンディングドライバーにはいくつかの動作モードがあり、これらのモードの一部は、ゲスト仮想マシンを使用しているブリッジで機能します。
警告
ブリッジモードを使用する場合、ゲスト仮想マシンで使用するボンディングモードは、モード 1、モード 2、およびモード 4 のみになります。モード 0、3、5、または 6 を使用すると、接続が失敗する可能性が高くなります。また、アドレス解決プロトコル(ARP)の監視が機能しないため、MII(Media-Independent Interface)監視を使用してボンディングモードを監視する必要があります。
ブリッジネットワークモードの設定に使用される bridge_opts パラメーターの詳細な説明は、『Red Hat Virtualization 管理ガイド』を参照してください

17.3. ネットワークアドレス変換

デフォルトでは、仮想ネットワークスイッチは NAT モードで動作します。Source-NAT(SNAT)または Destination-NAT(DNAT)の代わりに IP マスカレードを使用します。IP マスカレードで接続されているゲストは、外部ネットワークとの通信にホストの物理マシンの IP アドレスを使用できるようになります。デフォルトでは、以下の図に示すように、ホストの物理マシンに外部に配置されているコンピューターは、仮想ネットワークスイッチが NAT モードで動作しているときに内部のゲストと通信できません。

図17.3 2 台のゲストでの NAT を使用した仮想ネットワークスイッチ

2 台のゲストでの NAT を使用した仮想ネットワークスイッチ
警告
仮想ネットワークスイッチは、iptables ルールで設定された NAT を使用します。スイッチの実行中にこのルールを編集することは推奨されていません。誤ったルールがあると、スイッチが通信できなくなる可能性があるためです。
スイッチが実行していない場合は、正引きモードの NAT のパブリック IP 範囲を設定して、ポートマスカレードの範囲を作成するには、以下を実行します。
# iptables -j SNAT --to-source [start]-[end]

17.4. DNS および DHCP

IP 情報は、DHCP を介してゲストに割り当てることができます。この目的のために、アドレスのプールは仮想ネットワークスイッチに割り当てることができます。libvirt は、このような dnsmasq プログラムを使用します。dnsmasq のインスタンスは、それを必要とする各仮想ネットワークの libvirt により自動的に設定され、起動します。

図17.4 dnsmasq を実行している仮想ネットワークスイッチ

dnsmasq を実行している仮想ネットワークスイッチ

17.5. ルーティングモード

Routed モードを使用する場合は、仮想スイッチは、ホストの物理マシンに接続された物理 LAN に接続し、NAT を使用せずにトラフィックを送受信します。仮想スイッチは、すべてのトラフィックを調べ、ネットワークパケットに含まれる情報を使用して、ルーティングの決定を行うことができます。このモードを使用すると、仮想マシンはすべて自身のサブネットにあり、仮想スイッチを介してルーティングされます。この状況は、物理ネットワークにある他のホストの物理マシンは、手動の物理ルーター設定がないことを認識しないため、常に理想的ではなく、仮想マシンにアクセスできません。ルーティングモードは、OSI ネットワークモデルのレイヤー 3 で動作します。

図17.5 ルーティングモードの仮想ネットワークスイッチ

ルーティングモードの仮想ネットワークスイッチ

17.6. 分離モード

分離 モードを使用すると、仮想スイッチに接続されているゲストは相互に通信でき、ホストの物理マシンとも通信できますが、トラフィックはホストの物理マシンの外部を通過せず、ホストの物理マシンの外部からトラフィックを受信することができません。DHCP などの基本的な機能には、このモードの dnsmasq を使用する必要があります。ただし、このネットワークが物理ネットワークから分離されている場合でも、DNS 名は引き続き解決されます。そのため、DNS 名が解決しますが、ICMP エコーリクエスト(ping)コマンドが失敗する場合があります。

図17.6 分離モードでの仮想ネットワークスイッチ

分離モードでの仮想ネットワークスイッチ

17.7. デフォルト設定

libvirtd デーモン(libvirt)を最初にインストールすると、NAT モードの最初の仮想ネットワークスイッチ設定が含まれます。この設定は、インストールされているゲストが、ホストの物理マシンを介して外部ネットワークと通信できるようにするために使用されます。以下のイメージは、libvirtd のこのデフォルト設定を示しています。

図17.7 デフォルトの libvirt ネットワーク設定

デフォルトの libvirt ネットワーク設定
注記
仮想ネットワークは、特定の物理インターフェースに制限できます。これは、いくつかのインターフェース(例: eth0、eth1 および eth 2) を持つ物理システムで役に立ちます。これは、ルーティングモードおよび NAT モードでのみ役立ち、dev=<interface> オプション、または新しい仮想ネットワークの作成時に virt-manager で定義できます。

17.8. 共通シナリオの例

このセクションでは、異なる仮想ネットワークモードを示し、いくつかのシナリオ例を説明します。

17.8.1. ブリッジモード

ブリッジモードは、OSI モデルのレイヤー 2 で動作します。これを使用すると、ゲスト仮想マシンがすべてホストの物理マシンと同じサブネットに表示されます。ブリッジモードにおける最も一般的なユースケースには、以下が含まれます。
  • 仮想マシンに、仮想マシンと物理マシンの相違点をエンドユーザーに透過的にする、ホストの物理マシンとともに既存のネットワークにゲスト仮想マシンをデプロイする
  • 既存の物理ネットワーク設定を変更せずにゲスト仮想マシンをデプロイする。
  • 既存の物理ネットワークから簡単にアクセスできる必要があるゲスト仮想マシンをデプロイする。既存のブロードキャストドメイン(DHCP など)のサービスにアクセスする必要がある物理ネットワークにゲスト仮想マシンを配置する。
  • VLAN が使用されている他のネットワークにゲスト仮想マシンを接続します。

17.8.2. ルーティングモード

DMZ

セキュリティー上の理由から、制御されたサブネットワークにノードを配置するネットワークを考慮してください。これなどの特別なサブネットワークのデプロイメントは一般的な方法です。サブネットワークは DMZ として知られています。このレイアウトの詳細は、以下の図を参照してください。

図17.8 DMZ 設定の例

DMZ 設定の例
DMZ のホストマシンは、通常、WAN(外部)ホストの物理マシンと、LAN(内部)ホストの物理マシンにサービスを提供します。このため、複数の場所からアクセスでき、この場所はセキュリティーおよび信頼レベルに基づいて異なる方法で制御および操作されるため、ルーティングモードはこの環境に最適な設定になります。

仮想サーバーホスト

複数のホスト物理マシンがあり、2 つの物理ネットワーク接続がある会社をホストしている仮想サーバーについて考えてみましょう。管理とアカウンティングにはいずれかのインターフェースが使用されており、もう 1 つは仮想マシンによる接続に使用されます。各ゲストには独自のパブリック IP アドレスがありますが、ホストの物理マシンは、ゲストの管理としてプライベート IP アドレスを使用します。これは内部管理者のみが実行できます。このシナリオについて理解するには、以下の図を参照してください。

図17.9 仮想サーバーホスティングの設定例

仮想サーバーホスティングの設定例

17.8.3. NAT モード

NAT(ネットワークアドレス変換)モードはデフォルトモードです。これは、直接のネットワーク可視性が必要ない場合にテストに使用できます。

17.8.4. 分離モード

分離モードでは、仮想マシンは相互に通信することができます。物理ネットワークと対話することはできません。

17.9. 仮想ネットワークの管理

システムで仮想ネットワークを設定するには、以下を行います。
  1. Edit メニューから Connection Details を選択します。
  2. これにより、Connection Details メニューが開きます。仮想ネットワーク タブをクリックします。

    図17.10 仮想ネットワークの設定

    仮想ネットワークの設定
  3. 利用可能な仮想ネットワークはすべてメニューの左側にある一覧表示されます。このボックスから選択し、必要に応じて編集することで、仮想ネットワークの設定を編集できます。

17.10. 仮想ネットワークの作成

仮想マシンマネージャー(virt-manager)を使用して、システムで仮想ネットワークを作成するには、以下を実行します。
  1. Connection Details メニューから、仮想ネットワーク タブを開きますAdd Network(Add Network )ボタンをクリックし、プラス記号(+)アイコンをクリックします。詳細はを参照してください 「仮想ネットワークの管理」

    図17.11 仮想ネットワークの設定

    仮想ネットワークの設定
    これにより、Create a new virtual network ウィンドウが開きます。進む をクリックして続行します。

    図17.12 新しい仮想ネットワークの命名

    新しい仮想ネットワークの命名
  2. 仮想ネットワークに適した名前を入力して Forward をクリックします。

    図17.13 IPv4 アドレス領域の選択

    IPv4 アドレス領域の選択
  3. Enable IPv4 network address space definition チェックボックスを選択します。
    ネットワーク フィールドに、仮想ネットワークの IPv4 アドレス領域を入力します
    DHCPv4 の有効化 チェックボックスにチェックを入れます
    IP アドレスの開始範囲と終了範囲を指定して、仮想ネットワークの DHCP 範囲を定義します

    図17.14 IPv4 アドレス領域の選択

    IPv4 アドレス領域の選択
    進む をクリックして続行します。
  4. IPv6 を有効にする場合は、IPv6 ネットワークアドレス定義の有効化 を確認してください。

    図17.15 IPv6 の有効化

    IPv6 の有効化
    追加のフィールドが「新しい仮想ネットワークを作成」ウィンドウに表示されます。

    図17.16 IPv6 の設定

    IPv6 の設定
    ネットワーク フィールドに IPv6 アドレスを入力します。
  5. DHCPv6 を有効にする場合は、DHCPv6 を有効にする チェックボックスを選択します。
    Create a new virtual network ウィンドウに追加のフィールドが表示されます。

    図17.17 DHCPv6 の設定

    DHCPv6 の設定
    (オプション)DHCPv6 範囲の開始と終了を編集します。
  6. 静的ルート定義を有効にする場合は、Enable Static Route Definition チェックボックスにチェックを入れます。
    Create a new virtual network ウィンドウに追加のフィールドが表示されます。

    図17.18 静的ルートの定義

    静的ルートの定義
    ネットワークアドレスと、適切なフィールドのネットワークへのルートに使用されるゲートウェイを入力します。
    Forward をクリックします。
  7. 仮想ネットワークを物理ネットワークに接続する方法を選択します。

    図17.19 物理ネットワークへの接続

    物理ネットワークへの接続
    仮想ネットワークを分離させる場合は、孤立した仮想ネットワークラジオボタンが選択されていることを確認します
    仮想ネットワークを物理ネットワークに接続する場合は、物理ネットワークへの転送 を選択して、送信先を任意の物理デバイス または特定の 物理デバイスにするかを選択します。また、Mode NAT または Routed であるかを選択します。
    仮想ネットワーク内で IPv6 ルーティングを有効にする場合は、IPv6 内部ルーティング/ネットワークの有効化 チェックボックスにチェックを入れてください
    仮想ネットワークの DNS ドメイン名を入力します。
    Finish をクリックして仮想ネットワークを作成します。
  8. 新しい仮想ネットワークが Connection Details ウィンドウの 仮想ネットワーク タブで利用できるようになりました。

17.11. ゲストへの仮想ネットワークの割り当て

仮想ネットワークをゲストに割り当てるには、以下を実行します。
  1. 仮想マシンマネージャーウィンドウで、ネットワークが割り当てられたゲストを強調表示します。

    図17.20 表示する仮想マシンの選択

    表示する仮想マシンの選択
  2. Virtual Machine Manager Edit メニューから、Virtual Machine Details を選択します。
  3. Virtual Machine Details ウィンドウで、ハードウェアの追加 ボタンをクリックします。
  4. Add new virtual hardware ウィンドウで、左側のペインから Network を選択し、Network source メニューからネットワーク名(この例では network1) を選択します。必要に応じて MAC アドレスを変更し、デバイス モデルを選択しますFinish をクリックします。

    図17.21 Add new virtual hardware ウィンドウで対象のネットワークを選択します。

    Add new virtual hardware ウィンドウで対象のネットワークを選択します。
  5. これで新しいネットワークが仮想ネットワークインターフェースとして表示されるようになりました。ゲストの起動時に提供されるようになります。

    図17.22 ゲストのハードウェア一覧に表示される新しいネットワーク

    ゲストのハードウェア一覧に表示される新しいネットワーク

17.12. 物理インターフェースへの仮想 NIC を直接アタッチ

デフォルトの NAT 接続の代わりに、macvtap ドライバーを使用して、ゲストの NIC をホストマシンの指定の物理インターフェースに直接接続することができます。これは、デバイスの割り当て (パススルーとも呼ばれます)と混同しないようにしてください。macvtap 接続には、以下のモードがあります。各モードは、異なる利点とユースケースを持ちます。

物理インターフェース配信モード

VEPA
仮想イーサネットポートアグリゲーター(VEPA)モードでは、ゲストからのパケットはすべて外部スイッチに送信されます。これにより、ユーザーはスイッチを介してゲストトラフィックを強制できます。VEPA モードが正しく機能するには、外部スイッチもサポートし、宛先がソースゲストと同じホストマシンのゲストにあるパケットが、外部スイッチによってホストに戻されるようにする必要があります。

図17.23 VEPA モード

VEPA モード
ブリッジ
宛先が移行元ゲストと同じホストマシンにあるパケットは、ターゲット macvtap デバイスに直接配信されます。直接の配信を成功させるには、移行元デバイスと宛先デバイスの両方がブリッジモードである必要があります。いずれかのデバイスが VEPA モードにある場合は、ヘアピン対応外部スイッチが必要です。

図17.24 ブリッジモード

ブリッジモード
プライベート
すべてのパケットは外部スイッチに送信され、外部ルーターまたはゲートウェイで送信されている場合にのみ同じホストマシン上のターゲットゲストに配信され、ホストに戻されます。プライベートモードを使用すると、1 台のホスト上にある個別のゲストが相互に通信しないようにすることができます。この手順では、移行元または宛先デバイスのいずれかがプライベートモードにある場合は実行されます。

図17.25 プライベートモード

プライベートモード
passthrough
この機能は、移行機能を失うことなく、物理インターフェースデバイスまたは SR-IOV Virtual Function(VF)をゲストに直接接続します。すべてのパケットは、指定されたネットワークデバイスに直接送信されます。ネットワークデバイスは、パススルーモードでゲスト間で共有できないため、単一のゲストでのみ渡すことができることに注意してください。

図17.26 passthrough モード

passthrough モード
macvtap は、ドメイン XML ファイルを変更するか、virt-manager インターフェースを使用して設定できます。

17.12.1. ドメイン XML を使用した macvtap の設定

ゲストのドメイン XML ファイルを開き、<devices> 要素を以下のように変更します。
<devices>
	...
	<interface type='direct'>
		<source dev='eth0' mode='vepa'/>
	</interface>
</devices>
直接接続されたゲスト仮想マシンのネットワークアクセスは、ホスト物理マシンの物理インターフェースに接続するハードウェアスイッチによって管理できます。
スイッチが IEEE 802.1Qbg 標準仕様に準拠する場合は、インターフェースには以下のような追加のパラメーターを指定できます。virtualport 要素のパラメーターは、IEEE 802.1Qbg 標準仕様で詳細に説明されています。この値はネットワーク固有で、ネットワーク管理者が提供する必要があります。802.1Qbg 用語では、Virtual Station Interface(VSI)は仮想マシンの仮想インターフェースを表します。IEEE 802.1Qbg には、VLAN ID がゼロ以外の値が必要になることに注意してください。

仮想状態インターフェースのタイプ

managerid
VSI Manager ID は、VSI タイプおよびインスタンス定義が含まれるデータベースを識別します。これは整数値で、0 の値が予約されます。
typeid
VSI タイプ ID は、ネットワークアクセスのある VSI タイプの特徴を特定します。VSI タイプは通常、ネットワーク管理者によって管理されます。これは整数値です。
typeidversion
VSI Type Version は、VSI タイプの複数のバージョンを許可します。これは整数値です。
instanceId
VSI インスタンス ID は、VSI インスタンス(仮想マシンの仮想インターフェース)の作成時に生成されます。これは、グローバル一意識別子です。
profileId
プロファイル ID には、このインターフェースに適用されるポートプロファイルの名前が含まれます。この名前は、port プロファイルデータベースでポートプロファイルのネットワークパラメーターに解決され、それらのネットワークパラメーターはこのインターフェースに適用されます。
4 つのタイプのそれぞれは、ドメイン XML ファイルを変更することで設定されます。このファイルを開くと、以下のようにモード設定を変更します。
<devices>
 ...
 <interface type='direct'>
  <source dev='eth0.2' mode='vepa'/>
   <virtualport type="802.1Qbg">
    <parameters managerid="11" typeid="1193047" typeidversion="2" instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/>
   </virtualport>
  </interface>
</devices>
プロファイル ID は、以下のようになります。
<devices>
 ...
 <interface type='direct'>
  <source dev='eth0' mode='private'/>
   <virtualport type='802.1Qbh'>
    <parameters profileid='finance'/>
   </virtualport>
 </interface>
</devices>
...

17.12.2. virt-manager を使用した macvtap の設定

仮想ハードウェアの詳細ウィンドウ ⇒ のメニュー ⇒ で NIC を選択し、ホストデバイス : macvtap ⇒ を選択します。これは、目的の ソース モード を選択します。
次に、仮想ポートのサブメニューに、仮想ステーションインターフェースタイプを設定できます。

図17.27 virt-manager での macvtap の設定

virt-manager での macvtap の設定

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

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

17.14. ネットワークフィルタリングの適用

このセクションでは libvirt のネットワークフィルター、フィルターの目的、その概要と XML 形式などについて紹介します。

17.14.1. はじめに

ネットワークフィルタリングの目的は、仮想化システムの管理者が仮想マシンでネットワークトラフィックのフィルタリングルールを設定し、強制的に強制的に、仮想マシンが送受信できるネットワークトラフィックのパラメーターを管理することです。ネットワークトラフィックのフィルタリングルールは、仮想マシンの起動時にホストの物理マシンに適用されます。フィルタリングルールは仮想マシン内から発生しないため、仮想マシンユーザーの表示地点から必須になります。
ゲスト仮想マシンの観点からは、ネットワークフィルタリングのシステムでは、各仮想マシンのネットワークトラフィックのフィルタリングルールがインターフェースごとに個別に設定することができます。これらのルールは、仮想マシンの起動時にホストの物理マシンに適用され、仮想マシンの実行中に変更できます。ネットワークフィルターの XML 記述を変更することで、後者を実現できます。
複数の仮想マシンでは、同じ汎用ネットワークフィルターを使用できます。このようなフィルターが変更されると、このフィルターを参照する実行中すべての仮想マシンのルールをフィルターするネットワークトラフィックのルールが更新されます。実行されていないマシンは起動時に更新されます。
前述のように、ネットワークトラフィックのフィルタリングルールの適用は、特定のタイプのネットワーク設定用に設定された個別のネットワークインターフェースで実行できます。サポートされるネットワーク種別には以下が含まれます。
  • ネットワーク
  • Ethernet -- ブリッジモードで使用する必要があります
  • ブリッジ

例17.1 ネットワークフィルタリングの例

インターフェース XML は最上位のフィルターを参照するために使用されます。以下の例では、インターフェースの説明は filter clean-traffic を参照します。
   <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'/>
    </interface>
  </devices>
ネットワークフィルターは XML で書かれ、他のフィルターへの参照、トラフィックフィルタリングのルール、またはその両方の組み合わせを保持します。上記の参照された filter clean-traffic は、他のフィルターへの参照のみが含まれ、実際のフィルタリングルールがないフィルターです。他のフィルターへの参照を使用できるため、フィルターのツリーを構築できます。clean-traffic フィルターは、# virsh nwfilter-dumpxml clean-traffic を使用して表示できます。
前述のように、単一のネットワークフィルターを複数の仮想マシンで参照できます。インターフェースには、通常、それぞれのトラフィックフィルタリングルールに関連付けられている個々のパラメーターがあるため、フィルターの XML で説明されているルールは、変数を使用して一般化することができます。この場合、変数名はフィルター XML で使用され、フィルターが参照される場所に名前および値が提供されます。

例17.2 説明の拡張

以下の例では、インターフェースの説明がパラメーター IP とドット付き IP アドレスを値として拡張しています。
  <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'>
        <parameter name='IP' value='10.0.0.1'/>
      </filterref>
    </interface>
  </devices>
この例では、clean-traffic ネットワークトラフィックフィルターは IP アドレスパラメーター 10.0.0.1 で表され、ルールに従ってこのインターフェースからのすべてのトラフィックが、ソース IP アドレスとして常に 10.0.0.1 を使用していることを指定します。これは、このフィルターの目的の 1 つです。

17.14.2. チェーンのフィルタリング

フィルタリングルールは、フィルターチェーンで整理されています。このチェーンは、パケットフィルタリングルールを個別のチェーン(ブランチ)のエントリーとして、パケットフィルタリングルールを持つツリー構造を使用していると考えることができます。
パケットはルートチェーンでフィルター評価を開始し、他のチェーンにおいて評価を継続できます。このチェーンからルートチェーンに戻り、移動されたチェーンの 1 つのフィルタールールによりドロップまたは許可されます。
Libvirt のネットワークフィルタリングシステムは、ユーザーがトラフィックのフィルタリングをアクティブ化するために選択するすべての仮想マシンのネットワークインターフェースに対して、個別のルートチェーンを自動的に作成します。ユーザーは、ルートチェーンで直接インスタンス化されるフィルタールールを記述するか、プロトコル固有のルールを効率的に評価するためにプロトコル固有のフィルターチェーンが作成される場合があります。
以下のチェーンが存在します。
  • root
  • mac
  • stp (スパニングツリープロトコル)
  • vlan
  • arp と rarp
  • ipv4
  • ipv6
チェーン名にプロトコル名をプレフィックスとして付けるだけで、 mac、 stp、 vlan、 arp、 rarp、 ipv4、 ipv6 などそれぞれのプロトコルを評価するチェーンを複数作成することができます。

例17.3 ARP トラフィックフィルター

以下の例では、チェーンに「arp-xyz」や「arp-test 」などのチェーン名を付け、そのチェーン内で ARP プロトコルのパケットが評価されるようにしています。
以下のフィルター XML は、ARP チェーンで ARP トラフィックをフィルターする例を示しています。
<filter name='no-arp-spoofing' chain='arp' priority='-500'>
  <uuid>f88f1932-debf-4aa1-9fbe-f10d3aa4bc95</uuid>
  <rule action='drop' direction='out' priority='300'>
    <mac match='no' srcmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='out' priority='350'>
    <arp match='no' arpsrcmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='out' priority='400'>
    <arp match='no' arpsrcipaddr='$IP'/>
  </rule>
  <rule action='drop' direction='in' priority='450'>
    <arp opcode='Reply'/>
    <arp match='no' arpdstmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='in' priority='500'>
    <arp match='no' arpdstipaddr='$IP'/>
  </rule>
  <rule action='accept' direction='inout' priority='600'>
    <arp opcode='Request'/>
  </rule>
  <rule action='accept' direction='inout' priority='650'>
    <arp opcode='Reply'/>
  </rule>
  <rule action='drop' direction='inout' priority='1000'/>
</filter>
ルートチェーンなど、ARP チェーンに ARP 固有のルールを配置する結果は、ARP プロトコル固有のルールで評価する必要がないものです。これにより、トラフィックフィルタリングの効率が向上します。ただし、他のルールは評価されないため、指定のプロトコルのフィルタールールをチェーンにのみ配置するには、細心の注意を払う必要があります。たとえば、IPv4 プロトコルパケットが ARP チェーンを通過しないため、IPv4 ルールは ARP チェーンで評価されません。

17.14.3. チェーンの優先順位のフィルタリング

前述のように、フィルタリングルールを作成すると、すべてのチェーンがルートチェーンに接続されます。これらのチェーンへのアクセス順序は、チェーンの優先度からの影響を受けます。以下の表は、優先順位とデフォルトの優先度を割り当て可能なチェーンを示しています。

表17.1 チェーンのデフォルト優先度の値のフィルタリング

チェーン (プレフィックス) デフォルトの優先度
stp -810
MAC -800
vlan -750
ipv4 -700
ipv6 -600
arp -500
rarp -400
注記
優先度の値が低いチェーンには、値の高いものよりも先にアクセスされます。
表17.1「チェーンのデフォルト優先度の値のフィルタリング」、フィルターノードの priority(XML)属性に [-1000 から 1000] の範囲に値を書き込むことで、カスタムの優先度を割り当てることもできます。「チェーンのフィルタリング」フィルターは、ARP チェーンのデフォルト優先度(例: -500)を表示します。

17.14.4. フィルターでの変数の使用

ネットワークトラフィックのフィルターサブシステムで使用用に確保された変数は、MAC と IP の 2 つです。
MAC ネットワークインターフェースの MAC アドレス用に指定されます。この変数を参照するフィルタリングルールは、自動的にインターフェースの MAC アドレスに置き換えられます。これは、ユーザーが MAC パラメーターを明示的に指定しなくても機能します。上記の IP パラメーターに似た MAC パラメーターを指定することは可能ですが、libvirt はインターフェースが使用する MAC アドレスを認識するため推奨されません。
パラメーター IP は、仮想マシン内のオペレーティングシステムが特定のインターフェースで使用することが予想されている IP アドレスを表します。IP パラメーターは、libvirt デーモンは、パラメーターが明示的に提供されるが参照されていない場合に、インターフェースで使用される IP アドレス(および IP パラメーターの値)を判別するため、特別なものです。IP 「制限」。に記載されている XML ファイルには no-arp-spoofing 「チェーンのフィルタリング」。これは、MAC 変数および IP 変数を参照するためにネットワークフィルター XML を使用する例です。
参照変数には、常に $ 文字が含まれることに注意してください。変数の値の形式は、XML で特定されたフィルター属性が想定されるタイプである必要があります。上記の例では、IP パラメーターは標準の形式で有効な IP アドレスを保持する必要があります。正しい構造を指定できないと、フィルター変数が値に置き換えられず、仮想マシンが起動しなくなったり、ホットプラグが使用される際にインターフェースの割り当てを阻止します。各 XML 例17.4「サンプル変数型」

例17.4 サンプル変数型

変数には要素の一覧を含めることができるため(変数 IP には、特定のインターフェースで有効な複数の IP アドレスを含めることができます)、IP 変数に複数の要素を指定する表記法は以下のようになります。
  <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'>
        <parameter name='IP' value='10.0.0.1'/>
        <parameter name='IP' value='10.0.0.2'/>
        <parameter name='IP' value='10.0.0.3'/>
      </filterref>
    </interface>
  </devices>
この XML ファイルにより、インターフェースごとに複数の IP アドレスを有効にするフィルターが作成されます。それぞれの IP アドレスにより、別個のフィルタールールが生成されます。そのため、上記の XML と以下のルールを使用すると、3 つの個別のフィルタールール(各 IP アドレスに 1 つずつ)が作成されます。
  <rule action='accept' direction='in' priority='500'>
    <tcp srpipaddr='$IP'/>
  </rule>
要素の一覧を保持する変数の個別の要素にアクセスできるため、以下のようなフィルタールールは、変数 DSTPORTS の 2 番目の要素にアクセスします。
  <rule action='accept' direction='in' priority='500'>
    <udp dstportstart='$DSTPORTS[1]'/>
  </rule>

例17.5 各種変数の使用

ここで、$VARIABLE[@<iterator id="x">] 表記を使用して、異なるリストから許容されるルールをすべて表現するフィルタールールを作成できます。以下のルールにより、仮想マシンは SRCIPADDRESSES で指定されるソース IP アドレスのセットから、DSTPORTS で指定されるポートのセット上のトラフィックを受信できます。ルールは、要素にアクセスするために 2 つの独立したイテレーターを使用して SRCIPADDRESSES のこれらを持つ変数 DSTPORTS のすべての要素の組み合わせを生成します。
  <rule action='accept' direction='in' priority='500'>
    <ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/>
  </rule>
以下のように SRCIPADDRESSESDSTPORTS に具体的な値を割り当てます。
  SRCIPADDRESSES = [ 10.0.0.1, 11.1.2.3 ]
  DSTPORTS = [ 80, 8080 ]
$SRCIPADDRESSES[@1] および $DSTPORTS[@2] を使用して変数に値を割り当てると、以下のようにアドレスとポートのすべてのバリアントが作成されます。
  • 10.0.0.1, 80
  • 10.0.0.1, 8080
  • 11.1.2.3, 80
  • 11.1.2.3, 8080
単一のイテレーターを使用して同じ変数にアクセスします(例: $SRCIPADDRESSES[@1]$DSTPORTS[@1] 表記を使用するなど)は、リストの両方に並行してアクセスされ、以下の組み合わせになります。
  • 10.0.0.1, 80
  • 11.1.2.3, 8080
注記
$VARIABLE$VARIABLE[@0] の短縮形です。前書きの表記は、このセクションの最上部で示すように、イテレーター id="0" の役割を常に前提としています。

17.14.5. 自動 IP アドレスの検出および DHCP スヌーピング

本セクションでは、IP アドレスの自動検出および DHCP スヌーピングを説明します。

17.14.5.1. はじめに

仮想マシンのインターフェースで使用される IP アドレスの検出は、変数 IP が参照されても値が割り当てられていない場合、自動的にアクティベートされます。変数 CTRL_IP_LEARNING を使用すると、使用する IP アドレスの学習方法を指定できます。有効な値には、any、dhcp、 または none が含まれます。
value any は、libvirt がパケットを使用して、仮想マシンが使用するアドレスを決定するように指示します。これは、変数 CTRL_IP_LEARNING が設定されていない場合のデフォルト設定です。このメソッドは、インターフェースごとに 1 つの IP アドレスのみを検出します。ゲスト仮想マシンの IP アドレスが検出されると、その IP ネットワークトラフィックがそのアドレスまでロックされます。たとえば、IP アドレスのスプーフィングはフィルターのいずれかによって阻止されます。この場合、仮想マシンのユーザーは、ゲスト仮想マシン内のインターフェースの IP アドレスを変更できなくなります。これは IP アドレスのスプーフィングとみなされます。ゲスト仮想マシンが別のホストの物理マシンに移行されたり、サスペンド操作後に再開される場合、ゲスト仮想マシンによって送信される最初のパケットは、ゲスト仮想マシンが特定のインターフェースで使用できる IP アドレスを再度判別します。
dhcp の値は、libvirt に対し、有効なリースを持つ DHCP サーバー割り当てアドレスのみを有効にするよう指示します。この方法は、インターフェースごとに複数の IP アドレスの検出および使用をサポートします。サスペンド操作後にゲスト仮想マシンが再開されると、有効な IP アドレスのリースがフィルターに適用されます。それ以外の場合、ゲスト仮想マシンは DHCP を使用して新規 IP アドレスを取得することが想定されます。ゲスト仮想マシンが別の物理ホストの物理マシンに移行する場合には、DHCP プロトコルを再実行するためにゲスト仮想マシンが必要です。
CTRL_IP_LEARNING が none に設定されている場合、明示的な値を割り当てなくても IP アドレスの学習と参照を行わないでください。

17.14.5.2. DHCP スヌーピング

CTRL_IP_LEARNING=dhcp (DHCP スヌーピング)は、特に信頼された DHCP サーバーのみが IP アドレスを割り当てる場合に、アンチスヌーピングセキュリティーを提供します。これを有効にするには、変数 DHCPSERVER を有効な DHCP サーバーの IP アドレスに設定し、この変数を使用して受信 DHCP の応答をフィルターするフィルターを指定します。
DHCP スヌーピングが有効で、DHCP リースの期限が切れると、ゲスト仮想マシンは、DHCP サーバーから新しい有効なリースを取得するまで、IP アドレスを使用しなくなります。ゲスト仮想マシンが移行される場合、IP アドレスを使用するために、新規の有効な DHCP リースを取得する必要があります(例: 仮想マシンインターフェースをダウンし、再び起動)。
注記
DHCP の自動検出は、ゲスト仮想マシンのエクスチェンジをインフラストラクチャーの DHCP サーバーを使用して DHCP トラフィックをリッスンします。libvirt でサービス拒否攻撃を回避するために、それらのパケットの評価はレート制限されています。つまり、ゲスト仮想マシンがインターフェース上で過剰な数の DHCP パケットを送信するため、それらのパケットすべてが評価されないため、フィルターは適合しない可能性があります。通常の DHCP クライアントの動作は、1 秒ごとに少ない DHCP パケットを送信することが前提です。さらに、インフラストラクチャー内のすべてのゲスト仮想マシンに適切なフィルターを設定し、DHCP パケットを送信できなくなることが重要になります。したがって、ゲスト仮想マシンは UDP および TCP トラフィックをポート 67 からポート 68 に送信しないようにするか、または DHCPSERVER 変数をすべてのゲスト仮想マシンで使用し、DHCP サーバーメッセージを信頼できる DHCP サーバーから発信できるようにする必要があります。サブネット内のすべてのゲスト仮想マシンで、アンチスプーフィング防止機能を同時に有効にする必要があります。

例17.6 DHCP スヌーピングの IP のアクティブ化

以下の XML は、DHCP スヌーピング方法を使用した IP アドレスの学習のアクティブ化例です。
    <interface type='bridge'>
      <source bridge='virbr0'/>
      <filterref filter='clean-traffic'>
        <parameter name='CTRL_IP_LEARNING' value='dhcp'/>
      </filterref>
    </interface>

17.14.6. 予約変数

表17.2「予約変数」 は、予約済みとみなされ、libvirt で使用される変数を示しています。

表17.2 予約変数

変数名 定義
MAC インターフェースの MAC アドレス
IP インターフェースで使用中の IP アドレス一覧
IPV6 現在のところ実装されていません。インターフェースで使用中の IPV6 アドレスの一覧
DHCPSERVER 信頼できる DHCP サーバーの IP アドレス一覧
DHCPSERVERV6 現在のところ実装されていません。信頼できる DHCP サーバーの IPv6 アドレスの一覧
CTRL_IP_LEARNING IP アドレス検出モードの選択

17.14.7. 要素および属性の概要

すべてのネットワークフィルターに必要なルート要素は、2 つの属性を持つ <filter> という名前です。name 属性は、指定のフィルターの一意の名前を提供します。chain 属性はオプションですが、基礎となるホスト物理マシンの firewall サブシステムにより、特定のフィルターがより効果的に処理できるようにします。現在、システムは以下のチェーンのみをサポートします (root、ipv4、ipv6、arp、および rarp )。

17.14.8. 他のフィルターへの参照

フィルターは他のフィルターへの参照を保持する可能性があります。個々のフィルターはフィルターツリーで複数回参照できますが、フィルター間の参照はループを導入することはできません。

例17.7 クリーンなトラフィックフィルターの例

以下は、他のフィルターを参照する clean-traffic ネットワークフィルターの XML を示しています。
<filter name='clean-traffic'>
  <uuid>6ef53069-ba34-94a0-d33d-17751b9b8cb1</uuid>
  <filterref filter='no-mac-spoofing'/>
  <filterref filter='no-ip-spoofing'/>
  <filterref filter='allow-incoming-ipv4'/>
  <filterref filter='no-arp-spoofing'/>
  <filterref filter='no-other-l2-traffic'/>
  <filterref filter='qemu-announce-self'/>
</filter>
別のフィルターを参照するには、XML ノード <filterref> をフィルターノード内に指定する必要があります。このノードには、参照するフィルターの名前が含まれる属性フィルターが必要です。
新しいネットワークフィルターをいつでも定義でき、libvirt に既知のネットワークフィルターへの参照が含まれている可能性があります。ただし、仮想マシンが起動したり、フィルターを参照するネットワークインターフェースがホットプラグされると、フィルターツリー内のすべてのネットワークフィルターが利用できる状態でなければなりません。そうしないと、仮想マシンは起動せず、ネットワークインターフェースを割り当てることができません。

17.14.9. フィルタールール

以下の XML は、発信 IP パケット内の IP アドレス (変数 IP の値から取得される) が期待したアドレスではない場合に、トラフィックをドロップするルールを実施するネットワークトラフィックフィルターの簡単な例を示しています。これにより仮想マシンからの IP アドレスのなりすましを防ぎます。

例17.8 ネットワークトラフィックのフィルタリングの例

<filter name='no-ip-spoofing' chain='ipv4'>
  <uuid>fce8ae33-e69e-83bf-262e-30786c1f8072</uuid>
  <rule action='drop' direction='out' priority='500'>
    <ip match='no' srcipaddr='$IP'/>
  </rule>
</filter>
トラフィックのフィルタリングルールは、ルールノードで開始します。このノードには、以下の属性の 3 つまで使用できます。
  • アクションには必須の値を使用できます。
    • drop (ルールに一致すると、さらに分析することなくパケットを破棄し、メッセージは出力されません)
    • reject (ルールに一致すると、さらに分析することなく ICMP 拒否メッセージを生成します)
    • accept (ルールに一致すると、さらに分析することなくパケットを受け取ります)
    • return (ルールに一致すると、このフィルターを通過しますがさらに分析するため呼び出しフィルターに制御を戻します)
    • continue (ルールに一致すると、さらに分析するため次のルールに移動します)
  • direction を mandatory にすると、次の値を取ることができます。
    • in - 着信トラフィック
    • out - 発信トラフィック
    • 送受信トラフィックの InOut
  • 優先度はオプションです。ルールの優先度は、他のルールに対してルールがインスタンス化される順序を制御します。値が小さいルールは、値が高いルールよりも先にインスタンス化されます。有効な値は -1000 から 1000 の範囲にあります。この属性が指定されていない場合、デフォルトで優先順位 500 が割り当てられます。ルートチェーンのルールのフィルタリングは、優先順位に従ってルートチェーンに接続するフィルターでソートされることに注意してください。これにより、フィルターチェーンへのアクセスのあるフィルタールールをインターリーブにできます。「チェーンの優先順位のフィルタリング」
  • statematch はオプションです。使用できる値は '0' または 'false' で、基礎となる接続状態をオフに切り替えます。デフォルト設定は「true」または 1 です。
上記の例では、ip タイプのトラフィックがチェーン ipv4 に関連付けられ、ルールに priority=500 例17.7「クリーンなトラフィックフィルターの例」。たとえば、ip タイプのトラフィックがチェーン ipv4 に関連付けられている場合、そのフィルターのルールは、表示されるルールの priority=500 に対して順序付けられます。
ルールには、トラフィックのフィルタリングに単一のルールを含めることができます。上記の例では、ip タイプのトラフィックがフィルターされていることを示しています。

17.14.10. サポート対象プロトコル

以下のセクションでは、ネットワークフィルタリングサブシステムがサポートするプロトコルの一覧と、そのプロトコルの詳細を示します。このタイプのトラフィックルールは、ネストされたノードとしてルールノードで指定されます。トラフィックタイプに応じてルールがフィルタリングしているので、属性は異なります。上記の例は、IP トラフィックフィルタリングノードで有効な単一の属性 srcipaddr を示しています。以下のセクションでは、有効な属性と、予想されるデータの種類を説明します。以下のデータタイプを使用できます。
  • UINT8 : 8 ビット整数; 0 -255 の範囲
  • UINT16: 16 ビットの整数; 0-65535 の範囲
  • MAC_ADDR: ドット付き 10 進数形式の MAC アドレス (00:11:22:33:44:55 など)
  • MAC_MASK: MAC アドレス形式による MAC アドレスマスク (FF:FF:FF:FC:00:00 など)
  • IP_ADDR: ドット付き 10 進数形式の IP アドレス (10.1.2.3 など)
  • IP_MASK: ドット付き 10 進数形式 (255.255.248.0) または CIDR マスク (0-32) による IP アドレスマスク
  • IPV6_ADDR: 数値形式の IPv6 アドレス (FFFF::1)
  • IPV6_MASK: 数値形式 (FFFF:FFFF:FC00::) または CIDR マスク (0-128) による IPv6 マスク
  • STRING: 文字列
  • BOOLEAN: 'true'、'yes'、'1'、または 'false'、'no'、'0'
  • ipSETFLAGS: 最大 6 の 'src' または 'dst' 要素によって記述される ipset の送信元および宛先フラグは、パケットヘッダーのソースまたは宛先部分から機能を選択します(例: src,src,dst)。ここで提供する「selectors」数は、参照される ipset の種類によって異なります。
IP_MASK または IPV6_MASK 以外の属性以外の属性はすべて、値 no の match 属性を使用して無視できます。否定された属性は複数のグループ化が可能です。以下の XML フラグメントは、抽象属性を使用したこのような例を示しています。
[...]
  <rule action='drop' direction='in'>
    <protocol match='no' attribute1='value1' attribute2='value2'/>
    <protocol attribute3='value3'/>
  </rule>
[...]
ルールの動作や、指定のプロトコル属性の境界内において、ルールの評価を論理的に確認します。そのため、1 つの属性の値がルールで指定した値と一致しない場合には、評価プロセス中にルール全体がスキップされます。したがって、上記の例では、着信トラフィックはドロップされます。プロトコルプロパティー attribute1value1 とプロトコルプロパティー attribute2 の両方が一致しず、プロトコルプロパティー attribute3value3 に一致しません。value2

17.14.10.1. MAC(Ethernet)

プロトコル ID: mac
このタイプのルールはルートチェーンに入ります。

表17.3 MAC プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
protocolid UINT16(0x600-0xffff)、STRING レイヤー 3 プロトコル ID。有効な文字列には [arp、rarp、ipv4、ipv6] が含まれます。
コメント STRING 最長 256 文字のテキスト文字列
フィルターは以下のように記述できます。
[...]
<mac match='no' srcmacaddr='$MAC'/>
[...]

17.14.10.2. VLAN (802.1Q)

プロトコル ID: vlan
このタイプのルールはルートチェーンまたは vlan チェーンのいずれかに入ります。

表17.4 VLAN プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
vlan-id UINT16 (0x0-0xfff, 0 - 4095) VLAN ID
encap-protocol UINT16 (0x03c-0xfff), String encapsulated レイヤー 3 プロトコル ID、有効な文字列は arp、ipv4、ipv6 です。
コメント STRING 256 文字までのテキスト文字列

17.14.10.3. STP(ツリープロトコルパニング)

プロトコル ID: stp
このタイプのルールはルートチェーンまたは stp チェーンのいずれかに入ります。

表17.5 STP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信者の MAC アドレスに適用されるマスク。
type UINT8 BPDU (Bridge Protocol Data Unit) タイプ
フラグ UINT8 BPDU flagdstmacmask
root-priority UINT16 ルート優先度範囲の始点
root-priority-hi UINT16 (0x0-0xfff, 0 - 4095) root 優先度の範囲終了
root-address MAC _ADDRESS ルートの MAC アドレス
root-address-mask MAC _MASK ルートの MAC アドレスマスク
roor-cost UINT32 ルートのパスコスト (範囲の始点)
root-cost-hi UINT32 ルートパスコストの範囲の終了
sender-priority-hi UINT16 送信側優先度の範囲終了
sender-address MAC_ADDRESS BPDU 送信側 MAC アドレス
sender-address-mask MAC_MASK BPDU 送信者の MAC アドレスマスク
port UINT16 ポート識別子(範囲起動)
port_hi UINT16 ポート識別子の範囲の終了
msg-age UINT16 メッセージ年齢タイマー(範囲開始)
msg-age-hi UINT16 メッセージ年齢タイマー範囲の終了
max-age-hi UINT16 最大エイジタイム範囲の終了
hello-time UINT16 Hello タイムタイマー(範囲開始)
hello-time-hi UINT16 Hello タイムタイマーの範囲の終了
forward-delay UINT16 フォワード遅延(範囲の開始)
forward-delay-hi UINT16 フォワード遅延範囲の終了
コメント STRING 256 文字までのテキスト文字列

17.14.10.4. ARP/RARP

プロトコル ID: arp または rarp
このタイプのルールはルートチェーンまたは arp/rarp チェーンのいずれかに入ります。

表17.6 ARP プロトコルおよび RARP プロトコルタイプ

属性名 データタイプ 定義
srcmacaddr MAC_ADDR 送信側の MAC アドレス
srcmacmask MAC_MASK 送信側の MAC アドレスに適用されるマスク
dstmacaddr MAC_ADDR 宛先の MAC アドレス
dstmacmask MAC_MASK 宛先の MAC アドレスに適用されるマスク
hwtype UINT16 ハードウェア種別
protocoltype UINT16 プロトコルタイプ
opcode UINT16, STRING Opcode の有効な文字列: Request、Reply、Request_Reverse、Reply_Reverse、DRARP_Request、DRARP_Reply、DRARP_Error、InARP_Request、ARP_NAK
arpsrcmacaddr MAC_ADDR ARP/RARP パケットのソース MAC アドレス
arpdstmacaddr MAC _ADDR ARP/RARP パケット内の宛先 MAC アドレス
arpsrcipaddr IP_ADDR AR