Felsöka ändringar av enhetsnamn för virtuell Linux-dator

Gäller för: ✔️ Virtuella Linux-datorer

Den här artikeln förklarar varför enhetsnamnen ändras när du har startat om en virtuell Linux-dator eller kopplat om datadiskarna. Artikeln innehåller också lösningar på det här problemet.

Symtom

Du kan få följande problem när du kör virtuella Linux-datorer i Microsoft Azure:

  • Det går inte att starta den virtuella datorn efter en omstart.
  • När datadiskar kopplas från och kopplas tillbaka ändras namnen på diskenheterna.
  • Ett program eller skript som refererar till en disk med enhetsnamnet misslyckas eftersom enhetsnamnet har ändrats.

Orsak

Enhetssökvägar i Linux är inte garanterade att vara konsekventa mellan omstarter. Enhetsnamn består av större siffror (bokstäver) och mindre siffror. När Linux Storage-enhetsdrivrutinen identifierar en ny enhet tilldelar drivrutinen större och mindre nummer från det tillgängliga intervallet till enheten. När en enhet tas bort frigörs enhetsnumren för återanvändning.

Problemet beror på att enhetsgenomsökning i Linux schemaläggs av SCSI-undersystemet så att det sker asynkront. Därför kan namnet på en enhetssökväg variera mellan omstarter.

Lösning

Lös problemet genom att använda enhetsnamn som är beständiga för omstarter. Det finns flera sätt att använda beständig namngivning: efter filsystemetikett, UUID eller efter härledd enhetssökväg. För virtuella Linux-datorer som inte använder Logical Volume Manager (LVM) rekommenderar vi att du använder filsystemets UUID eller länkar som skapats med hjälp av udev-regler. För LVM-baserade filsystem är montering med volymgruppen och namnet på den logiska volymen också en giltig metod, eftersom LVM-objekten förblir konsekventa oavsett hur de fysiska volymerna sorteras.

De flesta distributioner tillhandahåller parametrarna fstab nofail eller nobootwait . Dessa parametrar gör det möjligt för ett system att starta när disken inte kan monteras vid start. Mer information om dessa parametrar finns i distributionsdokumentationen. Information om hur du konfigurerar en virtuell Linux-dator att använda ett UUID när du lägger till en datadisk finns i Ansluta till den virtuella Linux-datorn för att montera den nya disken.

Om du redan har redigerat din fstab på ett sådant sätt att den virtuella datorn inte startar och du inte kan SSH till den virtuella datorn kan du använda seriekonsolen för den virtuella datorn för att gå in i enanvändarläge och ändra din fstab, eller använda Automatisk reparation av Azure Linux för att automatisera reparationsprocessen.

Identifiera disk-LUN

När Azure Linux-agenten installeras på en virtuell dator använder agenten udev-regler för att skapa en uppsättning symboliska länkar under sökvägen /dev/disk/azure , som korrelerar de Azure-definierade LUN-bilagorna till de traditionella diskenheterna:

$ 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

LUN-information från Linux-gästkontot hämtas med hjälp lsscsi av eller ett liknande verktyg:

$ 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

Gäst-LUN-informationen används med Azure-prenumerationsmetadata för att hitta den virtuella hårddisken i Azure Storage som innehåller partitionsdata. Du kan till exempel använda az CLI:

$ 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"
  }
  }
]

Identifiera UUID för filsystem med hjälp av blkid

Program och skript läser utdata blkidfrån , eller liknande informationskällor, för att skapa symboliska länkar i sökvägen /dev. Utdata visar UUID:erna för alla diskar som är anslutna till den virtuella datorn och deras associerade enhetsfil:

$ 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"

Azure Linux-agentens Udev-regler skapar en uppsättning symboliska länkar under sökvägen /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

Program använder länkarna för att identifiera startdiskenheten och resursdisken (tillfälliga). I Azure bör program titta i sökvägarna /dev/disk/azure/root-part1 eller /dev/disk/azure-resource-part1 för att identifiera dessa partitioner.

Eventuella ytterligare partitioner från blkid listan finns på en datadisk. Program underhåller UUID för dessa partitioner och använder en sökväg för att identifiera enhetsnamnet vid körning:

$ 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

Hämta de senaste Azure Storage-reglerna

Kör följande kommandon för att hämta de senaste Azure Storage-reglerna:

# 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

Se även

Mer information finns i följande artiklar:

Kontakta oss om du behöver hjälp

Om du har frågor eller behöver hjälp skapar du en supportbegäran eller frågar Azure Community-support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.