Tijdsynchronisatie voor Virtuele Linux-machines in Azure

Let op

In dit artikel wordt verwezen naar CentOS, een Linux-distributie die de status End Of Life (EOL) nadert. Houd rekening met uw gebruik en plan dienovereenkomstig. Zie de Richtlijnen voor het einde van de levensduur van CentOS voor meer informatie.

Van toepassing op: ✔️ Flexibele schaalsets ✔️ voor Linux-VM's ✔️ Uniform-schaalsets

Tijdsynchronisatie is belangrijk voor beveiligings- en gebeurteniscorrelatie. Soms wordt deze gebruikt voor implementatie van gedistribueerde transacties. De nauwkeurigheid van de tijd tussen meerdere computersystemen wordt bereikt via synchronisatie. Synchronisatie kan worden beïnvloed door meerdere dingen, waaronder opnieuw opstarten en netwerkverkeer tussen de tijdsbron en de computer die de tijd ophaalt.

Azure wordt ondersteund door een infrastructuur met Windows Server 2016. Windows Server 2016 heeft verbeterde algoritmen gebruikt om de tijd te corrigeren en de lokale klok te synchroniseren met UTC. De functie Nauwkeurige tijd van Windows Server 2016 is aanzienlijk verbeterd hoe de VMICTimeSync-service die vm's beheert met de host voor nauwkeurige tijd. Verbeteringen omvatten nauwkeurigere initiële tijd bij het starten of herstellen van vm's en het onderbreken van latentiecorrectie.

Notitie

Bekijk deze overzichtsvideo op hoog niveau voor een kort overzicht van de Windows Time-service.

Zie Nauwkeurige tijd voor Windows Server 2016 voor meer informatie.

Overzicht

Nauwkeurigheid voor een computerklok wordt gemeten over hoe dicht de computerklok is op de tijdstandaard Coordinated Universal Time (UTC). UTC wordt gedefinieerd door een multinationale steekproef van nauwkeurige atoomklokken die in 300 jaar slechts met één seconde kunnen worden uitgeschakeld. Het lezen van UTC vereist echter rechtstreeks gespecialiseerde hardware. In plaats daarvan worden tijdservers gesynchroniseerd met UTC en worden ze geopend vanaf andere computers om schaalbaarheid en robuustheid te bieden. Elke computer heeft tijdsynchronisatieservice die weet welke tijd servers moeten gebruiken en controleert regelmatig of de computerklok moet worden gecorrigeerd en past zo nodig de tijd aan.

Azure-hosts worden gesynchroniseerd met interne Microsoft-tijdservers die hun tijd nemen vanaf Stratum 1-apparaten die eigendom zijn van Microsoft, met GPS-antennes. Virtuele machines in Azure kunnen afhankelijk zijn van hun host om de nauwkeurige tijd (hosttijd) door te geven aan de virtuele machine of de VIRTUELE machine kan rechtstreeks tijd ophalen van een tijdserver of een combinatie van beide.

Op zelfstandige hardware leest het Linux-besturingssysteem alleen de klok van de hosthardware tijdens het opstarten. Daarna wordt de klok onderhouden met behulp van de interrupttimer in de Linux-kernel. In deze configuratie zal de klok in de loop van de tijd afdrijven. In nieuwere Linux-distributies in Azure kunnen VM's de VMICTimeSync-provider gebruiken, opgenomen in de Linux-integratieservices (LIS), om vaker op klokupdates van de host te zoeken.

Interacties van virtuele machines met de host kunnen ook van invloed zijn op de klok. Tijdens onderhoud met geheugenbehoud worden VM's maximaal 30 seconden onderbroken. Voordat het onderhoud bijvoorbeeld begint met de klok van de VIRTUELE machine, wordt 10:00:00 uur weergegeven en duurt het 28 seconden. Nadat de VIRTUELE machine is hervat, wordt de klok op de virtuele machine nog steeds 10:00:00 uur weergegeven. Dit is 28 seconden uitgeschakeld. Om dit te corrigeren, controleert de VMICTimeSync-service wat er gebeurt op de host en werkt de klok van de dag bij in Linux-VM's om te compenseren.

Als de tijdsynchronisatie niet werkt, zou de klok op de virtuele machine fouten verzamelen. Als er slechts één VIRTUELE machine is, is het effect mogelijk niet significant, tenzij de workload zeer nauwkeurige tijdregistratie vereist. Maar in de meeste gevallen hebben we meerdere, onderling verbonden VM's die tijd gebruiken om transacties bij te houden en de tijd moet consistent zijn gedurende de hele implementatie. Wanneer de tijd tussen VM's verschilt, ziet u de volgende effecten:

  • Verificatie mislukt. Beveiligingsprotocollen zoals Kerberos of certificaatafhankelijke technologie zijn afhankelijk van tijd die consistent is in de systemen.
  • Het is moeilijk te achterhalen wat er in een systeem is gebeurd als logboeken (of andere gegevens) het niet op tijd eens zijn. Dezelfde gebeurtenis zou er op verschillende momenten uitzien, waardoor correlatie moeilijk is.
  • Als de klok is uitgeschakeld, kan de facturering onjuist worden berekend.

Configuratieopties

Tijdsynchronisatie vereist dat een tijdsynchronisatieservice wordt uitgevoerd op de Virtuele Linux-machine, plus een bron van nauwkeurige tijdgegevens waarmee moet worden gesynchroniseerd. Doorgaans wordt ntpd of chronyd gebruikt als de tijdsynchronisatieservice, hoewel er andere opensource-tijdsynchronisatieservices zijn die ook kunnen worden gebruikt. De bron van nauwkeurige tijdgegevens kan de Azure-host of een externe tijdservice zijn die toegankelijk is via het openbare internet. De VMICTimeSync-service biedt op zichzelf geen doorlopende tijdsynchronisatie tussen de Azure-host en een Linux-VM, behalve na pauzes voor hostonderhoud, zoals hierboven beschreven.

De meeste Azure Marketplace-installatiekopieën met Linux zijn in het verleden op twee manieren geconfigureerd:

  • Er wordt standaard geen tijdsynchronisatieservice uitgevoerd
  • ntpd wordt uitgevoerd als de tijdsynchronisatieservice en wordt gesynchroniseerd met een externe NTP-tijdbron die via het netwerk wordt geopend. Ubuntu 18.04 LTS Marketplace-installatiekopieën maken bijvoorbeeld gebruik van ntp.ubuntu.com.

Voer de ntpq -p opdracht uit om te bevestigen dat ntpd correct wordt gesynchroniseerd.

Sommige Azure Marketplace-installatiekopieën met Linux worden gewijzigd om chronyd te gebruiken als de tijdsynchronisatieservice en chronyd is geconfigureerd om te synchroniseren met de Azure-host in plaats van een externe NTP-tijdbron. De Azure-hosttijd is meestal de beste tijdbron om mee te synchroniseren, omdat deze nauwkeurig en betrouwbaar wordt onderhouden en toegankelijk is zonder dat de variabele netwerkvertragingen inherent zijn aan het openen van een externe NTP-tijdbron via het openbare internet.

VMICTimeSync wordt parallel gebruikt en biedt twee functies:

  • De tijd van de dagklok van de Linux-VM onmiddellijk bijwerken na een hostonderhoudsgebeurtenis
  • Instantieert een IEEE 1588 Precision Time Protocol -hardwareklokbron (PTP) als een /dev/ptp-apparaat dat de nauwkeurige tijd van de dag van de Azure-host biedt. Chronyd kan worden geconfigureerd om te synchroniseren met deze tijdbron (dit is de standaardconfiguratie in de nieuwste Linux-installatiekopieën). Linux-distributies met kernelversie 4.11 of hoger (of versie 3.10.0-693 of hoger voor RHEL/CentOS 7) ondersteunen het /dev/ptp-apparaat. Voor eerdere kernelversies die geen ondersteuning bieden voor /dev/ptp voor Azure-hosttijd, is alleen synchronisatie met een externe tijdbron mogelijk.

De standaardconfiguratie kan natuurlijk worden gewijzigd. Een oudere installatiekopie die is geconfigureerd voor gebruik van ntpd en een externe tijdbron, kan worden gewijzigd om chronyd en het /dev/ptp-apparaat te gebruiken voor azure-hosttijd. Op dezelfde manier kan een installatiekopie met behulp van Azure-hosttijd via een /dev/ptp-apparaat worden geconfigureerd voor het gebruik van een externe NTP-tijdbron, indien vereist door uw toepassing of workload.

Hulpprogramma's en resources

Er zijn enkele basisopdrachten voor het controleren van uw tijdsynchronisatieconfiguratie. Documentatie voor Linux-distributie bevat meer informatie over de beste manier om tijdsynchronisatie voor die distributie te configureren.

Integratieservices

Controleer of de integratieservice (hv_utils) is geladen.

$ sudo lsmod | grep hv_utils

U krijgt iets te zien zoals dit:

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

Controleren op PTP Klokbron

Met nieuwere versies van Linux is een PTP-klokbron (Precision Time Protocol) die overeenkomt met de Azure-host beschikbaar als onderdeel van de VMICTimeSync-provider. In oudere versies van Red Hat Enterprise Linux of CentOS 7.x kunnen de Linux Integration Services worden gedownload en gebruikt om het bijgewerkte stuurprogramma te installeren. Wanneer de PTP-klokbron beschikbaar is, is het Linux-apparaat van de vorm /dev/ptpx.

Bekijk welke PTP-klokbronnen beschikbaar zijn.

$ ls /sys/class/ptp

In dit voorbeeld is de geretourneerde waarde ptp0, dus we gebruiken deze om de kloknaam te controleren. Als u het apparaat wilt controleren, controleert u de kloknaam.

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

Dit moet worden geretourneerd hyperv, wat betekent dat de Azure-host.

In sommige Linux-VM's ziet u mogelijk meerdere PTP-apparaten. Een voorbeeld hiervan is dat het Mellanox mlx5-stuurprogramma voor versneld netwerken ook een /dev/ptp-apparaat maakt. Omdat de initialisatievolgorde elke keer kan verschillen wanneer Linux wordt opgestart, kan het PTP-apparaat dat overeenkomt met de Azure-host, of /dev/ptp0 het kan zijn /dev/ptp1, waardoor het moeilijk is om te configureren chronyd met de juiste klokbron. Om dit probleem op te lossen, hebben de meest recente Linux-installatiekopieën een udev regel waarmee de symlink /dev/ptp_hyperv wordt gemaakt naar de vermelding die /dev/ptp overeenkomt met de Azure-host. Chrony moet altijd worden geconfigureerd voor het gebruik van de /dev/ptp_hyperv symlink in plaats van /dev/ptp0 of /dev/ptp1.

Als u problemen ondervindt met het niet maken van het /dev/ptp_hyperv apparaat, kunt u de udev regel en de onderstaande stappen gebruiken om het te configureren:

OPMERKING: De meeste Linux-distributies mogen deze udev-regel niet nodig hebben omdat deze is geïmplementeerd in nieuwere versies van het systeem

Maak het udev regelsbestand:

$ 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

Start de virtuele machine opnieuw op of laad de udev regels opnieuw met:

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

Chrony

Op Ubuntu 19.10 en hoger is Red Hat Enterprise Linux en CentOS 8.x geconfigureerd voor het gebruik van een PTP-bronklok. In plaats van chrony gebruiken oudere Linux-releases de Network Time Protocol-daemon (ntpd), die geen ondersteuning biedt voor PTP-bronnen. Als u PTP in deze releases wilt inschakelen, moet chrony handmatig worden geïnstalleerd en geconfigureerd (in chrony.conf) met behulp van de volgende instructie:

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

Als de symlink /dev/ptp_hyperv beschikbaar is, gebruikt u deze in plaats van /dev/ptp0 om verwarring te voorkomen met het /dev/ptp-apparaat dat is gemaakt door het Mellanox mlx5-stuurprogramma.

Stratum-informatie wordt niet automatisch overgebracht van de Azure-host naar de Linux-gast. De voorgaande configuratieregel geeft aan dat de Azure-hosttijdbron moet worden behandeld als Stratum 2, waardoor de Linux-gast zichzelf weer rapporteert als Stratum 3. U kunt de stratum-instelling in de configuratieregel wijzigen als u wilt dat de Linux-gast zichzelf anders rapporteert.

Chronyd versnelt of vertraagt de systeemklok standaard om tijdsdrift op te lossen. Als de drift te groot wordt, kan de drift niet worden hersteld. Om dit te verhelpen, kan de makestep parameter in /etc/chrony.conf worden gewijzigd om een tijdsynchronisatie af te dwingen als de drift de opgegeven drempelwaarde overschrijdt.

makestep 1.0 -1

Hier dwingt chrony een tijdupdate af als de drift groter is dan 1 seconde. Als u de wijzigingen wilt toepassen, start u de chronyd-service opnieuw op:

$ sudo systemctl restart chronyd && sudo systemctl restart chrony

In sommige gevallen is de systemd-timesyncd-service mogelijk nog steeds ingeschakeld en probeert een synchronisatie uit te voeren bij het opnieuw opstarten, als u nog steeds berichten in syslog ziet die er ongeveer als volgt uitzien:

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)

U kunt dit uitschakelen met behulp van:

$ sudo systemctl disable systemd-timesyncd

In de meeste gevallen wordt systemd-timesyncd geprobeerd tijdens het opstarten, maar zodra chrony wordt gestart, wordt het overschreven en wordt het de standaardbron voor tijdsynchronisatie.

Zie Tijdsynchronisatie voor meer informatie over Ubuntu en NTP.

Zie NTP configureren voor meer informatie over Red Hat en NTP.

Zie Chrony gebruiken voor meer informatie over chrony.

systemd

In SUSE- en Ubuntu-releases vóór 19.10 wordt tijdsynchronisatie geconfigureerd met behulp van een systeem. Zie Tijdsynchronisatie voor meer informatie over Ubuntu. Zie sectie 4.5.8 in de releaseopmerkingen van SUSE Linux Enterprise Server 12 SP3 voor meer informatie over SUSE.

cloud-init

Installatiekopieën die gebruikmaken van cloud-init om de VIRTUELE machine in te richten, kunnen de ntp sectie gebruiken om een tijdsynchronisatieservice in te stellen. Een voorbeeld van cloud-init-installatie van chrony en deze configureren voor het gebruik van de PTP-klokbron voor Ubuntu-VM's:

#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

Vervolgens kunt u de bovenstaande cloudconfiguratie base64 baseren voor gebruik in de osProfile sectie in een ARM-sjabloon:

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

Zie Overzicht van cloud-init-ondersteuning voor Linux-VM's in Azure voor meer informatie over cloud-init in Azure.

Volgende stappen

Zie Nauwkeurige tijd voor Windows Server 2016 voor meer informatie.