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

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 .


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.