Переезд машин на Linux

Возникла задача перенести несколько серверов с железа в виртуальные машины. В моём случае это CentOS 5 и 6 на ESXi. Если не используется multi-pathing и прочие странные штуки, данная задача легко выполняется с помощью vmware Converter, но в данном случае он оказался не в силах помочь.

В итоге появилась довольно-таки простая схема, как это можно реализовать для Linux.

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

  • диск 1 только под разделы /boot (меньше проблем с загрузкой с простого диска) и / (linux не способен проводить каких-либо действий с диском, где у него лежит корень);
  • диск 2 под остальные разделы поверх LVM (lvm позволяет изменять размеры разделов без перезгрузки, но данные о изменившемся диске можно обновить только если там нет корневого раздела).

Предположим следующую схему разбиения (с аналогичным раскладом на исходном сервере):

  • /boot - 512Mb (под ядра много не надо, но нынче они уже не такие маленькие как раньше);
  • / - остальное место на первом диске;
  • /var/log - 1Gb (логи неплохо было бы держать отдельно, чтоб в случае переполнения не пострадали рабочие данные на сервере);
  • /var - остальное место на втором диске (этот раздел можно было и не выделять или отдать под /home если это рабочая станция, но для демонстрации полезной команды разбиения lvm я его оставил).

Целевая система запускается с загрузочного диска (например, SystemResqueCD).

Разбивается диск (для старых систем лучше использовать таблицу разделов msdos) и примонтировать их:

# parted -a optimal /dev/sda
mklabel msdos
unit mib
mkpart p 1 513
mkpart p 513 -1
set 1 boot on
quit
# parted -a optimal /dev/sdb
mklabel msdos
unit mib
mkpart p 1 -1
quit
# pvcreate /dev/sdb1
# vgcreate system /dev/sdb1
# lvcreate -L 1G -n log system
# lvcreate -l 100%FREE -n var system
# mkfs.ext2 /dev/sda1
# mkfs.ext4 /dev/sda2
# mkfs.ext4 /dev/system/var
# mkfs.ext4 /dev/system/log
# mount /dev/sda2 /mnt/gentoo
# cd /mnt/gentoo
# mkdir boot
# mkdir var
# mount /dev/sda1 boot/
# mount /dev/system/var var/
# mkdir var/log
# mount /dev/system/log var/log/

Для того, чтобы к этой системе можно было подключиться, необходимо настроить сеть (если нет DHCP) и установить пароль на пользователя root, который и загружается по умолчанию в данном live-cd:

# net-setup
# passwd

На исходной системе необходимо поставить rsync. Для CentOS:

# yum install rsync

Исходная система загружается в single-режиме (система загрузится в минимальном виде):

  • при перезагрузке в grub вызвать списко ядер;
  • на необходимом ядре нажать «E»
  • в новом меню выбрать пункт с ядром (обычно второй)
  • нажать «E»
  • дописать в конце строки «single»
  • нажать «Enter»
  • в новом окне нажать «B»

Далее на исходной системе запускается сеть. Для CentOS 5 и 6:

# /etc/init.d/network start

Перенос данных проходит довольно просто, по очереди с каждым разделом (виртуальные ФС надо исключить) силами rsync с кчлюмами:

  • a - архивирование, включает:
    • r - рекурсивно захадить в директории;
    • l - копировать симлинки как симлинки;
    • p - сохранять права доступа;
    • t - сохранять дату изменения;
    • g - сохранять группу;
    • o - сохранять пользователя;
    • D - сохранять файлы-устройства;
  • v - показывать текуций капируемый файл ;
  • x - ограничиться только одной файловой системой;
  • P:
    • --partial - сохранять недокачанный файл;
    • --progress - показывать прогресс;
  • A - копировать ACL;
  • X - копировать расширенные атрибуты;
  • --numeric-ids - передавать значения пользователей и групп цифровыми значениями;
  • z - сжимать при копировании;
  • --update - копировать только более новые файлы.

В качестве dst_ip поставить IP сервера назначения, так же в пути назначения не ставить слэш после директории назначения, иначе путь должен быть на уровне выше (rsync -avPAXx /root/1 /root/2/ скопирует данные в директорию /root/2/1/):

# rsync -avPAXx / root@dst_ip:/mnt/gentoo
# rsync -avPAXx /boot/ root@dst_ip:/mnt/gentoo/boot
# rsync -avPAXx /var/ root@dst_ip:/mnt/gentoo/var
# rsync -avPAXx /var/log/ root@dst_ip:/mnt/gentoo/var/log

Для установки загрузчика необходимо привести к актуальному виду файлы /mnt/gentoo/etc/fstab и /mnt/gentoo/etc/mtab:

  • / - /dev/sda2;
  • /boot - /dev/sda1;
  • /var - /dev/system/var;
  • /var/log - /dev/system/log.

Восстанавливаем загрузчик:

# grub-install --root-directory=/mnt/gentoo /dev/sda
# grub --no-floppy
root (hd0,0)
setup (hd0)
quit

Для завершения необходимо установить драйвера на новом месте. Для этого надо зайти в свежую систему с помощью chroot:

# mount -t proc proc proc/
# mount --rbind /sys sys/
# mount --make-rslave sys/
# mount --rbind /dev dev/
# mount --make-rslave dev/
# chroot /mnt/gentoo /bin/bash
# source /etc/profile

Далее ставим репозиторий vmware и установить драйвера:

# vi /etc/yum.repos.d/vmware.conf
[vmware]
name=VMware Tools 6 x64
baseurl=http://packages.vmware.com/tools/esx/latest/rhel6/x86_64
enabled=1
gpgcheck=1

# yum install vmware-tools-esx-kmods vmware-tools-esx-nox kmod-vmware-tools-pvscsi kmod-vmware-tools-vmmemctl

Далее выходим из chroot и перезагружаем сервер:

# exit
# shutdown -r now

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