Felsöka ändringar av enhetsnamn för virtuella Linux-datorer

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

Symptom

Du kan uppleva 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 på nytt ändras diskenhetsnamnen.
  • 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 konsekventa mellan omstarter. Enhetsnamn består av större siffror (bokstäver) och mindre siffror. När Enhetsdrivrutinen för Linux-lagring 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 olika omstarter.

Lösning

Lös problemet genom att använda beständig namngivning. Det finns fyra sätt att använda beständig namngivning: efter filsystemetikett, UUID, ID eller sökväg. Vi rekommenderar att du använder filsystemetiketten eller UUID för virtuella Azure Linux-datorer.

De flesta distributioner tillhandahåller parametrarna fstabnofail 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 för 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.

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. Program och skript använder Udev-regler för att identifiera diskar som är anslutna till den virtuella datorn, tillsammans med disktyp och disk-LUN.

Om du redan har redigerat 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 virtuella datorer för att ange enanvändarläge och ändra din fstab.

Identifiera disk-LUN

Program använder LUN för att hitta alla anslutna diskar och för att skapa symboliska länkar. Azure Linux-agenten innehåller Udev-regler som konfigurerar symboliska länkar från ett LUN till enheterna:

$ 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:erna för filsystemet 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"

Udev-reglerna för Azure Linux-agenten 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ällig). 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 listan blkid 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 för att få hjälp

Om du har frågor eller behöver hjälp skapar du en supportförfrågan eller frågar Azure community support. Du kan också skicka produktfeedback till Azure-feedbackcommunityn.