Проект

Общее

Профиль

Перенос системы на программное зеркало RAID1

Исходные данные:
  • ОС AltLinux, CentOS/RedOS, Ubuntu. В общем и целом, различия минимальны и будут оговорены отдельно.
  • два диска sda, sdb
  • убедиться, что установлена утилита mdadm, watch, fdisk. Если нет - установить.
    • для CentOS/RedOS
      yum install mdadm watch fdisk
      
    • для Ubuntu и AltLinux
      apt-get install mdadm watch fdisk
      

диск sda разбит на 4 раздела (по факту 5, т.к. 1 extended (расширеный) раздел)

sda1 - /boot
sda2 - /
sda3 - /var
sda4 - extended - (формально не нужен, но важен для понимания)
sda5 - swap

выглядит это примерно так

├─sda1
├─sda2
├─sda3
└─sda4 
  └─sda5

Подготовка

Отключаем SELinux (если он у вас есть)

vim /etc/selinux/config

меняем значение SELINUX на SELINUX=disabled

или одной командой

sed -i -r 's/^SELINUX=.+/SELINUX=disabled/' /etc/selinux/config

обязательно перезагружаемся

Подготовливаем разделы диска

Клонируем таблицу разделов с sda на sdb

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

Начинаем подготавливать второй (sdb) диск для работы в raid.
Если диск уже был в рейде надо убрать все упоминания об этом

mdadm --zero-superblock --force /dev/sdb1
mdadm --zero-superblock --force /dev/sdb2
mdadm --zero-superblock --force /dev/sdb3
mdadm --zero-superblock --force /dev/sdb5

Меняем тип разделов на диске sdb

fdisk /dev/sdb

Нажимаем t, указываем номер раздела, и пишем его тип (fd). Делаем это для разделов 1,2,3,5 (4 extended у него нет смысла менять)
t, 1, fd
t, 2, fd
t, 3, fd
t, 5, fd

затем сохраняем изменения - w

Выглядеть это должно вот так

[root@test ~]# fdisk /dev/sdb

Добро пожаловать в fdisk (util-linux 2.30.2).
Изменения останутся только в памяти до тех пор, пока вы не решите записать их.
Будьте внимательны, используя команду write.

Команда (m для справки): t
Номер раздела (1-5, default 5): 1
Шестнадцатеричный код (введите L для получения списка кодов): fd

Тип раздела 'Linux' изменен на 'Linux raid autodetect'.

Команда (m для справки): t
Номер раздела (1-5, default 5): 2
Шестнадцатеричный код (введите L для получения списка кодов): fd

Тип раздела 'Linux' изменен на 'Linux raid autodetect'.

и так далее

можно проверить

fdisk -l /dev/sdb

У всех разделов должен быть типа Linux raid autodetect

Собираем RAID1 из одного диска

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
mdadm --create /dev/md3 --level=1 --raid-devices=2 missing /dev/sdb5

Обратите на последнюю строку внимание! sdb5 ! Т.к. sdb4 - это extended раздел
Будут заданы вопросы, нажимайте - y.

проверяем что RAID создан

cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1]
      523712 blocks super 1.2 [2/1] [_U]

md3 : active raid1 sdb5[1]
      521920 blocks super 1.2 [2/1] [_U]

md2 : active raid1 sdb3[1]
      2095104 blocks super 1.2 [2/1] [_U]

md1 : active raid1 sdb2[1]
      4190208 blocks super 1.2 [2/1] [_U]

Создаем файловые системы на диске в рейде

Для наглядности я даю метки дискам

mkfs.ext4 -L "boot" /dev/md0
mkfs.ext4 -L "root" /dev/md1
mkfs.ext4 -L "var" /dev/md2
mkswap -L "swap" /dev/md3

Клонируем исходные данные на диск в RAIDе

переносим корневой раздел

mkdir /mnt/sysimage
mount /dev/md1 /mnt/sysimage
cd /
find . -depth -xdev | cpio -pmdu --sparse /mnt/sysimage
sync

переносим boot раздел

mount /dev/md0 /mnt/sysimage/boot
cd /boot
find . -depth -xdev | cpio -pmdu --sparse /mnt/sysimage/boot
sync

переносим var раздел

mount /dev/md2 /mnt/sysimage/var
cd /var
find . -depth -xdev | cpio -pmdu --sparse /mnt/sysimage/var
sync

подготавливаем систему к chroot

mount --bind /proc /mnt/sysimage/proc
mount --bind /dev /mnt/sysimage/dev
mount --bind /sys /mnt/sysimage/sys
mount --bind /run /mnt/sysimage/run
chroot /mnt/sysimage

Зайдя в chroot подготавливаем /etc/fstab. В chroot будем все время до особого предупреждения
Переносим вывод с UUID в /etc/fstab для дальнейшего его редактирования

blkid /dev/md* >> /etc/fstab

Открываем fstab и комментируем старые записи, и создаем новые на основе новых UUID. Либо просто в старые записи вставляем новые UUID

vim /etc/fstab

файл /etc/fstab будет выглядеть примерно вот так.
Строки начинающеся с UUID, это первоначальный вариант. Нужно из строк начинающихся с /dev/md.. сделать такой вид, как был изначально.

#
# /etc/fstab
# Created by anaconda on Fri Feb 12 12:59:58 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=94651d0e-77cc-4e87-91ca-1eee8f24d8c6 /                       ext4    defaults        1 1
UUID=939e9f0c-8736-45f0-83aa-6a9419b07252 /boot                   ext4    defaults        1 2
UUID=1581c069-c267-4dfc-9d39-852d116af2cb /var                    ext4    defaults        1 2
UUID=b09e5efc-2e5f-42f3-9f6d-d92e0590d1cc swap                    swap    defaults        0 0
/dev/md0: LABEL="boot" UUID="0215ee8e-18a8-4f29-acc6-ce4311bf4447" TYPE="ext4" 
/dev/md1: LABEL="root" UUID="a8f6914c-304d-4d5f-9258-c4e9b861406e" TYPE="ext4" 
/dev/md2: LABEL="var" UUID="a5c0a21b-1770-4289-a80d-8cca516113c2" TYPE="ext4" 
/dev/md3: LABEL="swap" UUID="91223d64-0384-47be-b3cc-2e62a35d000a" TYPE="swap" 

сохраняем настройки raid

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

создаем новый initramfs
  • для CentOS/RedOS
    cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
    dracut --mdadmconf --fstab --add="mdraid"  --add-drivers="raid1" --force /boot/initramfs-$(uname -r).img $(uname -r) -M
    
  • для Ubuntu
    update-initramfs -c -k $(uname -r)
    
  • для AltLinux
    mkinitrd --with-raid --with raid1 /boot/initrd-$(uname -r)-raid1.img $(uname -r)
    

меняем параметры grub

vim /etc/default/grub

обращаем внимание на 2 строки и правим их (или добавляем если их нет)
GRUB_CMDLINE_LINUX="rhgb rd.auto rd.auto=1"
GRUB_PRELOAD_MODULES="mdraid1x"

Делаем новый конфиг для grub
  • для CentOS/RedOS
    grub2-mkconfig -o /boot/grub2/grub.cfg
    
  • для Ubuntu и AltLinux
    grub-mkconfig -o /boot/grub/grub.cfg
    
создаем загрузочную запись для sdb (ошибки на физический диск null - норма)
  • для CentOS/RedOS
    grub2-install /dev/sdb
    sync
    
  • для Ubuntu и AltLinux
    grub-install /dev/sdb
    sync
    

Теперь выходим из chroot (exit или Ctrl-C) и уходим в перезагрузку.
(!!!) Теперь нужно загрузится именно с sdb устойства - т.е. со второго диска.

Проверяем, что загрузились именно с sdb

mount -t ext4

должен быть такой вывод

/dev/md1 on / type ext4 (rw,relatime)
/dev/md2 on /var type ext4 (rw,relatime)
/dev/md0 on /boot type ext4 (rw,relatime)

что подтверждает, что загрузились с рейда.

Теперь нужно привести диск sda в состояние готовое к включению в рейд

Необходимо поменять тип раздела на fd для разделов 1,2,3,5 (помним, что 4 пропускаем!)
fdisk /dev/sda
t,1, fd
t, 2, fd
t, 3, fd
t, 5, fd

затем сохраняем изменения - w
Добавляем диски в рейд

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

Теперь нужно дождаться синхронизации. Можно сделать это командой

watch -n1 "cat /proc/mdstat" 

когда все будет синхронизировано 100%, выходим из watch - Ctrl-C и продолжаем

Устанавливаем загрузчик
На sda, чтобы в случае проблем можно было грузится с любого диска

  • для CentOS/RedOS
    grub2-install /dev/sda
    sync
    
  • для Ubuntu и AltLinux
    grub-install /dev/sda
    sync
    

Ну и reboot, проверяем..

Добавить изображение из буфера обмена (Максимальный размер: 24,4 МБ)