Как настроить RAID + 2 LVM тома через preseed?

Вопрос или проблема

Внутри мы используем 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

Объяснение

  1. Диски: Указываем, с какими дисками будет работать партиционирование.

  2. Метод: Указываем метод — RAID.

  3. Секреты для партиционирования: Используем секцию expert_recipe для определения, как будут сконфигурированы разделы. Вы можете указать параметры, такие как размеры и тип файловой системы.

  4. RAID настройка: Используйте секцию partman-auto-raid/recipe для создания RAID массивов, где вы указываете, какие разделы какого диска в RAID.

  5. Файловые системы и LVM: Указываем, как создаются логические объемы, где какие диски будут использоваться.

Замечания

  • Убедитесь, что вы проверили логи инсталляции, если получаете ошибки, так как это может помочь вам понять, что идет не так.
  • Следует помнить, что Ubuntu 14.04 уже является устаревшей, и некоторые функциональные возможности могут отличаться от более новых версий.
  • Также возможно, что некоторые опции, которые вы пытаетесь использовать, могут быть недоступны в текущей версии вашего дистрибутива. Если возможно, рассмотрите возможность обновления до более новой версии Ubuntu.

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

Оцените материал
Добавить комментарий

Капча загружается...