CreateMdRAID1onLiveSystem

Материал из ALT Linux Wiki


Создание загрузочного программного RAID1 с помощью средств ядра 2.6 на работающей системе

Исходные данные

  • Два HDD
  • Необходимость создания md RAID1
  • Ядро 2.6
  • Система проинсталлирована на HDD (/dev/sda), и он имеет наименьший размер из двух доступных.


Шаги

  • Создаем такие же разделы с такими же размерами на втором HDD:
sfdisk -d /dev/sda | sfdisk /dev/sdb
  • Запускаем fdisk /dev/sdb и проставляем всем разделам тип FD (Linux RAID Autodetect)
  • Создаем на каждом разделе degraded md RAID1 (нумерацию удобно начинать с единицы, по номерам разделов на HDD):
mdadm -Cv /dev/md1 -b internal --level=1 --raid-devices=2 missing /dev/sdb1

и т. д.
NB: -b internal включает отслеживание использования блоков на массиве, то есть при ресинхронизации массива будет синкаться не весь массив целиком, а только блоки с данными.

  • Создаем на каждом массиве нужную файловую систему:
mkfs.ext3 -E stride=16 /dev/md1

и т. д.
NB: для достижения более высокой производительности можно использовать опцию mkfs.ext3 -E stride=, то есть подогнать ФС под размер страйпа. stride=stripe/block-size. То есть в нашем случае это 64/4=16
См. http://wiki.centos.org/HowTos/Disk_Optimization

  • swap тоже создаём на raid-массиве. Если диск вылетит, системе не поплохеет внезапно без откушенного куска виртулаьной памяти.
mkswap /dev/mdX
  • Создаем новый образ initrd:
mkinitrd --with-raid --with raid1 /boot/initrd-`uname -r`-raid1.img `uname -r`
  • Монтируем новый root (который /dev/mdX) куда-нибудь в /mnt/raid1/root, создаем в нем нужные каталоги из нашего текущего корня, далее в них монтируем новые разделы, если такие есть (то бишь, создаем /mnt/raid1/root/var, к нему монтируем какой-нибудь /dev/md6, уже после этого создаем /mnt/raid1/root/var/log и к нему уже монтируем какой-нибудь /dev/md7)
  • Копируем все файлы с текущего HDD на новый (способов много, cp -ax, cpio, rsync и т.д), не забыл пропустить /proc и /sys (но создав их в новом root). Пример с rsync:
#!/bin/sh

renice 19 -p $$ ||:
ionice -c3 -p$$ ||:

rsync -vaPHx --delete --delete-after --numeric-ids / /mnt/newroot/
rsync -vaPHx --delete --delete-after --numeric-ids /usr /mnt/newroot/
rsync -vaPHx --delete --delete-after --numeric-ids /var /mnt/newroot/

Предполагается, что у нас на отдельные разделы вынесены /, /usr, /var. Применён ключ -x у rsync, чтобы он не выходил за границы одной файловой системы. Полезно, так как у нас могут быть примонтированы разные левые ресурсы куда-нибудь в /mnt, и ещё используются bind-mounts. Для уменьшения downtime системы можно выполнить такой rsync два раза — на живой системе и потом перейдя в init 1

  • Делаем chroot /mnt/raid1/root
  • Правим /etc/fstab, изменяя все разделы /dev/sdaX на массивы /dev/mdX
  • Создаем в /boot/grub/menu.lst записи вида:
# Boot automatically after 3 secs.
timeout 3

# By default, boot the first entry.
default 2614-vs26-smp-raid1 (hd0,0)

title  2614-vs26-smp-raid1 (hd0,0)
root   (hd0,0)
kernel (hd0,0)/vmlinuz-2.6.14-vs26-smp-alt5 root=/dev/md2 vga=normal
initrd (hd0,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img

title  2614-vs26-smp-raid1 (hd1,0)
root   (hd1,0)
kernel (hd1,0)/vmlinuz-2.6.14-vs26-smp-alt5 root=/dev/md2 vga=normal
initrd (hd1,0)/initrd-2.6.14-vs26-smp-alt5-raid1.img
  • Инсталлируем grub.
#!/bin/sh

grub --batch <<EOF
device (hd0) /dev/sda
root (hd0,0) #  (0 - это тот раздел, где у вас /boot, обычно /dev/sdX1, в grub-е просто нумерация с 0)
setup (hd0)
device (hd0) /dev/sdb
root (hd0,0)
setup (hd0)
quit
EOF
  • Отмонтируем все и перегружается. Если все правильно, то вы должны загрузиться с md raid1 массивов, которые пока располагаются на втором HDD
  • Если все работает, то запускаем fdisk /dev/sda и проставляем всем разделам тип FD (Linux RAID Auto)
  • Далее делаем для каждого raid-массива:
mdadm /dev/md1 --add /dev/sda1

и т. д.

  • После этого регулярно поглядываем в /proc/mdstat, нам нужно дождаться, когда ядро синхронизирует все массивы (при этом в /proc/mdstat исчезнут все упоминания о прогрессе синхронизации)
  • Перегружаемся и, если все хорошо, прописываем в /etc/mdadm.conf что-то вроде:
MAILADDR root
PROGRAM /usr/sbin/mdadm-syslog-events
DEVICE partitions
ARRAY /dev/md1 devices=/dev/sda1,/dev/sdb1
ARRAY /dev/md2 devices=/dev/sda2,/dev/sdb2

и т. д.

  • Включаем сервис mdadm
  • Пробуем отключить каждый HDD по очереди и загрузиться.

Неактуально?

В некоторых случаях устройства /dev/md* будут не доступны. В данном случае могут помочь:

service udevd stop

и/или

/lib/mkinitd/busybox raidautorun /dev/mdX


Увеличение скорости синхронизации RAID1

 echo 200000 > /proc/sys/dev/raid/speed_limit_max
 echo 200000 > /proc/sys/dev/raid/speed_limit_min