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