Як змусити оновити годинник за допомогою 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послугу, щоб принаймні годинник оновлювався протягом декількох хвилин після запуску, але тоді ми знову на площі 1.

Отже, чи є причина, чому розміщення 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 мс може зайняти години для синхронізації за допомогою типового механізму 'убив'
Matt S.

Немає необхідності використовувати sudoу /etc/rc.locale файли .. вони вже запускаються як root.
Soren A

Відповіді:


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
Я насправді не знаю. :-) У мене були проблеми, коли я намагався запустити servicerc.local та cron, але мені вдалося виправити це, використовуючи /etc/init.d/xxx. Насправді я думаю, що вам не потрібно давати повний шлях до цього ntpdate, я люблю використовувати цілі шляхи в сценаріях, щоб бути впевненим, що потрібний файл знайдеться.
Ерік Карвальо

2
Гаразд, це, мабуть, була проблема. Зараз годинник оновлюється, як тільки встановиться мережеве з'єднання. Дякую.
ysap

3
Я дізнався, що us.pool.ntp.orgце більш чуйний.
ysap

7
За допомогою цього -uпункту вам не потрібно зупиняти послугу ntp:sudo ntpdate -u time.nist.gov
Едвард Андерсон

486

Замість ntpdate (який є застарілим ), використовуйте

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

-gqКаже НВТ демона , щоб виправити час , незалежно від зсуву ( g) і виходу відразу ( q) після установки часу.


3
Дякую. Все ще відображається 1970 рік після цієї команди (w / sudo). Читаючи сторінку ntpd, я не впевнений, наскільки це змушує оновлення?
ysap

12
Параметр "-q" повідомляє демону NTP запускатися, встановлює час і негайно виходить. Опція "-g" дозволяє виправити різницю в часі, що перевищує 1000 с. На більш тривалий термін слід просто налаштувати демон NTP, щоб він працював завжди.
tgharold

35
Ця відповідь має звернутися до вершини, оскільки вона правильна: ntpdate застаріло, а встановлення - погана ідея, оскільки воно суперечить ntp. Якщо годинник не працює, вам потрібно зробити цей крок вручну, оскільки в іншому випадку ntp не змінить ваш годинник і не скаже вам, чому.
Ліам

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

5
FYI, на моїй системі (CentOS 6.6), мені потрібно змінити два примірника sudo service ntp...до sudo service ntpd....
rinogo

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 install sntp / yum install sntp (так, це працює на CentOS, RedHat, також fedore)
ndemou

40

Як зазначають інші, найкращим рішенням є доручення ntpd ігнорувати порог паніки, який за замовчуванням становить 1000 секунд. Можна налаштувати порог паніки одним із двох способів:

  • відредагуйте /etc/default/ntpта переконайтесь, що параметр -g присутній.
  • відредагуйте /etc/ntp.conf і поставте tinker panic 0вгорі

Поки це по суті те, що рекомендували інші, однак є ще один крок, на який я думаю, ви повинні зробити. Встановіть програму підроблених годинників:

# 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.

Якщо встановлено підроблений годинник, ваша машина не почне думати, що це знову 1970 рік. Коли ваша машина завантажиться, вона встановить свій годинник на позначення підроблених часових позначок, написаних під час останньої перезавантаження / відключення. Це означає, що ви можете мати дещо правильний годинник, якщо виникають проблеми з мережею під час завантаження.


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

@Sahuagin Я не знаю, що тобі сказати, окрім у тебе нестандартного пакету ntp. / І т.д. / по замовчуванням / НТП є частиною пакета з Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist і -g був варіант тих пір , як я пам'ятаю.
dfc

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

13

ntpdate - це програма, відмінна від чистого дамеона. 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 до питання.
ysap

3
Так, ntpdate припиняється. Краще використовувати "ntpd -q" (обидва варіанти вимагають попереднього припинення ntpd).
tgharold

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 вечора.
chovy

У мене також вже був саме такий рядок /etc/default/ntp, але час синхронізувався.
Dawid Ferenczy Rogožan

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 (монетний двір 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
Вам потрібно спочатку зупинити службу ntp, перш ніж ви зможете запуститиntpdate -b <ipaddress>
Вім Деблауве

2

Ну,

Я запускаю raspbian (debian wheezy) на своєму малиновому пі, у якого немає годинника. Мені було зручно написати невеликий сценарій та запустити його після того, як мій інтерфейс буде запущений, так що я впевнений, що з моменту, коли мережа стане доступною, годинник оновлюється.

Спочатку перевірте, чи є у вас 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

Якщо у вас система, ви можете використовувати цю команду:

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.