VMware ESXiのフリーライセンスで運用する場合の覚書(cronとオンラインバックアップ)
(vSphere Hypervisor 6.7でも同様の手順で設定できました)
standerdライセンス以上ならvMotionが使えるのでバックアップなどはそちらに任せたほうがいいのだが、
フリーライセンスの場合、最小限の仮想化以外の機能が使えないため、cronを使ってバックアップを組むことにした。
だが、ESXiにはcrontabコマンドが存在していないため、
cronを利用する場合は設定ファイルである「/var/spool/cron/crontabs/root」を直接編集する必要がある。
内部書式自体は通常のcronの書式で問題ない。
また、これらの設定も再起動後にはクリアされてしまうため、ESXiの再起動後にも設定を有効にする場合は、
再起動と同時に上記設定ファイルに設定を再度書き込むようにする。
ESXi本体にはsshで接続する、接続はチャレンジレスポンスで行う必要がある点に注意
ESXi再起動後も設定を保持させるように、カーネル読み込み時に実行される
/etc/rc.local.d/local.sh
に細工する。
~ # vi /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.
/bin/echo "* * * * * cronで実行させたいコマンド" >> /var/spool/cron/crontabs/root
/bin/kill $(cat /var/run/crond.pid)
/bin/busybox crond
exit 0
コメント行が終了した直後の一行目にあるように、「/var/spool/cron/crontabs/root」に設定を書き込ませるような記述を行う
実際のバックアップには、仮想マシンを無停止でバックアップできる、無料ツール[ghettoVCB]を使用する
入手先は以下から
ghettoVCB
https://github.com/lamw/ghettoVCB
設定
まず、ESXiのハイパーバイザにsshでログインして、データストア(ここではdatastore1)にbackupディレクトリを作る
cd /vmfs/volumes/datastore1
mkdir backup
cd backup
ハイパーバイザ内にはgitコマンドがないので、wgetでmaster.zipを落とす
wget https://github.com/lamw/ghettoVCB/archive/master.zip -o ghettoVCB-master.zip
unzip ghettoVCB-master.zip
展開すると以下のような感じに
Archive: ghettoVCB-master.zip
creating: ghettoVCB-master/
inflating: ghettoVCB-master/README
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
バックアップに関する詳細を設定するためghettoVCB.shを編集します。
# vi ghettoVCB.sh
# バックアップ先のデータストア(NFSでほかのサーバをマウントしておく)およびフォルダを指定
VM_BACKUP_VOLUME=/vmfs/volumes/nfs/backup
# バックアップファイルのフォーマットを指定
DISK_BACKUP_FORMAT=thin
# バックアップの世代数を設定
VM_BACKUP_ROTATION_COUNT=3
上記が必要最低限の設定になります。実際に設定できる項目は上記以外にも多数ありますがここでは割愛します。
バックアップの実行
続いてバックアップ対象とする仮想マシンのリストファイルを作成します。これはスクリプトの実行時に引数としてファイル名を渡しますのでファイル名は任意のもので構いません。以下ではvmlist.txtとして作成しています。内部には仮想マシン名を書きます
# vi vmlist.txt
web001
web002
db001
ここまできたら手動でバックアップを実行してみます。最初にスナップショットが作成されクローンが開始されます。
./ghettoVCB.sh -f ./vmlist.txt
するとこんな感じに
Logging output to "/tmp/ghettoVCB-2017-01-30_11-25-03-38093.log" ...
2017-01-30 11:25:04 -- info: \
============================== ghettoVCB LOG START ==============================
2017-01-30 11:25:04 -- info: CONFIG - VERSION = 2013_26_11_2
2017-01-30 11:25:04 -- info: CONFIG - GHETTOVCB_PID = 38093
2017-01-30 11:25:04 -- info: CONFIG - VM_BACKUP_VOLUME = /vmfs/volumes/nfs/backup
2017-01-30 11:25:04 -- info: CONFIG - VM_BACKUP_ROTATION_COUNT = 3
2017-01-30 11:25:04 -- info: CONFIG - VM_BACKUP_DIR_NAMING_CONVENTION = 2017-01-30_11-25-03
2017-01-30 11:25:04 -- info: CONFIG - DISK_BACKUP_FORMAT = thin
2017-01-30 11:25:04 -- info: CONFIG - POWER_VM_DOWN_BEFORE_BACKUP = 0
2017-01-30 11:25:04 -- info: CONFIG - ENABLE_HARD_POWER_OFF = 0
2017-01-30 11:25:04 -- info: CONFIG - ITER_TO_WAIT_SHUTDOWN = 3
2017-01-30 11:25:04 -- info: CONFIG - POWER_DOWN_TIMEOUT = 5
2017-01-30 11:25:04 -- info: CONFIG - SNAPSHOT_TIMEOUT = 15
2017-01-30 11:25:04 -- info: CONFIG - LOG_LEVEL = info
2017-01-30 11:25:04 -- info: CONFIG - BACKUP_LOG_OUTPUT = \
/tmp/ghettoVCB-2017-01-30_03-25-03-38093.log
2017-01-30 11:25:04 -- info: CONFIG - ENABLE_COMPRESSION = 0
2017-01-30 11:25:04 -- info: CONFIG - VM_SNAPSHOT_MEMORY = 0
2017-01-30 11:25:04 -- info: CONFIG - VM_SNAPSHOT_QUIESCE = 0
2017-01-30 11:25:04 -- info: CONFIG - ALLOW_VMS_WITH_SNAPSHOTS_TO_BE_BACKEDUP = 0
2017-01-30 11:25:04 -- info: CONFIG - VMDK_FILES_TO_BACKUP = all
2017-01-30 11:25:04 -- info: CONFIG - VM_SHUTDOWN_ORDER =
2017-01-30 11:25:04 -- info: CONFIG - VM_STARTUP_ORDER =
2017-01-30 11:25:04 -- info: CONFIG - RSYNC_LINK = 0
2017-01-30 11:25:04 -- info: CONFIG - EMAIL_LOG = 0
2017-01-30 11:25:04 -- info:
2017-01-30 11:25:09 -- info: Initiate backup for web001
2017-01-30 11:25:09 -- info: Creating Snapshot "ghettoVCB-snapshot-2017-01-30" for web001
Destination disk format: VMFS thin-provisioned
Cloning disk '/vmfs/volumes/datastore1/web001/web001_3.vmdk'...
Clone: 98% done.
Destination disk format: VMFS thin-provisioned
Cloning disk '/vmfs/volumes/datastore1/web001/web001.vmdk'...
Clone: 98% done.
2017-01-30 11:31:19 -- info: Removing snapshot from web001 ...
2017-01-30 11:31:20 -- info: Backup Duration: 6.18 Minutes
2017-01-30 11:31:20 -- info: Successfully completed backup for web001!
2017-01-30 11:31:23 -- info: ###### Final status: All VMs backed up OK! ######
2017-01-30 11:31:23 -- info: \
============================== ghettoVCB LOG END ================================
うまく実行されるのを確認したら、cronに組み込みます
まず、再起動した場合にも設定が消えないように
/etc/rc.local.d/local.sh
に記述
vi /etc/rc.local.d/local.sh
/bin/echo "0 22 * * * /bin/sh /vmfs/volumes/datastore1/backup/ghettoVCB-master/ghettoVCB.sh -f /vmfs/volumes/datastore1/backup/ghettoVCB-master/vmlist.txt" >> /var/spool/cron/crontabs/root
/bin/kill $(cat /var/run/crond.pid)
/bin/busybox crond
次に、cronにも設定
vi /var/spool/cron/crontabs/root
0 22 * * * /bin/sh /vmfs/volumes/datastore1/backup/ghettoVCB-master/ghettoVCB.sh -f /vmfs/volumes/datastore1/backup/ghettoVCB-master/vmlist.txt
とりあえず、これで万が一仮想ホストがトラブっても日次バックアップまでは復帰できる。