Как я могу использовать cloud-init для загрузки диска данных на виртуальную машину с Ubuntu в Azure
Я пытался использовать cloud-init для разбиения и монтирования диска данных на виртуальной машине Ubuntu в Azure. Большинство онлайн-примеров показывают, как это сделать для временного диска, но не для диска с данными. Я пытался баловаться с этим без особой удачи. Пожалуйста, дайте мне знать, если я делаю что-то неправильно в приведенном ниже коде или если это невозможно сделать с помощью cloud-init
#cloud-config
device_aliases: {'ephemeral0': '/dev/sdb','datadisk': '/dev/sdc1'}
disk_setup:
ephemeral0:
table_type: mbr
layout: True
overwrite: False
/dev/sdc1:
table_type: mbr
layout: True
overwrite: False
fs_setup:
- label: ephemeral0
filesystem: ext4
device: ephemeral0.1
replace_fs: ntfs
- cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s
label: '/dev/sdc1/'
filesystem: ext4
device: '/dev/sdc1/'
replace_fs: ntfs
mounts:
- ["ephemeral0.1", "/mnt"]
- ["/dev/sdc1/", "/datadisk"]
1 ответ
Я согласен - не так много примеров этого общего сценария. Я думаю, что часть проблемы, с которой вы столкнулись выше, заключается в том, что вы ссылаетесь на раздел вместо диска в disk_setup.
В Azure первый диск с данными, подключенный к виртуальной машине, обычно обозначается как /dev/sdc
вторая будет /dev/sdd
, и так далее. Это не гарантируется, однако. Документация здесь указывает, что существуют обстоятельства, которые могут привести к назначению другой буквы диска. В результате мы будем ссылаться на диски, используя встроенный псевдоним. Этот псевдоним гарантированно всегда будет отображаться с использованием LUN, назначенного в шаблоне ARM (или в определении диска). Эти псевдонимы имеют вид /dev/disk/azure/scsi1/lun#
(с разделами под псевдонимом /dev/disk/azure/scsi1/lun#-part#
).
Если вы используете ARM, шаблон будет содержать ссылку в определении виртуальной машины на диск. В рамках этого определения вы будете указывать значение LUN. Вы можете ссылаться на это назначенное значение в вашем облаке-init. Например, следующий фрагмент ARM создаст /dev/disk/azure/scsi1/lun0
:
"dataDisks": [
{
"lun": 0,
"name": "[concat(variables('vmName'),'-datadisk0')]",
"createOption": "Attach",
"managedDisk":
{
"id": "[resourceId('Microsoft.Compute/disks/',
concat(variables('vmName'),'-datadisk0'))]"
}
},
Зная это, мы можем сконструировать содержимое для облачной конфигурации. Сначала мы определим диск данных. Я предлагаю использовать GPT в качестве типа таблицы для включения поддержки дисков и разделов размером> 2 ТБ.
disk_setup:
/dev/disk/azure/scsi1/lun0:
table_type: gpt
layout: True
overwrite: True
Далее мы указываем настройку файловой системы для дисков. Мы ссылаемся на каждый раздел и объявляем используемую файловую систему.
fs_setup:
- device: /dev/disk/azure/scsi1/lun0
partition: 1
filesystem: ext4
Наконец, мы монтируем разделы. Процесс, используемый cloud-init, создаст папки и смонтирует указанные разделы. Я пользуюсь рекомендованным nofail
(гарантирует, что виртуальная машина может загрузиться в случае проблем или отсоединенного диска) вместе с noexec
(что предотвращает выполнение двоичных файлов в этом разделе). Поскольку мы поместили файловую систему в первый раздел lun0, нам нужно смонтировать lun0-part1
,
mounts:
- ["/dev/disk/azure/scsi1/lun0-part1", "/datadisk", auto, "defaults,noexec,nofail"]