Come forzare un aggiornamento dell'orologio usando ntp?

320

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

Ho aggiunto la seguente riga al file /etc/rc.local :

sudo ntpdate -s time.nist.gov

Tuttavia, dopo l'avvio, ci vogliono ancora un paio di minuti fino all'aggiornamento del tempo, durante il quale non riesco a lavorare efficacemente con tar e make .

Come posso forzare l'aggiornamento di un orologio in un dato momento?

UPDATE 1: Quanto segue (grazie a Eric e Stephan) funziona bene dalla riga di comando, ma non riesce ad aggiornare l'orologio quando viene inserito in /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 sbagliando?

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

  1. Sostituisci il server in us.pool.ntp.org
  2. Utilizza percorsi espliciti per i programmi
  3. Rimuovi del tutto il servizio ntp e lascia solo sudo ntpdate ... in rc.local
  4. Rimuovi sudo dal comando precedente in rc.local

Usando quanto sopra, la macchina inizia ancora dal 1970. Tuttavia, quando si esegue questa operazione dalla riga di comando dopo aver effettuato l'accesso (tramite ssh ), l'orologio viene aggiornato non appena richiamo ntpdate .

L'ultima cosa che ho fatto è stata rimuovere da rc.local e mettere una chiamata a ntpdate nel mio file .bashrc . Ciò aggiorna l'orologio come previsto e ottengo l'ora corrente vera una volta che il prompt dei comandi è disponibile.

Tuttavia , questo significa che se la macchina è accesa e nessun utente ha effettuato l'accesso, l'ora non riceve mai gli aggiornamenti. Posso, ovviamente, reinstallare il servizio ntp così almeno l'orologio viene aggiornato entro pochi minuti dall'avvio, ma poi torniamo al punto 1.

Quindi, c'è un motivo per cui posizionare il comando ntpdate in rc.local non esegue l'attività richiesta, mentre in .bashrc funziona bene?

    
posta ysap 13.02.2013 - 22:58

15 risposte

281

Probabilmente il servizio ntp è in esecuzione, ecco perché ntpdate non può aprire il socket (porta 123 UDP) e connettersi al server ntp.

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.local usa 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 )&
    
risposta data Eric Carvalho 14.02.2013 - 00:13
419

Invece di ntpdate (che è deprecato ), usa

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

Il -gq indica al daemon ntp di correggere l'ora indipendentemente dall'offset ( g ) e di uscire immediatamente ( q ) dopo aver impostato il tempo.

    
risposta data Martin Schröder 14.02.2013 - 13:32
49

Usa sntp per impostare l'ora immediatamente. Ad esempio:

sudo sntp -s 24.56.178.140

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

    
risposta data Guest 08.11.2013 - 02:00
37

Come altri hanno sottolineato, la soluzione migliore è 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/ntp e assicurati che l'opzione -g sia presente.
  • modifica /etc/ntp.conf e posiziona tinker panic 0 all'inizio

Finora questo è essenzialmente ciò che altri hanno raccomandato, ma c'è un altro passo che dovresti prendere. 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 finto-hwclock installato, la tua macchina non si avvierà pensando che sia il 1970 tutto da capo. Quando la macchina si avvia, imposta l'orologio sul timestamp che fake-hwclock ha scritto durante l'ultimo riavvio / spegnimento. Ciò significa che puoi avere un orologio alquanto corretto nel caso in cui ci siano problemi di rete all'avvio.

    
risposta data dfc 04.04.2014 - 00:11
12

ntpdate è un programma diverso dalla net dameon. NTPDate probabilmente sta andando in 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

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

UPDATE

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

a /etc/rclocal

Reboot. Dovrebbe essere buono a quel punto.

    
risposta data Stephan 14.02.2013 - 00:07
8
rdate -s tick.greyware.com

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

    
risposta data batflaps 26.02.2015 - 23:57
7

Il modo corretto di farlo su un sistema Debian / Mint / Ubuntu (o su altri sistemi Debian) è di 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 del sistema quando è più di 1000 s, ad esempio quando l'ora del sistema è il 1 ° gennaio 1970 all'avvio perché non c'è RTC hardware.

    
risposta data J G Miller 03.04.2014 - 13:20
4

Prova a utilizzare l'opzione -b per aumentare il tempo.

    
risposta data Cry Havok 13.02.2013 - 23:18
4

tlsdate imposta l'orologio locale collegandosi in modo sicuro con TLS ai server remoti ed estraendo il timeout remoto dall'handshake sicuro . a differenza di ntpdate , tlsdate usa TCP, per esempio connettendosi a un HTTPS o TLS remoto  abilitato servizio e fornisce una certa protezione contro gli avversari che cercano di  fornisci informazioni sull'orario malevolo.

$ tlsdate -V -n -H encrypted.google.com
    
risposta data Kokizzu 23.02.2016 - 12:52
2

link

usa timedatectl per impostare l'ora, ntp è deprecato.

    
risposta data xiaoyifang 29.11.2016 - 09:57
1

Gli algoritmi di ntpd scartano gli offset campione superiori a 128 ms, a meno che l'intervallo durante il quale nessun offset [valore assoluto di] offset sia inferiore a 128 ms superi 900s. Il primo campione dopo di ciò, indipendentemente dall'offset, porta l'orologio all'orario indicato. In pratica, questo riduce il tasso di falsi allarmi in cui l'orologio è calpestato per errore a un'incidenza estremamente bassa.

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

-g     Normalmente, ntpd si chiude se l'offset supera il limite di integrità, che è 1000 s per impostazione predefinita. Se il limite di integrità è impostato su zero, non viene eseguito alcun controllo di integrità e qualsiasi offset è accettabile. Questa opzione sostituisce il limite e consente di impostare il tempo su qualsiasi valore senza restrizioni; tuttavia, ciò può accadere solo una volta. Dopodiché, ntpd uscirà se il limite viene superato. Questa opzione può essere utilizzata con l'opzione -q.

entrambi dal link

-Jonathan Natale

    
risposta data Jonathzen 28.01.2015 - 22:26
1

Bene,

Sto eseguendo un raspbian (debian wheezy) sul mio raspberry pi, che non ha hwclock. Ho trovato utile scrivere un piccolo script ed eseguirlo dopo che la mia interfaccia internet è attiva, così sono sicuro che nel momento in cui la rete sarà disponibile, l'orologio verrà aggiornato.

Prima verifica di avere il pacchetto ntpdate eseguendo

sudo apt-get update
sudo apt-get install ntpdate

Devi aggiungere quanto segue al tuo /etc/network/interfaces (sicuramente eth0 qui è 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
    
risposta data art.shutter 12.12.2015 - 16:14
0

ntpd e ntpdate esegui per impostazione predefinita utilizzando una porta con restrizioni (UDP 123). Se sei dietro un firewall, ntpd non funzionerà mai, ma ntpdate può funzionare con l'opzione -u . Ad esempio: ntpdate -u 0.ubuntu.pool.ntp.org o ntpdate -u time.nist.gov dovrebbero entrambi funzionare correttamente.

    
risposta data G. N. DeSouza 05.06.2015 - 01:01
0

Se puoi permetterti di aspettare il tempo necessario prima che il tuo sistema venga sincronizzato, puoi utilizzare il comando 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.
    
risposta data Anonymous 08.12.2015 - 08:55
0

Se sei su systemd puoi usare questo comando:

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

E poi l'ora viene aggiornata entro circa 10-15 secondi.
Testato su ubuntu mate 16.04

    
risposta data TechJS 21.02.2018 - 19:01

Leggi altre domande sui tag