2017-02-15

Как перенести Linux с одного mdamd-raid на другой

Сегодня я бы хотел поговорить о такой серьезной с точки зрения надежности вещи, как линуксовый софтварный рейд. А, вернее, показать, как можно спасти систему, которая требует замены дисков, на которых она и была установлена. Я рассмотрю 2 дистрибутива линукса - CentOS 7 и Debian 8 - которые будут поставлены в идентичные исходные условия. Также, так как тема мне кажется достойной лишней наглядности, помимо традиционных скриншотов и текста, в конце я оставлю ссылки на видео, в которых полностью показана вся процедура: от момента установки исходной системы, до восстановления ее работоспособности на новых дисках.

Общая часть: приготовление и восстановление бэкапа

В качестве исходной системы у нас Дебиан/Центось, установленные на один ext4-раздел, который зеркалится на 2 физических диска (скриншоты с центоси).


Легким движением руки выдираем один из дисков, создавая деградацию рейда.


Время делать бэкап =)
Конечно лучше если бэкап уже есть, но в нашем простом случае сделать бэкап также легко:


tar -czpvf /mnt/backup.tgz --exclude=/dev --exclude=/proc --exclude=/sys --exclude=/mnt /  
Эта команда создаст сжатую копию всего корня, за исключением трех директорий содержимое которых регенерируется автоматически, и директории /mnt, в которой у нас в данном случае нет ничего, кроме файла бэкапа.

Когда бэкап приготовился, гасим машину и устанавливаем 2 новых харда, которые составят новое зеркало.
Также я использую убунтовый live cd "Boot-Repair" для дальнейших операции, но, собственно, встроенной функцией автоматического восстановления пользоваться не буду. Так что на месте этого диска может быть любой другой Live CD, главное чтобы совпадала архитектура и были доступны утилиты mdadm, chroot, и parted (в моем случае он идет с GUI)

Итак, теперь у нас есть машинка с тремя дисками: половинка бывшего рейда, от которой нам нужен только файл бэкапа; и два новых неотформатированных диска.

После загрузки с лайва, закрываем все выплывающие окошки и открываем редактор разделов. sda1 - бэкап, sdb и sdc - пустые


На дисках sdb и sdc создаем таблицу разделов (Device -> Create Partition Table). Я использую GPT, потому что она подразумевает возможность использования разделов большого объема, а также создает дополнительные сложности для восстановления системы.


После создания таблицы, на обоих дисках создаем симметричную конфигурацию: 2 неотформатированных раздела - первый большой под систему, второй маленький (я оставил буквально 10 мегабайт в конце диска).




Второй раздел нужен для установки загрузчика GRUB2 на GPT. Также необходимо этим разделам добавить флаг. После применения разметки, нужно кликнуть правой мышкой по разделу, выбрать Manage Flags и отметить флаг bios_grub. Это необходимо сделать также на обоих новых дисках.


Теперь, когда разделы подготовлены, открываем терминал и первым делом я устанавливаю mdadm, так как его нет на этом Live CD.

1
2
sudo bash
apt install mdadm


Так как архив у нас лежит не на простом диске, а диске, который некогда был частью рейда, необходимо этот самый рейд обнаружить.

(Warning! Обратите внимание, что в результате выполнения первой команды, при восстановлении центоси создается устройство /dev/md127, а при восстановлении дебиана - /dev/md0. Нижеследующий блок справедлив для центоси)


1
2
3
4
5
6
7
# сканируем систему на наличие рейдов
# эта команда создаст устройство, в моем случае /dev/md127 - нашу 
# половинку зеркала с бэкапом
mdadm --assemble --scan
# создаем папку /mnt/backup и монтируем в нее найденный рейд
mkdir /mnt/backup
mount /dev/md127 /mnt/backup

Файлик бэкапа у нас в каталоге /mnt/backup/mnt/, теперь нужно приготовить новый рейд и залить на него бэкап.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# создаем новое устройство рейда
# имя может быть любым незанятым, 
# например /dev/md1
# --level=1 - зеркало
# --raid-devices=2 - 2 диска в рейде
mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# форматируем новый рейд
mkfs.ext4 /dev/md1
# создаем директорию и монтируем рейд в нее
mkdir /mnt/root
mount /dev/md1 /mnt/root
# распаковываем архив 
tar -xpvf /mnt/backup/mnt/backup.tgz -C /mnt/root/

После распаковки нужно чрутнуться в корень восстанавливаемой системы.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# создаем недостающие директории
mkdir /mnt/root/dev
mkdir /mnt/root/proc
mkdir /mnt/root/sys
mkdir /mnt/root/mnt
# к первым трем монтируем рабочие директории лайва
mount -o bind /dev/ /mnt/root/dev/
mount -o bind /proc/ /mnt/root/proc/
mount -o bind /sys/ /mnt/root/sys/
# чрутимся
chroot /mnt/root/

С этого момента пути восстановления дебиана и центоси расходятся

Debian

После чрута выполняем команду 


blkid

Она покажет ID нашего рейда /dev/md1.


Этот ID нужно прописать в /etc/fstab вместо имеющегося там.


Далее выполняем


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# прописываем в конфиг данные актуального рейда
mdadm --detail --scan | grep md1  >  /etc/mdadm/mdadm.conf
# пересобираем initrd
update-initramfs -u
# обновляем конфиг загрузчика
update-grub2
# устанавливаем загрузчик на оба 
# физических диска
grub-install /dev/sdb
grub-install /dev/sdc

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

CentOS

С центосью возни чуть больше, чем с дебианом, но ненамного.
После чрута правим /etc/fstab, заменяя айдишник корня на имя устройства. В нашем случае /dev/md1
(Attention! на картинках ниже везде используется /dev/md0 - не обращайте внимания, просто я его так назвал во время экспериментов с центосью)


После этого правим /etc/dracut.conf, раскомментируем параметр mdadmconf и присвоим ему значение yes.


Далее выполняем 

mdadm --detail --scan | grep md1

Эта команда выдаст ID нашего нового рейда.


Этот ID нужно указать в файлике /etc/default/grub вместо старого


Теперь


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# прописываем в конфиг данные актуального рейда
mdadm --detail --scan | grep md1  > /etc/mdadm.conf
# пересобираем initrd, 
# смотрим на ВАШ файлик *.img в директории /boot 
# и меняем версию по аналогии, если она отлична от моей
dracut /boot/initramfs-3.10.0-514.el7.x86_64.img 3.10.0-514.el7.x86_64 --force
# обновляем конфиг загрузчика
grub2-mkconfig -o /boot/grub2/grub.conf
# устанавливаем загрузчик на оба 
# физических диска
grub2-install /dev/sdb
grub2-install /dev/sdc
# создаем специальный файлик, без которого магии не случится
touch /.autorelabel

Перезагружаемся (один раз система перезагрузится автоматически - это нормально) и радуемся ожившей системе.

Вот и сказке конец

Обещанное в начале видео: