Русская рулетка дедиков: Собираем RAID 1 + LVM на живой системе без Rescue-режима

от автора

Привет, хабр! Ситуация до боли знакома каждому, кто регулярно арендует выделенные серверы. Вы оплачиваете счет, заходите в панель хостера, выбираете Debian, жмете «Установить» и идете пить кофе. Через 10 минут SSH-порт открыт. Вы логинитесь, вводите lsblk и… начинается лотерея.

Некоторым провайдерам не плевать на инфраструктуру. При заказе у них можно галочками выбрать: нужна разметка RAID или нет, нужен ли LVM. В идеальном мире вы получаете рабочую картину: зеркало (md) и логические тома поверх него (vg-root).

Но реальность чаще напоминает «серверный авось». Вы заходите на сервер с двумя накопителями и видите, что ОС установлена на /dev/sda, а второй диск /dev/sdb просто болтается пустым. Никакого RAID. Никакой отказоустойчивости. Умрет первый диск — ваши данные и аптайм исчезнут в небытии.

У вас два пути:

  1. Идти в панель хостера и переустанавливать ОС, надеясь, что там есть чекбокс для сборки массива. Но даже если он есть, вы получите «голый» RAID 1 без преимуществ LVM.

  2. Собрать всё руками.

Мы в SoftStore выбираем второй путь. Это дает 100% контроль над процессом и бесценную практику. Самое главное — нам не нужен Rescue-режим и не нужно писать тикеты в саппорт с просьбой «подключите ISO-образ». Мы соберем программный RAID и LVM прямо на работающей системе.


Часть 1. Миграция: Протокол «Деградированное зеркало»

Операционная система сейчас крутится на /dev/sda. Мы возьмем второй, пустой диск /dev/sdb, и создадим на нем деградированный RAID 1 (массив из двух дисков, где один изначально числится отсутствующим). Накатим поверх LVM, перенесем туда систему, переключим загрузчик и после перезагрузки добавим старый диск в массив.

Шаг 1. Подготовка и клонирование разметки

Используем sgdisk, чтобы клонировать таблицу разделов с sda на sdb.

sgdisk -R /dev/sdb /dev/sda

Обязательно генерируем новые UUID для sdb, иначе ядро запутается в дубликатах:

sgdisk -G /dev/sdb

Меняем тип разделов на sdb на Linux RAID (hex-код fd00), кроме раздела EFI.

sgdisk -t 2:fd00 /dev/sdbsgdisk -t 3:fd00 /dev/sdb

Шаг 2. Сборка массива «на лету»

Вместо первого диска передаем missing.

# Массив под /boot. Метаданные 1.0 (запись в конец раздела для совместимости с GRUB).mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb2 --metadata=1.0# Массив под корень. Метаданные 1.2.mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb3 --metadata=1.2

Шаг 3. Слой LVM и форматирование

Создаем логику на деградированном /dev/md1.

pvcreate /dev/md1vgcreate vg_system /dev/md1

Важный момент: никогда не отдавайте под корень всё место. Оставьте 30-40% пула свободным для снапшотов и расширения.

lvcreate -L 50G -n root_lv vg_systemlvcreate -L 8G -n swap_lv vg_system

Форматируем:

mkfs.ext4 /dev/md0mkfs.ext4 /dev/vg_system/root_lvmkswap /dev/vg_system/swap_lvmkfs.fat -F32 /dev/sdb1

Шаг 4. Live Sync: Переезд без остановки

Монтируем новую структуру во временную директорию:

mkdir /mnt/newroot && mount /dev/vg_system/root_lv /mnt/newrootmkdir /mnt/newroot/boot && mount /dev/md0 /mnt/newroot/bootmkdir /mnt/newroot/boot/efi && mount /dev/sdb1 /mnt/newroot/boot/efi

Используем rsync. Флаги -axAXH обязательны: они сохранят права, атрибуты и хардлинки, не заходя в виртуальные ФС вроде /proc.

rsync -axAXH --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/newroot/

Шаг 5. Chroot-хирургия

Теперь нужно объяснить системе, что её новый дом — LVM. Правим /mnt/newroot/etc/fstab. Заменяем старые UUID на новые пути: корень на /dev/mapper/vg_system-root_lv, а /boot на /dev/md0.

Заходим внутрь:

mount --bind /dev /mnt/newroot/devmount --bind /proc /mnt/newroot/procmount --bind /sys /mnt/newroot/syschroot /mnt/newroot

Обновляем конфиг RAID, образ initramfs (чтобы ядро увидело LVM при старте) и прошиваем GRUB:

mdadm --examine --scan > /etc/mdadm/mdadm.confupdate-initramfs -ugrub-install /dev/sdbupdate-grubexit

Шаг 6. Финализация зеркала

Уходим в reboot. Если всё сделано верно, сервер поднимется с /dev/sdb. Теперь зачищаем старый sda и добавляем его в массивы:

sgdisk -t 2:fd00 /dev/sdasgdisk -t 3:fd00 /dev/sdamdadm --manage /dev/md0 --add /dev/sda2mdadm --manage /dev/md1 --add /dev/sda3

Синхронизация пошла. Не забудьте скопировать EFI-раздел: dd if=/dev/sdb1 of=/dev/sda1.


Часть 2. Управление через LVM: Изоляция и расширение

Мы собрали эту конструкцию не только ради RAID, но и ради гибкости LVM.

Изоляция данных

Представьте, что у вас Docker или база данных. Если они забьют корень (/), сервер упадет. Правильный подход — нарезать под них отдельные логические тома.

lvcreate -L 100G -n data_lv vg_systemmkfs.xfs /dev/vg_system/data_lvmount /dev/vg_system/data_lv /var/lib/docker

Теперь, если логи Docker сожрут всё место в data_lv, система продолжит работать.

Online Resize: Расширение на лету

Место заканчивается? Если у вас есть свободное пространство в Volume Group (а мы его оставили на шаге 3), расширение занимает 5 секунд без остановки сервисов:

lvextend -L +50G /dev/vg_system/data_lvxfs_growfs /dev/vg_system/data_lv  # Для XFS# или resize2fs /dev/vg_system/data_lv для ext4

Часть 3. Снапшоты: Право на ошибку

Снапшот в LVM — это моментальный слепок состояния. Это идеальная страховка перед обновлением ядра или опасным рефакторингом базы.

Создаем снапшот корня:

lvcreate -L 10G -s -n root_snapshot /dev/vg_system/root_lv

Если после обновления всё «окирпичилось», откатываемся одной командой:

lvconvert --merge /dev/vg_system/root_snapshotreboot

Система вернется в состояние до апдейта.


Часть 4. Протокол при отказе диска

Если smartctl рапортует о росте Reallocated_Sector_Ct, пора действовать.

  1. Изгнание: Помечаем разделы диска как сбойные.

mdadm --manage /dev/md1 --fail /dev/sda3 --remove /dev/sda3
  1. Замена: Вставляем новый диск.

  2. Ребилд: Копируем разметку и возвращаем разделы в RAID.

sgdisk -R /dev/sda /dev/sdb && sgdisk -G /dev/sdamdadm --manage /dev/md1 --add /dev/sda3

Итог

Вы больше не зависите от кривых шаблонов хостера. У вас под капотом честное зеркало, гибкое управление квотами через LVM и механизм моментальных откатов через снапшоты. Это и есть профессиональная работа с инфраструктурой.

А какой сетап предпочитаете вы: «чистый» RAID или связку с LVM? Делитесь в комментариях своим опытом борьбы с хостерскими шаблонами.

ссылка на оригинал статьи https://habr.com/ru/articles/1029498/