当前位置: 首页>>技术问答>>正文


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

,

问题描述

我在基于ARM的嵌入式系统上运行Ubuntu,该系统缺乏电池支持的RTC。 wake-up时间在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服务,并在rc.local中保留sudo ntpdate ...

  4. rc.local中的上述命令中删除sudo

使用上述方式,机器仍然在1970年启动。但是,一旦登录(通过ssh)从命令行执行此操作时,只要调用ntpdate,时钟就会立即更新。

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

但是,这意味着如果打开机器并且没有用户登录,则时间永远不会更新。当然,我可以重新安装ntp服务,以便至少在启动后几分钟内更新时钟,但是我们又回到了第一个方格。

那么,为什么在rc.local中放置ntpdate命令没有执行所需的任务,而在.bashrc中这样做的工作正常吗?

最佳解决方法

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 )&

次佳解决方法

使用,而不是ntpdate(它是deprecated)

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

-gq通知ntp守护程序无论偏移量(g)如何校正时间,并在设置时间后立即退出(q)。

第三种解决方法

使用sntp立即设置时间。例如:

sudo sntp -s 24.56.178.140

-s后的数字可以是任何ntp时间服务器,其中一个是Ft中的NIST。柯林斯,科罗拉多州。

第四种方法

正如其他人指出的,最好的解决方案是指示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在上次重新启动/关闭期间写入的时间戳。这意味着您可以拥有一个正确的时钟,以防启动时出现网络问题。

第五种方法

ntpdate是一个与net dameon不同的程序。 NTPDate可能在启动时出错,因为ntpd正在该套接字上运行。

从命令行运行

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

您也可以一起卸载ntpd(apt-get remove ntp)并添加一个cron脚本以便每隔一小时左右使用ntpdate。

UPDATE

ntp服务可能不会为你在这个系统上有意义的价值,所以先删除它。

# sudo apt-get remove ntp

现在添加命令:

ntpdate -sb time.nist.gov

/etc/rclocal

重启。应该很擅长这一点。

第六种方法

rdate -s tick.greyware.com

如果你想要做的只是设置时钟一次,那么简单

第七种方法

在Debian /Mint /Ubuntu(或其他Debian衍生产品)系统上执行此操作的正确方法是拥有该行

NTPD_OPTS="-g"

在文件中

/etc/default/ntp

这确保了当从/etc/init.d/ntp脚本启动ntpd时,它将与”-g”选项一起运行,即viz

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

允许ntpd在系统时间超过1000s时更正系统时间,例如系统时间是1970年1月1日,因为没有硬件RTC。

第八种方法

尝试使用-b选项来缩短时间。

第九种方法

tlsdate通过安全地将TLS连接到远程服务器并从安全握手中提取远程时间来设置本地时钟。与ntpdate不同,tlsdate使用TCP,例如连接到远程HTTPS或启用TLS的服务,并为针对试图向您提供恶意时间信息的对手提供一些保护。

tlsdate -V -n -H encrypted.google.com

第十种方法

https://help.ubuntu.com/lts/serverguide/NTP.html#timedatectl

使用timedatectl设置时间,不推荐使用ntp。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/94.html,未经允许,请勿转载。