19 Мар
Софтовый RAID1 на CentOS
Речь пойдет о переносе существующей CentOS на софтовый RAID1.
Предистория.
После очередного выхода из строя очередного винта назрела таки необходимость внедрения raid-ов. Так как на что-то вроде raid5 или raid10 винтов надо «много» (ну хотя бы 4), а обьемов существующих для моих нужд вполне достаточно решил для начала поэкспериментировать с raid1. Хотя на материнке и присутствует raid контроллер, но фраза в мануале «если вы хотите установить ОС используя raid — скопируйте драйвер на флопи диск…» напрочь отбивает охоту оный использовать.
После поиска возможных вариантов миграции на софтовый raid для linux и анализа был выбран (помоемому) самый простой способ, правда требующий физического доступа к серверу, установочного/восстановительного диска и парочки перезагрузок сервера.
Большинство «рецептов» (например http://www.howtoforge.com/software-raid1-grub-boot-fedora-8) описывает переход на raid «пораздельно» — т.е. Второй диск разбивается точно также как и первый, затем одинаковые разделы обьединяются в raid массив.
Но, как оказалось, mdadm начиная с 2.6 поддерживает обьединение в raid уже целяком всего устройства! Без необходимости предварительного разбиения, переносов и т.д.
Был обнаружен довольно короткий документ http://wiki.centos.org/HowTos/Install_On_Partitionable_RAID1 Дальнейшее изложение полностью основывается на этом документе.
Изменена последовательность действий и добавлено пару-тройку замечаний.
Процесс переноса:
Подготовка:
Нам потребуется установочный диск, т.к. переносилась CentOS5.3 — её диск и был взят.
Для размещения служебной информации mdadm требуется немножко неразмеченого места на диске, а диск при установке был задействован полностью. По старой привычке /home, /var/log и /tmp были созданы отдельными разделами причем /tmp — последний; посему сильно не заморачиваясь раздел /tmp был попросту ликвидирован (позже на raid-е создан заново).
Проверяем, что установлены mdadm версии не ниже 2.6
rpm -q mdadm
mdadm-2.6.4-1.el5
Теперь выясняем что собственно у нас куда примонтировано:
в /etc/fstab лично у меня было:
LABEL=/1 / ext3 defaults 1 1
и т.д.
Какое устройство соответствует этой метке обнаружилось в файлике /etc/blkid/blkid.tab LABEL=/1 это оказалось /dev/sda2 Это надо для дальнейшей правки /etc/fstab — разделы у нас поменяются. затем нам потребуется патч для mkinitrd качаем его (зачем он нужен желающие могут выяснить здесь) и сохраняем где-нибудь, например в /root (т.к. /root у меня расположен в корневом разделе — он будет легко доступен)
Впринципе ничто не мешает сразу пропатчить mkinitrd
cd /sbin
cp mkinitrd mkinitrd.dist
patch -p0 < /root/mkinitrd-md_d0.patch
Если пакет mkinitrd будет обновлен (например через yum update) то патчить придется заново, а если про это забыть — то при обновлении ядра новый mkinitrd создаст неправильный initrd и наш сервер попросту не загрузиться.
Соответственно правим /etc/yum.conf — добавляем строку
exclude=mkinitrd*
Основная фаза:
Выключаем сервер, добавляем второй жесткий диск, загружеамся с устновочного CD (DVD, Flash) диска в варианте Rescue (Восстановление), на вопрос примонтировать ли найднные разделы на жестком диске отвечаем «нет». Создаем raid используя mdadm:
mdadm —create —level=1 —raid-devices=2 /dev/md_d0 /dev/sda missing
Теперь необходимо изменить параметры загрузки, для чего монтируем вручную наш жесткий диск, который собственно уже является частью raid массива:
mkdir /mnt/sysimage
mount /dev/md_d0p2 /mnt/sysimage
mount -o bind /dev /mnt/sysimage/dev
mount -o bind /selinux /mnt/sysimage/selinux
mount -t proc none /mnt/sysimage/proc
mount -t sysfs none /mnt/sysimage/sys
chroot /mnt/sysimage
Замечание: «mount /dev/md_d0p2 /mnt/sysimage» т.к. у меня корень был в /dev/sda2 !!! позже при переносе на другом серваке обнаружилось, что по каким-то причинам корень [/] был в /dev/hda6, так вот — устройство /dev/md_d0p6 небыло создано при создании raid-а, т.к. железка старая и всеравно скоро будет меняться — оставили ее пока впокое.
Создаем /etc/mdadm.conf
mdadm —examine —scan > /etc/mdadm.conf
И редактируем его (/etc/mdadm.conf): необходимо заменить /dev/md0 на /dev/md_d0.
Правим /etc/fstab — меняем параметры типа LABEL=…. на
root=/dev/md_d0pN где N — соответствует /dev/sdaN на котором был этот раздел.
И создаем новый образ initrd
cd /boot
mv initrd-2.6.18-128.el5.img initrd-2.6.18-128.el5.img.bak
mkinitrd /boot/initrd-2.6.18-128.el5.img 2.6.18-128.el5
Перезагружаемся уже в нормальном режиме.
Если все прошло успешно — последний штрих, синхронизация дисков, хотя сервер уже выполняет свои функции.
Добавляем второй диск в массив
mdadm —add /dev/md_d0 /dev/sdb
Можем последить за процессом синхронизации
watch cat /proc/mdstat
Синхронизация — процесс довольно долгий и сильно тормозящий весь сервер. Что логично — винчестеры оба задействованы «на полную».
Весь процесс от остановки сервера для перезагрузки до запуска занял примерно 15 минут (не считая времени на подготовку и синхронизацию, т.к. в это время сервер хоть и тормозил, но всетаки работал).
Раздел /tmp позже был создан уже сразу на /dev/md_d0 и неиспользуемого места на массиве больше не осталось :)
При эмуляции отказа — удалили диск sda, бывший sdb обнаружился как sda и все нормально загрузилось и работало, НО когда sda (отформатированый ради чистоты эксперимента) вернули наместо — сервак не завелся!
Все оказалось банально просто — в рейде остался один диск — sda который стал sdb после возвращения sda наместо, проблема решилась просто — переткнули диски наоборот, вроде мелочь, но нервы попортить может :)
Преимущества:
1.Нет необходимости при замене жесткого диска разбивать его на разделы, и колдовать с загрузчиком.
2.Процесс восстановления состоит из одной единственной команды — добавления нового диска взамен вышедшего из строя.
Недостатки:
1. swap тоже получается на raid-е, хотя если бы делали на нормальном raid контроллере помоемому получили бы тотже эффект.
2. Надо патчить mkinitrd, вроде как патч будет включен и необходимость в этом отпадет.
3. Пока неясно как это все проделать на удаленной машине, но впринципе это возможно.
Оригинал opennet.ru/base/sys/centos_raid1.txt.html
Понравилась статья? Поделись с остальными.