Japan VMUG local meeting June 28th

今回の Local Meeting は,長年の友人であるパソナグループ林さんに会場を提供してもらい,大手町牧場見学からスタートしました. 最近は vBeer まで賑わっている Local Meeting(もう敢えて「部会」と呼ばずにいます) ですが,vmug.com の Communities Site を活用するようになったおかげで,なんと Miami から PaulJan が参加してくれました.海外メンバーの参加は Japan VMUG 初であり,セッションは当然日本語オンリーなのですが,そこは流石 Japan VMUG メンバー,多くのプレゼンターが島村さんの呼びかけに応えて,発表資料を英語で用意してくれました!さりげない配慮が当たり前のようにできるコミュニティってやっぱり最高です. f:id:tcpninja:20190702110922j:plain

部会の内容は山崎さん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

etc/ssh ディレクト

ここには公開鍵と秘密鍵が保存されています.(なので,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

etc/vmware ディレクト

このディレクトリにある 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>

etc/vmware/ssh ディレクト

ここには証明書と鍵が保存されています.

-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 します.

f:id:tcpninja:20190701163532p:plain
Troubleshooting Option で 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 が他で使われた際に問題になりそうですが,暫定対応時の選択肢くらいにはなるかと思います.)