インフラ・DevOps
予算内でStratum 1 PTPグランドマスターを構築する
Build a Stratum 1 PTP Grandmaster on a Budget (opscode.io)
要約
本記事では、数千ドルから数十万ドルする商用PTPグランドマスタークロックの代替として、Raspberry Pi CM4と安価なGPSモジュールを用いて、約103ドルの部品代でStratum 1 PTPグランドマスターを構築する手順と結果を詳述しています。これにより、ナノ秒単位の時間同期が必要な産業インフラストラクチャ向けに、低コストでPTPの仕組みを学ぶ方法を示しています。
全文翻訳
目次
私はナノ秒単位の時間同期を必要とする産業インフラストラクチャで働いています。この問題を解決する商用のGPS同期PTPグランドマスタークロックは、安価なもので数千ドルから、オプションやサポートを含めるとさらに高価になります。私はすでにラボにCM4とCM4 IOボードを持っていました。TimeHATとOCP M.2 GNSSモジュールを使用する方がクリーンな方法でしたが、約400ドルかかり、PTPの仕組みを学ぶことが目的で、本番環境のインフラを展開することが目的ではない場合、これは高価です。このビルドは、新品の部品で約103ドルでした。
この記事では、私が構築したもの、何が壊れたか、何を修正する必要があったか、そして測定した結果を記録します。
PTPとは何か、そしてなぜそれが重要なのか
時間精度はスペクトルです:
単位
それは何ですか
例
1秒 (s)
時計のチクタク
人間のスケジュール、cronジョブ
1ミリ秒 (ms)
1秒を1,000個に分割
ウェブブラウジング、ビデオストリーミング、ログタイムスタンプ
1マイクロ秒 (µs)
1秒を1,000,000個に分割
高頻度取引、オーディオ/ビデオ同期、分散データベース
1ナノ秒 (ns)
1秒を1,000,000,000個に分割
航空宇宙計装、産業オートメーション、科学データ取得、このビルド
NTPは、Webサーバー、データベース、認証システム、および何かがいつ発生したかを知る必要があるが、マシン間でハードウェアイベントを調整する必要がないものには十分です。良好な参照を持つLAN上では、NTPは低マイクロ秒に到達できます。WAN上では、通常、低ミリ秒に収まります。上限はクライアントとサーバー間のネットワークパスジッターであり、あらゆる可変遅延がオフセット推定にノイズを追加します。
PTP(Precision Time Protocol、IEEE 1588)はナノ秒レベルを扱います。イーサネットPHYレイヤーでのハードウェアタイムスタンプにより、PTPはローカルネットワーク上で数十ナノ秒以内にクロックを同期できます。グランドマスタークロックはルートタイムソースです。GPS同期時間を受け取り、PTPプロトコルを介してクライアントに配布します。
ナノ秒は、光が約30センチメートル(約1フィート)移動する時間です。このビルドの後、私のホームラボノードのクロックは、部屋を横切る光が移動する時間だけGPS真値からずれていました。
ハードウェア
コンポーネント
ノート
コスト
Raspberry Pi CM4 (8GB/32GB eMMC)
所有済み
N/A
CM4 IO Board
所有済み
N/A
SR1723U10 GPSモジュール
u-blox M10ベース
~$15
JEFA Tech U.FL to SMA pigtail
アンテナ接続用
~$8
Bingfu GPSアンテナ
アクティブ、SMA
~$12
MOOKEERF SMAケーブル
各種長さ
~$10
Waveshare CM4 IO Board case
1Uアルミニウム
~$25
ELEGOO Dupontジャンパーワイヤーキット
配線用
~$8
M2.5スタッドキット
取り付けハードウェア
~$8
12V 2A電源
IOボード用
~$12
CR2032バッテリー
オンボードRTC用
~$5
合計(新品部品)
~$103
CM4とIOボードはすでに手元にありました。
このビルドとTimeHATパスの比較:
このビルド
TimeHATパス
コンピューティング
CM4 + IO Board (所有済み)
Raspberry Pi 5 (~$80)
GPS統合
SR1723U10 + 配線 (~$23)
TimeHAT + OCP M.2 GNSSモジュール (~$395)
アンテナ
Bingfu + pigtail (~$20)
同じアンテナが機能 (~$20)
オシレーター
標準クリスタル
TCXO (温度補償)
新規支出
~$103
~$475+
オシレーターの違いが重要です。TimeHATにはTCXOが含まれており、温度による周波数ドリフトを補償します。GPSホールドオーバー中、TCXOは、ボードが加熱または冷却されても周波数が安定しているため、標準クリスタルよりもはるかに正確に時間を保持します。CM4は温度補償のない標準クリスタルを使用しています。このビルドは、ホールドオーバー中に10時間で15msのドリフトを保持しましたが、このユースケースでは許容範囲でした。ホールドオーバー精度が重要な本番環境では、TCXOはそのコスト差に見合う価値があります。
TimeHATは、CM4のオンボードBCM54210PEに依存するのではなく、Intel i226 NICを使用し、適切なSMAコネクタを使用し、ジャンパーワイヤーを必要としません。ハードウェアをゼロから始める場合は、そのパスが簡単です。すでにCM4を持っていて、PHYレベルで何が起こっているかを理解したい場合は、このビルドでコストのほんの一部でそれが実現できます。
重要なハードウェアの事実: CM4はBCM54210PEイーサネットPHYを使用しており、完全なIEEE 1588v2ハードウェアタイムスタンプサポートを備えています。これがCM4でサブマイクロ秒PTPを可能にするものです。BCM54210PEは、パケットがカーネルネットワークスタックに触れる前に、PHYのワイヤー上でパケットをタイムスタンプします。これにより、カーネルスケジューリングや割り込み処理に起因するジッターが排除されます。
クライアント:
Turing Pi 2クラスタボード (RTL8370MB-CG+スイッチ)
RK1コンピュートモジュール (Rockchip RK3588, Ubuntu 22.04)
CM4 (Ubuntu 24.04), k8s1ノード
Turing Pi 2には2つの外部RJ45ポートがあります。両方のポートは、4つのノードスロットと同じスイッチファブリックにブリッジされています。グランドマスターはge1(2番目のRJ45ポート)に接続されています。RK1およびCM4クライアントノードは内部ノードスロットにあります。5つすべてが同じRTL8370MB-CG+スイッチファブリック上にあるため、グランドマスターとクライアント間のPTPパケットは、ルーティングなしで単一のスイッチホップを通過します。
なぜUbuntu 24.04なのか
CM4は当初、カーネル5.15.0-1093-raspiでUbuntu 22.04を実行していました。BCM54210PEのPTPサポートは2022年にRaspberry Piカーネルツリーに追加され、その後メインラインLinuxにアップストリームされましたが、Ubuntu 22.04のraspiカーネルには含まれていませんでした。その結果、PHCデバイスもハードウェアタイムスタンプもありませんでした:
$ ethtool -T eth0
Time stamping parameters for eth0:
Capabilities: software-transmit software-receive software-system-clock
PTP Hardware Clock: none
$ ls /sys/class/ptp/
(empty)
/dev/ptp0がないと、SatPulseは調整するハードウェアクロックを持ちません。GPSからネットワークタイムへのパスはありません。
二次的な問題もありました。Ubuntu 22.04では、cmdline.txtにconsole=ttyAMA0,115200があり、カーネルコンソールをGPSモジュールと同じUARTに接続していました。これにより、dmesgに継続的な入力オーバーランが発生し、GPSポートからガベージ出力が発生しました。
カーネル6.8.0-raspiを搭載したUbuntu 24.04にアップグレードしたことで、両方の問題が解決しました:
$ ethtool -T eth0
Time stamping parameters for eth0:
Capabilities: hardware-transmit hardware-receive hardware-raw-clock
PTP Hardware Clock: 0
$ ls /sys/class/ptp/
ptp0
配線
SR1723U10は、5本のDupontワイヤーを介してCM4 IO Boardに接続されます。4本は電源とシリアルUARTを運びます。5本目はPPS信号をJ2ヘッダーに運びます。
SR1723U10ピン
色
CM4 IO Board
VCC
赤
40ピン ピン1 (3.3V)
GND
茶
40ピン ピン6
TX
オレンジ
40ピン ピン10 (RXD0)
RX
黄色
40ピン ピン8 (TXD0)
PPS
緑
J2ヘッダー ピン9 (SYNC_OUT)
J2ヘッダーは、CM4 IO Boardのイーサネットジャックの近くにある小さな10ピンヘッダーです。ピン9はSYNC_OUTとラベル付けされており、BCM54210PE PHYの外部タイムスタンプ入力に接続されます。これがGPSパルス毎秒信号がハードウェアクロックに入る方法です。
OSセットアップ
/boot/firmware/config.txtに追加:
dtoverlay=disable-bt
enable_uart=1
dtoverlay=i2c-rtc,pcf85063a,i2c_csi_dsi
最初の2行はBluetoothを無効にし、/dev/ttyAMA0をGPIOヘッダーに接続して、GPSモジュールがCM4と通信できるようにします。3行目は、CM4 IO Boardの正しいI2CバスでオンボードPCF85063Aリアルタイムクロックを有効にします。
/boot/firmware/cmdline.txtからシリアルコンソールを削除:
# cmdline.txtからこの部分を削除:
console=ttyAMA0,115200
Bluetoothサービスを無効にする。dtoverlay=disable-btオーバーレイはBluetoothをUARTハードウェアから切断しますが、hciuartサービスは初期化を試み、干渉する可能性があります:
sudo systemctl disable hciuart
再起動後、GPSモジュールが38400ボーでNMEAを出力していることを確認します:
(stty 38400 -echo -icrnl; cat) </dev/ttyAMA0 | head -10
$GNRMC、$GNGGAなどの行が表示されるはずです。SR1723U10は、多くのガイドで想定されている9600ボーではなく、デフォルトで38400ボーです。
ソフトウェアスタック
スタックはSatPulse + ptp4l + chronyです。SatPulseはjclarkによって書かれたデーモンで、GPSモジュール、PHC、ptp4l、およびchronyを連携させます。UBXプロトコルを介したGPS設定、PHCからのPPSタイムスタンプの読み取り、PHC周波数の調整、およびSOCK refclockを介したchronyへのサンプル供給を処理します。
GitHubリリースページ(arm64 .deb)からSatPulseをインストールします:
wget https://github.com/jclark/satpulse/releases/download/v0.3.0/satpulse_0.3.0_arm64.deb
sudo dpkg -i satpulse_0.3.0_arm64.deb
/etc/satpulse.tomlでSatPulseを設定します:
[phc]
int