3

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

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

但是,例如,如果房子断电又重新通电,那么时间就浪费了。最新的 beaglebone Angstrom linux 发行版附带的解决方案是在其中放置一条 crontab 行,每半小时更新一次时间。但我宁愿在开机时只运行一次命令。

我尝试将上面列出的这个命令与@reboot行一起放在crontab 中,但我相信在配置网络之前运行,或者其他失败,因为当我拉电源5 分钟并放上它时,它没有给我正确的时间回到比格骨。

是否有某种方法可以使用 ifconfig 或类似的方法仅在网络可用后从 init.d 运行脚本?

4

2 回答 2

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 选项会覆盖此检查,并且无论芯片时间如何,时钟都将设置为服务器时间。但是,为了防止硬件损坏,

所以我们需要在启动 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,则日期仅落后于启动持续时间。

于 2012-07-25T19:57:49.883 回答
0

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

于 2012-07-10T19:17:43.963 回答