# 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/Диск отключил. Проверяю данные, всё на месте. То есть LV работает как и прежде. Проверяю статус:
# lvs -a -o name,devices vgroupВижу, что одно устройство в статусе [unknown]. Добавляю в систему новый диск. Не тот же самый, что я отключил.
# lsblkВижу, что он подключился на
/dev/sdd. Добавляю его в VG:# pvcreate /dev/sdd# vgextend vgroup /dev/sddУдаляем вывалившийся диск:
# vgreduce --removemissing vgroup --forceПроверяем:
# lvs -a -o name,devices vgroupУстройства в статусе [unknown] больше нет. Добавляем в наш LV новый диск:
# lvconvert --repair vgroup/lvraid1# lvconvert -m1 vgroup/lvraid1 /dev/sddНа все вопросы отвечаем утвердительно. Смотрим результат и наблюдаем за синхронизацией:
# lvs -a -o name,devices vgroup# lvs -o+segtypeПошла синхронизация, данные все на месте. Замена прошла без остановки системы. Диски убирал и добавлял наживую. В целом, ничего сложного. Вполне понятный и логичный набор команд. Один раз проверил, записал и воспроизвёл в случае выхода из строя диска.
Из особенностей LVM Raid - LV можно конвертировать налету в разные уровни рейдов, добавлять к ним диски. Можно из raid1 сделать raid5, добавить туда диски. Не думаю, что на практике это будет оправданно. А вот превратить raid1 в raid10 видится полезным. Было 2 диска, добавил ещё 2 и получил raid10. Для этого надо добавить 2 диска в VG и сконвертировать LV. Прямой конвертации из raid1 в raid10 нет. Нужно сначала сконвертировать в raid5, добавить туда 2 диска, дождаться синхронизации и сконвертировать в raid10:
# pvcreate /dev/sdc /dev/sde# vgextend vgroup /dev/sdc /dev/sde# lvconvert --type raid5_n vgroup/lvraid1# lvresize -l5118 vgroup/lvraid1 # размер зависит от размера LV# lvconvert --stripes 1 vgroup/lvraid1# lvconvert --stripes 2 vgroup/lvraid1# lvconvert --type raid10 vgroup/lvraid1# lvconvert --type raid10 vgroup/lvraid1На выходе получил из RAID1 ⇨ RAID10 без остановки и потери данных. Я по всем этим командам получал подсказки в консоли. Там и по размеру подсказки были, и по тому, что финальная конвертация проходит в 2 этапа, и что сначала надо в raid5_n сконвертировать.
Если делать с нуля RAID10, то команда простая. Сначала добавляем 4 одинаковых диска в VG, потом создаём LV:
# lvcreate --type raid10 -l 100%FREE -n lvraid10 vgroupА теперь ради чего всё это затевалось. LVM Raid умеет вести контроль целостности файлов на основе хэшей. Реализуется это на базе технологии DM Integrity. Включаем её во время создания LV:
# lvcreate --type raid1 --raidintegrity y -L 9G -n lvraid1 vgroupРазмер нужно будет вычислять опытным путём. Я сначала указал размер 100% и получил ошибку, что для моих 10G дисков нужно 150 MiB под метаданные. В итоге указал 9G.
Если в VG есть свободное место, то добавить raidintegrity можно к существующему тому:
# lvconvert --raidintegrity y vgroup/lvraid1При каждой операции чтения выполняется расчёт контрольной суммы файла. Если она не совпадает с сохранённой ранее, выполняется попытка восстановления файла из других копий в составе рейда.
Для каждого диска в составе LV с DM Integrity создаётся отдельный LV rimage для хранения метаданных. В нём можно посмотреть статистику по ошибкам:
# lvs -o+integritymismatches vgroup/lvraid1_rimage_0_imetaКолонка IntegMismatches. Все события по DM Integrity будут в системном логе /var/log/syslog.
Всё, что я показал, подробно описано в руководстве по LVM от Red Hat.
#lvm #raid
