Для этого взял виртуалку с Debian 12 и установил систему с ручным разбитием диска. Создал ровно один раздел /dev/sda1, на нём создал VG - vgroup и один LV - root на весь доступный объём. Больше не делал ничего. Раздел /boot не выносил отдельно. Всё только в корне. Grub уже давно умеет грузиться с LVM разделов.
Установил систему. Добавил туда ещё один диск
/dev/sdb. Скопировал на него разметку с sda и добавил его в VG:# sfdisk -d /dev/sda | sfdisk /dev/sdb# pvcreate /dev/sdb1# vgextend vgroup /dev/sdb1Пробую сконвертировать корневой раздел в RAID1:
# lvconvert --type raid1 -m 1 vgroup/rootПолучаю ошибку:
Insufficient free space: 1 extents needed, but only 0 availableСуть её в том, что при создании любого RAID необходимо создать отдельный малюсенький LV на 4 MiB для хранения метаданных массива. А я полностью весь VG во время установки отдал на LV root. Чтобы избежать этой ошибки, оставляйте во время установки немного места на VG.
Решить эту проблему не трудно. LV можно уменьшить вместе с ФС, если это ext4:
# lvreduce -l -1 --resizefs /dev/vgroup/rootКоманда сработает, только если раздел размонтирован. А у меня это корень системы, так что получил ошибку. Решение простое. Загрузился с SystemRescueCD и выполнил её там. Откусил кусочек от LV, теперь конвертирую в RAID1:
# lvconvert --type raid1 -m 1 vgroup/rootВсё проходит без ошибок. Загружаю систему, проверяю массив:
# lvs -o+segtype# lvs -a -o name,devices vgroupВсё в порядке, оба диска на месте. Ставлю загрузчик на второй диск sdb:
# dpkg-reconfigure grub-pcТеперь вынимаю первый диск sda, на который изначально ставилась система и перезагружаю её. Grub запускается со второго диска, а дальше вываливаюсь в initramfs. Система не грузится, пишет, что не видит диск
/dev/mapper/vgroup-root. В консоли initramfs ввожу команду на активацию всех lvm томов:# vgchange -ayНаходит VG vgroup, но ругается, что там нет sda. Логично, диск этот отключен. После этого выхожу из initramfs:
# exitТак как LVM раздел активирован, грузится система со второго диска. То есть в целом всё в порядке. Система жива, загружается. Надо только разобраться с тем, чтобы initramfs автоматически активировал неактивный VG с raid1.
Как оказалось, проблема эта нередкая. Нашёл решение в интернете. Создаём файл
/etc/initramfs-tools/scripts/local-top/forcelvm следующего содержания: #!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /scripts/functions
lvm vgchange -ay
Пересобираем initramfs:
# chmod +x /etc/initramfs-tools/scripts/local-top/forcelvm# update-initramfs -u -k allПерезагружаемся. Теперь загрузка работает нормально. Что с одним, что с двумя дисками.
Заменяем выключенный диск новым. Смотрим, какие диски есть в системе:
# lsblk У меня с данными диск стал sda, новый sdb. Копирую на него разметку, добавляю в VG и LV с raid1:
# sfdisk -d /dev/sda | sfdisk /dev/sdb# pvcreate /dev/sdb1# vgextend vgroup /dev/sdb1# vgreduce --removemissing vgroup --force# lvconvert --repair vgroup/root# lvconvert -m1 vgroup/root /dev/sdb1Ставим загрузчик на новый диск:
# dpkg-reconfigure grub-pcСледим за синхронизацией:
# watch lvs -aКогда закончится, перезагружаем систему и убеждаемся, что всё работает.
Получилась готовая инструкция по установке системы на LVM Raid1 и по замене вышедшего из строя диска. В целом, всё примерно то же самое, что и в mdadm со своими нюансами. При случае попробую на каком-нибудь железном сервере вместо mdadm - LVM. На вид выглядит удобнее и функциональнее.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#lvm #raid
