今回は実験的に、EVC を設定していないクラスタの ESXi ホストから、CPU 世代が低い ESXi ホストに vMotion してみます。
ただし、通常で CPU 世代が異なる ESXi ホスト間で vMotion する場合は、クラスタに EVC(Enhanced vMotion Compatibility)を設定するか、仮想マシンに Per-VM EVC を設定します。ということで、本番環境ではこの手順を実施せず、普通に EVC を設定してください。
- 今回の環境
- 実験1: CPU 世代が古い ESXi ホストへの vMotion
- 実験2: CPU 世代が古い ESXi ホストへの vMotion(VMX パラメータでの CPU 機能セット マスク)
今回の環境
クラスタは2つあり、EVC 設定は次のようにしてあります。
- infra-cluster-01: Intel Haswell モード
- infra-cluster-02: 無効
infra-cluster-01 クラスタの EVC は、Intel Haswell モードになっています。
infra-cluster-02 クラスタの EVC は、無効になっています。
PowerCLI でも様子を見ておきます。
PS C:\> Get-Module -Name VMware.PowerCLI -ListAvailable | select Version Version ------- 13.1.0.21624340 PS C:\> $global:DefaultVIServer | select Name,Version,Build Name Version Build ---- ------- ----- infra-vc-01.go-lab.jp 7.0.3 21477706
ESXi ホストの EVC モードは、下記のようになっています。
PS C:\> Get-Cluster | select Name,EVCMode Name EVCMode ---- ------- infra-cluster-01 intel-haswell infra-cluster-02 PS C:\> Get-VMHost | select Parent, Name, MaxEVCMode, @{N="CurrentEVCMode"; E={$_.ExtensionData.Summary.CurrentEVCModeKey}}, @{N="CpuModel"; E={$_.ExtensionData.Summary.Hardware.CpuModel}} | Sort-Object Parent,Name | ft -AutoSize Parent Name MaxEVCMode CurrentEVCMode CpuModel ------ ---- ---------- -------------- -------- infra-cluster-01 infra-esxi-01.go-lab.jp intel-haswell intel-haswell Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz infra-cluster-01 infra-esxi-02.go-lab.jp intel-broadwell intel-haswell Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz infra-cluster-01 infra-esxi-03.go-lab.jp intel-broadwell intel-haswell Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz infra-cluster-01 infra-esxi-04.go-lab.jp intel-broadwell intel-haswell Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz infra-cluster-01 infra-esxi-05.go-lab.jp intel-broadwell intel-haswell Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz infra-cluster-01 infra-esxi-06.go-lab.jp intel-broadwell intel-haswell Intel(R) Core(TM) i3-6100U CPU @ 2.30GHz infra-cluster-02 infra-esxi-07.go-lab.jp intel-haswell Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz infra-cluster-02 infra-esxi-08.go-lab.jp intel-haswell Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
EVC 無効の infra-cluster-02 クラスタでは、test-vm-01 という仮想マシンが起動されています。
PS C:\> Get-VM test-vm-01 | select Name,VMHost,{$_| Get-Cluster} Name VMHost $_| Get-Cluster ---- ------ --------------- test-vm-01 infra-esxi-07.go-lab.jp infra-cluster-02
Per-VM EVC は明示的に設定していませんが、ESXi ホストの CPU をもとに Cascade Lake モードになっています。
実験1: CPU 世代が古い ESXi ホストへの vMotion
vSphere Client で、test-vm-01 を infra-cluster-01 に移行(vMotion)してみます。
しかし移行先の ESXi ホストでは CPU 機能セットが不足しているので、vMotion を開始できませんでした。「詳細を表示」をクリックしてみます。
vMotion 先クラスタの ESXi ホストで不足している CPU 機能セットがわかります。
エラー メッセージの続きです。ちなみに、移行先 ESXi で不足している(サポートされない)CPU 機能セットは、移行元 / 移行先の CPU 世代によって変わります。
実験2: CPU 世代が古い ESXi ホストへの vMotion(VMX パラメータでの CPU 機能セット マスク)
今回は、vMotion 元クラスタで EVC を設定せず、VMX パラメータで CPU 機能セットをマスクして vMotion してみます。
VMX パラメータは、本来は仮想マシンが停止した状態で設定するものですが、今回は PowerCLI でパワーオンのまま設定します。ただし反映するには、結局のところ仮想マシンをパワーオフ → パワーオン することになります。
test-vm-01 に要求される CPU 機能セット(FeatureRequirement)です。
PS C:\> (Get-VM test-vm-01).ExtensionData.Runtime.FeatureRequirement Key FeatureName Value --- ----------- ----- cpuid.3dnprefetch cpuid.3dnprefetch Bool:Min:1 cpuid.abm cpuid.abm Bool:Min:1 cpuid.adx cpuid.adx Bool:Min:1 cpuid.aes cpuid.aes Bool:Min:1 cpuid.avx cpuid.avx Bool:Min:1 cpuid.avx2 cpuid.avx2 Bool:Min:1 cpuid.bmi1 cpuid.bmi1 Bool:Min:1 cpuid.bmi2 cpuid.bmi2 Bool:Min:1 cpuid.clflushopt cpuid.clflushopt Bool:Min:1 cpuid.cmpxchg16b cpuid.cmpxchg16b Bool:Min:1 cpuid.enfstrg cpuid.enfstrg Bool:Min:1 cpuid.f16c cpuid.f16c Bool:Min:1 cpuid.fcmd cpuid.fcmd Bool:Min:1 cpuid.fma cpuid.fma Bool:Min:1 cpuid.fsgsbase cpuid.fsgsbase Bool:Min:1 cpuid.ibpb cpuid.ibpb Bool:Min:1 cpuid.ibrs cpuid.ibrs Bool:Min:1 cpuid.intel cpuid.intel Bool:Min:1 cpuid.invpcid cpuid.invpcid Bool:Min:1 cpuid.lahf64 cpuid.lahf64 Bool:Min:1 cpuid.lm cpuid.lm Bool:Min:1 cpuid.mdclear cpuid.mdclear Bool:Min:1 cpuid.movbe cpuid.movbe Bool:Min:1 cpuid.nx cpuid.nx Bool:Min:1 cpuid.pcid cpuid.pcid Bool:Min:1 cpuid.pclmulqdq cpuid.pclmulqdq Bool:Min:1 cpuid.pdpe1gb cpuid.pdpe1gb Bool:Min:1 cpuid.popcnt cpuid.popcnt Bool:Min:1 cpuid.rdrand cpuid.rdrand Bool:Min:1 cpuid.rdseed cpuid.rdseed Bool:Min:1 cpuid.rdtscp cpuid.rdtscp Bool:Min:1 cpuid.smap cpuid.smap Bool:Min:1 cpuid.smep cpuid.smep Bool:Min:1 cpuid.ss cpuid.ss Bool:Min:1 cpuid.ssbd cpuid.ssbd Bool:Min:1 cpuid.sse3 cpuid.sse3 Bool:Min:1 cpuid.sse41 cpuid.sse41 Bool:Min:1 cpuid.sse42 cpuid.sse42 Bool:Min:1 cpuid.ssse3 cpuid.ssse3 Bool:Min:1 cpuid.stibp cpuid.stibp Bool:Min:1 cpuid.xcr0_master_sse cpuid.xcr0_master_sse Bool:Min:1 cpuid.xcr0_master_ymm_h cpuid.xcr0_master_ymm_h Bool:Min:1 cpuid.xsave cpuid.xsave Bool:Min:1 cpuid.xsavec cpuid.xsavec Bool:Min:1 cpuid.xsaveopt cpuid.xsaveopt Bool:Min:1 cpuid.xsaves cpuid.xsaves Bool:Min:1 misc.ibrs_all misc.ibrs_all Bool:Min:1 misc.mds_no misc.mds_no Bool:Min:1 misc.rdcl_no misc.rdcl_no Bool:Min:1 misc.rsba_no misc.rsba_no Bool:Min:1
CPU 機能セットのマスク(FeatureMask)は、この時点では未設定です。
PS C:\> (Get-VM test-vm-01).ExtensionData.Runtime.FeatureMask PS C:\>
vMotion 先 ESXi ホストで不足していた CPU 機能セットを、cpuid.xxxx / misc.xxxx といった設定項目でマスクします。設定項目の名前は大文字/小文字どちらでも受け付けられますが、情報取得したでの様子にあわせて今回は小文字にしておきます。
さきほどのエラー メッセージを参考に、下記のマスクを設定します。PowerCLI での設定では、VMX パラメータの前に「featMask.vm. 」を追記しておきます。
"misc.mds_no", "misc.rsba_no", "misc.ibrs_all", "misc.rdcl_no", "cpuid.xsaves", "cpuid.xsavec", "cpuid.clflushopt", "cpuid.smap", "cpuid.rdseed", "cpuid.adx", "cpuid.3dnprefetch" | foreach { Write-Host "featMask.vm.$_" }
実際に設定する設定項目の名前です。
PS C:\> "misc.mds_no", >> "misc.rsba_no", >> "misc.ibrs_all", >> "misc.rdcl_no", >> "cpuid.xsaves", >> "cpuid.xsavec", >> "cpuid.clflushopt", >> "cpuid.smap", >> "cpuid.rdseed", >> "cpuid.adx", >> "cpuid.3dnprefetch" | >> foreach { >> Write-Host "featMask.vm.$_" >> } featMask.vm.misc.mds_no featMask.vm.misc.rsba_no featMask.vm.misc.ibrs_all featMask.vm.misc.rdcl_no featMask.vm.cpuid.xsaves featMask.vm.cpuid.xsavec featMask.vm.cpuid.clflushopt featMask.vm.cpuid.smap featMask.vm.cpuid.rdseed featMask.vm.cpuid.adx featMask.vm.cpuid.3dnprefetch
ひとつずつ設定する場合は、下記のようにコマンドを実行します。
Get-VM test-vm-01 | New-AdvancedSetting -Name "featMask.vm.xxxx" -Value "Max:0" -Confirm:$false
今回は、下記のようにまとめて設定します。
$vm_name = "test-vm-01" "misc.mds_no", "misc.rsba_no", "misc.ibrs_all", "misc.rdcl_no", "cpuid.xsaves", "cpuid.xsavec", "cpuid.clflushopt", "cpuid.smap", "cpuid.rdseed", "cpuid.adx", "cpuid.3dnprefetch" | foreach { Get-VM $vm_name | New-AdvancedSetting -Name "featMask.vm.$_" -Value "Max:0" -Confirm:$false }
仮想マシンに、VMX パラメータが設定されたことを確認します。
PS C:\> Get-VM test-vm-01 | Get-AdvancedSetting -Name featMask.vm.misc.*,featMask.vm.cpuid.* | ft -AutoSize Name Value Type Description ---- ----- ---- ----------- featMask.vm.misc.mds_no Max:0 VM featMask.vm.misc.rsba_no Max:0 VM featMask.vm.misc.ibrs_all Max:0 VM featMask.vm.misc.rdcl_no Max:0 VM featMask.vm.cpuid.xsaves Max:0 VM featMask.vm.cpuid.xsavec Max:0 VM featMask.vm.cpuid.clflushopt Max:0 VM featMask.vm.cpuid.smap Max:0 VM featMask.vm.cpuid.rdseed Max:0 VM featMask.vm.cpuid.adx Max:0 VM featMask.vm.cpuid.3dnprefetch Max:0 VM
この時点では、まだ CPU 機能セットのマスクは仮想マシンに反映されていません。
PS C:\> (Get-VM test-vm-01).ExtensionData.Runtime.FeatureMask PS C:\>
仮想マシンを(ゲスト OS を再起動するだけでなく)停止します。
PS C:\> Get-VM test-vm-01 | Shutdown-VMGuest -Confirm:$false -WhatIf WhatIf: Performing operation "Shutdown VM guest." on VM "test-vm-01". PS C:\> Get-VM test-vm-01 | Shutdown-VMGuest -Confirm:$false State IPAddress OSFullName ----- --------- ---------- Running {192.168.11.10, f... VMware Photon OS (64-bit)
仮想マシンをパワーオンします。
PS C:\> Get-VM test-vm-01 | Start-VM Name PowerState Num CPUs MemoryGB ---- ---------- -------- -------- test-vm-01 PoweredOn 1 2.000
これで、仮想マシンに CPU 機能セットのマスクが設定されました。設定項目によっては、キーと機能セット名が大文字になりました。
PS C:\> (Get-VM test-vm-01).ExtensionData.Runtime.FeatureMask Key FeatureName Value --- ----------- ----- cpuid.RDSEED cpuid.RDSEED Max:0 misc.mds_no misc.mds_no Max:0 misc.rsba_no misc.rsba_no Max:0 cpuid.3DNPREFETCH cpuid.3DNPREFETCH Max:0 misc.rdcl_no misc.rdcl_no Max:0 misc.ibrs_all misc.ibrs_all Max:0 cpuid.XSAVES cpuid.XSAVES Max:0 cpuid.XSAVEC cpuid.XSAVEC Max:0 cpuid.ADX cpuid.ADX Max:0 cpuid.SMAP cpuid.SMAP Max:0 cpuid.CLFLUSHOPT cpuid.CLFLUSHOPT Max:0
仮想マシンの EVC 設定画面を見ると、マスクした CPU 機能セットだけが表示され、CPU モードが Haswell になりました。ちなみにクラスタがもともと上位の EVC モードだったりするとそのままだったりするので、今回のマスク設定による CPU モード表示は、あてにならなそうかなと思います。
これで、infra-cluster-01 クラスタに vMotion できるようになりました。
vMotion での移行が完了しました。
普通の仮想マシンであれば Per-VM EVC を設定しますが、検証環境の VCSA 移動などで利用できそうかなと思いました。
以上、CPU 機能セットをマスクして vMotion してみる話でした。