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


377

Я использую 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 ; 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-е обновление, но, похоже, на самом деле ничто не делает работу в соответствии с требованиями Вот что я попробовал:

  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работает нормально?


2
от [здесь] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615

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

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

Ответы:


325

Вероятно, 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 )&

Благодарю. Не могли бы вы объяснить, почему вам нужны явные пути?
ysap

1
Я действительно не знаю. :-) Однажды у меня возникли проблемы при попытке запустить serviceиз rc.local и cron, но мне удалось исправить это с помощью /etc/init.d/xxx. На самом деле я думаю, что вам не нужно ntpdateуказывать полный путь , мне нравится использовать полные пути в скриптах, просто чтобы убедиться, что нужный файл будет найден.
Эрик Карвалью,

2
ОК, это была, видимо, проблема. Теперь часы обновляются, как только сетевое соединение установлено. Благодарю.
ysap

3
Я узнал, что us.pool.ntp.orgболее отзывчивый.
ysap

7
С -uопцией, вам не нужно останавливать службу sudo ntpdate -u time.nist.gov
Эдвард Андерсон

485

Вместо ntpdate (который устарел ) используйте

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

Команда -gqвелит демону ntp корректировать время независимо от смещения ( g) и немедленно выходить ( q) после установки времени.


3
Благодарю. По-прежнему показывает 1970 после этой команды (w / sudo). Читая ntpdmanpage, я не уверен, как это вызывает обновление?
ysap

12
Опция "-q" указывает демону NTP на запуск, установку времени и немедленное завершение работы. Опция «-g» позволяет корректировать разницу во времени, превышающую 1000 секунд. В более долгосрочной перспективе вы должны просто настроить демон NTP на постоянную работу.
Тгарольд

35
Этот ответ должен идти наверх, потому что он правильный: ntpdate устарел, и его установка - плохая идея, потому что он конфликтует с ntp. Если часы не работают, вам нужно выполнить этот шаг вручную, потому что в противном случае ntp не изменит ваши часы и не скажет вам, почему.
Лиам

31
Для меня sudo ntpd -gqне выход! Я на 14.10 и мне нужно CTRL + C, чтобы продолжить ... или сколько времени это займет?
Яник Рошон

5
К вашему сведению, в моей системе (CentOS 6.6) мне нужно было изменить два экземпляра sudo service ntp...на sudo service ntpd....
Риного

63

Используйте sntp, чтобы установить время немедленно. Например:

sudo sntp -s 24.56.178.140

Числа после -s могут быть любым сервером времени ntp, то есть NIST в Ft. Коллинз, Колорадо.


1
Это сработало! +1
CappY

7
Это сработало, когда "sudo ntpd -gq" этого не сделал.
Мэтт Уайт

Я не знаю, сколько раз я приходил в поисках этого ответа. Работает каждый раз.
Хаос

1
невозможно найти пакет sntp?
храм

1
apt-get установить sntp / yum установить sntp (да, он работает на CentOS, RedHat, fedore тоже)
ndemou

40

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


1
-gказалось, ничего не делает для меня (в командной строке, я не имею /etc/default/ntp), но добавление tinker panic 0к ntp.confработали
Дейв Кузино

@Sahuagin Я не знаю, что тебе сказать, кроме того, что у тебя нестандартный пакет NTP. / etc / default / ntp является частью пакета из Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist и -g были опцией, насколько я себя помню.
17

извините, я думаю, что я на самом деле не на Ubuntu и должен был подумать немного больше, прежде чем комментировать. tinker panic 0определенно, похоже, сработало.
Дейв Кузино

13

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

Перезагрузка. Должно быть хорошо в этот момент.


ответ обновлен.
Стефан

1
Разве ntpdate не прекращается или что-то еще? Кроме того, если я правильно понимаю, служба работает и поддерживает синхронизацию локальных часов с часами сервера - так что дрейф связан. Если вы удалите ntp и запустите ntpdate один раз, не повлияет ли это на смещение часов при длительном включении машины?
ysap

Стефан, пожалуйста, смотрите обновление № 2 к вопросу.
2013 г.

3
Да, ntpdate постепенно сокращается. Использование «ntpd -q» является предпочтительным (оба варианта требуют, чтобы ntpd был остановлен первым).
Тгарольд

11

Используйте timedatectl(системный сервисный модуль), чтобы установить время. ntpне рекомендуется.

sudo systemctl restart systemd-timesyncd.service

Вы можете проверить время было обновлено, читая журналы с journalctl -xe | tail

Ссылка


Это работало на Ubuntu 19.04. Спасибо!
Крубо

10
rdate -s tick.greyware.com

если все, что вы хотите сделать, это установить часы один раз, просто


Благодарю. В настоящее время у меня нет системы, чтобы проверить эту команду, но если вы проследите за обсуждением вопроса и принятым ответом, вы увидите, что проблема заключалась в недоступности сети во время выполнения команды обновления часов.
ysap

Это исправило проблему синхронизации времени на моем Raspberry Pi. Спасибо.
Оливер Сприн

7

Правильный способ сделать это в системе 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.


У меня уже есть это, но это все еще говорит 3:00 в Нью-Йорке, когда это должно быть 11:00.
Чови

У меня тоже уже была именно эта строка /etc/default/ntp, но время не было синхронизировано.
Давид Ференчи Рогожан

5

tlsdateустанавливает локальные часы путем безопасного соединения с TLS с удаленными серверами и извлечения удаленного времени из безопасного рукопожатия. В отличие от этого ntpdate, tlsdateиспользует TCP, например, для подключения к удаленной службе HTTPS или TLS, и обеспечивает некоторую защиту от злоумышленников, которые пытаются передать вам вредоносную информацию о времени.

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

5

Обратите внимание, что некоторые современные системы на основе Ubuntu по умолчанию даже не используют службу NTP. На моей машине Linux Mint 19 (Ubuntu 18.04) время сохраняется systemd-timesyncd.

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

sudo systemctl restart systemd-timesyncd

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

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

Для TechJS 16.04 сервис был ntp. Для себя на Ubuntu 18.04 (Mint 19) сервис есть systemd-timesyncd. Интересно, что я вошел на сервер 16.04, который у меня есть, и он также использует systemd-timesyncd.


Благодарю. Прошло много времени с момента публикации вопроса, и у меня нет системы, доступной для тестирования, но не могли бы вы рассказать, чем ваш ответ отличается от @TechJS, особенно предложенная вами команда немного отличается.
ysap

Ха, спасибо. Это был ответ как для вас, так и для любого, кто в будущем окажется здесь без более актуальной информации (как я). Я обновил свой ответ, чтобы быть более точным в отношении того, как я получу свой ответ.
Аарон Чемберлен

4

Попробуйте использовать -bопцию, чтобы шагать время.


2
При попытке из командной строки, я получаю следующий ответ: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Тем не менее, я думаю, что я попробовал это раньше, rc.localно это не помогло.
ysap

3
Прежде чем вы сможете запустить, вам нужно остановить службу ntpntpdate -b <ipaddress>
Wim Deblauwe

2

Что ж,

Я использую Rasbian (Debian Wheezy) на моем Raspberry Pi, который не имеет hwclock. Мне показалось удобным написать небольшой скрипт и запустить его после того, как мой интернет-интерфейс заработал, так что я уверен, что как только сеть станет доступной, часы обновятся.

Сначала проверьте, что у вас есть ntpdateпакет, запустив

sudo apt-get update
sudo apt-get install ntpdate

Вы должны добавить следующее в ваш /etc/network/interfaces(конечно, eth0это только пример):

auto eth0
    iface eth0 inet dhcp
    post-up /usr/local/sbin/update-time.sh

И создайте следующий скрипт в /usr/local/sbin/update-time.sh(не забудьте сделать его исполняемым chmod):

#!/bin/bash
# This script checks if the ntp process is running, stops it, updates the system time, starts it again

ps cax | grep -c ntpd > /dev/null
onoff=$?
if [ "$onoff" -gt 0 ]; then
    echo "stopping ntpd..."
    service ntp stop
    echo "ntpd stopped"
else
    echo "ntpd not running, ready to update the date"
fi


isinstalled=$(dpkg-query -l | grep -c ntpdate)
if [ "$isinstalled" -gt 0 ]; then
    ntpdate -t 3 -s ntp4.stratum2.ru
    echo "date and time update executed"
else
    echo "ntpdate package not installed, can't update using ntp"
fi

echo "restarting ntpd..."
service ntp start 
echo "ntpd running"
echo "printing current date and time:"
date

exit

1

Алгоритмы ntpd отбрасывают смещения выборки, превышающие 128 мс, если только интервал, в течение которого [абсолютное значение] смещения выборки не меньше 128 мс, не превышает 900 с. Первый сэмпл после этого, независимо от смещения, переводит часы на указанное время. На практике это снижает частоту ложных срабатываний, когда часы ошибочно переключаются, до невероятно низкого уровня.

Обычно ntpd завершается, если смещение превышает допустимый предел, который по умолчанию составляет 1000 с. Это можно отключить с помощью опции -g:

-g Обычно ntpd завершается, если смещение превышает допустимый предел, который по умолчанию составляет 1000 с. Если предел работоспособности установлен равным нулю, проверка работоспособности не выполняется и любое смещение является приемлемым. Эта опция переопределяет ограничение и позволяет установить время на любое значение без ограничений; однако это может произойти только один раз. После этого ntpd выйдет, если предел будет превышен. Эта опция может использоваться с опцией -q.

оба из http://doc.ntp.org/4.1.0/ntpd.htm

Джонатан Натале


1

Если вы можете позволить себе ждать сколько угодно времени, прежде чем ваша система синхронизируется, вы можете использовать ntp-waitкоманду:

ntp-wait || exit -1 
# i believe this would exit the script if it fails, but not sure of ntp-wait return codes, learn this first.

echo Time is synced, go ahead with backup
tar
rsync etc.

1

Если вы используете systemd, вы можете использовать эту команду:

sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service

И тогда время обновляется в течение 10-15 секунд.
Проверено на Ubuntu Mate 16.04


0

ntpdи ntpdateзапускается по умолчанию с использованием ограниченного порта (UDP 123). Если вы находитесь за брандмауэром, ntpdникогда не будет работать, но ntpdateможет работать с -uопцией. Например: ntpdate -u 0.ubuntu.pool.ntp.org или ntpdate -u time.nist.govоба должны работать нормально.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.