Pull to refresh

Мигрируем с raid1 на raid10 без потери данных в Debian

Reading time 6 min
Views 18K
Есть raid1 из 2 дисков, есть 2 дополнительных диска, нужно добавить эти 2 диска в массив и мигрировать на raid10 без потери данных. Ситуация усложняется тем, что boot расположен не в raid, а находит только на одном из дисков, и для усиления отказоустойчивости сервера загрузчик нужно переместить в raid1.

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

Имеем:
На диске /dev/sdd1 находится /boot
На массиве /dev/md1 находится /
На массиве /dev/md2 находится swap
Если у вас с загрузчиком вопрос уже решен, можете перейти сразу к разделу с миграцией.

Переносим загрузчик


На диске /dev/sdd есть данные и есть загрузчик, поэтому его будем считать эталоном, все остальные диски можно считать пустыми. Для надежности, загрузчик мы не будем размещать на raid10, а оставим на raid1 из 2х дисков (можно и на 3х и на 4х), для большей отказоустойчивости.

Создаем на диске sdb разделы один в один как на sdd. Либо вручную, например, с помощью
fdisk /dev/sdb

Либо просто дублируем разделы
sfdisk -d /dev/sdd --force | sfdisk /dev/sdb --force

Сам загрузчик находится на /dev/sdd1, поэтому деградированный raid1 /dev/md4 создадим следующим образом
mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb1
mke2fs -j /dev/md4

После создания любого нового массива, нужно обновить информацию о всех raid, иначе после перезагрузки все развалится
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Теперь перезагрузим сервер, и после перезагрузки увидим странный массив /dev/md127 от которого нужно избавиться, и наш /dev/md4, который может не появиться, т.к. вместо него /dev/md127. Решить эту проблему достаточно просто, достаточно остановить эти 2 массива и добавить заново /dev/md4
mdadm -S /dev/md127
mdadm -S /dev/md4
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm --assemble /dev/md4

Для надежности стоит еще раз перезагрузиться и после этого мы подходим к самой ответственной части, нужно отредактировать загрузчик GRUB2 так, чтобы он грузил сервер с созданного массива. Для этого нужно узнать UUID старого диска с загрузчиком /dev/sdd1 и нового массива /dev/md4
root@server:~# ls -l /dev/disk/by-uuid
total 0
lrwxrwxrwx 1 root root 9 Nov  9 20:56 4d7faa7f-25b3-4a14-b644-682ffd52943b -> ../../sdd1
lrwxrwxrwx 1 root root 9 Nov  9 20:56 29683c02-5bd7-4805-8608-5815ba578b6c -> ../../md4

Отредактируем /boot/grub/grub.cfg. Везде, где встречается старый UUID — 4d7faa7f-25b3-4a14-b644-682ffd52943b заменяем на наш новый UUID — 29683c02-5bd7-4805-8608-5815ba578b6c, по сути это будет в каждой секции search.
Везде, где есть set root, тоже нужно сделать замену. Например, было так
set root='(hd0)'
А будем вот так
set root='(md/4)'

Пример получившегося нового конфига
insmod raid
insmod mdraid
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod ext2
set root='(md/4)'
search --no-floppy --fs-uuid --set 59f76eb9-00d2-479e-b94e-6eb54fc574d4
set locale_dir=($root)/grub/locale

А секция ### BEGIN /etc/grub.d/10_linux ### будет выглядеть так

menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
insmod raid
insmod mdraid
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod part_msdos
insmod ext2
set root='(md/4)'
search --no-floppy --fs-uuid --set 59f76eb9-00d2-479e-b94e-6eb54fc574d4
echo 'Loading Linux 2.6.32-5-amd64 ...'
linux /vmlinuz-2.6.32-5-amd64 root=/dev/md1 ro quiet
echo 'Loading initial ramdisk ...'
initrd /initrd.img-2.6.32-5-amd64
}
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os {

Очень важно, чтобы теперь вы не перезагружались, поэтому что изменив этот файл, загрузчик уже будет думать, что информация для загрузки находится на /dev/md4, а там пока еще ничего нет. Чтобы оставить себе лазейку, не редактируйте секцию recovery mode, так вы сможете загрузиться со старыми данными, правда для этого вам понадобится доступ через KVM-IP или чтобы сотрудник ДЦ выбрал при загрузке recovery mode.

Теперь необходимо обновить ram-диск, иначе система просто не загрузится
update-initramfs -u

После того, как мы внесли изменения в загрузчик, можно переносить содержимое /boot на созданный массив /dev/md4
mkdir /mnt/md4
mount /dev/md4 /mnt/md4
rsync -avHxl --progress --inplace --exclude 'lost+found' /boot/ /mnt/md4/
umount /mnt/md4/

Мы должны убедиться, что загрузчик GRUB2 установлен на 2х жестких дисках (или 4х, смотря сколько вы захотели добавить в массив), а так же на массиве /dev/md4. Самый надежный способ это сделать, выполнить
dpkg-reconfigure grub-pc

где нужно выбрать все диски, на которые нужно добавить загрузчик.

Кроме загрузчика, и сама система должна правильно понять, что загрузчик теперь в другом месте, для этого достаточно отредактировать файлы /etc/fstab и /etc/mtab. Нас интересует строка, где монтируется /boot. UUID нам не понадобится, вместо него указываем название нашего raid-массива.
В файле /etc/fstab
#UUID=7092eb46-9ee8-4a32-b9a7-5d759cc74af0 /boot           ext3    defaults        0       2
/dev/md4 /boot           ext3    defaults        0       2

В файле /etc/mtab
#/dev/sdd1 /boot ext3 rw 0 0
/dev/md4 /boot ext3 rw 0 0

Теперь можно перезагружаться, и если вы все сделали правильно, система загрузится с /dev/md4, а /dev/sdd1 уже не используется. Осталось только дособрать наш деградированный массив
mdadm /dev/md4 --add /dev/sdd1


Мигрируем с raid1 на raid10 без потери данных


Ситуация все та же, есть raid1 массив из 2х дисков и 2 свободных диска, нужно собрать это все в raid10 и чтобы данные были целы.
Для новых дисков нужно создать структуру разделов идентичную тем, что уже в raid
sfdisk -d /dev/sdd --force | sfdisk /dev/sda --force
sfdisk -d /dev/sdd --force | sfdisk /dev/sdb --force

На /dev/md4 находится /boot
На /dev/md1 находится /
На /dev/md2 находится swap

/boot мы не будем трогать, оставим его как raid1, данные сохранить нужно только на /dev/md1 (массив состоит из /dev/sda6, /dev/sdb6, /dev/sdc6, /dev/sdd6).

Чтобы сохранить данные, мы соберем деградированный raid10 массив из 3 дисков, и перенесем туда данные с raid1, после этого разберем raid1 и доделаем raid10.

Для начала вытащим 1 диск из raid1, т.к. нам нужно минимум 3 диска для создания raid10
mdadm /dev/md1 --fail /dev/sdc6 --remove /dev/sdc6

Собираем деградированный RAID10 как /dev/md3 и монтируем его. Обязательно добавим запись о новом массиве, чтобы после перезагрузки он оставался
mdadm --create /dev/md3 --level=10 --raid-devices=4 /dev/sda6 /dev/sdb6 /dev/sdc6 missing
mke2fs -j /dev/md3
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Если случайно перезагрузились до того, как записали данные о массивах, то выполните
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm --assemble /dev/md3

Переносим данные с /dev/md1 на /dev/md3
mkdir /mnt/md3
mount -t ext3 /dev/md3 /mnt/md3
rsync -avHxl --progress --inplace --exclude 'lost+found' / /mnt/md3/
umount /mnt/md3

Всё, данные сохранены на raid10 и миграция почти завершена. Теперь нужно указать системе, чтобы она использовала новый /dev/md3, вместо старого /dev/md1. Для этого надо отредактировать файлы /etc/fstab и /etc/mtab.
В файле /etc/fstab нужно сделать замену UUID /dev/md1 на UUID /dev/md3
ls -l /dev/disk/by-uuid
lrwxrwxrwx 1 root root 9 Nov  9 20:56 29683c02-5bd7-4805-8608-5815ba578b6c -> ../../md3

Получаем следующее
#UUID=4d7faa7f-25b3-4a14-b644-682ffd52943b /               ext3    errors=remount-ro 0       1
UUID=29683c02-5bd7-4805-8608-5815ba578b6c /               ext3    errors=remount-ro 0       1

В файле /etc/mtab нужно просто заменить везде вместо /dev/md1 новый /dev/md3
/dev/md3 / ext3 rw,errors=remount-ro 0 0

Когда меняется устройство для /boot или / нужно обязательно редактировать конфигурацию загрузчика /boot/grub/grub.cfg и выполнять update-initramfs, иначе грузится не будет.

В файле /boot/grub/grub.cfg везде, где встречается 4d7faa7f-25b3-4a14-b644-682ffd52943b (старый UUID у /dev/md1) заменяем на наш новый UUID — 29683c02-5bd7-4805-8608-5815ba578b6c, по сути это важно для секций search.
А внутри секции
### BEGIN /etc/grub.d/10_linux ###
заменим root=/dev/md1 на root=/dev/md3

И после этого обязательно выполнить
update-initramfs -u

Нужно перезагрузиться, чтобы корень / стал новым массивом /dev/md3 и обращений к старом raid1 уже не было. Закончить создание raid10 нужно добавлением того диска, который сейчас в raid1 (/dev/sdd6). Но для начала нужно его остановить и очистить раздел
mdadm -S /dev/md1
mdadm --zero-superblock /dev/sdd6

И только теперь добавить диск в массив raid10 и обновить данные о массивах
mdadm /dev/md3 --add /dev/sdd6
mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Вот и все, миграция с raid1 на raid10 без потери данных завершена.

P.S. В итоге я вернулся обратно на raid1, т.к. в моем случае, сам переход с raid1 на raid10 не дал каких-либо внушительных результатов, намного лучше себя показал raid1 из 4х дисков.
Tags:
Hubs:
+15
Comments 14
Comments Comments 14

Articles