Перенос системы на программное зеркало 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
- для CentOS/RedOS
диск 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"
- для CentOS/RedOS
grub2-mkconfig -o /boot/grub2/grub.cfg
- для Ubuntu и AltLinux
grub-mkconfig -o /boot/grub/grub.cfg
- для 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/sdat,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, проверяем..