Как настроить программный RAID1 на работающей системе LVM (включая конфигурацию GRUB) — CentOS 5.3
Кратко: покажу пошагово, как добавить второй диск в уже работающую систему с LVM, создать программный RAID1 для /boot и для LVM PV, перенести данные, обновить initrd и установить GRUB на оба диска, чтобы система могла загрузиться при выходе из строя любого диска. Перед началом — сделайте полную резервную копию и протестируйте план на стенде.
Важно: все команды выполняются от root. Пример основан на CentOS 5.3 и двух одинаковых дисках /dev/sda и /dev/sdb.
Основная цель и варианты использования
Цель: получить зеркалирование (RAID1) для разделов /boot и для LVM PV (VolGroup00), при этом система должна продолжать работать во время преобразования и загружаться при отказе любого из дисков.
Варианты, покрытые в статье:
- создание RAID1 для /boot с последующим переносом текущей /boot на md0;
- создание RAID1 для LVM-партиции, создание PV на md и перемещение данных из старого PV;
- установка GRUB в MBR обоих дисков и обновление initrd для работы с md.
Кому полезно: системным администраторам, инженерам DevOps, ответственным за отказоустойчивость серверов на CentOS 5.x.
Содержание
- Предварительное примечание и состояние системы
- Установка mdadm и загрузка модулей
- Подготовка /dev/sdb: копирование таблицы разделов и переключение типа разделов
- Очистка superblock’ов и создание деградированного массива на /dev/sdb
- Копирование содержимого /boot на md0
- Создание md1 и миграция LVM в зеркало
- Настройка mdadm.conf и пересборка initrd
- Установка GRUB в MBR обоих дисков
- Тестирование и контрольные проверки
- Критерии приёмки, чек-листы и план отката
- Ментальные модели, когда этот подход не подходит
- Decision-tree (Mermaid)
1 Предварительное примечание
В этом руководстве используется CentOS 5.3 с двумя дисками одинакового размера: /dev/sda (в рабочем состоянии) и /dev/sdb (пустой). На /dev/sda есть следующая схема разделов (типичное разбиение CentOS):
- /dev/sda1 — /boot, ext3
- /dev/sda2 — LVM PV (VolGroup00) с логическими томами LogVol00 (/) и LogVol01 (swap)
Желаемый финал:
- /dev/md0 (из /dev/sda1 и /dev/sdb1) — /boot, ext3
- /dev/md1 (из /dev/sda2 и /dev/sdb2) — LVM PV (VolGroup00) с логическими томами /
Ниже — выводы текущего состояния системы (оставлены в исходном виде для точности). Они демонстрируют, что в системе сейчас нет RAID-массивов и что /dev/sdb пуст:
df -h[root@server1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 8.6G 1.4G 6.8G 17% /
/dev/sda1 99M 13M 82M 14% /boot
tmpfs 250M 0 250M 0% /dev/shm
[root@server1 ~]#
fdisk -l[root@server1 ~]# fdisk -l
Disk /dev/sda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1305 10377990 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk /dev/sdb doesn’t contain a valid partition table
[root@server1 ~]#
pvdisplay[root@server1 ~]# pvdisplay
/dev/hdc: open failed: No medium found
— 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
[root@server1 ~]#
vgdisplay[root@server1 ~]# vgdisplay
/dev/hdc: open failed: No medium found
— Volume group —
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9.88 GB
PE Size 32.00 MB
Total PE 316
Alloc PE / Size 316 / 9.88 GB
Free PE / Size 0 / 0
VG UUID ZPvC10-cN09-fI0S-Vc8l-vOuZ-wM6F-tlz0Mj
[root@server1 ~]#
lvdisplay[root@server1 ~]# lvdisplay
/dev/hdc: open failed: No medium found
— Logical volume —
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID vYlky0-Ymx4-PNeK-FTpk-qxvm-PmoZ-3vcNTd
LV Write Access read/write
LV Status available
LV Size 8.88 GB
Current LE 284
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
— Logical volume —
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID Ml9MMN-DcOA-Lb6V-kWPU-h6IK-P0ww-Gp9vd2
LV Write Access read/write
LV Status available
LV Size 1.00 GB
Current LE 32
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
[root@server1 ~]#
2 Установка mdadm и загрузка модулей
mdadm — основной инструмент для управления программными RAID в Linux. Установим его и mkinitrd (centos 5 использует mkinitrd для создания initrd):
yum install mkinitrd mdadmДля избежания перезагрузки заранее подгрузим модули ядра, которые могут пригодиться (добавляйте только те, которые нужны на вашей системе):
modprobe linear
modprobe multipath
modprobe raid0
modprobe raid1
modprobe raid5
modprobe raid6
modprobe raid10Проверим, что ядро видит поддержки RAID:
cat /proc/mdstatОжидаемый вид (в примере):
[root@server1 ~]# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices:
[root@server1 ~]#
Примечание: строки в /proc/mdstat появятся динамически по мере создания md-устройств.
3 Подготовка /dev/sdb
Шаг 1 — скопировать таблицу разделов с /dev/sda на /dev/sdb, чтобы диски имели одинаковую разметку:
sfdisk -d /dev/sda | sfdisk /dev/sdbПример вывода (в исходнике):
[root@server1 ~]# sfdisk -d /dev/sda | sfdisk /dev/sdb
Checking that no-one is using this disk right now …
OK
Disk /dev/sdb: 1305 cylinders, 255 heads, 63 sectors/track
sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sdb1 * 63 208844 208782 83 Linux
/dev/sdb2 208845 20964824 20755980 8e Linux LVM
/dev/sdb3 0 - 0 0 Empty
/dev/sdb4 0 - 0 0 Empty
Successfully wrote the new partition table
Re-reading the partition table …
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
[root@server1 ~]#
Проверим ещё раз fdisk -l — теперь оба диска должны иметь одинаковую схему.
Шаг 2 — изменить тип разделов на /dev/sdb на Linux raid autodetect (код fd):
fdisk /dev/sdbВ fdisk используем команду t => номер раздела => код fd и затем w для сохранения. В примере это выполнено для /dev/sdb1 и /dev/sdb2.
После этого fdisk -l должен показать для /dev/sdb тип разделей fd (Linux raid autodetect).
Шаг 3 — убедиться, что на новых разделах /dev/sdb* нет старых RAID-метаданных:
mdadm --zero-superblock /dev/sdb1
mdadm --zero-superblock /dev/sdb2Если на разделе не было метаданных md, mdadm вернёт сообщение вида “Unrecognised md component device” — это нормально.
4 Создание деградированного md-массива на /dev/sdb и перенос /boot
Почему деградированный массив? Мы не хотим сразу убирать /dev/sda из-под системы: создадим RAID1 на /dev/sdb в “degraded” режиме (второй компонент отсутствует). Это позволит сформировать /dev/md0 и скопировать туда данные с /dev/sda1 без остановки системы.
Шаги (безопасная последовательность):
- Создать md0, используя только /dev/sdb1 и пометив второй диск как missing:
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missingПримечание: в CentOS 5.3 метаданные по умолчанию были совместимы с GRUB, но при сомнениях можно явно указать –metadata=0.90. В новых системах используют metadata 1.2, но GRUB legacy не может читать 1.2 с начала диска. Для этого конкретного сценария (CentOS 5.3, старый GRUB) рекомендуют metadata 0.90, так как с ней суперблок размещён в конце раздела.
- Отформатировать md0 в ext3 и смонтировать во временную точку:
mkfs.ext3 /dev/md0
mount /dev/md0 /mnt/md0- Скопировать содержимое /boot на новый md0. Используйте rsync, чтобы сохранить права, ссылки и т. п.:
rsync -avH --delete /boot/ /mnt/md0/(Альтернатива: cp -a /boot/* /mnt/md0/)
- Обновить /etc/fstab — вместо /dev/sda1 укажите /dev/md0 (рекомендуется использовать UUID или метку, но для совместимости CentOS 5 можно записать /dev/md0). Перед изменением fstab — сделайте резервную копию.
Пример строки в /etc/fstab:
/dev/md0 /boot ext3 defaults 1 2- Отмонтировать /mnt/md0 и примонтировать как /boot, чтобы проверить корректность:
umount /mnt/md0
mount /boot
mount | grep bootЕсли всё успешно, в /boot должны появиться те же файлы.
- Убедиться, что md0 собирается корректно и что в /proc/mdstat видно массив:
cat /proc/mdstat
mdadm --detail /dev/md05 Создание md1 и миграция LVM в зеркало
Миграция LVM PV на md1 состоит из следующих высокоуровневых шагов:
- Создать деградированный RAID1 из /dev/sdb2 (второй компонент missing):
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb2 missing- Создать LVM PV на /dev/md1 и добавить в VolGroup00:
pvcreate /dev/md1
vgextend VolGroup00 /dev/md1- Перенести данные с текущего PV (/dev/sda2) на /dev/md1 с помощью pvmove. Это позволит переместить все extents без остановки системы:
pvmove /dev/sda2 /dev/md1Замечание: pvmove может занять время в зависимости от объёма данных и скорости дисков. Наблюдайте состояние через pvdisplay и lvdisplay.
- После успешного pvmove удалите старый PV из VG и обновите настройки:
vgreduce VolGroup00 /dev/sda2- Теперь, когда все данные находятся на /dev/md1, вы можете добавить /dev/sda2 как второй компонент массива md1:
mdadm --add /dev/md1 /dev/sda2Теперь md1 начнёт синхронизацию и в итоге станет полноценным RAID1 с двумя активными устройствами.
- Убедитесь, что LVM всё ещё видит LogVol’ы и что корневая FS доступна.
lvdisplay
pvdisplay
vgdisplay6 Настройка mdadm.conf и пересборка initrd
Чтобы система при загрузке знала, какие md-массивы монтировать и как их собирать, надо сохранить конфигурацию mdadm и пересобрать initrd, чтобы md и LVM собирались до монтирования корня.
- Создать/обновить /etc/mdadm.conf:
echo "DEVICE partitions" > /etc/mdadm.conf
mdadm --detail --scan >> /etc/mdadm.confПроверьте /etc/mdadm.conf — там должны быть строки вида:
ARRAY /dev/md0 metadata=0.90 name=... UUID=...
ARRAY /dev/md1 metadata=0.90 name=... UUID=...- Пересобрать initrd (mkinitrd используется в CentOS 5.x). Пример для текущего работающего ядра:
KVER=$(uname -r)
mkinitrd -f /boot/initrd-$KVER.img $KVERОпция -f перезаписывает существующий initrd. Убедитесь, что в initrd включены модули md и LVM (mkinitrd обычно подхватывает нужные модули при наличии /etc/mdadm.conf и pvscan).
- Проверьте, что initrd создан и имеет корректный размер:
ls -l /boot/initrd-$(uname -r).img7 Установка GRUB в MBR обоих дисков
Чтобы загрузка прошла при выходе из строя любого диска, установите GRUB в MBR обоих дисков (/dev/sda и /dev/sdb). В GRUB legacy это делают так:
- Запускаем grub-интерпретатор:
grubВ появившемся grub-приграничном режиме выполняем для /dev/sda:
root (hd0,0)
setup (hd0)
quitи затем для /dev/sdb (в зависимости от порядка дисков в BIOS /dev/sdb может быть (hd1) — но grub-install распознаёт целевой девайс):
grub-install /dev/sda
grub-install /dev/sdbАльтернатива: использовать grub-install и указать директорию с файлами grub (для CentOS 5):
grub-install --no-floppy /dev/sda
grub-install --no-floppy /dev/sdb- Проверьте /boot/grub/grub.conf (или /etc/grub.conf) — он должен ссылаться на правильные корневые тома LVM, например:
default=0
timeout=5
title CentOS (2.6.x)
root (hd0,0)
kernel /vmlinuz-2.6.x ro root=/dev/mapper/VolGroup00-LogVol00 rhgb quiet
initrd /initrd-2.6.x.imgОбычно kernel-lines не требуют изменений, если root указывает на LVM-том; главное — чтобы initrd содержал поддержку md и lvm.
- После установки GRUB в MBR обоих дисков перезагрузитесь для окончательной проверки (см. раздел тестирования).
8 Тестирование и контрольные проверки
Список проверок перед перезагрузкой:
- /etc/fstab содержит запись /dev/md0 для /boot (и корректные UUID, если используете UUID);
- /etc/mdadm.conf содержит секции ARRAY для md0 и md1;
- initrd пересобран и содержит md и lvm (проверка — загрузка без ошибок на ранней стадии);
- GRUB установлен в MBR обоих дисков;
- Синхронизация md-синхронов идёт: cat /proc/mdstat показывает прогресс.
После перезагрузки:
- Убедиться, что система загрузилась нормально;
- Выполнить mdadm –detail /dev/md0 и /dev/md1 — оба должны показывать оба устройства (или один, если синхронизация ещё идёт);
- Проверить состояние LVM (lvscan, vgdisplay, pvdisplay);
- Проверить целостность /boot и корневой FS;
- Смоделировать отказ диска: безопасно выключите систему и физически отсоедините один из дисков (или используйте mdadm –fail /dev/md1 /dev/sda2 и затем mdadm –remove). Затем перезагрузитесь и проверьте, что система всё ещё загружается и работает с оставшимся диском.
Откат симулированного отказа: снова подключите диск, выполните mdadm –add для возвращения диска в массив, дождитесь ресинхронизации.
9 Критерии приёмки
Система считается успешно преобразованной, если выполнены следующие пункты:
- При полном отсутствии одного из физических дисков (MBR и разделы) система может загрузиться и корректно монтировать /boot и корневой LVM.
- mdadm показывает, что массивы md0 и md1 в рабочем состоянии (ACTIVE).
- Для всех логических томов VolGroup00 lvdisplay показывает статус available, и файловые системы не повреждены.
- /etc/mdadm.conf и initrd содержат корректную конфигурацию и не выдают ошибок при загрузке.
10 План отката и Runbook при проблемах
Если что-то идёт не так — сохраняйте спокойствие и соблюдайте порядок:
- Не удаляйте исходные данные на /dev/sda до полной валидации миграции и загрузки с нового md-устройства.
- Если загрузка после изменений не удалась, загрузитесь с rescue-образа (LiveCD или установочного диска в rescue-mode), смонтируйте корень и /boot, проверьте /etc/fstab и /etc/mdadm.conf, восстановите initrd и заново установите GRUB в MBR исходного диска (/dev/sda).
- План отката: если перед началом вы сделали резервную копию /boot и LVM snapshot/backup, можно восстановить их с резервной копии.
Пример быстрого восстановления GRUB (rescue):
- загрузиться с rescue CD
- chroot /mnt/sysimage
- grub-install /dev/sda
- exit и перезагрузиться
11 Ментальные модели и когда этот подход не подходит
- Подходит если: требуется отказоустойчивость на уровне дисков без аппаратного RAID-контроллера; есть возможность временно перераспределить I/O для синхронизации.
- Не подходит если: минимальное время простоя критично и вы не можете позволить pvmove/ресинкрон при рабочей нагрузке; если используете очень старый загрузчик, не поддерживающий md1 в required metadata; если у вас нестандартная конфигурация (RAID на аппаратном контроллере, нестандартный LVM layout без свободных PE).
Альтернативы:
- использовать аппаратный RAID на контроллере;
- поднять кластеры репликации (DRBD + LVM) для более гибкой репликации на сетевом уровне;
- установить горячее резервирование на уровне виртуализации (VM snapshots, миграция).
12 Полезные контрольные команды и cheat-sheet
Проверка md-состояния:
cat /proc/mdstat
mdadm --detail /dev/md0
mdadm --examine /dev/sda1
mdadm --examine /dev/sdb1LVM-проверки:
pvdisplay
vgdisplay
lvdisplay
pvs
vgs
lvsGRUB и initrd:
cat /boot/grub/grub.conf
ls -l /boot/initrd-$(uname -r).img
mkinitrd -f /boot/initrd-$(uname -r).img $(uname -r)
grub-install --no-floppy /dev/sda
grub-install --no-floppy /dev/sdbРезервирование и откат:
- всегда делайте резервную копию /boot и LVM snapshot перед pvmove;
- проверяйте состояние бекапов перед проведением операций.
13 Риски и способы их уменьшения
- Риск: потеря данных при ошибке в редактировании /etc/fstab или при форматировании. Митигейшн: резервные копии и тщательная проверка перед перезагрузкой.
- Риск: длительная синхронизация приводит к деградации производительности. Митигейшн: выполняйте операции в часы низкой нагрузки, контролируйте ionice и nice, переносите тома поэтапно.
- Риск: неправильная версия metadata мешает загрузке. Митигейшн: для CentOS 5.3 используйте metadata 0.90 для /boot-RAID, убедитесь, что initrd включает md модули.
14 Role-based checklist
Для инженера (прежде чем начать):
- Сделать полный резерв.
- Подготовить план отката.
- Подготовить LiveCD/Rescue media.
- Проверить свободное место и состояние SMART-дисков.
Для оператора в ходе работ:
- Выполнять команды последовательно и фиксировать вывод.
- Следить за /proc/mdstat и pvmove.
- Не удалять старые разделы до успешного теста загрузки.
Для менеджера (готовность к изменению):
- согласовать окно работ;
- уведомить заинтересованных потребителей о риске краткой деградации производительности.
15 Decision-tree (Mermaid)
flowchart TD
A[Начало: есть второй пустой диск?] -->|нет| B[Купить/добавить диск]
A -->|да| C[Скопировать таблицу разделов]
C --> D{Тип разделов /boot и LVM}
D -->|стандартные| E[Изменить тип на fd и zero-superblock]
D -->|нестандартные| F[Пересмотреть разметку, делать бекап]
E --> G[Создать md0 из /dev/sdb1 'degraded']
G --> H[Скопировать /boot на md0]
H --> I[Изменить /etc/fstab на /dev/md0]
I --> J[Создать md1 из /dev/sdb2 'degraded']
J --> K[pvcreate /dev/md1; vgextend; pvmove]
K --> L[mdadm --add /dev/md1 /dev/sda2]
L --> M[Обновить /etc/mdadm.conf; mkinitrd]
M --> N[Установить GRUB в /dev/sda и /dev/sdb]
N --> O[Тест: reboot и simulate-failure]
O --> P[Успех?]
P -->|да| Z[Завершено]
P -->|нет| R[Rescue: откат/восстановление]16 Факт-бокс (ключевые числа и команды)
- Совместимость metadata: для старого GRUB (CentOS5) рекомендуют metadata 0.90 (суперблок в конце раздела).
- Основные команды: mdadm, pvcreate, vgextend, pvmove, vgreduce, mdadm –add, mkinitrd, grub-install.
- Проверка статуса: cat /proc/mdstat, mdadm –detail, pvdisplay, lvdisplay.
17 Совместимость и заметки по миграции
- Этот сценарий ориентирован на CentOS 5.x и GRUB legacy. На системах с GRUB2 и более новыми версиями mdadm стоит использовать metadata 1.2 по умолчанию и другой набор команд для initramfs.
- На виртуальных машинах и современных дистрибутивах команды и поведение могут отличаться — проверяйте версии mdadm, mkinitrd, initramfs-tools.
18 Итог и рекомендации
Кратко: последовательность действий — подготовка диска, дублирование разметки, смена типа разделов, удаление старых md-метаданных, создание деградированных md0 и md1 на /dev/sdb, копирование /boot, создание PV на md1 и pvmove, добавление /dev/sda* к массивам, обновление /etc/mdadm.conf, пересборка initrd и установка GRUB в MBR обоих дисков. Всегда имейте резервную копию и тестовую среду.
Полезные проверочные шаги: cat /proc/mdstat, mdadm –detail, pvmove мониторинг, тестовая перезагрузка, симуляция отказа диска.
Notes
- Перед началом работ рекомендуется полностью прочитать руководство и составить пошаговый план с ожидаемыми промежуточными состояниями.
- Если вы сомневаетесь в совместимости metadata с GRUB, тестируйте на стенде.
Конец статьи.
Похожие материалы
Herodotus: механизм и защита Android‑трояна
Включить новое меню «Пуск» в Windows 11
Панель полей сводной таблицы в Excel — руководство
Включить новое меню «Пуск» в Windows 11
Дубликаты Диспетчера задач в Windows 11 — как исправить