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

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

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

sudo ntpdate -s time.nist.gov

Однако после запуска до обновления времени все равно остается несколько минут, в течение которых я не могу эффективно работать с [ 113] и 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 и оставить только [ 118] в rc.local
  4. Удалите sudo из вышеприведенной команды в rc.local

Используя вышеизложенное, машина все еще запускается в 1970 году. Однако при этом после входа в систему из командной строки (через ssh) часы обновляются, как только я вызываю ntpdate.

Последнее, что я сделал, это удалил это из rc.local и поместил вызов ntpdate в моем файле .bashrc. Это обновляет часы, как и ожидалось, и я получаю истинное текущее время, когда доступна командная строка.

Однако , это означает, что если машина включена, и ни один пользователь не вошел в систему, то время никогда не будет получать обновления. Конечно, я могу переустановить службу ntp, чтобы хотя бы часы обновлялись в течение нескольких минут после запуска, но затем мы возвращаемся к квадрату 1.

Итак, есть ли причина, по которой размещение команды ntpdate в rc.local не выполняет требуемой задачи, тогда как выполнение в .bashrc работает нормально?

380
задан 27 February 2015 в 04:00

18 ответов

Вероятно, служба 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 )&
0
ответ дан 27 February 2015 в 04:00

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

0
ответ дан 27 February 2015 в 04:00

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

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

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

0
ответ дан 27 February 2015 в 04:00

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

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

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

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

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

0
ответ дан 27 February 2015 в 04:00

Обратите внимание, что некоторые современные системы на основе 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.

0
ответ дан 27 February 2015 в 04:00

Ну,

Я использую малину (debian wheezy) на своем малиновом пи, который не имеет 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
0
ответ дан 27 February 2015 в 04:00

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

$ tlsdate -V -n -H encrypted.google.com
0
ответ дан 27 February 2015 в 04:00

Если вы можете позволить себе ждать сколько угодно времени, прежде чем ваша система синхронизируется, вы можете использовать команду 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.
0
ответ дан 27 February 2015 в 04:00

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

0
ответ дан 27 February 2015 в 04:00

Правильный способ сделать это в системе Debian / Mint / Ubuntu (или другой производной от Debian) состоит в том, чтобы иметь строку

NTPD_OPTS="-g"

в файле

/etc/default/ntp

This гарантирует, что когда 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.

0
ответ дан 27 February 2015 в 04:00
rdate -s tick.greyware.com

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

0
ответ дан 27 February 2015 в 04:00

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

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

0
ответ дан 27 February 2015 в 04:00

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

0
ответ дан 27 February 2015 в 04:00

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

sudo sntp -s 24.56.178.140

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

0
ответ дан 27 February 2015 в 04:00

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

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

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

0
ответ дан 27 February 2015 в 04:00

Используйте timedatectl (systemd сервисная единица) для установки времени. ntp удерживается от использования.

sudo systemctl restart systemd-timesyncd.service

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

Ссылка

Ubuntu
0
ответ дан 27 February 2015 в 04:00

Помимо рекомендации остановить локальный сервер времени (ntpd или timesyncd), затем ntpdate -bs server или ntpd -gq , и после этого снова запустите сервер времени, чтобы синхронизировать время, как многие предлагали (эти шаги могут быть в сценарии задания @reboot cron; подробности см. в man 5 crontab), может быть необходимо настроить часовой пояс для команд времени, чтобы сообщить желаемое время/дату.

Для Ubuntu и подобных систем используйте: dpkg-reconfigure tzdata и выберите правильную локаль. Он сохраняет свое значение между перезапусками.

0
ответ дан 8 April 2020 в 04:54

Посмотрите на это (без апта, без сервиса):

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

Приветствую Прашанта, который решил эту проблему

5
ответ дан 6 May 2020 в 08:22

Другие вопросы по тегам:

Похожие вопросы: