Переход на RAID-1 в Linux

 

Создан: 18.02.2009
Модиф: 17.07.2020
Иванов Аркадий

 

Сохранность данных на диске можно обеспечить вторым диском, который работает как зеркало для первого. Этот режим называется RAID первого уровня (Redundant Array of Inexpensive Disks -  избыточный массив недорогих дисков). По другому - RAID-1.

 

Хочу заметить, что большую надёжность (не производительность :-) ) даёт зеркалирование по сети с помощью пакета DRDB.

 

Рассмотрим случай, когда есть диск с установленной системой Linux и необходимо подключить второй диск и перевести эту пару в работу в режиме зеркала.  Эта новая система должныа выполнять следующие функции:

  • Писать данные одновременно на оба диска
  • При отказе одного диска грузиться как ни в чём ни бывало со второго.

В Linux для этого есть драйвер MD, его поддержка загрузчиками LILO и GRUB и программа mdadm, с помощью которой мы управляемся с RAID-ами.

 

Итак, дан компьютер с установленной на раздел /dev/sda2 работающей системой Linux. Раздел /dev/sda1 - это swap. Также у нас в наличии подключенный второй диск /dev/sdb с такой же геометрией. Он пока пуст. Замечу, что развлекался я в Alt Linux Server 4.0.

Шаги по созданию raid-1:

 

  • Убеждаемся, что ядро поддерживает raid1. Этот модуль может быть статическим в ядре или в виде подгружаемого модуля. Если это не так, вытаскивайте ядро с kernel.org, конфигурите его, собирайте его, устанавливайте и перезапускайтесь с него.
    Загружаем модуль, если они не статический:
    modprobe raid1
     
  • Устанавливаем пакет MDADM.
     
  • Запускаем fdisk и делаем тип раздела /dev/sda2 как "Linux raid autodetect"
     
  • Перезагружаемся.
     
  • Делаем копию таблицы разделов первого диска на второй:
    sfdisk -d /dev/sda | sfdisk /dev/sdb
     
  • Создаём raid-1 массив только из одного раздела /dev/sdb2, поскольку /dev/sda2 сейчас пока занят - с него мы загрузились.
    mdadm --create /dev/md0 --level=1 --raid-disk=2 missing /dev/sdb2
    Параметр "missing" указывает программе, что у нас пока неполноценный массив и одного диска пока не хватает.

    Примечание: состояние raid-массивов можно всегда посмотреть в /proc/mdstat.
     
  • Теперь создаём конфиг для mdadm. Файл называется /etc/mdadm.conf. Можно сделать это вручную:
     
    MAILADDR 77777XX777@sms.primtel.ru
    PROGRAM /sbin/mdadm-syslog-events
    DEVICE partitions
    ARRAY /dev/md0 level=raid1 num-devices=2 devices=/dev/sdb2,/dev/sda2 auto=md

    В этом файле указали адрес, куда слать сообщения о событиях в RAID и главное - из чего состоит наш RAID.
    Примечание: Запись об устройствах в этом файле можно сделать автоматически:
    mdadm --examine --scan  >>/etc/mdadm.conf
  • Делаем файловую систему на /dev/md0 (мы уже имеем raid-1 !):
    mkfs -t ext3 /dev/md0
     
  • Монтируем свежесозданный раздел:
    mkdir /mnt/md0
    mount /dev/md0 /mnt/md0

     
  • Копируем систему с sda (предварительно стоит остановить все базы данных и прочие полезные программы):
    cp   -dpRx   /   /mnt/md0

     
  • Обязательно следует скопировать ручками или создать inode для /dev/null и /dev/console в копии системы. В версиях ядер с udev без этого не обойтись.
     
  • Грузимся с Live DVD с Linux-ом в режиме восстановления системы (у меня DVD Alt Linux это умеет).
    • mkdir /mnt/1
    • mount /dev/md0 /mnt/1
    • mount /dev /mnt/1/dev -o bind
    • mount /proc /mnt/1/proc -o bind
    • mount /sys /mnt/1/sys -o bind
    • chroot /mnt/1

       
  • Если вы всё сделали правильно, значит вы работает уже на своей системе на диске RAID-массива.
     
  • Добавляем в RAID-1 первый диск:
    mdadm  -a  /dev/md0  /dev/sda2
     
  • Это длительная процедура. В этот момент началась синхронизация дисков. Её прерывать не следует. Просмотреть, что происходит можно так:
    watch -n 5 cat /proc/mdstat

    Раз в 5 секунд будет выводиться инфо о состоянии нашего RAID-а.
     
  • После синхронизации, если вы добавляли автоматические записи в /etc/mdadm.conf, их стоит стереть и снова:
    mdadm --examine --scan  >>/etc/mdadm.conf

    Если вы делали это вручную, то ничего делать не надо, поскольку у вас там нормальная запись об устройствах, а не их UUID-ы.
     
  • Генерим новый RAM-диск:
    cd   /boot
    rm   initrd-2.6.28.img
    mkinitrd     initrd-2.6.28.img     2.6.28

    Надеюсь, ваше ядро поддерживает модуль raid1. Если это не так, то ничего не получится. (См. самый первый пункт).
    Обратите внимание, чтобы устройства жёстких дисков в Live CD были такими же, что и в вашей системе. Т.е. если в вашей системе это sda, то и при загрузке с LiveCD они должны быть sda, а не hda. Иначе в initrd могут не попасть нужные модули. Если это не так, выберите другой LiveCD или ручками в командной строке добавляйте в initrd не знаю уж какие модули.
     
  • Правим /etc/lilo.conf, отмечу важные строки и конфиг для моего ядра:

    default="2628"
    boot="/dev/md0"
    raid-extra-boot=mbr-only
    disk=/dev/sda bios=0x80
    disk=/dev/sdb bios=0x81

    image="/boot/vmlinuz-2.6.28"
                  label="2628"
                  initrd="/boot/initrd-2.6.28.img"
                  root="/dev/md0"
                  read-only
     
  • Затем выполняем "lilo". Предупреждение о том, что загрузочная запись будет в том числе и не на первом диске можно проигнорировать.
     
  • Правим /etc/fstab. Вместо корня на /dev/sda2 указываем /dev/md0:
    /dev/md0  /  ext3   defaults        1       1
     
  • Перезагружаемся и работаем с RAID-1.

     
  • ПРИМЕЧАНИЕ: Если у вас GRUB, то:
    • В /boot/grub/grub.conf должно быть:
      timeout 10 # Грузимся по умолчанию с sda, если не доступен, грузимся с sdb
      default 0
      fallback 1
      
      # Загрузка с первого диска
      title  2628 (hd0,0)
      kernel (hd0,0)/vmlinuz-2.6.28 root=/dev/md0
      
      # Загрузка со второго диска, если с первого не получилось
      title  2628 (hd1,0)
      kernel (hd1,0)/vmlinuz-2.6.28 root=/dev/md0
      
    • Запускаем grub и делаем загрузочные записи на первом и втором диске
      # grub
      grub> root (hd0,0)
      grub> setup (hd0)
      grub> root (hd1,0)
      grub> setup (hd1)
      grub> quit
      
       
  • ДОПОЛНЕНИЕ: Если у вас нет спасательного DVD или Live-DVD или ещё какие проблемы (у меня случилось так, что спасательный режим DVD с Alt Linux 5.0 ни в какую не определял устройство DVD, а Live DVD не хотел иметь ничего общего с /dev/md0), то: после копирования системы с /dev/sda2 на /dev/md0 можно сделать так:

    1. Сделать новую initrd для /dev/sda и скопировать на /dev/md0:
      cd /boot
      mkinitrd initrd-2.6.28.img 2.6.28
      cp initrd-2.6.28.img  /mnt/md0/boot

    2. Смонтировать /dev, /proc, /sys в /mnt/md0 (См. выше)

    3. Поменять корень системы:
      chroot /mnt/md0

    4. В lilo.conf указать загрузку не с /dev/md0, а /dev/sda:
       boot="/dev/sda"

    5. В lilo.conf не вставлять строку:
       raid-extra-boot=mbr-only

    6. Перезагрузиться. Система загрузится с /dev/md0.

    7. Сделать и дождаться результата:
      mdadm -a /dev/md0 /dev/sda2

    8. Исправить lilo.conf для полноценного RAID:
       boot="/dev/md0"
       raid-extra-boot=mbr-only

    9. lilo и потом перезагрузка.

 

                                                                         Некоторые приёмы работы с RAID-1:

1. При авариях RAID-1 иногда рассыпается и разделы второго диска не включены в RAID. Вот пример такой картины:

# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda3[0]
     153597376 blocks [2/1] [U_]

md2 : active raid1 sda5[0]
     264967936 blocks [2/1] [U_]

md0 : active raid1 sda2[0]
     61432448 blocks [2/1] [U_]


RAID состоял из разделов дисков sda и sdb. Разделы диска sdb отключены. Подключу снова раздел /dev/sdb2 в raid-массив /dev/md0:

mdadm --zero-superblock /dev/sdb2
mdadm -a /dev/md0 /dev/sdb2

Остальные разделы подключаются аналогичным образом.

2. После подключения диска или раздела начинается синхронизация дисков. Вот пример картинки:

# cat /proc/mdstat
Personalities : [raid1]

md1 : active raid1 sdb3[2] sda3[0]
     153597376 blocks [2/1] [U_]
       resync=DELAYED

md2 : active raid1 sdb5[2] sda5[0]
     264967936 blocks [2/1] [U_]
       resync=DELAYED

md0 : active raid1 sdb2[2] sda2[0]
     61432448 blocks [2/1] [U_]
     [>....................]  recovery =  4.9% (3032512/61432448) finish=13.4min speed=72352K/sec

Система восстанавливает md0, после чего возьмётся восстанавливать md1 и md2. Скорость копирования здесь 72Mb/sec.

Если это рабочий сервер, пользователям работать на нём во время восстановления довольно грустно, поэтому я снижаю скорость синхронизации дисков до 10Mb/sec:

echo "10000" >/proc/sys/dev/raid/speed_limit_max