Вопрос или проблема
Внутри мы используем Ubuntu (14.04 Trusty) на наших рабочих станциях, и до сих пор мы выполняли все сборки вручную, включая создание RAID/LVM/LUKS-шифрованных томов. Это не масштабируется, и сейчас я работаю над автоматизацией некоторых наших процессов, чтобы уменьшить количество ручного вмешательства, необходимого для создания новой рабочей станции.
Наша конфигурация жесткого диска следующая:
- /dev/sda & /dev/sdb оба по 1 Тб жесткие диски, разбитые на одинаковые разделы и собранные в RAID
- 1Гб раздел с RAID 1, содержащий файловую систему ext4, смонтированную как /boot
- Остальная часть диска RAID 1, содержащая LVM PV/VG (vg_raid)
- 8Гб LV для пространства подкачки
- Остальное пространство – LV, содержащий файловую систему ext4, смонтированную как /
- /dev/sdc 128Гб SSD
- Один раздел, содержащий LVM PV/VG (vg_ssd)
- Единственный LV, использующий все доступное пространство, содержащий файловую систему ext4, которая смонтирована по адресу /ssd
Разбив таким образом, мы имеем большую, избыточную корневую файловую систему для общего хранения данных и меньший раздел, на который можно поместить файлы, чувствительные к скорости ввода-вывода (например, базы данных MySQL).
Я пытаюсь воспроизвести это в expert_recipe
partman с соответствующей конфигурацией, чтобы это можно было создать установщиком Ubuntu. Моя основная проблема в том, что, похоже, в языке рецептов partman нет рабочего механизма для указания, что конкретный LV должен быть создан в конкретной группе томов, и какие физические тома LVM назначены каждой группе томов. У меня была предыдущая версия этой конфигурации, которая работала без попытки разделения/форматирования/монтирования каких-либо томов на /dev/sdc
, но как только возникает дополнительный “не-RAID” диск, мне не удается выразить то, что я хочу, в рецепте partman.
Соответствующая часть моего файла preseed.cfg следующая:
d-i partman-auto/disk string /dev/sda /dev/sdb /dev/sdc
d-i partman-auto/method string raid
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/new_vg_name string vg_raid vg_ssd
d-i partman-auto-lvm/guided_size string max
d-i partman-auto/expert_recipe string \
boot-root :: \
512 10 1024 raid \
$primary{ } $lvmignore{ } $bootable{ } \
method{ raid } \
device{ /dev/sda /dev/sdb } \
vg_name{ vg_raid } \
. \
4096 20 -1 raid \
$primary{ } $lvmignore{ } \
method{ raid } \
device{ /dev/sda /dev/sdb } \
. \
2048 20 -1 lvm \
$primary{ } \
$defaultignore{ } \
method{ lvm } \
device{ /dev/sdc } \
vg_name{ vg_ssd } \
. \
8192 100 -1 ext4 \
$defaultignore $lvmok{ } \
in_vg{ vg_raid } \
lv_name{ lv_root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
device{ /dev/sda /dev/sdb } \
. \
4096 100 100% linux-swap \
$defaultignore $lvmok{ } \
in_vg{ vg_raid } \
lv_name{ lv_swap } \
method{ swap } format{ } \
device{ /dev/sda /dev/sdb } \
. \
2048 100 -1 ext4 \
$defaultignore $lvmok{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
device{ /dev/sdc } \
in_vg{ vg_ssd } \
lv_name{ lv_ssd } \
mountpoint{ /ssd } \
. \
d-i partman-auto-raid/recipe string \
1 2 0 ext4 /boot /dev/sda1#/dev/sdb1 . \
1 2 0 lvm - /dev/sda2#/dev/sdb2 .
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-md/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm_nooverwrite boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman/mount_style select label
Вы заметите, что я пытался быть достаточно конкретным относительно того, какие разделы/тома должны быть размещены на каких дисках, но частьman, похоже, не учитывает, по меньшей мере, часть этой конфигурации. Я также старался, чтобы минимальные размеры томов были довольно небольшими, пока я тестировал эту конфигурацию на виртуальной машине. Когда я запускаю установку с этой конфигурацией на виртуальной машине VirtualBox с меньшими дисками, установка завершается с сообщением об ошибке:
Ошибка при настройке RAID
Произошла неожиданная ошибка при настройке предварительно заданной конфигурации RAID.
Проверьте /var/log/syslog или посмотрите виртуальную консоль 4 для получения подробностей.
Соответствующая часть из syslog следующая:
Jan 13 02:41:54 md-devices: mdadm: Нет массивов, найденных в конфигурационном файле или автоматически
Jan 13 02:41:54 partman: Не найдены совпадающие физические тома
Jan 13 02:41:54 partman: Чтение всех физических томов. Это может занять некоторое время...
Jan 13 02:41:54 partman:
Jan 13 02:41:54 partman: Никакие группы томов не найдены
Jan 13 02:41:54 partman:
Jan 13 02:41:54 partman-lvm:
Jan 13 02:41:54 partman-lvm: Не найдено групп томов
Jan 13 02:41:54 partman-lvm:
Jan 13 02:41:56 partman-auto: Доступное место на диске (4294) слишком мало для экспертного рецепта (4608); пропускаем
Jan 13 02:41:57 kernel: [ 91.295036] Добавление 2095100k swap на /dev/sdc5. Приоритет:-1 extent:1 по:2095100k FS
Jan 13 02:41:57 partman: mke2fs 1.42.9 (4-фев-2014)
Jan 13 02:41:57 apt-install: Пакет mdadm ставится в очередь для установки позже
Jan 13 02:41:57 partman-auto-raid: Ошибка: не указан рецепт в partman-auto-raid/recipe
Я подозреваю, что строка за четвертой снизу наиболее релевантна, так как вы можете видеть, что частьman все же создала пространство подкачки на /dev/sdc
, что не было тем, что я хотел.
Я пробовал множество вариантов того, как указываются разделы. Я много гуглил по терминологиям, связанным с рецептами partman и preseed в целом, и не могу найти каноническую ссылку на различные параметры конфигурации в рецепте и почему они актуальны. Я нашел множество примеров RAID и много примеров LVM, но ничего, что сочетало бы оба этих подхода так, как я пытаюсь их использовать. Эта тема из списка рассылки debian-user предполагает, что то, что я хочу сделать, невозможно, и это, похоже, подтверждает мое впечатление о том, что язык ингредиентов partman не имеет инструментов, необходимых для описания того, что я пытаюсь достичь.
Если кто-то может указать, что я делаю не так в своей конфигурации, или даже просто хорошие учебные материалы по expert_recipe
partman и языку конфигурации, который используется, я был бы очень признателен. На данный момент, похоже, я могу автоматизировать всю свою установку, за исключением разделения, что на самом деле было основным, что я хотел автоматизировать!
Использование файла preseed для создания raid+lvm — это сложно. В основном, вы не можете создать гибкий конфигурационный файл с помощью preseed. Это не так просто и не так гибко, как kickstart в RedHat/CentOS.
Для меня мне пришлось создать пользовательские команды с использованием синтаксиса preseed_early. Вы можете изменить это по своему усмотрению, в зависимости от вашей конфигурации. Главная цель — создать массив RAID перед запуском разделителя. Установочный демон скажет вам, что раздел /boot не определен, игнорируйте это. Проверено на Debian 9
Итак, у нас четыре диска
/dev/sda1 и /dev/sdb1 это зеркало RAID1 -> /dev/md0
/dev/sda2 и /dev/sdb2 это полоска RAID0 -> /dev/md1
/dev/sdc1 и /dev/sdd1 это зеркало RAID1 -> /dev/md2
На md0 у нас есть раздел /boot
На md1 у нас есть файл подкачки
На md2 находится корень /.
Итак, файл preseed следующий:
d-i partman-auto/disk string /dev/md0 /dev/md1 /dev/md2
d-i partman-auto/method string lvm
d-i partman-auto/expert_recipe string \
1 1 -1 lvm \
$defaultignore{ } \
$primary{ } \
device{ /dev/md0 } \
method{ lvm } \
vg_name{ vg00 } \
. \
1 1 -1 lvm \
$defaultignore{ } \
$primary{ } \
device{ /dev/md1 } \
method{ lvm } \
vg_name{ vg01 } \
. \
1 1 -1 lvm \
$defaultignore{ } \
$primary{ } \
device{ /dev/md2 } \
method{ lvm } \
vg_name{ vg02 } \
. \
512 512 512 ext4 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ lv_boot } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ /boot } \
. \
512 1024 1024 linux-swap \
$lvmok{ } \
in_vg{ vg02 } \
lv_name{ lv_swap } \
method{ swap } format{ } \
. \
1000 9000 9000 ext4 \
$lvmok{ } \
in_vg{ vg01 } \
lv_name{ lv_root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
.
d-i grub-installer/bootdev string /dev/sda /dev/sdb
d-i preseed/early_command string /bin/killall.sh;\
/bin/netcfg;\
echo "o# очистить таблицу разделов в памяти" >> /tmp/fdisk1;\
echo "n# создать новый раздел" >> /tmp/fdisk1;\
echo "p# тип первичный" >> /tmp/fdisk1;\
echo "1# номер раздела" >> /tmp/fdisk1;\
echo " # по умолчанию" >> /tmp/fdisk1;\
echo "+512M# размер раздела" >> /tmp/fdisk1;\
echo "t# тип раздела" >> /tmp/fdisk1;\
echo "fd# Linux RAID" >> /tmp/fdisk1;\
echo "w# записать изменения" >> /tmp/fdisk1;\
echo "n# создать новый раздел" >> /tmp/fdisk2;\
echo "p# тип первичный" >> /tmp/fdisk2;\
echo "2# номер раздела" >> /tmp/fdisk2;\
echo " # по умолчанию" >> /tmp/fdisk2;\
echo " # размер раздела" >> /tmp/fdisk2;\
echo "t# тип раздела" >> /tmp/fdisk2;\
echo "2# номер раздела" >> /tmp/fdisk2;\
echo "fd# Linux RAID" >> /tmp/fdisk2;\
echo "w# записать изменения" >> /tmp/fdisk2;\
echo "o# очистить таблицу разделов в памяти" >> /tmp/fdisk3;\
echo "n# создать новый раздел" >> /tmp/fdisk3;\
echo "p# тип первичный" >> /tmp/fdisk3;\
echo "1# номер раздела" >> /tmp/fdisk3;\
echo " # по умолчанию" >> /tmp/fdisk3;\
echo " # размер раздела" >> /tmp/fdisk3;\
echo "t# тип раздела" >> /tmp/fdisk3;\
echo "fd# Linux RAID" >> /tmp/fdisk3;\
echo "w# записать изменения" >> /tmp/fdisk3;\
cat /tmp/fdisk1 | grep -o '^[^#]*' | fdisk /dev/sda;\
cat /tmp/fdisk1 | grep -o '^[^#]*' | fdisk /dev/sdb;\
cat /tmp/fdisk2 | grep -o '^[^#]*' | fdisk /dev/sda;\
cat /tmp/fdisk2 | grep -o '^[^#]*' | fdisk /dev/sdb;\
/sbin/mdadm --create /dev/md0 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=1 /dev/sda1 /dev/sdb1;\
cat /tmp/fdisk3 | grep -o '^[^#]*' | fdisk /dev/sdc;\
cat /tmp/fdisk3 | grep -o '^[^#]*' | fdisk /dev/sdd;\
/sbin/mdadm --create /dev/md1 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=1 /dev/sdc1 /dev/sdd1;\
/sbin/mdadm --create /dev/md2 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=0 /dev/sda2 /dev/sdb2;\
Ответ или решение
Конфигурация RAID с LVM объемами в установочном процессе Ubuntu через предустановку (preseed) может быть сложной задачей, особенно когда вы пытаетесь динамически и гибко настроить серверное пространство. Я постараюсь описать основные шаги и предоставить пример конфигурации, которая поможет вам решить вашу задачу.
Общая концепция
Как вы упомянули, у вас есть два диска, которые будут использоваться для RAID, и один SSD-диск. Основная цель – настроить RAID 1 для /boot и LVM для корневой файловой системы, а также создать отдельный LVM на SSD.
Пример файла preseed.cfg
Вот как можно настроить файл preset.cfg для достижения желаемой конфигурации:
# Указываем диски
d-i partman-auto/disk string /dev/sda /dev/sdb /dev/sdc
d-i partman-auto/method string raid
# Подтверждение удаления LVM и RAID
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
# Рецепт для настройки разделов
d-i partman-auto/expert_recipe string \
boot-root :: \
512 10 1024 raid \
$primary{ } $bootable{ } \
method{ raid } \
device{ /dev/sda1 /dev/sdb1 } \
vg_name{ vg_raid } \
. \
4096 20 -1 lvm \
$primary{ } \
method{ lvm } \
device{ /dev/sda2 /dev/sdb2 } \
vg_name{ vg_raid } \
. \
2048 20 -1 lvm \
$primary{ } \
method{ lvm } \
device{ /dev/sdc } \
vg_name{ vg_ssd } \
. \
8192 100 -1 ext4 \
$lvmok{ } \
in_vg{ vg_raid } \
lv_name{ lv_root } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
mountpoint{ / } \
. \
4096 100 100% linux-swap \
$lvmok{ } \
in_vg{ vg_raid } \
lv_name{ lv_swap } \
method{ swap } format{ } \
. \
2048 100 -1 ext4 \
$lvmok{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext4 } \
device{ /dev/sdc } \
in_vg{ vg_ssd } \
lv_name{ lv_ssd } \
mountpoint{ /ssd } \
. \
# Рецепт для настройки RAID
d-i partman-auto-raid/recipe string \
1 2 0 ext4 /boot /dev/sda1#/dev/sdb1 . \
1 2 0 lvm - /dev/sda2#/dev/sdb2 .
# Разрешение на запись новых разделов
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-md/confirm boolean true
d-i partman/mount_style select label
# Установка загрузчика GRUB
d-i grub-installer/bootdev string /dev/sda
Объяснение
-
Диски: Указываем, с какими дисками будет работать партиционирование.
-
Метод: Указываем метод — RAID.
-
Секреты для партиционирования: Используем секцию
expert_recipe
для определения, как будут сконфигурированы разделы. Вы можете указать параметры, такие как размеры и тип файловой системы. -
RAID настройка: Используйте секцию
partman-auto-raid/recipe
для создания RAID массивов, где вы указываете, какие разделы какого диска в RAID. -
Файловые системы и LVM: Указываем, как создаются логические объемы, где какие диски будут использоваться.
Замечания
- Убедитесь, что вы проверили логи инсталляции, если получаете ошибки, так как это может помочь вам понять, что идет не так.
- Следует помнить, что Ubuntu 14.04 уже является устаревшей, и некоторые функциональные возможности могут отличаться от более новых версий.
- Также возможно, что некоторые опции, которые вы пытаетесь использовать, могут быть недоступны в текущей версии вашего дистрибутива. Если возможно, рассмотрите возможность обновления до более новой версии Ubuntu.
Используя этот подход, вы сможете автоматизировать вашу установку под нужды вашей команды, обеспечивая высокую доступность и результаты, соответствующие вашему бизнесу.