Как создать программного RAID 1 на CentOS 7
В данной заметке будет описан процесс создания программного raid1 массива на уже установленной и работающей системе CentOS7. Также настроим загрузчик grub таким образом, чтобы при выходе из строя одного из дисков система всеравно запустилась.
Об этой теме в интернете написано довольно много и рассмотрена она на многих ресурсах (вот тут даже на Хабре есть описание), но я решил описать этот процесс здесь, чтобы потом долго не искать, если вдруг что-то забуду. Создаваться массив будет с помощью утилиты mdadm, в конце заметки будут даны несколько примеров ее использования.
Исходные данные:
- Диск /dev/sda, на котором имеются следующие разделы:
- /dev/sda1 — раздел / с файловой системой ext4
- /dev/sda2 — swap
- /dev/sda3 — раздел /opt с файловой системой ext4
- Абсолютно чистый /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
Cоздания массива 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