对于网络环境,保持计算机和其他设备的时钟同步和准确至关重要。 有几种解决方案可以实现同步和准确性,例如广泛使用的网络时间协议 (NTP),如 “参考”手册,第 18 章“使用 NTP 同步时间” 中所述。
精密时间协议 (PTP) 是一种能够达到亚微秒精度的协议,优于 NTP 的精度。 PTP 支持分为内核空间和用户空间。 openSUSE Leap 中的内核包含对 PTP 时钟的支持,这些时钟由网络驱动程序提供。
由 PTP 管理的时钟遵循主从层次结构。 从机与主机同步。 层次结构由 最佳主时钟 (BMC) 算法更新,该算法在每个时钟上运行。 只有一个端口的时钟可以是主时钟或从机。 这种时钟称为 普通时钟 (OC)。 具有多个端口的时钟可以在一个端口上作为主时钟,在另一个端口上作为从机。 这种时钟称为 边界时钟 (BC)。 顶层主时钟称为 主时钟。 主时钟可以与全球定位系统 (GPS) 同步。 这样,不同的网络可以通过高精度的同步。
硬件支持是 PTP 的主要优势。 多个网络交换机和网络接口控制器 (NIC) 支持它。 虽然可以在网络中使用未启用 PTP 的硬件,但如果所有 PTP 时钟之间的网络组件都启用了 PTP 硬件,则可以达到最佳的精度。
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
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 接口。
INITIALIZING、LISTENING、UNCALIBRATED 和 SLAVE 是端口状态的示例,这些状态在 INITIALIZE、RS_SLAVE 和 MASTER_CLOCK_SELECTED 事件发生时发生变化。 当端口状态从 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
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。
ptp4l 以两种不同的方式测量时间延迟:点对点 (P2P) 或 端到端 (E2E)。
使用 -P 指定此方法。
它能更快地响应网络环境的变化,并且在测量延迟方面更准确。 它仅用于网络中每个端口与其他一个端口交换 PTP 消息的网络。 P2P 需要通信路径上的所有硬件都支持它。
使用 -E 指定此方法。 这是默认设置。
使用 -A 指定此方法。 自动选项以 E2E 模式启动 ptp4l,并在收到对等延迟请求时切换到 P2P 模式。
单个 PTP 通信路径上的所有时钟必须使用相同的方法来测量时间延迟。 如果在正在使用 E2E 机制的端口上收到对等延迟请求,或者在正在使用 P2P 机制的端口上收到 E2E 延迟请求,则会打印警告。
您可以使用 pmc 客户端获取有关 ptp41 的更详细信息。 它从标准输入读取——或从命令行读取——按名称和管理 ID 指定的操作。 然后,它通过所选传输发送操作,并打印收到的任何回复。 支持三种操作: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 选项指定发送消息中的边界跳数值。 将其设置为零会将边界限制为本地 ptp4l 实例。 增加该值还会检索来自本地实例更远的 PTP 节点的消息。 返回的信息可能包括
到主时钟的通信节点数。
从主时钟测量的时钟的最后偏移量(纳秒)。
从主时钟发送的同步消息的估计延迟(纳秒)。
如果为 true,则 PTP 时钟与主时钟同步;本地时钟不是主时钟。
这是主时钟的标识。
有关完整的 pmc 命令行选项列表,请参阅 man 8 pmc。
使用 phc2sys 将系统时钟与网络卡上的 PTP 硬件时钟 (PHC) 同步。 系统时钟被视为 从机,而网络卡被视为 主时钟。 PHC 本身与 ptp4l 同步(请参阅 第 20.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
当 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 命令更新的频率。
本节包含几个 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
>sudoptp4l -f /etc/ptp4l.conf
当使用硬件时间戳时,您需要使用 phc2sys 将 PTP 硬件时钟同步到系统时钟
>sudophc2sys -c eth0 -s CLOCK_REALTIME -w
如果网络中存在一个高精度 PTP 主时钟,但没有支持 PTP 的交换机或路由器,则一台计算机可以作为 PTP 从机和 stratum-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 文件中。