Создание RAID-массивов и перенос данных
TL;DR
Коротко: создаём два зеркальных RAID1-массива (/dev/md0 для /boot и /dev/md1 для LVM), временно используем “missing” для дисков, на которых система загружена, настраиваем mdadm, обновляем /etc/fstab и загрузчик GRUB, затем переносим данные с оригинальных дисков на новые RAID-диски и добавляем оставшиеся диски в массивы для синхронизации.
Важно: выполняйте операции с правами root и имейте резервную копию критичных данных перед изменением разделов, LVM или загрузчика.
Введение
В этом руководстве описан пошаговый процесс создания RAID1-массивов на существующем сервере CentOS и перенос на них данных, включая интеграцию с LVM и настройку загрузчика. Подход применим к похожим дистрибутивам Linux и использует инструменты mdadm, LVM (pvcreate, vgextend, pvmove и т. п.), и стандартный загрузчик GRUB.
Определения в одну строку:
- RAID1 — зеркалирование: данные пишутся на два диска одновременно.
- LVM — логический менеджер томов: абстракция над физическими дисками/разделами.
- mdadm — утилита для управления программными RAID (Linux MD).
Основные цели этого шага
- Создать /dev/md0 (для /boot) и /dev/md1 (для LVM) как RAID1 с временным плейсхолдером missing.
- Создать файловую систему на /dev/md0 и подготовить /dev/md1 для LVM (pvcreate, vgextend).
- Обновить конфигурацию mdadm, /etc/fstab, /etc/mtab и GRUB, чтобы система могла загрузиться с RAID.
- Перенести данные с /dev/sda на /dev/sdb, затем добавить /dev/sda в массивы и дождаться синхронизации.
4 Создание RAID-массивов
Создадим два RAID1-массива: /dev/md0 и /dev/md1. Поскольку система сейчас загружена с /dev/sda1 и /dev/sda2, эти разделы нельзя сразу включить в массивы. При создании используем placeholder missing для временного отсутствующего устройства.
Выполните:
mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
Проверить состояние массивов можно через /proc/mdstat:
cat /proc/mdstat
Ожидаемый вывод (пример):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sdb2[1]
10377920 blocks [2/1] [_U]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
Примечание: [U] или [U] указывает, что массив деградирован (отсутствует один член), [UU] — массив в порядке.
Создание файловой системы на /dev/md0
Создаём ext3 для /boot на /dev/md0:
mkfs.ext3 /dev/md0
Подготовка /dev/md1 для LVM
Подготавливаем физический том на /dev/md1:
pvcreate /dev/md1
Добавляем его в существующую группу томов VolGroup00:
vgextend VolGroup00 /dev/md1
Проверить текущие PV и VG:
pvdisplay
vgdisplay
Пример вывода pvdisplay (теперь вы увидите /dev/md1 как PV):
[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.76 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID aikFEP-FB15-nB9C-Nfq0-eGMG-hQid-GOsDuj
--- Physical volume ---
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes
PE Size (KByte) 32768
Total PE 316
Free PE 316
Allocated PE 0
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
Пример вывода vgdisplay (показывает обновлённую общую ёмкость VG):
[root@server1 ~]# vgdisplay
--- Volume group ---
VG Name VolGroup00
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 19.75 GB
PE Size 32.00 MB
Total PE 632
Alloc PE / Size 316 / 9.88 GB
Free PE / Size 316 / 9.88 GB
VG UUID ZPvC10-cN09-fI0S-Vc8l-vOuZ-wM6F-tlz0Mj
[root@server1 ~]#
Обновление конфигурации mdadm и файловых таблиц
Создайте /etc/mdadm.conf на основании текущих массивов:
mdadm --examine --scan > /etc/mdadm.conf
Просмотрите файл:
cat /etc/mdadm.conf
В файле будут строки типа:
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=0a96be0f:bf0f4631:a910285b:0f337164
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=f9e691e2:8d25d314:40f42444:7dbe1da1
Обновление /etc/fstab
Откройте /etc/fstab и замените запись LABEL=/boot или /dev/sda1 на /dev/md0. Пример /etc/fstab:
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
/dev/md0 /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
Обновление /etc/mtab
Обновите /etc/mtab, заменив /dev/sda1 на /dev/md0 (параметры монтирования должны соответствовать текущему состоянию):
/dev/mapper/VolGroup00-LogVol00 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/md0 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
Настройка GRUB для fallback-загрузки с RAID
Откройте /boot/grub/menu.lst (или /boot/grub/grub.conf в зависимости от вашей системы) и добавьте fallback=1 после default=0, чтобы загрузчик попытался второй вариант при сбое первого:
default=0
fallback=1
Найдите секции с записями kernel/initrd и продублируйте первую запись, изменив root (hd0,0) на root (hd1,0). Пример:
title CentOS (2.6.18-128.el5)
root (hd1,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-128.el5.img
title CentOS (2.6.18-128.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-128.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-128.el5.img
Объяснение: root (hd1,0) указывает GRUB на /dev/sdb, который уже участвует в RAID. Если прообраз с RAID не загрузится, будет использован fallback (hd0 -> /dev/sda).
Обновление initrd
Сделайте резервную копию текущего initrd и пересоздайте его, чтобы он включал mdadm/LVM-модули:
mv /boot/initrd-`uname -r`.img /boot/initrd-`uname -r`.img_orig
mkinitrd /boot/initrd-`uname -r`.img `uname -r`
Важно: убедитесь, что в initrd включены модули md и lvm, иначе система не сможет найти корневой том при загрузке с RAID.
5 Перенос данных на RAID
После обновления конфигурации можно переносить данные. Сначала переносим LVM-разделы, затем системный /boot.
Перемещение LVM PV на /dev/md1
Переносим содержимое /dev/sda2 в /dev/md1:
pvmove /dev/sda2 /dev/md1
Это может занять длительное время — дождитесь завершения. После переноса удаляем /dev/sda2 из VG и помечаем PV как неиспользуемый:
vgreduce VolGroup00 /dev/sda2
pvremove /dev/sda2
Проверим состояние PV:
pvdisplay
Ожидаемый вывод покажет только /dev/md1 как физический том:
[root@server1 ~]# pvdisplay
--- Physical volume ---
PV Name /dev/md1
VG Name VolGroup00
PV Size 9.90 GB / not usable 22.69 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 316
Free PE 0
Allocated PE 316
PV UUID u6IZfM-5Zj8-kFaG-YN8K-kjAd-3Kfv-0oYk7J
[root@server1 ~]#
Изменение типа раздела и добавление /dev/sda2 в RAID
Измените тип раздела /dev/sda2 на Linux raid autodetect (код fd) с помощью fdisk:
fdisk /dev/sda
Пример интерактивных команд (вводимые вами отмечены стрелками в примере):
[root@server1 ~]# fdisk /dev/sda
Command (m for help): <-- t
Partition number (1-4): <-- 2
Hex code (type L to list codes): <-- fd
Changed system type of partition 2 to fd (Linux raid autodetect)
Command (m for help): <-- w
The partition table has been altered!
Внимание: иногда ядро не перечитывает таблицу разделов сразу (ошибка 16). В этом случае новые таблицы вступят в силу после перезагрузки. Однако добавление раздела в mdadm всё ещё возможно.
Добавим /dev/sda2 в /dev/md1:
mdadm --add /dev/md1 /dev/sda2
Проверяем синхронизацию:
cat /proc/mdstat
Пример прогресса синхронизации:
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md1 : active raid1 sda2[2] sdb2[1]
10377920 blocks [2/1] [_U]
[====>................] recovery = 23.4% (2436544/10377920) finish=2.0min speed=64332K/sec
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
unused devices:
[root@server1 ~]#
Совет: запустите мониторинг в реальном времени:
watch cat /proc/mdstat
Для выхода из watch: Ctrl+C.
Дождитесь, пока массив станет [UU]:
[root@server1 ~]# cat /proc/mdstat
...
md1 : active raid1 sda2[0] sdb2[1]
10377920 blocks [2/2] [UU]
md0 : active raid1 sdb1[1]
104320 blocks [2/1] [_U]
Монтирование /dev/md0 и копирование /boot
Создаём точку монтирования и монтируем /dev/md0:
mkdir /mnt/md0
mount /dev/md0 /mnt/md0
Проверяем вывод mount:
mount
Должны увидеть /dev/md0 на /boot и на /mnt/md0. Далее копируем содержимое /boot (который сейчас на /dev/sda1) на новый массив:
cd /boot
cp -dpRx . /mnt/md0
Копирование флагов: cp -dpRx сохраняет права, ссылки и рекурсивно копирует, не следуя симлинкам.
После копирования рекомендуется ещё раз проверить /mnt/md0 на наличие всех файлов, прав и совпадения с /boot.
Проверка и приёмка
Критерии приёмки — что должно быть подтверждено перед перезагрузкой и после неё:
- /dev/md0 смонтирован и содержит корректные файлы ядра и initrd.
- /dev/md1 как PV участвует в VolGroup00 и LV доступны.
- /etc/mdadm.conf содержит ARRAY-записи для md0 и md1.
- /etc/fstab и /etc/mtab указывают /dev/md0 для /boot.
- GRUB содержит fallback=1 и обе записи kernel/root (hd1,0 и hd0,0).
- После добавления /dev/sda в массивы оба массива имеют статус [UU].
Перед перезагрузкой: убедитесь, что у вас консольный доступ (IPMI/serial) или план восстановления, на случай, если загрузка не выполнится.
Команды — краткая шпаргалка
- Создать RAID (placeholder missing): mdadm –create /dev/mdX –level=1 –raid-disks=2 missing /dev/sdY
- Просмотр статуса RAID: cat /proc/mdstat
- Создать FS: mkfs.ext3 /dev/md0
- PV для LVM: pvcreate /dev/md1
- Добавить PV в VG: vgextend VolGroup00 /dev/md1
- Перенести PV: pvmove /dev/sda2 /dev/md1
- Удалить PV из VG: vgreduce VolGroup00 /dev/sda2
- Удалить PV: pvremove /dev/sda2
- Добавить диск в массив: mdadm –add /dev/md1 /dev/sda2
- Пересоздать initrd: mkinitrd /boot/initrd-
uname -r
.imguname -r
Типичные проблемы и способы их решения
- После пересоздания initrd загрузчик не находит LVM или md-массив:
- Проверьте, что модули md и lvm включены в initrd. Повторно выполните mkinitrd и проверьте содержимое initrd (lsinitrd).
- Ядро не видит новую таблицу разделов после fdisk (ошибка при reread):
- Это нормально; запись вступит в силу после перезагрузки. Если нельзя перезагружать, попробуйте partprobe, но это не всегда сработает.
- Массив долго синхронизируется:
- Синхронизация зависит от размера и скорости дисков. Можно мониторить через /proc/mdstat. Не прерывайте процесс.
- После перезагрузки система не загружается с RAID:
- Используйте доступную консоль/режим восстановления, проверьте наличие /etc/mdadm.conf, initrd и правильность GRUB-параметров.
Роли и чек-лист для команды (роль: системный администратор)
- Подготовка:
- Сделать резервную копию /boot и важных LVM-томов.
- Убедиться в наличии доступа к консоли на случай сбоя загрузки.
- Создание и настройка:
- Создать md0 и md1 с missing.
- Создать FS на md0 и pvcreate на md1.
- Выполнить vgextend.
- Обновить /etc/mdadm.conf, /etc/fstab, /etc/mtab, GRUB.
- Пересоздать initrd.
- Перенос данных:
- Выполнить pvmove и дождаться завершения.
- vgreduce и pvremove для старого диска.
- Изменить тип раздела и добавить диск в RAID (mdadm –add).
- Дождаться синхронизации массивов ([UU]).
- Смонтировать md0 и скопировать /boot.
- Завершение:
- Протестировать загрузку (при возможности сначала с консолей или в maintenance-mode).
- Наблюдать систему на предмет ошибок в логах (dmesg, /var/log/messages).
Мини-методология: почему сначала LVM, потом /boot
- LVM-томы обычно содержат корень и пользовательские данные; их перенос повышает доступность сразу после синхронизации.
- /boot хранит ядро и initrd; его перенос требуется до честной перезагрузки, поэтому мы копируем /boot после перемещения LVM и только когда MD и initrd готовы.
Диагностический поток (Mermaid)
flowchart TD
A[Начало] --> B{Есть резервная копия?}
B -- Да --> C[Создать md0 и md1 с missing]
B -- Нет --> Z[Создать резервную копию]
C --> D[mkfs.ext3 /dev/md0 и pvcreate /dev/md1]
D --> E[vgextend VolGroup00 /dev/md1]
E --> F[Обновить mdadm.conf, /etc/fstab, GRUB и initrd]
F --> G[pvmove /dev/sda2 /dev/md1]
G --> H[vgreduce и pvremove /dev/sda2]
H --> I[Изменить тип /dev/sda2 и добавить в md1]
I --> J[Дождаться синхронизации md]
J --> K[mount /dev/md0 и копирование /boot]
K --> L[Перезагрузка и проверка]
L --> M{Система загрузилась?}
M -- Да --> X[Завершение]
M -- Нет --> Y[Использовать консоль/восстановление]
Итог и рекомендации
Ключевые моменты:
- Всегда имейте резервную копию перед изменением разделов и загрузчика.
- Создавайте массивы с placeholder missing, если активные разделы нельзя сразу добавить.
- Обновляйте mdadm.conf и initrd, чтобы загрузчик мог найти RAID и LVM при старте.
- После добавления всех дисков дождитесь, пока массивы перейдут в состояние [UU].
Примечание: этот процесс меняет структуру хранения данных — планируйте окно обслуживания и контролируйте нагрузку дисковой подсистемы во время синхронизаций.
Важно: при любом сомнении о состоянии загрузчика имейте внешний доступ к консоли или способ восстановить загрузку (LiveCD, rescue mode).
Сводка
- Создали /dev/md0 и /dev/md1 с временным “missing” членом.
- Подготовили /dev/md1 для LVM и расширили VolGroup00.
- Обновили mdadm.conf, /etc/fstab, /etc/mtab и GRUB, пересоздали initrd.
- Перенесли LVM-данные pvmove, удалили старый PV и добавили старый диск в массив для синхронизации.
- Смонтировали /dev/md0 и скопировали содержимое /boot.
Критерии приёмки (напоминание): все массивы должны быть в статусе [UU], все LVM-тома доступны, и система должна успешно загружаться с RAID.
Похожие материалы

Резервная копия реестра Windows — как создать

Как посмотреть понравившиеся публикации в Instagram

Голосовой ввод в WhatsApp: Gboard и SwiftKey

Поиск общих фильмов и сотрудников на IMDb

Цитата на рабочем столе с Rainmeter
