Как стать автором
Обновить

Перенос работающего сервера на RAID

Время на прочтение4 мин
Количество просмотров14K
Жил-был LAMP-сервер на Ubuntu 12.04, который работал на одном диске. Соответственно, возникла задача обеспечить перенос сервера на более отказоустойчивую конфигурацию – RAID1. Товарищи, в ведении которых был данный сервер установили второй диск, а дальнейшее было возложено на меня, причём доступ к серверу был только по ssh, что осложняло задачу.

После поисков была найдено руководство и начались тренировки на виртуальной машине. Когда я добился на ней нужного результата, то с некоторым волнением, но всё же успешно осуществил перенос вышеупомянутого сервера на RAID1 и вчерне набросал порядок необходимых действий. Статью, в которой более подробно описан процесс переноса, я решил разместить на «Хабре».

Разбивка диска была такова:

/dev/sda1            2048     1574911      786432  swap
/dev/sda2   *     1574912    16254975     7340032  / 
/dev/sda3        16254976    31457279     7601152  /home

Поскольку второй диск был новым, то никаких операций по удалению предыдущей разметки не потребовалось.

Первым делом были внесены правки в /etc/default/grub:
GRUB_TIMEOUT=5 (делаем таймаут покороче);
GRUB_RECORDFAIL_TIMEOUT=10 (добавляем, чтобы система могла загрузиться и в случае ошибки, не требуя интерактивного вмешательства; таймаут по вкусу);
GRUB_CMDLINE_LINUX_DEFAULT=«bootdegraded» (обязательно добавляем «bootdegraded», чтобы система могла загрузиться с неполноценного массива);
#GRUB_HIDDEN_TIMEOUT_QUIET=true (необходимо закомментировать, чтобы меню GRUB всегда отображалось).

Временно отключаем swap, разделу /dev/sda1 с помощью fdisk устанавливаем тип fd (Linux raid autodetect), после чего делаем разбивку второго диска такой же, как и у первого (все операции выполняются с правами суперпользователя):

sfdisk –d /dev/sda | sfdisk –f /dev/sdb

Затем начинаем шаг за шагом собирать наш RAID:

mdadm --create --verbose /dev/md0 --raid-devices=2 --level=1 --metadata=1.2 /dev/sda1 /dev/sdb1

Создаём раздел под swap:
mkswap /dev/md0

Правим /etc/fstab, заменяя разделы первого диска разделами RAID и меняя цифры, стоящие в шестом столбце (необходимость проверки fsck), на нули:

/dev/sda1 → /dev/md0 # SWAP
/dev/sda2 → /dev/md1 # /
/dev/sda3 → /dev/md2 # /home

Активируем swap:
swapon -a

Поскольку на первом диске сейчас работает наш сервер, то RAID создаём, используя пока лишь только второй диск:

mdadm --create --verbose /dev/md1 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb2 
mkfs.ext4 /dev/md1
mdadm --create --verbose /dev/md2 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb3 
mkfs.ext4 /dev/md2

Обновляем конфигурацию mdadm.conf:

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

Обновляем initramfs, чтобы он сохранил информацию о нашем RAID:

update-initramfs -u

Далее начинается наиболее длительный процесс – синхронизация данных. Поскольку наш сервер выполняет какие-то задачи, то может получиться так, что после завершения синхронизации часть информации на разделах массива будет отличаться от данных на соответствующих разделах рабочего диска. Тут есть несколько вариантов действий: можно выбрать время наименьшей нагрузки, можно остановить часть сервисов на время синхронизации, а можно и пренебречь расхождениями. В общем, монтируем и синхронизируем:

mount /dev/md1 /mnt/ && [tmux|screen] rsync -axu / /mnt
mount /dev/md2 /mnt/home && [tmux|screen] rsync -axu /home/ /mnt/home

Чтобы синхронизация не оборвалась из-за неожиданного прерывания ssh-подключения, не помешает использование терминального мультиплексора.

Дождавшись окончания синхронизации, монтируем системные каталоги к новому корню:

mount --bind /proc /mnt/proc
mount --bind /dev /mnt/dev
mount --bind /var /mnt/var
mount --bind /run /mnt/run
mount --bind /sys /mnt/sys

Переходим в новую систему
chroot /mnt
и устанавливаем загрузчик на оба диска

grub-install -–recheck /dev/sda
grub-install --recheck /dev/sdb 

Обновляем загрузочную конфигурацию, чтобы подгрузились необходимые для RAID модули (mdraid1x):

update-grub

Возвращаемся в исходную систему и, если есть такая необходимость, повторно синхронизируем разделы:

[tmux|screen] rsync -axu / /mnt
[tmux|screen] rsync -axu /home/ /mnt/home

Так как у нас нет физического доступа ни к консоли, ни к серверу и мы не можем выбрать диск, с которого будет грузиться RAID, то применяем такой трюк: на диск, с которого стартует система и который находится не в RAID, переносим подготовленную конфигурацию загрузчика, «знающую» о RAID. Копируем grub.cfg c диска, находящегося в RAID на наш текущий загрузочный диск. Это позволит системе стартовать с /dev/sda, но при этом смонтировать массивы и далее продолжить загрузку с раздела, уже находящегося в RAID. Сначала сохраняем старый файл, который может понадобиться при восстановлении системы в случае невозможности загрузиться с RAID, а затем копируем файл «боевой» конфигурации:

cp -p /boot/grub/grub.cfg /boot/grub/grub.old 
cp -p /mnt/boot/grub/grub.cfg /boot/grub/grub.cfg

Дополнительно можно сравнить эти файлы и убедиться, что в новом файле конфигурации загрузчика раздел root указан как находящийся на RAID.

Теперь переходим к самому важному этапу проделанной работы и перезагружаемся. Можно запустить в консоли ping до сервера, чтобы стало ясно, когда сервер вновь станет доступен. Логинимся и смотрим, что у нас всё получилось так, как мы хотели: lsblk показывает, что директории / и /home находятся на разделах RAID.

На закуску остаётся лёгкая и приятная работа – добавить в массив два раздела первого диска, предварительно установив им с помощью fdisk тип fd:

mdadm /dev/md1 --add /dev/sda2
mdadm /dev/md2 --add /dev/sda3 

а затем периодически поглядывать, как идёт синхронизация зеркал:

watch -n 5 cat /proc/mdstat

На этом позвольте закончить, спасибо за внимание!
Теги:
Хабы:
Всего голосов 6: ↑6 и ↓0+6
Комментарии28

Публикации

Работа

Ближайшие события