PTP を使用して ESXi を時刻同期する
Table of contents
はじめに
前回の記事では vSphere 7 で実装された PTP 関連の機能のうち、仮想マシンのプレシジョンクロックデバイスを取り上げました。今回の記事ではもう一つの機能である ESXi の PTP による時刻同期を試してみたいと思います。
なお、PTP のプロトコルの概要は省きますが、前回の記事で挙げた参考 URL のほか、Cisco の有志の方が書かれている以下の記事も参考になると思います。
グランドマスタークロックのセットアップ
前置き:今回の記事の構成
本来はグランドマスタークロックとして PTP 対応の原子時計などを用意し、境界クロック(BC)やトランスペアレントクロック(TC)として機能するスイッチなどを経由して、末端のスレーブクロックに接続することでマイクロ秒~ナノ秒レベルの同期精度が維持されます。
今回の記事では単純な機能のテスト目的のため、グランドマスタークロックを仮想マシンの CentOS 8 Stream + ptp4l で用意し、ESXi と同じネットワークセグメントに接続するだけの構成としています。
クロック精度のハードウェア支援や BC/TC も無いため同期精度は完全に無視していますので、あくまでもテスト目的であり、決して本番環境向けの構成ではないことを予めご認識おきください。
セットアップ手順
まずは CentOS 8 Stream をインストールした後、linuxptp パッケージをインストールします。linuxptp パッケージに PTPv2 を実装したプログラム(ptp4l 等)が含まれています。
1# yum install linuxptp
次に、ソフトウェアタイムスタンプを利用するよう ptp4l を構成します。ptp4l.conf の time_stamping オプションを hardware から software に編集することで可能です。
1# vi /etc/ptp4l.conf
2
3 (略)
4time_stamping software
また、適切な NIC を使用するように ptp4l の -i オプションを指定します。/etc/sysconfig/ptp4l を編集することで可能です。
1# vi /etc/sysconfig/ptp4l
2
3OPTIONS="-f /etc/ptp4l.conf -i ens33"
最後に ptp4l サービスを起動・有効化します。他に PTP のマスターがなければ自身がグランドマスターになります。
1# systemctl enable --now ptp4l.service
これで PTP のマルチキャストパケットが送信されるようになります。適宜、Wireshark や tcpdump などでパケットが送出されているか確認してください。
ESXi での PTP の構成
ESXi で PTP を構成する場合、vSphere Client でホストの [設定] > [システム] > [時間の設定] を開き、[Precision Time Protocol (PTP)] の右の [編集] をクリックします。
[Precision Time Protocol の編集] ダイアログが表示されるので、[有効化] にチェックを入れた後、PTP のパケットを受信する VMkernel ポートを選択し、[OK] で完了します。これにより PTP の構成とファイアウォールルールの有効化が行われます。
最後に、ホストの [設定] > [サービス] から [PTP Daemon] サービスを起動しておきます。サービスの起動ポリシーは必要に応じて変更してください。
ESXi での PTP の構成は以上です。なお、ESXi の PTP の実装としては PTPd が slaveonly モードで起動されているようです。
ESXi での時刻同期の確認
マスターから PTP パケットを正常に受信できていれば、ESXi の /var/run/log/ptpd.stats にマスターの MAC アドレスを含むメッセージが記録されます。こちらのログファイルは ESXi Shell から確認できます。以下は 00:0c:29 1d:da:ab の MAC アドレスのマスターから受信した場合の例です。
1# tail -f /var/run/log/ptpd.stats
2
32021-06-17 17:09:55.780497, slv, 000c29fffe1ddaab(unknown)/1, 0.000158176, -0.197176563, 0.197339595, -0.196736833, -500000.000000000, D, 06462, 0.000156068, 2646, -0.202338727, 1502252, -500000, 0, -0.196736833, 0.197339595
42021-06-17 17:09:56.781782, slv, 000c29fffe1ddaab(unknown)/1, 0.000158176, -0.196595500, 0.197339595, -0.196138752, -500000.000000000, S, 04630, 0.000156068, 2646, -0.202338727, 1502252, -500000, 0, -0.196138752, 0.197339595
また、現在の PTP の状態は esxcli system ptp stats get コマンドで確認可能です。正常に同期されている場合はマスターの ID や IP アドレス1、Clock status に caribrated, in control と表示されるようです。
1# esxcli system ptp stats get
2Metric Value
3------------------ -----
4Announce received 3490
5Best master ID 000c29fffe1ddaab(unknown)/1Best master IP : 192.168.0.6
6Clock Source ptp
7Clock correction -7.433 ppm, mean -7.147 ppm, dev 0.177 ppm
8Clock status calibrated, in control
9Delay mechanism E2E
10DelayReq sent 7138
11DelayResp received 4310
12Follow-up received 6963
13GM priority Priority1 128, Priority2 128, clockClass 248
14Host info esxi-01.tanzu.local, PID 1816856
15Interface vmk0
16 (略)
17Transport ipv4, multicast
18UTC properties UTC valid: N, UTC offset: 37
もし PTP のトラブルシューティングが必要になる場合、ESXi 側ではこれらの PTP 関連の情報や、pktcap-uw を使って各キャプチャポイントで PTP のマルチキャストパケットが確認できるかといった点を確認する必要があると思います。
プレシジョンクロックと時刻同期プロトコルの互換性設定
前回の記事では仮想マシンにプレシジョンクロックを構成し、ホストとゲストを時刻同期しました。
プレシジョンクロックは以下のように仮想マシンの設定からホストの時刻同期プロトコルとの互換性を指定することができます。プロトコルの互換性は [任意]、[NTP]、[PTP] のいずれかを選択します。
NTP または PTP を指定した場合、指定の時刻同期プロトコルで同期されていないホスト上ではその仮想マシンは実行できなくなります。これにより、ゲストOSの時刻を PTP の精度で同期したいのに、意図せず NTP で同期しているホストと時刻を合わせてしまい精度が出ないといったケースを避けられます。
以下は DRS が完全自動化のクラスタで PTP が無効なホストのみとし、プレシジョンクロックデバイスで [ホスト システムの時刻 (PTP)] を選択している状態でパワーオンした場合の例です。PTP が構成済み(=互換性がある)のホストがクラスタ内に存在しないため、DRS が仮想マシンのパワーオンに失敗しています。
スクリーンショット上では欠けていますが、DRS がパワーオンに失敗した理由として「“デバイス”「Precision Clock 1」が、アクセスできないバッキング「ptp」を使用しています。」のメッセージが表示されています(データセンターの [監視] > [タスク] からも確認できます)。
なお、DRS が無効の場合、右上の黒いダイアログは表示されますが、真ん中の DRS のパワーオン失敗ダイアログは表示されません。この場合は仮想マシンの [監視] > [タスク] から失敗したタスクの詳細を確認できます。
おわりに
今回は PTP を使った ESXi の時刻同期を試してみました。前回の記事にも書きましたが、PTP による ESXi の時刻同期とプレシジョンクロックによるホスト-ゲスト間の時刻同期を組み合わせることで vSphere システム全体で高い精度の時刻同期が可能になると思います。vSphere 環境での時刻同期に新しい選択肢が増えたということで是非今後にも期待したいですね。
補足:VMkernel ポートでのマルチキャストの受信で遭遇した事象
私の環境では VMkernel ポートも仮想マシンも1つの VDS 7.0 に収容していますが、VDS で IGMP/MLD スヌーピングを有効にすると仮想マシンは問題ないものの、なぜか VMkernel ポートで PTP のマルチキャストパケットが受信できませんでした。
VDS 7.0 以降はマルチキャストフィルタリングモードが [IGMP/MLD スヌーピング] になっていますが、私の環境では [基本] に設定変更すると受信できるようになりました。仕様なのか構成依存の問題なのかといった確認までは行っていません2が、似たような状況が発生したら試してみるのは良いかもしれません。
-
Best master ID と Best master IP が繋がって1行になってますが、コピペミスではなく実際に1行で出てました。 ↩︎
-
netdbg vswitch mcast_filter や pktcap-uw、ホストの IGMP 関連の詳細設定をいじるなど色々試してみて、VMkernel ポートが送出する IGMP パケットから宛先 IP アドレス(IGMPv2)やソース IP アドレス(IGMPv3)が登録されない(マルチキャスト MAC アドレスは登録される)ようであるところまでは確認してますが、VMkernel ポートに言及しているマルチキャスト周りの公開情報やコミュニティの情報がそもそも全く見当たらないので、仕様か構成依存か何なのかは不明でした。 ↩︎