- Подключаем новый винт hda и разбиваем его цилиндр в цилиндр с hdc.
fdisk -l /dev/hdc
или знание размеров разделов вам поможет :)
Или вариант попрощеsfdisk -d /dev/hdc|sfdisk /dev/hda
- Грузимся с 1-го CD от федоры в linux rescue либо ещё каким-либо образом грузим линух без использования существующего винта hdc(понадобятся mdadm, resize2fs, fdisk, mount и возможно fsck). Добираемся до шелла.
- убеждаемся что в текущем ядре есть поддержка raid и уровня raid 1. Это можно легко проверить, посмотрев в файл /proc/mdstat. Если файла нет - у вас нет поддержки raid в ядре (пробуем грузить модуль md). При наличии файла смотрим в строчку Personalitis - там должен быть указан raid1. Если не указан, пробуем каким-либо образом загрузить модуль raid1
- отмонтируем раздел, если он был примонтирован, и делаем
resize2fs /dev/hdc9
(ну или какой там у вас раздел с ненужными данными). Если попросит fsck, чекнем и опять.
- resize2fs скажет - нечего делать, существующий размер столько-то блоков.
- опять говорим resize2fs /dev/hdc9, но после раздела указываем <существующий_размер-2000>, т.е. обрезаем файловую систему(не раздел!) сверху, оставляя место под raid superblock
- Создаём raid:
mdadm -C /dev/md9 -l 1 -n 2 /dev/hdc9 /dev/hda9
Создать устройство /dev/md9, raid level 1, количество дисков 2. Разделы указываем именно в таком порядке - с первого на остальные будет производиться клонирование. Укажете не в том порядке - потеряете данные. mdadm предупредит что на /dev/hdc9 есть ext2 файловая система и запросит подтверждение создания raid. Подтверждаем.
- смотрим /proc/mdstat - началось клонирование. Вот тут мы и извратились - ушли от копирования с живого раздела в деградированный raid, т.к. копирование за нас сделал драйвер raid1.
- опять ресайзим, но уже не hdc9 а md9 до размера раздела, который стал немного меньше по сравнению с hdc9
resize2fs /dev/md9
- меняем типы разделов /dev/hdc9 и /dev/hda9 с Linux(0x82) на Linux RIAD autodetect (0xFD) с помощью команды fdisk'а t и сохраняем изменения командой w.
- монтируем в удобное место root-раздел для правки fstab
mount -t ext3 /dev/hdc2 /mnt/tmp
- правим /mnt/tmp/etc/fstab - заменяем /dev/hdc9 , соответствующий точке монтирования /tmp, на /dev/md9. Если fstab до этого руками не правили, то вместо /dev/hdc9 может быть что-то вроде LABEL=/tmp
- посматривая в /proc/mdstat, дожидаемся окончания клонирования. Устройство /dev/md9 готово к использованию вместо /dev/hdc9
- Проверяем на всяк случай ядра:моё 2.6.13.1 содержит md и raid1, федорное содержит md, а raid1 подгрузит по необходимости(если сможет).
- грузимся с hdc и проверяем в двух ядрах что /dev/md9 успешно завелся как /tmp. желательно проверить на нём целостность файловой системы и сохранность данных.
- если с /tmp всё нормально, то повторяем пункты 2 и с 4-го по 12-й для всех разделов кроме рутового /dev/hdc2 и обязательно дожидаемся пока доклонируются все разделы. Ещё один контрольный ребут под 2-мя ядрами.
- Если всё прошло нормально, то все разделы кроме рутового находятся в 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'ом, и при необходимости установить.
- Теперь мы должны грузиться как с hdc так и с hda, ну и естественно с ними двумя и по очереди ;)
- Осталось самое интересное - поместить рутовый раздел в raid. Проделываем уже знакомую и ничем не отличающуюся процедуру п. 2 и пп. 4-12. Монтиируем boot-раздел чтобы поправить параметр ядра root
raidstart /dev/md1
mkdir /mnt/tmp
mount -t ext3 /dev/md1 /mnt/tmp
Правим grub.confvi /mnt/tmp/grub/grub.conf
Устанавливаем параметр root ядра в /dev/md2. Например для стокового ядра получаем строчкуkernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/md2
Сохраняемся, отмонтируемся и перегружаемся
- kernel в панике, как самосборное с вкомпиленой поддержкой raid1, так и стоковое.
Ну стоковому простительно - raid1 нет, а вот почему самосборное ругается... При загрузке grub нажатием a редактируем root опять в /dev/hdc2 и нажатием b грузимся. Легче уже - загрузились хоть с половинным рейдом для рутового раздела, что наглядно видно из /proc/mdstat. Странно - рейд-таки создался, но загрузиться с него не удалось...После танцев с бубном над initrd поставленной на raid на другом компе этой же федоры оказывается что простой вставки/вкомпиливания модуля raid1 в ядро недостаточно. Нужно ядру сказать некую хитрую строчку
raidautorun /dev/mdX
для каждого существующего в системе рейд-массива(ну а как минимум для рутового раздела перед "Creating root device"). Благо это за нас сделает mkinitrd(если сделает ;))
- Для самосборного ядра с вкомпиленным 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
- ну и последний ребут. С наслаждением наблюдаем загрузку целиком с raid 1. Как я потом разобрался самосборное ядро с вкомпиленым raid1 просто не успевало запустить /dev/md2, но уже пыталось его примонтировать. Выходит raidautorun фактически просто говорит ядру дождаться создания девайса.
- Вывод из вышесказанного - если поменяете потом рутовый раздел - не забудьте сказать mkinitrd