仅在网络准备就绪后,在重启时运行ntpdate的最佳方法是什么

时间:2012-06-27 05:17:52

标签: embedded-linux clock beagleboard ntp

我正在使用BeagleBone,由于它没有内置的RTC和备用电池,因此每次重启时都会丢失日期。我可以使用命令轻松设置日期:

/ usr / bin / ntpdate -b -s -u pool.ntp.org

但是,如果电源熄灭并重新用于房屋,那么时间就会消失。最新的beaglebone Angstrom linux发行版附带的解决方案是在每半小时更新一次crontab行。但我更愿意在通电时运行一次命令。

我尝试将上面列出的这个命令放在crontab中,并带有 @reboot 行,但是我相信在配置网络之前就已经运行了,或者其他什么都失败了,因为它没有让我得到正确的时间。我拉动电源5分钟然后把它放回到beaglebone。

是否有一些方法可以使用ifconfig或类似的东西,只有在网络可用后才能从init.d运行脚本?

2 个答案:

答案 0 :(得分:7)

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选项覆盖   无论如何,此检查和时钟都将设置为服务器时间   筹码时间。但是,为了防止破坏硬件等   当CMOS电池发生故障或时钟计数器出现故障时   一旦设置了时钟,将导致大于1000s的错误   无论如何都要退出。

因此我们需要在启动ntpd之前设置日期,这是由ntpdate服务通过在启动ntpd.service之前执行“ntpd -q -g -x”来完成的。

来自ntpd手册页:

  

-q在第一次设置时钟后立即退出ntpd。此行为模仿ntpdate程序的行为,该程序将被淘汰。   -g和-x选项可与此选项一起使用。注意:内核   使用此选项禁用时间纪律。


Beaglebone上安装的另一项服务与日期/时间

互动

timestamp.service

[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,则日期仅在启动持续时间之后。

答案 1 :(得分:0)

目标系统上是否有/etc/network/if-post-up.d/目录?如果是这样,则应在网络启动时运行该目录中的脚本。如果没有,你使用DHCP?您的DHCP客户端可能支持运行脚本。