пятница, 30 сентября 2011 г.

программный RAID1 с загрузкой под grub2 (Fedora14)

Монтируем диск для хранения образа диска
#mkdir /mnt/sdc
#mount /dev/sdc1 /mnt/sdc
Снимаем образ с диска с инфой
#dd if=/dev/sda conv=sync,noerror bs=32M | gzip -9cf > /mnt/sdc/sda.dd-image.gz
Где bs устанавливаем равную кэшу диска (в моём случае 32 Mb)

Разворачиваем образ из архива
#gunzip -c /mnt/sdc/sda.dd-image.gz | dd bs=32M of=/dev/sda
(В моём случае 500 гигабайт - ~100 минут)

Прогресс смотрим следующим образом, в соседней консоли узнаем pid процесса dd:
#ps -A |grep dd
Затем смотрим сам прогресс:
#watch -n10 kill -USR1 `ps -o pid -C dd|tail -n1`
------------------------------------------------------------------------------------------
#/dev/sda - диск с информацией
#/dev/sdb - диск зеркало
Что бы убрать с диска метадату аппаратного массива необходимо загрузившись с liveCD Выполнить следующие комманды:
#dmraid -r
(покажет список дисков у которых присутствуют метаданные массива)
#dmraid -rE /dev/sda
(собственно затирание метаданных)

Если есть остатки программного массива, их можно затереть следующим образом:
Для начала отмонтируйте и остановите массив:
# umount /dev/md0
# mdadm -S /dev/md0
Затем необходимо затереть superblock каждого из составляющих массива:
# mdadm --zero-superblock /dev/sda1
# mdadm --zero-superblock /dev/sda2
и так далее по всем разделам включенным в массивы
Если действие выше не помогло, то затираем так:
# dd if=/dev/zero of=/dev/sda1 bs=512 count=1
# dd if=/dev/zero of=/dev/sda2 bs=512 count=1
Загружаемся с /dev/sda и устанавливаем grub2 в качестве загрузчика. И обновляенм ядро (при необходимости):
# yum install grub2
# grub2-install /dev/sda
#yum erase kernel kernel-PAE grub
#yum install dracut dracut-tools kernel-PAE
Создаем через fdisk идентичные разделы, или копируем структуру первого диска /dev/sda:
#sfdisk -d /dev/sda | sfdisk --force /dev/sdb
#grub2-install /dev/sdb
В fdisk выставляем для всех разделов диска /dev/sdb тип fd ( raid autodetect)

Создаем массив для разделов, НЕ подключая туда пока раздел с информацией (sda). Если используется версия GRUB2 < 1.98, то дописываем в строку создания массива параметр --metadata=0.9 .
#mdadm --create /dev/md1 --level=1 --metadata=0.9 --raid-devices=2 missing /dev/sdb1 (это /boot)
#mdadm --create /dev/md2 --level=1 --metadata=0.9 --raid-devices=2 missing /dev/sdb2 (это /)
#mdadm --create /dev/md3 --level=1 --metadata=0.9 --raid-devices=2 missing /dev/sdb3 (swap)
#mdadm --create /dev/md4 --level=1 --metadata=0.9 --raid-devices=2 missing /dev/sdb4 (это /var)
Проверяем как создались диски
#cat /proc/mdstat
Форматируем свеже-созданные разделы
#mkfs.ext4 /dev/md1
#mkfs.ext4 /dev/md2
#mkswap -f /dev/md3
#mkfs.ext4 /dev/md4
Правим файл mdadm.conf
#cp /usr/share/doc/mdadm-3.1.3/mdadm.conf-example /etc/mdadm.conf
#mdadm --examine --scan >> /etc/mdadm.conf
Удаляем в содержимом файла /etc/sysconfig/grub ссылку на массив

Удаляем файл /boot/grub2/device.map
#rm /boot/grub2/device.map
Изменяем файл fstab
для начала узнаем UUID дисков в массиве и для удобства копируем их в /etc/fstab
#blkid /dev/md1 >>/etc/fstab
#blkid /dev/md2 >>/etc/fstab
#blkid /dev/md3 >>/etc/fstab
#blkid /dev/md4 >>/etc/fstab
Копируем записи загрузки в fstab и комментируем старые записи.
В незакомментированных записях правим параметры загрузки на UUID соответствующих дисков.
Должно получиться что-то вроде этого:
UUID=09e79cff-323b-4645-a8d4-630172cfedaf / ext4 defaults 1 1
UUID=0f316921-b794-492c-8fc2-8d71827145b5 /boot ext4 defaults 1 2
UUID=75ed9f59-a61c-4379-a124-af0b5dfd0a61 /var ext4 defaults 1 2
UUID=6f724829-50e2-4670-a939-747706b2d4d2 swap swap defaults 0 0
В файле /etc/mtab так же правим данные разделов на соответствующие /dev/md* .

далее обновляем initamfs. Так как стандартный пакет не может автоматически собрать mdraid создаем свой собственный вариант initramfs`а
#dracut --modules mdraid --omit dmraid --mdadmconf --force /boot/dracut/mdraid.img версия_ядра
Версию ядра можно списать по аналогии результату команды uname -r , только для нового ядра. Так происходит, потому что мы находимся еще на старом,
а не на свеже установленном ядре. в моем случае версия ядра была 2.6.35.14-96.fc14.i686.PAE.

и объединяем его со стандартным
#dracut-catimages /boot/mdraidadv.img /boot/initramfs-2.6.35.14-96.fc14.i686.PAE.img
По пути /etc/grub.d создаем файл 09_mdraid
#cp /etc/grub.d/40_custom /etc/grub.d/09_raid
со следующим содержимым:
menuentry "MDRAID and INITRAMFS" --class gnu-linux --class gnu --class os {
set gfxpayload=keep
insmod mdraid
insmod ext2
set root='(md1)'
echo Loading Linux 2.6.35.14-96.fc14.i686.PAE ...
linux /vmlinuz-2.6.35.14-96.fc14.i686.PAE root=/dev/md2 ro quiet KEYTABLE=ru SYSFONT=ter-k14n LANG=ru_RU.UTF-8
echo Loading initial ramdisk ...
initrd /mdraidadv.img
}
Строка "KEYTABLE=ru SYSFONT=ter-k14n LANG=ru_RU.UTF-8" необходима для лечения квадратиков вместо русских букв. Для удобства её можно скопировать из результата команды dracut-gencmdline
Так же изменяем в файле /lib/udev/rules.d/10-console.rules строку
KERNEL=="tty0", RUN+="/lib/udev/console_init %k"
на
KERNEL=="tty*", RUN+="/lib/udev/console_init %k"
Далее смотрим в /boot/grub2/grub.conf
root в этой переменной указывается путь, где grub ищет сам себя:
set root = '(md1)'
в строке search указываем путь до раздела загрузки меняя UUID, который ранее получили и прописали в fstab
search --no-floppy --fs-uuid --set 0f316921-b794-492c-8fc2-8d71827145b5
Пересобираем конфиг GRUB`а 2
#grub2-mkconfig >> /boot/grub2/grub2.conf
На всякий случай для отладки включаем шелл dracut`а. Для этого в файле /boot/grub2/grub.conf в конце строки загрузки ядра
можно дописать "console=tty0 rdshell" без кавычек.
------------------------------------------------------------------------------------------
Загружаемся с LiveCD
монтируем диск sda в /mnt/sda а массив md в /mnt/md
#mkdir /mnt/sda
#mkdir /mnt/md

#mount /dev/md2 /mnt/md
#mkdir /mnt/md/boot
#mkdir /mnt/md/var
#mount /dev/md1 /mnt/md/boot
#mount /dev/md4 /mnt/md/var

#mount /dev/sda2 /mnt/sda
#mount /dev/sda1 /mnt/sda/boot
#mount /dev/sda4 /mnt/sda/var
Копируем данные с sda на md
#cp -dpRx /mnt/sda/* /mnt/md
(~30 минут)
------------------------------------------------------------------------------------------
Загружаемся с массива
#reboot
В fdisk выставляем для всех разделов диска /dev/sda тип fd ( raid autodetect)

подключаем диски устройства /dev/sda в массив
mdadm --add /dev/md1 /dev/sda1
mdadm --add /dev/md2 /dev/sda2
mdadm --add /dev/md3 /dev/sda3
mdadm --add /dev/md4 /dev/sda4
и напоследок ещё раз делаем
#grub2-install /dev/sda
#grub2-install /dev/sdb