Записки системного администратора

Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.

CentOS 7: Настройка программного массива RAID1 на работающей системе

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

Об этой теме в интернете написано довольно много и рассмотрена она на многих ресурсах (вот тут даже на Хабре есть описание), но я решил описать этот процесс здесь, чтобы потом долго не искать, если вдруг что-то забуду. Создаваться массив будет с помощью утилиты mdadm, в конце заметки будут даны несколько примеров ее использования.

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

  1. Диск /dev/sda, на котором имеются следующие разделы:
    • /dev/sda1 - раздел / с файловой системой ext4
    • /dev/sda2 - swap
    • /dev/sda3 - раздел /opt с файловой системой ext4
  2. Абсолютно чистый /dev/sdb, идентичный по размеру с /dev/sda

В результате должно получиться следующее:

  • /dev/md0, полученный из /dev/sda1 и /dev/sdb1
  • /dev/md1, полученный из /dev/sda2 и /dev/sdb2
  • /dev/md2, полученный из /dev/sda3 и /dev/sdb3

Как я уже написал в начале заметки, для создания массива будет использоваться утилита mdadm.
Для ее установки:

# yum install mdadm

Для создания массива raid1 на уже работающей системе, необходимо подготовить диск /dev/sdb, скопировать на него все содержимое диска /dev/sda и только после этого добавить /dev/sda к массиву.

Для начала копируем таблицу разделов диска /dev/sda на диск /dev/sdb:

# sfdisk -d /dev/sda | sfdisk /dev/sdb

Команда fdisk -l должна теперь показать идентичную разметку обоих дисков.

Желательно (но не обязательно) изменить тип всех трех разделов и установить его равным FD (Linux RAID autodetect). Изменить тип раздела можно с помощью fdisk:

# fdisk /dev/sdb

Перейдем к созданию raid1 массивов. Поскольку диск /dev/sda сейчас занят (на нем запущена система) разделы /dev/sda1, /dev/sda2 и /dev/sda3 нельзя добавить к массиву. Создаем raid1 из одного диска, для вторго используем заполнитель missing:

# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb2
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb3

Следующий шаг – создание файловых систем на наших массивах:

# mkfs.ext4 /dev/md0
# mkswap /dev/md1
# mkfs.ext4 /dev/md2

Теперь монтируем наши /dev/md0 и /dev/md2 для копирования текущей системы. Естественно, swap массив /dev/md1 монтировать не нужно:

# mkdir /mnt/md0
# mount /dev/md0 /mnt/md0

# mkdir /mnt/md2
# mount /dev/md2 /mnt/md2

Копируем содержимое разделов /dev/sda1 и /dev/sda3 на /dev/md0 и /dev/md2 соответственно:

# rsync -axu / /mnt/md0

# rsync -axu /opt /mnt/md2

Монтируем информацию о текущей системе в наш новый корень и делаем chroot в него:

# mount --bind /proc /mnt/md0/proc && mount --bind /dev /mnt/md0/dev && mount --bind /sys /mnt/md0/sys && mount --bind /run /mnt/md0/run && chroot /mnt/md0

Получаем UUID /dev/md0, /dev/md1 и /dev/md2, вносим их в /etc/fstab, где заменяем UUID разделов диска /dev/sda:

# ls -l /dev/disk/by-uuid |grep md >> /etc/fstab
# nano /etc/fstab

Создаем конфиг для mdadm:

# mdadm --detail --scan > /etc/mdadm.conf 

Делаем новый initramfs:

# mv /boot/initramfs-3.10.0-28.el7.x86_64.img /boot/initramfs-3.10.0-28.el7.x86_64.img.bak
# dracut /boot/initramfs-$(uname -r).img $(uname -r)

Передаем ядру опцию "rd.auto=1" явно через grub, для этого добавляем ее в GRUB_CMDLINE_LINUX:

# nano /etc/default/grub

Перепишем конфиг grub и установим его на наш диск sdb:

# grub2-mkconfig -o /boot/grub2/grub.cfg && grub2-install /dev/sdb

Далее выполним перезагрузку сервера. Через BIOS Boot Menu выбираем диск с половинкой raid.

После удачной загрузки, переделываем sda в часть raid1 массива. С помощью fdisk изменим тип всех трех разделов и установим его равным FD (Linux RAID autodetect). Далее добавим диск в raid1 и переустановим grub на диск:

#fdisk /dev/sda

#mdadm --manage /dev/md0 --add /dev/sda1
#mdadm --manage /dev/md1 --add /dev/sda2
#mdadm --manage /dev/md2 --add /dev/sda3

#grub2-install /dev/sda

После этого можем посмотреть как собирается raid1 массив через /proc/mdstat:

# cat /proc/mdstat 
Personalities : [raid1] 
md2 : active raid1 sda3[2] sdb3[1]
      442117120 blocks super 1.2 [2/1] [_U]
          resync=DELAYED
      bitmap: 4/4 pages [16KB], 65536KB chunk

md0 : active raid1 sda1[2] sdb1[1]
      41910272 blocks super 1.2 [2/1] [_U]
      [============>........]  recovery = 64.8% (27192256/41910272) finish=2.6min speed=93586K/sec

md1 : active raid1 sda2[2] sdb2[1]
      4190208 blocks super 1.2 [2/1] [_U]
          resync=DELAYED

unused devices: <none>

На этом все, программный raid1 успешно создан!

Ниже несколько примеров для работы с утилитой mdadm.

Примеры использования mdadm

Пометка диска как сбойного

Диск в массиве можно условно сделать сбойным, ключ --fail (-f):

# mdadm /dev/md0 --fail /dev/sda1
# mdadm /dev/md0 -f     /dev/sda1

Удаление сбойного диска

Сбойный диск можно удалить с помощью ключа --remove (-r):

# mdadm /dev/md0 --remove /dev/sda1
# mdadm /dev/md0 -r       /dev/sda1

Добавление нового диска

Добавить новый диск в массив можно с помощью ключей --add (-a) и --re-add:

# mdadm /dev/md0 --add /dev/sda1
# mdadm /dev/md0 -a    /dev/sda1

Сборка существующего массива

Собрать существующий массив можно с помощью mdadm --assemble. Как дополнительный аргумент указывается, нужно ли выполнять сканирование устройств, и если нет, то какие устройства нужно собирать.

# mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1 /dev/sdc1
# mdadm --assemble --scan

Расширение массива

Расширить массив можно с помощью ключа --grow (-G). Сначала добавляется диск, а потом массив расширяется:

# mdadm /dev/md0 --add /dev/sdb1

Проверяем, что диск (раздел) добавился:

# mdadm --detail /dev/md0
# cat /proc/mdstat

Если раздел действительно добавился, мы можем расширить массив:

# mdadm -G /dev/md0 --raid-devices=4

Опция --raid-devices указывает новое количество дисков используемое в массиве. Например, было 3 диска, а теперь расширяем до 4-х - указываем 4.

Рекомендуется задать файл бэкапа на случай прерывания перестроения массива, например добавить:

--backup-file=/var/backup

При необходимости, можно регулировать скорость процесса расширения массива, указав нужное значение в файлах

/proc/sys/dev/raid/speed_limit_min
/proc/sys/dev/raid/speed_limit_max

Убедитесь, что массив расширился:

# cat /proc/mdstat

Нужно обновить конфигурационный файл с учётом сделанных изменений:

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
# vi /etc/mdadm/mdadm.conf

Переименование массива

Для начала отмонтируйте и остановите массив:

# umount /dev/md0
# mdadm --stop /dev/md0

Затем необходимо пересобрать как md5 каждый из разделов sd[abcdefghijk]1

# mdadm --assemble /dev/md5 /dev/sd[abcdefghijk]1 --update=name

или так

# mdadm --assemble /dev/md5 /dev/sd[abcdefghijk]1 --update=super-minor

Удаление массива

Для начала отмонтируйте и остановите массив:

# umount /dev/md0
# mdadm -S /dev/md0

Затем необходимо затереть superblock каждого из составляющих массива:

# mdadm --zero-superblock /dev/sda1
# mdadm --zero-superblock /dev/sdb2

Если действие выше не помогло, то затираем так:

# dd if=/dev/zero of=/dev/sda1 bs=512 count=1
# dd if=/dev/zero of=/dev/sdb2 bs=512 count=1

HTML Preview:

Коротко о себе:

Привет! Меня зовут Вадим. В этом блоге я пишу об интересующих меня вещах, о проблемах, с которыми сталкиваюсь во время работы, и о путях их решения.

Связаться со мной можно, написав письмо на адрес vadim@adminbook.click