Sincronização de tempo para VMs Linux no Azure

Aplica-se a: ✔️ VMs do Linux ✔️ Conjuntos de dimensionamento flexíveis ✔️ Conjunto de dimensionamento uniformes

A sincronização de Data/Hora é importante para segurança e correlação de eventos. Às vezes, é usada para implementação de transações distribuídas. A precisão da hora entre vários sistemas de computador é obtida por meio da sincronização. A sincronização pode ser afetada por vários fatores, incluindo reinicializações e tráfego de rede entre o servidor de horário e o computador que obtém o horário.

O Azure é apoiado pela infraestrutura que executa o Windows Server 2016. O Windows Server 2016 aprimorou os algoritmos usados para corrigir a hora e condicionar o relógio local a sincronizar com o UTC. O recurso Accurate Time do Windows Server 2016 aprimorou significativamente a forma como o serviço VMICTimeSync sincroniza as VMs com o host para fornecer tempo preciso. Os aprimoramentos incluem um tempo inicial mais preciso na inicialização da VM ou na restauração da VM, e a correção da latência de interrupção.

Observação

Para obter mais informações, confira Como funciona o Serviço de Horário do Windows. Você também pode encontrar informações específicas do Windows Server 2016 na página Tempo preciso do Windows Server 2016.

Visão geral

A precisão de um relógio de computador é medida na proximidade do relógio do computador com o padrão de hora UTC (Tempo Universal Coordenado). UTC é definido por um conjunto multinacional de relógios atômicos precisos que só apresentam um desvio de um segundo em 300 anos. Mas ler o UTC diretamente requer um hardware especializado. Em vez disso, os servidores de horário são sincronizados com o UTC e acessados de outros computadores para fornecer escalabilidade e robustez. Todo computador tem o serviço de sincronização de tempo em execução que sabe a que horas os servidores devem ser usados e verifica periodicamente se o relógio do computador precisa ser corrigido e ajusta o tempo, se necessário.

Os hosts do Azure são sincronizados para servidores de horário internos da Microsoft que usam dispositivos da Microsoft da Stratum 1, com antenas de GPS. As máquinas virtuais no Azure podem depender do host para passar a hora exata (hora do host) para a VM ou a VM pode obter a hora diretamente de um servidor de horário ou uma combinação de ambos.

No hardware autônomo, o sistema operacional Linux só lê o relógio de hardware do host na inicialização. Depois disso, o relógio é mantido usando o timer de interrupção no kernel do Linux. Nesta configuração, o relógio se deslocará com o tempo. Em distribuições mais recentes do Linux no Azure, as VMs podem usar o provedor VMICTimeSync, incluído nos serviços de integração do Linux (LIS), para consultar atualizações de relógio do host com mais frequência.

As interações da máquina virtual com o host também podem afetar o relógio. Durante a manutenção com preservação de memória, as VMs são pausadas por até 30 segundos. Por exemplo, antes de iniciar a manutenção, o relógio da VM exibe as 10:00:00 e dura 28 segundos. Depois que a VM for retomada, o relógio na VM ainda mostrará 10:00:00 AM, o que seria 28 segundos de folga. Para corrigir isso, o serviço VMICTimeSync monitora o que está acontecendo no host e atualiza o relógio de hora do dia nas VMs do Linux para compensar.

Sem a sincronização de data/hora, o relógio na VM acumularia erros. Quando há apenas uma VM, o efeito pode não ser significativo, a menos que a carga de trabalho exija uma cronometragem altamente precisa. Mas, na maioria dos casos, temos várias VMs interconectadas que usam o horário para rastrear transações, e ele precisa ser consistente em toda a implantação. Quando o horário entre as VMs for diferente, você poderá observar os seguintes efeitos:

  • A autenticação falhará. Protocolos de segurança, como o Kerberos ou tecnologias baseadas em certificados, dependem de que o horário seja consistente entre os sistemas.
  • É muito difícil descobrir o que aconteceu em um sistema se os logs (ou outros dados) não corresponderem com a hora. O mesmo evento poderia parecer que ocorreu em momentos diferentes, dificultando a correlação.
  • Se o relógio estiver desligado, a cobrança poderá ser calculada incorretamente.

Opções de configuração

A sincronização de tempo requer que um serviço de sincronização de tempo seja executado na VM do Linux, além de uma fonte de informações de tempo precisa com a qual é feita a sincronização. Normalmente, ntpd ou chronyd são usados como o serviço de sincronização de tempo, embora haja outros serviços de sincronização de tempo de software livre que também possam ser usados. A fonte de informação da hora precisa pode ser o host do Azure ou um serviço de tempo externo que é acessado pela Internet pública. Por si só, o serviço VMICTimeSync não fornece sincronização de tempo contínua entre o host do Azure e uma VM do Linux, exceto após pausas para manutenção do host, conforme descrito acima.

Historicamente, a maioria das imagens do Azure Marketplace com o Linux foram configuradas de uma destas duas maneiras:

  • Nenhum serviço de sincronização de tempo está em execução por padrão
  • O ntpd está sendo executado como serviço de sincronização de horário e sincronizando-se com uma fonte externa de tempo NTP acessada pela rede. Por exemplo, as imagens do Marketplace do Ubuntu 18.04 LTS usam ntp.ubuntu.com.

Para confirmar que o ntpd está sincronizando corretamente, execute o comando ntpq -p.

Algumas imagens do Azure Marketplace com Linux estão sendo alteradas para usar o chronyd como serviço de sincronização de hora, e o chronyd está configurado para sincronizar com o host do Azure em vez de uma fonte de tempo NTP externa. O horário do host do Azure geralmente é a melhor fonte de horário para sincronização, pois é mantido com precisão e confiabilidade e pode ser acessado sem os atrasos variáveis de rede inerentes ao acesso a uma fonte de horário NTP externa por meio da internet pública.

O VMICTimeSync é usado em paralelo e fornece duas funções:

  • Atualiza imediatamente o relógio de hora do dia da VM do Linux após um evento de manutenção do host
  • Cria uma instância de uma fonte do relógio de hardware de PTP (Precision Time Protocol) do IEEE 1588 como um dispositivo /dev/ptp que fornece a hora precisa do dia do host do Azure. O chronyd pode ser configurado para sincronização com essa fonte de tempo (que é a configuração padrão nas imagens mais novas do Linux). As distribuições Linux com kernel versão 4.11 ou posterior (ou versão 3.10.0-693 ou posterior para RHEL 7) dão suporte ao dispositivo /dev/ptp. Para versões anteriores do kernel que não dão suporte ao /dev/ptp para o tempo de host do Azure, só é possível a sincronização com uma fonte de tempo externa.

A configuração padrão pode ser alterada. Uma imagem mais antiga configurada para usar o ntpd e uma fonte de tempo externa pode ser alterada para usar o chronyd e o dispositivo /dev/ptp para a hora do host do Azure. Da mesma forma, é possível configurar uma imagem usando a hora do host do Azure por meio de um dispositivo /dev/ptp para usar uma fonte de tempo NTP externa, se exigido pelo seu aplicativo ou carga de trabalho.

Ferramentas e recursos

Há alguns comandos básicos para verificar sua configuração de sincronização de tempo. A documentação da distribuição Linux tem mais detalhes sobre a melhor maneira de configurar a sincronização de horário para essa distribuição.

Serviços de integração

Verifique se o serviço de integração (hv_utils) está carregado.

$ sudo lsmod | grep hv_utils

Você deve ver algo semelhante a isto:

hv_utils               24418  0
hv_vmbus              397185  7 hv_balloon,hyperv_keyboard,hv_netvsc,hid_hyperv,hv_utils,hyperv_fb,hv_storvsc

Verificar Origem do Relógio PTP

Com versões mais recentes do Linux, uma fonte de relógio do PTP (Precision Time Protocol) correspondente ao host do Azure está disponível como parte do provedor VMICTimeSync. Nas versões mais antigas do Red Hat Enterprise Linux 7.x, o Serviços de Integração do Linux pode ser baixado e usado para instalar o driver atualizado. Quando a origem do relógio PTP está disponível, o dispositivo Linux tem o formato /dev/ptpx.

Veja quais fontes de relógio PTP estão disponíveis.

$ ls /sys/class/ptp

Neste exemplo, o valor retornado é ptp0, portanto, usamos isso para verificar o nome do relógio. Para verificar o dispositivo, verifique o nome do relógio.

$ sudo cat /sys/class/ptp/ptp0/clock_name

Isso deve retornar hyperv, o que significa o host do Azure.

Em algumas VMs do Linux, você pode ver vários dispositivos PTP listados. Um exemplo é a Rede Acelerada, em que o driver Mellanox mlx5 também cria um dispositivo /dev/ptp. Como a ordem de inicialização pode ser diferente cada vez que o Linux é inicializado, o dispositivo PTP correspondente ao host do Azure pode ser /dev/ptp0 ou /dev/ptp1, o que dificulta a configuração de chronyd com a fonte de relógio correta. Para resolver esse problema, as imagens do Linux mais recentes têm uma regra udev que cria o symlink /dev/ptp_hyperv para qualquer entrada /dev/ptp que corresponda ao host do Azure. O Chrony sempre deve ser configurado para usar o /dev/ptp_hyperv link simbólico em vez de /dev/ptp0 ou /dev/ptp1.

Se você estiver tendo problemas em que o dispositivo /dev/ptp_hyperv não é criado, poderá usar a regra udev e as etapas abaixo para configurá-la:

OBSERVAÇÃO: a maioria das distribuições do Linux não deve precisar dessa regra udev, pois ela foi implementada nas versões mais recentes do systemd

Crie o arquivo de regras udev:

$ sudo cat > /etc/udev/rules.d/99-ptp_hyperv.rules << EOF
ACTION!="add", GOTO="ptp_hyperv"
SUBSYSTEM=="ptp", ATTR{clock_name}=="hyperv", SYMLINK += "ptp_hyperv"
LABEL="ptp_hyperv"
EOF

Reinicie a Máquina Virtual ou recarregue as regras de udev com:

$ sudo udevadm control --reload
$ sudo udevadm trigger --subsystem-match=ptp --action=add

chrony

No Ubuntu 19.10 (e versões posteriores) e Red Hat Enterprise Linux 8.x, chrony está configurado para usar um relógio de fonte PTP. Em vez de chrony, as versões mais antigas do Linux usam o daemon de protocolo NTP (ntpd), que não dá suporte a fontes PTP. Para habilitar o PTP nessas versões, o chrony deve ser instalado e configurado manualmente (em chrony.conf) usando a seguinte instrução:

refclock PHC /dev/ptp_hyperv poll 3 dpoll -2 offset 0 stratum 2

Se o symlink /dev/ptp_hyperv estiver disponível, use-o em vez de /dev/ptp0 para evitar qualquer confusão com o dispositivo /dev/ptp criado pelo driver Mellanox mlx5.

As informações de stratum não são passadas automaticamente do host do Azure para a máquina virtual Linux convidada. A linha de configuração anterior especifica que a fonte do tempo de host do Azure deve ser tratada como Estrato 2, que, por sua vez, faz com que o convidado do Linux se reporte como Estrato 3. Você pode alterar a configuração de estrato na linha de configuração se quiser que o convidado do Linux se reporte de forma diferente.

Por padrão, o chronyd acelera ou reduz o relógio do sistema para corrigir qualquer descompasso de tempo. Se o desvio se tornar grande demais, o chrony não conseguirá corrigi-lo. Para superar isso, o parâmetro makestep em /etc/chrony.conf pode ser alterado para forçar uma sincronização de horário se a descompasso exceder o limite especificado.

makestep 1.0 -1

Aqui, o chrony forçará uma atualização da hora se o desvio for maior que 1 segundo. Para aplicar as alterações, reinicie o serviço chronyd:

$ sudo systemctl restart chronyd && sudo systemctl restart chrony

Em alguns casos, o serviço systemd-timesyncd ainda pode estar habilitado e tentando fazer uma sincronização após uma reinicialização, se você ainda estiver vendo mensagens no syslog semelhantes a:

systemd-timesyncd[945]: Network configuration changed, trying to establish connection.
Aug  1 12:59:45 vm-name systemd-timesyncd[945]: Network configuration changed, trying to establish connection.
Aug  1 12:59:45 vm-name systemd-timesyncd[945]: Network configuration changed, trying to establish connection.
Aug  1 12:59:45 vm-name systemd-timesyncd[945]: Network configuration changed, trying to establish connection.
Aug  1 12:59:45 vm-name systemd-timesyncd[945]: Network configuration changed, trying to establish connection.
Aug  1 12:59:45 vm-name systemd-timesyncd[945]: Synchronized to time server 185.125.190.56:123 (ntp.ubuntu.com)

Você pode desabilitá-lo usando:

$ sudo systemctl disable systemd-timesyncd

Na maioria dos casos, systemd-timesyncd tentará durante a inicialização, mas uma vez que chrony for iniciado, ele substituirá e se tornará a fonte de sincronização de horário padrão.

Para obter mais informações sobre o Ubuntu e o NTP, consulte Sincronização de Horário.

Para obter mais informações sobre o Red Hat e NTP, consulte Configurar NTP.

Para mais informações sobre chrony, consulte Usando o chrony.

systemd

Nas versões SUSE e Ubuntu antes da 19.10, a sincronização de tempo é configurada usando systemd. Para obter mais informações sobre o Ubuntu, consulte Sincronização de Horário. Para obter mais informações sobre o SUSE, consulte Sincronização de Tempo no SUSE.

cloud-init

As imagens que usam cloud-init para provisionar a VM podem usar a seção ntp para configurar um serviço de sincronização da hora. Um exemplo de cloud-init instalando chrony e configurando-o para usar a origem do relógio PTP para VMs do Ubuntu:

#cloud-config
ntp:
  enabled: true
  ntp_client: chrony
  config:
    confpath: /etc/chrony/chrony.conf
    packages:
     - chrony
    service_name: chrony
    template: |
       ## template:jinja
       driftfile /var/lib/chrony/chrony.drift
       logdir /var/log/chrony
       maxupdateskew 100.0
       refclock PHC /dev/ptp_hyperv poll 3 dpoll -2 offset 0 stratum 2
       makestep 1.0 -1

Em seguida, você pode codificar em Base64 o cloud-config acima para uso na seção osProfile em um modelo ARM:

[Convert]::ToBase64String((Get-Content -Path ./cloud-config.txt -Encoding Byte))
"osProfile": {
  "customData": "I2Nsb3VkLWNvbmZpZwpudHA6CiAgZW5hYmxlZDogdHJ1ZQogIG50cF9jbGllbnQ6IGNocm9ueQogIGNvbmZpZzoKICAgIGNvbmZwYXRoOiAvZXRjL2Nocm9ueS9jaHJvbnkuY29uZgogICAgcGFja2FnZXM6CiAgICAgLSBjaHJvbnkKICAgIHNlcnZpY2VfbmFtZTogY2hyb255CiAgICB0ZW1wbGF0ZTogfAogICAgICAgIyMgdGVtcGxhdGU6amluamEKICAgICAgIGRyaWZ0ZmlsZSAvdmFyL2xpYi9jaHJvbnkvY2hyb255LmRyaWZ0CiAgICAgICBsb2dkaXIgL3Zhci9sb2cvY2hyb255CiAgICAgICBtYXh1cGRhdGVza2V5IDEwMC4wCiAgICAgICByZWZjbG9jayBQSEMgL2Rldi9wdHBfaHlwZXJ2IHBvbGwgMyBkcG9sbCAtMgogICAgICAgbWFrZXN0ZXAgMS4wIC0x"
}

Para obter mais informações sobre cloud-init no Azure, consulte Visão geral do suporte de cloud-init para VMs do Linux no Azure.

Próximas etapas

Para obter mais informações, consulte Hora precisa para Windows Server 2016.