Перенос CentOS 6.8 на программный RAID1 mdadm

В данной статье пойдет речь как быстро перенести операционную систему CentOS 6 которая установлена на один жесткий диск на программный RAID на двух дисках (mdraid)

Руководств по переводу можно найти в сети много разных, однако, не все они «запускаются» с первого раза или являются неправильными (ситуация «делал все как написано и оно не работает»)

Также при использовании grub1 существует недостаток в связи с тем, что не всегда удается загрузиться в случае выхода из строя одного из дисков и необходимо в grub указывать root устройство правкой в загрузчке (root (hd0,0)) или же переставлять диск местами.
Это действительно издержки данной системы http://www.linux.org.ru/forum/admin/9417685?cid=9421016

Также, как показывает огромная практика различные вещи как LVM, разбивка на несколько разделов просто напросто не нужны, поэтому просто разбиваем на один раздел, swap же также сделаем в файле (тем самым будет преимущество в виде возможности менять его размер при необходимости)

И так, как же перенести CentOS 6 на программный RAID

Для этого подключаем второй чистый жесткий диск такого же объема (в системе он будет называться sdb) и разметим его используя fdisk

Всё по-умолчанию, единственное, что сделаем, так это отступим на один цилиндр сначала (разобьем со второго цилиндра) на случай если будет необходимость в будущем мигрировать на загрузчик grub2 так как он просто «не войдет» в один цилиндр

[root@centos6 ~]# fdisk /dev/sdb
Устройство не содержит ни верной таблицы разделов DOS, ни метки диска Sun, SGI или OSF
Building a new DOS disklabel with disk identifier 0x390ed2ea.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Предупреждение: неверный флаг 0x0000 таблицы разделов 4 будет исправлен записью

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

Команда (m для справки): n
Действие команды
e расширенный
p основной раздел (1-4)
p
Номер раздела (1-4): 1
Первый цилиндр (1-1044, default 1): 2
Last цилиндр, +цилиндры or +size{K,M,G} (2-1044, default 1044):
Using default value 1044

Команда (m для справки): t
Выбранный раздел 1
Шестнадцатеричный код (введите L для получения списка кодов): fd
Системный тип раздела 1 изменен на fd (Автоопределение Linux raid)

Команда (m для справки): a
Номер раздела (1-4): 1

Команда (m для справки): w
Таблица разделов была изменена!

Вызывается ioctl() для перечитывания таблицы разделов.
Синхронизируются диски.


Теперь создаем raid 1 на этом разделе

[root@centos6 ~]# mdadm --create /dev/md0 --metadata=0.90 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm: array /dev/md0 started.


Обязательно использовать формат метаданных 0.90, так как с более новыми grub 0.97 не работает на /boot разделе

Формируем конфигурационной файл mdadm /etc/mdadm.conf
[root@centos6 ~]# mdadm --detail --scan > /etc/mdadm.conf

Внесите правку в /boot/grub/device.map — добавьте туда наш sdb как hd1
[root@centos6 ~]# vi /boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdb


Форматируем устройство md0 в ext4

[root@centos6 ~]# mkfs.ext4 /dev/md0

Монтируем новосозданный /dev/md0 в /mnt

[root@centos6 ~]# mount /dev/md0 /mnt

Копируем все данные на него (предварительно следует остановить на машине все сервисы которые могут писать файлы на диск, такие как mysql, веб-сервер)

[root@centos6 ~]# yum -y install rsync

[root@centos6 ~]# rsync -avP --exclude='/dev/*' --exclude='/proc/*' --exclude='/sys/*' --exclude='/mnt/' / /mnt


Правим /mnt/etc/fstab делая там только монтирование md0, монтировать следует по UUID- смотрим его командой blkid

[root@centos6 ~]# blkid | grep md0

[root@centos6 ~]# cp /mnt/etc/fstab /etc/fstab_bak

[root@centos6 ~]# vi /mnt/etc/fstab
UUID=d00711db-48b2-4735-9cdb-7080742797c4 / ext4 defaults 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0


Вносим правки в /mnt/boot/grub/grub.conf в строку kernel выставляя правильное устройство (root=) и убирая rd_NO_DM rd_NO_MD и аналогичные параметры, я рекомендую убрать все лишние опции чтобы видеть вывод при загрузке

root у нас на md0, смотрим его uuid командой blkid | grep md0
Желательно указывать также rd_MD_UUID — его можно посмотреть в /etc/mdadm.conf
Путь к kernel и initrd теперь начинается с /boot/ — также не забываем это исправить
Устройство root следует указать (hd1,0)

[root@centos6 ~]# cp /mnt/boot/grub/grub.conf /mnt/boot/grub/grub.conf_bak

[root@centos6 ~]# vi /mnt/boot/grub/grub.conf
default=0
timeout=5
hiddenmenu
title CentOS 6 (2.6.32-642.el6.x86_64)
root (hd1,0)
kernel /boot/vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=d00711db-48b2-4735-9cdb-7080742797c4 rd_MD_UUID=b9baa472:faeb3a7c:6e31c5b6:310ac827
initrd /boot/initramfs-2.6.32-642.el6.x86_64.img


Пересобирите initramfs на новом диске отключив в нем поддержку LVM (у нас система ставилась по-умолчанию с lvm и не нужно чтобы он монтировался)

[root@centos6 ~]# dracut --nolvmconf --mdadmconf -f /mnt/boot/initramfs-`uname -r`.img `uname -r`

Пропишите grub bootcode на второй диск

grub> root (hd1,0)
root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 27 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd1) (hd1)1+27 p (hd1,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeeded
Done.
grub> quit


Если в системе включен selinux, то необходимо создать файл /.autorelabel в новой системе

[root@centos6 /]# touch /mnt/.autorelabel

Иначе не сможете войти в систему с ошибкой Unable to get valid context for root

Теперь необходимо перезагрузить сервер и выбрать в BIOS загрузку со второго жесткого диска
* после выполнения relabel система автоматически перезагрузится, следите за загрузкой

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

[root@centos6 ~]# mount
/dev/md0 on / type ext4 (rw)

[root@centos6 ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb1[1]
8377856 blocks super 1.0 [2/1] [_U]

[root@centos6 ~]# cat /proc/mounts


Также не должно показывать никаких подмонтированых lvm разделов

Если вы видете примонтированый lvm — значит вы загрузились с первого, а не второго диска, перезагрузите сервер и убедитесь что именно нужный диск выбран

Просто отлично, система загружена и работает с нужного нам устройства

Теперь осталось немного — сделать копию разделов с диска sdb на диск sda

В моем случае на сервере был LVM и вначале необходимо удалить устройства

[root@centos6 ~]# lvremove /dev/mapper/vg_centos6-lv_root
Do you really want to remove active logical volume lv_root? [y/n]: y
Logical volume "lv_root" successfully removed
[root@centos6 ~]# lvremove /dev/mapper/vg_centos6-lv_swap
Do you really want to remove active logical volume lv_swap? [y/n]: y
Logical volume "lv_swap" successfully removed


Затем обнулить таблицу разделов
[root@centos6 ~]# dd if=/dev/zero of=/dev/sda bs=512 count=1

И сделать копию таблицы разделов

[root@centos6 ~]# sfdisk -d /dev/sdb | sfdisk --force /dev/sda

Команда должна выполниться без ошибок, именно поэтому важно предварительно почистить диск

Добавляем диск в зеркало

[root@centos6 ~]# mdadm --add /dev/md0 /dev/sda1
mdadm: added /dev/sda1


Убеждаемся что зеркало собирается
[root@centos6 ~]# cat /proc/mdstat

Ставим загрузчик на sda (тут может потребоваться немного подождать пока синхронизируется начальная часть зеркала)

[root@centos6 ~]# grub
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
...
...
grub> quit
quit


Также создаем swap в файле, скажем 2Gb (это уже опционально)

[root@centos6 ~]# dd if=/dev/zero of=/swapfile bs=2048 count=1048576
[root@centos6 ~]# mkswap /swapfile
[root@centos6 ~]# swapon /swapfile


Подключаем его в /etc/fstab

[root@centos6 ~]# echo '/swapfile none swap sw 0 0' >> /etc/fstab

Можно перезагрузиться чтобы убедиться что все работает

После чего меняем в /boot/grub/grub.conf строку
root (hd1,0)
на
root (hd0,0)

Чтобы если в сервере останется один диск система могла загрузиться

Работы на этом завершены

Комментариев нет:

Отправить комментарий