Dela via


Tidssynkronisering för virtuella Linux-datorer i Azure

Gäller för: ✔️ Flexibla skalningsuppsättningar för virtuella Linux-datorer ✔️ ✔️ Enhetliga skalningsuppsättningar

Tidssynkronisering är viktigt för säkerhet och händelsekorrelation. Ibland används den för implementering av distribuerade transaktioner. Tidsnoggrannhet mellan flera datorsystem uppnås genom synkronisering. Synkronisering kan påverkas av flera saker, inklusive omstarter och nätverkstrafik mellan tidskällan och datorn som hämtar tiden.

Azure backas upp av infrastruktur som kör Windows Server 2016. Windows Server 2016 har förbättrade algoritmer som används för att korrigera tid och villkor för att den lokala klockan ska synkroniseras med UTC. Funktionen För korrekt tid i Windows Server 2016 förbättrades avsevärt hur VMICTimeSync-tjänsten som styr virtuella datorer med värden för korrekt tid. Förbättringarna omfattar mer exakt initial tid vid vm-start eller återställning av virtuell dator och korrigering av avbrottsfördröjning.

Kommentar

En snabb översikt över Tjänsten Windows Time finns i den här översiktsvideon på hög nivå.

Mer information finns i Exakt tid för Windows Server 2016.

Översikt

Noggrannheten för en datorklocka mäts på hur nära datorklockan är enligt UTC-tidsstandarden (Coordinated Universal Time). UTC definieras av ett multinationellt urval av exakta atomiska klockor som bara kan stängas av med en sekund på 300 år. Men att läsa UTC direkt kräver specialiserad maskinvara. I stället synkroniseras tidsservrar till UTC och nås från andra datorer för att ge skalbarhet och robusthet. Varje dator har tidssynkroniseringstjänsten igång som vet vilken tid servrar ska använda och kontrollerar regelbundet om datorklockan behöver korrigeras och justerar tid om det behövs.

Azure-värdar synkroniseras med interna Microsoft-tidsservrar som tar sin tid från Microsoft-ägda Stratum 1-enheter med GPS-antenner. Virtuella datorer i Azure kan antingen vara beroende av att värden skickar rätt tid (värdtid) till den virtuella datorn eller så kan den virtuella datorn få direkt tid från en tidsserver eller en kombination av båda.

På fristående maskinvara läser Linux-operativsystemet bara värdmaskinvarans klocka vid start. Därefter underhålls klockan med hjälp av avbrottstimern i Linux-kerneln. I den här konfigurationen kommer klockan att glida över tid. I nyare Linux-distributioner på Azure kan virtuella datorer använda VMICTimeSync-providern, som ingår i Linux-integreringstjänster (LIS), för att fråga efter klockuppdateringar från värden oftare.

Interaktioner mellan virtuella datorer och värden kan också påverka klockan. Under minnesbevarande underhåll pausas virtuella datorer i upp till 30 sekunder. Innan underhåll påbörjas visar till exempel vm-klockan 10:00:00 och varar i 28 sekunder. När den virtuella datorn har återuppstängts visas klockan på den virtuella datorn fortfarande 10:00:00, vilket skulle vara 28 sekunders avstängning. För att korrigera detta övervakar VMICTimeSync-tjänsten vad som händer på värden och uppdaterar klockan för tid på dagen på virtuella Linux-datorer för att kompensera.

Utan tidssynkronisering skulle klockan på den virtuella datorn ackumulera fel. När det bara finns en virtuell dator kanske effekten inte är betydande om inte arbetsbelastningen kräver mycket exakt tidshållning. Men i de flesta fall har vi flera sammankopplade virtuella datorer som använder tid för att spåra transaktioner och tiden måste vara konsekvent under hela distributionen. När tiden mellan virtuella datorer skiljer sig kan du se följande effekter:

  • Autentiseringen misslyckas. Säkerhetsprotokoll som Kerberos eller certifikatberoende teknik förlitar sig på att tiden är konsekvent mellan systemen.
  • Det är svårt att ta reda på vad som har hänt i ett system om loggar (eller andra data) inte kommer överens i tid. Samma händelse skulle se ut som om den inträffade vid olika tidpunkter, vilket gör korrelationen svår.
  • Om klockan är avstängd kan faktureringen beräknas felaktigt.

Konfigurationsalternativ

Tidssynkronisering kräver att en tidssynkroniseringstjänst körs på den virtuella Linux-datorn, plus en källa med korrekt tidsinformation som ska synkroniseras mot. Vanligtvis används ntpd eller chronyd som tidssynkroniseringstjänst, även om det finns andra tidssynkroniseringstjänster med öppen källkod som också kan användas. Källan till korrekt tidsinformation kan vara Azure-värden eller en extern tidstjänst som nås via det offentliga Internet. I sig själv tillhandahåller VMICTimeSync-tjänsten inte kontinuerlig tidssynkronisering mellan Azure-värden och en virtuell Linux-dator förutom efter pauser för värdunderhåll enligt beskrivningen ovan.

Tidigare har de flesta Azure Marketplace-avbildningar med Linux konfigurerats på något av två sätt:

  • Ingen tidssynkroniseringstjänst körs som standard
  • ntpd körs som tidssynkroniseringstjänst och synkroniseras mot en extern NTP-tidskälla som nås via nätverket. Till exempel använder Ubuntu 18.04 LTS Marketplace-avbildningar ntp.ubuntu.com.

Kontrollera att ntpd synkroniseras korrekt genom att ntpq -p köra kommandot .

Vissa Azure Marketplace-avbildningar med Linux ändras för att använda chronyd som tidssynkroniseringstjänst, och chronyd har konfigurerats för att synkroniseras mot Azure-värden i stället för en extern NTP-tidskälla. Azure-värdtiden är vanligtvis den bästa tidskällan att synkronisera mot, eftersom den underhålls korrekt och tillförlitligt och är tillgänglig utan de variabla nätverksfördröjningar som uppstår vid åtkomst till en extern NTP-tidskälla via det offentliga Internet.

VMICTimeSync används parallellt och innehåller två funktioner:

  • Uppdaterar omedelbart den virtuella Linux-datorns klocka efter en värdunderhållshändelse
  • Instansierar en IEEE 1588 PTP-maskinvaruklockakälla (Precision Time Protocol) som en /dev/ptp-enhet som ger rätt tid på dagen från Azure-värden. Chronyd kan konfigureras att synkroniseras mot den här tidskällan (vilket är standardkonfigurationen i de senaste Linux-avbildningarna). Linux-distributioner med kernelversion 4.11 eller senare (eller version 3.10.0-693 eller senare för RHEL 7) stöder /dev/ptp-enheten. För tidigare kernelversioner som inte stöder /dev/ptp för Azure-värdtiden är det bara möjligt att synkronisera mot en extern tidskälla.

Standardkonfigurationen kan ändras. En äldre avbildning som är konfigurerad att använda ntpd och en extern tidskälla kan ändras så att den använder chronyd och /dev/ptp-enheten för Azure-värdtiden. På samma sätt kan en avbildning som använder Azure-värdtid via en /dev/ptp-enhet konfigureras för att använda en extern NTP-tidskälla om det krävs av ditt program eller din arbetsbelastning.

Verktyg och resurser

Det finns några grundläggande kommandon för att kontrollera tidssynkroniseringskonfigurationen. Dokumentationen för Linux-distribution innehåller mer information om det bästa sättet att konfigurera tidssynkronisering för den distributionen.

Integreringstjänster

Kontrollera om integrationstjänsten (hv_utils) har lästs in.

$ sudo lsmod | grep hv_utils

Du bör se något som liknar detta:

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

Sök efter PTP-klockkälla

Med nyare versioner av Linux är en PTP-klockkälla (Precision Time Protocol) som motsvarar Azure-värden tillgänglig som en del av VMICTimeSync-providern. I äldre versioner av Red Hat Enterprise Linux 7.x kan Linux Integration Services laddas ned och användas för att installera den uppdaterade drivrutinen. När PTP-klockkällan är tillgänglig är Linux-enheten av formatet /dev/ptpx.

Se vilka PTP-klockkällor som är tillgängliga.

$ ls /sys/class/ptp

I det här exemplet är värdet som returneras ptp0, så vi använder det för att kontrollera klocknamnet. Kontrollera klocknamnet för att verifiera enheten.

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

Detta bör returnera hyperv, vilket innebär Azure-värden.

På vissa virtuella Linux-datorer kan du se flera PTP-enheter i listan. Ett exempel är för Accelererat nätverk mellanox mlx5-drivrutinen skapar också en /dev/ptp-enhet. Eftersom initieringsordningen kan vara olika varje gång Linux startar kan PTP-enheten som motsvarar Azure-värden vara /dev/ptp0 eller så kan det vara /dev/ptp1, vilket gör det svårt att konfigurera chronyd med rätt klockkälla. För att lösa det här problemet har de senaste Linux-avbildningarna en udev regel som skapar symlinken /dev/ptp_hyperv till den /dev/ptp post som motsvarar Azure-värden. Chrony bör alltid konfigureras för att använda symlink i /dev/ptp_hyperv stället för /dev/ptp0 eller /dev/ptp1.

Om du har problem med /dev/ptp_hyperv att enheten inte skapas kan du använda udev regeln och stegen nedan för att konfigurera den:

Obs! De flesta Linux-distributioner bör inte behöva den här udev-regeln eftersom den har implementerats i nyare versioner av systemd

udev Skapa regelfilen:

$ 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

Starta om den virtuella datorn eller ladda om udev reglerna med:

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

krony

På Ubuntu 19.10 (och senare versioner) och Red Hat Enterprise Linux 8.x konfigureras chrony att använda en PTP-källklocka. I stället för krony använder äldre Linux-versioner daemon (ntpd) för Network Time Protocol, som inte stöder PTP-källor. Om du vill aktivera PTP i dessa versioner måste chrony installeras och konfigureras manuellt (i chrony.conf) med hjälp av följande instruktion:

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

Om symlinken /dev/ptp_hyperv är tillgänglig använder du den i stället för /dev/ptp0 för att undvika förvirring med den /dev/ptp-enhet som skapats av Mellanox mlx5-drivrutinen.

Stratum-information förmedlas inte automatiskt från Azure-värden till Linux-gästen. Föregående konfigurationsrad anger att Azure-värdens tidskälla ska behandlas som Stratum 2, vilket i sin tur gör att Linux-gästen rapporterar sig själv som Stratum 3. Du kan ändra stratum-inställningen på konfigurationsraden om du vill att Linux-gästen ska rapportera sig själv på ett annat sätt.

Som standard accelererar eller saktar chronyd systemklockan för att åtgärda eventuella tidsavvikelser. Om driften blir för stor kan chrony inte åtgärda driften. För att lösa detta kan parametern makestep i /etc/chrony.conf ändras för att framtvinga en tidssynkronisering om driften överskrider det angivna tröskelvärdet.

makestep 1.0 -1

Här framtvingar chrony en tidsuppdatering om avvikelsen är större än 1 sekund. Om du vill tillämpa ändringarna startar du om chronyd-tjänsten:

$ sudo systemctl restart chronyd && sudo systemctl restart chrony

I vissa fall kan systemd-timesyncd-tjänsten fortfarande vara aktiverad och försöka göra en synkronisering vid en omstart, om du fortfarande ser meddelanden i syslog som ser ut ungefär så här:

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)

Du kan inaktivera det med hjälp av:

$ sudo systemctl disable systemd-timesyncd

I de flesta fall försöker systemd-timesyncd under starten, men när chrony startas skrivs den över och blir standardkällan för tidssynkronisering.

Mer information om Ubuntu och NTP finns i Tidssynkronisering.

Mer information om Red Hat och NTP finns i Konfigurera NTP.

Mer information om krona finns i Använda krona.

systemd

I SUSE- och Ubuntu-versioner före 19.10 konfigureras tidssynkronisering med systemd. Mer information om Ubuntu finns i Tidssynkronisering. Mer information om SUSE finns i Avsnitt 4.5.8 i Viktig information om SUSE Linux Enterprise Server 12 SP3.

cloud-init

Avbildningar som använder cloud-init för att etablera den virtuella datorn kan använda ntp avsnittet för att konfigurera en tidssynkroniseringstjänst. Ett exempel på hur cloud-init installerar chrony och konfigurerar den för att använda PTP-klockkällan för virtuella Ubuntu-datorer:

#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

Du kan sedan base64 ovanstående molnkonfiguration för användning i osProfile avsnittet i en ARM-mall:

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

Mer information om cloud-init på Azure finns i Översikt över cloud-init-stöd för virtuella Linux-datorer i Azure.

Nästa steg

Mer information finns i Exakt tid för Windows Server 2016.