ネットワーク環境ではコンピュータやデバイス類の時刻を同期して、正確性を保つことが必要不可欠です。時刻の同期にあたってはさまざまな手法が存在しますが、その中で最もよく使用されているのが Network Time Protocol (NTP) です。 NTP については 第18章 「NTP を利用した時刻同期」 で説明しています。
Precision Time Protocol (PTP) はマイクロ秒未満の精度に対応するプロトコルで、 NTP よりもさらに正確な時刻同期を実現することができます。 PTP はカーネルとユーザスペースのパーツから構成され、 openSUSE Leap にも PTP クロック向けの対応 (ネットワークドライバでの提供) が含まれています。
PTP での時刻同期は、マスター/スレーブ型の階層構造を取ります。スレーブは対応するマスターに問い合わせを行い、同期を実施します。階層構造は、それぞれのスレーブが best master clock (BMC) (「最適なマスタークロック」 の意味) アルゴリズムを利用して更新されます。また、 1 つのポートしか持たないクロック (時刻同期を行うマシン) は、マスターもしくはスレーブのいずれかにしか、なることができません。このようなクロックを ordinary clock (OC) (通常クロック) と呼びます。逆に、複数のポートを持つクロックは、一方をマスターに、他方をスレーブに設定することができます。このようなクロックを boundary clock (BC) (境界クロック) と呼びます。また、最上位のマスタークロックのことを、 grandmaster clock (最上位クロック) と呼びます。 Global Positioning System (GPS) を利用したクロックなどがそれにあたります。このような仕組みにより、異種混合型ネットワークでも高い精度の時刻同期を行うことができます。
なお、 PTP ではハードウエア側の対応が含まれていることが大きな特長です。いくつかのネットワークスイッチやネットワークインターフェイスコントローラ (NIC) に、そのような仕組みが用意されています。ネットワーク内に PTP 非対応のハードウエアが存在していてもかまいませんが、全ての PTP クロックでハードウエア対応が行われていると、最大限の正確性を実現することができます。
openSUSE Leap では、 PTP の実装は linuxptp
パッケージに含まれています。 zypper install linuxptp
と入力して実行し、インストールを行ってください。このパッケージには、時刻同期用の ptp4l
と phc2sys
というプログラムが用意されています。 ptp4l
は boundary clock の機能と ordinary clock の両方の機能を提供しています。ハードウエア側にタイムスタンプ機能が用意されていれば、 ptp4l
は PTP のハードウエアクロックをマスタークロックに同期します。ソフトウエア側でのタイムスタンプ機能を利用する場合は、システムクロックをマスタークロックに同期します。 phc2sys
はハードウエアタイムスタンプの際にのみ使用するもので、システムクロックをネットワークインターフェイス (NIC) に搭載されたハードウエアクロックに同期させるために使用します。
PTP ではカーネルのネットワークドライバに対して、ソフトウエアもしくはハードウエアのタイムスタンプ機能を必要とします。これに加えて、 NIC の物理ハードウエア側では、タイムスタンプ機能に対応していなければなりません。ドライバと NIC にタイムスタンプ機能があるかどうかを確認するには、 ethtool
コマンドを使用します:
>
sudo
ethtool -T eth0 Time stamping parameters for eth0: Capabilities: hardware-transmit (SOF_TIMESTAMPING_TX_HARDWARE) software-transmit (SOF_TIMESTAMPING_TX_SOFTWARE) hardware-receive (SOF_TIMESTAMPING_RX_HARDWARE) software-receive (SOF_TIMESTAMPING_RX_SOFTWARE) software-system-clock (SOF_TIMESTAMPING_SOFTWARE) hardware-raw-clock (SOF_TIMESTAMPING_RAW_HARDWARE) PTP Hardware Clock: 0 Hardware Transmit Timestamp Modes: off (HWTSTAMP_TX_OFF) on (HWTSTAMP_TX_ON) Hardware Receive Filter Modes: none (HWTSTAMP_FILTER_NONE) all (HWTSTAMP_FILTER_ALL)
ソフトウエアタイムスタンプ機能を使用するには、下記のパラメータが表示されていなければなりません:
SOF_TIMESTAMPING_SOFTWARE SOF_TIMESTAMPING_TX_SOFTWARE SOF_TIMESTAMPING_RX_SOFTWARE
ハードウエアタイムスタンプ機能を使用するには、下記のパラメータが表示されていなければなりません:
SOF_TIMESTAMPING_RAW_HARDWARE SOF_TIMESTAMPING_TX_HARDWARE SOF_TIMESTAMPING_RX_HARDWARE
ptp4l
の使用 #Edit sourceptp4l
は既定ではハードウエアタイムスタンプを使用します。 root
で -i
オプションを指定して、ハードウエアタイムスタンプ機能に対応したネットワークインターフェイスを指定してください。なお、 -m
オプションを指定すると、 ptp4l
からの出力が、システムのログ機能経由ではなく標準出力に書き込まれるようになります:
>
sudo
ptp4l -m -i eth0 selected eth0 as PTP clock port 1: INITIALIZING to LISTENING on INITIALIZE port 0: INITIALIZING to LISTENING on INITIALIZE port 1: new foreign master 00a152.fffe.0b334d-1 selected best master clock 00a152.fffe.0b334d port 1: LISTENING to UNCALIBRATED on RS_SLAVE master offset -25937 s0 freq +0 path delay 12340 master offset -27887 s0 freq +0 path delay 14232 master offset -38802 s0 freq +0 path delay 13847 master offset -36205 s1 freq +0 path delay 10623 master offset -6975 s2 freq -30575 path delay 10286 port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED master offset -4284 s2 freq -30135 path delay 9892
master offset
以下には、マスターとの時刻差 (ナノ秒単位) が表示されます。
s0
, s1
, s2
の各表示は、クロックサーボの状態を表しています。それぞれ s0
はロック解除状態を、 s1
はクロックステップを、 s2
はロック済み状態を表しています。サーボがロック済みの状態 ( s2
) にある場合、 pi_offset_const
オプションが負の値に設定されていると、クロックをステップさせる (大きく変更する) ことは行わず、徐々に調整するようになります (詳しくは man 8 ptp4l
をお読みください) 。
freq
で示されている値は、クロックの周波数調整値 (単位は ppb で、 10 億あたりの値) を表しています。
path delay
には、マスターから送信された同期メッセージの見積もり遅延時間 (単位はナノ秒) を表しています。
Port 0 はローカルの PTP 管理向けに Unix ドメインソケットを使用する意味です。 Port 1 は eth0
インターフェイスの意味です。
INITIALIZING
, LISTENING
, UNCALIBRATED
, SLAVE
の表示は、それぞれ INITIALIZE
, RS_SLAVE
, MASTER_CLOCK_SELECTED
のイベントに対するポート状態の変更例です。ポートの状態が UNCALIBRATED
から SLAVE
に変化すると、コンピュータは PTP のマスタークロックと同期が成功していることを表します。
-S
オプションを指定することで、ソフトウエアのタイムスタンプ機能を使用することができるようになります。
>
sudo
ptp4l -m -S -i eth3
ptp4l
をサービスとして動作させる場合は、下記のように入力して実行します:
>
sudo
systemctl start ptp4l
この場合、 ptp4l
のオプションは /etc/sysconfig/ptp4l
ファイルから読み込みが行われます。既定では、このファイルには ptp4l
が /etc/ptp4l.conf
から設定を読み込むように指定しています。 ptp4l
のオプションや設定ファイルの構造について、詳しくは man 8 ptp4l
をお読みください。
ptp4l
サービスを恒久的に有効化したい場合は、下記のとおり入力して実行します:
>
sudo
systemctl enable ptp4l
無効化したい場合は、下記のとおり入力して実行します:
>
sudo
systemctl disable ptp4l
ptp4l
設定ファイル #Edit sourceptp4l
は設定を設定ファイルから読み込むことができます。既定では設定ファイルを使用していませんので、設定ファイルを使用する場合は -f
で指定する必要があります。
>
sudo
ptp4l -f /etc/ptp4l.conf
設定ファイルは 2 つのセクションに分かれています。グローバルセクション ( [global]
) 内には、プログラムのオプションとクロックのオプション、そして既定のポートオプションが含まれます。その他のセクションはポートごとに固有のもので、既定のポートオプションを上書きするためのものです。セクション名は設定されているポートの名前そのもので、たとえば [eth0]
等のようになります。ポートのセクション内に何も設定していないと、コマンドラインオプションを置き換えることができます。
[global] verbose 1 time_stamping software [eth0]
上記のように設定を行うと、コマンドラインでは下記のような意味になります:
>
sudo
ptp4l -i eth0 -m -S
ptp4l
で利用可能な設定オプションの一覧については、 man 8 ptp4l
をお読みください。
ptp4l
では遅延の測定にあたって、 2 種類の方式のうちのいずれかを使用することができます。 1 つは peer-to-peer (P2P) 、もう 1 つは end-to-end (E2E) です。
この方式を使用するには、 -P
オプションを指定します。
この方法は、ネットワーク環境の変更に素早く反応できる方式であるほか、遅延の測定をより正確に行うことができます。この方法は、それぞれのポートが他のポートと PTP メッセージを交換する場合にのみ使用します。 P2P は通信パス内の全てのハードウエア側で対応している必要があります。
この方式を使用するには、 -E
オプションを指定します。こちらが既定値です。
この方式を使用するには、 -A
オプションを指定します。自動方式選択では、まず ptp4l
が E2E モードで動作し、その後 peer delay (対向遅延) 要求が届くと、 P2P モードに切り替える動作を行います。
単一の PTP 通信経路内にある全てのクロックは、遅延の測定方式を全て同じに設定しなければなりません。 E2E 方式で動作しているポートに peer delay 要求が届いた場合や、 P2P 方式で動作しているポートに E2E delay 要求が届いた場合は、警告メッセージを表示します。
pmc
#Edit source ptp4l
に関するより詳しい情報を取得したい場合は、 pmc
クライアントをお使いください。このコマンドは標準入力やコマンドラインからの入力を受け付け、名前で指定したアクションや管理 ID を取得します。あとはアクションを選択したトランスポート経由で送信し、受信した応答を表示します。アクションには 3 種類のものがあります。 GET
は指定した情報の取得、 SET
は指定した情報の更新、そして CMD
(もしくは COMMAND
) は指定したイベントの開始に使用します。
既定では、管理コマンドは全てのポートを対象として実行されます。 TARGET
コマンドは特定のクロックとポートを選択して、後続のコマンドを実行させるために使用します。管理 ID の完全な一覧を表示するには、 pmc help
と入力して実行してください。
>
sudo
pmc -u -b 0 'GET TIME_STATUS_NP' sending: GET TIME_STATUS_NP 90f2ca.fffe.20d7e9-0 seq 0 RESPONSE MANAGEMENT TIME_STATUS_NP master_offset 283 ingress_time 1361569379345936841 cumulativeScaledRateOffset +1.000000000 scaledLastGmPhaseChange 0 gmTimeBaseIndicator 0 lastGmPhaseChange 0x0000'0000000000000000.0000 gmPresent true gmIdentity 00b058.feef.0b448a
-b
オプションを指定すると、送信されるメッセージに設定する境界ホップ数を指定することができます。境界ホップ数に 0 を指定すると、ローカルの ptp4l
インスタンスに制限する意味になります。この値を増やして行くことで、ローカルから離れた遠くの PTP ノードからのメッセージを受け取れるようになります。なお、返却された情報には、下記の項目が含まれることがあります:
最上位クロックに至るまでの通信ノード数を表しています。
マスタークロックとのクロック差 (ナノ秒単位) 。
マスタークロックから送信された同期メッセージの遅延見積値 (ナノ秒単位) 。
true
が書かれていると、 PTP のクロックはマスタークロックとの間で同期ができていて、最上位のクロックではないことを表しています。
最上位クロックの識別情報が表示されます。
pmc
のコマンドラインオプションの完全な一覧について、詳しくは man 8 pmc
と入力して実行してください。
phc2sys
による時刻同期 #Edit sourcephc2sys
を使用することで、システムクロックをネットワークカードに搭載された PTP ハードウエアクロック (PHC) に同期させることができます。この場合、システムクロックは スレーブ 、ネットワークカード側は マスター として動作することになります。 PHC それ自身は ptp4l
(詳しくは 20.2項 「PTP の使用」 をお読みください) で同期を行います。なお、 -s
を指定することで、デバイスやネットワークインターフェイスでマスタークロックを指定することができます。また -w
を指定すると、 ptp4l
が同期状態になるまで待機させることができます。
>
sudo
phc2sys -s eth0 -w
PTP は International Atomic Time (TAI) を基準に動作するのに対して、システムクロックは Coordinated Universal Time (UTC) を基準に動作します。 ptp4l
に対して -w
オプションを指定して待機させるように指定しない場合、 -O
オプションで TAI と UTC の時刻差を秒単位で指定することができます:
>
sudo
phc2sys -s eth0 -O -35
phc2sys
についても、同様にサービスとして動作させることができます:
>
sudo
systemctl start phc2sys
この場合、 phc2sys
のオプションは /etc/sysconfig/phc2sys
ファイルから読み込みが行われます。 phc2sys
のオプションや設定ファイルの構造について、詳しくは man 8 phc2sys
をお読みください。
phc2sys
サービスを恒久的に有効化したい場合は、下記のとおり入力して実行します:
>
sudo
systemctl enable phc2sys
無効化したい場合は、下記のとおり入力して実行します:
>
sudo
systemctl disable phc2sys
PTP による時刻同期が正しく動作し、ハードウエアのタイムスタンプ機能を使用するように設定すると、 ptp4l
と phc2sys
は、時刻のズレに関する情報と周期的な調整に関するメッセージを、システムログ内に出力するようになります。
ptp4l
の出力例:
ptp4l[351.358]: selected /dev/ptp0 as PTP clock ptp4l[352.361]: port 1: INITIALIZING to LISTENING on INITIALIZE ptp4l[352.361]: port 0: INITIALIZING to LISTENING on INITIALIZE ptp4l[353.210]: port 1: new foreign master 00a069.eefe.0b442d-1 ptp4l[357.214]: selected best master clock 00a069.eefe.0b662d ptp4l[357.214]: port 1: LISTENING to UNCALIBRATED on RS_SLAVE ptp4l[359.224]: master offset 3304 s0 freq +0 path delay 9202 ptp4l[360.224]: master offset 3708 s1 freq -28492 path delay 9202 ptp4l[361.224]: master offset -3145 s2 freq -32637 path delay 9202 ptp4l[361.224]: port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED ptp4l[362.223]: master offset -145 s2 freq -30580 path delay 9202 ptp4l[363.223]: master offset 1043 s2 freq -28436 path delay 8972 [...] ptp4l[371.235]: master offset 285 s2 freq -28511 path delay 9199 ptp4l[372.235]: master offset -78 s2 freq -28788 path delay 9204
phc2sys
の出力例:
phc2sys[616.617]: Waiting for ptp4l... phc2sys[628.628]: phc offset 66341 s0 freq +0 delay 2729 phc2sys[629.628]: phc offset 64668 s1 freq -37690 delay 2726 [...] phc2sys[646.630]: phc offset -333 s2 freq -37426 delay 2747 phc2sys[646.630]: phc offset 194 s2 freq -36999 delay 2749
ptp4l
は通常、メッセージを頻繁に出力します。メッセージの頻度を減らしたい場合は、 summary_interval
ディレクティブを使用して減らしてください。なお、設定する値には 2 の乗数を指定します。たとえば 1024 (= 2^10) 秒ごとにメッセージを出力するようにしたい場合、下記の行を /etc/ptp4l.conf
ファイルに追加します:
summary_interval 10
phc2sys
についても、出力を減らすことができます。こちらの出力を減らしたい場合は、 -u 更新間隔
オプションを指定してください。
本章では、 ptp4l
の設定例をいくつか示します。設定例は設定すべき内容を網羅したものではなく、必要な箇所のみに絞った最小限のものです。なお、 ethX の箇所はお使いのネットワークインターフェイスに置き換えてご使用ください。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/ptp4l.conf
ファイルを変更する必要はありません。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/sysconfig/phc2sys
:
OPTIONS=”-s ethX -w”
/etc/ptp4l.conf
ファイルを変更する必要はありません。
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/sysconfig/phc2sys
:
OPTIONS=”-s CLOCK_REALTIME -c ethX -w”
/etc/ptp4l.conf
:
priority1 127
/etc/sysconfig/ptp4l
:
OPTIONS=”-f /etc/ptp4l.conf -i ethX”
/etc/ptp4l.conf
:
priority1 127
NTP と PTP の時刻同期ツールは同居させることができます。また、双方向の時刻同期を行うこともできます。
chronyd
を利用してローカルのシステム時計を同期させている場合、 ptp4l
を設定して最上位クロックとして動作させ、 PTP 経由でローカルのシステム時計を配信することができます。この場合、 /etc/ptp4l.conf
の priority1
オプションに下記を設定してください:
[global] priority1 127 [eth0]
あとは ptp4l
を起動します:
>
sudo
ptp4l -f /etc/ptp4l.conf
ハードウエアタイムスタンプ機能を使用している場合、 phc2sys
を利用して、 PTP ハードウエアクロックをシステムクロックと同期させる必要があります:
>
sudo
phc2sys -c eth0 -s CLOCK_REALTIME -w
非常に精度の高い PTP 最上位クロックがネットワーク内に存在しているものの、 PTP に対応するスイッチやルータが存在していない場合、コンピュータを PTP スレーブに設定するとともに、 stratum-1 の NTP サーバとして設定することができます。このようなコンピュータには複数のネットワークインターフェイスが必要となるほか、最上位のクロックとネットワーク的に非常に近い場所に存在しているか、直結している必要があります。これにより、ネットワーク内でも非常に精度の高い同期を実現することができます。
ptp4l
と phc2sys
のプログラムを設定して、 1 つのネットワークインターフェイスで PTP によるシステムクロックの同期を行うようにします。あとは chronyd
を設定して、その他のインターフェイス経由でシステム時刻を提供するようにします:
bindaddress 192.0.131.47 hwtimestamp eth1 local stratum 1
DHCP クライアントである dhclient
が NTP サーバの一覧を取得すると、既定では NTP の設定ファイル内にそれを追加します。このような動作を防ぐには:
NETCONFIG_NTP_POLICY=""
上記の内容を、 /etc/sysconfig/network/config
ファイルに設定してください。