Жил-был LAMP-сервер на Ubuntu 12.04, который работал на одном диске. Соответственно, возникла задача обеспечить перенос сервера на более отказоустойчивую конфигурацию – RAID1. Товарищи, в ведении которых был данный сервер установили второй диск, а дальнейшее было возложено на меня, причём доступ к серверу был только по ssh, что осложняло задачу.
После поисков была найдено руководство и начались тренировки на виртуальной машине. Когда я добился на ней нужного результата, то с некоторым волнением, но всё же успешно осуществил перенос вышеупомянутого сервера на RAID1 и вчерне набросал порядок необходимых действий. Статью, в которой более подробно описан процесс переноса, я решил разместить на «Хабре».
Разбивка диска была такова:
Поскольку второй диск был новым, то никаких операций по удалению предыдущей разметки не потребовалось.
Первым делом были внесены правки в
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), после чего делаем разбивку второго диска такой же, как и у первого (все операции выполняются с правами суперпользователя):
Затем начинаем шаг за шагом собирать наш RAID:
Создаём раздел под
Правим
Активируем
Поскольку на первом диске сейчас работает наш сервер, то RAID создаём, используя пока лишь только второй диск:
Обновляем конфигурацию
Обновляем
Далее начинается наиболее длительный процесс – синхронизация данных. Поскольку наш сервер выполняет какие-то задачи, то может получиться так, что после завершения синхронизации часть информации на разделах массива будет отличаться от данных на соответствующих разделах рабочего диска. Тут есть несколько вариантов действий: можно выбрать время наименьшей нагрузки, можно остановить часть сервисов на время синхронизации, а можно и пренебречь расхождениями. В общем, монтируем и синхронизируем:
Чтобы синхронизация не оборвалась из-за неожиданного прерывания ssh-подключения, не помешает использование терминального мультиплексора.
Дождавшись окончания синхронизации, монтируем системные каталоги к новому корню:
Переходим в новую систему
Обновляем загрузочную конфигурацию, чтобы подгрузились необходимые для RAID модули (
Возвращаемся в исходную систему и, если есть такая необходимость, повторно синхронизируем разделы:
Так как у нас нет физического доступа ни к консоли, ни к серверу и мы не можем выбрать диск, с которого будет грузиться RAID, то применяем такой трюк: на диск, с которого стартует система и который находится не в RAID, переносим подготовленную конфигурацию загрузчика, «знающую» о RAID. Копируем grub.cfg c диска, находящегося в RAID на наш текущий загрузочный диск. Это позволит системе стартовать с /dev/sda, но при этом смонтировать массивы и далее продолжить загрузку с раздела, уже находящегося в RAID. Сначала сохраняем старый файл, который может понадобиться при восстановлении системы в случае невозможности загрузиться с RAID, а затем копируем файл «боевой» конфигурации:
Дополнительно можно сравнить эти файлы и убедиться, что в новом файле конфигурации загрузчика раздел root указан как находящийся на RAID.
Теперь переходим к самому важному этапу проделанной работы и перезагружаемся. Можно запустить в консоли
На закуску остаётся лёгкая и приятная работа – добавить в массив два раздела первого диска, предварительно установив им с помощью
а затем периодически поглядывать, как идёт синхронизация зеркал:
На этом позвольте закончить, спасибо за внимание!
После поисков была найдено руководство и начались тренировки на виртуальной машине. Когда я добился на ней нужного результата, то с некоторым волнением, но всё же успешно осуществил перенос вышеупомянутого сервера на 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
На этом позвольте закончить, спасибо за внимание!