最近购入了一台 Wyse 5070 瘦客户机,打算将其做成内网综合服务器,目标其中之一就是搭建一台精确的内网NTP服务器。所以使用已有 GNSSDO 的 PPS 信号输出通过 RS-232 DCD 输入瘦客户机,并作为 PPS 信号源驯服 chronyd,日期和时间信息则可以选择通过 NEMA 报文或者其他 NTP 服务器获取。
安装和配置相关软件包
$ sudo apt install gpsd chrony pps-tools
编写/etc/systemd/system/ldattach-pps@.service 在每次启动后都使用 RS-232 DCD 作为 PPS 源
[Unit]
Description=Enable %i as PPS source
Before=network.target
[Service]
ExecStart=/usr/sbin/ldattach PPS /dev/%i
Type=forking
[Install]
WantedBy=multi-user.target
sudo systemctl enable ldattach-pps@ttyS0.service
写入 gpsd 配置文件:
START_DAEMON="true"
GPSD_OPTIONS="-n"
DEVICES="/dev/ttyS0"
USBAUTO="true"
GPSD_SOCKET="/var/run/gpsd.sock"
写入 chrony 配置文件 /etc/chrony/sources.d/gps.sources,可参考 https://chrony-project.org/doc/3.4/chrony.conf.html,delay 用来确保服务器选中 PPS 作为参考源, poll 1 代表每两秒轮询一次时钟源,offset 用来补偿 PPS 到 RS-232 输出的整体时间差,但是在 PPS 驯服下意义不大。width 0.1 显式声明了 PPS 信号的脉宽,据说可以降低抖动。
refclock SHM 0 refid GPS offset 0.1642 delay 0.2 poll 1
refclock PPS /dev/pps1 refid PPS offset 0.0 poll 1 filter 1024 width 0.1 lock GPS
若使用外部 NTP 服务器作为日期和时间源,可以添加如下列表到 /etc/chrony/sources.d/external-server.sources,minpoll 10 确保至少 1024 秒间隔轮询一次,默认为 6 而有些过于频繁了。
server ntp.ntsc.ac.cn iburst minpoll 10
server ntp.tencent.com iburst minpoll 10
server ntp.aliyun.com iburst minpoll 10
server ntp1.nim.ac.cn iburst minpoll 10
server ntp.tuna.tsinghua.edu.cn iburst minpoll 10
server ntp.sjtu.edu.cn iburst minpoll 10
server time.ustc.edu.cn iburst minpoll 10
server time.windows.com iburst minpoll 10
此时就可以启动 chronyd 和 gpsd 并观察运行情况
sudo systemctl restart chronyd
sudo systemctl restart gpsd
watch -n1 chronyc sources -v
展示一下拙劣的 PPS 到 RS-232 DCD 转接线,这虽然严重不符合电平标准,但是却工作良好:(所以我最后并没有使用 ttyS0 作为 GPS NEMA 报文传输链路,而是 Ublox USB CDC-ACM)
