如何使用 ntp 强制更新时钟?

如何使用 ntp 强制更新时钟?

我在基于 ARM 的嵌入式系统上运行 Ubuntu,该系统缺少电池支持的 RTC。唤醒时间在 1970 年左右。因此,我使用 NTP 服务将时间更新为当前时间。

/etc/rc.local我在文件中添加了以下行:

sudo ntpdate -s time.nist.gov

但是启动后,仍需要几分钟才能更新时间,在此期间我无法有效地使用tarmake

如何在任何给定时间强制更新时钟?


更新 1:以下内容(感谢 Eric 和 Stephan)在命令行上运行良好,但在输入时无法更新时钟/etc/rc.local

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; date
Thu Jan  1 00:00:58 UTC 1970
 * Stopping NTP server ntpd     [ OK ] 
 * Starting NTP server          [ OK ] 
Thu Feb 14 18:52:21 UTC 2013

我究竟做错了什么?


更新2:我尝试按照第一次更新后的一些建议去做,但似乎没有什么能真正达到预期的效果。以下是我尝试的方法:

  1. 更换服务器us.pool.ntp.org
  2. 使用程序的明确路径
  3. 删除所有ntp服务,只sudo ntpdate ...保留rc.local
  4. sudo从上面的命令中删除rc.local

使用上述方法,机器仍从 1970 年开始。但是,当登录后从命令行执行此操作(通过ssh)时,只要我调用,时钟就会更新ntpdate

我做的最后一件事是从中删除它并在文件中rc.local调用。这确实按预期更新了时钟,并且一旦命令提示符可用,我就会获得真实的当前时间。ntpdate.bashrc

然而,这意味着如果机器已打开,但没有用户登录,则时间永远不会更新。当然,我可以重新安装服务,ntp这样至少时钟会在启动后几分钟内更新,但之后我们又回到了原点。

那么,为什么ntpdate在 中放置命令rc.local无法执行所需的任务,而在 中执行命令却可以.bashrc正常工作呢?

答案1

而不是 ntpdate(它是已弃用), 使用ntpd

sudo service ntp stop
sudo ntpd -gq
sudo service ntp start

告诉-gqntp 守护进程无论偏移量如何都要校正时间( ),并在设置时间后g立即退出( )。q

答案2

可能ntp服务正在运行,这就是为什么ntpdate无法打开套接字(端口 123 UDP)并连接到 ntp 服务器。

从命令行尝试:

sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start

如果您想要使用此功能,请执行/etc/rc.local以下操作:

( /etc/init.d/ntp stop
until ping -nq -c3 8.8.8.8; do
   echo "Waiting for network..."
done
ntpdate -s time.nist.gov
/etc/init.d/ntp start )&

答案3

使用timedatectl(systemd 服务单元)设置时间。ntp已被弃用。

sudo systemctl restart systemd-timesyncd.service

您可以通过阅读日志来检查更新时间journalctl -xe | tail

状态 timedatectl status并进行配置/etc/systemd/timesyncd.conf

参考

答案4

正如其他人指出的那样,最好的解决方案是指示 ntpd 忽略恐慌阈值,默认情况下该阈值为 1000 秒。您可以通过以下两种方式之一配置恐慌阈值:

  • 编辑/etc/default/ntp并确保 -g 选项存在。
  • 编辑 /etc/ntp.conf 并放在tinker panic 0顶部

到目前为止,这基本上是其他人所推荐的,但是我认为你应该采取另一个步骤。安装 fake-hwclock 程序:

# apt-get install fake-hwclock


fake-hwclock: Save/restore system clock on machines without working RTC hardware

 Some machines don't have a working realtime clock (RTC) unit, or no
 driver for the hardware that does exist. fake-hwclock is a simple set
 of scripts to save the kernel's current clock periodically (including
 at shutdown) and restore it at boot so that the system clock keeps at
 least close to realtime. This will stop some of the problems that may
 be caused by a system believing it has travelled in time back to
 1970, such as needing to perform filesystem checks at every boot.

 On top of this, use of NTP is still recommended to deal with the fake
 clock "drifting" while the hardware is halted or rebooting.

安装 fake-hwclock 后,您的机器不会在启动时误以为时间又回到了 1970 年。当您的机器启动时,它会将其时钟设置为 fake-hwclock 在上次重启/关机时写入的时间戳。这意味着,如果您在启动时出现网络问题,您可以获得一个相对正确的时钟。

相关内容