Rozwiązywanie problemów ze zmianami nazwy urządzenia maszyny wirtualnej z systemem Linux

W tym artykule wyjaśniono, dlaczego nazwy urządzeń zmieniają się po ponownym uruchomieniu maszyny wirtualnej z systemem Linux lub ponownym dołączaniu dysków danych. Ten artykuł zawiera również rozwiązania tego problemu.

Symptomy

Podczas uruchamiania maszyn wirtualnych z systemem Linux na platformie Microsoft Azure mogą wystąpić następujące problemy:

  • Rozruch maszyny wirtualnej nie powiedzie się po ponownym uruchomieniu.
  • Gdy dyski danych zostaną odłączone i ponownie dołączone, nazwy urządzeń dysków zostaną zmienione.
  • Aplikacja lub skrypt odwołujące się do dysku przy użyciu nazwy urządzenia kończy się niepowodzeniem, ponieważ nazwa urządzenia uległa zmianie.

Przyczyna

Ścieżki urządzeń w systemie Linux nie mają gwarancji spójności w przypadku ponownych uruchomień. Nazwy urządzeń składają się z cyfr głównych (liter) i pomocniczych. Gdy sterownik urządzenia magazynu systemu Linux wykryje nowe urządzenie, sterownik przypisuje do urządzenia numery główne i pomocnicze z dostępnego zakresu. Po usunięciu urządzenia numery urządzeń są zwalniane do ponownego użycia.

Problem występuje, ponieważ skanowanie urządzeń w systemie Linux jest zaplanowane przez podsystem SCSI asynchronicznie. W związku z tym nazwa ścieżki urządzenia może się różnić w zależności od ponownego uruchomienia.

Rozwiązanie

Aby rozwiązać ten problem, użyj trwałego nazewnictwa. Istnieją cztery sposoby używania trwałego nazewnictwa: według etykiety systemu plików, identyfikatora UUID, identyfikatora lub ścieżki. Zalecamy używanie etykiety systemu plików lub identyfikatora UUID dla maszyn wirtualnych z systemem Linux platformy Azure.

Większość dystrybucji udostępnia fstab parametry nofail lub nobootwait. Te parametry umożliwiają rozruch systemu, gdy nie można zainstalować dysku podczas uruchamiania. Zapoznaj się z dokumentacją dystrybucji, aby uzyskać więcej informacji na temat tych parametrów. Aby uzyskać informacje na temat konfigurowania maszyny wirtualnej z systemem Linux do używania identyfikatora UUID podczas dodawania dysku danych, zobacz Łączenie z maszyną wirtualną z systemem Linux w celu zainstalowania nowego dysku.

Gdy agent systemu Azure Linux jest zainstalowany na maszynie wirtualnej, agent używa reguł Udev do konstruowania zestawu łączy symbolicznych w ścieżce /dev/disk/azure. Aplikacje i skrypty używają reguł Udev do identyfikowania dysków dołączonych do maszyny wirtualnej wraz z typem dysku i jednostkami LUN dysku.

Jeśli karta fstab została już edytowana w taki sposób, że maszyna wirtualna nie jest uruchamiana i nie możesz nawiązać połączenia SSH z maszyną wirtualną, możesz użyć konsoli szeregowej maszyny wirtualnej , aby wprowadzić tryb pojedynczego użytkownika i zmodyfikować kartę fstab.

Identyfikowanie jednostek LUN dysku

Aplikacje używają jednostek LUN do znajdowania wszystkich dołączonych dysków i tworzenia łączy symbolicznych. Agent platformy Azure z systemem Linux zawiera reguły Udev, które konfigurują linki symboliczne z jednostki LUN do urządzeń:

$ tree /dev/disk/azure

/dev/disk/azure
├── resource -> ../../sdb
├── resource-part1 -> ../../sdb1
├── root -> ../../sda
├── root-part1 -> ../../sda1
└── scsi1
    ├── lun0 -> ../../../sdc
    ├── lun0-part1 -> ../../../sdc1
    ├── lun1 -> ../../../sdd
    ├── lun1-part1 -> ../../../sdd1
    ├── lun1-part2 -> ../../../sdd2
    └── lun1-part3 -> ../../../sdd3

Informacje o jednostkach LUN z konta gościa systemu Linux są pobierane za pomocą lsscsi narzędzia lub podobnego narzędzia:

$ sudo lsscsi

[1:0:0:0] cd/dvd Msft Virtual CD/ROM 1.0 /dev/sr0

[2:0:0:0] disk Msft Virtual Disk 1.0 /dev/sda

[3:0:1:0] disk Msft Virtual Disk 1.0 /dev/sdb

[5:0:0:0] disk Msft Virtual Disk 1.0 /dev/sdc

[5:0:0:1] disk Msft Virtual Disk 1.0 /dev/sdd

Informacje o jednostce LUN gościa są używane z metadanymi subskrypcji platformy Azure w celu zlokalizowania dysku VHD w usłudze Azure Storage zawierającego dane partycji. Możesz na przykład użyć interfejsu wiersza az polecenia:

$ az vm show --resource-group testVM --name testVM | jq -r .storageProfile.dataDisks
[
{
"caching": "None",
  "createOption": "empty",
"diskSizeGb": 1023,
  "image": null,
"lun": 0,
"managedDisk": null,
"name": "testVM-20170619-114353",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-114353.vhd"
}
},
{
"caching": "None",
"createOption": "empty",
"diskSizeGb": 512,
"image": null,
"lun": 1,
"managedDisk": null,
"name": "testVM-20170619-121516",
"vhd": {
  "uri": "https://testVM.blob.core.windows.net/vhd/testVM-20170619-121516.vhd"
  }
  }
]

Odnajdywanie identyfikatorów UUID systemu plików przy użyciu metody blkid

Aplikacje i skrypty odczytują dane wyjściowe blkidlub podobne źródła informacji, aby utworzyć łącza symboliczne w ścieżce /dev. Dane wyjściowe pokazują identyfikatory UUID wszystkich dysków dołączonych do maszyny wirtualnej i skojarzonego z nimi pliku urządzenia:

$ sudo blkid -s UUID

/dev/sr0: UUID="120B021372645f72"
/dev/sda1: UUID="52c6959b-79b0-4bdd-8ed6-71e0ba782fb4"
/dev/sdb1: UUID="176250df-9c7c-436f-94e4-d13f9bdea744"
/dev/sdc1: UUID="b0048738-4ecc-4837-9793-49ce296d2692"

Reguły Udev agenta platformy Azure linux konstruują zestaw łączy symbolicznych w ścieżce /dev/disk/azure:

$ ls -l /dev/disk/azure

total 0
lrwxrwxrwx 1 root root  9 Jun  2 23:17 resource -> ../../sdb
lrwxrwxrwx 1 root root 10 Jun  2 23:17 resource-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 Jun  2 23:17 root -> ../../sda
lrwxrwxrwx 1 root root 10 Jun  2 23:17 root-part1 -> ../../sda1

Aplikacje używają linków do identyfikowania urządzenia dysku rozruchowego i dysku zasobu (efemerycznego). Na platformie Azure aplikacje powinny znajdować się w ścieżkach /dev/disk/azure/root-part1 lub /dev/disk/azure-resource-part1, aby odnaleźć te partycje.

Wszelkie dodatkowe partycje z blkid listy znajdują się na dysku danych. Aplikacje obsługują identyfikator UUID dla tych partycji i używają ścieżki do odnajdywania nazwy urządzenia w czasie wykonywania:

$ ls -l /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692

lrwxrwxrwx 1 root root 10 Jun 19 15:57 /dev/disk/by-uuid/b0048738-4ecc-4837-9793-49ce296d2692 -> ../../sdc1

Pobieranie najnowszych reguł usługi Azure Storage

Aby uzyskać najnowsze reguły usługi Azure Storage, uruchom następujące polecenia:

# sudo curl -o /etc/udev/rules.d/66-azure-storage.rules https://raw.githubusercontent.com/Azure/WALinuxAgent/master/config/66-azure-storage.rules
# sudo udevadm trigger --subsystem-match=block

Zobacz też

Aby uzyskać więcej informacji, zapoznaj się z następującymi artykułami:

Skontaktuj się z nami, aby uzyskać pomoc

Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii platformy Azure.