RAID1 с mdadm и LVM — создание и перенос данных
Введение
Эта инструкция описывает создание программных RAID1-массивов с помощью mdadm, настройку загрузчика GRUB2 и интеграцию RAID с Lvm2 (LVM). Цели:
- /dev/md0 — RAID1, будет содержать /boot (ext2, не-LVM), чтобы обеспечивать загрузку при отказе диска;
- /dev/md1 — RAID1 для LVM PV (будет добавлен в существующую VG и использоваться для LV);
- Перенос данных и переключение системы на использование RAID-массивов.
Кому полезно: системным администраторам и инженерам DevOps, выполняющим миграцию с одиночных дисков на зеркалирование без полной переустановки ОС.
Коротко о терминах:
- RAID1: зеркалирование, два диска хранят одинаковые данные;
- mdadm: утилита для управления программными RAID в Linux;
- LVM: логический менеджер томов; PV — физический том, VG — группа томов, LV — логический том.
Important: перед началом сделайте полную резервную копию критичных данных и снимите образ дисков (dd, clonezilla или аппаратный снапшот), особенно если вы работаете на продакшн-сервере.
4 Создание RAID-массивов
Теперь создадим RAID-массивы /dev/md0 и /dev/md1. В примере /dev/sdb1 будет добавлен в /dev/md0, а /dev/sdb5 — в /dev/md1. Разделы /dev/sda1 и /dev/sda5 пока нельзя добавить, потому что система загружается с них; поэтому в командах используется placeholder missing.
Создаём /dev/md0 (RAID1 для /boot):
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
Создаём /dev/md1 (RAID1 для LVM PV):
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb5
Во время выполнения вы можете увидеть приглашение подтвердить создание массива. Нажмите y, чтобы продолжить. Пример вывода:
root@server1:~# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb5
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? <-- y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md1 started.
root@server1:~#
В выводе cat /proc/mdstat вы увидите, что оба массива созданы, но находятся в состоянии degraded ([U] или [U] означает деградацию, [UU] — массив в порядке):
root@server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb5[1]
4989940 blocks super 1.2 [2/1] [_U]
md0 : active raid1 sdb1[1]
248820 blocks super 1.2 [2/1] [_U]
unused devices:
root@server1:~#
Теперь создаём файловую систему ext2 на /dev/md0 (для /boot):
mkfs.ext2 /dev/md0
Подготовка /dev/md1 для LVM: объявляем физический том (PV):
pvcreate /dev/md1
Добавляем PV в существующую группу томов server1:
vgextend server1 /dev/md1
Проверяем pvdisplay — теперь вы должны увидеть /dev/md1 как PV в VG server1 с свободными PE:
root@server1:~# pvdisplay
--- Physical volume ---
PV Name /dev/sda5
VG Name server1
PV Size 4.76 GiB / not usable 2.00 MiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 1218
Free PE 0
Allocated PE 1218
PV UUID 8p9j8i-cc9a-bAJq-LFP9-CBMF-JrPl-SDbx4X
--- Physical volume ---
PV Name /dev/md1
VG Name server1
PV Size 4.76 GiB / not usable 1012.00 KiB
Allocatable yes
PE Size 4.00 MiB
Total PE 1218
Free PE 1218
Allocated PE 0
PV UUID W4I07I-RT3P-DK1k-1HBz-oJvp-6in0-uQ53KS
root@server1:~#
Вывод vgdisplay показывает, что VG server1 теперь содержит 2 PV и свободное место:
root@server1:~# vgdisplay
--- Volume group ---
VG Name server1
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 9.52 GiB
PE Size 4.00 MiB
Total PE 2436
Alloc PE / Size 1218 / 4.76 GiB
Free PE / Size 1218 / 4.76 GiB
VG UUID m99fJX-gMl9-g2XZ-CazH-32s8-sy1Q-8JjCUW
root@server1:~#
Обновление конфигурации mdadm
Скопируйте текущий mdadm.conf и добавьте автоматически сгенерированные массивы:
cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Проверим содержимое:
cat /etc/mdadm/mdadm.conf
В файле вы должны увидеть записи ARRAY для /dev/md/0 и /dev/md/1. Пример автогенерированного блока:
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#
# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions
# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes
# automatically tag new arrays as belonging to the local system
HOMEHOST
# instruct the monitoring daemon where to send mail alerts
MAILADDR root
# definitions of existing MD arrays
# This file was auto-generated on Tue, 24 May 2011 21:11:37 +0200
# by mkconf 3.1.4-1+8efb9d1
ARRAY /dev/md/0 metadata=1.2 UUID=6cde4bf4:7ee67d24:b31e2713:18865f31 name=server1.example.com:0
ARRAY /dev/md/1 metadata=1.2 UUID=3ce9f2f2:ac89f75a:530c5ee9:0d4c67da name=server1.example.com:1
Важно: проверьте UUID и пути — они должны соответствовать вашей системе.
Обновление /etc/fstab и /etc/mtab
Отредактируйте /etc/fstab: закомментируйте старую запись /boot и добавьте /dev/md0 для /boot:
vi /etc/fstab
Пример секции fstab:
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc defaults 0 0
/dev/mapper/server1-root / ext3 errors=remount-ro 0 1
# /boot was on /dev/sda1 during installation
#UUID=9b817b3e-2cea-4505-b1be-5ca9fd67f2ff /boot ext2 defaults 0 2
/dev/md0 /boot ext2 defaults 0 2
/dev/mapper/server1-swap_1 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto 0 0
Также обновите /etc/mtab (временный, отражает текущее монтирование) — замените /dev/sda1 на /dev/md0:
vi /etc/mtab
Пример:
/dev/mapper/server1-root / ext3 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/md0 /boot ext2 rw 0 0
Настройка GRUB2 для загрузки с RAID
Создайте файл /etc/grub.d/09_swraid1_setup, скопировав шаблон и отредактировав menuentry:
cp /etc/grub.d/40_custom /etc/grub.d/09_swraid1_setup
vi /etc/grub.d/09_swraid1_setup
Пример содержимого (обязательно используйте правильную версию ядра и правильное имя VG/LV в строке linux):
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
insmod raid
insmod mdraid
insmod part_msdos
insmod ext2
set root='(md/0)'
echo 'Loading Linux 2.6.32-5-amd64 ...'
linux /vmlinuz-2.6.32-5-amd64 root=/dev/mapper/server1-root ro quiet
echo 'Loading initial ramdisk ...'
initrd /initrd.img-2.6.32-5-amd64
}
Ключевая строка: set root=’(md/0)’ — она указывает GRUB загружать /boot с RAID-устройства md0. Если в linux-строке указана группа томов с именем отличным от server1, замените root=/dev/mapper/server1-root соответствующим именем.
Редактируем /etc/default/grub и отключаем использование UUID в параметре ядра (если вы не используете UUID для устройств):
vi /etc/default/grub
Найдите и раскомментируйте:
GRUB_DISABLE_LINUX_UUID=true
Перед запуском update-grub следует убедиться, что в /boot/grub/device.map присутствуют оба диска, иначе update-grub может завершиться ошибкой “Couldn’t find PV pv1. Check your device.map.”. Откройте файл и добавьте /dev/sdb:
vi /boot/grub/device.map
Должно быть:
(hd0) /dev/sda
(hd1) /dev/sdb
Теперь обновите конфигурацию GRUB и initramfs:
update-grub
update-initramfs -u
Если update-grub сообщает об ошибках — внимательно проверьте device.map, записи mdadm.conf и корректность путей к ядру и initrd в /boot.
5 Перенос данных на RAID-массивы
После корректной настройки конфигурационных файлов можно перенести данные с /dev/sda на /dev/sdb и включить зеркалирование полного набора разделов.
Перенос LVM PV на md1
Чтобы переместить содержимое LVM PV /dev/sda5 на /dev/md1, используем pvmove. Пример с параметром -i 2 (интервал прогресс-вывода); можно опустить -i.
pvmove -i 2 /dev/sda5 /dev/md1
Операция может занять продолжительное время — выполняется копирование всех используемых extents. Будьте терпеливы.
После завершения перемещения удаляем /dev/sda5 из VG и очищаем PV:
vgreduce server1 /dev/sda5
pvremove /dev/sda5
Проверка pvdisplay должна показать только /dev/md1 в VG:
root@server1:~# pvdisplay
--- Physical volume ---
PV Name /dev/md1
VG Name server1
PV Size 4.76 GiB / not usable 1012.00 KiB
Allocatable yes (but full)
PE Size 4.00 MiB
Total PE 1218
Free PE 0
Allocated PE 1218
PV UUID W4I07I-RT3P-DK1k-1HBz-oJvp-6in0-uQ53KS
root@server1:~#
Перенос раздела /boot на md0 и включение зеркала на sda
Измените тип раздела /dev/sda5 на Linux raid autodetect и добавьте её в md1. В примере редакция была выполнена через fdisk:
fdisk /dev/sda
Пример интерактивной сессии:
root@server1:~# fdisk /dev/sda
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): <-- t
Partition number (1-5): <-- 5
Hex code (type L to list codes): <-- fd
Changed system type of partition 5 to fd (Linux raid autodetect)
Command (m for help): <-- w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
root@server1:~#
Добавляем /dev/sda5 в md1 и следим за синхронизацией:
mdadm --add /dev/md1 /dev/sda5
cat /proc/mdstat
Пример прогресса синхронизации:
root@server1:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda5[2] sdb5[1]
4989940 blocks super 1.2 [2/1] [_U]
[====>................] recovery = 22.5% (1127872/4989940) finish=0.3min speed=161124K/sec
md0 : active raid1 sdb1[1]
248820 blocks super 1.2 [2/1] [_U]
unused devices:
root@server1:~#
Для постоянного мониторинга используйте:
watch cat /proc/mdstat
Выход из watch — CTRL+C.
Дождитесь состояния [UU], означающего, что оба диска в массиве синхронизированы:
root@server1:~# cat /proc/mdstat
...
md1 : active raid1 sda5[2] sdb5[1]
4989940 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sdb1[1]
248820 blocks super 1.2 [2/1] [_U]
...
После этого смонтируйте /dev/md0 и скопируйте содержимое текущего /boot на новый массив:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
mount # чтобы убедиться, что /dev/md0 примонтирован
cd /boot
cp -dpRx . /mnt/md0
Флаги cp: -d сохраняет ссылки, -p сохраняет права и временные метки, -R рекурсивно, -x не перескакивать файловые системы.
Проверки, тестирование и приёмка
Критерии приёмки
- /dev/md0 монтируется как /boot и содержит ожидаемые файлы (vmlinuz, initrd.img, grub.cfg);
- GRUB установлен и указывает root=’(md/0)’ в пользовательской записи;
- update-grub прошёл без ошибок;
- /dev/md1 добавлен в VG и все LV доступны;
- cat /proc/mdstat показывает [UU] для всех RAID1 массивов;
- после перезагрузки система успешно стартует с каждого из дисков по отдельности (см. тесты ниже).
Тесты и сценарии приёмки
- Перезагрузите сервер и проверьте, что он загружается нормально.
- Отключите (временно) кабель или сделайте failover одного из дисков (например, /dev/sda) и убедитесь, что система остаётся загрузочной и работает с одним диском.
- Повторите для другого диска (/dev/sdb).
- Проверьте mount, pvdisplay, vgdisplay, lvdisplay, cat /proc/mdstat.
- Проверьте наличие бэкапов grub.cfg и сохранённых конфигураций mdadm.conf.
Important: выполнение теста «отключить диск» на продакшн-сервере планируйте в окно обслуживания.
Контрольные списки для ролей
Администратор (перед началом):
- Сделать полный бэкап данных и снимок дисков;
- Уведомить пользователей о возможной рестарте системы;
- Подготовить загрузочную флешку/консоль для восстановления;
- Проверить наличие свободного места в VG и свободных PV.
Оператор (в процессе):
- Выполнить команды создания mdadm строго по шагам;
- Проверить выводы каждой команды и журнал syslog/dmesg на ошибки;
- Мониторить cat /proc/mdstat во время синхронизации;
- Обновить конфигурации и выполнить update-grub, update-initramfs.
План отката и план действий при инциденте
Если что-то пошло не так:
- Если массив /dev/md0/ /dev/md1 не стартовал — отключите недавно добавленные устройства (mdadm –stop /dev/mdX), восстановите оригинальные /etc/fstab и /etc/mdadm/mdadm.conf из резервной копии и перезагрузитесь.
- Если LVM была повреждена, восстановите PV из резервной копии pvcreate/ vgcfgbackup и vgcfgrestore (если ранее создавали бэкап конфигурации VG):
- vgcfgbackup server1 # сохраняет метаданные
- vgcfgrestore server1 –file
- Если загрузчик GRUB перестал видеть /boot — подключите live-образ, смонтируйте /boot и восстановите /boot/grub, затем выполните grub-install на обоих дисках.
Критерии успеха отката: сервер должен загружаться так же, как до изменений, и все рабочие тома доступны.
Когда этот подход не подходит
- Если требуется RAID уровня выше (RAID6/10) для высокой доступности и производительности;
- Если вы используете аппаратный RAID- контроллер и хотите управлять им через его утилиты;
- Если у вас единственный диск и нет второго физического носителя — зеркалирование невозможно.
Альтернативы:
- Аппаратный RAID контроллер (встроенный в сервер) — меньше нагрузки на CPU и другие возможности управления;
- Использование Btrfs/ZFS с нативным зеркалированием и встроенной целостностью;
- Использование распределённых файловых систем (GlusterFS, Ceph) для кластера.
Ментальные модели и эвристики
- Модель: “RAID = избыточность на уровне блоков, LVM = гибкость на уровне логики”. RAID предоставляет зеркалирование/паритет, LVM упрощает управление разделами и расширение томов.
- Эвристика: сначала создавайте и тестируйте RAID, затем подключайте LVM и переносите данные; не делайте обратного.
Небольшой глоссарий (1 строка каждый)
- mdadm: утилита для управления программными RAID в Linux;
- md (Multi-Device): устройство-агрегатор, например /dev/md0;
- PV: Physical Volume — физический том LVM;
- VG: Volume Group — группа физических томов;
- LV: Logical Volume — логический раздел, предоставляемый LVM;
- pvmove: команда для миграции extents между PV.
Риски и их смягчение
- Риск: потеря данных при ошибке команд. Смягчение: снимок/бэкап перед началом.
- Риск: неправильная конфигурация GRUB, приводящая к невозможности загрузки. Смягчение: иметь live-USB и инструкции по восстановлению, протестировать GRUB до отключения старого диска.
- Риск: длительная синхронизация при высокой нагрузке. Смягчение: проводить операции в окне обслуживания, ограничивать скорость rsync/pvmove при необходимости.
Итог
Процесс создания RAID с mdadm и интеграции его с LVM состоит из следующих ключевых шагов: создать массивы с использованием placeholder missing, создать FS на non-LVM-массиве, pvcreate и vgextend для LVM, обновить mdadm.conf и fstab, настроить GRUB для загрузки с (md/0), выполнить pvmove и mdadm –add для добавления второго зеркального диска, дождаться синхронизации и проверить состояние. После успешной синхронизации можно безопасно удалить старые PV и при необходимости менять типы разделов.
Summary:
- Создали /dev/md0 и /dev/md1;
- Настроили /etc/mdadm/mdadm.conf и /etc/fstab;
- Обновили GRUB и initramfs;
- Перенесли PV LVM на md1 и синхронизировали массивы;
- Скопировали /boot на md0 и подтвердили работоспособность.
Если нужна помощь с конкретной конфигурацией (выводы fdisk -l, pvdisplay, mdadm –detail), приложите их — помогу проанализировать и предложить дальнейшие шаги.
Похожие материалы

Замедленная съёмка на Android — как включить

Исправить INET_E_RESOURCE_NOT_FOUND в Windows 10

Автоочистка Корзины в Windows 10

Изменить размер Speed Dial в Vivaldi
Google Pay на рутованном Android
