vmkfstools で仮想マシンバックアップを取得する
はじめに
vmkfstools は、ESXi でストレージ操作を実行するための Shell コマンドの 1 つです。
仮想マシンをバックアップする方法は様々考えられますが、今回はこの Shell コマンドを利用して仮想ディスクをクローンし、バックアップとして利用する方法を紹介します。
仮想マシンファイルのロックについて
ファイルのロックに失敗して実行ができないですか?
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vmkfstools -i cent01.vmdk -d thin /vmfs/volumes/620de088-0300d7a8-8cd8-a0cec8d7d5ac/backup-test/cent01a.vmdk
Failed to open 'cent01.vmdk': Failed to lock the file (16392).
実は仕様として、.vmdk や .vmx他いくつかの仮想マシンファイルはファイル システムへの同時変更を防ぐためにESXi ホストによってロックがかけられています。
仮想マシンが実行中にロックされるファイルは以下のとおりです。
VMNAME.vswp
DISKNAME-flat.vmdk
DISKNAME-ITERATION-delta.vmdk
VMNAME.vmx
VMNAME.vmxf
vmware.log
flat でない vmdk ファイルはロックがかけられているわけではなさそうですが、それが最新のディスク記述子ファイルである場合はロックが奪えない仕様であるのかなと推測します。
よくスナップショットを取得して vmdk のロックを解除するといった内容の記事が紹介されていることがありますが、それは厳密にいうと間違いなのかなと考えています。(スナップショットを取得したところで-flat.vmdkのロックは解除されないですし、.vmdkの記述子ファイルはそもそもロックされていないためです)
vmfsfilelockinfo
でファイルをロックしているホストとロックの状態を確認可能です。
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vmfsfilelockinfo -p cent01.vmdk -v 192.168.0.1 -u administrator@vsphere.local
vmfsfilelockinfo Version 2.0
Looking for lock owners on "cent01.vmdk"
"cent01.vmdk" is not locked by any ESX host and is Free
Total time taken : 0.029754476039670408 seconds.
ロックがかけられているファイルの例
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vmfsfilelockinfo -p cent01.vmx -v 192.168.0.1 -u administrator@vsphere.local
vmfsfilelockinfo Version 2.0
Looking for lock owners on "cent01.vmx"
"cent01.vmx" is locked in Exclusive mode by host having mac address ['a0:ce:c8:d7:d5:ac']
Trying to use information from VMFS Heartbeat
Host owning the lock on file is 172.16.0.xxx, lockMode : Exclusive
Total time taken : 4.165026523987763 seconds.
ロックしているホストがわかればそこからロックを保持しているプロセスを割り出すこともできます
[root@xxx] lsof | egrep 'Cartel|cent01*'
Cartel | World name | Type | fd | Description
1107388 sh cwd -1 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01
1082796 vmx cwd -1 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01
1082796 vmx FILE 43 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/cent01.vmx.lck
1082796 vmx FILE 44 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/cent01.vmx
1082796 vmx FILE 45 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/cent01.vmx~
1082796 vmx FILE 46 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/vmware.log
1082796 vmx FILE 78 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/cent01-flat.vmdk
1082796 vmx FILE 80 /vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01/cent01.nvram
VMkernel で実行されるプロセスのことは World と呼ばれますが、Cartel とはこの World のグループのような概念で、上の例だと 1082796 の Cartel ID が割り振られているプロセス群によってファイルが実行されている事がわかります。
vmkfstools
によるバックアップの実行は、OS を停止して実行する方法と、OS が起動したままスナップショットを一時的に作成して、実行する方法があります。
今回は後者の方法でバックアップを実行したいと思います。 この場合はスナップショット作成時点のバックアップ取ることになる点に注意する必要があります。
スナップショットの作成
せっかくなのでコマンドからスナップショットを作成する方法を紹介します。
VM の操作には Vmid が必要になるので、事前にvim-cmd vmsvc/getallvms
で対象の VM の vmid をメモしておきます。
次のコマンドでスナップショットを作成できます。
vim-cmd vmsvc/snapshot.create <vmid> <スナップショット名>
[root@deskmini-a300-01:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vim-cmd vmsvc/snapshot.create 72 tmpsnap
Create Snapshot:
仮想マシンフォルダを見ると差分ディスクファイル等いくつかのファイルが作成されていることがわかります。
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] ls
cent01-000001-sesparse.vmdk cent01.vmdk vmware-2.log
cent01-000001.vmdk cent01.vmsd vmware-3.log
cent01-4520f3b7.hlog cent01.vmx vmware-4.log
cent01-93250dcb.vswp cent01.vmx.lck vmware.log
cent01-Snapshot1.vmsn cent01.vmx~ vmx-cent01-9a98de059cb4c10b4ac979df017e2717e8c9e62d-1.vswp
cent01-flat.vmdk vmware-0.log
cent01.nvram vmware-1.log
上記のファイル例で説明すると、cent01-000001.vmdk
にスナップショット作成時点からの仮想マシンのディスクの内容が保存されていて、cent01-000001-sesparse.vmdk
がそのディスク記述子ファイルに該当します。
因みに vmsn
ファイルはスナップショットの状態、vmsd
ファイルはスナップショットに関連する情報とメタデータが含まれています。
バックアップの実行
以下のコマンドでバックアップを実行できます。
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vmkfstools -i cent01.vmdk -d thin /vmfs/volumes/620de088-0300d7a8-8cd8-a0cec8d7d5ac/backup-test/cent01.vmdk
Destination disk format: VMFS thin-provisioned
Cloning disk 'cent01.vmdk'...
Clone: 100% done.
データストアを確認するとクローンされたディスクが作成されています。

クローン後は不要になったスナップショットの削除を行います。
vim-cmd vmsvc/snapshot.get <vmid>
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vim-cmd vmsvc/snapshot.get 72
Get Snapshot:
|-ROOT
--Snapshot Name : tmpsnap
--Snapshot Id : 1
--Snapshot Desciption :
--Snapshot Created On : 2/20/2022 7:51:9
--Snapshot State : powered off
vim-cmd vmsvc/snapshot.remove <vmid> <Snapshot Id>
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] vim-cmd vmsvc/snapshot.remove 72 1
Remove Snapshot:
また、リストア時には vmx ファイルも必要となるので同様にコピーしておきます。
ログファイル等は必須ではありませんが、必要に応じてコピーしてください。
[root@xxx:/vmfs/volumes/620dc97c-d7ab2708-43e8-a0cec8d7d5ac/cent01] cp cent01.vmx /vmfs/volumes/620de088-0300d7a8-8cd8-a0cec8d7d5ac/backup-test/cent01.vmx
リストアの実行
保存済みの vmx ファイルを選択して仮想マシンの登録を行うだけで OK です。

質問への回答を行うと問題なく起動できていることを確認できました。
起動を行うとその他もろもろのファイルが作成されるので、リストア時には個別の仮想マシンファイル用のフォルダを作成して行うようにしましょう。

この記事の内容は以上です。ご覧いただきありがとうございました。
参考
https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-01D3CF47-A84A-4988-8103-A0487D6441AA.html
https://kb.vmware.com/s/article/10051?lang=ja
https://kb.vmware.com/s/article/1003743?lang=ja