Linux 使用 PTP 举行时间同步

打印 上一主题 下一主题

主题 345|帖子 345|积分 1035

概述​

PTP(精确时间协议)是一种用于在网络中举行时钟同步的协议。当与硬件支持结合使用时,PTP 能够到达亚微秒的精度,这种精度远高于 NTP 协议。
PTP 时间同步协议的支持分为内核空间和用户空间两部分。在 Linux 系统中,PTP 协议的现实实现称为 LinuxPTP,它是 PTPv2 根据 Linux 的 IEEE 1588 尺度实现的。在 LinuxPTP 软件包包罗 ptp4l 和 phc2sys 用于时钟同步的步伐,其中 ptp4l 步伐实现了 PTP 界限时钟和普通时钟,支持硬件时钟同步和软件时间同步,硬件时间戳用于将 PTP 硬件时钟与主时钟同步,软件时间戳用于将系统时钟与主时钟同步。phc2sys 步伐则用于将系统时钟同步到网卡上的 PTP 硬件时钟(PHC)。
预备工作​

安装 LinuxPTP​

首先,需要在 Linux 系统中安装 LinuxPTP。
Debian/Ubuntu 系统使用 apt 命令安装:
  1. sudo apt install linuxptp
复制代码
对于 RHEL/CentOS 6/7 系统,使用 yum 命令安装:
  1. sudo yum install linuxptp
复制代码
对于 RHEL/CentOS 8 和 Fedora 系统,使用 dnf 命令安装:
  1. sudo dnf install linuxptp
复制代码
假如是其他嵌入式 Linux 系统,大概你想安装最新版本的 LinuxPTP,可以接纳源码编译安装方式:
  1. sudo git clone git://git.code.sf.net/p/linuxptp/code linuxptp
  2. cd linuxptp
  3. sudo make
  4. sudo make install
复制代码
安装完成后可通过 ptp4l -v 命令检查是否安装乐成:
  1. $ ptp4l -v
  2. 1.92
复制代码
检查网卡驱动​

为了使用 PTP ,网络接口的内核网络驱动步伐必须支持软件或硬件时间戳功能。除了驱动步伐中存在的硬件时间戳支持之外,NIC 还必须能够在物理硬件中支持此功能。验证特定驱动步伐和 NIC 的时间戳功能的最佳方法是使用 ethtool 查询接口。
比方:检查 eth0 网卡对硬件时间戳的支持
  1. sudo ethtool -T eth0
复制代码
执行上述命令后的输出结果可能如下:
  1. Time stamping parameters for eth0:
  2. Capabilities:
  3.         hardware-transmit     (SOF_TIMESTAMPING_TX_HARDWARE)
  4.         software-transmit     (SOF_TIMESTAMPING_TX_SOFTWARE)
  5.         hardware-receive      (SOF_TIMESTAMPING_RX_HARDWARE)
  6.         software-receive      (SOF_TIMESTAMPING_RX_SOFTWARE)
  7.         software-system-clock (SOF_TIMESTAMPING_SOFTWARE)
  8.         hardware-raw-clock    (SOF_TIMESTAMPING_RAW_HARDWARE)
  9. PTP Hardware Clock: 0
  10. Hardware Transmit Timestamp Modes:
  11.         off                   (HWTSTAMP_TX_OFF)
  12.         on                    (HWTSTAMP_TX_ON)
  13.         one-step-sync         (HWTSTAMP_TX_ONESTEP_SYNC)
  14. Hardware Receive Filter Modes:
  15.         none                  (HWTSTAMP_FILTER_NONE)
  16.         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 设置文件​

ptp4l 步伐启动时会从 /etc/linuxptp/ptp4l.conf 文件读取设置选项,部分设置如下所示。
  1. [global]
  2. #
  3. # Default interface options
  4. #
  5. network_transport        UDPv4
  6. delay_mechanism                E2E
  7. time_stamping                hardware
  8. tsproc_mode                filter
  9. delay_filter                moving_median
  10. delay_filter_length        10
  11. egressLatency                0
  12. ingressLatency                0
  13. boundary_clock_jbod        0
复制代码
ptp4l 服务设置文件​

ptp4l 可以作为服务运行,对应的设置文件是 /lib/systemd/system/ptp4l.service。
  1. [Unit]
  2. Description=Precision Time Protocol (PTP) service
  3. Documentation=man:ptp4l
  4. [Service]
  5. Type=simple
  6. ExecStart=/usr/sbin/ptp4l -f /etc/linuxptp/ptp4l.conf -i eth0
  7. [Install]
  8. WantedBy=multi-user.target
复制代码
执行以下命令即可启动 ptp4l 服务:
  1. sudo systemctl start ptp4l
复制代码
假如要永久启用 ptp4l 服务,可执行以下命令:
  1. sudo systemctl enable ptp4l
复制代码
假如要禁用 ptp4l 服务,可执行以下命令:
  1. sudo systemctl disable ptp4l
复制代码
phc2sys 服务设置文件​

phc2sys 也可以作为服务运行,对应的设置文件是 /lib/systemd/system/phc2sys.service。
  1. [Unit]
  2. Description=Synchronize system clock or PTP hardware clock (PHC)
  3. Documentation=man:phc2sys
  4. After=ntpdate.service
  5. Requires=ptp4l.service
  6. After=ptp4l.service
  7. [Service]
  8. Type=simple
  9. ExecStart=/usr/sbin/phc2sys -w -s eth0
  10. [Install]
  11. WantedBy=multi-user.target
复制代码
执行以下命令即可启动 phc2sys 服务:
  1. sudo systemctl start phc2sys
复制代码
假如要永久启用 phc2sys 服务,可执行以下命令:
  1. sudo systemctl enable phc2sys
复制代码
假如要禁用 phc2sys 服务,可执行以下命令:
  1. sudo systemctl disable phc2sys
复制代码
实验​

我们可以通过修改 /etc/linuxptp/ptp4l.conf 来设置 ptp4l 的模式,再通过 systemctl start ptp4l 启动。但为了更加直观,下面的实验我们将直接通过 ptp4l 命令行启动。
提示:为了完成 PTP 时间同步实验,我们需要两台 Linux 设备,其中一台作为 PTP master,另一台作为 PTP slave。
PTP 硬件时钟同步​

ptp4l 默认使用硬件时间戳,也可以显式指定 -H 选项使用硬件时间戳。-i 选项指定支持硬件时戳的网络接口;-m 指示 ptp4l 将其输出列显到尺度输出,而不是列显到系统的日志记录工具。
PTP 主端口(Master),-H 选项显式指定使用硬件时间戳。
  1. sudo ptp4l -m -H -i eth0
复制代码
PTP 从端口(Slave),-s 选项设置为从端口。
  1. sudo ptp4l -m -H -s -i eth0
复制代码
此时终端打印的输出可能如下:
  1. selected eth0 as PTP clock
  2. port 1: INITIALIZING to LISTENING on INITIALIZE
  3. port 0: INITIALIZING to LISTENING on INITIALIZE
  4. port 1: new foreign master 00a152.fffe.0b334d-1
  5. selected best master clock 00a152.fffe.0b334d
  6. port 1: LISTENING to UNCALIBRATED on RS_SLAVE
  7. master offset -25937 s0 freq +0 path delay       12340
  8. master offset -27887 s0 freq +0 path delay       14232
  9. master offset -38802 s0 freq +0 path delay       13847
  10. master offset -36205 s1 freq +0 path delay       10623
  11. master offset  -6975 s2 freq -30575 path delay   10286
  12. port 1: UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTED
  13. master offset  -4284 s2 freq -30135 path delay    9892
复制代码
其中,port 0 是用于当地 PTP 管理的 Unix 域套接字。port 1 是 eth0 接口。INITIALIZING、LISTENING、UNCALIBRATED 和 SLAVE 是发生 INITIALIZE、RS_SLAVE 和 MASTER_CLOCK_SELECTED 事件时更改的端口状态示例。当端口状态从 UNCALIBRATED 更改为 SLAVE 时,表示计算机已与 PTP 主时钟乐成同步。
master offset 行说明:


  • master offset 值表示测得的与主时钟之间的毛病(以纳秒为单位)。
  • s0、s1、s2 表示时钟伺服的不同状态。s0 表示已解锁(unlocked),s1 表示时钟步进(clock step),s2 表示已锁定(locked)。假如伺服处于已锁定状态(s2),并且 pi_offset_const 选项在设置文件中设置为负值,则时钟不会步进,而只会缓慢调解。
  • freq 值表示时钟的频率调解,以十亿分率(ppb)为单位。
  • path delay 值表示从主时钟发送的同步消息的预计延迟(以纳秒为单位)。
PTP 软件时间同步​

PTP 主端口(Master),使用 -S 选项启用软件时间戳。
  1. sudo ptp4l -m -S -i eth0
复制代码
PTP 从端口(Slave),-s 选项设置为从端口。
  1. sudo ptp4l -m -S -s -i eth0
复制代码
使用软件时间戳举行时间同步的准确度比硬件时间戳要低,这是因为 IEEE 1588 的同步原理决定了时钟同步的精度主要取决于时间戳的精度。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表