Come forzare un aggiornamento dell'orologio usando ntp?


377

Sto eseguendo Ubuntu su un sistema embedded basato su ARM privo di RTC con batteria. L'ora di sveglia è da qualche parte nel 1970. Pertanto, utilizzo il servizio NTP per aggiornare l'ora all'ora corrente.

Ho aggiunto la seguente riga al /etc/rc.localfile:

sudo ntpdate -s time.nist.gov

Tuttavia, dopo l'avvio, ci vogliono ancora un paio di minuti prima che il tempo venga aggiornato, durante il quale non riesco a lavorare in modo efficace con tare make.

Come posso forzare un aggiornamento dell'orologio in qualsiasi momento?


AGGIORNAMENTO 1: Il seguente (grazie a Eric e Stephan) funziona bene dalla riga di comando, ma non aggiorna l'orologio quando viene inserito /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

Che cosa sto facendo di sbagliato?


AGGIORNAMENTO 2: Ho provato a seguire i pochi suggerimenti forniti in risposta al primo aggiornamento, ma nulla sembra effettivamente fare il lavoro come richiesto. Ecco cosa ho provato:

  1. Sostituisci il server con us.pool.ntp.org
  2. Usa percorsi espliciti per i programmi
  3. Rimuovi del ntptutto il servizio e lascialo appena sudo ntpdate ...dentrorc.local
  4. Rimuovere il sudocomando sopra riportato inrc.local

Usando quanto sopra, la macchina inizia ancora al 1970. Tuttavia, quando lo si fa dalla riga di comando una volta effettuato l'accesso (tramite ssh), l'orologio viene aggiornato non appena invoco ntpdate.

L'ultima cosa che ho fatto è stata rimuoverlo da rc.locale fare una chiamata ntpdatenel mio .bashrcfile. Questo aggiorna l'orologio come previsto e ottengo l'ora corrente reale una volta che il prompt dei comandi è disponibile.

Tuttavia , ciò significa che se la macchina è accesa e nessun utente ha effettuato l'accesso, l'ora non riceve mai aggiornamenti. Posso, ovviamente, reinstallare il ntpservizio in modo che almeno l'orologio venga aggiornato entro pochi minuti dall'avvio, ma poi torniamo al punto 1.

Quindi, c'è un motivo per cui inserendo il ntpdatecomando rc.localnon si esegue l'attività richiesta, mentre lo fa .bashrcbene funziona?


2
da [qui] [1]: ntpdate -s ntp.ubuntu.com [1]: askubuntu.com/a/81301/130162
18446744073709551615

4
nota il flag '-b' su ntpdate. Dalla pagina man di ntpdate: "Forzare il tempo da compiere usando la chiamata di sistema settimeofday (), anziché spostato (impostazione predefinita) usando la chiamata di sistema adjtime (). Questa opzione dovrebbe essere usata quando chiamata da un file di avvio all'avvio." Molte delle risposte sottostanti non lo includono, e questo forse fa parte del problema nel far funzionare le cose. Considera che il flag '-B' menziona che gli offset oltre 128 ms possono richiedere ore per la sincronizzazione usando il meccanismo 'slew' predefinito
Matt S.

Non è necessario utilizzare sudonei file /etc/rc.locale .. sono già eseguiti come root.
Soren,

Risposte:


325

Probabilmente il ntpservizio è in esecuzione, ecco perché ntpdatenon è possibile aprire il socket (porta 123 UDP) e connettersi al server NTTP.

Prova dalla riga di comando:

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

Se vuoi metterlo in /etc/rc.localuso quanto segue:

( /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 )&

Grazie. Puoi spiegare perché hai bisogno di percorsi espliciti?

1
Non lo so davvero. :-) Ho avuto problemi una volta provando a correre serviceda rc.local e cron ma sono riuscito a risolverlo usando invece /etc/init.d/xxx. In realtà penso che non devi dare il percorso completo ntpdate, mi piace usare percorsi completi negli script solo per essere sicuro che il file giusto verrà trovato.
Eric Carvalho,

2
OK, apparentemente questo era il problema. Ora l'orologio viene aggiornato non appena viene stabilita la connessione di rete. Grazie.

3
Ho scoperto che us.pool.ntp.orgè più reattivo.

7
Con l' -uopzione, non è necessario interrompere il servizio NTTP:sudo ntpdate -u time.nist.gov
Edward Anderson

486

Invece di ntpdate (che è deprecato ), utilizzare

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

Il -gqdice al demone ntp di correggere l'ora indipendentemente dall'offset ( g) e di uscire immediatamente ( q) dopo aver impostato l'ora.


3
Grazie. Mostra ancora 1970 dopo questo comando (w / sudo). Leggendo la ntpdmanpage, non sono sicuro di come questo imponga un aggiornamento?

12
L'opzione "-q" indica al demone NTP di avviarsi, impostare l'ora e uscire immediatamente. L'opzione "-g" consente di correggere differenze di tempo superiori a 1000 sec. Per un periodo più lungo, dovresti semplicemente configurare il demone NTP per essere sempre in esecuzione.
tgharold,

35
Questa risposta dovrebbe andare in alto, perché è corretta: ntpdate è deprecato e l'installazione è una cattiva idea, perché è in conflitto con ntp. Se l'orologio è lontano, è necessario eseguire questo passaggio manuale, altrimenti ntp non cambierà l'orologio e non ti dirà perché.
Liam,

31
Per me, sudo ntpd -gqnon esce! Sono il 14.10 e devo CTRL + C per continuare ... o quanto tempo dovrebbe durare?
Yanick Rochon,

5
Cordiali saluti, sul mio sistema (CentOS 6.6), avevo bisogno di cambiare le due istanze di sudo service ntp...a sudo service ntpd....
Rinogo,

63

Utilizzare sntp per impostare l'ora immediatamente. Per esempio:

sudo sntp -s 24.56.178.140

I numeri after -s possono essere qualsiasi time server ntp, quello è NIST in Ft. Collins, Colorado.


1
Ha funzionato! +1
CappY

7
Funzionava quando "sudo ntpd -gq" no.
Matt White,

Non so quante volte sono venuto a cercare questa risposta. Funziona ogni volta.
Caos,

1
impossibile individuare il pacchetto sntp?
tempio

1
apt-get install sntp / yum install sntp (sì, funziona anche su CentOS, RedHat, fedore)
ndemou

40

Come altri hanno sottolineato, la soluzione migliore è di istruire ntpd a ignorare la soglia di panico, che per impostazione predefinita è 1000 secondi. È possibile configurare la soglia di panico in due modi:

  • modifica /etc/default/ntpe assicurati che l'opzione -g sia presente.
  • modifica /etc/ntp.conf e posizionalo tinker panic 0in alto

Finora questo è essenzialmente ciò che gli altri hanno raccomandato, ma c'è un ulteriore passo che penso che dovresti fare. Installa il programma 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.

Con fake-hwclock installato la tua macchina non si avvia pensando che sia di nuovo del 1970. Quando la macchina si avvia, imposta l'orologio sul timestamp falso-hwclock scritto durante l'ultimo riavvio / spegnimento. Questo significa che puoi avere un orologio un po 'corretto nel caso ci siano problemi di rete all'avvio.


1
-gsembrava di non fare nulla per me (nella riga di comando, non ho /etc/default/ntp), ma aggiungendo tinker panic 0a ntp.conflavorato
Dave Cousineau

@Sahuagin Non so cosa dirti se non hai un pacchetto ntp non standard. / etc / default / ntp fa parte del pacchetto di Ubuntu: pacchetti.ubuntu.com/xenial/amd64/ntp/filelist e -g è stata un'opzione per tutto il tempo che posso ricordare.
dfc

scusate, credo di non essere effettivamente su Ubuntu e avrei dovuto pensarci un po 'di più prima di commentare. tinker panic 0sicuramente sembra aver funzionato però.
Dave Cousineau,

13

ntpdate è un programma diverso dal net dameon. Probabilmente NTPDate si sta verificando un errore all'avvio perché ntpd è in esecuzione su quel socket.

Dalla riga di comando, esegui

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

Puoi anche disinstallare ntpd tutti insieme (apt-get remove ntp) e aggiungere uno script cron per usare ntpdate ogni ora circa.

AGGIORNARE

il servizio ntp probabilmente non avrà un valore significativo per te su questo sistema, quindi rimuovilo prima.

# sudo apt-get remove ntp

Ora aggiungi il comando:

ntpdate -sb time.nist.gov

per /etc/rclocal

Reboot. Dovrebbe essere bravo a quel punto.


risposta aggiornata.
Stephan,

1
Ntpdate non viene gradualmente eliminato o qualcosa del genere? Inoltre, se lo capisco correttamente, il servizio viene eseguito e mantiene la sincronizzazione dell'orologio locale con l'orologio del server, quindi la deriva è limitata. Se si rimuove ntp ed si esegue ntpdate una volta, questo non sarà influenzato dalla deriva dell'orologio quando la macchina è accesa per lunghi periodi?

Stephan, vedi l'aggiornamento n. 2 alla domanda.

3
Sì, ntpdate è in fase di eliminazione. Si preferisce l'uso di "ntpd -q" (entrambe le varianti richiedono che ntpd venga prima arrestato).
tgharold,

11

Utilizzare timedatectl(unità di servizio systemd) per impostare l'ora. ntpè deprecato.

sudo systemctl restart systemd-timesyncd.service

Puoi controllare l'ora è stata aggiornata leggendo i log con journalctl -xe | tail

Riferimento


Questo ha funzionato su Ubuntu 19.04. Grazie!
Krubo,

10
rdate -s tick.greyware.com

se tutto ciò che vuoi fare è impostare l'orologio una volta, semplice


Grazie. Al momento non ho il sistema per controllare questo comando, ma se segui la discussione nella domanda e la risposta accettata, vedrai che il problema era effettivamente indisponibilità della rete al momento dell'esecuzione del comando di aggiornamento dell'orologio.

Questo risolto un problema di sincronizzazione temporale sul mio Raspberry Pi. Grazie.
Oliver Spryn,

7

Il modo corretto di farlo su un sistema Debian / Mint / Ubuntu (o altro derivato Debian) è avere la linea

NTPD_OPTS="-g"

nel file

/etc/default/ntp

Questo assicura che quando ntpd viene avviato dallo script /etc/init.d/ntp, viene eseguito con l'opzione "-g", vale a dire

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

per consentire a ntpd di correggere l'ora di sistema quando supera i 1000 s, ad esempio quando l'ora di sistema è il 1 ° gennaio 1970 all'avvio perché non c'è RTC hardware.


L'ho già fatto, ma dice ancora alle 3 del mattino a New York, quando dovrebbero essere le 23:00.
amorevole

Avevo già inserito esattamente quella linea /etc/default/ntp, ma il tempo non era sincronizzato.
Dawid Ferenczy Rogožan,

5

tlsdateimposta l'orologio locale collegandosi in modo sicuro con TLS ai server remoti ed estraendo il tempo remoto dall'handshake sicuro. Diversamente ntpdate, tlsdateutilizza TCP, ad esempio connettendosi a un servizio remoto HTTPS o TLS abilitato e fornisce una protezione contro gli avversari che tentano di fornire informazioni temporali dannose.

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

5

Nota che alcuni attuali sistemi basati su Ubuntu non usano nemmeno il servizio NTP per impostazione predefinita ora. Sulla mia macchina Linux Mint 19 (Ubuntu 18.04), il tempo è mantenuto systemd-timesyncd.

Quindi, per ottenere un aggiornamento dopo che ha perso la sincronizzazione, ho appena eseguito

sudo systemctl restart systemd-timesyncd

Dal 15.04 Ubuntu utilizza systemd per impostazione predefinita. Pertanto i sistemi critici come il tempo sono gestiti attraverso systemd. Per trovare il servizio utilizzato dal tuo sistema, esegui qualcosa di simile

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

Per TechJS il 16.04 il servizio era ntp. Per me stesso su Ubuntu 18.04 (Mint 19) il servizio è systemd-timesyncd. È interessante notare che ho effettuato l'accesso a un server 16.04 che ho e utilizza systemd-timesyncdanche.


Grazie. È passato molto tempo dall'invio della domanda e non ho un sistema disponibile per i test, ma puoi approfondire in che modo la tua risposta è diversa da @TechJS, in particolare il comando che hai proposto è leggermente diverso.
ysap

Ah grazie. È stata una risposta a te ma anche a chiunque in futuro si trovi qui senza informazioni più aggiornate (come me). Ho aggiornato la mia risposta per essere più specifico su come raggiungo la mia risposta.
Aaron Chamberlain,

4

Prova a utilizzare l' -bopzione per aumentare il tempo.


2
Quando si cerca da linea di comando, ottengo la seguente risposta: 1 Jan 00:04:11 ntpdate[2226]: the NTP socket is in use, exiting . Tuttavia, penso di aver provato prima, rc.localma non è stato d'aiuto.

3
È necessario interrompere il servizio ntpdate -b <ipaddress>
NTTP

2

Bene,

Sto eseguendo una raspbian (debian wheezy) sul mio raspberry pi, che non ha l'orologio. Ho trovato utile scrivere un piccolo script ed eseguirlo dopo che la mia interfaccia Internet è attiva, quindi sono sicuro che nel momento in cui la rete diventa disponibile, l'orologio viene aggiornato.

Prima controlla di avere il ntpdatepacchetto eseguendo

sudo apt-get update
sudo apt-get install ntpdate

Devi aggiungere quanto segue nel tuo /etc/network/interfaces(sicuramente eth0qui è solo un esempio):

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

E crea il seguente script in /usr/local/sbin/update-time.sh(non dimenticare di renderlo eseguibile da 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

Gli algoritmi ntpd eliminano gli offset dei campioni superiori a 128 ms, a meno che l'intervallo durante il quale nessun offset del valore [valore assoluto] sia inferiore a 128 ms superi 900s. Il primo esempio dopo, indipendentemente dall'offset, fa passare l'orologio al tempo indicato. In pratica, ciò riduce il tasso di falsi allarmi in cui l'orologio viene commesso per errore a un'incidenza estremamente bassa.

Normalmente, ntpd viene chiuso se l'offset supera il limite di integrità, che per impostazione predefinita è 1000 s. Questo può essere disattivato con l'opzione -g:

-g Normalmente, ntpd esce se l'offset supera il limite di integrità, che è di default 1000 s. Se il limite di integrità è impostato su zero, non viene eseguito alcun controllo di integrità e qualsiasi offset è accettabile. Questa opzione ignora il limite e consente di impostare il tempo su qualsiasi valore senza restrizioni; tuttavia, questo può succedere solo una volta. Successivamente, ntpd uscirà se viene superato il limite. Questa opzione può essere utilizzata con l'opzione -q.

entrambi da http://doc.ntp.org/4.1.0/ntpd.htm

-Jonathan Natale


1

Se puoi permetterti di aspettare il tempo necessario prima che il tuo sistema si sincronizzi, puoi usare il ntp-waitcomando:

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

Se sei su systemd puoi usare questo comando:

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

E poi il tempo viene aggiornato in circa 10-15 secondi.
Testato su Ubuntu Mate 16.04


0

ntpded ntpdateeseguito di default usando una porta riservata (UDP 123). Se sei dietro un firewall, ntpdnon funzionerà mai, ma ntpdatepuò funzionare con l' -uopzione. Ad esempio: ntpdate -u 0.ubuntu.pool.ntp.org o ntpdate -u time.nist.goventrambi dovrebbero funzionare bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.