opkg install ntp-systemd
systemctl enable ntpdate.service
systemctl enable ntpd.service
编辑 /etc/ntp.conf 并注释以下行(不回退不存在的硬件时钟,因为 ntpdate 服务使用“ntpd -q”命令)
#server 127.127.1.0
#fudge 127.127.1.0 stratum 14
安装了两个服务:
/lib/systemd/system/ntpd.service:
[Unit]
Description=Network Time Service
After=network.target
[Service]
Type=forking
PIDFile=/run/ntpd.pid
ExecStart=/usr/bin/ntpd -p /run/ntpd.pid
/lib/systemd/system/ntpdate.service:
[Unit]
Description=Network Time Service (one-shot ntpdate mode)
Before=ntpd.service
[Service]
Type=oneshot
ExecStart=/usr/bin/ntpd -q -g -x
RemainAfterExit=yes
ntpd 在网络启动后启动(After=network.target),因此日期应该不断同步。但是在 ntpd 手册页中有解释:
当今的大多数操作系统和硬件都包含一个时间 (TOY) 芯片,以在电源关闭期间保持时间。当机器启动时,该芯片用于初始化操作系统时间。机器与 NTP 服务器同步后,操作系统会不时更正芯片。如果没有 TOY 芯片或者由于某种原因它的时间距离服务器时间超过 1000 秒,ntpd 会假设某些事情一定是非常错误的,唯一可靠的行动是操作员进行干预并手动设置时钟。这会导致 ntpd 退出并在系统日志中显示恐慌消息。-g 选项会覆盖此检查,并且无论芯片时间如何,时钟都将设置为服务器时间。但是,为了防止硬件损坏,
所以我们需要在启动 ntpd 之前设置日期,这是由 ntpdate 服务通过在启动 ntpd.service 之前执行“ntpd -q -g -x”来完成的。
从 ntpd 手册页:
-q 在第一次设置时钟后退出 ntpd。这种行为模仿了 ntpdate 程序的行为,该程序将被淘汰。-g 和 -x 选项可与此选项一起使用。注意:使用此选项禁用内核时间规则。
Beaglebone 上安装的另一个服务与日期/时间交互
时间戳服务
[Unit]
Description=Timestamping service
ConditionPathExists=/etc/timestamp
After=remount-rootfs.service
[Service]
RemainAfterExit=yes
ExecStart=/usr/bin/load-timestamp.sh
ExecStop=/usr/bin/load-timestamp.sh --save
此服务在停止时将当前时间戳存储在 /etc/timestamp 中,并在启动时从该时间戳设置日期。因此,如果未安装 ntpd,手动设置日期并重新启动 beaglebone,则日期仅落后于启动持续时间。