Risolvere il problema dei nomi di dispositivo nelle macchine virtuali LinuxTroubleshoot Linux VM device name changes

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.This article explains why device names change after you restart a Linux VM or reattach the data disks. L'articolo offre anche alcune soluzioni per questo problema.The article also provides solutions for this problem.

SintomiSymptoms

Durante l'esecuzione di macchine virtuali Linux in Microsoft Azure possono verificarsi i problemi seguenti:You may experience the following problems when running Linux VMs in Microsoft Azure:

  • La macchina virtuale non si avvia dopo il riavvio.The VM fails to boot after a restart.
  • Se i dischi dati vengono scollegati e quindi ricollegati, i nomi dei dispositivi disco cambiano.When data disks are detached and reattached, the disk device names are changed.
  • 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ù.An application or script that references a disk by using the device name fails because the device name has changed.

CausaCause

La coerenza dei percorsi dei dispositivi in Linux tra un riavvio e l'altro non è garantita.Device paths in Linux aren't guaranteed to be consistent across restarts. I nomi dei dispositivi sono costituiti da numeri principali (lettere) e numeri secondari.Device names consist of major numbers (letters) and minor numbers. 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.When the Linux storage device driver detects a new device, the driver assigns major and minor numbers from the available range to the device. Quando un dispositivo viene rimosso, i numeri del dispositivo vengono liberati e possono essere usati di nuovo.When a device is removed, the device numbers are freed for reuse.

Il problema si verifica perché l'analisi dei dispositivi in Linux, programmata dal sottosistema SCSI, viene eseguita in modo asincrono.The problem occurs because device scanning in Linux is scheduled by the SCSI subsystem to happen asynchronously. Di conseguenza, il nome di percorso di un dispositivo può variare da un riavvio a un altro.As a result, a device path name can vary across restarts.

SoluzioneSolution

Per risolvere questo problema, usare la denominazione permanente.To resolve this problem, use persistent naming. Per consentire la denominazione persistente sono disponibili quattro metodi: per etichetta file system, per UUID, per ID e per percorso.There are four ways to use persistent naming: by filesystem label, by UUID, by ID, or by path. Per le macchine virtuali Linux di Azure è consigliabile usare il metodo per etichetta file system o per UUID.We recommend using the filesystem label or UUID for Azure Linux VMs.

La maggior parte delle distribuzioni dispone dei parametri fstab nofail o nobootwait.Most distributions provide the fstab nofail or nobootwait parameters. Questi parametri consentono l'avvio di un sistema quando il montaggio del disco in fase di avvio non riesce.These parameters enable a system to boot when the disk fails to mount at startup. Per altre informazioni su questi parametri, vedere la documentazione della distribuzione in uso.Check your distribution documentation for more information about these parameters. 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.For information on how to configure a Linux VM to use a UUID when you add a data disk, see Connect to the Linux VM to mount the new disk.

Quando l'agente Linux di Azure viene installato in una macchina virtuale, usa le regole Udev per creare un set di collegamenti simbolici nel percorso /dev/disk/azure.When the Azure Linux agent is installed on a VM, the agent uses Udev rules to construct a set of symbolic links under the /dev/disk/azure path. Le applicazioni e gli script usano regole Udev per identificare i dischi collegati alla macchina virtuale, oltre al tipo di disco e ai LUN del disco stesso.Applications and scripts use Udev rules to identify disks that are attached to the VM, along with the disk type and disk LUNs.

Identificare i LUN del discoIdentify disk LUNs

Le applicazioni usano i LUN per trovare tutti i dischi collegati e creare i collegamenti simbolici.Applications use LUNs to find all of the attached disks and to construct symbolic links. L'agente Linux di Azure include le regole Udev che configurano i collegamenti simbolici da un LUN ai dispositivi:The Azure Linux agent includes Udev rules that set up symbolic links from a LUN to the devices:

$ 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:LUN information from the Linux guest account is retrieved by using lsscsi or a similar tool:

   $ 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.The guest LUN information is used with Azure subscription metadata to locate the VHD in Azure Storage that contains the partition data. È ad esempio possibile usare l'interfaccia della riga di comando az:For example, you can use the 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"                                                       
  }                                                                                                                                                            
  }                                                                                                                                                             
]

Individuare l'UUID del file system usando blkidDiscover filesystem UUIDs by using blkid

Le applicazioni e gli script leggono l'output di blkid o fonti di informazioni simili per creare collegamenti simbolici nel percorso /dev.Applications and scripts read the output of blkid, or similar sources of information, to construct symbolic links in the /dev path. L'output visualizza l'UUID di tutti i dischi collegati alla macchina virtuale e i file di dispositivo associati:The output shows the UUIDs of all disks that are attached to the VM and their associated device file:

$ 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:The Azure Linux agent Udev rules construct a set of symbolic links under the /dev/disk/azure path:

$ 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).Applications use the links to identify the boot disk device and the resource (ephemeral) disk. Per individuare le partizioni in Azure, le applicazioni devono fare riferimento al percorso /dev/disk/azure/root-part1 o /dev/disk/azure-resource-part1.In Azure, applications should look in the /dev/disk/azure/root-part1 or /dev/disk/azure-resource-part1 paths to discover these partitions.

Eventuali partizioni aggiuntive dell'elenco blkid si trovano in un disco dati.Any additional partitions from the blkid list reside on a data disk. Le applicazioni mantengono l'UUID per tali partizioni e usano un percorso simile al seguente per individuare il nome del dispositivo in runtime:Applications maintain the UUID for these partitions and use a path to discover the device name at 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ù recentiGet the latest Azure Storage rules

Per ottenere le regole di Archiviazione di Azure più recenti, eseguire i comandi seguenti:To get the latest Azure Storage rules, run the following commands:

# 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 ancheSee also

Per altre informazioni, vedere gli articoli seguenti:For more information, see the following articles: