воскресенье, 13 октября 2013 г.

Перевод работающей системы Debian на RAID 1

Задача

Есть система, установленная на один диск. В систему установлен пустой диск такого же размера. Необходимо настроить зеркалирование разделов диска при помощи подсистемы md. В моём случае разбивка диска была следующей: /dev/sda2 - раздел подкачки, /dev/sda3 - корневой раздел, /dev/sda4 - раздел /home/.

1. Клонирование имеющейся системы на деградированный RAID 1

Для начала, скопируем на новый диск таблицу разделов с имеющегося:
# sfdisk -d /dev/sda | sfdisk /dev/sdb
Теперь выставим у каждого раздела, который будет зеркалироваться тип Linux raid autodetect (в моём случае это разделы 3 и 4) и запишем изменения на диск:
# fdisk /dev/sdb
Command (m for help): t
Partition number (2-4): 3
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (2-4): 4
Hex code (type L to list codes): fd

Command (m for help): w
На новом диске создадим деградированные разделы RAID 1, то есть разделы, в которых зеркальная пара отсутствует:
# mdadm --create /dev/md3 -l1 -n2 missing /dev/sdb3
# mdadm --create /dev/md4 -l1 -n2 missing /dev/sdb4
Можно заглянуть в файл /proc/mdstat, чтобы увидеть, что разделы RAID 1 созданы и в них отсутствует зеркальная пара.

Теперь нужно разметить разделы дисков (раздел для подкачки объединять в RAID 1 я не стану, а буду использовать его как дополнение к первому):
# mkswap /dev/sdb2
# mkfs.ext4 /dev/md3
# mkfs.ext4 /dev/md4
Теперь создадим точки монтирования для разделов и смонтируем их:
# mkdir /mnt/root
# mkdir /mnt/home
# mount /dev/md3 /mnt/root
# mount /dev/md4 /mnt/home
Теперь нужно скопировать содержимое разделов с работающей системы. Для этого я воспользуюсь rsync, запущенным от пользователя root, что позволит скопировать права доступа и владельцев всех файлов и каталогов:
# rsync -avvx --delete / /mnt/root/
# rsync -avvx --delete /home/ /mnt/home/
Теперь отредактируем файл /etc/fstab на копии корневого раздела. Для этого сначала узнаем идентификаторы раздела подкачки, корневого раздела и домашнего раздела, а затем пропишем их в файл /mnt/root/etc/fstab:
# blkid /dev/sdb2
# blkid /dev/md3
# blkid /dev/md4
# vi /mnt/root/etc/fstab
Обновим таблицу разделов md на новом диске:
# mdadm --detail --scan > /mnt/root/etc/mdadm/mdadm.conf
Теперь пришло время установить на новый диск GRUB и обновить загрузочный образ initrd, чтобы в нём были модули ядра, необходимые для работы с разделами RAID. Для этого сначала смонтируем в новый корневой раздел необходимые виртуальные файловые системы:
# mount --bind /dev /mnt/root/dev
# mount --bind /sys /mnt/root/sys
# mount --bind /proc /mnt/root/proc
Сделаем корнем корневую файловую систему нового диска:
# chroot /mnt/root
Смотрим идентификаторы дисков:
# ls /dev/disk/by-id/
Прописываем идентификатор нового диска в файл /boot/grub/device.map:
# vim /boot/grub/device.map
И устанавливаем GRUB (обратите внимание на то, что загрузочный сектор записывается на сам новый диск, а установка осуществляется в корневой раздел RAID 1):
# grub-install /dev/sdb
# update-grub
Обновим загрузочный образ initrd. Для этого сначала в файл /etc/initramfs-tools/modules дописываем модуль raid1, а затем обновляем загрузочные образы:
# vi /etc/initramfs-tools/modules
# update-initramfs -u -k all
Теперь можно попробовать перезагрузить систему, выбрав в BIOS загрузку со нового диска, на котором размечены разделы RAID 1.

2. Добавление исходного диска во вновь созданный RAID 1

Если система загрузилась, осталось только изменить типы разделов на старом диске и включить его разделы массивы RAID 1:
# fdisk /dev/sda
Command (m for help): t
Partition number (2-4): 3
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (2-4): 4
Hex code (type L to list codes): fd

Command (m for help): w
# mdadm --add /dev/md3 -a /dev/sda3
# mdadm --add /dev/md4 -a /dev/sda4
В файле /proc/mdstat можно наблюдать за процессом синхронизации разделов-половинок RAID 1.

Теперь переустановим GRUB на первом диске, чтобы в случае отказа второго, систему можно было загрузить с первого диска:
# grub-install /dev/sda
Не забудьте проверить, что с первого диска тоже можно загрузить систему, перезагрузив её снова и выбрав в BIOS загрузку с первого диска.

Использованные материалы:

1. Перенос работающей системы на программный RAID 1
2. Установка raid1 на работающую систему Debian Squeeze - осторожно, сиське :)

5 комментариев:

Анонимный комментирует...

не загрузился такой рейд, выпал в grub rescue, пожалел, что руководствовался статьей

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

А я эту инструкцию на двух компьютерах использовал и всё в порядке. Требуйте возврата денег. Видимо вам попался бракованный экземпляр.

Анонимный комментирует...

(продолжение)с восстановлением пришлось повозиться, все решилось загрузкой со спасательного диска и запуском команды dpkg-reconfigure grub-pc
второй раз на другой машине запустил ее и все нормально заработало
уж не знаю чего она делает, что не делает граб инсталл и update-initramfs -u -k all, но что-то явно сработало.

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

grub-pc, видимо, делает то, что должен делать update-grub - обновляет конфигурацию grub, прописывая в неё все имеющиеся в системе дисковые разделы, с которых можно что-то загрузить. Вы, случайно, не в Ubuntu эту статью использовали?

Анонимный комментирует...

Отличный мануал, спасибо. Хотя процесс довольно запутанный, и приходится каждый шаг адаптировать, в итоге всё получилось.