数年に一度、休日中にやってくる職場ビルの計画停電に備え、 VMware ESXi ホスト群や 仮想マシン 、QNAP NAS の停電前 シャットダウン と復電後の 始動 が無人でも行えるよう、数年後の自分へ向けての作業記録です。
電力裝置定期檢測
ビル管理会社から休日夜間の計画停電の通知を受けた際、以前にもあったなと思って調べてみると、香港では商業ビルの5年毎の定期検査証明書WR2更新が義務付けられているのだそう。
休日出勤することなくVMware ESXiハイパーバイザ群とそこへ内包される仮想マシン、QNAP NASを停電前に自動シャットダウンさせ、復電後に自動始動させるに当たり、どうせまたいつか必要になるならと、未来の自分用に手順をまとめるのがこの記事の主旨です。
現在運用している物理サーバは次の4つ。
- IBM x3650M3 (IMM) VMware ESXi 6.7.0U1
- Lenovo x3650M5 (IMM2) VMware ESXi 6.7.0U1
- Lenovo x3650M5 (IMM2) VMware ESXi 6.7.0U1
- QNAP TVS-EC880 QTS 5.15.2679
いずれも中に仮想マシンをはらんでいるので、停電前に仮想マシンのシャットダウンを済ませてから安全に物理サーバを落とす要領。復電後は物理サーバを始動させれば、その中の仮想マシンは順次自動起動するようになっているはず。
VMware ESXi 内仮想マシンのシャットダウン
3機のESXiホストはvCenterの管理下にあるので、普段よりvMA (vSphere Management Appliance) のcronに仮想マシンのクローニングバックアップや、シャットダウン、始動を制御していました。
今回利用するVMシャットダウン用のバッチファイルは以下の通り。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
#!/bin/bash ## VM POWER OFF SCRIPT FOR vCENTER ## ## Usage: vm_halt.sh vmStr tgtDS ## Ex: vm_halt.sh SRV09 [VD3_vm25] # PARAMETER CHECK echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $1] ${0##*/} Batch Raised" if [ $# -lt 2 ] then echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $1] Argument must be provided. Batch Aborted\n\n" exit 1 fi # VARIABLES export VI_USERNAME=administrator@###.#### export VI_PASSWORD=################## export VI_SERVER=192.168.###.### vmStr=$1 tgtDS=$2 tgtHst=`echo $tgtDS | sed -e "s/^.VD.*_vm/192.168.###./;s/]$//"` echo "VM : $vmStr" echo "VI Host: $tgtHst" echo "Datastore: $tgtDS" # PING CHECK TO vCSA & VIhosts ping -c 1 $VI_SERVER > /dev/null 2>&1 if [ $? != 0 ] then echo -e "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] $VI_SERVER vCenter Offline. Batch Aborted\n\n" exit 1 fi ping -c 1 $tgtHst > /dev/null 2>&1 if [ $? != 0 ] then echo -e "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] $tgtHst VI Host Offline. Batch Aborted\n\n" exit 1 fi # GET REAL VMX PATH tgtVmxPath=`vmware-cmd -h $tgtHst -l | grep /$vmStr/$vmStr` vmstat="Unregistered" if [ -n "$tgtVmxPath" ] then vmstat=`vmware-cmd -h $tgtHst $tgtVmxPath getstate` fi echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] VM Status: $vmstat" # ABORT IF TARGET VM IS ALREADY DOWN if [[ ! -z `echo $vmstat | grep "getstate() = off"` ]] then echo -e "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] $vmStr at $tgtHst is halted already. Batch Aborted\n\n" exit 1 fi # SEND START COMMAND vmstat=`vmware-cmd -h $tgtHst $tgtVmxPath stop soft` echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] VM Start: $vmstat" # CONFIRM VM STATUS sleep 60s vmstat=`vmware-cmd -h $tgtHst $tgtVmxPath getstate` echo "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] VM Status: $vmstat" # END echo -e "[`date +"%Y/%m/%d(%a) %k:%M:%S"` $vmStr] ${0##*/} Batch Completed\n\n" |
cron実行時に標準出力をログファイルに書き出すようにしていて、それをEメールで定期送信されるところまでは既に構築済み。仮想マシン1つ分のシャットダウンログはこんな感じ。
|
1 2 3 4 5 6 7 8 |
[2024/03/31(Sun) 21:03:01 SRV15] vm_halt.sh Batch Raised VM : SRV15 VI Host: 192.168.###.### Datastore: [VD2_vm25] [2024/03/31(Sun) 21:03:11 SRV15] VM Status: getstate() = on [2024/03/31(Sun) 21:03:19 SRV15] VM Start: stop() = 1 [2024/03/31(Sun) 21:03:27 SRV18] VM Status: getstate() = off [2024/03/31(Sun) 21:03:27 SRV18] vm_halt.sh Batch Completed |
vCenterサーバやvMAも仮想マシンなので、他の仮想マシンを全て落としたら、vCenterサーバを上述のバッチで落とし、最後にvMA自身を shutdown -h now で落とします。
cronで指定できるのは日時までで年は指定できないので、月日時刻で記述したエントリは来年の同じ月日時刻にも実行されます(当たり前)。使い終わったエントリは消すかコメントアウトを忘れずに(前科あり)。
|
1 |
03 21 31 3 * user /home/user/vm_halt.sh SRV15 [VD2_vm25] >> /home/user/log/vm_cloneVC |
VMware ESXi ホスト自身のシャットダウン
ESXiハイパーバイザにcronが隠されていることを最近知ったので、今回初めて利用してみます。ESXiホストのSSHを有効にしてターミナルアクセス。既にシステムが内部的に利用しているエントリがありました。
|
1 2 3 4 5 6 7 8 9 10 |
[root@vm26:~] date Tue Mar 26 05:19:50 UTC 2024 [root@vm26:~] 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 * * * * * /etc/cim/ibm/refresh.sh # Refresh the firewall settings every one minute |
ここで気を付けなければならいことは、UTCで設定する必要があるということ。例えば香港時間 21:30 に実行したければ、同日の 13:30UTC となります。
そして、ESXiホストをシャットダウンするコマンドは、 poweroff で良さそう。
先ほどのcronファイルの終わりに次のエントリを追加し、必ず :wq! で強制書き込み終了させます。
|
1 |
30 13 31 3 * /bin/poweroff |
最後に以下の要領でcronプロセスを再起動して反映させます。
|
1 2 3 4 5 6 7 |
[root@vm26:~] vi /var/spool/cron/crontabs/root [root@vm26:~] cat /var/run/crond.pid 5484059 [root@vm26:~] kill $(cat /var/run/crond.pid) [root@vm26:~] /usr/lib/vmware/busybox/bin/busybox crond [root@vm26:~] cat /var/run/crond.pid 5484274 |
以上を3機のESXiホスト全てに設定。復電後の起動後、ログを確認すると確かに時間どおりにシャットダウンしてくれました。
|
1 2 3 4 5 |
2024-03-31T13:30:01.518Z: [UserLevelCorrelator] 2351353796514us: [vob.user.host.stop.shutdown] Host is shutting down. 2024-03-31T13:30:01.518Z: [UserLevelCorrelator] 2351353797039us: [esx.audit.host.stop.shutdown] Host is shutting down. 2024-03-31T13:30:01.518Z: [GenericCorrelator] 2351353796514us: [vob.user.host.stop.shutdown] Host is shutting down. 2024-04-01T03:21:42.482Z: [netCorrelator] 23211202us: [vob.net.vmnic.linkstate.up] vmnic vmnic4 linkstate up 2024-04-01T03:21:43.002Z: [netCorrelator] 23853973us: [esx.clear.net.vmnic.linkstate.up] Physical NIC vmnic4 linkstate is up |
ESXiホストに隠されているcron機能には1つ難点があり、今回のように後から書き加えたエントリは、ホスト再起動後消えてしまいます。これを永続的に使いたい場合のテクニックについては、また別の機会に検証したいと思います。
VMware ESXi ホストの自動始動
IBM / Lenovoサーバに備わっている管理機能 IMM ( Integrated Management Module )を使ったサーバ始動には、日付時刻を指定することもできるので、この機能を復電後のESXiホスト始動に使います。
IMMへログイン後、時刻同期を確認して狂いがないか確認します。x3650M5搭載のIMM-IIでは、 IMM Management の中にある IMM Properties ページにあります。
x3650M3に搭載されている初代IMMでは、 IMM Control の System Settings で確認できます(こちらはがっつり時計が遅れていました)。
続いて、サーバの電源を操作する機能は、IMM-IIでは Server Management 内の Server Power Actions に集約されています。
日時を指定して一度きりの電源オンを行なうには、 Power On Server at Specified Date and Time のアクションをクリックし、日時をセットします。
初代IMMではTasks内のPower/Restartページにある、Power On Server at Specified Timeをクリックしてサーバを始動させたい日時を入力します。
実は今回、停電が長引いたようで、IMMでセットした時刻はまだ絶賛停電中。結局リモートで各機のIMMのへアクセスして、即時電源オンを実行することに。復電予定時刻からもう少し余裕を持って始動するよう、設定しておけば良かったのかも知れません。
QNAP NAS TVS-EC880の自動シャットダウンと始動
QNAPのXeon搭載NAS TVS-EC880(関連記事はこちら)のVirtualization Station上には、Linuxベースの仮想マシンが終日稼働しています(Nextcloud構築記事はこちら)。
仮想マシンのシャットダウンは自身のcronに記述するとして、復電後の起動は、仮想マシンの自動起動設定が有効になっていることを確認しておきます。
続いて、QNAP NASの電源スケジュール設定は ControlPanel を開き、 システム → 電源 → 電源スケジュール で、シャットダウンの他に始動も設定可能です。
スケジュール通りに始動しなかった場合に備え、隣りの 電源復旧 タブで復電後即NASを始動するよう設定、さらにWOL ( Wake-on-LAN )も有効にしました。
こちらも結果的に遅れた復電後、電源復旧自動オンの設定が機能していました。












