Перенос рабочей системы с одного диска на RAID1

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

Дисклеймер: автор текста не несет никакой ответственности за выши данные на серверах. В конце статьи приведены ссылки на гайды, откуда кусочно был скомпонован алгоритм, опробованный в деле.

Процесс настройки будет производится с учетом используемого в текущий момент диска /dev/sda и свежего незадействованного диска /dev/sdb. Помимо всего прочего в системе используется LVM. Диск разбит на 2 части: первый раздел /boot небольшого размера, остальное отдано под LVM.

fdisk -l /dev/sda

Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ab6ac

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         125      999424   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2             125       19458   155288577    5  Extended
/dev/sda5             125       19458   155288576   8e  Linux LVM

Для начала установим mdadm.

apt-get install mdadm

После установки необходимо проиницализировать все необходимые модули. Это избавит нас от необходимости лишний раз перезагружать сервер:

modprobe linear
modprobe multipath
modprobe raid0
modprobe raid1
modprobe raid5
modprobe raid6
modprobe raid10

Теперь скопируем структуру разделов с действующего диска на новый

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

Делаем RAID1 для первого раздела на новом диске

mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

Повторяем для остальных

mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb5

Форматируем партиции в нужные файловые системы

mkfs.ext3 /dev/md0

Теперь перенесем содержимое первого раздела в зеркало, так как там только папка /boot, скопируем её

mount /dev/md0 /mnt/
rsync --progress -av /boot/ /mnt/
umount /boot
mount /dev/md0 /boot

После успешного монтирования нового раздела с загрузочными файлами добавляем старый к зеркалу и ждем завершения синхронизации.

mdadm -a /dev/md0 /dev/sda1

Так как существующий раздел /dev/sda5 расположен на LVM, создаем LVM физический том в рейде

pvcreate /dev/md1

Расширяем существующую группу томов с учетом md1

vgextend vg0 /dev/md1

Переносим туда наш текущий раздел с данными

pvmove /dev/sda5 /dev/md1

Выбрасываем из группы томов одиночный раздел

vgreduce vg0 /dev/sda5

Добавляем освободившийся раздел к зеркалу, дожидаемся сборки массива

mdadm -a /dev/md1 /dev/sda5
cat /proc/mdstat

После всех этих процедур, если система не предложила сделать это ранее, вносим изменения в файлы конфигурации mdadm, добавляя туда данные о созданных нами массивах

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

Теперь необходимо поправить /etc/fstab на загрузку с разделов, расположенных в зеркале. Если в файле содержатся UUID вместо дерева устройств, cвежие данные берем из вывода blkid.
Обновляем загрузчик и ставим его на все используемые у нас диски.

update-grub
grub-install /dev/sdb
grub-install /dev/sda

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

Ссылки: