Как принудительно обновить часы с помощью ntp?

Я использую Ubuntu на встроенной системе на базе ARM, в которой отсутствует RTC с батарейным питанием. Время пробуждения - где-то в 1970 году. Таким образом, я использую службу NTP для обновления времени до текущего времени.

Я добавил следующую строку в /etc/rc.local файл:

sudo ntpdate -s time.nist.gov

Однако после запуска все равно требуется пара минут, пока время не будет обновлено, в течение этого периода я не могу эффективно работать с tar и make.

Как я могу принудительно обновлять часы в любой момент времени?


ОБНОВЛЕНИЕ 1: Следующее (спасибо Эрику и Стефану) отлично работает из командной строки, но не обновляет часы при вводе /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: Я попытался следовать нескольким предложениям, которые пришли в ответ на 1-е обновление, но, похоже, ничто на самом деле не выполняет требуемую работу. Вот что я попробовал:

  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 не удается открыть сокет (порт 123 UDP) и подключиться к 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 на вершине

Пока это, по сути, то, что рекомендовали другие, однако есть еще один шаг, который, я думаю, вам следует предпринять. Установите поддельную программу 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 год. Когда ваша машина загрузится, она установит свои часы на временную метку fake-hwclock, записанную во время последней перезагрузки / выключения. Это означает, что у вас могут быть несколько правильные часы на случай возникновения проблем с сетью при загрузке.

ntpdate - это программа, отличная от netdeon. 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 Mint 19 (Ubuntu 18.04) время сохраняется с помощью systemd-timesyncd.

Поэтому, чтобы получить актуальное время после потери синхронизации, я просто запускаю

sudo systemctl restart systemd-timesyncd

Начиная с 15.04 Ubuntu по умолчанию использует systemd. Поэтому такие критические системы, как time, управляются через systemd. Чтобы узнать, какую службу использует ваша система, запустите что-то вроде

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

Для TECHJS 16.04 сервис был ntp. Для меня на Ubuntu 18.04 (Mint 19) сервис является 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 секунд, например, когда системное время при запуске составляет 1 января 1970 года, поскольку аппаратный RTC отсутствует.

Проверьте это (нет apt, нет сервиса):

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

Выпьем за Прашанта, кто решил эту проблему

из здесь:
ntpdate -s ntp.ubuntu.com

обратите внимание на флаг ‘-b’ в ntpdate. Со справочной страницы ntpdate: “Принудительно увеличивайте время с помощью системного вызова settimeofday(), а не уменьшайте (по умолчанию) с помощью системного вызова adjtime(). Этот параметр следует использовать при вызове из загрузочного файла во время загрузки.” Многие из приведенных ниже ответов не включают его, и это, возможно, часть проблемы в том, чтобы заставить вещи работать. Учтите, что флаг ‘-B’ указывает на то, что синхронизация смещений более 128 мс может занять несколько часов с использованием механизма “slew” по умолчанию

timedatectl, но How to update system time behind a proxy? - Ask Ubuntu

Нет необходимости использовать sudo в файлах /etc/rc.locale … они уже запущены от имени root.