Как заставить обновление часов с помощью 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 ; 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
- Используйте явные пути к программам
- Удалить
ntp
обслуживание в целом и оставить толькоsudo ntpdate ...
вrc.local
- Удалить
sudo
из приведенной выше команды вrc.local
Используя вышеизложенное, машина все еще запускается в 1970 году. Однако при выполнении этого из командной строки после входа в систему (через ssh
), часы обновляются, как только я призываю ntpdate
,
Последнее, что я сделал, это удалил это из rc.local
и позвоните ntpdate
в моем .bashrc
файл. Это обновляет часы, как и ожидалось, и я получаю истинное текущее время, как только доступна командная строка.
Однако это означает, что если машина включена, и ни один пользователь не вошел в систему, то время никогда не будет обновляться. Я могу, конечно, переустановить ntp
сервис, так что, по крайней мере, часы обновляются в течение нескольких минут после запуска, но затем мы возвращаемся в квадрат 1.
Итак, есть ли причина, почему ntpdate
командовать в rc.local
не выполняет требуемую задачу, делая это в .bashrc
работает отлично?
16 ответов
Вероятно, 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 (который устарел) используйте
sudo service ntp stop
sudo ntpd -gq
sudo service ntp start
-gq
говорит демону ntp исправлять время независимо от смещения (g
) и немедленно выйти (q
) после установки времени.
Использование timedatectl
(системный сервисный блок), чтобы установить время. ntp
устарела.
sudo systemctl restart systemd-timesyncd.service
Вы можете проверить время было обновлено, читая журналы с journalctl -xe | tail
Ссылка
- Документация по Ubuntu Server
- Freedesktop
man timesyncd.conf
Используйте sntp, чтобы установить время немедленно. Например:
sudo sntp -s 24.56.178.140
Числа после -s могут быть любым сервером времени ntp, то есть NIST в Ft. Коллинз, Колорадо.
Как уже отмечали другие, лучшим решением является указание 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 каждый час или около того.
ОБНОВИТЬ
Сервис 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. Поэтому критические системы, такие как время, управляются через systemd. Чтобы узнать, какой сервис использует ваша система, запустите что-то вроде
systemctl list-unit-files | grep -E 'ntp|timesyncd'
Для TechJS 16.04 сервис был ntp
, Для меня на Ubuntu 18.04 (Mint 19) сервис systemd-timesyncd
, Интересно, я вошел на сервер 16.04 у меня есть, и он использует systemd-timesyncd
также.
Обратите внимание на это (нет подходящего, нет обслуживания):
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
Приветствую Прашанта, который решил эту проблему
Правильный способ сделать это в системе 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.
tlsdate
устанавливает локальные часы путем безопасного соединения с TLS с удаленными серверами и извлечения удаленного времени из безопасного рукопожатия. В отличие от ntpdate
, tlsdate
использует TCP, например, для подключения к удаленной службе HTTPS или TLS, и обеспечивает некоторую защиту от злоумышленников, которые пытаются передать вам вредоносную информацию о времени.
$ tlsdate -V -n -H encrypted.google.com
Что ж,
Я использую 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
Если вы можете позволить себе ждать сколько угодно времени, прежде чем ваша система синхронизируется, вы можете использовать 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.
Алгоритмы ntpd отбрасывают смещения выборки, превышающие 128 мс, если только интервал, в течение которого [абсолютное значение] смещения выборки не меньше 128 мс, не превышает 900 с. Первый сэмпл после этого, независимо от смещения, переводит часы на указанное время. На практике это снижает частоту ложных срабатываний, когда часы ошибочно переключаются, до невероятно низкого уровня.
Обычно ntpd завершается, если смещение превышает допустимый предел, который по умолчанию составляет 1000 с. Это можно отключить с помощью опции -g:
-g Обычно ntpd завершается, если смещение превышает допустимый предел, который по умолчанию составляет 1000 с. Если предел работоспособности установлен равным нулю, проверка работоспособности не выполняется и любое смещение является приемлемым. Эта опция переопределяет ограничение и позволяет установить время на любое значение без ограничений; однако это может произойти только один раз. После этого ntpd выйдет, если предел будет превышен. Эта опция может использоваться с опцией -q.
оба из http://doc.ntp.org/4.1.0/ntpd.htm
Джонатан Натале
Если вы используете systemd, вы можете использовать эту команду:
sudo systemctl restart ntp
# or
sudo systemctl restart ntp.service
И тогда время обновляется в течение 10-15 секунд.
Проверено на Ubuntu Mate 16.04
ntpd
а также ntpdate
запускается по умолчанию с использованием ограниченного порта (UDP 123). Если вы находитесь за брандмауэром, ntpd
никогда не сработает, но ntpdate
может работать с -u
вариант. Например: ntpdate -u 0.ubuntu.pool.ntp.org
или же ntpdate -u time.nist.gov
оба должны работать нормально.
Помимо рекомендации остановить локальный сервер времени (ntpd или timesyncd), затемntpdate -bs server
или же ntpd -gq
, и после этого снова запустив сервер времени, чтобы синхронизировать время, как многие предлагали (эти шаги могут быть в сценарии задания @reboot cron; см.man 5 crontab
для получения подробной информации), может потребоваться настроить часовой пояс, чтобы команды времени отображали желаемое время / дату.
Для Ubuntu и т.п. используйте: dpkg-reconfigure tzdata
и выберите правильный язык. Он сохраняет свое значение между перезапусками.