Sincronizar o relógio com o NTP enquanto estiver online e com o RTC enquanto estiver offline?

11

Existe um mecanismo existente que sincronize um sistema linux com o NTP enquanto estiver online e com um RTC à deriva previsível enquanto estiver offline?


Operamos "coletores" remotos: sistemas Linux incorporados que coletam e registram os dados dos sensores com data e hora. Precisamos que seus erros de relógio permaneçam razoavelmente pequenos, digamos, abaixo de 5 segundos. Normalmente, usamos o NTP para sincronizar seus relógios, e isso funciona bem - desde que o sistema esteja online.

O problema é que alguns colecionadores têm uplinks muito ruins, que podem cair por horas, dias ou até semanas. Isso não interrompe a coleta de dados local, mas sem o NTP, o relógio do sistema Linux varia muito e de forma imprevisível.

OTOH, o RTC do hardware também varia muito, mas a uma taxa constante. A taxa de desvio do RTC varia de placa para placa, mas é constante por placa e pode ser medida.

Acho que precisamos de um mecanismo que faça o seguinte:

  • Meça a taxa de desvio RTC de uma placa antes de sua implantação
  • Ajuste a hora do sistema em andamento / regularmente via NTP, quando possível
  • Ajuste a hora do sistema regularmente do RTC quando o NTP não estiver disponível. Leve em consideração a taxa de desvio RTC conhecida.
  • Opcional: meça e registre a taxa de desvio do RTC em andamento enquanto estiver on-line (1)

Com 'mecanismo', quero dizer algum software e / ou configuração documentado e bem conservado que pode lidar com os dois estados "online" e "offline", verifique se o relógio do sistema está sincronizado com a fonte de tempo correta (ntp vs. rtc), detecte a mudança de estado e corrija a deriva do RTC. Não importa muito se ele é implementado como uma configuração / plug-in especial do ntpd, como um daemon separado, como um trabalho cron, ou então.

Dei uma olhada no Chrony , mas de acordo com a documentação dele , ele tenta prever o desvio do relógio do sistema , que no nosso caso varia muito mais imprevisivelmente do que o RTC. Chrony parece usar o RTC apenas para manter o tempo durante as reinicializações.


(1) Nota: o ntpd ativa o modo '11 minutos 'do kernel (atualize o rtc do relógio do sistema a cada 11 minutos). Parece não haver maneiras com os kernels atuais e o ntpd para impedir o modo de 11 minutos. Portanto, qualquer informação de desvio de rtc é perdida enquanto o ntpd está em execução (thx @billthor).


Atualizações / edições:

  • Estamos considerando adicionar um relógio de rádio externo para o sinal MSF ou DCF77 (estamos sediados na Europa) via USB ou Serial. Mas preferimos manter o hardware enxuto.
  • Nossos colecionadores estão localizados dentro de casa, geralmente no porão. Portanto, adicionar relógios GPS não ajudará.
  • Usamos o Debian 7. Isso significa hwclock do util-linux-2.20.1, ntpdate-4.2.6p5, ntpd do ntp-4.2.6.p5, chrony-1.24 (potencialmente 1.30).
  • Note-se que o nosso problema não é que não sabemos como usar ntpdate(8), hwclock(8), date(1), etc. Por favor, consulte a seção adicionados em itálico sobre o que eu quero dizer com 'mecanismo'.
  • Nota de rodapé adicionada sobre o 'modo 11 minutos'
  • Aqui está uma discussão muito interessante sobre sincronização offline e desvio do RTC
Nils Toedtmann
fonte
Pelo que entendi, uma combinação de ntpd e hwclock já permite que você faça todas essas coisas.
Roy
@Roy Sure. A questão é: como combinar o ntp (d) e o RTC (hwclock) de forma coerente para obter a máxima precisão?
Nils Toedtmann
Entendo que o relógio do sistema deriva mais do que o RTC. Estou curioso para saber o que você achou inaceitável em relação à maneira / eficácia do gerenciamento de desvio de sistema da chrony? Como o chrony falhou para você?
dfc
@dfc chrony não falhou conosco. Ainda não tentamos isso porque parece não usar o RTC para manter o tempo durante períodos offline, o que acho que aumentaria a precisão em nosso caso de uso. Testaremos o crony se nenhum outro método de aparência mais promissora for sugerido.
Nils Toedtmann
Eu acho que você deveria olhar para crony. Respeitosamente, parece que você está descartando uma boa opção com base em um palpite. Na minha opinião, é inverso investigar crony se nenhum RTC-ntpd for encontrado. Parece a coisa mais fácil é ver se chrony atenda às suas necessidades e, se não, em seguida, ir por este buraco do coelho
dfc

Respostas:

4

Sua situação é incomum, e eu ficaria surpreso se alguém criar uma ntpdconfiguração baseada em padrão para fazer o que você deseja. Dito isto, eu gosto de ser surpreendido, e isso acontece com frequência nessas partes.

Mas até que alguém tenha uma idéia melhor, você já considerou uma crontabentrada como essa?

*/5 * * * *   ntpdate 0.pool.ntp.org || ( hwclock --adjust; hwclock --hctosys )

IE, a cada cinco minutos tenta sincronizar o relógio via ntpdatee, se (e somente se) falhar, ajuste o relógio do hardware para a deriva de acordo com o /etc/adjtimearquivo (cujo formato é detalhado em man hwclocke cuja primeira linha você preencheu adequadamente usando seu conhecimento) dessa taxa específica do RTC) e depois ajuste o relógio do sistema a partir do RTC.

Observe que, se você optar por uma solução como essa e estiver implantando um número significativo desses sistemas, será considerado educado trabalhar com o pool e contribuir com servidores de volta na proporção do seu uso. Você pode encontrar mais informações em http://www.pool.ntp.org/en/vendors.html .

Chapeleiro Louco
fonte
Você acertou a idéia básica :-) Mas ainda não conta como resposta, já que não explica a deriva (constante, mas significativa) do RTC. Podemos melhorá-lo, por exemplo, utilizando /etc/adjtimee hwclock --adjust?
Nils Toedtmann
Sim; Veja acima.
MadHatter
Esse é o tipo de solução que eu tinha em mente quando escrevi meu comentário anterior. Além disso, se o relógio do sistema estiver atualmente sincronizado via ntpd, você poderá usar o hwclock para medir e definir uma taxa de desvio bastante precisa para o RTC.
Roy
Infelizmente não, veja os comentários sobre ntpd e '11 -minute mode '
Nils Toedtmann
-1

O NTP já possui mecanismos para saber se está online ou offline e mudará para fontes de menor prioridade, conforme necessário. É muito fácil verificar o valor de alcance para acionar uma fonte alternativa, mas eu continuaria com o NTP. Conforme discutido abaixo, é provável que seja difícil monitorar e corrigir a deriva do RTC.

Nos dias anteriores à Internet, usei um programa que telefonava para uma fonte de dados e sincronizava o relógio. Ainda pode haver serviços disponíveis que fornecem uma fonte de tempo através de um modem. Isso exigiria acesso a uma linha telefônica.

Existem problemas conhecidos no relógio local que não se aplicam ao RTC. Alguns dos problemas estão documentados na lista de problemas conhecidos do SO NTP . Isso pode explicar o desvio do relógio. Resolvê-los pode resolver seu problema. Na ausência de carrapatos perdidos, descobri que a fonte de horário local (sistema) pode ser muito estável.

Você pode usar o driver Dumb clock (33) com um programa que grava a hora RTC apropriada no dispositivo / dev / dumbclockX.

Existem vários outros drivers baseados em relógios de rádio. Alguns deles usam serviços de ondas curtas, como WWV e CHU, que podem funcionar em ambientes onde os sinais de GPS não estão disponíveis. Para a Europa, essa lista incluiria BBC, TDF, RBU e RMW.

Pavel Krejci também escreveu um driver RTC, mas ele não parece estar incorporado nos drivers oficiais. Isso pode funcionar com a sincronização do tipo PPS.

Deve ser possível medir a deriva do RTC antes da implantação. No entanto, você precisará garantir que o RTC não esteja sendo atualizado automaticamente. Quando o relógio do sistema é atualizado com a função adjtimex, o RTC pode ser atualizado a cada 11 minutos.

O NTP atualizará o relógio quando estiver conectado. Normalmente, o NTP se recusará a fazer grandes ajustes no relógio do sistema. Existem opções para ajustar a que distância o relógio pode ser ajustado.

Sugeri opções para usar o RTC acima. Um relógio de rádio pode ser mais adequado que um relógio de GPS.

Medir a deriva na ausência de uma fonte de tempo confiável para compará-la é provavelmente um esforço inútil. Se a hora local for instável, você não poderá usá-la para monitorar o RTC e vice-versa. Medir o desvio enquanto o NTP estiver conectado não funcionará se o kernel estiver atualizando o RTC a cada 11 minutos. Os RTCs que usei têm uma resolução de um segundo, portanto, eles precisariam se desviar significativamente para serem mensuráveis ​​com segurança.

BillThor
fonte
Não entendo como isso se relaciona com a minha pergunta. Eu não acho que o meu problema é a falta de drivers ... ou é?
Nils Toedtmann
@NilsToedtmann Até onde eu sei, não há driver oficial para o RTC. Acredito que o localmotorista use apenas o relógio dos servidores, que você denuncia desvios. Vou atualizar minha resposta.
BillThor
Quando você diz 'drivers', você quer dizer drivers de kernel do Linux (dos quais existem muitos) ou recursos ntpd? Thx por suas dicas, algumas delas são interessantes - embora eu ache que deveriam ter sido postadas como comentários. Thx em particular por mencionar o '11 minutos mais ', eu tinha esquecido disso. Eu atualizei minha pergunta.
Nils Toedtmann
@NilsToedtmann Não, quero dizer drivers de relógio NTP. Tem sido minha experiência que os RTCs normalmente flutuam, mas não em altas taxas se a massa estiver boa. Carrapatos perdidos podem ser um problema com o relógio do sistema.
BillThor