20.40. ゲスト仮想マシンの CPU モデル設定
20.40.1. 導入部分
すべてのハイパーバイザーには、ゲスト仮想マシンがデフォルトで CPU に表示するものに関する独自のポリシーがあります。一部のハイパーバイザーは、ゲスト仮想マシンで使用できる CPU ホスト物理マシンの機能を決定します。一方、QEMU/KVM は、ゲスト仮想マシンを、
qemu32
または qemu64
という名前の一般的なモデルで表示します。このようなハイパーバイザーは、より高度なフィルタリングを実行し、すべての物理 CPU を少数のグループに分類し、ゲスト仮想マシンに提示される各グループに対してベースライン CPU モデルを 1 つ用意します。このような動作により、ホストの物理マシン間でゲスト仮想マシンを安全に移行できます。ただし、ゲスト仮想マシンすべてに、同じグループに分類される物理 CPU がある場合に限ります。libvirt は通常、ポリシー自体を適用せず、より高いレイヤーで必要なポリシーを定義するメカニズムを提供します。ホストの物理マシン間でゲスト仮想マシンの移行が正常に実行されるようにするには、CPU モデル情報を取得し、適切なゲスト仮想マシンの CPU モデルを定義する方法を理解することが重要になります。ハイパーバイザーは、認識している機能のみをエミュレートでき、ハイパーバイザーがリリースされてから作成された機能はエミュレートできない場合がある点に注意してください。
20.40.2. ホスト物理マシンの CPU モデルの学習
virsh capabilities コマンドは、ハイパーバイザー接続とホスト物理マシンの機能を説明する XML ドキュメントを表示します。表示されている XML スキーマが拡張され、ホスト物理マシンの CPU モデルに関する情報が提供されるようになりました。CPU モデルを説明する際の課題の 1 つは、すべてのアーキテクチャーで、その機能を公開するアプローチが異なることです。QEMU/KVM および libvirt では、CPU モデル名文字列と、名前付きフラグのセットを組み合わせたスキームが使用されます。
既知の CPU モデルをすべてリスト表示するデータベースは実用的ではないので、libvirt のベースライン CPU モデル名のリストは少ないです。CPUID ビットの最大数を実際のホストマシン CPU と共有し、残りのビットを名前付き機能としてリスト表示するものを選択します。libvirt では、ベースライン CPU に含まれる機能が表示されないことに注意してください。一見、これは欠陥のように思われますが、本セクションで説明するように、この情報を実際に把握する必要はありません。
20.40.3. VFIO IOMU デバイスのサポートの決定
virsh domcapabilities コマンドを使用して、VFIO に対応するかどうかを判断します。以下の出力例を参照してください。
図20.3 VFIO のサポートの決定
# virsh domcapabilities [...output truncated...] <enum name='pciBackend'> <value>default</value> <value>vfio</value> [...output truncated...]
20.40.4. ホスト物理マシンのプールに対応するための互換性のある CPU モデルの決定
1 台のホスト物理マシンに搭載されている CPU 機能を確認できるようになりました。次の手順は、ゲスト仮想マシンに公開するのに最も適した CPU 機能を判断することです。ゲスト仮想マシンを別のホスト物理マシンに移行する必要がないことが分かっている場合は、ホスト物理マシンの CPU モデルを変更せずにそのまま渡すことができます。仮想化データセンターには、すべてのサーバーで 100% 同一の CPU が保証されるように設定されている場合があります。ここでも、ホスト物理マシンの CPU モデルは、変更せずにそのまま渡すことができます。ただし、より一般的なケースは、ホストの物理マシン間で CPU にバリエーションがある場合です。この混合 CPU 環境では、最小公倍数の CPU を決定する必要があります。これは完全に単純なものではないため、libvirt はこのタスクの API を提供します。libvirt が、ホストの物理マシンの CPU モデルをそれぞれ説明する XML ドキュメントのリストを提供している場合、libvirt は、これらを CPUID マスクに内部的に変換し、その共通部分を計算して、CPUID マスクの結果を XML CPU 説明に戻します。
以下は、virsh capabilities の実行時に、libvirt が基本的なワークステーションの機能として報告する内容の例になります。
図20.4 ホストの物理マシンの CPU モデル情報をプルする
<capabilities> <host> <cpu> <arch>i686</arch> <model>pentium3</model> <topology sockets='1' cores='2' threads='1'/> <feature name='lahf_lm'/> <feature name='lm'/> <feature name='xtpr'/> <feature name='cx16'/> <feature name='ssse3'/> <feature name='tm2'/> <feature name='est'/> <feature name='vmx'/> <feature name='ds_cpl'/> <feature name='monitor'/> <feature name='pni'/> <feature name='pbe'/> <feature name='tm'/> <feature name='ht'/> <feature name='ss'/> <feature name='sse2'/> <feature name='acpi'/> <feature name='ds'/> <feature name='clflush'/> <feature name='apic'/> </cpu> </host> </capabilities>
次に、同じ virsh capabilities コマンドを使用して、別のサーバーと比較します。
図20.5 ランダムなサーバーから CPU 説明を生成する
<capabilities> <host> <cpu> <arch>x86_64</arch> <model>phenom</model> <topology sockets='2' cores='4' threads='1'/> <feature name='osvw'/> <feature name='3dnowprefetch'/> <feature name='misalignsse'/> <feature name='sse4a'/> <feature name='abm'/> <feature name='cr8legacy'/> <feature name='extapic'/> <feature name='cmp_legacy'/> <feature name='lahf_lm'/> <feature name='rdtscp'/> <feature name='pdpe1gb'/> <feature name='popcnt'/> <feature name='cx16'/> <feature name='ht'/> <feature name='vme'/> </cpu> ...snip...
この CPU 説明が、以前のワークステーションの CPU 説明と互換性があるかどうかを確認するには、virsh cpu-compare コマンドを使用します。
縮小した内容は、
virsh-caps-workstation-cpu-only.xml
という名前のファイルに保存されており、このファイルで virsh cpu-compare コマンドを実行できます。
# virsh cpu-compare virsh-caps-workstation-cpu-only.xml
Host physical machine CPU is a superset of CPU described in virsh-caps-workstation-cpu-only.xml
この出力から分かるように、libvirt は、CPU との厳密な互換性がないことを正しく報告しています。これは、クライアント CPU にないサーバー CPU の機能が複数あるためです。クライアントとサーバー間で移行を行うには、XML ファイルを開いて、一部の機能をコメントアウトする必要があります。削除する機能を特定するには、両方のマシンの CPU 情報が含まれる
both-cpus.xml
で virsh cpu-baseline コマンドを実行します。# virsh cpu-baseline both-cpus.xml を実行すると、以下が行われます。
図20.6 複合 CPU ベースライン
<cpu match='exact'> <model>pentium3</model> <feature policy='require' name='lahf_lm'/> <feature policy='require' name='lm'/> <feature policy='require' name='cx16'/> <feature policy='require' name='monitor'/> <feature policy='require' name='pni'/> <feature policy='require' name='ht'/> <feature policy='require' name='sse2'/> <feature policy='require' name='clflush'/> <feature policy='require' name='apic'/> </cpu>
この複合ファイルでは、共通する要素が示されます。共通していないものはすべてコメントアウトする必要があります。