Jump to contentJump to page navigation: previous page [access key p]/next page [access key n]
適用先 openSUSE Leap 15.7

20 Precision Time Protocol Edit source

ネットワーク環境ではコンピュータやデバイス類の時刻を同期して、正確性を保つことが必要不可欠です。時刻の同期にあたってはさまざまな手法が存在しますが、その中で最もよく使用されているのが Network Time Protocol (NTP) です。 NTP については 第18章 「NTP を利用した時刻同期 で説明しています。

Precision Time Protocol (PTP) はマイクロ秒未満の精度に対応するプロトコルで、 NTP よりもさらに正確な時刻同期を実現することができます。 PTP はカーネルとユーザスペースのパーツから構成され、 openSUSE Leap にも PTP クロック向けの対応 (ネットワークドライバでの提供) が含まれています。

20.1 PTP の紹介 Edit source

PTP での時刻同期は、マスター/スレーブ型の階層構造を取ります。スレーブは対応するマスターに問い合わせを行い、同期を実施します。階層構造は、それぞれのスレーブが best master clock (BMC) (最適なマスタークロック の意味) アルゴリズムを利用して更新されます。また、 1 つのポートしか持たないクロック (時刻同期を行うマシン) は、マスターもしくはスレーブのいずれかにしか、なることができません。このようなクロックを ordinary clock (OC) (通常クロック) と呼びます。逆に、複数のポートを持つクロックは、一方をマスターに、他方をスレーブに設定することができます。このようなクロックを boundary clock (BC) (境界クロック) と呼びます。また、最上位のマスタークロックのことを、 grandmaster clock (最上位クロック) と呼びます。 Global Positioning System (GPS) を利用したクロックなどがそれにあたります。このような仕組みにより、異種混合型ネットワークでも高い精度の時刻同期を行うことができます。

なお、 PTP ではハードウエア側の対応が含まれていることが大きな特長です。いくつかのネットワークスイッチやネットワークインターフェイスコントローラ (NIC) に、そのような仕組みが用意されています。ネットワーク内に PTP 非対応のハードウエアが存在していてもかまいませんが、全ての PTP クロックでハードウエア対応が行われていると、最大限の正確性を実現することができます。

20.1.1 PTP の Linux 実装 Edit source

openSUSE Leap では、 PTP の実装は linuxptp パッケージに含まれています。 zypper install linuxptp と入力して実行し、インストールを行ってください。このパッケージには、時刻同期用の ptp4lphc2sys というプログラムが用意されています。 ptp4l は boundary clock の機能と ordinary clock の両方の機能を提供しています。ハードウエア側にタイムスタンプ機能が用意されていれば、 ptp4l は PTP のハードウエアクロックをマスタークロックに同期します。ソフトウエア側でのタイムスタンプ機能を利用する場合は、システムクロックをマスタークロックに同期します。 phc2sys はハードウエアタイムスタンプの際にのみ使用するもので、システムクロックをネットワークインターフェイス (NIC) に搭載されたハードウエアクロックに同期させるために使用します。

20.2 PTP の使用 Edit source

20.2.1 ネットワークドライバとハードウエアのサポート Edit source

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

20.2.2 ptp4l の使用 Edit source

ptp4l は既定ではハードウエアタイムスタンプを使用します。 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

20.2.3 ptp4l 設定ファイル Edit source

ptp4l は設定を設定ファイルから読み込むことができます。既定では設定ファイルを使用していませんので、設定ファイルを使用する場合は -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 をお読みください。

20.2.4 遅延の測定 Edit source

ptp4l では遅延の測定にあたって、 2 種類の方式のうちのいずれかを使用することができます。 1 つは peer-to-peer (P2P) 、もう 1 つは end-to-end (E2E) です。

P2P

この方式を使用するには、 -P オプションを指定します。

この方法は、ネットワーク環境の変更に素早く反応できる方式であるほか、遅延の測定をより正確に行うことができます。この方法は、それぞれのポートが他のポートと PTP メッセージを交換する場合にのみ使用します。 P2P は通信パス内の全てのハードウエア側で対応している必要があります。

E2E

この方式を使用するには、 -E オプションを指定します。こちらが既定値です。

自動方式選択

この方式を使用するには、 -A オプションを指定します。自動方式選択では、まず ptp4l が E2E モードで動作し、その後 peer delay (対向遅延) 要求が届くと、 P2P モードに切り替える動作を行います。

重要
重要: 一般的な測定方法について

単一の PTP 通信経路内にある全てのクロックは、遅延の測定方式を全て同じに設定しなければなりません。 E2E 方式で動作しているポートに peer delay 要求が届いた場合や、 P2P 方式で動作しているポートに E2E delay 要求が届いた場合は、警告メッセージを表示します。

20.2.5 PTP 管理クライアント: 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 ノードからのメッセージを受け取れるようになります。なお、返却された情報には、下記の項目が含まれることがあります:

stepsRemoved

最上位クロックに至るまでの通信ノード数を表しています。

offsetFromMaster, master_offset

マスタークロックとのクロック差 (ナノ秒単位) 。

meanPathDelay

マスタークロックから送信された同期メッセージの遅延見積値 (ナノ秒単位) 。

gmPresent

true が書かれていると、 PTP のクロックはマスタークロックとの間で同期ができていて、最上位のクロックではないことを表しています。

gmIdentity

最上位クロックの識別情報が表示されます。

pmc のコマンドラインオプションの完全な一覧について、詳しくは man 8 pmc と入力して実行してください。

20.3 phc2sys による時刻同期 Edit source

phc2sys を使用することで、システムクロックをネットワークカードに搭載された 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

20.3.1 時刻同期の検証 Edit source

PTP による時刻同期が正しく動作し、ハードウエアのタイムスタンプ機能を使用するように設定すると、 ptp4lphc2sys は、時刻のズレに関する情報と周期的な調整に関するメッセージを、システムログ内に出力するようになります。

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 更新間隔 オプションを指定してください。

20.4 設定例 Edit source

本章では、 ptp4l の設定例をいくつか示します。設定例は設定すべき内容を網羅したものではなく、必要な箇所のみに絞った最小限のものです。なお、 ethX の箇所はお使いのネットワークインターフェイスに置き換えてご使用ください。

例 20.1: ソフトウエアタイムスタンプ機能を利用した従属クロック

/etc/sysconfig/ptp4l :

OPTIONS=”-f /etc/ptp4l.conf -i ethX”

/etc/ptp4l.conf ファイルを変更する必要はありません。

例 20.2: ハードウエアタイムスタンプ機能を利用した従属クロック

/etc/sysconfig/ptp4l :

OPTIONS=”-f /etc/ptp4l.conf -i ethX”

/etc/sysconfig/phc2sys :

OPTIONS=”-s ethX -w”

/etc/ptp4l.conf ファイルを変更する必要はありません。

例 20.3: ハードウエアタイムスタンプ機能を利用した自律クロック

/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
例 20.4: ソフトウエアタイムスタンプ機能を利用した自律クロック (一般的には非推奨)

/etc/sysconfig/ptp4l :

OPTIONS=”-f /etc/ptp4l.conf -i ethX”

/etc/ptp4l.conf :

priority1 127

20.5 PTP と NTP Edit source

NTP と PTP の時刻同期ツールは同居させることができます。また、双方向の時刻同期を行うこともできます。

20.5.1 NTP から PTP への同期 Edit source

chronyd を利用してローカルのシステム時計を同期させている場合、 ptp4l を設定して最上位クロックとして動作させ、 PTP 経由でローカルのシステム時計を配信することができます。この場合、 /etc/ptp4l.confpriority1 オプションに下記を設定してください:

[global]
priority1 127
[eth0]

あとは ptp4l を起動します:

> sudo ptp4l -f /etc/ptp4l.conf

ハードウエアタイムスタンプ機能を使用している場合、 phc2sys を利用して、 PTP ハードウエアクロックをシステムクロックと同期させる必要があります:

> sudo phc2sys -c eth0 -s CLOCK_REALTIME -w

20.5.2 PTP-NTP ブリッジの設定 Edit source

非常に精度の高い PTP 最上位クロックがネットワーク内に存在しているものの、 PTP に対応するスイッチやルータが存在していない場合、コンピュータを PTP スレーブに設定するとともに、 stratum-1 の NTP サーバとして設定することができます。このようなコンピュータには複数のネットワークインターフェイスが必要となるほか、最上位のクロックとネットワーク的に非常に近い場所に存在しているか、直結している必要があります。これにより、ネットワーク内でも非常に精度の高い同期を実現することができます。

ptp4lphc2sys のプログラムを設定して、 1 つのネットワークインターフェイスで PTP によるシステムクロックの同期を行うようにします。あとは chronyd を設定して、その他のインターフェイス経由でシステム時刻を提供するようにします:

bindaddress 192.0.131.47
hwtimestamp eth1
local stratum 1
注記
注記: NTP と DHCP について

DHCP クライアントである dhclient が NTP サーバの一覧を取得すると、既定では NTP の設定ファイル内にそれを追加します。このような動作を防ぐには:

NETCONFIG_NTP_POLICY=""

上記の内容を、 /etc/sysconfig/network/config ファイルに設定してください。

このページを印刷