今回の Local Meeting は,長年の友人であるパソナグループ林さんに会場を提供してもらい,大手町牧場見学からスタートしました. 最近は vBeer まで賑わっている Local Meeting(もう敢えて「部会」と呼ばずにいます) ですが,vmug.com の Communities Site を活用するようになったおかげで,なんと Miami から Paul と Jan が参加してくれました.海外メンバーの参加は Japan VMUG 初であり,セッションは当然日本語オンリーなのですが,そこは流石 Japan VMUG メンバー,多くのプレゼンターが島村さんの呼びかけに応えて,発表資料を英語で用意してくれました!さりげない配慮が当たり前のようにできるコミュニティってやっぱり最高です.
部会の内容は山崎さんの FB レポートにお任せして,私は自分のプレゼン内容について報告しておきます.
今回のテーマは「HOL・ラボ・検証環境」だったので,以前清水さんが中小部会で発表していたネタをベースに,vim-cmd で ESXi ホスト設定バックアップ / リストアした挙動について紹介しました.検証目的で変更した設定を戻すにも便利ですが,障害対策の為にも何がリストアできるのか知っておくのは大切です.
1. まずは vim-cmd hostsvc/firmware/backup_config
ESXi ホスト上で実行すると configBundle-FQDN.tgz ファイルが生成されるので,展開して中身を見て行きます. (設定ファイル中の vmug-eval.jp は架空のドメインです.)
-rwx------@ 1 kaz staff 153 6 11 14:31 Manifest.txt -rwx------@ 1 kaz staff 63 6 11 14:31 jumpstrt.gz -rwx------@ 1 kaz staff 13106 6 11 14:31 state.tgz
Manifest.txt
この中に UUID が定義されています.
RELEASELEVEL=VMware ESXi 6.7.0 Update 2 UUID=00000000-0000-0000-0000-AC1F6BB9ECDC KERNELOPTS= installerDiskDumpSlotSize=2560 no-auto-partition USEROPTS=
state.tgz
このファイルにバックアップ元の /etc/vmware がアーカイブされていて,展開すると etc ディレクトリが現れます.
-rwx------@ 1 kaz staff 153 6 11 14:31 Manifest.txt drwxr-xr-x@ 18 kaz staff 576 6 18 17:19 etc ^^^ -rwx------@ 1 kaz staff 63 6 11 14:31 jumpstrt.gz -rwx------@ 1 kaz staff 13106 6 11 14:31 state.tgz
etc の中
見慣れたファイルが揃っています(笑).いくつか中身を見ていきます.
-rw-r--r--@ 1 kaz staff 1326 6 11 13:55 chkconfig.db -rw-r--r--@ 1 kaz staff 0 6 11 13:54 dhclient-vmk0.leases -rw-r--r--@ 1 kaz staff 219 6 11 13:55 hosts -rw-r--r--@ 1 kaz staff 12 6 11 13:54 keymap -rw-r--r--@ 1 kaz staff 268 6 11 13:54 krb5.conf -rw-r--r--@ 1 kaz staff 114 6 11 13:54 ntp.conf -rw-r--r--@ 1 kaz staff 7 6 11 13:54 ntp.drift -rw-------@ 1 kaz staff 512 6 11 13:55 random-seed -rw-r--r--@ 1 kaz staff 74 6 11 13:54 resolv.conf drwxr-xr-x@ 3 kaz staff 96 6 18 17:19 security drwxr-xr-x@ 3 kaz staff 96 6 18 17:19 sfcb -rw-------@ 1 kaz staff 266 6 11 13:54 shadow drwxr-xr-x@ 4 kaz staff 128 6 18 17:19 ssh -rw-r--r--@ 1 kaz staff 344 6 11 13:55 vmsyslog.conf drwxr-xr-x@ 5 kaz staff 160 6 18 17:19 vmsyslog.conf.d drwxr-xr-x@ 12 kaz staff 384 6 18 17:19 vmware
etc/chkconfig.db
ホストと連動して自動起動するサービスの設定です.バックアップ前に自動起動するよう変更した ssh の設定がしっかりと残っています.
# VMvisor chkconfig database /etc/init.d/vsanObserver off /etc/init.d/cmmdsTimeMachine off /etc/init.d/vsantraced off /etc/init.d/vsandevicemonitord off /etc/init.d/ESXShell off /etc/init.d/SSH on ^^ /etc/init.d/DCUI on /etc/init.d/ntpd on /etc/init.d/vsanmgmtd off …
etc/hosts
普通に hosts ファイルですね(笑).
# Do not remove the following line, or various programs # that require network functionality will fail. 127.0.0.1 localhost.localdomain localhost ::1 localhost.localdomain localhost 10.100.2.55 esxi.vmug-eval.jp esxi
etc/ntp.conf
NTP の設定もしっかり残っています.(検証なので Time サーバ 1 台しか指定してません.)
restrict default nomodify notrap nopeer noquery restrict 127.0.0.1 driftfile /etc/ntp.drift server 10.100.2.99
etc/resolv.conf
DNS 設定も保存されています.
nameserver 10.100.2.111 nameserver 10.100.2.112 search vmug-eval.jp
ここには公開鍵と秘密鍵が保存されています.(なので,Bundle をこのまま戻してリストアするのは問題ありませんが,別ホストとして Deploy するとなると,この鍵を取り替えなければなりません.)
-r--------@ 1 kaz staff 1704 6 11 13:54 ssh_host_rsa_key -rw-------@ 1 kaz staff 381 6 11 13:54 ssh_host_rsa_key.pub
このディレクトリにある esx.conf が肝だと思っていますが,先にさらっと他のファイルを見ておきます.
-rw-r--r--@ 1 kaz staff 136 6 11 14:31 .backup.counter -rw-r--r--@ 1 kaz staff 512 6 11 14:30 dvsdata.db -rw-r--r--@ 1 kaz staff 30297 6 11 14:19 esx.conf drwxr-xr-x@ 7 kaz staff 224 6 18 17:19 hostd drwxr-xr-x@ 3 kaz staff 96 6 18 17:19 iofilters -rw-------@ 1 kaz staff 311 6 11 13:54 license.cfg -rw-r--r--@ 1 kaz staff 51 6 11 13:55 locker.conf -rw-r--r--@ 1 kaz staff 75 6 11 13:54 lunTimestamps.log drwxr-xr-x@ 3 kaz staff 96 6 18 17:19 rabbitmqproxy drwxr-xr-x@ 5 kaz staff 160 6 18 17:19 ssl
etc/vmware/license.cfg
今回は評価ライセンスなので加工せずに載せます(笑).
<ConfigRoot> <epoc>AQD+yggAAAAKh39xjeBSHTQAAACxYbmtz5JFkzh4DS420/puy5mQ83uwO5MINOiK+wC33wLBsLn3ZF/CEneCo3z8ROvI/XgR</epoc> <float>yv7a2rrd7K9mx1mEK8NdgEOsTMc+g0+Se4lDmmTbCoAoj1/UeJ8Fj0/wdLBP8jvlEKxJ2WuFG8Y3ixKfsL875kqiPuFDrjLtJcdZhBzDXYAFzyr0/rkVzk8a2bM=</float> <mode>eval</mode> <owner/> </ConfigRoot>
ここには証明書と鍵が保存されています.
-rw-r--r--@ 1 kaz staff 1050 6 11 13:54 castore.pem -rw-r--r--@ 1 kaz staff 1428 6 11 13:54 rui.crt -r--------@ 1 kaz staff 1704 6 11 13:54 rui.key
ちなみに,鍵は前述のと同じものです.(別サーバとして Deploy するにはこれも差し替えが必要ですね.)
$ diff ./rui.key ../../ssh/ssh_host_rsa_key $
1.1 esx.conf
このファイル中に ESXi ホストの設定がぎっしり詰まっているようなので,少しゆっくり見ていきましょう.
system uuid
esxcfg-info -y で表示される system uuid です.(Manifest の uuid は esxcfg-info -u で表示できます.)
... /system/uuid = “5cfe436c-9594-66be-0780-ac1f6bac9d10" ...
vmnic 等
それぞれの物理 MAC アドレスと Virtual MAC アドレスが記載されています.
... /net/pnic/child[0000]/mac = "ac:1f:6b:b9:ec:dc" /net/pnic/child[0000]/virtualMac = "00:50:56:54:d3:f3" /net/pnic/child[0000]/name = “vmnic0" ... /net/pnic/child[0002]/mac = "ac:1f:6b:ac:9d:10" /net/pnic/child[0002]/virtualMac = "00:50:56:5b:e4:b2" /net/pnic/child[0002]/name = "vmnic2" ...
vSwitch
今回の検証環境は vSS です.vSS の名前,MTU サイズ,アップリンクやポートグループ,チーミングポリシーで設定したロードバランス等,全て記載されています.
... /net/vswitch/child[0000]/name = “vSwitch0" ... /net/vswitch/child[0000]/mtu = "8900" ... /net/vswitch/child[0000]/teamPolicy/maxActive = "2" /net/vswitch/child[0000]/teamPolicy/uplinks[0001]/pnic = "vmnic2" /net/vswitch/child[0000]/teamPolicy/uplinks[0000]/pnic = "vmnic0" ... /net/vswitch/child[0000]/portgroup/child[0000]/vlanId = "2040" /net/vswitch/child[0000]/portgroup/child[0000]/name = "Management Network" ... /net/vswitch/child[0000]/teamPolicy/team = "lb_ip" ...
VMKernel NIC
以下の例は NFS 用に定義しておいたものです.
... /net/vmkernelnic/child[0001]/name = "vmk1" /net/vmkernelnic/child[0001]/ipv4address = "10.100.3.55" /net/vmkernelnic/child[0001]/dhcpDns6 = "false" /net/vmkernelnic/child[0001]/portgroup = "NFS" /net/vmkernelnic/child[0001]/mac = "00:50:56:61:8a:d4" /net/vmkernelnic/child[0001]/tsoMss = "0" /net/vmkernelnic/child[0001]/dhcpDns = "false" /net/vmkernelnic/child[0001]/netstackInstance = "defaultTcpipStack" /net/vmkernelnic/child[0001]/ipv6gateway = "::" /net/vmkernelnic/child[0001]/dhcp = "false" /net/vmkernelnic/child[0001]/enable = "true" /net/vmkernelnic/child[0001]/ipv4netmask = "255.255.255.0" /net/vmkernelnic/child[0001]/routAdv = "false" /net/vmkernelnic/child[0001]/ipv4broadcast = "10.100.3.255" /net/vmkernelnic/child[0001]/mtu = “8900" …
NFS 関連
NFS Datastore に接続していた情報も,NFS ホストの IP とディレクトリ,NFS クライアント接続のために自動的に開放された Firewall 設定,NFS チューニング用に Advanced Option で設定した TcpipHeapSize の値など,しっかりと残っていることも分かりました.
... /nas/NFS_wssd/host = "10.100.3.81" /nas/NFS_wssd/share = "/nfs4vsphere" /nas/NFS_wssd/enabled = "true" … /firewall/services/nfsClient/allowedip[0000]/ipstr = “10.100.3.81" … /adv/Net/TcpipHeapSize = “32” …
では,早速リストアしてみましょう!と行きたいところですが,元のホストに戻したら,完璧に元通りなので味気ないです(笑).そこで今回は同じ H/W 構成の別ホストへリストアします.
2. リストアの準備
同じ Build の ESXi をインストールした後,NIC の設定等煩雑なので,USB メモリから configBundle をコピーします. FAT16 であれば ESXi から直接参照できるので,ALt + F1 で ESXi Shell に Login します.
ESXi から USB メモリを直接マウントするために,usbarbitrator を停止しておきます.
... [root@localhost:~] /etc/init.d/usbarbitrator status usbarbitrator is running [root@localhost:~] /etc/init.d/usbarbitrator stop UsbUtil: Releasing all USB adapters to VMkernel watchdog-usbarbitrator: Terminating watchdog process with PID 2100448 usbarbitrator stopped …
USB メモリを差し込むと,以下の通り認識してくれますので,configBundle をロードしてみましょう.
... [root@localhost:~] esxcli storage core device list | grep -i usb Is USB: false Display Name: Local USB Direct-Access (mpx.vmhba32:C0:T0:L0) Vendor: USB Is USB: true [root@localhost:~] ls -la /vmfs/volumes/ | grep mpx.vmhba32:C0:T0:L0 lrwxr-xr-x 1 root root 22 Jun 19 00:46 NO NAME -> mpx.vmhba32:C0:T0:L0:1 drwxr-xr-x 1 root root 8 Jan 1 1970 mpx.vmhba32:C0:T0:L0:1 …
3. リストア!
ESXi ホスト設定のバックアップ / リストアについては KB2042141 で公開されています.今回は ESXi コマンドラインを使います. メンテナンスモードにして,USB メモリから /tmp にコピーしておいたバックアップからリストアを実行すると...
[root@localhost:~] vim-cmd hostsvc/maintenance_mode_enter [root@localhost:~] cd /tmp [root@localhost:/tmp] vim-cmd hostsvc/firmware/restore_config ./configBundle-esxi.vmug-eval.jp.tgz (vim.fault.FileNotFound) { faultCause = (vmodl.MethodFault) null, faultMessage = <unset>, file = “/tmp/configBundle.tgz” msg = “Received SOAP response fault from [<cs p:00000013fd682790, TCP:localhost:8307>]: restoreConfiguration File /tmp/configBundle.tgz was not found” }
ファイルが見つからないと怒られてしまいました.KB2042141 には "In this case, the configuration file was copied to the host's /tmp directory. " と任意のディレクトリやファイル名で良いように記載されていますが,どうも "/tmp/configBundle.tgz" で無いと失敗するようです. 気を取り直して,再挑戦.
[root@localhost:/tmp] mv ./configBundle-esxi.vmug-eval.jp.tgz ./configBundle.tgz [root@localhost:/tmp] vim-cmd hostsvc/firmware/restore_config ./configBundle.tgz (vim.fault.MismatchedBundle) { faultCause = (vmodl.MethodFault) null, faultMessage = <unset>, bundleUuid = “00000000-0000-0000-0000-AC1F6BB9ECDC” hostUuid = “00000000-0000-0000-0000-AC1F6BBA2A8C” bundleBuildNumber = 1, hostBuildNumber = 1 msg = “Received SOAP response fault from [<cs p:0000007b608b5790, TCP:localhost:8307>]: restoreConfiguration fault.MismatchedBundle.summary” }
これは別ホストなので UUID が違いますから怒られて当然です.KB2042141 にも書いてありますが敢えてやってみました(笑). ターゲットホストの UUID を確認してみましょう.(バックアップ元は UUID=00000000-0000-0000-0000-AC1F6BB9ECDC でした.)
[root@localhost:~] esxcfg-info -u 00000000-0000-0000-0000-AC1F6BBA2A8C
では,UUID のミスマッチをオーバーライドするオプション "1" を付けて実行しましょう.コマンドが正しく通ると直後にホストが再起動します.
[root@localhost:/tmp] vim-cmd hostsvc/firmware/restore_config 1 ./configBundle.tgz
4. ホストの確認
同 H/W 構成のホストへのリストアですが,ネットワーク接続も NFS Datastoreのマウントも問題なくリストアができました. でも,何か気になりませんか?元の configBundle.tgz 中の esx.conf ですが
/net/pnic/child[0000]/mac = "ac:1f:6b:b9:ec:dc" /net/pnic/child[0000]/virtualMac = "00:50:56:54:d3:f3" /net/pnic/child[0000]/name = “vmnic0"
の通りバックアップを取得したホストの Mac アドレスが記載されているのです.この configBundle.tgz をリストアされた別ホストの Mac アドレスは別物なのですが,/etc/vmware/esx.conf にはバックアップ元の Mac アドレスが記載されたまま動いているようです.(system uuid もバックアップ元のもので動いています.)
リストア前のホストの esx.conf
/system/uuid = "5d09c5bc-7218-fb98-71e9-ac1f6bac92f2” … /net/pnic/child[0000]/mac = "ac:1f:6b:ba:2a:8c" /net/pnic/child[0000]/virtualMac = "00:50:56:51:e4:5d” /net/pnic/child[0000]/name = “vmnic0" …
リストア後のホストの esx.conf
/system/uuid = "5cfe436c-9594-66be-0780-ac1f6bac9d10” … /net/pnic/child[0000]/mac = "ac:1f:6b:b9:ec:dc" /net/pnic/child[0000]/virtualMac = "00:50:56:54:d3:f3” /net/pnic/child[0000]/name = “vmnic0" …
念のためバックアップ元とリストア先のホストで物理 MAC 確認すると,以下の通りです.
バックアップ元
[root@esxi:~] esxcli network nic list Name PCI Device Driver Admin Status Link Status Speed Duplex MAC Address ------ ------------ ------ ------------ ----------- ----- ------ ----------------- vmnic0 0000:1a:00.0 i40en Up Up 10000 Full ac:1f:6b:b9:ec:dc
リストア先
[root@esxi:~] esxcli network nic list Name PCI Device Driver Admin Status Link Status Speed Duplex MAC Address ------ ------------ ------ ------------ ----------- ----- ------ ----------------- vmnic0 0000:1a:00.0 i40en Up Up 10000 Full ac:1f:6b:ba:2a:8c
Meeting で山崎さんから物理ルータからどう見えてるの?って質問されて「しまった!」と思いました.近々再検証の時間確保して確かめてみたいと思います.(通常,物理ルータが保持している MAC は esxcli network nic list で表示される方の "/net/pnic/child[XXXX]/mac" のアドレスです.)
5. まとめ
ESXi ホストのバックアップは,元のホストにリストアするのは問題無し,別ホストに対しても有効なので,緊急時には利用できそうですが,esx.conf の値が物理サーバとミスマッチのままなので,そのまま実運用を続けるには不安が残りました. configBundle.tgz を使った Deployment は,証明書や鍵以外にも,esx.conf 含めホストの個別設定を変更する必要があるので,手間を考えると NG ですね.
* 追記(2019/07/04)
ルータ側で Management Network の arp を確認してみましたが,想定通りバックアップ元の MAC アドレスのままでした.
CoreRouter#show arp | include 10.100.2.55 Internet 10.100.2.55 11 ac1f.6bb9.ecdc ARPA Vlan2040
VMkernel アダプタの MAC アドレスは ESXi をインストールした物理 MAC アドレスが esx.conf 中に保存され,通信にはこの MAC アドレスが使われているようです.物理 NIC が変わっても esx.conf 中の MAC アドレスで通信するので,configBundle を別マシンにリストアしても,変更作業無しでバックアップ元ホストとして接続できます.( MAC アドレスがミスマッチのままでは,バックアップ元の物理 NIC が他で使われた際に問題になりそうですが,暫定対応時の選択肢くらいにはなるかと思います.)