Уголок СУ-11 на просторах вселенной

среда, 8 августа 2007 г.

Полное руководство по переносу Slackware Linux 12 на raid массив

Неоктрое время решал проблему переноса готовй системы с линухами на рейд массив, в силу неопытности пришлось руководствоваться различными How-To, но все они оказались немного несоответсвующими действительности. Ниже я изложу свое видение даной проблемы :)
Итак, что мы имеем: два IDE винта, схожего объема ~80 Гигов. Винты висят на разных каналах. Система стит на /dev/hda и имеет следующую структура разделов:
swap - /dev/hda1
extended pt - /dev/hda2
usr - /dev/hda5
opt - /dev/hda6
home - /dev/hda7
root - /dev/hda8
tmp - /dev/hda9
второй винт не форматирован, подключен как /dev/hdc
Собирать массив мы будем довольно старым набором софта raidtools, в 12ой Слаке он исключен из базового набора софта, но оежит в имидже диск с дистридутивом в папочке Pasthru (точное имя папки не помню, команда find вам поможет) далее
installpkg r*.tgz
Переходим собственно к самому процессу переноса системы на рейд.
1) на втором винте fdisk'ом создаем систему разделов аналогичную первому винту, размер разделов (дабы не ошибиться) можно указать просто начальными и кончеными сектарами, подсмотрев эти параметры у первого винта. Далее всем разделам кроме swap указываем тип как Linux autodetect raid, в списке фдиска ему соответсвует код FD. Swap остается типа Linux swap (забегая вперед скажу что стоп зеркалить не обязательно, просто теперь в системе будет два свопа :) )
2) Далее любым люимым редактором создаем конфигурацию рейда. К своему стыду я почти не дружу с vi, хотя его следует знать как минимум из уважения к юникс системам. И такие "сложные" вещи пишу в привычном из глубин доса и деревянных игрушек mcedit. Итак создаем mcedit /etc/raidtab
raiddev /dev/md0
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
device /dev/hdc5
raid-disk 0
device /dev/hda5
failed-disk 0
chunk-size 32
raiddev /dev/md1
raid-level 1
nr-raid-disks 2
nr-spare-disks 0
persistent-superblock 1
device /dev/hdc6
raid-disk 0
device /dev/hda6
failed-disk 0
chunk-size 32
......... и т.д. описываем все наши разделы которые мы зеркалим
в конце файла стаим пустую строку в зак памяти об высочайшей квалификации программистов из Индии и других развивающихся государств :)

Для тех кто в танке - /dev/mdX - это и есть обединенные разделы на разных винтах.
3) Далее переходим к созданию самих массивов согласно /etc/raidtab:
mkraid /dev/md0
И так все наши /dev/mdX, и вот в этом месте меня жадли грабли, в моей системе отсутсвовали md0+n(n=1). Почему? - не знаю, mkraid их создавтаь не умеет. Пришлось создавтаь самому, вот как:
root@srv-edt:~# mkraid -R /dev/md2
DESTROYING the contents of /dev/md1 in 5 seconds, Ctrl-C if unsure!
/dev/md1: file doesn't exist!
mkraid: aborted.
cd /dev
mknod md/X b 9 X
chmod 660 md/X
chown :disk md/X
ln -s md/X mdX
где X - нужный нам номер md устрйоства (для танкистов, в нашем случае от 1 до 4)
еще раз создаем массив:# mkraid -R /dev/md1
смотрим результат:
root@srv-edt:~# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md1 : active raid1 hdc6[0]9775424 blocks [2/1] [U_]
md0 : active raid1 hdc5[0]9775424 blocks [2/1] [U_]
unused devices:
далее создаем все недостающие md, затем для всех md выполняем mkraid /dev/mdX
Теперь наступает самое интересное, пора создать на md файловые системы.
mkfs -t ext3 -c /dev/mdX
(возможно кто-то предпочитает другие ФС)
4) Теперь нам необходимо сопировтаь систему с /dev/hda на /dev/mdX
способ долгий, но для танкистов подойдет:
Первое: монтируем новый / раздел к /mnt. # mount /dev/md0 /mnt
Второе: создаем каталоги - точки монтирования других новых разделов. Не забудьте здесь указать ваши каталоги и ваши разделы. # mkdir -p /mnt/usr/local
# mkdir -p /mnt/var
# mkdir -p /mnt/home
Третье: монтирует новые разделы. # mount /dev/md1 /mnt/usr/local
# mount /dev/md2 /mnt/var
# mount /dev/md3 /mnt/home
Четвертое: копируем систему со второго винчестера на RAID. # cp -a /bin /mnt
# cp -a /boot /mnt
# cp -a /dev /mnt
# cp -a /etc /mnt
# cp -a /home /mnt
# cp -a /lib /mnt
# cp -a /root /mnt
# cp -a /sbin /mnt
# cp -a /tmp /mnt
# cp -a /usr /mnt
# cp -a /var /mnt
# mkdir -p /mnt/mnt
# mkdir -p /mnt/proc
Пятое: исправляем /mnt/etc/fstab, чтобы он указывал на новые разделы, которые являются RAID массивом. Только убедитесь что вы редактируете fstab именно из /mnt/etc/fstab, а не с текущего / раздела.
да и яне уверен в необходимости, ноя еще скопировал содержимое текущего /Mnt и /Media.
5) Далее настраиваем загрузку с рейда. В моем случае это настройка /mnt/etc/lilo.conf
Запускайте ваш любимый редактор и редактируйте /mnt/etc/lilo.conf. (Заметьте что редактируется lilo.conf, который лежит в RAID, не перепутайте). В нем вам нужно поправить две директивы boot и root. В итоге они должны указывать на устройство /dev/md3 (то есть на / раздел в RAID'e). Также вам нужно будет добавить опцию raid-extra-boot = mbr, которая появилась только в LILO 22.0, впрочем это неважно, все равно более старые версии не смогут загрузиться с /dev/md. В итоге ваш /mnt/etc/lilo.conf должен выглядеть примерно так:
# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/md3
raid-extra-boot = mbr
#compact # faster, but won't work on all systems.
# delay = 5
# Normal VGA console
vga = normal
# ramdisk = 0 # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /vmlinuz
root = /dev/md3
label = Linux
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends
Теперь остается только установить LILO с этими новыми изменениями. Для этого у lilo предусмотрена опция -r, которая позволяет сменить корневой каталог до выполнения каких-либо операций:
lilo -r /mnt
тут таятся грабли, если Lilo скажет, а он обязательно скажет, что его не устраивает "целостность" рейда (мыто знаем что один из винтов намиже и заблокирован), мы ему скажем
lilo -H -r /mnt
Он выдаст пару-тройку дуратских варнингов и скжает Ок.
Теперь все. Перегружайтесь. Не забудьте только выставить в BIOS'е загрузку со ВТОРОГО винчестера.
Далее нам необходимо синхронизировтаь винты в массивах.
Загрузились? Попробуйте проверьте командой df, откуда вы загрузились и куда:
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/md0 2071288 566236 1399836 29% /
Похоже на RAID? Похоже, но только это не RAID. Вы наверное еще при загрузке наблюдали долгие протяжные ругательства на то, что система работает только с одной половиной.
6) Сейчас мы находимся в точке, которая моделирует сбой одного винчестера. То есть как будто вы только что заменили отказавший винчестер и должны его разбить. Ситуация отличается только тем, что сейчас второй винчестер уже разбит на разделы, единственное что: неправильно разбит. Сейчас вам нужно изменить тип разделов на /dev/hdc с Linux native на Linux raid autodetect. Если бы у вас был чистый винчестер, то сразу нужно было бы создавать разделы с типом 0xFD. Так что берите fdisk /dev/hdc и тренируйтесь восстанавливать. После создания/правки таблицы разделов вас скорее всего попросят перегрузиться.
Теперь поменяйте в /etc/raidtab директивы failed-disk на raid-disk.
И последний шаг: дополнение зеркал. Здесь все очень просто.
raidhotadd /dev/md0 /dev/hdc5
raidhotadd /dev/mdX /dev/hdc6
и т.д.
Затем смотрите в /proc/mdstat, как RAID становится настоящим mirror'ом.
Мой массив собрался за 25 минут.
Поздравляю, теперь ваша система установлена на RAID 1 (mirroring).

3 комментария:

Vadim комментирует...

Очень полезная статья. Сам на Slackware райды поднимаю. Практически именно по этой методе. Пока собрал для себя из разных мест, вагон времени угрохал. А тут все в одном месте и готово. Красота! (до версии 12.1 у меня не было проблем с наличием /dev/mdx, а теперь ручками завожу так же, как и здесь написано)
И еще, не обижай танкистов! :-)
Все мы были танкистами (и остаемся в каких-то смыслах)

Vadim комментирует...

Очередные грабли. lilo
(В сети про эту ошибку почти ничего не нашел - google знает 5 ссылок и все мимо)

Когда в райде только один диск, а второй пока значиться неисправным, с такими настройками lilo (сокращено):

boot = /dev/md3 (у вас могут быть другие разделы)
raid-extra-boot = mbr
root = /dev/md3 (у вас могут быть другие разделы)

получил вот такой пендаль:

Fatal: Unusual RAID bios device code: 0xFF

Загрузчик естественно не установился.
Пришлось сделать так:

boot = /dev/sda (или что там у вас)
root = /dev/md3

Теперь лило установилось, загрузилось с райд. И только дополнив райд до полного, делаем

boot = /dev/md3
raid-extra-boot = mbr
root = /dev/md3

- все ок!
Оба MBR обновлены.

Стас комментирует...

Забавно, я кстати уже перешел с raid-tools на mdadm. IMHO удобнее, если сделать разделы с супер блоком, то никакой конфиг для рейда не нужен. Правда слака почемуто атвомтаом не подхватывает призагрузке. Приходится ручками заводить, если интересно - могу посомтреть у себя как я это сделал. Уже не помню, давненько я ими не занимался :)