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
Respostas:
Sua situação é incomum, e eu ficaria surpreso se alguém criar uma
ntpd
configuraçã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
crontab
entrada como essa?IE, a cada cinco minutos tenta sincronizar o relógio via
ntpdate
e, se (e somente se) falhar, ajuste o relógio do hardware para a deriva de acordo com o/etc/adjtime
arquivo (cujo formato é detalhado emman hwclock
e 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 .
fonte
/etc/adjtime
ehwclock --adjust
?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.
fonte
local
motorista use apenas o relógio dos servidores, que você denuncia desvios. Vou atualizar minha resposta.