Есть 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. Либо вручную, например, с помощью
Либо просто дублируем разделы
Сам загрузчик находится на /dev/sdd1, поэтому деградированный raid1 /dev/md4 создадим следующим образом
После создания любого нового массива, нужно обновить информацию о всех raid, иначе после перезагрузки все развалится
Теперь перезагрузим сервер, и после перезагрузки увидим странный массив /dev/md127 от которого нужно избавиться, и наш /dev/md4, который может не появиться, т.к. вместо него /dev/md127. Решить эту проблему достаточно просто, достаточно остановить эти 2 массива и добавить заново /dev/md4
Для надежности стоит еще раз перезагрузиться и после этого мы подходим к самой ответственной части, нужно отредактировать загрузчик GRUB2 так, чтобы он грузил сервер с созданного массива. Для этого нужно узнать UUID старого диска с загрузчиком /dev/sdd1 и нового массива /dev/md4
Отредактируем /boot/grub/grub.cfg. Везде, где встречается старый UUID — 4d7faa7f-25b3-4a14-b644-682ffd52943b заменяем на наш новый UUID — 29683c02-5bd7-4805-8608-5815ba578b6c, по сути это будет в каждой секции search.
Везде, где есть set root, тоже нужно сделать замену. Например, было так
А будем вот так
Пример получившегося нового конфига
Очень важно, чтобы теперь вы не перезагружались, поэтому что изменив этот файл, загрузчик уже будет думать, что информация для загрузки находится на /dev/md4, а там пока еще ничего нет. Чтобы оставить себе лазейку, не редактируйте секцию recovery mode, так вы сможете загрузиться со старыми данными, правда для этого вам понадобится доступ через KVM-IP или чтобы сотрудник ДЦ выбрал при загрузке recovery mode.
Теперь необходимо обновить ram-диск, иначе система просто не загрузится
После того, как мы внесли изменения в загрузчик, можно переносить содержимое /boot на созданный массив /dev/md4
Мы должны убедиться, что загрузчик GRUB2 установлен на 2х жестких дисках (или 4х, смотря сколько вы захотели добавить в массив), а так же на массиве /dev/md4. Самый надежный способ это сделать, выполнить
где нужно выбрать все диски, на которые нужно добавить загрузчик.
Кроме загрузчика, и сама система должна правильно понять, что загрузчик теперь в другом месте, для этого достаточно отредактировать файлы /etc/fstab и /etc/mtab. Нас интересует строка, где монтируется /boot. UUID нам не понадобится, вместо него указываем название нашего raid-массива.
В файле /etc/fstab
В файле /etc/mtab
Теперь можно перезагружаться, и если вы все сделали правильно, система загрузится с /dev/md4, а /dev/sdd1 уже не используется. Осталось только дособрать наш деградированный массив
Ситуация все та же, есть raid1 массив из 2х дисков и 2 свободных диска, нужно собрать это все в raid10 и чтобы данные были целы.
Для новых дисков нужно создать структуру разделов идентичную тем, что уже в raid
На /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
Собираем деградированный RAID10 как /dev/md3 и монтируем его. Обязательно добавим запись о новом массиве, чтобы после перезагрузки он оставался
Если случайно перезагрузились до того, как записали данные о массивах, то выполните
Переносим данные с /dev/md1 на /dev/md3
Всё, данные сохранены на raid10 и миграция почти завершена. Теперь нужно указать системе, чтобы она использовала новый /dev/md3, вместо старого /dev/md1. Для этого надо отредактировать файлы /etc/fstab и /etc/mtab.
В файле /etc/fstab нужно сделать замену UUID /dev/md1 на UUID /dev/md3
Получаем следующее
В файле /etc/mtab нужно просто заменить везде вместо /dev/md1 новый /dev/md3
Когда меняется устройство для /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.
А внутри секции
заменим root=/dev/md1 на root=/dev/md3
И после этого обязательно выполнить
Нужно перезагрузиться, чтобы корень / стал новым массивом /dev/md3 и обращений к старом raid1 уже не было. Закончить создание raid10 нужно добавлением того диска, который сейчас в raid1 (/dev/sdd6). Но для начала нужно его остановить и очистить раздел
И только теперь добавить диск в массив raid10 и обновить данные о массивах
Вот и все, миграция с raid1 на raid10 без потери данных завершена.
P.S. В итоге я вернулся обратно на raid1, т.к. в моем случае, сам переход с raid1 на raid10 не дал каких-либо внушительных результатов, намного лучше себя показал raid1 из 4х дисков.
Все описанные действия проводились на рабочем боевом сервере. Схема универсальная, подойдет для любых других начальных условий. Так же аналогично можно мигрировать с 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х дисков.