PowerCLI で、Set-VM や Set-VMResourceConfiguration といったコマンドレットにオプションが用意されていない設定を変更してみます。今回は、VM の「すべてのゲスト メモリを予約 (すべてロック)」を設定変更してみます。(古い投稿は こちら)
今回の内容です。
- 今回の環境
- 設定変更してみるパラメータ
- MemoryReservationLockedToMax 設定変更の例 1
- MemoryReservationLockedToMax 設定変更の例 2
- MemoryReservationLockedToMax 無効化での注意点
- 参考情報
今回の環境
今回利用した環境は下記です。ただし、以前のバージョンでも同様に設定できます。
- vCenter Server 7.0 U3
- PowerShell 5.1(Windows 10)
- PowerCLI 12.4
設定変更してみるパラメータ
VM のリソース設定に、「すべてのゲスト メモリを予約 (すべてロック)」 というものがあります。これは、API のプロパティでは MemoryReservationLockedToMax です。
この設定を有効化すると、VM が起動されたときに設定容量までメモリが予約されて、必ず利用できることが保証されます。
ただし、この設定は PowerCLI の Set-VM のようなコマンドレットでは変更できません。そこで、オブジェクトのもつ ExtensionData から、API のメソッドを利用して変更してみます。
MemoryReservationLockedToMax 設定変更の例 1
VM「vm01」は、「すべてのメモリを予約」 が無効な状態(False)です。
PowerCLI> Get-VM -Name "vm01" | select {$_.ExtensionData.Config.MemoryReservationLockedToMax} $_.ExtensionData.Config.MemoryReservationLockedToMax ---------------------------------------------------- False
ついでに、いくつか他の VM も設定確認しておきます。
PowerCLI> Get-VM -Name "vm0?" | select Name,@{N="MemoryReservationLockedToMax";E={$_.ExtensionData.Config.MemoryReservationLockedToMax}} | Sort-Object Name
Name MemoryReservationLockedToMax
---- ----------------------------
vm01 False
vm02 False
vm03 False
VM の設定を格納するオブジェクトを作成しておきます。
PowerCLI> $spec = New-Object VMware.Vim.VirtualMachineConfigSpec
そして、MemoryReservationLockedToMax を有効(True)に設定します。
ただしこの時点では、まだ VM には反映されません。
PowerCLI> $spec.MemoryReservationLockedToMax = $true PowerCLI> $spec.MemoryReservationLockedToMax True
設定したオブジェクト($spec)を指定して、ReconfigVM メソッドで VM を再構成します。
PowerCLI> (Get-VM -Name "vm01").ExtensionData.ReconfigVM($spec)
これで、VM の「すべてのメモリを予約」設定が有効(True)になりました。
PowerCLI> Get-VM -Name "vm0?" | select Name,@{N="MemoryReservationLockedToMax";E={$_.ExtensionData.Config.MemoryReservationLockedToMax}} | Sort-Object Name
Name MemoryReservationLockedToMax
---- ----------------------------
vm01 True
vm02 False
vm03 False
vSphere Client でも、設定変更されたことが確認できます。
MemoryReservationLockedToMax 設定変更の例 2
ここまでのコマンドラインを元に、ForEach-Object で複数の VM をまとめて設定してみます。
Get-VM -Name "vm0?" | foreach { $vm = $_ $spec = New-Object VMware.Vim.VirtualMachineConfigSpec $spec.MemoryReservationLockedToMax = $true $vm.ExtensionData.ReconfigVM($spec) }
vm0?(vm01、vm02、vm03)の設定が、True に変更されました。
PowerCLI> Get-VM -Name "vm0?" | select Name,@{N="MemoryReservationLockedToMax";E={$_.ExtensionData.Config.MemoryReservationLockedToMax}} | Sort-Object Name Name MemoryReservationLockedToMax ---- ---------------------------- vm01 True vm02 True vm03 True
MemoryReservationLockedToMax 無効化での注意点
MemoryReservationLockedToMax を有効化してから無効に変更(True → False)した場合は、メモリ予約の容量値は残ってしまいます。
これは下記のように、一般的な Set-VMResourceConfiguration コマンドレットで解除(ゼロに変更)できます。
PowerCLI> Get-VM -Name "vm01" | Get-VMResourceConfiguration | Set-VMResourceConfiguration -MemReservationMB 0
参考情報
VirtualMachineConfigSpec オブジェクトでは、下記のように設定できそうな項目を確認できます。
PS C:\> $spec = New-Object VMware.Vim.VirtualMachineConfigSpec PS C:\> $spec ChangeVersion : Name : Version : CreateDate : Uuid : InstanceUuid : NpivNodeWorldWideName : NpivPortWorldWideName : NpivWorldWideNameType : NpivDesiredNodeWwns : NpivDesiredPortWwns : NpivTemporaryDisabled : NpivOnNonRdmDisks : NpivWorldWideNameOp : LocationId : GuestId : AlternateGuestName : Annotation : Files : Tools : Flags : ConsolePreferences : PowerOpInfo : NumCPUs : VcpuConfig : NumCoresPerSocket : MemoryMB : MemoryHotAddEnabled : CpuHotAddEnabled : CpuHotRemoveEnabled : VirtualICH7MPresent : VirtualSMCPresent : DeviceChange : CpuAllocation : MemoryAllocation : LatencySensitivity : CpuAffinity : MemoryAffinity : NetworkShaper : CpuFeatureMask : ExtraConfig : SwapPlacement : BootOptions : VAppConfig : FtInfo : RepConfig : VAppConfigRemoved : VAssertsEnabled : ChangeTrackingEnabled : Firmware : MaxMksConnections : GuestAutoLockEnabled : ManagedBy : MemoryReservationLockedToMax : NestedHVEnabled : VPMCEnabled : ScheduledHardwareUpgradeInfo : VmProfile : MessageBusTunnelEnabled : Crypto : MigrateEncryption : SgxInfo : FtEncryptionMode : GuestMonitoringModeInfo : SevEnabled : PmemFailoverEnabled :
以上、PowerCLI のメソッドを利用して VM を設定変更してみる話でした。