如何使用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 ; dateThu 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: 我尝试遵循响应1st更新的几个建议,但似乎没有实际按照要求完成工作。 这是我试过的:

  1. 将服务器替换为 us.pool.ntp.org
  2. 使用程序的显式路径
  3. 删除 ntp 完全服务,只管离开 sudo ntpdate ...rc.local
  4. 删除 sudo 从上面的命令在 rc.local

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

我做的最后一件事就是把它从 rc.local 然后打电话给 ntpdate 在我的 .bashrc 档案。 这确实会按预期更新时钟,并且一旦命令提示符可用,我就会获得真正的当前时间。

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

那么,有没有理由把 ntpdate 指挥进入 rc.local 不执行所需的任务,而在这样做 .bashrc 工作正常吗?

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

sudo service ntp stopsudo ntpd -gqsudo service ntp start

-gq 告诉ntp守护程序纠正时间,而不考虑偏移量(g)并立即退出(q)设定时间后。

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

从命令行尝试:

sudo service ntp stopsudo ntpdate -s time.nist.govsudo service ntp start

如果你想把这个放进去 /etc/rc.local 使用以下内容:

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

使用sntp立即设置时间。 从它的手册页的一些例子:

USAGE     sntp ntpserver.somewhere             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.     sntp -Ss -M 128 ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is             synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will             be stepped.     sntp -S ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐             recated) ntpdate(8), or rdate(8) commands.

它确实适用于任何ntp时间服务器。 一个方便的服务器列表可以在ntppool.org...

你需要 须藤 特权,例如:

sudo sntp -Ss -M 128 0.de.pool.ntp.org

使用方法 timedatectl (systemd服务单元)来设定时间。 ntp 被弃用。

sudo systemctl restart systemd-timesyncd.service

您可以检查时间更新阅读日志与 journalctl -xe | tail.

timedatectl status 并配置在 /etc/systemd/timesyncd.conf.

参考资料

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

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

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

# apt-get install fake-hwclockfake-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年。 当您的机器启动时,它会将其时钟设置为上次重新启动/关闭期间写入的时间戳假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。

更新资料

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

# sudo apt-get remove ntp

现在添加命令:

ntpdate -sb time.nist.gov

/etc/rclocal

重新启动。 在这一点上应该很好。

rdate -s tick.greyware.com

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

请注意,目前一些基于Ubuntu的系统现在默认情况下甚至不使用NTP服务。 在我的Linux Mint19(Ubuntu18.04)机器上,时间由 systemd-timesyncd.

因此,为了在失去同步后获得最新时间,我只需运行

sudo systemctl restart systemd-timesyncd

由于15.04Ubuntu默认使用systemd。 因此,像时间这样的关键系统通过systemd进行管理。 要查找您的系统正在使用的服务,请运行类似的操作

systemctl list-unit-files | grep -E 'ntp|timesyncd'

对于TechJS上16.04该服务是 ntp. 对于我自己在Ubuntu18.04(Mint19)的服务是 systemd-timesyncd. 有趣的是,我登录了我拥有的16.04服务器,它使用 systemd-timesyncd ""好吧。

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

NTPD_OPTS="-g"

在文件中

/etc/default/ntp

这确保当ntpd从/etc/init启动时。d/ntp脚本,它运行与"-g"选项,即

 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在系统时间超过1000秒时纠正系统时间,例如当系统时间是1970年1月1日启动时,因为没有硬件RTC。

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

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

从[这里][1]:
'ntpdate-s ntp.ubuntu.com`

[1]:What is the command to update time and date from internet - Ask Ubuntu

注意ntpdate上的’-b’标志。 从ntpdate的手册页:"使用settimeofday()系统调用强制时间步进,而不是使用adjtime()系统调用slewed(默认)。 在启动时从启动文件调用时应使用此选项。"下面的许多答案都没有包括它,这可能是让事情发挥作用的一部分问题。 考虑到它提到的’-B’标志,超过128毫秒的偏移可能需要数小时才能使用默认的’转换’机制进行同步

‘timedatectl’,但是https://askubuntu.com/questions/832646/how-to-update-system-time-behind-a-proxy

没有必要在/etc/rc中使用`sudo’。区域设置文件。. 他们已经以root身份运行了.