Переезд машин на 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

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