Como forçar uma atualização de relógio usando ntp?

Estou executando o Ubuntu em um sistema embarcado baseado em ARM que não possui um RTC com bateria. O tempo de Despertar está em algum lugar durante 1970. Assim, eu uso o serviço NTP para atualizar a hora para a hora atual.

Eu adicionei a seguinte linha para /etc/rc.local arquivo:

sudo ntpdate -s time.nist.gov

No entanto, após a inicialização, ainda leva alguns minutos até que o tempo seja atualizado, durante o qual não consigo trabalhar de forma eficaz tar e make.

Como posso forçar uma atualização de relógio a qualquer momento?


Atualização 1: O seguinte (graças a Eric e Stephan) funciona bem na linha de comando, mas não atualiza o relógio quando colocado /etc/rc.local:

$ date ; sudo service ntp stop ; sudo ntpdate -s time.nist.gov ; sudo service ntp start ; dateThu Jan  1 00:00:58 UTC 1970 * Stopping NTP server ntpd     [ OK ]  * Starting NTP server          [ OK ] Thu Feb 14 18:52:21 UTC 2013

O que estou a fazer de errado?


Atualização 2: Tentei seguir as poucas sugestões que vieram em resposta à 1ª atualização, mas nada parece realmente fazer o trabalho conforme necessário. Aqui está o que eu tentei:

  1. Substitua o servidor para us.pool.ntp.org
  2. Use caminhos explícitos para os programas
  3. Remover o ntp serviço completamente e sair apenas sudo ntpdate ... em rc.local
  4. Remover o sudo do comando acima em rc.local

Usando o acima, a máquina ainda começa em 1970. No entanto, ao fazer isso a partir da linha de comando, uma vez logado (via ssh), o relógio é atualizado assim que invoco ntpdate.

A última coisa que fiz foi remover isso de rc.local e faça uma chamada para ntpdate no meu .bashrc arquivo. Isso atualiza o relógio conforme o esperado e recebo a hora atual verdadeira assim que o prompt de comando estiver disponível.

Entanto, isso significa que, se a máquina estiver ligada e nenhum usuário estiver conectado, o tempo nunca receberá atualizações. Eu posso, é claro, reinstalar o ntp serviço então, pelo menos, o relógio é atualizado dentro de alguns minutos a partir da inicialização, mas então estamos de volta ao quadrado 1.

Então, há uma razão pela qual colocar o ntpdate comando em rc.local não executa a tarefa necessária, ao fazê-lo em .bashrc funciona bem?

Em vez de ntpdate (que é descontinuar), usar ntpd:

sudo service ntp stopsudo ntpd -gqsudo service ntp start

O -gq diz ao daemon ntp para corrigir o tempo, independentemente do deslocamento (g) e sair imediatamente (q) depois de definir a hora.

Provavelmente o ntp o serviço está em execução, é por isso ntpdate não é possível abrir o soquete (porta 123 UDP) e se conectar ao servidor ntp.

Tente da linha de comando:

sudo service ntp stopsudo ntpdate -s time.nist.govsudo service ntp start

Se você quiser colocar isso em /etc/rc.local usar:

( /etc/init.d/ntp stopuntil ping -nq -c3 8.8.8.8; do   echo "Waiting for network..."donentpdate -s time.nist.gov/etc/init.d/ntp start )&

Use sntp para definir a hora imediatamente. Alguns exemplos de sua página de manual:

USAGE     sntp ntpserver.somewhere             is the simplest use of this program and can be run as an unprivileged command to check the current time and error in the local clock.     sntp -Ss -M 128 ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -Ss -M 128 ntpserver.somewhere will request the time from the server, and if that server reports that it is             synchronized then if the offset adjustment is less than 128 milliseconds the correction will be slewed, and if the correction is more than 128 milliseconds the correction  will             be stepped.     sntp -S ntpserver.somewhere             With suitable privilege, run as a command or from a cron(8) job, sntp -S ntpserver.somewhere will set (step) the local clock from a synchronized specified server, like the (dep‐             recated) ntpdate(8), or rdate(8) commands.

Ele funciona com qualquer servidor de tempo ntp. Uma lista conveniente de servidores pode ser encontrada em ntppool.org.

Você precisa sudo privilégios, por exemplo:

sudo sntp -Ss -M 128 0.de.pool.ntp.org

Usar timedatectl (unidade de serviço systemd) para definir a hora. ntp está obsoleto.

sudo systemctl restart systemd-timesyncd.service

Você pode verificar o tempo foi atualizado lendo os logs com journalctl -xe | tail.

Status com timedatectl status e config em /etc/systemd/timesyncd.conf.

Referência

Como outros apontaram, a melhor solução é instruir o ntpd a ignorar o limite de pânico, que é de 1000 segundos por padrão. Você pode configurar o limite de pânico de uma das duas maneiras:

  • editar /etc/default/ntp e certifique-se de que a opção-g esteja presente.
  • editar / etc / ntp.conf e lugar tinker panic 0 no topo

Até agora, isso é essencialmente o que os outros recomendaram, mas há mais um passo que eu acho que você deve dar. Instale o programa fake-hwclock:

# apt-get install fake-hwclockfake-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.

Com fake-hwclock instalado sua máquina não vai começar a pensar que é 1970 tudo de novo. Quando sua máquina inicializa, ele definirá seu relógio para o carimbo de data / hora fake-hwclock escreveu durante a última reinicialização / desligamento. Isso significa que você pode ter um relógio um pouco correto, caso haja problemas de rede ao inicializar.

ntpdate é um programa diferente do Net dameon. NTPDate provavelmente está errando na inicialização porque o ntpd está sendo executado nesse Soquete.

Na linha de comando, execute

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

Você também pode desinstalar o ntpd todos juntos (apt-get remove ntp) e adicionar um script cron para usar o ntpdate a cada hora ou mais.

ACTUALIZACAO

o serviço ntp provavelmente não terá valor significativo para você neste sistema, então remova isso primeiro.

# sudo apt-get remove ntp

Agora adicione o comando:

ntpdate -sb time.nist.gov

para /etc/rclocal

Reiniciar. Deve ser bom nesse ponto.

rdate -s tick.greyware.com

se tudo o que você quer fazer é definir o relógio uma vez, simples

Observe que alguns sistemas atuais baseados no Ubuntu nem usam o serviço NTP por padrão agora. Na minha máquina Linux Mint 19 (Ubuntu 18.04), o tempo é mantido por systemd-timesyncd.

Então, para obter uma hora atualizada depois de perder a sincronização, Eu apenas corro

sudo systemctl restart systemd-timesyncd

Desde 15.04 Ubuntu usa systemd por padrão. Portanto, sistemas críticos como o tempo são gerenciados por meio do systemd. Para encontrar o serviço que seu sistema está usando, execute algo como

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

Para TechJS em 16.04 o serviço foi ntp. Para mim no Ubuntu 18.04 (Mint 19) o serviço é systemd-timesyncd. Curiosamente, entrei em um servidor 16.04 que tenho e ele usa systemd-timesyncd Também.

A maneira correta de fazer isso em um sistema Debian / Mint / Ubuntu (ou outro derivado Debian) é ter a linha

NTPD_OPTS="-g"

no arquivo

/etc/default/ntp

Isso garante que quando ntpd é iniciado a partir do/etc / init.script d / ntp, ele é executado com a opção "- g", viz

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

para permitir que o ntpd corrija a hora do sistema quando estiver mais de 1000 s fora, por exemplo, quando a hora do sistema for 1º de janeiro de 1970 na inicialização porque não há RTC de hardware.

tlsdate define o relógio local conectando-se com segurança com TLS a servidores remotos e extraindo o tempo remoto do aperto de mão seguro. Contrariontpdate, tlsdate usa TCP, por exemplo, conectando-se a um serviço remoto habilitado para HTTPS ou TLS, e fornece alguma proteção contra adversários que tentam fornecer informações de tempo maliciosas.

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

de[aqui] 1:
'ntpdate -s ntp.ubuntu.com`

observe o sinalizador '- b ’ no ntpdate. Da página de manual do ntpdate: "Force o tempo a ser escalonado usando a chamada do sistema settimeofday (), em vez de slewed (padrão) usando a chamada do sistema adjtime (). Esta opção deve ser usada quando chamada de um arquivo de inicialização no momento da inicialização."Muitas das respostas abaixo não incluem, e que talvez parte do problema em fazer as coisas funcionarem. Considere que o sinalizador '- B ’ menciona que compensações acima de 128 ms podem levar horas para serem sincronizadas usando o mecanismo ‘slew’ padrão

'timedatectl`, mas How to update system time behind a proxy? - Ask Ubuntu

Não há necessidade de usar ‘sudo’ em / etc / rc.arquivos de localidade … eles são todos executados como raiz.