|Index|SUSE Linux Enterprise Desktop 文档|系统分析和微调指南|使用精确时间协议同步时钟|精确时间协议
适用范围 SUSE Linux Enterprise Desktop 15 SP7

20 精确时间协议

对于网络环境而言,让计算机和其他设备的时钟保持同步和准确至关重要。有多种解决方案可实现同步性和准确性,例如,使用第 39 章 “使用 NTP 同步时间”中所述的广泛应用的网络时间协议 (NTP)。

精确时间协议 (PTP) 支持亚微秒级准确性,较 NTP 更优。PTP 支持分为内核和用户空间。SUSE Linux Enterprise Desktop 中的内核支持网络驱动程序提供的 PTP 时钟。

20.1 PTP 简介

PTP 管理的时钟遵循主从层次结构。从属时钟将同步到其主时钟。这一层次结构由最佳主时钟 (BMC) 算法负责更新,该算法会针对每个时钟运行。只有一个端口的时钟可以是主时钟也可以是从属时钟。此类时钟称为普通时钟 (OC)。具有多个端口的时钟可以在一个端口上为主时钟,在另一个端口上为从属时钟。此类时钟称为边界时钟 (BC)。顶层的主时钟称为超级主时钟。超级主时钟可与全球定位系统 (GPS) 同步。这样,不同的网络便能够以高准确度实现同步。

硬件支持是 PTP 的主要优势。多种网络交换机和网络接口控制器 (NIC) 都支持 PTP。虽然可以在网络内部使用启用非 PTP 的硬件,但为所有 PTP 时钟之间的网络组件启用 PTP 硬件可实现最大的准确性。

20.1.1 PTP Linux 实现

在 SUSE Linux Enterprise Desktop 上,PTP 实现由 linuxptp 软件包提供。可通过 zypper install linuxptp 安装该软件包。该软件包中包含用于同步时钟的 ptp4l 和 phc2sys 程序,ptp4l 可实现 PTP 边界时钟和普通时钟。如果启用硬件时戳,ptp4l 会将 PTP 硬件时钟同步到主时钟。如果使用软件时戳,它会将系统时钟同步到主时钟。仅当使用硬件时戳将系统时钟同步到网络接口卡 (NIC) 上的 PTP 硬件时钟时,才需要 phc2sys。

20.2 使用 PTP

20.2.1 网络驱动程序和硬件支持

PTP 要求使用的内核网络驱动程序支持软件时戳或硬件时戳。此外,NIC 还必须支持物理硬件中的时戳。您可以使用 ethtool 校验驱动程序和 NIC 时戳功能:

> 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

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) 为单位)。

path delay 值表示从主时钟发送的同步消息的预计延迟(以纳秒为单位)。

端口 0 是用于本地 PTP 管理的 Unix 域套接字。端口 1 是 eth0 接口。

比如,发生 INITIALIZE、RS_SLAVE 和 MASTER_CLOCK_SELECTED 事件时,端口状态就会变成 INITIALIZING、LISTENING、UNCALIBRATED 和 SLAVE。当端口状态从 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 配置文件

ptp4l 可以从可选的配置文件读取其配置。由于默认未使用任何配置文件,您需要通过 -f 指定配置文件。

> sudo ptp4l -f /etc/ptp4l.conf

配置文件分为若干部分。全局部分(通过 [global] 识别)用于设置程序选项、时钟选项和默认端口选项。其他部分与特定的端口相关,会覆盖默认端口选项。部分的名称是配置的端口的名称 — 例如 [eth0]。空白端口部分可用于替换命令行选项。

[global]
verbose               1
time_stamping         software
[eth0]

示例配置文件等效于以下命令选项:

> sudo ptp4l -i eth0 -m -S

有关完整的 ptp4l 配置选项列表,请参见 man 8 ptp4l。

20.2.4 延迟测量

ptp4l 通过两种方法测量时间延迟:对等式 (P2P) 或端到端 (E2E)。

P2P

此方法使用 -P 指定。

它可以更快地对网络环境中的更改做出反应,并可更准确地测量延迟。仅在每个端口都会与另一个端口交换 PTP 消息的网络中才会使用此方法。P2P 需受到通讯路径中所有硬件的支持。

E2E

此方法使用 -E 指定。此为默认设置。

自动选择方法

此方法使用 -A 指定。自动选项以 E2E 模式启动 ptp4l,如果收到了对等延迟请求,则会切换为 P2P 模式。

重要
重要:常用测量方法

单个 PTP 通讯路径上的所有时钟必须使用相同的方法来测量时间延迟。如果在使用 E2E 机制的端口上收到了对等延迟请求,或者在使用 P2P 机制的端口上收到了 E2E 延迟请求,则会列显警告。

20.2.5 PTP 管理客户端:pmc

可以使用 pmc 客户端获取有关 ptp41 的更详细信息。pmc 从标准输入或命令行读取按名称和管理 ID 指定的操作。然后通过选定的传输方式发送操作,并列显收到的任何答复。pmc 支持以下三个操作: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 同步时钟

使用 phc2sys 可将系统时钟同步到网卡上的 PTP 硬件时钟 (PHC)。系统时钟被视为从属时钟,而网卡上的时钟则为主时钟。PHC 本身将与 ptp4l 同步(请参见第 20.2 节 “使用 PTP”)。使用 -s 可按设备或网络接口指定主时钟。使用 -w 等待 ptp4l 进入同步状态。

> sudo phc2sys -s eth0 -w

PTP 以国际原子时 (TAI) 运行,而系统时钟使用的是协调世界时 (UTC)。如果您不指定 -w 来等待 ptp4l 同步,可以使用 -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 校验时间同步

当 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 的 N 次幂。例如,要将输出频率降低为每隔 1024(等于 2^10)秒,请将下面一行添加到 /etc/ptp4l.conf 文件。

summary_interval 10

也可以使用 -u SUMMARY-UPDATES 选项降低 phc2sys 命令的更新频率。

20.4 配置示例

本节提供了几个 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

NTP 和 PTP 时间同步工具可以共存,可实现双向时间同步。

20.5.1 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

20.5.2 配置 PTP-NTP 网桥

在未配备支持 PTP 的交换机或路由器的网络中,如果可以使用高度精确的 PTP 超级主时钟,则计算机可以作为 PTP 从属和第 1 层 NTP 服务器运行。此类计算机需有两个或更多网络接口,并且靠近或者能够直接连接到超级主时钟。这可以确保在网络中实现高度精确的同步。

将 ptp4l 和 phc2sys 程序配置为使用一个网络接口来通过 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 文件中)。