vm.gowatana.jp

NEOにほんごVMware(仮)

EVC 設定なしで旧世代 EVC クラスタに vMotion してみる。

今回は実験的に、EVC を設定していないクラスタの ESXi ホストから、CPU 世代が低い ESXi ホストに vMotion してみます。

ただし、通常で CPU 世代が異なる ESXi ホスト間で vMotion する場合は、クラスタに EVC(Enhanced vMotion Compatibility)を設定するか、仮想マシンに Per-VM EVC を設定します。ということで、本番環境ではこの手順を実施せず、普通に EVC を設定してください。

 

今回の環境

クラスタは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 してみる話でした。