スズハドットコム

IT関連や3Dプリンタの記事、たまに生活のメモを書いていきます。

ESXi上の仮想マシンバックアップ(ghettoVCB)

先日、自宅ESXiサーバのデータストアにしているHDDが故障し、全VMが吹っ飛びました。

何かサービスを提供している訳でもなくラボ的な用途なので、一から再インストールすればまぁそれでよいのですが、これに懲りてきちんとバックアップを取るようにします。

 

 バックアップソリューションには、オープンソースのghettoVCBを選択しました。

GitHub - lamw/ghettoVCB: ghettoVCB

[Code▼]ボタン-[Download ZIP]から、ZIPをダウンロードします。

また、こちら

https://github.com/lamw/ghettoVCB/releases

からvibファイルをダウンロードします。

 

今回はバックアップ専用のHDDを入れてデータストアを用意しました。そのデータストアのルートにzipをアップロードし、展開します。

[root@localhost:~] cd /vmfs/volumes/WD40EZRZ-BKUP/
[root@localhost:/vmfs/volumes/hoge] ls -l
total 640
drwxr-xr-x    1 root     root         73728 Jan 11  2021 VMs
-rw-r--r--    1 root     root         44257 Nov 16 05:09 ghettoVCB-master.zip
-rw-r--r--    1 root     root         37894 Nov 16 05:09 vghetto-ghettoVCB.vib

[root@localhost:/vmfs/volumes/hoge] unzip ghettoVCB-master.zip
Archive:  ghettoVCB-master.zip
   creating: ghettoVCB-master/
  inflating: ghettoVCB-master/README.md
   creating: ghettoVCB-master/build/
  inflating: ghettoVCB-master/build/Dockerfile
  inflating: ghettoVCB-master/build/README.md
  inflating: ghettoVCB-master/build/build.sh
  inflating: ghettoVCB-master/build/create_ghettoVCB_vib.sh
  inflating: ghettoVCB-master/ghettoVCB-VMDKexclude.sh
  inflating: ghettoVCB-master/ghettoVCB-restore.sh
  inflating: ghettoVCB-master/ghettoVCB-restore_vm_restore_configuration_template
  inflating: ghettoVCB-master/ghettoVCB-vm_backup_configuration_template
  inflating: ghettoVCB-master/ghettoVCB.conf
  inflating: ghettoVCB-master/ghettoVCB.sh

※解説サイトによってはesxi上でwgetを実行してgithubから直接取得している記載もありましたが、うちの環境ではエラーとなりました。(httpsで接続できない?)
なので、一旦PCにダウンロード後ESXiにアップしています。

 

公式サイトの解説に従ってvibをインストールします。

[root@localhost:/vmfs/volumes/hoge] esxcli software vib install -v /vmfs/volumes/hoge/vghetto-ghettoVCB.vib -f
Installation Result
   Message: Operation finished successfully.
   Reboot Required: false
   VIBs Installed: virtuallyGhetto_bootbank_ghettoVCB_1.0.0-0.0.0
   VIBs Removed:
   VIBs Skipped:

 

念のためコピーを取ってからconfファイルを編集します。

このconfはどうやら "global ghettoVCB configuration file" らしいです。

[root@localhost:/vmfs/volumes/hoge/ghettoVCB-master] cp -p ghettoVCB.conf ghettoVCB.conf.org
[root@localhost:/vmfs/volumes/hoge/ghettoVCB-master] vi ghettoVCB.conf

 

設定項目がたくさんありますが、とりあえず見るべき個所は以下です。

VM_BACKUP_VOLUME=/vmfs/volumes/WD40EZRZ-BKUP/VMs
⇒バックアップファイルの出力先です。このディレクトリの下に [VM名]/[VM名-タイムスタンプ]/ ディレクトリが作成され、バックアップが出力されます。

DISK_BACKUP_FORMAT=thin
⇒ディスクの形式です。今回は容量節約のためシンプロビジョニングを選択します。

VM_BACKUP_ROTATION_COUNT=3
⇒バックアップの世代数です。

その他、バックアップ取得の際にVMをシャットダウンするか、エラー時にメール送信するかなど設定できるようです。

https://communities.vmware.com/docs/DOC-8760

 

dryrunモード(実際にバックアップ取得せず動作確認)で実行してみます。

ghettoVCB.sh に与えたオプションの意味は以下の通りです。

-a:すべてのVMのバックアップを取得する指定です。他には、"-f リストファイル"とすればVMのリストを、"-m VM名"とすれば特定のVMを指定できます。

-g confファイル名:"global ghettoVCB configuration file"の指定です。

-d デバッグレベル:"-d dryrun"とすると実際にバックアップ取得せず動作確認となります。他には、"-d debug"とするとデバッグモードになります。"-d info"または-dオプション省略で通常モードになります。

 

[root@localhost:/vmfs/volumes/hoge/ghettoVCB-master] /vmfs/volumes/WD40EZRZ-BKUP/ghe
ttoVCB-master/ghettoVCB.sh -a -g /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf -d dryrun
Logging output to "/tmp/ghettoVCB-2021-11-16_05-42-39-754758.log" ...
2021-11-16 05:42:40 -- info: ============================== ghettoVCB LOG START ==============================

2021-11-16 05:42:40 -- info: CONFIG - USING GLOBAL GHETTOVCB CONFIGURATION FILE = /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf

(中略)

2021-11-16 05:42:41 -- info: ###### Final status: OK, only a dryrun. ######

2021-11-16 05:42:41 -- info: ============================== ghettoVCB LOG END ================================

 

正常終了しましたので、今度は実際にバックアップを取得してみます。

[root@localhost:/vmfs/volumes/hoge/ghettoVCB-master] /vmfs/volumes/WD40EZRZ-BKUP/ghe
ttoVCB-master/ghettoVCB.sh -a -g /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf
Logging output to "/tmp/ghettoVCB-2021-11-16_05-45-14-755114.log" ...
2021-11-16 05:45:14 -- info: ============================== ghettoVCB LOG START ==============================

2021-11-16 05:45:14 -- info: CONFIG - USING GLOBAL GHETTOVCB CONFIGURATION FILE = /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf

(中略)

2021-11-16 06:21:28 -- info: ###### Final status: All VMs backed up OK! ######

2021-11-16 06:21:28 -- info: ============================== ghettoVCB LOG END ================================

うまくいきました。

データストアを見てみると、バックアップファイルができています。

f:id:suzuki_hajime:20191106000310p:plain

 

 あとは、これをcronでスケジュール実行するよう設定します。

[root@localhost:~] vi /etc/rc.local.d/local.sh

 

編集後の内容は以下の通りです。赤字が編集部分です。

UTCで毎週日曜日の19時(JSTで月曜日の早朝4時)にバックアップを実行します。

[root@localhost:~] cat /etc/rc.local.d/local.sh
#!/bin/sh

# local configuration options

# Note: modify at your own risk! If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading. Changes are not supported unless under direction of
# VMware support.

# Note: This script will not be run when UEFI secure boot is enabled.

/bin/kill $(cat /var/run/crond.pid)
/bin/echo "0 19 * * 0 /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.sh -a -g /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf > /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/log/ghettoVCB-backup-\$(date +\\%s).log" >> /var/spool/cron/crontabs/root
crond

exit 0

 

ESXiホストを再起動して、設定が反映されるか確認します。

[root@localhost:~] cat /var/spool/cron/crontabs/root
#min hour day mon dow command
1 1 * * * /sbin/tmpwatch.py
1 * * * * /sbin/auto-backup.sh
0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py
*/5 * * * * /bin/hostd-probe.sh ++group=host/vim/vmvisor/hostd-probe/stats/sh
00 1 * * * localcli storage core device purge
0 2 * * * /opt/fts/bin/prcoll-vm-support.sh
0 19 * * 0 /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.sh -a -g /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/ghettoVCB.conf > /vmfs/volumes/WD40EZRZ-BKUP/ghettoVCB-master/log/ghettoVCB-backup-$(date +\%s).log

 

きちんと入ってました。

あとは、つぎの月曜日早朝に実行されたことをログで確認できれば完璧ですね