Мигрируем с raid1 на raid10 без потери данных. Загрузчик тоже оставляем на месте.
Исходные данные. Есть raid1 /dev/md1 из 4х дисков с названиями sda6, sdb6, sdc6, sdd6 и sda5, sdb5, sdc5, sdd5. Boot расположен на sdd1 (этот диск будем эталоном).
Для начала займемся загрузчиком. Создадим раид1 /dev/md0 на 2х дисках /dev/sdd и /dev/sdb (можно и на 4х) и поместим туда загрузчик.
fdisk /dev/sdb. Создаем на нём разделы по образу и подобию /dev/sdd. Либо можно запустить дублирование разделов:
sfdisk -d /dev/sdd --force | sfdisk /dev/sdb --force
Теперь создадим деградированный raid1 на /dev/md4
mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb1
mke2fs -j /dev/md4
Далее мы должны внести изменения в файл /etc/mdadm/mdadm.conf в данный момент времени которые не содержат никакой информации о наших новых массивах RAID.
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Перезагрузимся, чтобы получить UUID для массива /dev/md4
reboot
Если после перезагрузки у вас появились массивы со странными названиями вроде /dev/md127 и при этом есть /dev/md4 (или его вовсе нет), то выполните остановку этих массивов и добавьте их снова
mdadm -S /dev/md127
mdadm -S /dev/md4
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm --assemble /dev/md4
Узнаем какой UUID у старого загрузчика /dev/md0 и узнаем новый UUID у /dev/md4 (советую пару раз перезагрузится чтобы проверить что UUID каждый раз одинаковый для /dev/md4)
ls -l /dev/disk/by-uuid
В файле /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
Теперь возьмемся за загрузчик GRUB2. Отредактируем загрузчик /boot/grub/grub.cfg. Везде где встречается старый UUID - 4d7faa7f-25b3-4a14-b644-682ffd52943b заменяем на наш новый UUID - 29683c02-5bd7-4805-8608-5815ba578b6c, по сути это будет в каждой секций search
И везде где мы меняли UUID на 1 строчку выше есть 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 {
В первый раз не советую что-то менять ниже menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64 (recovery mode)', в случае чего (доступ к серверу через KVM-IP) сможете загрузится с рековери и откатить все изменения или починить все.
Мы указываем, что будем грузится с root='(md/4)' – производим загрузку с нашего RAID1 массива /dev/md4 (который будет производится с /boot раздела) вместо /dev/sdd или /dev/sdb, что важно, если один из наших жестких дисков выйдет из строя, то система будет по-прежнему работоспособна и сможет загрузится.
Обновим ram-диск, иначе система просто не загрузится.
update-initramfs -u
Теперь скопируем информация на /dev/md4. Примонтируем:
mkdir /mnt/md4
mount /dev/md4 /mnt/md4
И скопируем на /dev/md4 содержимое /boot
rsync -avHxl --progress --inplace --exclude 'lost+found' /boot/ /mnt/md4/
umount /mnt/md4/
Мы должны убедится, что загрузчик GRUB2 установлен на обоих жестких дисках, а так же на массиве /dev/md4. Запускаем
dpkg-reconfigure grub-pc
и выбираем все диски, на которые нужно установить загрузчик. Этот способ самый надежный.
Теперь пора перезагрузиться, и посмотреть правильно ли мы все сделали.
reboot
Если все загрузилось, то заканчиваем собирать raid1 для загрузчика
mdadm /dev/md4 --add /dev/sdd1
reboot
Инструкция писалась в живую, работа велась на рабочем сервере и все делалось один в один как описано в этой инструкции. Так что она полностью рабочая.
---------------------------------------------
А теперь займемся миграцией с RAID1 на RAID10.
На /dev/md0 находится /boot
На /dev/md1 находится /
На /dev/md2 находится swap
Будем работать только с /dev/md1 и /dev/md2
Для начала извлечем 2 диска из массива:
mdadm /dev/md1 --fail /dev/sda6 --remove /dev/sda6
mdadm /dev/md1 --fail /dev/sdb6 --remove /dev/sdb6
mdadm /dev/md2 --fail /dev/sda5 --remove /dev/sda5
mdadm /dev/md2 --fail /dev/sdb5 --remove /dev/sdb5
Уменьшим размер массива:
mdadm -G /dev/md1 -n2
mdadm -G /dev/md2 -n2
И в тоге, у нас более стандартноя ситуация, когда есть RAID1 массив из 2х дисков, и 2 свободных диска, и мы хотим собрать из этого RAID10
Вытащим 1 диск из RAID1
mdadm /dev/md1 --fail /dev/sdc6 --remove /dev/sdc6
mdadm /dev/md2 --fail /dev/sdc5 --remove /dev/sdc5
Т.к. на /dev/md2 находится swap раздел, то можно просто сделать так:
swapoff -a
mdadm -S /dev/md2
mdadm --create /dev/md2 --chunk=2048 --level=10 --raid-devices=4 /dev/sda5 /dev/sdb5 /dev/sdc5 /dev/sdd5
mkswap /dev/md2
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
ls -l /dev/disk/by-uuid
nano /etc/fstab -> UUID для swap подставляем новый
swapon -a
Соберем деградированный RAID10 на /dev/md3, создадим там раздел и примонтируем
mdadm --create /dev/md3 --chunk=2048 --level=10 --raid-devices=4 /dev/sda6 /dev/sdb6 /dev/sdc6 missing
mke2fs -j /dev/md3
[/code]
Запишем данные о массивах в конфиг, чтобы после перезагрузки они были:
[code]mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Если случайно перезагрузились до того, как записали данные о массивах в конфиг, то выполните
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
mdadm --assemble /dev/md3
[/code]
Теперь будем монтировать / не на /dev/md1 а на /dev/md3.
Редактируем файл /etc/fstab, конкртено эту строчку
[code]# / was on /dev/md1 during installation
UUID=4d7faa7f-25b3-4a14-b644-682ffd52943b / ext3 errors=remount-ro 0 1
Узнаем какой UUID у /dev/md3
ls -l /dev/disk/by-uuid
lrwxrwxrwx 1 root root 9 Nov 9 20:56 29683c02-5bd7-4805-8608-5815ba578b6c -> ../../md3
В итоге файл /etc/fstab
# / was on /dev/md1 during installation
#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/grub/grub.cfg. Везде где встречается 4d7faa7f-25b3-4a14-b644-682ffd52943b заменяем на наш новый UUID - 29683c02-5bd7-4805-8608-5815ba578b6c, по суди это важно для секций search
Внутри секции ### BEGIN /etc/grub.d/10_linux ### заменим
root=/dev/md1 на
root=/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
И чтобы все это дело загрузилось, update-initramfs надо делать когда меняется устройство /boot или /
update-initramfs -u
Теперь можно перезагрузится, все должно пройти успешно.
reboot
Загрузившись мы должны закончить создания raid10, добавив /dev/sdd6. Но вначале нужно остановить старый raid1 и очистить раздел
mdadm -S /dev/md1
mdadm --zero-superblock /dev/sdd6
mdadm /dev/md3 --add /dev/sdd6
Снова запишем данные о массивах в конфиг:
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
Вот и все, мы мигрировали на raid10 с raid1 без потери данных.