Solucionar problemas de alterações de nome de dispositivo VM 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 a nomenclatura persistente. Existem quatro maneiras de usar a nomenclatura persistente: por rótulo do sistema de arquivos, por UUID, por ID ou por caminho. Recomendamos usar o rótulo do sistema de arquivos ou UUID para VMs Azure Linux.

A maioria das distribuições fornece os parâmetros fstabnofail 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.

Quando o agente Azure Linux é instalado em uma VM, o agente usa regras Udev para construir um conjunto de links simbólicos no caminho /dev/disk/azure. Aplicativos e scripts usam regras Udev para identificar discos que estão conectados à VM, juntamente com o tipo de disco e LUNs de disco.

Se você já editou seu fstab de forma que sua VM não está inicializando e você não consegue SSH para sua VM, você pode usar o VM Serial Console para entrar no modo de usuário único e modifique seu arquivo fstab.

Identificar LUNs de disco

Os aplicativos usam LUNs para localizar todos os discos anexados e construir links simbólicos. O agente Azure Linux inclui regras Udev que configuram links simbólicos de um LUN para os dispositivos:

$ 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 saber mais, confira 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.