AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 549149
Accepted
Philip Couling
Philip Couling
Asked: 2019-10-29 08:27:34 +0800 CST2019-10-29 08:27:34 +0800 CST 2019-10-29 08:27:34 +0800 CST

Como o Linux usa um relógio em tempo real?

  • 772

Estou investigando um efeito muito estranho em algumas placas Beagle Bone Black (BBB) . Estamos vendo saltos ocasionais de alguns meses no relógio do sistema que sempre se correlacionam com systemd-timesyncda atualização do relógio do sistema. Vemos de 2 a 3 deles por semana em uma frota de 2.000 dispositivos em diversos locais.

Passamos muito tempo verificando o SNTP, mas parece estar se comportando normalmente.

Finalmente encontramos um problema de hardware com o relógio de tempo real integrado que pode fazer com que ele salte aleatoriamente 131072 segundos (36 horas) devido ao ruído eletrônico. Isso não se encaixa imediatamente, o salto no tempo relatado é bastante específico e muito menor do que observamos, no entanto, uma leitura mais profunda sobre o problema sugere que os saltos podem ser mais aleatórios e podem até retroceder.

Minha pergunta é... Como o linux usa um relógio de tempo real para manter o relógio do sistema ?

Eu quero saber se um erro com o relógio de tempo real só se apresentaria no relógio do sistema quando um agente de sincronização de tempo (ntpd ou systemd-timesyncd) for atualizado. Existe algum link direto entre o relógio do sistema e um RTC ou é usado apenas por um agente?


Nota: No primeiro parágrafo mencionei que estamos vendo saltos de alguns meses no relógio do sistema que sempre se correlacionam com systemd-timesyncda atualização do relógio do sistema. Com isso quero dizer que a primeira mensagem do syslog após um salto de tempo é uma Time has been changedmensagem do syslog:

grep 'Time has been changed' /var/log/syslog
Oct  2 23:53:33 hostname systemd[1]: Time has been changed
Nov 21 00:07:05 hostname systemd[1]: Time has been changed
Nov 21 00:05:17 hostname systemd[1]: Time has been changed
Nov 21 00:03:29 hostname systemd[1]: Time has been changed
Nov 21 00:01:43 hostname systemd[1]: Time has been changed
Oct  3 02:07:20 hostname systemd[1]: Time has been changed
Oct  3 06:37:04 hostname systemd[1]: Time has been changed

Até onde sei, a única coisa que emite essas mensagens é o systemd-timesycnd ( consulte o código-fonte ). Obviamente, se alguém souber de outras systemdmensagens regulares do syslog que correspondam a essas, estou aberto a sugestões.

linux
  • 2 2 respostas
  • 2536 Views

2 respostas

  • Voted
  1. sourcejedi
    2019-10-31T04:22:29+08:002019-10-31T04:22:29+08:00

    Posso responder a alguns desses pontos, incluindo o título.

    [...] que sempre se correlacionam com systemd-timesyncda atualização do relógio do sistema. Com isso quero dizer que a primeira mensagem do syslog após um salto de tempo é uma Time has been changedmensagem do syslog:

    grep 'Time has been changed' /var/log/syslog
    Oct  2 23:53:33 hostname systemd[1]: Time has been changed
    

    Na verdade, esta mensagem não informa qual programa causou o salto de tempo. É apenas um sintoma do salto no tempo.

    Isso acontece quando o kernel informa que systemdo relógio foi alterado.[*] systemdresponde escrevendo esta mensagem no log do sistema e, em seguida, recalculando quando alguma .timerunidade precisará ser acionada.

    A mensagem é impressa pelo programa systemd, não pelo systemd-timesyncd.

    Mais especificamente, o prefixo da mensagem "systemd[1]:" significa que vem do processo ID 1. PID 1 é o processo "init" especial. O projeto systemd também chama isso de "gerente do sistema", para distingui-lo das instâncias systemdque gerenciam serviços de usuário.


    O programa chamado systemdnão altera o relógio após a inicialização do sistema.

    Na árvore de origem do systemd atual à qual você se vincula, o único programa que lê o RTC/hardware clock/hwclock é timedated, e somente se você o consultar usando timedatectl.

    Pelo que me lembro, versões mais antigas do systemdprograma leem o hwclock uma vez no momento da inicialização, antes de executar qualquer outro programa, e configuram o relógio do sistema de acordo. Na versão mais recente, systemdnão faz isso. Há apenas alguns hackers dizendo ao kernel qual fuso horário é usado para o relógio do hardware. (E evitando acionar algo muito específico chamado "time warp").

    Em outras palavras, current systemdparece assumir implicitamente que outra coisa inicializa o relógio do sistema. Na maioria dos casos, este será o kernel.

    Procure a opção de compilação do kernel "Definir a hora do sistema do RTC na inicialização e retomada" - CONFIG_RTC_HCTOSYS.

    Para um entendimento completo, observe que também há uma opção "Definir o horário RTC com base na sincronização NTP" - CONFIG_RTC_SYSTOHC.


    [*] As alterações no relógio do sistema são detectadas usando um recurso específico do Linux. Veja TFD_TIMER_CANCEL_ON_SET.

    • 8
  2. Best Answer
    Philip Couling
    2019-11-02T06:07:04+08:002019-11-02T06:07:04+08:00

    Muito obrigado ao sourcejedi por esta resposta . Isso realmente me levou a encontrar a resposta certa.

    Responda a pergunta

    Como o Linux usa um relógio em tempo real para manter o relógio do sistema?

    Ele faz isso apenas uma vez, durante a inicialização. Ele não consultará o RTC novamente até a próxima reinicialização. Isso é configurável, mas o fará por padrão na maioria das compilações do kernel.


    Eu quero saber se um erro com o relógio de tempo real só se apresentaria no relógio do sistema quando um agente de sincronização de tempo (ntpd ou systemd-timesyncd) for atualizado.

    A menos que o sistema seja reinicializado, é improvável que a hora no RTC entre no relógio do sistema. Alguns agentes como ntpdpodem ser configurados para usar um RTC como fonte de tempo, mas isso geralmente não é ativado por padrão. É desaconselhável habilitá-lo a menos que você saiba que o RTC é uma fonte de tempo muito boa.


    Existe alguma ligação direta entre o relógio do sistema?

    Parece que a hora é copiada de outra forma. O RTC é atualizado periodicamente com a hora do sistema. De acordo com a resposta do sourcejedi, isso é feito pelo kernel se CONFIG_RTC_HCTOSYS estiver definido.

    Isso pode ser testado:

    • Defina o RTC

      # hwclock --set --date='18:28'
      
    • Em seguida, verifique a hora RTC a cada poucos minutos com:

      # hwclock
      

    O resultado disso será que a hora do sistema não será alterada e o RTC eventualmente reverterá para a hora do sistema.


    A causa do salto do tempo no BBB

    Como sourcejedi apontou, as mensagens não estavam sendo acionadas por systemd-timesyncd. Eles estavam sendo acionados por connman. A evidência foi (deveria ser) uma mensagem de log espúria em /var/log/syslog:

    Oct  3 00:10:37 hostname connmand[1040]: ntp: adjust (jump): -27302612.028018 sec
    ...
    Nov 21 00:07:05 hostname systemd[1]: Time has been changed
    

    antes da versão 1.37 , connman é codificado para sondar promiscuamente o gateway padrão para o momento. Ele não precisa ser configurado por DHCP para fazer isso e se o cliente NTP do connman estiver habilitado (é por padrão) , ele fará isso independentemente de qualquer outra configuração.

    No nosso caso, alguns roteadores domésticos estavam realmente respondendo a essas solicitações NTP, mas os resultados não eram muito confiáveis. Particularmente onde o roteador foi reiniciado, ele continuou a distribuir a hora sem realmente saber a hora correta .

    Por exemplo, sabemos que pelo menos uma versão do BT Home Hub 5 , quando reinicializado, será padrão para 21 de novembro de 2018 e fornecerá essa data por NTP. Seu próprio cliente NTP corrigirá o problema, mas há uma janela em que ele é distribuído em 21 de novembro de 2018.

    Ou seja, esse problema foi causado por nossos clientes reiniciando seu roteador e connman apenas aceitando desta vez.

    Vou expressar minha frustração aqui, parece que a beligerância de alguns deixou esse "recurso" no connman por muito tempo. Foi relatado como um problema já em 2015 . E é um "recurso" muito bem escondido. Não há servidores de tempo configurados e nenhuma mensagem de log para explicar o que o connman está fazendo ou documentação sobre o motivo. Se seus equipamentos de teste não tiverem servidor NTP no gateway padrão, você nunca verá isso nos testes.


    Como consertar

    Estamos analisando duas opções que parecem funcionar:

    1. Remova o connman completamente. Parece que a rede funciona bem sem ele; nós ainda não encontramos a razão para ele estar lá em primeiro lugar.

      apt-get remove connman
      
    2. Desabilite o NTP no connman editando /var/lib/connmanpara incluir:

      [global]
      TimeUpdates=manual
      
    • 5

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve