Sdílet prostřednictvím


Synchronizace času pro virtuální počítače s Linuxem v Azure

Upozornění

Tento článek odkazuje na CentOS, což je linuxová distribuce se stavem Konec životnosti (EOL). Zvažte své použití a odpovídajícím způsobem naplánujte. Další informace najdete v doprovodných materiálech CentOS End Of Life.

Platí pro: ✔️ Flexibilní škálovací sady virtuálních ✔️ počítačů s Linuxem – Jednotné škálovací sady ✔️

Synchronizace času je důležitá pro korelaci zabezpečení a událostí. Někdy se používá pro implementaci distribuovaných transakcí. Přesnost času mezi několika počítačovými systémy se dosahuje prostřednictvím synchronizace. Synchronizace může být ovlivněna několika věcmi, včetně restartování a síťového provozu mezi časovým zdrojem a počítačem, který čas načítá.

Azure je podporován infrastrukturou se systémem Windows Server 2016. Windows Server 2016 má vylepšené algoritmy používané ke správnému času a podmínce místních hodin pro synchronizaci se standardem UTC. Funkce Přesný čas Windows Serveru 2016 výrazně zlepšila způsob, jakým služba VMICTimeSync řídí virtuální počítače s hostitelem pro přesný čas. Vylepšení zahrnují přesnější počáteční čas spuštění virtuálního počítače nebo obnovení virtuálního počítače a opravu latence přerušení.

Poznámka:

Rychlý přehled služby Windows Time najdete v tomto videu s přehledem vysoké úrovně.

Další informace najdete v tématu Přesný čas pro Windows Server 2016.

Přehled

Přesnost hodin počítače se měří podle toho, jak blízko jsou hodiny počítače standardem utc (Coordinated Universal Time). UTC je definován nadnárodním vzorkem přesných atomických hodin, které mohou být v 300 letech vypnuty pouze o jednu sekundu. Čtení UTC ale přímo vyžaduje specializovaný hardware. Místo toho se časové servery synchronizují do standardu UTC a jsou přístupné z jiných počítačů, aby poskytovaly škálovatelnost a robustnost. Každý počítač má spuštěnou službu synchronizace času, která ví, jaké časové servery se mají používat, a pravidelně kontroluje, jestli je potřeba opravit hodiny počítače, a v případě potřeby upravit čas.

Hostitelé Azure se synchronizují s interními časovými servery Microsoftu, které zabírají čas ze zařízení Stratum 1 vlastněných Microsoftem s gps anténami. Virtuální počítače v Azure můžou záviset na jejich hostiteli a předávat přesný čas (čas hostitele) na virtuálním počítači nebo virtuální počítač může přímo získat čas z časového serveru nebo kombinace obojího.

Na samostatném hardwaru operační systém Linux načítá pouze hostitelské hardwarové hodiny při spuštění. Potom se hodiny udržují pomocí časovače přerušení v jádru Linuxu. V této konfiguraci se hodiny posunou v průběhu času. V novějších distribucích Linuxu v Azure můžou virtuální počítače používat zprostředkovatele VMICTimeSync, který je součástí integračních služeb Linuxu (LIS), k dotazování na aktualizace hodin z hostitele častěji.

Interakce virtuálních počítačů s hostitelem můžou mít také vliv na hodiny. Během údržby zachování paměti se virtuální počítače pozastaví až na 30 sekund. Například před zahájením údržby se hodiny virtuálního počítače zobrazí 10:00:00 a trvá 28 sekund. Po obnovení virtuálního počítače by se hodiny na virtuálním počítači stále zobrazovaly 10:00:00, což by bylo 28 sekund vypnuté. Aby to bylo správné, služba VMICTimeSync monitoruje, co se děje na hostiteli, a aktualizuje denní hodiny na virtuálních počítačích s Linuxem, aby se kompenzuje.

Bez synchronizace času by se hodiny na virtuálním počítači hromadily chyby. Pokud existuje jenom jeden virtuální počítač, nemusí být účinek významný, pokud úloha nevyžaduje vysoce přesné uchovávání času. Ve většině případů ale máme více vzájemně propojených virtuálních počítačů, které používají čas ke sledování transakcí a čas musí být konzistentní během celého nasazení. Když se čas mezi virtuálními počítači liší, můžete vidět následující efekty:

  • Ověřování se nezdaří. Protokoly zabezpečení, jako je Kerberos nebo technologie závislá na certifikátech, závisí na době konzistentní v rámci systémů.
  • Je těžké zjistit, co se stalo v systému, pokud protokoly (nebo jiná data) nesouhlasí včas. Stejná událost by vypadala jako v různých časech, což ztěžuje korelaci.
  • Pokud jsou hodiny vypnuté, může se fakturace vypočítat nesprávně.

Možnosti konfigurace

Synchronizace času vyžaduje, aby na virtuálním počítači s Linuxem běžela služba synchronizace času a zdroj přesných informací o čase, se kterými se má synchronizovat. Obvykle se ntpd nebo chronyd používá jako služba synchronizace času, i když existují i jiné opensourcové služby synchronizace času, které je možné použít také. Zdrojem přesných informací o čase může být hostitel Azure nebo externí časová služba, ke které se přistupuje přes veřejný internet. Služba VMICTimeSync sama o sobě neposkytuje průběžnou synchronizaci času mezi hostitelem Azure a virtuálním počítačem s Linuxem s výjimkou pozastavení údržby hostitelů, jak je popsáno výše.

V minulosti se většina imagí z Azure Marketplace s Linuxem nakonfigurovala jedním ze dvou způsobů:

  • Ve výchozím nastavení není spuštěná žádná služba synchronizace času
  • Ntpd běží jako služba synchronizace času a synchronizuje se s externím zdrojem času NTP, ke kterému se přistupuje přes síť. Například image Ubuntu 18.04 LTS Marketplace používají ntp.ubuntu.com.

Pokud chcete ověřit, že se ntpd správně synchronizuje, spusťte ntpq -p příkaz.

Některé image z Azure Marketplace s Linuxem se mění tak, aby používaly chronyd jako službu synchronizace času, a chronyd je nakonfigurovaná tak, aby se synchronizovala s hostitelem Azure, a ne s externím zdrojem času NTP. Čas hostitele Azure je obvykle nejlepším zdrojem času pro synchronizaci, protože se udržuje přesně a spolehlivě a je přístupný bez proměnlivých zpoždění sítě, které jsou spojené s přístupem k externímu zdroji času NTP přes veřejný internet.

VMICTimeSync se používá paralelně a poskytuje dvě funkce:

  • Okamžitě aktualizuje denní hodiny virtuálního počítače s Linuxem po události údržby hostitele.
  • Vytvoří instanci zdroje hardwarových hodin protokolu PTP (IEEE 1588 Precision Time Protocol) jako zařízení /dev/ptp, které poskytuje přesný čas dne od hostitele Azure. Chronyd lze nakonfigurovat tak, aby se synchronizoval s tímto časovým zdrojem (což je výchozí konfigurace v nejnovějších imagích Linuxu). Distribuce Linuxu s jádrem 4.11 nebo novější (nebo verze 3.10.0-693 nebo novější pro RHEL/CentOS 7) podporují zařízení /dev/ptp. U starších verzí jádra, které nepodporují /dev/ptp pro čas hostitele Azure, je možná pouze synchronizace s externím zdrojem času.

Výchozí konfiguraci je samozřejmě možné změnit. Starší image, která je nakonfigurovaná pro použití ntpd a externího zdroje času, je možné změnit tak, aby používala chronyd a zařízení /dev/ptp pro čas hostitele Azure. Podobně je možné image využívající čas hostitele Azure prostřednictvím zařízení /dev/ptp nakonfigurovat tak, aby v případě potřeby vaší aplikace nebo úlohy používala externí zdroj času NTP.

Nástroje a prostředky

Existují některé základní příkazy pro kontrolu konfigurace synchronizace času. Dokumentace k distribuci Linuxu obsahuje další podrobnosti o nejlepším způsobu konfigurace synchronizace času pro danou distribuci.

Integrační služby

Zkontrolujte, jestli je načtená integrační služba (hv_utils).

$ sudo lsmod | grep hv_utils

Mělo by se zobrazit něco podobného:

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

Kontrola zdroje hodin PTP

V novějších verzích Linuxu je zdroj hodin PTP (Precision Time Protocol) odpovídající hostiteli Azure dostupný jako součást zprostředkovatele VMICTimeSync. Ve starších verzích Red Hat Enterprise Linuxu nebo CentOS 7.x je možné stáhnout a použít službu Linux Integration Services k instalaci aktualizovaného ovladače. Pokud je k dispozici zdroj hodin PTP, bude zařízení s Linuxem ve formátu /dev/ptpx.

Podívejte se, které zdroje hodin PTP jsou k dispozici.

$ ls /sys/class/ptp

V tomto příkladu je vrácená hodnota ptp0, takže ji použijeme ke kontrole názvu hodin. Pokud chcete zařízení ověřit, zkontrolujte název hodin.

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

To by mělo vrátit hyperv, což znamená hostitele Azure.

V některých virtuálních počítačích s Linuxem se může zobrazit několik zařízení PTP. Jedním z příkladů je akcelerované síťové služby, ovladač Mellanox mlx5 také vytvoří zařízení /dev/ptp. Vzhledem k tomu, že pořadí inicializace se může při každém spuštění Linuxu lišit, může být /dev/ptp0 zařízení PTP odpovídající hostiteli Azure nebo může být /dev/ptp1, což ztěžuje konfiguraci chronyd se správným zdrojem hodin. Pokud chcete tento problém vyřešit, nejnovější image Linuxu mají udev pravidlo, které vytvoří symlink /dev/ptp_hyperv na položku /dev/ptp , která odpovídá hostiteli Azure. Chrony by měl být vždy nakonfigurován tak, aby používal /dev/ptp_hyperv symlink místo /dev/ptp0 nebo /dev/ptp1.

Pokud máte problémy s /dev/ptp_hyperv nevytvořeným zařízením, můžete ho udev nakonfigurovat pomocí následujícího pravidla:

POZNÁMKA: Většina distribucí Linuxu by neměla toto pravidlo udev potřebovat, protože bylo implementováno v novějších verzích systemd.

udev Vytvořte soubor pravidel:

$ 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

Restartujte virtuální počítač NEBO znovu načtěte udev pravidla pomocí:

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

chrony

Na Ubuntu 19.10 a novějších verzích je systém Red Hat Enterprise Linux a CentOS 8.x nakonfigurovaný tak, aby používal zdrojové hodiny PTP. Místo chrony používají starší verze Linuxu démon protokolu NETWORK Time Protocol (ntpd), který nepodporuje zdroje PTP. Pokud chcete v těchto verzích povolit PTP, je potřeba chrony nainstalovat a nakonfigurovat ručně (v souboru chrony.conf) pomocí následujícího příkazu:

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

Pokud je k dispozici /dev/ptp_hyperv symlink, použijte ho místo /dev/ptp0, abyste se vyhnuli nejasnostem se zařízením /dev/ptp vytvořeným ovladačem Mellanox mlx5.

Informace o vrstvě se automaticky nepřenesou z hostitele Azure hostovi Linuxu. Předchozí řádek konfigurace určuje, že se zdroj času hostitele Azure považuje za Stratum 2, což zase způsobí, že host v Linuxu bude hlásit sám sebe jako Stratum 3. Pokud chcete, aby se host v Linuxu hlásil jinak, můžete změnit nastavení vrstvy na řádku konfigurace.

Ve výchozím nastavení chronyd zrychluje nebo zpomaluje systémové hodiny, aby se opravily všechny časové odchylky. Pokud se posun změní na příliš velký, chrony se nepodaří opravit posun. Chcete-li tuto chybu překonat, lze parametr v souboru /etc/chrony.conf změnit tak, makestep aby vynutil synchronizaci času, pokud posun překročí zadanou prahovou hodnotu.

makestep 1.0 -1

V této části chrony vynutí aktualizaci času, pokud je posun větší než 1 sekunda. Pokud chcete změny použít, restartujte službu chronyd:

$ sudo systemctl restart chronyd && sudo systemctl restart chrony

V některých případech může být služba systemd-timesyncd stále povolená a pokouší se provést synchronizaci při restartování, pokud se stále zobrazují zprávy v syslogu, které vypadají podobně jako:

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)

Můžete ho zakázat pomocí:

$ sudo systemctl disable systemd-timesyncd

Ve většině případů se systemd-timesyncd pokusí během spouštění, ale jakmile se chrony spustí, přepíše a stane se výchozím zdrojem synchronizace času.

Další informace o Ubuntu a NTP naleznete v tématu Synchronizace času.

Další informace o nástroji Red Hat a NTP naleznete v tématu Konfigurace protokolu NTP.

Další informace o chrony naleznete v tématu Použití chrony.

systemd

U verzí SUSE a Ubuntu před verzí 19.10 se synchronizace času konfiguruje pomocí systemd. Další informace o Ubuntu naleznete v tématu Synchronizace času. Další informace o SUSE naleznete v části 4.5.8 v SUSE Linux Enterprise Server 12 SP3 zpráva k vydání verze.

cloud-init

Image, které ke zřízení virtuálního počítače používají cloud-init, můžou použít ntp oddíl k nastavení služby synchronizace času. Příklad instalace chrony v cloudu a její konfigurace pro použití zdroje hodin PTP pro virtuální počítače s 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

Pak můžete base64 výše uvedenou cloudovou konfiguraci použít v osProfile části šablony ARM:

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

Další informace o cloud-init v Azure najdete v tématu Přehled podpory cloud-init pro virtuální počítače s Linuxem v Azure.

Další kroky

Další informace najdete v tématu Přesný čas pro Windows Server 2016.