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

Область применения: ✔️ виртуальные машины Linux

Сводка

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

Это важно

Новое! Попробуйте использовать инструмент VM Assist для решения наиболее часто встречающихся проблем. Мы рекомендуем запустить Помощник VM для Windows или Помощник VM для Linux. Эти средства диагностики на основе скриптов помогают выявить распространенные проблемы, влияющие на Azure гостевого агента виртуальной машины и общую работоспособность виртуальных машин.

Если у вас возникли проблемы с производительностью на виртуальных машинах, запустите эти средства перед обращением к служба поддержки Майкрософт.

Симптомы

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

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

Причина

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

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

Решение

Чтобы устранить эту проблему, используйте имена устройств, которые сохраняются во время перезагрузки. Существует несколько способов использования постоянного именования: по меткам файловой системы, по UUID или по производному пути устройства. Для виртуальных машин Linux, не использующих диспетчер логических томов (LVM), рекомендуется использовать UUID файловой системы или ссылки, созданные с помощью правил udev. Для файловых систем на основе LVM использование имени группы томов и логического тома также является допустимым подходом, так как объекты LVM остаются неизменными независимо от порядка физических томов.

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

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

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

Когда агент Linux Azure установлен на виртуальной машине, агент использует правила udev для создания набора символьных ссылок по пути /dev/disk/azure, которые сопоставляют Azure-определенные вложения 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, содержащего данные раздела. Например, 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"
  }
  }
]

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

См. также

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