参考文献: http://linuxptp.sourceforge.net/
0、硬件支持
查看网卡是否支持软硬件时间戳:
sudo ethtool -T eno1
Time stamping parameters for eno1:
Time stamping parameters for eno1:
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)
ptpv1-l4-sync (HWTSTAMP_FILTER_PTP_V1_L4_SYNC)
ptpv1-l4-delay-req (HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ)
ptpv2-l4-sync (HWTSTAMP_FILTER_PTP_V2_L4_SYNC)
ptpv2-l4-delay-req (HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ)
ptpv2-l2-sync (HWTSTAMP_FILTER_PTP_V2_L2_SYNC)
ptpv2-l2-delay-req (HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ)
ptpv2-event (HWTSTAMP_FILTER_PTP_V2_EVENT)
ptpv2-sync (HWTSTAMP_FILTER_PTP_V2_SYNC)
ptpv2-delay-req (HWTSTAMP_FILTER_PTP_V2_DELAY_REQ)
软件时间戳需要包括参数
SOF_TIMESTAMPING_SOFTWARE
SOF_TIMESTAMPING_TX_SOFTWARE
SOF_TIMESTAMPING_RX_SOFTWARE
硬件时间戳需要包括参数
SOF_TIMESTAMPING_RAW_HARDWARE
SOF_TIMESTAMPING_TX_HARDWARE
SOF_TIMESTAMPING_RX_HARDWARE
1、LinuxPTP源码下载
sudo git clone git://git.code.sf.net/p/linuxptp/code linuxptp
cd linuxptp
sudo make
sudo make install
查看Usage
ptp4l -h
延迟机制选项
-A Auto,自动选择延迟机制。,从E2E开始,当收到对等延迟请求时切换到P2P
-E E2E,选择延迟请求 - 响应(E2E)机制。 默认是用这个机制。 单个PTP通信路径上的所有时钟必须使用相同的机制。 使用E2E机制在端口上收到对等延迟请求时,将输出warning
-P P2P,对等延迟机制
网络传输选项
-2 IEEE 802.3
-4 UDP IPV4(默认)
-6 UDP IPV6
时间戳选项
-H 使用硬件时间戳(默认)
-S 使用软件时间戳
-L LEGACY HW时间戳
其他选项
-f [file] 从指定文件file中读取配置。 默认情况下不读取任何配置文件。
-i [dev] 选择PTP接口设备,例如eth0(可多次指定)必须至少使用此选项或配置文件指定一个端口。
-p [dev] 在Linux内核v3.5之前,无法发现与网络接口关联的PHC设备。 此选项指定在旧内核上运行时要使用的PHC设备(例如/ dev/ptp0)。要使用的时钟设备,默认为auto,忽略软件/ LEGACY HW时间戳(不推荐使用此选项)
-s slaveOnly mode,从时钟模式(覆盖配置文件)
-t 透明时钟模式
-l [num] 将日志记录级别设置为'num',默认是6
-m 将消息打印到stdout
-q 不打印消息到syslog
-v 打印软件版本并退出
-h help
2、run linuxptp
2.1 软件时间戳,主从模式测试
服务端(主钟):
sudo ptp4l -i enp0s31f6 -m -S
客户端(从钟):
sudo ptp4l -i eno1 -m -S -s
运行结果:
主钟:
从钟:
运行一会儿以后:
log中的内容为:
master offset : 即PTP协议中定义的主从端时间差,单位:ns
s0,s1,s2 : 表示时钟伺服器的不同状态,s0表示未锁定,s1表示正在同步,s2表示锁定,锁定状态表示不会再发生阶跃行同步,只是缓慢调整
freq:
port 0:INITIALIZING to LISTENING on INIT_COMPLET : 本地PTP管理的Unix域socket;
port 1:new foreign … : eno1上的端口;
从钟端口状态由UNCALIBRATED 变为SLAVE时,则从钟已经成功地与best master同步。
2.2 硬件时间戳测试
服务端(主钟):
sudo ptp4l -i enp0s31f6 -m -H
客户端(从钟):
sudo ptp4l -i eno1 -m -H -s
如果要修改系统时间的话,需要PHC把通过PTP协议获取到的时间 同步到系统上,执行phc2sys命令:
#主钟
sudo phc2sys -m -s CLOCK_REALTIME -c enp0s31f6 -w
sudo ptp4l -i enp0s31f6 -m -H
#从钟
sudo phc2sys -m -s eno1 -w
sudo ptp4l -i eno1 -m -H -s
运行结果:
从钟:
显然用硬件时间戳同步的精度高得多,而且这只是一块普通网卡,走的还是校园网
2.3 配置文件
运行时使用-f可以指定配置文件,命令行会覆盖配置文件,常用的配置项如下(‘#’后面是注释,实际配的时候要留注释的话注释需要单独一行,目前是这样):
[global]
twoStepFlag 1 #PTP两步模式是否开启
clientOnly 0 #
socket_priority 0
priority1 128 #对应BMCA里的优先级1
priority2 128 #对应BMCA里的优先级2
domainNumber 0 #PTP域number
#utc_offset 37 #配置闰秒,截止目前是37秒,一般不用配置因为时钟源配过(默认是注释的)
clockClass 248 #对应BMCA里的clockClass
…………
logAnnounceInterval 1 # log间隔
delayAsymmetry 0 # 可配置的链路不对称性,正数表示rx比tx延迟高,负数表示低,单位ns。
…………
BMCA ptp # 指定BMCA算法 ptp、noop、自定义
…………
ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E
……
clock_type OC
network_transport UDPv4 #L2 UDPv4 UDPv6,对应命令行的-2 -4 -6
delay_mechanism E2E # E2E P2P
2.4 透明时钟(TC)模式测试(已修复)
/- 这个bug已经修复了 -\
TC和BC都需要至少有两个interface;
执行以下命令
sudo ptp4l -i eno1 eno2 -m -H -t
提示无效的选项:
嗯?usage里分明写着 -t 是transparent clock 啊
sudo vim ptp4l.8
嗯,-f -i -m -p -l -i -A -E -P -2 -4 -6 -H -S -L -q -v -h
??就是没有-t,不懂了手动TC/BC:需要设备有俩网卡,一个卡绑从钟一个卡绑定主钟,来实现TC/BC。效果其实差不多。