RAID и LVM в Linux

RAID объединяет диски для повышения отказоустойчивости, производительности или ёмкости. LVM создаёт гибкий слой логических томов, которые можно расширять, переносить и использовать для снимков.

Типовая схема:

диски → разделы → RAID /dev/md0 → PV → VG → LV → файловая система

Важно: RAID не заменяет бэкап, а snapshot LVM не является независимой резервной копией. Команды разметки, mkfs, pvcreate, lvremove, wipefs и mdadm --zero-superblock могут уничтожить данные. Всегда проверяйте устройства через lsblk и делайте бэкап.

Содержание


Просмотр накопителей

lsblk -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,UUID,MODEL
sudo blkid
sudo fdisk -l
sudo parted /dev/sdb print
sudo smartctl -a /dev/sdb

Стабильные имена доступны в /dev/disk/by-id/. Для /etc/fstab обычно используют UUID, поскольку имена /dev/sdX могут измениться.


Установка инструментов

Debian/Ubuntu:

sudo apt update
sudo apt install mdadm lvm2 smartmontools

Fedora/RHEL:

sudo dnf install mdadm lvm2 smartmontools

Arch Linux:

sudo pacman -S mdadm lvm2 smartmontools

Программный RAID: mdadm

Основные уровни

Уровень Минимум дисков Полезная ёмкость Допустимый отказ
RAID 0 2 сумма дисков нет
RAID 1 2 размер наименьшего диска обычно 1 диск
RAID 5 3 (N - 1) × размер 1 диск
RAID 6 4 (N - 2) × размер 2 диска
RAID 10 4 около 50% суммы зависит от расположения отказов

RAID 0 не даёт избыточности. RAID 1 — простое зеркало. RAID 5/6 используют распределённую чётность. RAID 10 сочетает зеркалирование и чередование и часто обеспечивает хорошую производительность.

При больших дисках восстановление RAID 5 может быть длительным и нагружать оставшиеся накопители. Выбор уровня зависит от нагрузки, допустимого простоя, времени rebuild и наличия проверенных бэкапов.

Подготовка разделов

Пример GPT-разметки для двух дисков:

sudo parted /dev/sdb --script mklabel gpt   mkpart primary 1MiB 100% set 1 raid on
sudo parted /dev/sdc --script mklabel gpt   mkpart primary 1MiB 100% set 1 raid on
lsblk -f /dev/sdb /dev/sdc

Разделы массива должны быть одинакового размера. Полезная ёмкость ограничивается самым маленьким участником.

Создание RAID 1

sudo mdadm --examine /dev/sdb1 /dev/sdc1
sudo mdadm --create /dev/md0   --level=1 --raid-devices=2   /dev/sdb1 /dev/sdc1

Проверка состояния:

cat /proc/mdstat
sudo mdadm --detail /dev/md0
watch -n 2 cat /proc/mdstat

Создание других уровней:

# RAID 5
sudo mdadm --create /dev/md0 --level=5 --raid-devices=3   /dev/sdb1 /dev/sdc1 /dev/sdd1

# RAID 6
sudo mdadm --create /dev/md0 --level=6 --raid-devices=4   /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# RAID 10
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4   /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

Файловая система прямо на RAID

Если LVM не нужен:

sudo mkfs.ext4 -L data /dev/md0
sudo mkdir -p /srv/data
sudo mount /dev/md0 /srv/data
sudo blkid /dev/md0

Пример /etc/fstab:

UUID=<UUID-файловой-системы> /srv/data ext4 defaults,nofail 0 2

Проверка:

sudo mount -a
findmnt --verify

Сохранение конфигурации

Получить описание массива:

sudo mdadm --detail --scan

Debian/Ubuntu обычно используют /etc/mdadm/mdadm.conf:

sudo editor /etc/mdadm/mdadm.conf
sudo update-initramfs -u

RHEL-подобные системы обычно используют /etc/mdadm.conf:

sudo editor /etc/mdadm.conf
sudo dracut -f

Добавьте проверенную строку ARRAY, не создавая дубликатов. Обновление initramfs особенно важно, если массив нужен при загрузке.

Обозначения /proc/mdstat

md0 : active raid1 sdc1[1] sdb1[0]
      976630336 blocks super 1.2 [2/2] [UU]

Проверка массива

echo check | sudo tee /sys/block/md0/md/sync_action
watch -n 2 cat /proc/mdstat
cat /sys/block/md0/md/mismatch_cnt

Остановить текущую проверку:

echo idle | sudo tee /sys/block/md0/md/sync_action

Проверка RAID не заменяет проверку файловой системы и восстановление из бэкапа.

Замена диска в RAID 1

Пусть отказал /dev/sdb1:

sudo mdadm /dev/md0 --fail /dev/sdb1
sudo mdadm /dev/md0 --remove /dev/sdb1

После физической замены создайте на новом диске раздел не меньше прежнего и добавьте его:

sudo mdadm /dev/md0 --add /dev/sdb1
watch -n 2 cat /proc/mdstat
sudo mdadm --detail /dev/md0

Копирование GPT-разметки, где /dev/sdc — исправный источник, /dev/sdb — новый диск:

sudo sgdisk --replicate=/dev/sdb /dev/sdc
sudo sgdisk --randomize-guids /dev/sdb
sudo partprobe /dev/sdb

Перепутанные аргументы уничтожат правильную разметку. После копирования проверьте lsblk и sgdisk -p.

Сборка существующего массива

sudo mdadm --assemble --scan --verbose

Из конкретных компонентов:

sudo mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1

Не применяйте --force без анализа метаданных и актуального бэкапа.

Остановка и удаление RAID

sudo umount /srv/data
sudo mdadm --stop /dev/md0
sudo mdadm --zero-superblock /dev/sdb1 /dev/sdc1

Последняя команда удаляет RAID-метаданные. Выполняйте её только для правильных устройств.


LVM

Архитектура

PV (Physical Volume) → VG (Volume Group) → LV (Logical Volume)

Просмотр:

sudo pvs
sudo vgs
sudo lvs
sudo lvs -o lv_name,vg_name,lv_size,lv_attr,devices
lsblk -f

Создание LVM поверх RAID

Пусть существует /dev/md0:

sudo pvcreate /dev/md0
sudo vgcreate vg_data /dev/md0
sudo lvcreate -L 100G -n app vg_data
sudo lvcreate -l 100%FREE -n backup vg_data

-L задаёт размер, а -l — число или процент физических экстентов.

Создание файловых систем:

sudo mkfs.ext4 -L app /dev/vg_data/app
sudo mkfs.xfs -L backup /dev/vg_data/backup

Монтирование:

sudo mkdir -p /srv/app /srv/backup
sudo mount /dev/vg_data/app /srv/app
sudo mount /dev/vg_data/backup /srv/backup

Получите UUID через blkid и добавьте тома в /etc/fstab:

UUID=<UUID-app>    /srv/app    ext4 defaults 0 2
UUID=<UUID-backup> /srv/backup xfs  defaults 0 0

Проверка:

sudo mount -a
findmnt --verify

LVM непосредственно на дисках

sudo pvcreate /dev/sdb1 /dev/sdc1
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1
sudo lvcreate -L 500G -n data vg_data

Обычный линейный LV на нескольких PV не даёт отказоустойчивости: потеря одного задействованного диска может повредить весь LV. Для защиты используют mdadm, аппаратный RAID или RAID-возможности LVM.

Добавление диска в VG

sudo pvcreate /dev/sdd1
sudo vgextend vg_data /dev/sdd1
sudo pvs
sudo vgs

Расширение LV

Добавить 20 GiB и расширить файловую систему автоматически:

sudo lvextend -r -L +20G /dev/vg_data/app

Использовать всё свободное место VG:

sudo lvextend -r -l +100%FREE /dev/vg_data/app

Раздельный вариант для ext4:

sudo lvextend -L +20G /dev/vg_data/app
sudo resize2fs /dev/vg_data/app

Для XFS:

sudo lvextend -L +20G /dev/vg_data/app
sudo xfs_growfs /srv/app

xfs_growfs принимает точку монтирования.

Уменьшение LV

Уменьшение опаснее расширения. Сначала уменьшают файловую систему, затем LV. Обязательны бэкап и размонтирование.

Для ext4 до итоговых 80 GiB:

sudo umount /srv/app
sudo e2fsck -f /dev/vg_data/app
sudo resize2fs /dev/vg_data/app 80G
sudo lvreduce -L 80G /dev/vg_data/app
sudo mount /srv/app

Можно использовать lvreduce -r, но резервная копия всё равно обязательна:

sudo lvreduce -r -L 80G /dev/vg_data/app

XFS уменьшать нельзя. Создайте новый меньший LV, файловую систему, скопируйте данные, проверьте их и только затем удаляйте старый том.

Перенос данных между PV

sudo lvs -o lv_name,vg_name,lv_size,devices
sudo pvmove /dev/sdb1 /dev/sdd1
sudo vgreduce vg_data /dev/sdb1
sudo pvremove /dev/sdb1

На целевом PV должно хватать свободного места.

Удаление LVM

sudo umount /srv/app
sudo lvremove /dev/vg_data/app
sudo vgremove vg_data
sudo pvremove /dev/md0

Каждый шаг уничтожает соответствующую структуру. Проверьте бэкап и отсутствие использования устройства.


Снимки LVM

Снимок фиксирует состояние origin-LV. При изменении данных старые блоки сохраняются в snapshot по механизму copy-on-write.

Создать snapshot:

sudo lvcreate --snapshot --size 10G   --name app_snap /dev/vg_data/app

Контроль заполнения:

sudo lvs -o lv_name,origin,lv_size,data_percent,lv_attr

Смонтировать только для чтения:

sudo mkdir -p /mnt/app-snapshot
sudo mount -o ro /dev/vg_data/app_snap /mnt/app-snapshot

Удалить после бэкапа:

sudo umount /mnt/app-snapshot
sudo lvremove /dev/vg_data/app_snap

Если классический snapshot заполнится, он станет недействительным. Snapshot не гарантирует логическую согласованность БД: используйте штатные средства СУБД или временно остановите запись.

Откат к снимку:

sudo lvconvert --merge /dev/vg_data/app_snap

Откат удаляет более новые изменения и может примениться после следующей активации тома.


Thin provisioning

Thin pool позволяет выдавать LV виртуальный размер больше физически занятого места:

sudo lvcreate -L 500G --thinpool thinpool vg_data
sudo lvcreate -V 1T --thin -n vm01 vg_data/thinpool

Мониторинг:

sudo lvs -o lv_name,lv_size,pool_lv,data_percent,metadata_percent

Заполнение thin pool или его метаданных может вызвать ошибки ввода-вывода. Нужны пороги, уведомления и запас пространства.


RAID средствами LVM

RAID 1:

sudo pvcreate /dev/sdb1 /dev/sdc1
sudo vgcreate vg_data /dev/sdb1 /dev/sdc1
sudo lvcreate --type raid1 -m 1 -L 100G -n data vg_data
sudo lvs -a -o lv_name,segtype,devices,raid_sync_action

mdadm под LVM легче видеть отдельным слоем; LVM RAID удобен единым набором команд. Выбор зависит от стандартов эксплуатации и опыта администраторов.


Полный пример: RAID 1 + LVM

Исходные диски — /dev/sdb и /dev/sdc:

# Проверка
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL
sudo wipefs -n /dev/sdb
sudo wipefs -n /dev/sdc

# Разделы
sudo parted /dev/sdb --script mklabel gpt   mkpart primary 1MiB 100% set 1 raid on
sudo parted /dev/sdc --script mklabel gpt   mkpart primary 1MiB 100% set 1 raid on

# RAID 1
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2   /dev/sdb1 /dev/sdc1

# LVM
sudo pvcreate /dev/md0
sudo vgcreate vg_data /dev/md0
sudo lvcreate -L 100G -n app vg_data
sudo lvcreate -l 100%FREE -n backup vg_data

# Файловые системы
sudo mkfs.ext4 -L app /dev/vg_data/app
sudo mkfs.ext4 -L backup /dev/vg_data/backup

# Монтирование
sudo mkdir -p /srv/app /srv/backup
sudo mount /dev/vg_data/app /srv/app
sudo mount /dev/vg_data/backup /srv/backup

# Контроль
cat /proc/mdstat
sudo mdadm --detail /dev/md0
sudo pvs
sudo vgs
sudo lvs -o +devices
lsblk -f

Получите UUID через blkid, настройте /etc/fstab, выполните mount -a и сохраните конфигурацию mdadm.


Расширение всего стека

Порядок расширения:

диск/раздел → RAID → PV → LV → файловая система

После увеличения компонентов массива:

sudo mdadm --grow /dev/md0 --size=max
sudo pvresize /dev/md0
sudo lvextend -r -l +100%FREE /dev/vg_data/app

Изменение числа дисков, уровня или геометрии RAID — длительная рискованная операция. Нужны проверенный бэкап, стабильное питание и план восстановления.


Swap на LVM

sudo lvcreate -L 8G -n swap vg_data
sudo mkswap /dev/vg_data/swap
sudo swapon /dev/vg_data/swap
swapon --show

Строка /etc/fstab:

UUID=<UUID-swap> none swap sw 0 0

Перед уменьшением или удалением swap выполните swapoff и убедитесь, что памяти достаточно.


Диагностика

RAID:

cat /proc/mdstat
sudo mdadm --detail /dev/md0
sudo mdadm --examine /dev/sdb1 /dev/sdc1
sudo mdadm --assemble --scan --verbose
journalctl -k -b | grep -Ei 'md|raid|block|I/O error'

LVM:

sudo pvscan
sudo vgscan
sudo lvscan
sudo vgchange -ay
sudo dmsetup ls --tree

Файловые системы и заполнение:

lsblk -f
findmnt
df -hT
df -ih
sudo lvs -a -o lv_name,lv_size,data_percent,metadata_percent
sudo lsof +L1

Для проверки ext4 том должен быть размонтирован:

sudo e2fsck -f /dev/vg_data/app

Диагностическая проверка XFS:

sudo xfs_repair -n /dev/vg_data/app

Перед восстановлением повреждённого хранилища по возможности создайте образ или отдельную копию.


Резервное копирование метаданных LVM

LVM хранит копии метаданных в:

/etc/lvm/backup/
/etc/lvm/archive/

Ручной бэкап:

sudo vgcfgbackup vg_data
sudo vgcfgrestore --list vg_data

Эти файлы описывают структуру LVM, но не содержат пользовательские данные. Включите /etc/lvm в системный бэкап.


Мониторинг и эксплуатация

Периодический TRIM для SSD:

lsblk --discard
sudo systemctl enable --now fstrim.timer
sudo fstrim -av

Поддержка discard должна присутствовать на всех слоях стека.


Типичные ошибки


Краткая памятка

# RAID
cat /proc/mdstat
sudo mdadm --detail /dev/md0
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
sudo mdadm /dev/md0 --fail /dev/sdb1
sudo mdadm /dev/md0 --remove /dev/sdb1
sudo mdadm /dev/md0 --add /dev/sdb1
sudo mdadm --assemble --scan

# LVM
sudo pvs
sudo vgs
sudo lvs -a -o +devices
sudo pvcreate /dev/md0
sudo vgcreate vg_data /dev/md0
sudo lvcreate -L 100G -n app vg_data
sudo lvextend -r -L +20G /dev/vg_data/app
sudo vgextend vg_data /dev/sdd1
sudo pvmove /dev/sdb1
sudo lvcreate -s -L 10G -n app_snap /dev/vg_data/app
sudo vgcfgbackup vg_data

Для двух дисков типовая надёжная схема выглядит так:

2 диска → RAID 1 mdadm → LVM → ext4/XFS

Для четырёх и более дисков при высокой нагрузке часто рассматривают RAID 10, а для эффективного использования большой ёмкости с защитой от двух отказов — RAID 6. Выбор должен учитывать производительность, время восстановления, допустимый простой и проверенный план бэкапа.