Ключевые слова:fedora, raid, disk, partition, (найти похожие документы)
From: Ворона Александр <http://vorona.com.ua/>
Date: Mon, 15 Mar 2007 14:31:37 +0000 (UTC)
Subject: Миграция FC4 на программный RAID-1 (зеркало)
Оригинал: http://vorona.com.ua/articles/FC4migrateRAID/index.html
Имеем FC4 и ядра: самосборное 2.6.13.1(в ядре md и raid1) и родное
стоковое 2.6.11-1.1369_FC4(всё есть модулями).
Задача - подцепить 2-й винт и завести RAID 1(зеркало).
Я использовал более извращённый метод, чем описаный во многих HOWTO и
README, зато гораздо более быстрый(однако идеологически неверный, но
вполне подходящий для моего случая - домашний полунедонастроенный
комп). Существующая разбивка на разделы (Samsung 200G ATA133)
hdc1 /boot 100M
hdc2 / 1G
hdc3 /usr 15G
hdc4 extended
hdc5 /var 15G
hdc6 /var/spool 10G
hdc7 /usr/src 15G
hdc8 /home 10G
hdc9 /tmp 7G
hdc10 /usr/data 110G
1. Подключаем новый винт hda и разбиваем его цилиндр в цилиндр с hdc.
fdisk -l /dev/hdc
или знание размеров разделов вам поможет :)
Или вариант попроще
sfdisk -d /dev/hdc|sfdisk /dev/hda
2. Грузимся с 1-го CD от федоры в linux rescue либо ещё каким-либо
образом грузим линух без использования существующего винта
hdc(понадобятся mdadm, resize2fs, fdisk, mount и возможно fsck).
Добираемся до шелла.
3. убеждаемся что в текущем ядре есть поддержка raid и уровня raid 1.
Это можно легко проверить, посмотрев в файл /proc/mdstat. Если
файла нет - у вас нет поддержки raid в ядре (пробуем грузить
модуль md). При наличии файла смотрим в строчку Personalitis - там
должен быть указан raid1. Если не указан, пробуем каким-либо
образом загрузить модуль raid1
4. отмонтируем раздел, если он был примонтирован, и делаем
resize2fs /dev/hdc9
(ну или какой там у вас раздел с ненужными данными). Если попросит
fsck, чекнем и опять.
5. resize2fs скажет - нечего делать, существующий размер столько-то
блоков.
6. опять говорим resize2fs /dev/hdc9, но после раздела указываем ,
т.е. обрезаем файловую систему(не раздел!) сверху, оставляя место
под raid superblock
7. Создаём raid:
mdadm -C /dev/md9 -l 1 -n 2 /dev/hdc9 /dev/hda9
Создать устройство /dev/md9, raid level 1, количество дисков 2.
Разделы указываем именно в таком порядке - с первого на остальные
будет производиться клонирование. Укажете не в том порядке -
потеряете данные. mdadm предупредит что на /dev/hdc9 есть ext2
файловая система и запросит подтверждение создания raid.
Подтверждаем.
8. смотрим /proc/mdstat - началось клонирование. Вот тут мы и
извратились - ушли от копирования с живого раздела в
деградированный raid, т.к. копирование за нас сделал драйвер
raid1.
9. опять ресайзим, но уже не hdc9 а md9 до размера раздела, который
стал немного меньше по сравнению с hdc9
resize2fs /dev/md9
10. меняем типы разделов /dev/hdc9 и /dev/hda9 с Linux(0x82) на Linux
RIAD autodetect (0xFD) с помощью команды fdisk'а t и сохраняем
изменения командой w.
11. монтируем в удобное место root-раздел для правки fstab
mount -t ext3 /dev/hdc2 /mnt/tmp
12. правим /mnt/tmp/etc/fstab - заменяем /dev/hdc9 , соответствующий
точке монтирования /tmp, на /dev/md9. Если fstab до этого руками
не правили, то вместо /dev/hdc9 может быть что-то вроде LABEL=/tmp
13. посматривая в /proc/mdstat, дожидаемся окончания клонирования.
Устройство /dev/md9 готово к использованию вместо /dev/hdc9
14. Проверяем на всяк случай ядра:моё 2.6.13.1 содержит md и raid1,
федорное содержит md, а raid1 подгрузит по необходимости(если
сможет).
15. грузимся с hdc и проверяем в двух ядрах что /dev/md9 успешно
завелся как /tmp. желательно проверить на нём целостность файловой
системы и сохранность данных.
16. если с /tmp всё нормально, то повторяем пункты 2 и с 4-го по 12-й
для всех разделов кроме рутового /dev/hdc2 и обязательно
дожидаемся пока доклонируются все разделы. Ещё один контрольный
ребут под 2-мя ядрами.
17. Если всё прошло нормально, то все разделы кроме рутового находятся
в raid и загрузочным является только hdc. Сделаем загрузочным и
hda
grub
grub > device (hd0) /dev/hda
grub > root (hd0,0)
grub > setup (hd0)
Замечу что в строчке root указывается раздел /boot считая с нуля.
У меня это первый раздел hdc1 и hda1 (grub не понимает software
raid, да и не нужно это имхо), поэтому и получаем hd0,0. Если у
вас /boot не первый, не забудьте проверить boot flag
соответствующего раздела fdisk'ом, и при необходимости установить.
18. Теперь мы должны грузиться как с hdc так и с hda, ну и естественно
с ними двумя и по очереди ;)
19. Осталось самое интересное - поместить рутовый раздел в raid.
Проделываем уже знакомую и ничем не отличающуюся процедуру п. 2 и
пп. 4-12. Монтиируем boot-раздел чтобы поправить параметр ядра root
raidstart /dev/md1
mkdir /mnt/tmp
mount -t ext3 /dev/md1 /mnt/tmp
Правим grub.conf
vi /mnt/tmp/grub/grub.conf
Устанавливаем параметр root ядра в /dev/md2. Например для
стокового ядра получаем строчку
kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/md2
Сохраняемся, отмонтируемся и перегружаемся
20. kernel в панике, как самосборное с вкомпиленой поддержкой raid1,
так и стоковое.
Ну стоковому простительно - raid1 нет, а вот почему самосборное
ругается... При загрузке grub нажатием a редактируем root опять в
/dev/hdc2 и нажатием b грузимся. Легче уже - загрузились хоть с
половинным рейдом для рутового раздела, что наглядно видно из
/proc/mdstat. Странно - рейд-таки создался, но загрузиться с него
не удалось...После танцев с бубном над initrd поставленной на raid
на другом компе этой же федоры оказывается что простой
вставки/вкомпиливания модуля raid1 в ядро недостаточно. Нужно ядру
сказать некую хитрую строчку
raidautorun /dev/mdX
для каждого существующего в системе рейд-массива(ну а как минимум
для рутового раздела перед "Creating root device"). Благо это за
нас сделает mkinitrd(если сделает ;))
21. Для самосборного ядра с вкомпиленным raid1
mkinitrd --builtin=raid1 --omit-scsi-modules /boot/initrd-2.6.13.1.img 2.6.13.1
для стокового
mkinitrd --with=raid1 --omit-scsi-modules /boot/initrd-2.6.11-1.1369_FC4.img 2.6.11-1.1369_FC4
ну и смотрим чтобы не ругался чем-то вроде
cannot stat /dev/md2
Затем проверяем: ищем raidautorun в initrd. Если нашли
вразумительное - танцы с бубном закончились. Если нет - копайте
mkinitrd, чтобы он втулил нужную вашему рутовому разделу строчку в
initrd
22. ну и последний ребут. С наслаждением наблюдаем загрузку целиком с
raid 1. Как я потом разобрался самосборное ядро с вкомпиленым
raid1 просто не успевало запустить /dev/md2, но уже пыталось его
примонтировать. Выходит raidautorun фактически просто говорит ядру
дождаться создания девайса.
23. Вывод из вышесказанного - если поменяете потом рутовый раздел - не
забудьте сказать mkinitrd
См. тж. п. 10 (convert existing filesystem to RAID 1) из README.recipes от mdadm -- "сперва делаем degraded на втором, потом ФС, потом данные, а потом отмонтируем и добавляем туда первый; дабы не засовывать raid superblock силой и не ресайзить ФС"