Risolvere il problema dei nomi di dispositivo nelle macchine virtuali Linux
Si applica a: ✔️ macchine virtuali Linux
Questo articolo spiega i motivi per cui i nomi dei dispositivi cambiano dopo il riavvio di una macchina virtuale Linux o quando i dischi vengono ricollegati. L'articolo offre anche alcune soluzioni per questo problema.
Sintomi
Durante l'esecuzione di macchine virtuali Linux in Microsoft Azure possono verificarsi i problemi seguenti:
- La macchina virtuale non si avvia dopo il riavvio.
- Se i dischi dati vengono scollegati e quindi ricollegati, i nomi dei dispositivi disco cambiano.
- Dato che il nome dei dispositivi è cambiato, le applicazioni e gli script che fanno riferimento a un disco tramite il nome del dispositivo non funzionano più.
Causa
La coerenza dei percorsi dei dispositivi in Linux tra un riavvio e l'altro non è garantita. I nomi dei dispositivi sono costituiti da numeri principali (lettere) e numeri secondari. Quando il driver dei dispositivi di archiviazione Linux rileva un nuovo dispositivo, assegna a quest'ultimo un numero di dispositivo principale e uno secondario, ricavandoli dall'intervallo disponibile. Quando un dispositivo viene rimosso, i numeri del dispositivo vengono liberati e possono essere usati di nuovo.
Il problema si verifica perché l'analisi dei dispositivi in Linux, programmata dal sottosistema SCSI, viene eseguita in modo asincrono. Di conseguenza, il nome di percorso di un dispositivo può variare da un riavvio a un altro.
Soluzione
Per risolvere questo problema, usare i nomi dei dispositivi persistenti tra i riavvii. Esistono diversi modi per usare la denominazione permanente: per etichetta del file system, per UUID o per percorso del dispositivo derivato. Per le macchine virtuali Linux che non usano Gestione volumi logici (LVM), è consigliabile usare l'UUID del file system o i collegamenti creati usando le regole udev. Per i file system basati su LVM, il montaggio con il gruppo di volumi e il nome del volume logico è anche un approccio valido, poiché gli oggetti LVM rimangono coerenti indipendentemente dalla modalità di ordinamento dei volumi fisici.
La maggior parte delle distribuzioni fornisce i fstab
parametri nofail o nobootwait . Questi parametri consentono l'avvio di un sistema quando il montaggio del disco in fase di avvio non riesce. Per altre informazioni su questi parametri, vedere la documentazione della distribuzione in uso. Per informazioni su come configurare una macchina virtuale Linux per l'uso di un UUID quando si aggiunge un disco dati, vedere Connettersi alla VM Linux per montare il nuovo disco.
Se fstab è già stato modificato in modo che la macchina virtuale non venga avviata e non sia possibile connettersi tramite SSH alla macchina virtuale, è possibile usare la console seriale della macchina virtuale per entrare in modalità utente singolo e modificare il file fstab oppure usare Ripristino automatico Linux di Azure per automatizzare il processo di ripristino.
Identificare i LUN del disco
Quando l'agente Linux di Azure viene installato in una macchina virtuale, l'agente usa regole udev per costruire un set di collegamenti simbolici nel percorso /dev/disk/azure , che correla gli allegati LUN definiti da Azure ai dispositivi disco tradizionali:
$ 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 possono essere recuperate tramite lsscsi
o con uno strumento analogo:
$ 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 LUN guest vengono usate con i metadati di sottoscrizione di Azure per individuare il disco rigido virtuale nell'Archiviazione di Azure che contiene i dati della partizione. È ad esempio possibile usare l'interfaccia della riga di comando 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"
}
}
]
Individuare l'UUID del file system 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 visualizza l'UUID di tutti i dischi collegati alla macchina virtuale e i file di dispositivo associati:
$ 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 usano i collegamenti per identificare il dispositivo del disco di avvio e il disco della risorsa (temporaneo). Per individuare le partizioni in Azure, le applicazioni devono fare riferimento al percorso /dev/disk/azure/root-part1 o /dev/disk/azure-resource-part1.
Eventuali partizioni aggiuntive dell'elenco blkid
si trovano in un disco dati. Le applicazioni mantengono l'UUID per tali partizioni e usano un percorso simile al seguente per individuare il nome del dispositivo in runtime:
$ 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
Ottenere 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
Vedi anche
Per altre informazioni, vedere gli articoli seguenti:
- Ubuntu: uso di UUID
- Red Hat: Persistent naming (Red Hat: denominazione persistente)
- Linux: operazioni eseguibili con le UUID
- Udev: Introduction to device management in a modern Linux system (Udev: introduzione alla gestione dei dispositivi in un sistema Linux moderno)
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.