Устранение неполадок с изменением имени устройства виртуальной машины Linux

В этой статье объясняется, почему имена устройств меняются после перезапуска виртуальной машины Linux или повторного подключения дисков данных. В этой статье также приводятся решения этой проблемы.

Симптомы

При запуске виртуальных машин Linux в Microsoft Azure могут возникнуть следующие проблемы:

  • Виртуальная машина не загружается после перезапуска.
  • Когда диски данных отсоединяются и присоединяются повторно, имена дисковых устройств изменяются.
  • Приложение или скрипт, ссылающийся на диск с помощью имени устройства, завершается сбоем, так как имя устройства изменилось.

Причина

Пути устройств в Linux не гарантируют согласованность при перезапусках. Имена устройств состоят из основных цифр (букв) и дополнительных чисел. Когда драйвер устройства хранения Linux обнаруживает новое устройство, драйвер назначает устройству основные и незначительные номера из доступного диапазона. При удалении устройства номера устройств освобождаются для повторного использования.

Проблема возникает из-за того, что проверка устройств в Linux запланирована подсистемой SCSI для асинхронного выполнения. В результате путь к устройству может отличаться в зависимости от перезапуска.

Решение

Чтобы устранить эту проблему, используйте постоянное именование. Существует четыре способа использования постоянного именования: по меткам файловой системы, по UUID, по идентификатору или по пути. Рекомендуется использовать метку файловой системы или UUID для виртуальных машин Linux в Azure.

Большинство распределений fstab предоставляют параметры nofail или nobootwait. Эти параметры позволяют системе загружаться при сбое подключения диска при запуске. Дополнительные сведения об этих параметрах см. в документации по дистрибутиву. Сведения о том, как настроить виртуальную машину Linux для использования UUID при добавлении диска данных, см. в статье Подключение к виртуальной машине Linux для подключения нового диска.

Когда агент Azure Linux установлен на виртуальной машине, он использует правила Udev для создания набора символьных ссылок по пути /dev/disk/azure. Приложения и скрипты используют правила Udev для определения дисков, подключенных к виртуальной машине, а также типа диска и LUN диска.

Если вы уже отредактировали fstab таким образом, что виртуальная машина не загружается и вам не удается подключиться к виртуальной машине по протоколу SSH, можно использовать последовательную консоль виртуальной машины , чтобы перейти в однопользовательский режим и изменить fstab.

Определение LUN диска

Приложения используют LUN для поиска всех подключенных дисков и создания символьных ссылок. Агент Azure Linux включает правила Udev, которые настраивают символьные ссылки из LUN на устройства:

$ 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

Сведения LUN из гостевой учетной записи Linux извлекаются с помощью lsscsi или аналогичного средства:

$ 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

Сведения о гостевом LUN используются с метаданными подписки Azure для поиска виртуального жесткого диска в службе хранилища Azure, содержащего данные секции. Например, можно использовать интерфейс командной 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"
  }
  }
]

Обнаружение идентификаторов UUID файловой системы с помощью blkid

Приложения и скрипты считывают выходные данные blkidили аналогичные источники информации для создания символических ссылок в пути /dev. В выходных данных показаны идентификаторы UUID всех дисков, подключенных к виртуальной машине, и связанные с ними файлы устройства:

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

Правила Udev агента Azure Linux создают набор символьных ссылок по пути /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

Приложения используют ссылки для идентификации загрузочного диска и ресурса (временный) диск. В Azure приложения должны искать пути /dev/disk/azure/root-part1 или /dev/disk/azure-resource-part1, чтобы обнаружить эти секции.

Все дополнительные секции blkid из списка находятся на диске данных. Приложения поддерживают UUID для этих секций и используют путь для обнаружения имени устройства во время выполнения:

$ 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

Получение последних правил службы хранилища Azure

Чтобы получить последние правила службы хранилища Azure, выполните следующие команды:

# 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

См. также

Дополнительные сведения см. в следующих статьях:

Свяжитесь с нами для получения помощи

Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.