Partilhar via


Solucionar problemas de alterações do nome do dispositivo da VM do Linux

Aplica-se a: ✔️ VMs linux

Este artigo explica por que os nomes dos dispositivos mudam depois que você reinicia uma VM do Linux ou reconecta os discos de dados. O artigo também fornece soluções para esse problema.

Sintomas

Você pode enfrentar os seguintes problemas ao executar VMs do Linux no Microsoft Azure:

  • A VM falha ao inicializar após uma reinicialização.
  • Quando os discos de dados são desanexados e reanexados, os nomes dos dispositivos de disco são alterados.
  • Um aplicativo ou script que faz referência a um disco usando o nome do dispositivo falha porque o nome do dispositivo foi alterado.

Motivo

Não há garantia de que os caminhos de dispositivo no Linux sejam consistentes nas reinicializações. Os nomes dos dispositivos consistem em números principais (letras) e números secundários. Quando o driver do dispositivo de armazenamento Linux detecta um novo dispositivo, o driver atribui números principais e secundários do intervalo disponível ao dispositivo. Quando um dispositivo é removido, os números do dispositivo são liberados para reutilização.

O problema ocorre porque a verificação do dispositivo no Linux é agendada pelo subsistema SCSI para ocorrer de forma assíncrona. Como resultado, um nome de caminho de dispositivo pode variar nas reinicializações.

Solução

Para resolver esse problema, use nomes de dispositivo persistentes nas reinicializações. Há várias maneiras de usar a nomenclatura persistente: por rótulo do sistema de arquivos, por UUID ou por caminho de dispositivo derivado. Para VMs do Linux que não usam o LVM (Gerenciador de Volume Lógico), recomendamos usar o UUID do sistema de arquivos ou links criados usando regras udev. Para sistemas de arquivos baseados em LVM, a montagem usando o grupo de volumes e o nome do volume lógico também é uma abordagem válida, pois os objetos LVM permanecem consistentes, independentemente de como os volumes físicos são ordenados.

A maioria das distribuições fornece os fstab parâmetros nofail ou nobootwait . Esses parâmetros permitem que um sistema seja inicializado quando o disco falha ao ser montado na inicialização. Verifique a documentação de sua distribuição para obter mais informações sobre esses parâmetros. Para obter informações sobre como configurar uma VM Linux para usar um UUID ao adicionar um disco de dados, consulte Conectar-se à VM Linux para montar o novo disco.

Se você já tiver editado o fstab de forma que sua VM não seja inicializada e você não consiga usar o SSH para sua VM, poderá usar o Console Serial da VM para entrar no modo de usuário único e modificar o fstab ou usar o Reparo Automático do Linux no Azure para automatizar o processo de reparo.

Identificar LUNs de disco

Quando o agente Linux do Azure é instalado em uma VM, o agente usa regras udev para construir um conjunto de links simbólicos no caminho /dev/disk/azure , que correlacionam os anexos de LUN definidos pelo Azure aos dispositivos de disco tradicionais:

$ 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

As informações de LUN da conta de convidado do Linux são recuperadas usando lsscsi ou uma ferramenta semelhante:

$ 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

As informações de LUN do convidado são usadas com metadados de assinatura do Azure para localizar o VHD no armazenamento do Azure que contém os dados da partição. Por exemplo, você pode usar a 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"
  }
  }
]

Descubra UUIDs do sistema de arquivos usando blkid

Aplicativos e scripts leem a saída de blkid, ou fontes de informação semelhantes, para construir links simbólicos no caminho /dev. A saída mostra os UUIDs de todos os discos anexados à VM e seu arquivo de dispositivo associado:

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

As regras Udev do agente Linux do Azure constroem um conjunto de links simbólicos no caminho /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

Os aplicativos usam os links para identificar o dispositivo de disco de inicialização e o disco de recurso (temporário). No Azure, os aplicativos devem procurar nos caminhos /dev/disk/azure/root-part1 ou /dev/disk/azure-resource-part1 para descobrir essas partições.

Quaisquer partições adicionais da lista blkid residem em um disco de dados. Os aplicativos mantêm o UUID para essas partições e usam um caminho para descobrir o nome do dispositivo em tempo de execução:

$ 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

Obtenha as regras de armazenamento do Azure mais recentes

Para obter as regras de armazenamento do Azure mais recentes, execute os seguintes comandos:

# 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

Confira também

Para obter mais informações, consulte os seguintes artigos:

Entre em contato conosco para obter ajuda

Se você tiver dúvidas ou precisar de ajuda, crie uma solicitação de suporte ou peça ajuda à comunidade de suporte do Azure. Você também pode enviar comentários sobre o produto para a comunidade de comentários do Azure.