Synchronizacja czasu dla maszyn wirtualnych z systemem Linux na platformie Azure

Uwaga

W tym artykule odwołuje się do systemu CentOS — dystrybucji systemu Linux, która zbliża się do stanu zakończenia życia (EOL). Rozważ odpowiednie użycie i zaplanuj. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zakończenia życia systemu CentOS.

Dotyczy: ✔️ Maszyny wirtualne z systemem Linux — elastyczne zestawy ✔️ ✔️ skalowania jednolite zestawy skalowania

Synchronizacja czasu jest ważna dla korelacji zabezpieczeń i zdarzeń. Czasami jest używany do implementacji transakcji rozproszonych. Dokładność czasu między wieloma systemami komputerowym jest osiągana przez synchronizację. Synchronizacja może mieć wpływ na wiele elementów, w tym ponownych rozruchów i ruchu sieciowego między źródłem czasu a komputerem pobierającym czas.

Platforma Azure jest wspierana przez infrastrukturę z systemem Windows Server 2016. System Windows Server 2016 ma ulepszone algorytmy używane do poprawiania czasu i warunku zegara lokalnego do synchronizacji z utc. Funkcja Dokładnego czasu systemu Windows Server 2016 znacznie poprawiła sposób działania usługi VMICTimeSync, która zarządza maszynami wirtualnymi z hostem w celu uzyskania dokładnego czasu. Ulepszenia obejmują dokładniejszy początkowy czas uruchamiania maszyny wirtualnej lub przywracania maszyny wirtualnej i poprawiania opóźnienia przerwań.

Uwaga

Aby zapoznać się z krótkim omówieniem usługi Czas systemu Windows, zapoznaj się z tym ogólnym filmem wideo z omówieniem.

Aby uzyskać więcej informacji, zobacz Dokładny czas dla systemu Windows Server 2016.

Omówienie

Dokładność zegara komputera jest mierzona w sposobie zamknięcia zegara komputera do standardu czasu uniwersalnego koordynowanego (UTC). UTC jest definiowana przez międzynarodową próbkę precyzyjnych zegarów atomowych, które mogą być wyłączone tylko przez jedną sekundę od 300 lat. Jednak odczytywanie czasu UTC bezpośrednio wymaga wyspecjalizowanego sprzętu. Zamiast tego serwery czasu są synchronizowane z czasem UTC i są dostępne z innych komputerów w celu zapewnienia skalowalności i niezawodności. Każdy komputer ma uruchomioną usługę synchronizacji czasu, która wie, jakiego czasu używać serwerów i okresowo sprawdza, czy zegar komputera musi być poprawiony i dostosowuje czas w razie potrzeby.

Hosty platformy Azure są synchronizowane z wewnętrznymi serwerami czasu firmy Microsoft, które zajmują czas z należących do firmy Microsoft urządzeń Stratum 1 z antenami GPS. Maszyny wirtualne na platformie Azure mogą zależeć od hosta, aby przekazać dokładny czas (czas hosta) do maszyny wirtualnej lub maszyny wirtualnej bezpośrednio uzyskać czas z serwera czasu lub kombinacji obu tych elementów.

Na sprzęcie autonomicznym system operacyjny Linux odczytuje tylko zegar sprzętu hosta podczas rozruchu. Następnie zegar jest utrzymywany przy użyciu czasomierza przerwań w jądrze systemu Linux. W tej konfiguracji zegar dryfuje w czasie. W nowszych dystrybucjach systemu Linux na platformie Azure maszyny wirtualne mogą używać dostawcy VMICTimeSync uwzględnionego w usługach integracji systemu Linux (LIS), aby częściej wykonywać zapytania dotyczące aktualizacji zegara z hosta.

Interakcje maszyn wirtualnych z hostem mogą również mieć wpływ na zegar. Podczas konserwacji pamięci maszyny wirtualne są wstrzymywane przez maksymalnie 30 sekund. Na przykład przed rozpoczęciem konserwacji zegar maszyny wirtualnej pokazuje 10:00:00 i trwa 28 sekund. Po wznowieniu maszyny wirtualnej zegar na maszynie wirtualnej nadal będzie pokazywał wartość 10:00:00, co będzie miało wartość 28 sekund. Aby rozwiązać ten problem, usługa VMICTimeSync monitoruje, co dzieje się na hoście i aktualizuje zegar godziny dnia na maszynach wirtualnych z systemem Linux, aby zrekompensować.

Bez pracy synchronizacji czasu zegar na maszynie wirtualnej będzie gromadzić błędy. Jeśli istnieje tylko jedna maszyna wirtualna, efekt może nie być znaczący, chyba że obciążenie wymaga dokładnego utrzymywania czasu. Jednak w większości przypadków mamy wiele połączonych maszyn wirtualnych, które wykorzystują czas do śledzenia transakcji, a czas musi być spójny w całym wdrożeniu. Gdy czas między maszynami wirtualnymi jest inny, można zobaczyć następujące efekty:

  • Uwierzytelnianie zakończy się niepowodzeniem. Protokoły zabezpieczeń, takie jak Kerberos lub technologia zależna od certyfikatów, zależą od czasu spójnego w systemach.
  • Trudno ustalić, co się stało w systemie, jeśli dzienniki (lub inne dane) nie zgadzają się na czas. To samo zdarzenie wyglądałoby tak, jakby miało to miejsce w różnych momentach, co utrudnia korelację.
  • Jeśli zegar jest wyłączony, rozliczenia mogą być obliczane niepoprawnie.

Opcje konfiguracji

Synchronizacja czasu wymaga uruchomienia usługi synchronizacji czasu na maszynie wirtualnej z systemem Linux oraz źródła dokładnych informacji o czasie synchronizacji. Zazwyczaj ntpd lub chronyd jest używany jako usługa synchronizacji czasu, choć istnieją inne usługi synchronizacji czasu open source, które mogą być również używane. Źródłem dokładnych informacji o czasie może być host platformy Azure lub usługa czasu zewnętrznego, która jest dostępna za pośrednictwem publicznego Internetu. Sama usługa VMICTimeSync nie zapewnia ciągłej synchronizacji czasu między hostem platformy Azure i maszyną wirtualną z systemem Linux, z wyjątkiem przerw w konserwacji hosta zgodnie z powyższym opisem.

W przeszłości większość obrazów witryny Azure Marketplace z systemem Linux została skonfigurowana na jeden z dwóch sposobów:

  • Usługa synchronizacji czasu nie jest domyślnie uruchomiona
  • Ntpd działa jako usługa synchronizacji czasu i synchronizuje się z zewnętrznym źródłem czasu NTP, które jest dostępne za pośrednictwem sieci. Na przykład obrazy z witryny Marketplace ubuntu 18.04 LTS używają ntp.ubuntu.com.

Aby potwierdzić, że ntpd jest poprawnie synchronizowany, uruchom ntpq -p polecenie .

Niektóre obrazy witryny Azure Marketplace z systemem Linux są zmieniane tak, aby używały chronometrii jako usługi synchronizacji czasu, a synchronizacja jest skonfigurowana do synchronizacji z hostem platformy Azure, a nie zewnętrznym źródłem czasu NTP. Czas hosta platformy Azure jest zwykle najlepszym źródłem czasu synchronizacji, ponieważ jest on utrzymywany dokładnie i niezawodnie i jest dostępny bez zmiennych opóźnień sieci związanych z dostępem do zewnętrznego źródła czasu NTP przez publiczny Internet.

Funkcja VMICTimeSync jest używana równolegle i udostępnia dwie funkcje:

  • Natychmiast aktualizuje zegar maszyny wirtualnej z systemem Linux po zdarzeniu konserwacji hosta
  • Tworzy wystąpienie źródła zegara zegara sprzętowego IEEE 1588 Precision Time Protocol (PTP) jako /dev/ptp urządzenia, które zapewnia dokładny czas dnia od hosta platformy Azure. Chronyd można skonfigurować do synchronizacji z tym źródłem czasu (co jest domyślną konfiguracją w najnowszych obrazach systemu Linux). Dystrybucje systemu Linux z jądrem w wersji 4.11 lub nowszej (lub w wersji 3.10.0-693 lub nowszej dla systemu RHEL/CentOS 7) obsługują urządzenie /dev/ptp. W przypadku wcześniejszych wersji jądra, które nie obsługują /dev/ptp dla czasu hosta platformy Azure, możliwa jest tylko synchronizacja z zewnętrznym źródłem czasu.

Oczywiście można zmienić konfigurację domyślną. Starszy obraz skonfigurowany do używania ntpd i zewnętrznego źródła czasu można zmienić tak, aby używał chronyd i /dev/ptp urządzenia dla czasu hosta platformy Azure. Podobnie obraz korzystający z czasu hosta platformy Azure za pośrednictwem urządzenia /dev/ptp można skonfigurować do używania zewnętrznego źródła czasu NTP, jeśli jest to wymagane przez aplikację lub obciążenie.

Narzędzia i zasoby

Istnieją pewne podstawowe polecenia służące do sprawdzania konfiguracji synchronizacji czasu. Dokumentacja dystrybucji systemu Linux zawiera więcej szczegółowych informacji na temat najlepszego sposobu konfigurowania synchronizacji czasu dla tej dystrybucji.

Usługi integracji

Sprawdź, czy usługa integracji (hv_utils) jest załadowana.

$ sudo lsmod | grep hv_utils

Powinien zostać wyświetlony komunikat podobny do następującego:

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

Sprawdzanie źródła zegara PTP

W nowszych wersjach systemu Linux źródło zegara protokołu CZASU precyzji (PTP) odpowiadające hostowi platformy Azure jest dostępne jako część dostawcy VMICTimeSync. W starszych wersjach oprogramowania Red Hat Enterprise Linux lub CentOS 7.x można pobrać usługi Linux Integration Services i użyć ich do zainstalowania zaktualizowanego sterownika. Gdy źródło zegara PTP jest dostępne, urządzenie z systemem Linux będzie mieć postać /dev/ptpx.

Zobacz, które źródła zegara PTP są dostępne.

$ ls /sys/class/ptp

W tym przykładzie zwracana wartość to ptp0, więc używamy jej do sprawdzania nazwy zegara. Aby sprawdzić urządzenie, sprawdź nazwę zegara.

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

Powinno to zwrócić wartość hyperv, co oznacza host platformy Azure.

W niektórych maszynach wirtualnych z systemem Linux może być wyświetlanych wiele urządzeń PTP. Jednym z przykładów jest przyspieszona sieć sterownik Mellanox mlx5 tworzy również urządzenie /dev/ptp. Ponieważ kolejność inicjowania może być inna przy każdym uruchomieniu systemu Linux, urządzenie PTP odpowiadające hostowi platformy Azure może być /dev/ptp0 lub może to być /dev/ptp1, co utrudnia skonfigurowanie chronyd przy użyciu poprawnego źródła zegara. Aby rozwiązać ten problem, najnowsze obrazy systemu Linux mają regułę udev , która tworzy link /dev/ptp_hyperv do niezależnie /dev/ptp od tego, który wpis odpowiada hostowi platformy Azure. Funkcja Chrony powinna być zawsze skonfigurowana tak, aby używała symlinku /dev/ptp_hyperv zamiast /dev/ptp0 lub /dev/ptp1.

Jeśli masz problemy z nieutworzonym urządzeniem, możesz użyć poniższej /dev/ptp_hypervudev reguły i kroków, aby ją skonfigurować:

UWAGA: Większość dystrybucji systemu Linux nie powinna potrzebować tej reguły ujmowania, ponieważ została zaimplementowana w nowszych wersjach systemu

udev Utwórz plik reguł:

$ 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

Uruchom ponownie maszynę wirtualną LUB załaduj udev ponownie reguły za pomocą polecenia:

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

chrony

W systemach Ubuntu 19.10 i nowszych system Red Hat Enterprise Linux i CentOS 8.x jest skonfigurowany do używania zegara źródłowego PTP. Zamiast chrony starsze wersje systemu Linux używają demona protokołu czasu sieciowego (ntpd), który nie obsługuje źródeł PTP. Aby włączyć ptP w tych wersjach, chrony muszą być ręcznie zainstalowane i skonfigurowane (w pliku chrony.conf) przy użyciu następującej instrukcji:

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

Jeśli /dev/ptp_hyperv symlink jest dostępny, użyj go zamiast /dev/ptp0, aby uniknąć pomyłek z /dev/ptp urządzenia utworzonego przez sterownik Mellanox mlx5.

Informacje o stratum nie są automatycznie przekazywane z hosta platformy Azure do gościa systemu Linux. Poprzedni wiersz konfiguracji określa, że źródło czasu hosta platformy Azure ma być traktowane jako Stratum 2, co z kolei powoduje, że gość systemu Linux zgłasza się jako Stratum 3. Możesz zmienić ustawienie warstwy w wierszu konfiguracji, jeśli chcesz, aby gość systemu Linux zgłaszał się inaczej.

Domyślnie chronyd przyspiesza lub spowalnia zegar systemowy, aby naprawić dowolny dryf czasu. Jeśli dryf stanie się zbyt duży, chrony nie naprawi dryfu. Aby rozwiązać ten problem, makestep parametr w pliku /etc/chrony.conf można zmienić, aby wymusić synchronizację czasu, jeśli dryf przekroczy określony próg.

makestep 1.0 -1

W tym miejscu chrony wymusi aktualizację czasu, jeśli dryf jest większy niż 1 sekunda. Aby zastosować zmiany, uruchom ponownie usługę chronyd:

$ sudo systemctl restart chronyd && sudo systemctl restart chrony

W niektórych przypadkach usługa systemd-timesyncd może być nadal włączona i próbuje przeprowadzić synchronizację po ponownym uruchomieniu, jeśli nadal widzisz komunikaty w dzienniku systemowym, które wyglądają podobnie do:

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)

Można ją wyłączyć przy użyciu:

$ sudo systemctl disable systemd-timesyncd

W większości przypadków synchronizacja systemd-timesyncd spróbuje podczas rozruchu, ale po uruchomieniu chrony zastąpi i stanie się domyślnym źródłem synchronizacji czasu.

Aby uzyskać więcej informacji na temat systemów Ubuntu i NTP, zobacz Synchronizacja czasu.

Aby uzyskać więcej informacji o systemach Red Hat i NTP, zobacz Konfigurowanie NTP.

Aby uzyskać więcej informacji na temat chrony, zobacz Using chrony (Korzystanie z chrony).

systemd

W wersjach SUSE i Ubuntu przed wersją 19.10 synchronizacja czasu jest skonfigurowana przy użyciu systemu. Aby uzyskać więcej informacji na temat systemu Ubuntu, zobacz Synchronizacja czasu. Aby uzyskać więcej informacji na temat systemu SUSE, zobacz sekcję 4.5.8 w informacjach o wersji systemu SUSE Linux Enterprise Server 12 SP3.

cloud-init

Obrazy korzystające z pakietu cloud-init do aprowizacji maszyny wirtualnej mogą używać ntp sekcji w celu skonfigurowania usługi synchronizacji czasu. Przykład instalowania pliku cloud-init i konfigurowania go do używania źródła zegara PTP dla maszyn wirtualnych z systemem 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

Następnie możesz użyć powyższej konfiguracji cloud-config w bazie danych base64 w osProfile sekcji w szablonie usługi ARM:

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

Aby uzyskać więcej informacji na temat pakietu cloud-init na platformie Azure, zobacz Omówienie obsługi pakietu cloud-init dla maszyn wirtualnych z systemem Linux na platformie Azure.

Następne kroki

Aby uzyskać więcej informacji, zobacz Dokładny czas dla systemu Windows Server 2016.