Risolvere i problemi relativi alle modifiche al nome del dispositivo della VM Linux

Questo articolo spiega perché i nomi dei dispositivi cambiano dopo il riavvio di una macchina virtuale Linux o il ricollegamento dei dischi dati. L'articolo fornisce anche soluzioni per questo problema.

Sintomi

Potrebbero verificarsi i seguenti problemi durante l'esecuzione di VM Linux in Microsoft Azure:

  • La macchina virtuale non si avvia dopo un riavvio.
  • Quando i dischi dati vengono scollegati e ricollegati, i nomi dei dispositivi del disco vengono modificati.
  • Un'applicazione o uno script che fa riferimento a un disco utilizzando il nome del dispositivo non riesce perché il nome del dispositivo è stato modificato.

Causa

Non è garantito che i percorsi dei dispositivi in Linux siano coerenti tra i riavvii. I nomi dei dispositivi sono costituiti da numeri maggiori (lettere) e numeri minori. Quando il driver del dispositivo di archiviazione Linux rileva un nuovo dispositivo, il driver assegna al dispositivo numeri principali e secondari dall'intervallo disponibile. Quando un dispositivo viene rimosso, i numeri del dispositivo vengono liberati per il riutilizzo.

Il problema si verifica perché la scansione del dispositivo in Linux è pianificata dal sottosistema SCSI in modo asincrono. Di conseguenza, il nome del percorso di un dispositivo può variare tra i riavvii.

Soluzione

Per risolvere questo problema, utilizzare la denominazione persistente. Per utilizzare la denominazione persistente esistono quattro modi: per etichetta del file system, per UUID, per ID o per percorso. È consigliabile utilizzare l'etichetta del file system o l'UUID per le macchine virtuali Linux di Azure.

La maggior parte delle distribuzioni fornisce i parametri fstabnofail o nobootwait. Questi parametri consentono l'avvio di un sistema quando il montaggio del disco non riesce all'avvio. Controllare la documentazione della distribuzione per ulteriori informazioni su questi parametri. Per informazioni su come configurare una macchina virtuale Linux per utilizzare un UUID quando aggiungi un disco dati, consulta Connettersi alla macchina virtuale Linux per montare il nuovo disco.

Quando l'agente Linux di Azure è installato in una macchina virtuale, l'agente usa le regole Udev per creare un set di collegamenti simbolici nel percorso /dev/disk/azure. Le applicazioni e gli script utilizzano le regole Udev per identificare i dischi collegati alla VM, insieme al tipo di disco e ai LUN del disco.

Se il file fstab è già stato modificato in modo tale che la macchina virtuale non si avvii ed è impossibile accedervi tramite SSH, è possibile utilizzare la Console seriale della macchina virtuale per accedere alla modalità utente singolo e modificare il file fstab.

Identificare i LUN del disco

Le applicazioni utilizzano i LUN per trovare tutti i dischi collegati e per creare collegamenti simbolici. L'agente Linux di Azure include regole Udev che configurano collegamenti simbolici da un LUN ai dispositivi:

$ 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

Le informazioni LUN dall'account Guest Linux vengono recuperate utilizzando lsscsi o uno strumento simile:

$ 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

Le informazioni sulla LUN guest vengono usate con i metadati della sottoscrizione di Azure per individuare il disco rigido virtuale in Archiviazione di Azure che contiene i dati della partizione. Ad esempio, puoi utilizzare la CLI az:

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

Scopri gli UUID del filesystem usando blkid

Le applicazioni e gli script leggono l'output di blkid, o fonti di informazioni simili, per creare collegamenti simbolici nel percorso /dev. L'output mostra gli UUID di tutti i dischi collegati alla VM e il relativo file di dispositivo associato:

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

Le regole Udev dell'agente Linux di Azure creano un set di collegamenti simbolici nel percorso /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

Le applicazioni utilizzano i collegamenti per identificare il dispositivo del disco di avvio e il disco delle risorse (temporaneo). In Azure, le applicazioni devono cercare nei percorsi /dev/disk/azure/root-part1 o /dev/disk/azure-resource-part1 per individuare queste partizioni.

Eventuali partizioni aggiuntive dall'elenco blkid si trovano su un disco dati. Le applicazioni mantengono l'UUID per queste partizioni e utilizzano un percorso per rilevare il nome del dispositivo in fase di esecuzione:

$ 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

Ottieni le regole di archiviazione di Azure più recenti

Per ottenere le regole di archiviazione di Azure più recenti, eseguire i comandi seguenti:

# 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

Vedere anche

Per altre informazioni, vedere gli articoli seguenti:

Contattaci per ricevere assistenza

In caso di domande o bisogno di assistenza, creare una richiesta di supporto tecnico oppure formula una domanda nel Supporto della community di Azure. È possibile anche inviare un feedback sul prodotto al feedback della community di Azure.