プレシジョンクロックデバイスで ESXi とゲストOSを時刻同期
Table of contents
はじめに
vSphere 7.0 ではゲストの時刻同期に関する新機能としてプレシジョンクロックデバイスという新しい仮想デバイスが追加されています。
- Highlights of New Features and Improvements in vSphere 7/vSAN 7/NSX-T 3 for High Performance Computing and Machine Learning
- 仮想マシンへのプレシジョン クロック デバイスの追加
仮想マシンにプレシジョンクロックデバイスを構成すると、ゲストOSからは PTP ハードウェアクロック(PHC)というデバイスとして見えます。ゲストOSはこのデバイスを参照することで、ESXi のシステム時刻を取得して同期できるようになります。
今回の記事では Windows Server 2019 と Red Hat Enterprise Linux 8.3 でプレシジョンクロックデバイスを使用したホスト-ゲスト間の時刻同期を試してみたいと思います。
PTP (Precision Time Protocol)
時刻同期に広く使われているネットワークプロトコルとして NTP がありますが、NTP の精度は一般にミリ秒レベルです。これに対して PTP ではハードウェア(NIC)によるタイムスタンプと正確な転送遅延時間の測定により、ナノ秒以下の精度を目標として時刻同期を行うためのプロトコルとなっています。
PTP はマスター/スレーブ型のプロトコルで、(誤解を恐れずに言うと)グランドマスタークロックがタイムスタンプ情報をマルチキャストで配信、スレーブ(NIC)は受信したタイムスタンプ情報から自身のハードウェアタイムスタンプを限りなくマスターに近づけ、OS のシステム時刻は NIC から取得したハードウェアタイムスタンプを使用して同期します。
PTP の概要は日本語だと以下のセイコーソリューションズ社の Web サイトや Interop 2016 の資料、Red Hat 社の linuxptp のドキュメントなどが参考になるかなと思います。
- セイコーの「うるう秒」対策(第5回) 「うるう秒」を全く使わない時間系 | セイコーソリューションズ
→ 高精度時刻同期プロトコルIEEE1588 PTPのご紹介 - 2016-ShowNet-PTP (Precision Time Protocol)
- 第20章 ptp4l を使用した PTP の設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal
vSphere 7 での PTP サポート
vSphere 7 では PTP に関連する新機能として以下の2つの機能が追加されています。
- ESXi のシステム時刻の PTP による同期
- プレシジョンクロックデバイスをタイムソースとした ESXi とゲストOSの時刻同期
1つ目の ESXi のシステム時刻の PTP による同期は、特定の VMkernel ポートを PTP のマルチキャストの受信用に指定して、PTP による時刻同期を行います1。
2つ目は冒頭にも記載したように、仮想マシンに以下のプレシジョンクロックデバイスを構成することで、ゲストOSはこのデバイスから ESXi のシステム時刻を取得して時刻同期を行うことができます2。
ESXi 側で PTP による時刻同期を行い、ゲストOS側では ESXi のシステム時刻をプレシジョンクロック経由で参照することで、vSphere システム全体を PTP で時刻同期できることになります。以下の VMware Tech Zone の記事では Linux の ptp_vmw を使用する構成での時刻同期の経路が図示されています。
- Introducing ptp_vmw: A new Linux driver to Achieve High Time Synchronization Accuracy
→ ptp_vmw
→ …If the host is configured to use PTP, applications running on Linux VMs can also derive PTP synchronized time through the ptp_vmw driver.
ESXi の PTP による時刻同期と、仮想マシンのプレシジョンクロックはそれぞれ独立して使用できます。今回の記事はグランドマスタークロックが上手いこと用意できなかったので、ホスト側は検証用に手動設定と NTP で調整した上で、仮想マシンのプレシジョンクロックのみで試してみたいと思います。
仮想マシンへのプレシジョンクロックの追加
仮想マシンへのプレシジョンクロックの追加は以下のドキュメントに沿って実施します。
手順はシンプルで、仮想マシンがパワーオフの状態で [設定の編集] から [プレシジョンクロック] を追加します。仮想マシンはハードウェアバージョン 17 以上であることが必要で、パワーオン状態では追加できないため注意が必要です。
仮想マシンにプレシジョンクロックデバイスを構成したら、ゲストOSで PTP ハードウェアクロックをタイムソースとして参照するための構成を行います。ここはゲストOSによって異なりますが、今回の記事では Windows Server 2019 と Red Hat Enterprise Linux 8.3 の場合について記載します。
Windows Server 2019 ゲストでの構成
Windows ゲストの場合、VMware Tools 11.2.0 以降で Windows タイムサービスのプラグイン(vmwTimeProvider)としてサポートが追加されています。
新機能 「Windows 向けの VMware タイム プロバイダの構成」に対するサポートが追加されました。
vSphere 仮想マシン内で実行されている Microsoft Windows ネイティブ時刻同期サービス「W32Time」向けの新しいタイム プロバイダ プラグイン vmwTimeProvider が提供されています。このプラグインは、NTP および Active Directory ベースのタイム ソースの代わりに、プレシジョン クロック仮想デバイスと対話して基盤となる ESXi ホストの時間を提供します。
VMware Tools のインストーラは個別に VMware Customer Connect からもダウンロードできるので、以下 URL にアクセスして [VMware Tools for Windows, 64-bit in-guest installer] のインストーラを入手しておきます。
VMware公式のサイトではないですが VMware ESXi Patch Tracker を見ると最新の ESXi 7.0 Update 2a のイメージに VMware Tools 11.2.5 がバンドルされているようでした。ESXi 7.0 Update 2a へアップデート済みの場合はバンドルされている VMware Tools でも問題ないはずです。
Windows ゲスト上で VMware Tools のインストーラを実行したら [カスタム] を選択します(既にインストール済みの場合は [変更] を選択します)。
既定では [VMware タイム プロバイダ] がインストールされないため、クリックして [ローカル ハード ドライブにインストール] を選択してインストールを続行します。
インストールが完了したら、コマンドプロンプトか PowerShell で w32tm /query /status を実行し、タイムソースが vmwTimeProvider になっていることが確認できれば OK です。
なお、ホストとゲストの時刻があまりに大きく乖離していると vmwTimeProvider がタイムソースとして信頼されない場合があるようです(24時間ずらしたら遭遇しました)。その場合、まずはホストとゲストを手動で正しい時刻に修正した上で、再度、Windows タイムサービスによる同期を実施するなどの対応を試してみてください。
Red Hat Enterprise Linux 8.3 ゲストでの構成
Linux ゲストの場合、ドライバなどは Windows の VMware Tools のようなバイナリでは提供されていないため、VMware Flings から ptp_vmw ドライバのソースをダウンロードして README に沿って自前でビルドする必要があります。
つい最近知ったのですが Red Hat Enterprise Linux (以下 RHEL) 8.3 のリリースノートを見ると ptp_vmw ドライバが追加されていました。アップストリームの Linux Kernel 5.7 で追加されていたのは知っていたのですが、こちらが RHEL8 向けにバックポートされているようです。
6.1.21. 新しいドライバー グラフィックドライバーとその他のドライバー
- VMware virtual PTP clock driver (ptp_vmw.ko.xz)
12.33. Various
- ptp: add VMware virtual PTP clock driver commit
このため、RHEL 8.3 以降なら ptp_vmw ドライバが既定で組み込まれているので、OS をインストールするだけで PTP デバイスとして認識されます。
あとは、Chrony から PTP デバイスを参照できるよう、chrony.conf に refclock ディレクティブを追加してあげれば OK です。
なお、ptp_vmw ドライバ経由で提供される時刻情報は UNIX 時間(1970/1/1 00:00:00 からの経過時間)とのことで、提供された時刻がうるう秒かどうかの情報はありません。このため chrony.conf に “leapsectz right/UTC” の追記が必要なようです。RHEL のドキュメントや実際のファイルを見ると RHEL 8 では既定で本設定が含まれるようでした。
第7章 インフラストラクチャーサービス Red Hat Enterprise Linux 8 | Red Hat Customer Portal
RHEL 8 では、デフォルトの chrony 設定ファイル /etc/chrony.conf に、leapsectz ディレクティブが含まれます。
おわりに
今回の記事では vSphere 7 で追加されたプレシジョンクロックデバイスによるホスト-ゲスト間の時刻同期を構成してみました。
プレシジョンクロックデバイスによるゲストの時刻同期を使用した場合、少なくとも同一ホスト内の仮想マシン間では非常に高い精度での時刻同期が期待できます。ただ、ホストの時刻に依存するため、ホストの時刻同期が NTP の場合、ホストを跨いだ仮想マシン間では NTP と同じような同期精度になる可能性もあります(もちろん構成にもよるはずです)。
今回は行いませんでしたが、ESXi での PTP を使用した時刻同期と組み合わせることで vSphere システム全体で高い精度の時刻同期が可能になると思います。今のところ(新しい機能なので)私はまだ本番環境での導入事例までは見たことがないのですが、vSphere 環境での時刻同期に新しい選択肢が増えたということで是非今後にも期待したいですね。
-
ESXi 7.0 Update 2 のオープンソース公開情報などを見ると PTPd をクライアントとして使用しており、man ページ等を見るとハードウェアタイムスタンプには対応していないようです。ソフトウェアタイムスタンプ使用時の PTP の時刻同期精度が気になりますね(ナノ秒は厳しそうな・・・)。 ↩︎
-
同じような機能は Linux の KVM や Windows の Hyper-V にもあります。 ↩︎