LTTPR 系统要求:硬件兼容性、内核版本、依赖软件包

搭建 LTTPR 环境之前,先把硬性条件搞清楚。我见过不少同事,兴致勃勃下了源码,结果编译通不过,一查是内核版本太低。说白了,这一步卡住,后面全白搭。咱们从硬件、内核、软件包三个维度捋一遍,照着检查就不会跑偏。

LTTPR 系统要求总览 LTTPR 必须条件 硬件兼容性 内核版本 依赖软件包 CPU x86_64 / ARM 网卡:Intel i210 / i350 支持 TSN 的交换机 PTP 硬件时间戳 ≥ 5.10 LTS 开启 PREEMPT_RT 配置 HZ=1000 内核参数调优 linuxptp(ptp4l / phc2sys) chrony / ntp ethtool / iproute2 gcc / make / autoconf 💡 提示:硬件、内核、软件包三者缺一不可,且版本之间有依赖关系 建议先确认内核版本,再安装对应软件包,最后验证网卡支持

硬件兼容性

LTTPR 依赖网卡硬件对 PTP(Precision Time Protocol)的支持。不是随便找块千兆卡就能用。我在项目中踩过这种坑——用了一款廉价 USB 网卡,折腾了两天 ptp4l 就是锁不住时钟,一看日志,硬件时间戳不支持。

具体来说,需要满足以下条件:

  • CPU 架构:x86_64 或 ARM64。ARM 板子(比如 Raspberry Pi 4 以上)也能跑,但要注意 GPIO 中断延迟。
  • 网卡:必须支持 PTP Hardware Clock(PHC)。常见选择:Intel I210 / I350 / X550、Mellanox ConnectX 系列、一些 FPGA 定制卡。我个人习惯用 I210,性价比高,文档全。
  • 交换机:如果走网络级联,需要交换机支持 802.1AS 或至少 PTP Transparent Clock。便宜的家用交换机基本不行。
  • 硬件时间戳精度:检查网卡是否提供纳秒级时间戳。可以用 ethtool -T eth0 查看。

验证命令:

ethtool -T eth0 | grep -E "hardware|PTP"

如果输出包含 hardware-transmit 和 hardware-receive,说明硬件时间戳可用。只看到 software 的话,LTTPR 还能跑但精度会差很多。

内核版本

这也是容易忽略的点。LTTPR 使用了较新的 PTP 内核接口,特别是 PTP_SYS_OFFSET_EXTENDED 等 IOCTL。我建议至少用 5.10 LTS 以上,最好上 6.x。为什么?因为 5.10 以下的内核里,PHC 驱动多了不少 bug,我在调一个工控项目时就遇到过 PHC 时间跳变——查了两天才定位到内核补丁。

另外,如果你要做精确的时钟同步,PREEMPT_RT 补丁几乎是必须的。普通内核在中断响应上的抖动太大,会影响 ptp4l 的延迟测量。配置要点:

  • 内核配置开启 CONFIG_PREEMPT_RT_FULL=y
  • 定时器频率设为 1000Hz(CONFIG_HZ=1000)
  • 关闭 CPU 调频(intel_pstate=disable 或 cpufreq governor performance)

我曾经遇到过一个案例:在一台 Ubuntu 20.04(内核 5.4)上直接跑 LTTPR,ptp4l 启动正常,但 phc2sys 同步误差超过 1ms。后来升级到 5.15 并开启 PREEMPT_RT,误差降到 20μs 以内。所以内核版本绝不是「能用就行」。建议先确认:

uname -r
# 输出示例:5.15.0-91-generic

依赖软件包

软件层面,LTTPR 依赖三个核心组:时钟同步工具、网络工具、编译工具链。

类别包名版本要求备注
PTP 工具linuxptp≥ 3.1包含 ptp4l、phc2sys、pmc。主流发行版 3.1 以上都支持 LTTPR 的 --lttpr 选项
时间同步chrony 或 ntp最新 stable用于系统时钟的二级同步,备份时间源
网络管理ethtool, iproute2无特殊要求查询 PHC、配置网卡参数
编译工具gcc, make, autoconf, libtoolgcc ≥ 8如需从源码编译 linuxptp
调试工具tcpdump, wireshark (tshark)—抓包分析 PTP 报文,排查报文丢失或时戳问题

安装方式看发行版:

# Debian / Ubuntu
sudo apt install linuxptp chrony ethtool iproute2 gcc make autoconf libtool tcpdump

# RHEL / CentOS / Rocky
sudo yum install linuxptp chrony ethtool iproute gcc make autoconf libtool tcpdump

# 如果发行版自带的 linuxptp 版本过旧(例如 < 3.1),请从源码编译:
git clone https://github.com/richardcochran/linuxptp.git
cd linuxptp
make
sudo make install

特别提醒:LTTPR 的 --lttpr 选项在 linuxptp 3.1 版本中首次加入。如果你用 3.0,即使硬件、内核都满足,也无法开启 LTTPR 模式。安装后确认版本:

ptp4l -V

最后,别忘了检查交换机和网络中间设备的 PTP 支持。我在一个工厂里折腾了半天,最后发现是中间一台非管理型交换机把 PTP 报文的 delay_req 给改了 TTL——它把硬件时间戳全弄乱了。如果可能,请使用 边界时钟(BC) 或 透明时钟(TC) 交换机,它们能正确处理 PTP 时间戳。

硬件、内核、软件包这三样,缺一不可。我个人习惯是先在一台干净的机器上跑一遍 ethtool -T 和 uname -r,然后用 dpkg -l linuxptp 查看版本,全部达标后才开始下一步配置。别嫌麻烦,前期检查能省下后面调试的大把时间。