我正在使用BeagleBone,由于它没有内置的RTC和备用电池,因此每次重启时都会丢失日期。我可以使用命令轻松设置日期:
/ usr / bin / ntpdate -b -s -u pool.ntp.org
但是,如果电源熄灭并重新用于房屋,那么时间就会消失。最新的beaglebone Angstrom linux发行版附带的解决方案是在每半小时更新一次crontab行。但我更愿意在通电时运行一次命令。
我尝试将上面列出的这个命令放在crontab中,并带有 @reboot 行,但是我相信在配置网络之前就已经运行了,或者其他什么都失败了,因为它没有让我得到正确的时间。我拉动电源5分钟然后把它放回到beaglebone。
是否有一些方法可以使用ifconfig或类似的东西,只有在网络可用后才能从init.d运行脚本?
答案 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客户端可能支持运行脚本。