Устранение неполадок при изменении имени устройства виртуальной машины Linux
Область применения: ✔️ виртуальные машины Linux
В этом руководстве описывается, почему изменяются имена устройств после перезапуска виртуальной машины Linux или после повторного подключения дисков данных. В статье также приводятся решения этой проблемы.
Симптомы
При выполнении виртуальных машин Linux в Microsoft Azure могут возникнуть следующие проблемы.
- После перезапуска виртуальная машина не загружается.
- Если диски с данными отсоединить и присоединить повторно, имена устройств дисков изменяются.
- Приложение или сценарий, который ссылается на диск с использованием имени устройства, не работает, так как имя устройства изменилось.
Причина
Пути устройств в Linux не обязательно будут согласованы после перезагрузок. Имена устройств состоят из основных номеров (букв) и дополнительных. Если драйвер устройства хранения Linux обнаруживает новое устройство, драйвер назначает устройству основные и дополнительные номера из доступного диапазона. При удалении устройства номера устройства освобождаются для последующего использования.
Проблема возникает, так как сканирование устройств в Linux, назначаемое подсистемой SCSI, происходит асинхронно. В результате имена пути устройства могут различаться между перезагрузками.
Решение
Чтобы устранить эту проблему, используйте имена устройств, которые сохраняются во время перезагрузки. Существует несколько способов использования постоянного именования: по меткам файловой системы, по UUID или по производному пути устройства. Для виртуальных машин Linux, не использующих диспетчер логических томов (LVM), рекомендуется использовать UUID файловой системы или ссылки, созданные с помощью правил udev. Для файловых систем на основе LVM подключение с помощью группы томов и имени логического тома также является допустимым подходом, так как объекты LVM остаются согласованными независимо от порядка физических томов.
Большинство дистрибутивов предоставляют fstab
параметры nofail или nobootwait . Эти параметры позволяют системе загружаться, даже если диск не подключится во время запуска. Дополнительные сведения об этих параметрах см. в документации по дистрибутиву. Дополнительные сведения о настройке виртуальных машин Linux для использования UUID см. в разделе Подключение к виртуальной машине Linux для подключения нового диска.
Если вы уже изменили fstab таким образом, чтобы виртуальная машина не загрузила виртуальную машину и не удается выполнить SSH на виртуальной машине, вы можете использовать последовательную консоль виртуальной машины для ввода однопользовательского режима и изменения fstab или автоматического восстановления Azure Linux для автоматизации процесса восстановления.
Определение LUN диска
Когда агент Azure Linux установлен на виртуальной машине, агент использует правила udev для создания набора символьных ссылок в пути /dev/disk/azure , который сопоставляет вложения LUN в Azure с традиционными дисками:
$ 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 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
См. также
Дополнительные сведения см. в следующих статьях:
- Для Ubuntu: UsingUUID (Использование UUID)
- Для Red Hat: Persistent Naming (Постоянные именования)
- Для Linux: What UUIDs can do for you (Чем полезны идентификаторы UUID)
- Udev: Introduction to Device Management In Modern Linux System (Udev. Руководство по управлению устройствами в современной системе Linux)
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.