22 精确时间协议 #
对于网络环境而言,让计算机和其他设备的时钟保持同步和准确至关重要。有多种解决方案可实现同步性和准确性,例如,使用第 38 章 “使用 NTP 同步时间”中所述的广泛应用的网络时间协议 (NTP)。
精确时间协议 (PTP) 支持亚微秒级准确性,较 NTP 更优。PTP 支持分为内核和用户空间。SUSE Linux Enterprise Server 中的内核支持网络驱动程序提供的 PTP 时钟。
22.1 PTP 简介 #
PTP 管理的时钟遵循主从层次结构。从属时钟将同步到其主时钟。这一层次结构由最佳主时钟 (BMC) 算法负责更新,该算法会针对每个时钟运行。只有一个端口的时钟可以是主时钟也可以是从属时钟。此类时钟称为普通时钟 (OC)。具有多个端口的时钟可以在一个端口上为主时钟,在另一个端口上为从属时钟。此类时钟称为边界时钟 (BC)。顶层的主时钟称为超级主时钟。超级主时钟可与全球定位系统 (GPS) 同步。这样,不同的网络便能够以高准确度实现同步。
硬件支持是 PTP 的主要优势。多种网络交换机和网络接口控制器 (NIC) 都支持 PTP。虽然可以在网络内部使用启用非 PTP 的硬件,但为所有 PTP 时钟之间的网络组件启用 PTP 硬件可实现最大的准确性。
22.1.1 PTP Linux 实现 #
    在 SUSE Linux Enterprise Server 上,PTP 实现由 linuxptp 软件包提供。可通过 zypper
    install linuxptp 安装该软件包。该软件包中包含用于同步时钟的 ptp4l 和 phc2sys 程序,ptp4l 可实现 PTP 边界时钟和普通时钟。如果启用硬件时戳,ptp4l 会将 PTP 硬件时钟同步到主时钟。如果使用软件时戳,它会将系统时钟同步到主时钟。仅当使用硬件时戳将系统时钟同步到网络接口卡 (NIC) 上的 PTP 硬件时钟时,才需要 phc2sys。
   
22.2 使用 PTP #
22.2.1 网络驱动程序和硬件支持 #
    PTP 要求使用的内核网络驱动程序支持软件时戳或硬件时戳。此外,NIC 还必须支持物理硬件中的时戳。您可以使用 ethtool 校验驱动程序和 NIC 时戳功能:
   
>sudoethtool -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
22.2.2 使用 ptp4l #
ptp4l 默认使用硬件时戳。您需要以 root 身份使用 -i 选项指定支持硬件时戳的网络接口。-m 指示 ptp4l 将其输出列显到标准输出,而不是列显到系统的日志记录工具:
   
>sudoptp4l -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 选项启用软件时戳。
   
>sudoptp4l -m -S -i eth3
    您还可以将 ptp4l 作为服务运行:
   
>sudosystemctl start ptp4l
    在本例中,ptp4l 从 /etc/sysconfig/ptp4l 文件读取其选项。默认情况下,此文件指示 ptp4l 从 /etc/ptp4l.conf 读取配置选项。有关 ptp4l 选项和配置文件设置的详细信息,请参见 man 8 ptp4l。
   
    要永久启用 ptp4l 服务,请运行以下命令:
   
>sudosystemctl enable ptp4l
要禁用该服务,请运行
>sudosystemctl disable ptp4l
22.2.3 ptp4l 配置文件 #
ptp4l 可以从可选的配置文件读取其配置。由于默认未使用任何配置文件,您需要通过 -f 指定配置文件。
   
>sudoptp4l -f /etc/ptp4l.conf
    配置文件分为若干部分。全局部分(通过 [global] 识别)用于设置程序选项、时钟选项和默认端口选项。其他部分与特定的端口相关,会覆盖默认端口选项。部分的名称是配置的端口的名称 — 例如 [eth0]。空白端口部分可用于替换命令行选项。
   
[global] verbose 1 time_stamping software [eth0]
示例配置文件等效于以下命令选项:
>sudoptp4l -i eth0 -m -S
    有关完整的 ptp4l 配置选项列表,请参见 man 8 ptp4l。
   
22.2.4 延迟测量 #
ptp4l 通过两种方法测量时间延迟:对等式 (P2P) 或端到端 (E2E)。
   
- P2P
- 此方法使用 - -P指定。- 它可以更快地对网络环境中的更改做出反应,并可更准确地测量延迟。仅在每个端口都会与另一个端口交换 PTP 消息的网络中才会使用此方法。P2P 需受到通讯路径中所有硬件的支持。 
- E2E
- 此方法使用 - -E指定。此为默认设置。
- 自动选择方法
- 此方法使用 - -A指定。自动选项以 E2E 模式启动- ptp4l,如果收到了对等延迟请求,则会切换为 P2P 模式。
单个 PTP 通讯路径上的所有时钟必须使用相同的方法来测量时间延迟。如果在使用 E2E 机制的端口上收到了对等延迟请求,或者在使用 P2P 机制的端口上收到了 E2E 延迟请求,则会列显警告。
22.2.5 PTP 管理客户端:pmc #
    可以使用 pmc 客户端获取有关 ptp41 的更详细信息。pmc 从标准输入或命令行读取按名称和管理 ID 指定的操作。然后通过选定的传输方式发送操作,并列显收到的任何答复。pmc 支持以下三个操作:GET 可检索指定的信息,SET 可更新指定的信息,CMD(或 COMMAND)可发起指定的事件。
   
    默认情况下,管理命令会在所有端口上寻址。可以使用 TARGET 命令为后续消息选择特定的时钟和端口。如需完整的管理 ID 列表,请运行 pmc help。
   
>sudopmc -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。
   
22.3 使用 phc2sys 同步时钟 #
   使用 phc2sys 可将系统时钟同步到网卡上的 PTP 硬件时钟 (PHC)。系统时钟被视为从属时钟,而网卡上的时钟则为主时钟。PHC 本身将与 ptp4l 同步(请参见第 22.2 节 “使用 PTP”)。使用 -s 可按设备或网络接口指定主时钟。使用 -w 等待 ptp4l 进入同步状态。
  
>sudophc2sys -s eth0 -w
   PTP 以国际原子时 (TAI) 运行,而系统时钟使用的是协调世界时 (UTC)。如果您不指定 -w 来等待 ptp4l 同步,可以使用 -O 来指定 TAI 与 UTC 之间的偏差(以秒为单位):
  
>sudophc2sys -s eth0 -O -35
   也可以将 phc2sys 作为服务运行:
  
>sudosystemctl start phc2sys
   在本例中,phc2sys 从 /etc/sysconfig/phc2sys 文件读取其选项。有关 phc2sys 选项的详细信息,请参见 man 8 phc2sys。
  
   要永久启用 phc2sys 服务,请运行以下命令:
  
>sudosystemctl enable phc2sys
要禁用该服务,请运行
>sudosystemctl disable phc2sys
22.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 命令的更新频率。
   
22.4 配置示例 #
   本节提供了几个 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
22.5 PTP 和 NTP #
NTP 和 PTP 时间同步工具可以共存,可实现双向时间同步。
22.5.1 NTP 到 PTP 的同步 #
    使用 chronyd 同步本地系统时钟时,可将 ptp4l 配置为超级主时钟,以便通过 PTP 从本地系统时钟分发时间。在 /etc/ptp4l.conf 中包含 priority1 选项:
   
[global] priority1 127 [eth0]
    然后运行 ptp4l:
   
>sudoptp4l -f /etc/ptp4l.conf
    使用硬件时戳时,需要通过 phc2sys 将 PTP 硬件时钟同步到系统时钟:
   
>sudophc2sys -c eth0 -s CLOCK_REALTIME -w
22.5.2 配置 PTP-NTP 网桥 #
在未配备支持 PTP 的交换机或路由器的网络中,如果可以使用高度精确的 PTP 超级主时钟,则计算机可以作为 PTP 从属和第 1 层 NTP 服务器运行。此类计算机需有两个或更多网络接口,并且靠近或者能够直接连接到超级主时钟。这可以确保在网络中实现高度精确的同步。
    将 ptp4l 和 phc2sys 程序配置为使用一个网络接口来通过 PTP 同步系统时钟。然后将 chronyd 配置为使用另一接口提供系统时间:
   
bindaddress 192.0.131.47 hwtimestamp eth1 local stratum 1
     默认情况下,当 DHCP 客户端命令 dhclient 收到 NTP 服务器列表时,会将这些服务器添加到 NTP 配置。为防止出现此行为,请设置
    
NETCONFIG_NTP_POLICY=""
     (在 /etc/sysconfig/network/config 文件中)。