vm.gowatana.jp

NEOにほんごVMware(仮)

PowerCLI で仮想マシンのスナップショットを作成してみる。(クリスマス編)

この投稿は、vExperts Advent Calendar 2022 の 1日目です。初日なので、vSphere の基本機能の話にしました。

 

はじめに、vExperts Advent Calendar 2022 について

vExpert 2022 の主に Japan メンバーによるアドベントカレンダーです。

adventar.org

 

今年は 25名が参加します。みなさんよろしくお願いします。

 

今回の検証目的

ESXi の仮想マシンのスナップショットは、チェーンあたり 32個まで作成できます。

 

この KB には、下記のような記載があります。(いまのところ ESXi 7.x までが対象ですが・・・)

Maximum of 32 snapshots are supported in a chain.

 

そこで、今回は vSphere 8.0 の実機を利用して、実際に 32個のスナップショットを作成してみます。

 

今回の環境

vSphere 8.0(vCenter Server 8.0 + ESXi 8.0)の環境に、仮想マシンを 1台だけ(vm01)作成してあります。

vSphere Client から見ると、下記のような感じです。

 

大量のスナップショットを作成するのは大変なので、今回は PowerCLI を利用します。

  • PowerShell Core 7.3
  • PowerCLI 13
PS C:\> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      7.3.0
PSEdition                      Core
GitCommitId                    7.3.0
OS                             Microsoft Windows 10.0.19045
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

    
PS C:\> Get-Module -Name VMware.PowerCLI -ListAvailable | select Version

Version
-------
13.0.0.20829139

 

PowerCLI は、vCenter Server に接続して操作します。

PS C:\> Connect-VIServer lab-vc-08.go-lab.jp -Force

 

vCenter と ESXi のバージョンは 8.0 です。

PS C:\> $global:DefaultVIServer | select Name,Version,Build,IsConnected

Name                Version Build    IsConnected
----                ------- -----    -----------
lab-vc-08.go-lab.jp 8.0.0   20519528        True


PS C:\> Get-VMHost | Sort-Object Name | select Name, Version, Build, Parent

Name           Version Build    Parent
----           ------- -----    ------
192.168.10.111 8.0.0   20513097 lab-cluster-81
192.168.10.112 8.0.0   20513097 lab-cluster-81
192.168.10.113 8.0.0   20513097 lab-cluster-81
192.168.10.114 8.0.0   20513097 lab-cluster-81

 

仮想マシン「vm01」が作成してあります。

PS C:\> Get-VM -Name "vm01"

Name                 PowerState Num CPUs MemoryGB
----                 ---------- -------- --------
vm01                 PoweredOff 1        2.000

 

スナップショットの作成と削除

それでは、PowerCLI で、vm01 にスナップショットを作成してみます。スナップショットの作成は「New-Snapshot」です。

PS C:\> Get-VM -Name "vm01" | New-Snapshot -Name "snapshot-test"

 

スナップショットは、Get-Snapshot で確認できます。

PS C:\> Get-VM -Name "vm01" | Get-Snapshot

Name                 Description                    PowerState
----                 -----------                    ----------
snapshot-test                                       PoweredOff

 

vSphere Client でも、スナップショットが作成されたことが確認できます。

 

スナップショットの削除は、Remove-Snapshot です。ちなみに、ESXi では仮想マシンのスナップショットを長く保持することを推奨していませんので不要なスナップショットはすぐに削除しておくとよいと思います。

PS C:\> Get-VM -Name "vm01" | Get-Snapshot -Name "snapshot-test" | Remove-Snapshot -Confirm:$false

 

スナップショット作成の実験(32個 作成)

それでは、32個のスナップショットを作成してみます。今回は ForEach でループして、snap-01 ~ snap32 という名前のスナップショットを作成してみます。

PS C:\> 1..32 | ForEach {Get-VM -Name "vm01" | New-Snapshot -Name ("snap-" + $_.toString("00")) -ErrorAction:Stop}

 

実際にスナップショットを作成してみると、32個目の作成はエラーになりました。

 

エラー内容は「スナップショットの階層が深すぎる」と期待通りですが、最初の階層も含めて32個(つまりチェーンに 31個作成できる)ということのようです。

The operation for the entity "vm01" failed with the following message: "Snapshot hierarchy is too deep.

 

vSphere Client ではこのようになります。タスクをみると「スナップショット階層が深過ぎます。」というエラーで失敗しています。スナップショットの深さについての制限は、ただ推奨されないというものではなく、実際に設定できない上限値だということがわかりました。

 

ちなみにこの環境は、vSAN 8.0 の新アーキテクチャである vSAN ESA(Express Storage Architecture)で構成されています。

ESAでは、スナップショットの機能改善もされていますが、「スナップショットの深さの 32世代制限」は ESXi の仮想マシンに関係する上限値なので、仮想ディスクが配置されるデータストアに関係なく制限されています。

PS C:\> Get-VsanClusterConfiguration -Cluster "lab-cluster-81" | select VsanEsaEnabled

VsanEsaEnabled
--------------
          True

 

試しに、深さが 32世代にならないように、スナップショットを追加作成してみます。 スナップショットの「元に戻す」にあたるコマンドを実行して、「snap-30」に戻って、あらため「snap-32」を作成してみます。

PS C:\> Get-VM -Name "vm01" | Set-VM -Snapshot "snap-30" -Confirm:$false
PS C:\> Get-VM -Name "vm01" | New-Snapshot -Name "snap-32"

 

今度は、チェーンの深さが 32個にならないので追加作成できました。

 

スナップショットの「すべて削除」

今回の検証で作成したスナップショットを、まとめて削除しておきます。vSphere Client にあるスナップショットの「すべて削除」は、PowerCLI でも実行できます。

 

まず、作成時間が一番古いスナップショットを探します。

PS C:\> Get-VM -Name "vm01" | Get-Snapshot | Sort-Object Created | select -First 1

Name                 Description                    PowerState
----                 -----------                    ----------
snap-01                                             PoweredOff

 

このスナップショットに対して「Remove-Snapshot -RemoveChildren」を実行すると、スナップショット単位ではなく「すべて削除」が実行されます。

PS C:\> Get-VM -Name "vm01" | Get-Snapshot | Sort-Object Created | select -First 1 | Remove-Snapshot -RemoveChildren -Confirm:$false

 

おまけ

ツリーの深さに気をつければ、スナップショットは 32個以上でも作成できます。

たとえば、下記のような、チェーンの深さの上限に到達しないようにスナップショットを作成する PowerCLI スクリプトを用意してみました。

(% は、ForEach のエイリアスです)

gist.github.com

 

そして、PowerCLI で実行してみます。

PS> ./advent-2022-day01.ps1

 

こんな感じに、スナップショットが作成されました。

 

スナップショットを何度か切り替えて追加作成しており、深さの上限には余裕があるので、31個を超えたスナップショットも作成できています。

PS C:\> (Get-VM -Name "vm01" | Get-Snapshot).Count
32

 

なお、本番環境などでは vCenter インベントリ オブジェクトで日本語、記号、絵文字は使用せず、アルファベットと数字だけ使用したほうが不要な事故を避けられると思います。

 

以上、vExperts Advent Calendar 2022 の 1日目の投稿でした。

2日目は、Yuki Kawamitsu さんです。