Миграция FC4 на программный RAID-1(зеркало).
Имеем 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, но после раздела указываем <существующий_размер-2000>, т.е. обрезаем файловую систему(не раздел!) сверху, оставляя место под 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) с помощью команды fdiskt и сохраняем изменения командой 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