Перейти к содержимому

17.11.2010

2

Клонирование сервера CentOS с помощью dump/restore

Всем привет!
В данной заметке я расскажу о своем опыте клонирования сервера под управлением CentOS. Сама процедура в общем-то обычная и логичная, но есть некоторые моменты, про которые необходимо знать и помнить при переносе системы с одного железа на другое.

Постановка задачи

Имеется физический эталонный сервер с CentOS 5.5 на борту (впрочем версия ОС не имеет особо значения), на котором установлено и настроено программное обеспечение.
Так же имеется некоторое количество других серверов, разных конфигураций, на которые требуется поставить все то же самое, что стоит на эталонном сервере.
Отличие серверов только в настройках сети и конфигурации некоторого ПО.

Немного теории

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

  1. dump/restore. Это 2 утилитки которые позволяют делать бекапы разделов, которые впоследствии можно восстановить. Так же имеется возможность делать инкрементальный бэкап с возможностью компрессии. Не смотря на то, что dump работает с разделами, в дампы попадают только данные. Неоднократно использовал эти утилиты в составе FreeBSD, они себя прекрасно зарекомендовали, наверное поэтому я и выбрал этот вариант.
  2. rsync. Это, по сути, синхронизация файлов по сети. Быстро, удобно, хорошо. Но я сам ни разу не использовал.
  3. dd, старый добрый dd. С dd основная тонкость в том, что эта утилита работает с устройствами на уровне блоков и копирует их байт-в-байт. Отсюда вытекает пара моментов: первое — это то, что если у вас раздел 50 гиг и из них занято всего 5, то dd все равно скопирует все 50; второе — как следствие из первого, если у вас исходный и целевой разделы разных разделов, точнее если целевой меньше исходного, то возможны проблемы.
  4. CloneZilla. В общем-то нормальный вариант, это live-cd, к которому прикручен какой-то GUI, в котором можно с помощью вопросов и ответов, а-ля визард, выбрать что склонировать и куда. Но так как это live-cd, то требуется перегружать сервер, и следовательно он какое-то время будет не работоспособен.
  5. Kickstart + Anaconda, так же как и DRBL — это установка по сети в том или ином виде. Для меня не подходит потому что серверы физически не находятся в одной сети.
  6. Acronis True Image платный, да и вообще это больше к виндам, и уж точно не Unix-way.

Что хочется добавить еще, какой бы способ вы не выбрали, это не спасет вас от последующей правки fstab, скриптов инициализации сети, hosts и т.д.

Пара слов о эталоне

Вот какие разделы и диски имеются на эталонном сервере:
2 раздела: /boot на /dev/sda1 и / на логическом разделе LVM LogVolRoot

В системе один физический раздел

И одна Volume Group которая состоит из этого одного физического раздела /dev/sda2

В этой группе есть 2 логических раздела: LogVolRoot — смонтированный как / и LogVolSwap — раздел для свапа

Ну и напоследок fstab:

От слов к делу

Вся процедура выглядет примерно так:

  • Делаем дампы разделов на эталонном сервере либо на внешний диск, либо на какой-то NAS.
  • Грузимся с live-cd на целевом сервере.
  • Подготавливаем диски целевого сервера: разбиваем на разделы, форматируем.
  • Подцепляем внешний диск/nas где лежат наши бэкапы.
  • Накатываем дампы.
  • Правим системные конфиги
  • Пересобираем initrd
  • Ставим grub в MBR.
  • Ребутимся и надеемся увидеть счастье.

Теперь по шагам.
1. Делаем дампы разделов. Поскольку этот целевой сервер я мог включить в общую сетку, то дампы я залил на самбовский сервер.

2. Грузимся с live-cd. Я использовал тот же CentOS live-cd.

3. Далее нам нужно разбить диски в сервере на разделы и настроить LVM. Сделать это можно с помощью утилит fdisk/cfdisk/lvm. Хотя тем, кому лень возиться с этими утилитами из консоли, могу посоветовать самый наверное простой способ — это воспользоваться графическим инсталлером с установочного диска CentOS. Там после пары вопросов про язык и раскладку наступает шаг разбиения диска, все красиво, быстро и удобно. Собственно я так и сделал :-[ Разбил диск на 2 раздела: 100 mb под /boot и остальное под управлением LVM с двумя разделами для свапа и /. В новом сервере диск в системе видится как /dev/cciss/c0d0 с двумя разделами p1 и p2.

4. Поскольку дампы я залил на файловый сервер, то монтируем его:

5. Теперь надо накатить дампы на новенькие разделы. Но тут есть подстава в виде того, что в лив-сиди нет этих утилит. Надо их поставить. Берем с установочного диска CentOS 2 rpm’ки: rmt-0.4b41-4.el5.x86_64.rpm & dump-0.4b41-4.el5.x86_64.rpm. rmt нужна как зависимость для dump. Ставим их:

Далее монтируем новые разделы, если они еще не смонтированы

Затем переходим в mount-point каждого раздела и накатываем dump:

6. Теперь нам надо поправить некоторые системные конфиги.
Поскольку диск мы разбили точно так же как и эталон, и LVM’овские тома и группы назвали так же, то fstab особо править не надо. Едиственное, что поскольку /boot у нас монтируется, используя метку а не путь к устройству, то надо убедиться, что у нашего boot’ового раздела такая же метка. Проверить и поставить метку можно с помощью e2label. Я, когда форматировал разделы, забыл указать метку и у меня ее не было, так что пришлось выставить:

Теперь надо поправить grub.

надо поменять на

7. Теперь нам надо пересобрать RAM-диск, инициализируемый загрузчиком, то есть initrd. Приведу кусок мана:
Специальный файл /dev/initrd — это блочное устройство только для чтения. Устройство /dev/initrd — это диск, расположенный в оперативной памяти, который инициализируется (т.е. загружается) загрузчиком до запуска ядра. Затем ядро может использовать содержимое блочного устройства /dev/initrd для двухфазовой загрузки системы.
Во время первой фазы ядро запускает и монтирует начальную корневую файловую систему из содержимого /dev/initrd (например, RAM-диска, инициализируемого загрузчиком). Во время второй фазы из начального содержимого корневого устройства загружаются дополнительные драйвера или другие модули. После загрузки дополнительных модулей с другого устройства монтируется новая корневая файловая система (т.е., нормальная корневая файловая система).

Для этого нам надо, во-первых, перемонтировать наш boot в boot, который находится в корне нашего подмонтированного рутового раздела, а не просто куда-нибудь. Это важно. Затем также смонтировать системные fs в дерево нашего образа, затем чрутнуться в наш образ и переинициализировать initrd:

Если вы не подмонтируете специальные файловые системы /proc /sys /dev — то mkinitrd не сможет увидеть ваше железо и соответственно не добавит нужные драйвера в образ. Вот что может быть в этом случае:

Как показала практика, даже ручное указание, какие драйверы нужно добавить в образ, как показано ниже, не помогает.

Даже в этом случае при попытке загрузить ОС появляется kernel panic

8. Теперь дело за малым, это проинсталлить grub в MBR, чтобы он указывал на правильный раздел /boot. Поскольку диск у нас в системе один, и бутовый раздел на нем первый, то делаем следующее:

Если grub будет не будет прописан в MBR, то сервер просто скажет «Non-System Disk», а если grub будет указывать на неверный раздел, то не сможет загрузиться ядро.

9. Ну и самое интересное — отправляем сервер на ребут и верим в счастье 🙂

Как же этот раздел обычно называется… АА! Список литературы!

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

В общем и целом, как оказалось, ничего кроме манов не требуется.

P.S. Если есть какие-то неточности/замечания или может быть даже пожелания — Велкам!

  • Victor

    mount.cifs //storage/Backups /mnt/storage -o user=kostik ip=192.168.24.111

    с оригинального установочного Centos в режиме linux rescue работать не будет

  • 3.14-zDEC

    а вот так не проще ? так freepbx перетаcкивал в виртуалку
    сначала ставим голую систему — разделы по вкусу и потом с оригинала
    cat clone_sysmem.sh
    cd /;\
    tar cvpzf — \
    —exclude=/dev \
    —exclude=/boot \
    —exclude=/etc/fstab \
    —exclude=/etc/mtab \
    —exclude=/etc/blkid \
    —exclude=/etc/modprobe.conf \
    —exclude=/proc \
    —exclude=/mnt \
    —exclude=/sys \
    —exclude=/lost+found \
    —exclude=/backup.tgz \
    —exclude=/var/spool/asterisk/backup/Default_backup/*.tgz \
    —exclude=/var/spool/asterisk/monitor/2013 \
    —exclude=/etc/sysconfig/network-scripts/* \
    —ignore-failed-read \
    / | ssh -T root@XXX.XXX.XXX.XXX ‘tar -C / -xvpz’