LVM умеет не только создавать обычные логические тома, но и собирать RAID-массивы. Это удобно, когда хочется управлять дисками, томами и отказоустойчивостью в одном месте, без отдельного mdadm.
Ниже будет шпаргалка по созданию LVM RAID1, замене вылетевшего диска и включению проверки целостности через DM Integrity.
Создаем RAID1 из двух дисков:
apt install lvm2
pvcreate /dev/sdb /dev/sdc
vgcreate vgroup /dev/sdb /dev/sdc
lvcreate --type raid1 -l 100%FREE -n lvraid1 vgroup
Проверяем тип сегмента:
lvs -o+segtype
Создаем файловую систему и монтируем том:
mkfs.ext4 /dev/vgroup/lvraid1
mkdir /mnt/lvraid1
mount /dev/vgroup/lvraid1 /mnt/lvraid1
Смотрим итоговую структуру:
lsblkТеперь можно записать данные и дождаться полной синхронизации:
cp -r /var/log/* /mnt/lvraid1/
Если после этого отключить один из дисков, данные останутся доступны. RAID1 продолжит работать в degraded-состоянии.
Проверить статус можно так:
lvs -a -o name,devices vgroup
Если один диск пропал, в выводе появится устройство со статусом [unknown].
Допустим, вместо старого диска в системе появился новый /dev/sdd.
Добавляем его в VG:
pvcreate /dev/sdd
vgextend vgroup /dev/sdd
Удаляем пропавший диск из volume group:
vgreduce --removemissing vgroup --force
Проверяем, что [unknown] исчез:
lvs -a -o name,devices vgroup
Теперь восстанавливаем RAID и добавляем новый диск в зеркало:
lvconvert --repair vgroup/lvraid1
lvconvert -m1 vgroup/lvraid1 /dev/sdd
На вопросы LVM отвечаем утвердительно. Наблюдать за синхронизацией можно так:
lvs -a -o name,devices vgroup
lvs -o+segtype
В итоге диск заменен, данные на месте, система продолжает работать.
Это один из плюсов LVM RAID: замена диска проходит достаточно логично и без остановки сервера, если железо позволяет hot-swap.
▪️ Еще одна интересная возможность LVM RAID - конвертация уровней RAID на лету. Например, можно начать с RAID1 на двух дисках, а потом добавить еще два диска и прийти к RAID10. Правда, прямой конвертации из RAID1 в RAID10 нет: обычно это делается через промежуточные этапы. Примерная схема:
pvcreate /dev/sdc /dev/sde
vgextend vgroup /dev/sdc /dev/sde
lvconvert --type raid5_n vgroup/lvraid1
lvresize -l5118 vgroup/lvraid1
lvconvert --stripes 1 vgroup/lvraid1
lvconvert --stripes 2 vgroup/lvraid1
lvconvert --type raid10 vgroup/lvraid1
lvconvert --type raid10 vgroup/lvraid1
Размер в lvresize нужно подбирать под конкретный LV. LVM в процессе обычно сам подсказывает, что ему нужно: где не хватает места, где конвертация идет в несколько этапов, и какой промежуточный тип требуется. Если RAID10 создается с нуля, все намного проще. Добавляем 4 диска в VG и создаем LV:
lvcreate --type raid10 -l 100%FREE -n lvraid10 vgroup
▪️ Самая интересная часть - DM Integrity. LVM RAID может проверять целостность данных с помощью контрольных сумм. Это позволяет обнаруживать повреждения и пытаться восстановить данные из другой копии в составе RAID. Включить integrity можно сразу при создании LV:
lvcreate --type raid1 --raidintegrity y -L 9G -n lvraid1 vgroup
Важный момент: под метаданные integrity нужно свободное место. Если указать 100%FREE, можно получить ошибку, потому что LVM не сможет выделить место под служебные данные. Если в VG есть свободное место, integrity можно добавить к уже существующему RAID-томy:
lvconvert --raidintegrity y vgroup/lvraid1
При чтении данных будет проверяться контрольная сумма. Если она не совпадет с сохраненной, LVM попытается восстановить данные из другой копии RAID.
Для каждого диска в составе такого LV создаются дополнительные служебные тома под integrity metadata. Статистику ошибок можно смотреть так:
lvs -o+integritymismatches vgroup/lvraid1_rimage_0_imeta
Нужная колонка:
IntegMismatchesТакже события по DM Integrity будут попадать в системный лог, например:
/var/log/syslog#lvm #raid
🧑💻 NetworkAdmin