Jak wymusić aktualizację zegara za pomocą NTTP?

377

Używam Ubuntu na systemie osadzonym opartym na ARM, który nie ma RTC zasilanego bateryjnie. Czas budzenia upłynął gdzieś w 1970 roku. Dlatego używam usługi NTP, aby zaktualizować czas do bieżącej godziny.

Dodałem następujący wiersz do /etc/rc.localpliku:

sudo ntpdate -s time.nist.gov

Jednak po uruchomieniu nadal zajmuje to kilka minut, zanim czas zostanie zaktualizowany, w którym okresie nie mogę efektywnie pracować z tari make.

Jak mogę wymusić aktualizację zegara w danym momencie?


AKTUALIZACJA 1: Poniższe (dzięki Ericowi i Stephanowi) działa dobrze z linii poleceń, ale nie aktualizuje zegara po włożeniu /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

Co ja robię źle?


AKTUALIZACJA 2: Próbowałem postępować zgodnie z kilkoma sugestiami, które pojawiły się w odpowiedzi na pierwszą aktualizację, ale wydaje się, że nic tak naprawdę nie wykonuje zadania zgodnie z wymaganiami. Oto, co próbowałem:

  1. Zamień serwer na us.pool.ntp.org
  2. Użyj wyraźnych ścieżek do programów
  3. Usuń ntpusługę całkowicie i pozostaw tylko sudo ntpdate ...wrc.local
  4. Usuń sudopowyższe polecenie wrc.local

Korzystając z powyższego, maszyna nadal uruchamia się w 1970 roku. Jednak po zrobieniu tego z wiersza poleceń po zalogowaniu (via ssh) zegar jest aktualizowany, gdy tylko się wywołam ntpdate.

Ostatnią rzeczą, którą zrobiłem, było usunięcie tego rc.locali połączenie z ntpdatemoim .bashrcplikiem. To aktualizuje zegar zgodnie z oczekiwaniami i otrzymuję prawdziwy bieżący czas, gdy wiersz polecenia jest dostępny.

Oznacza to jednak , że jeśli urządzenie jest włączone i żaden użytkownik nie jest zalogowany, czas nigdy nie otrzyma aktualizacji. Mogę oczywiście ponownie zainstalować ntpusługę, aby przynajmniej zegar był aktualizowany w ciągu kilku minut od uruchomienia, ale potem wracamy do kwadratu 1.

Czy istnieje więc powód, dla którego umieszczenie ntpdatepolecenia rc.localnie wykonuje wymaganego zadania, a robi to .bashrcdobrze?

tak
źródło
2
z [tutaj] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615
4
zauważ flagę „-b” przy ntpdate. Ze strony podręcznika użytkownika ntpdate: „Wymuś czas, który ma być zwiększany za pomocą wywołania systemowego settimeofday (), zamiast wymieszania (domyślnie) za pomocą wywołania systemowego adjtime (). Z tej opcji należy korzystać, gdy jest wywoływany z pliku startowego w czasie uruchamiania”. Wiele z poniższych odpowiedzi tego nie zawiera, a to może stanowić część problemu z działaniem. Weź pod uwagę, że flaga „-B”, o której wspomina, że ​​przesunięcia powyżej 128 ms mogą wymagać synchronizacji godzin przy użyciu domyślnego mechanizmu „przewijania”
Matt S.
Nie ma potrzeby korzystania sudoz plików /etc/rc.locale. Są one już uruchomione jako root.
Soren,
timedatectl, ale askubuntu.com/questions/832646/…
nobar

Odpowiedzi:

325

Prawdopodobnie ntpusługa jest uruchomiona, dlatego ntpdatenie można otworzyć gniazda (port 123 UDP) i połączyć się z serwerem NTTP.

Spróbuj z wiersza poleceń:

sudo service ntp stop
sudo ntpdate -s time.nist.gov
sudo service ntp start

Jeśli chcesz to /etc/rc.localwykorzystać, wykonaj następujące czynności:

( /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 )&
Eric Carvalho
źródło
Dzięki. Czy możesz wyjaśnić, dlaczego potrzebujesz wyraźnych ścieżek?
ysap
1
Naprawdę nie wiem. :-) Miałem kiedyś problem z uruchomieniem servicez rc.local i cron, ale udało mi się to naprawić za pomocą /etc/init.d/xxx. Właściwie uważam, że nie musisz podawać pełnej ścieżki ntpdate, lubię używać pełnych ścieżek w skryptach, aby mieć pewność, że odpowiedni plik zostanie znaleziony.
Eric Carvalho
2
OK, najwyraźniej to był problem. Teraz zegar jest aktualizowany natychmiast po ustanowieniu połączenia sieciowego. Dzięki.
ysap
3
Dowiedziałem się, że us.pool.ntp.orgjest bardziej responsywny.
ysap
7
Dzięki tej -uopcji nie musisz zatrzymywać usługi NTTP:sudo ntpdate -u time.nist.gov
Edward Anderson
486

Zamiast ntpdate (który jest przestarzały ) użyj

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

-gqOpowiada demona ntp skorygować czas niezależnie od offsetu ( gnatychmiast) i wyjścia ( q) po ustawieniu czasu.

Martin Schröder
źródło
3
Dzięki. Nadal pokazuje 1970 po tej komendzie (w / sudo). Czytając stronę ntpdpodręcznika, nie jestem pewien, jak wymusza to aktualizację?
ysap
12
Opcja „-q” informuje demona NTP o uruchomieniu, ustawieniu godziny i natychmiastowym wyjściu. Opcja „-g” pozwala skorygować różnice czasowe większe niż 1000 sekund. W dłuższej perspektywie należy po prostu skonfigurować demona NTP, aby zawsze działał.
tgharold
35
Ta odpowiedź powinna znaleźć się na górze, ponieważ jest poprawna: ntpdate jest przestarzała, a jej instalacja jest złym pomysłem, ponieważ powoduje konflikt z ntp. Jeśli zegar jest daleko, musisz wykonać ten ręczny krok, ponieważ w przeciwnym razie ntp nie zmieni twojego zegara i nie powie ci dlaczego.
Liam
31
Dla mnie sudo ntpd -gqnie wychodzi! Mam 14.10 i muszę CTRL + C, aby kontynuować ... lub jak długo to potrwa?
Yanick Rochon
5
Do twojej wiadomości, w moim systemie (CentOS 6.6), musiałem zmienić dwa wystąpienia sudo service ntp...na sudo service ntpd....
rinogo
63

Użyj sntp, aby natychmiast ustawić czas. Na przykład:

sudo sntp -s 24.56.178.140

Liczby po -s mogą być dowolnym serwerem czasu ntp, tym jest NIST w Ft. Collins, Kolorado.

Gość
źródło
1
To się udało! +1
CappY
7
Działa to, gdy „sudo ntpd -gq” nie działa.
Matt White,
Nie wiem, ile razy szukałem tej odpowiedzi. Działa za każdym razem.
Chaos
1
nie możesz znaleźć pakietu sntp?
świątynia
1
apt-get install sntp / yum install sntp (tak, działa na CentOS, RedHat, fedore też)
ndemou
40

Jak zauważyli inni, najlepszym rozwiązaniem jest poinstruowanie ntpd, aby zignorował próg paniki, który domyślnie wynosi 1000 sekund. Możesz skonfigurować próg paniki na jeden z dwóch sposobów:

  • edytuj /etc/default/ntpi upewnij się, że jest dostępna opcja -g.
  • edytuj /etc/ntp.conf i umieść tinker panic 0na górze

Jak dotąd jest to zasadniczo to, co zalecili inni, jednak myślę, że powinieneś zrobić jeszcze jeden krok. Zainstaluj program fałszywy 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.

Po zainstalowaniu fałszywego hwclocka twoja maszyna nie uruchomi się, myśląc, że to od 1970 roku. Kiedy twoja maszyna się uruchomi, ustawi swój zegar na znacznik czasu napisany przez fałszywy hwclock podczas ostatniego restartu / zamknięcia. Oznacza to, że możesz mieć nieco poprawny zegar na wypadek problemów z siecią podczas uruchamiania.

dfc
źródło
1
-gwydawało się, że nic dla mnie nie robi (w wierszu poleceń nie mam /etc/default/ntp), ale dodaje tinker panic 0do ntp.confpracy
Dave Cousineau
@ Sahuagin Nie wiem, co ci powiedzieć, poza tym, że masz niestandardowy pakiet ntp. / etc / default / ntp jest częścią pakietu Ubuntu: packages.ubuntu.com/xenial/amd64/ntp/filelist, a opcja -g była dostępna tak długo, jak pamiętam.
dfc,
przepraszam, chyba nie jestem na Ubuntu i powinienem pomyśleć jeszcze trochę przed komentowaniem. tinker panic 0Zdaje się, że na pewno działało.
Dave Cousineau,
13

ntpdate to program inny niż net dameon. Prawdopodobnie podczas uruchamiania NTPDate występuje błąd podczas uruchamiania, ponieważ ntpd działa na tym gnieździe.

Z linii poleceń uruchom

# sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start

Możesz także odinstalować ntpd wszystkie razem (apt-get remove ntp) i dodać skrypt cron, aby używać ntpdate co godzinę.

AKTUALIZACJA

Usługa ntp prawdopodobnie nie będzie miała dla ciebie znaczącej wartości w tym systemie, więc usuń ją najpierw.

# sudo apt-get remove ntp

Teraz dodaj polecenie:

ntpdate -sb time.nist.gov

do /etc/rclocal

Restart. W tym momencie powinno być dobrze.

Stephan
źródło
odpowiedź zaktualizowana.
Stephan
1
Czy ntpdate nie jest wycofywane czy coś takiego? Ponadto, jeśli dobrze to zrozumiem, usługa działa i utrzymuje synchronizację lokalnego zegara z zegarem serwera - więc dryf jest ograniczony. Jeśli usuniesz ntp i uruchomisz ntpdate raz, czy nie wpłynie to na dryfowanie zegara, gdy urządzenie jest włączone przez dłuższy czas?
ysap
Stephan, zobacz aktualizację nr 2 do pytania.
ysap
3
Tak, ntpdate jest wycofywane. Preferowane jest użycie „ntpd -q” (oba warianty wymagają, aby najpierw zatrzymać ntpd).
tgharold
11

Użyj timedatectl(systemowa jednostka serwisowa), aby ustawić czas. ntpjest przestarzałe.

sudo systemctl restart systemd-timesyncd.service

Możesz sprawdzić czas aktualizacji za pomocą dzienników journalctl -xe | tail

Odniesienie

xiaoyifang
źródło
To działało na Ubuntu 19.04. Dzięki!
krubo
10
rdate -s tick.greyware.com

jeśli wszystko, co chcesz zrobić, to ustawić zegar raz, to proste

batflapy
źródło
Dzięki. Obecnie nie mam systemu, aby sprawdzić to polecenie, ale jeśli śledzisz dyskusję w pytaniu i przyjętej odpowiedzi, zobaczysz, że problem był w rzeczywistości niedostępnością sieci w momencie uruchomienia polecenia aktualizacji zegara.
ysap
To naprawiło problem synchronizacji czasu na moim Raspberry Pi. Dziękuję Ci.
Oliver Spryn
7

Prawidłowym sposobem na to w systemie Debian / Mint / Ubuntu (lub innej pochodnej Debiana) jest posiadanie linii

NTPD_OPTS="-g"

w pliku

/etc/default/ntp

Zapewnia to, że gdy ntpd jest uruchamiany ze skryptu /etc/init.d/ntp, działa z opcją „-g”, mianowicie

 start-stop-daemon --start --quiet --oknodo --pidfile /var/run/ntpd.pid --startas /usr/sbin/ntpd -- -p /var/run/ntpd.pid -g -u 124:128

aby umożliwić ntpd skorygowanie czasu systemowego, gdy jest więcej niż 1000 s poza, np. gdy czas systemowy to 1 stycznia 1970 r. przy uruchomieniu, ponieważ nie ma sprzętowego RTC.

JG Miller
źródło
Mam to już, ale nadal jest napisane o 3 nad ranem w Nowym Jorku, kiedy powinno być 23:00.
chovy,
Też miałem już dokładnie tę linię /etc/default/ntp, ale czas nie był zsynchronizowany.
Dawid Ferenczy Rogožan
5

tlsdateustawia zegar lokalny, bezpiecznie łącząc się z TLS ze zdalnymi serwerami i wydobywając zdalny czas z bezpiecznego uzgadniania. W przeciwieństwie ntpdate, tlsdateużywa TCP, na przykład podłączenie do zdalnego HTTPS lub TLS włączona obsługa i zapewnia pewną ochronę przed wrogami, które próbują karmić Cię złośliwego informacje o czasie.

$ tlsdate -V -n -H encrypted.google.com
Kokizzu
źródło
5

Zauważ, że niektóre obecne systemy oparte na Ubuntu nie używają teraz domyślnie usługi NTP. Na moim komputerze z systemem Linux Mint 19 (Ubuntu 18.04) czas mija systemd-timesyncd.

Aby uzyskać aktualny czas po utracie synchronizacji, po prostu biegnę

sudo systemctl restart systemd-timesyncd

Od 15.04 Ubuntu domyślnie używa systemd. Dlatego krytyczne systemy, takie jak czas, są zarządzane przez systemd. Aby znaleźć usługę, z której korzysta Twój system, uruchom coś podobnego

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

Dla TechJS w dniu 16.04 usługa była ntp. Dla mnie na Ubuntu 18.04 (Mint 19) usługa jest systemd-timesyncd. Co ciekawe, zalogowałem się do serwera 16.04, który mam i również z niego korzysta systemd-timesyncd.

Aaron Chamberlain
źródło
Dzięki. Minęło sporo czasu od opublikowania pytania i nie mam systemu dostępnego do testowania, ale czy możesz wyjaśnić, w jaki sposób Twoja odpowiedź różni się od @TechJS, zwłaszcza zaproponowane przez ciebie polecenie jest nieco inne.
ysap
Ha dzięki. Była to odpowiedź dla ciebie, ale także dla każdego, kto w przyszłości znajdzie się tutaj bez bardziej aktualnych informacji (jak ja). Zaktualizowałem swoją odpowiedź, aby dokładniej określić sposób jej uzyskania.
Aaron Chamberlain
4

Spróbuj użyć -bopcji, aby zwiększyć czas.

Cry Havok
źródło
2
Podczas próby z linii poleceń, mam następującą odpowiedź: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Myślę jednak, że próbowałem tego wcześniej, rc.localale to nie pomogło.
ysap
3
Najpierw musisz zatrzymać usługę ntpdate -b <ipaddress>
NTTP,
2

Dobrze,

Używam raspbian (debian wheezy) na moim malinowym pi, który nie ma hwclocka. Przydało mi się napisanie małego skryptu i uruchomienie go po uruchomieniu interfejsu internetowego, aby mieć pewność, że w momencie, gdy sieć stanie się dostępna, zegar zostanie zaktualizowany.

Najpierw sprawdź, czy masz ntpdatepakiet, uruchamiając

sudo apt-get update
sudo apt-get install ntpdate

Musisz dodać do swojego /etc/network/interfaces(na pewno eth0tutaj to tylko przykład):

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

I utwórz następujący skrypt w /usr/local/sbin/update-time.sh(nie zapomnij, aby był wykonywalny 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
art.shutter
źródło
1

Algorytmy ntpd odrzucają przesunięcia próbek przekraczające 128 ms, chyba że przedział, w którym żadna [wartość bezwzględna] przesunięcia próbki nie jest mniejsza niż 128 ms, przekracza 900 sekund. Pierwsza próbka po tym, bez względu na przesunięcie, przesuwa zegar do wskazanego czasu. W praktyce zmniejsza to częstość fałszywych alarmów, gdy zegar jest błędnie zwiększany do znikomej częstotliwości.

Zwykle ntpd kończy działanie, jeśli przesunięcie przekracza limit poczytalności, który domyślnie wynosi 1000 s. Można to wyłączyć za pomocą opcji -g:

-g Zwykle ntpd kończy działanie, jeśli przesunięcie przekracza limit poczytalności, który domyślnie wynosi 1000 s. Jeśli limit poczytalności jest ustawiony na zero, nie jest przeprowadzane sprawdzanie poczytalności i dopuszczalne jest jakiekolwiek przesunięcie. Ta opcja zastępuje limit i pozwala ustawić czas na dowolną wartość bez ograniczeń; może się to jednak zdarzyć tylko raz. Następnie ntpd zakończy działanie, jeśli limit zostanie przekroczony. Tej opcji można używać z opcją -q.

oba z http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale

Jonathzen
źródło
1

Jeśli możesz sobie pozwolić na czas oczekiwania na synchronizację systemu, możesz użyć ntp-waitpolecenia:

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.
Anonimowy
źródło
1

Jeśli korzystasz z systemu, możesz użyć tego polecenia:

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

A potem czas jest aktualizowany w ciągu blisko 10-15 sekund.
Testowane na Ubuntu Mate 16.04

AmirHossein
źródło
0

ntpdi ntpdateuruchamiany domyślnie przy użyciu ograniczonego portu (UDP 123). Jeśli jesteś za zaporą ogniową, ntpdnigdy nie będzie działać, ale ntpdatemoże działać z tą -uopcją. Na przykład: ntpdate -u 0.ubuntu.pool.ntp.org lub ntpdate -u time.nist.govoba powinny działać dobrze.

GN DeSouza
źródło