RAID и LVM в Linux
RAID объединяет диски для повышения отказоустойчивости, производительности или ёмкости. LVM создаёт гибкий слой логических томов, которые можно расширять, переносить и использовать для снимков.
Типовая схема:
диски → разделы → RAID /dev/md0 → PV → VG → LV → файловая системаВажно: RAID не заменяет бэкап, а snapshot LVM не является независимой резервной копией. Команды разметки,
mkfs,pvcreate,lvremove,wipefsиmdadm --zero-superblockмогут уничтожить данные. Всегда проверяйте устройства черезlsblkи делайте бэкап.
Содержание
- Просмотр накопителей
- Установка инструментов
- Программный RAID: mdadm
- LVM
- Снимки LVM
- Thin provisioning
- RAID средствами LVM
- Полный пример: RAID 1 + LVM
- Расширение всего стека
- Swap на LVM
- Диагностика
- Резервное копирование метаданных LVM
- Мониторинг и эксплуатация
- Типичные ошибки
- Краткая памятка
Просмотр накопителей
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 smartmontoolsFedora/RHEL:
sudo dnf install mdadm lvm2 smartmontoolsArch 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 --scanDebian/Ubuntu обычно используют /etc/mdadm/mdadm.conf:
sudo editor /etc/mdadm/mdadm.conf
sudo update-initramfs -uRHEL-подобные системы обычно используют /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][UU]— оба компонента доступны;[U_]или[_U]— один компонент отсутствует;resync— синхронизация;recovery— восстановление;reshape— изменение геометрии;check— проверка согласованности.
Проверка массива
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)- PV — диск, раздел, RAID-массив или другое блочное устройство;
- VG — общий пул пространства из одного или нескольких PV;
- LV — логический том, выделенный из VG.
Просмотр:
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 --verifyLVM непосредственно на дисках
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/appxfs_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/appXFS уменьшать нельзя. Создайте новый меньший 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_actionmdadm под 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 в системный бэкап.
Мониторинг и эксплуатация
- Настройте SMART-мониторинг физических дисков.
- Контролируйте degraded-состояние и отправку уведомлений mdadm.
- Проверяйте
/proc/mdstat,mdadm --detail,pvs,vgs,lvs. - Следите за заполнением snapshot и thin pool.
- Документируйте серийные номера, слоты и
/dev/disk/by-id/. - Регулярно тестируйте восстановление из бэкапа.
- Используйте ИБП для длительных операций rebuild и reshape.
- Не применяйте
--forceбез понимания последствий. - Перед resize, reshape и merge snapshot создавайте актуальную копию данных.
Периодический TRIM для SSD:
lsblk --discard
sudo systemctl enable --now fstrim.timer
sudo fstrim -avПоддержка discard должна присутствовать на всех слоях стека.
Типичные ошибки
- RAID считают бэкапом. Он не защищает от удаления, повреждения ФС, ошибки приложения или потери всего сервера.
- LV уменьшают раньше файловой системы. Это повреждает данные.
- Не мониторят degraded-массив. Первый отказ остаётся незамеченным до второго.
- Snapshot оставляют надолго. Он заполняется и повышает нагрузку записи.
- Thin pool переполняют. Возможны ошибки ввода-вывода и повреждение ФС.
- Используют
/dev/sdXкак постоянный идентификатор. Лучше UUID и/dev/disk/by-id/. - Создают линейный LV на нескольких дисках и ожидают отказоустойчивость. Обычный LVM её не предоставляет.
Краткая памятка
# 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. Выбор должен учитывать производительность, время восстановления, допустимый простой и проверенный план бэкапа.