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

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

В любом случае при переходе с одной системы в другую нужно учесть множество различных нюансов. Полностью восстановить функции и конфигурации может быть трудно, если вы не используете средства для управления конфигурацией (Chef, Puppet или Ansible). Кроме того, нужно не только переместить данные, но и настроить сервисы для работы на новой машине.

Данное руководство поможет подготовить исходную и целевую систему к перемещению данных. Вы научитесь настраивать взаимодействие машин с помощью SSH-ключей и определять, какие сервисы нужно переместить. Здесь описана только подготовка к миграции. О самой миграции данных речь пойдет в следующем руководстве данной серии.

 Резервное копирование

Прежде чем совершить какое-либо потенциально разрушительное для системы действие, нужно создать свежую резервную копию, чтобы в случае ошибки или сбоя иметь возможность восстановить данные.

Существует несколько способов создать резервную копию машины. Ваш выбор должен зависеть от требований системы и возможностей машины.

Если у вас есть доступ к физическому оборудованию и место для резервного копирования (дисковод, USB и т. п.), вы можете клонировать диск с помощью любого средства для резервного копирования образов. Функциональный эквивалент при работе с машинами VPS – это создать снапшот или образ из панели управления.

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

После создания резервной копии системы войдите как root, чтобы продолжить.

Сбор информации об исходной системе

Прежде чем начать миграцию сервера, нужно подготовить целевую систему. Она должна максимально точно повторять исходную систему.

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

Большую часть базовой информации, которая поможет вам создать систему для новой машины, можно получить с помощью простой команды uname:

uname -r
3.2.0-24-virtual

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

uname -m
i686

Это архитектура системы. i686 значит, что сервер использует 32-битную архитектуру. Если команда вернула x86_64, значит, архитектура 64-битная.

Также желательно восстановить на целевой машине дистрибутив и версию исходной системы. Чтобы узнать эти данные, введите:

cat /etc/issue
Ubuntu 12.04.2 LTS \n \l

Как видите, новый сервер должен работать на 32-битной системе Ubuntu 12.04. Если это возможно, постарайтесь также использовать одну и ту же версию ядра.

Взаимодействие между исходным и целевым серверами по SSH-ключам

Чтобы серверы могли без проблем передавать файлы, настройте SSH-ключи. Подробные инструкции вы найдете в мануале Как настроить SSH-ключи.

Создайте ключ на целевом сервере, чтобы затем добавить его в файл authorized_keys на исходном сервере.

Перейдите на целевой сервер и убедитесь, что у пользователя root нет SSH-ключей (для этого войдите как root).

ls ~/.ssh
authorized_keys

Если в выводе вы видите файлы id_rsa.pub и id_rsa, значит, на сервере уже есть SSH-ключи и вам можно просто переместить их.

Если в выводе нет таких файлов, создайте новые ключи:

ssh-keygen -t rsa

Чтобы принять параметры по умолчанию, нажмите Enter.

Переместите ключ на исходный сервер:

cat ~/.ssh/id_rsa.pub | ssh other_server_ip "cat >> ~/.ssh/authorized_keys"

Теперь серверы могут взаимодействовать по SSH. Чтобы подключиться с целевого сервера к исходному, введите:

ssh other_server_ip

При этом пароль не будет запрашиваться.

Создание списка требований

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

В ходе работы ваши программные требования могут измениться. Иногда старые серверы не поддерживают некоторые необходимые сервисы и программное обеспечение, и они были заменены.

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

Способ обнаружения сервисов и уровней выполнения во многом зависит от типа системы init, которую использует ваш сервер. Система init отвечает за запуск и остановку сервисов либо по команде пользователя, либо автоматически.

Обнаружение сервисов и уровней выполнения на серверах System V

System V – одна из самых старых систем инициализации.

Некоторые системы до сих пор реализуют возможности System V. Чтобы узнать, использует ли System V ваш сервер, введите:

which service
/usr/sbin/service

Если команда вернула путь, ваша система реализует System V.

Чтобы узнать, какие сервисы запущены, введите:

service --status-all
[ ? ]  acpid
[ ? ]  anacron
[ + ]  apache2
[ ? ]  atd
[ - ]  bootlogd
[ ? ]  console-setup
[ ? ]  cron
[ ? ]  cryptdisks
. . .

Эта команда выведет все текущие сервисы, о которых знает System V.

Символ + значит, что сервис запущен, символ – значит, что он остановлен, а ? – что System V не известно состояние данного сервиса.

Если System V не знает состояния сервиса, возможно, он управляется другой системой инициализации. В Ubuntu это может быть Upstart или Systemd.

Также нужно узнать, какие уровни выполнения поддерживает система.

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

Вы можете обнаружить уровни выполнения каждого сервиса с помощью ряда инструментов, например, chkconfig или sysv-rc-conf.

В Ubuntu и Debian инструмент chkconfig можно установить, в дистрибутивах RHEL утилита поставляется по умолчанию.

apt-get update
apt-get install chkconfig
chkconfig --list
acpid                     0:off  1:off  2:off  3:off  4:off  5:off  6:off
anacron                   0:off  1:off  2:off  3:off  4:off  5:off  6:off
apache2                   0:off  1:off  2:on   3:on   4:on   5:on   6:off
atd                       0:off  1:off  2:off  3:off  4:off  5:off  6:off
bootlogd                  0:off  1:off  2:off  3:off  4:off  5:off  6:off
console-setup             0:off  1:off  2:off  3:off  4:off  5:off  6:off
cron                      0:off  1:off  2:off  3:off  4:off  5:off  6:off
cryptdisks                0:on   1:off  2:off  3:off  4:off  5:off  6:off
cryptdisks-early          0:on   1:off  2:off  3:off  4:off  5:off  6:off
. . .

Чтобы установить и запустить sysv-rc-conf, введите:

apt-get update
apt-get install sysv-rc-conf
sysv-rc-conf --list
acpid
anacron
apache2      0:off  1:off   2:on    3:on    4:on    5:on    6:off
atd
bootlogd
console-setu
cron
cryptdisks   0:on   6:on
cryptdisks-e 0:on   6:on
. . .

Если вы хотите обнаружить уровни выполнения вручную, вы можете проверить несколько каталогов /etc/rc*.d/, где звездочка обозначает уровень выполнения.

К примеру, чтобы обнаружить сервисы System V уровня выполнения 2, проверьте следующие файлы:

cd /etc/rc2.d
ls -l
total 4
-rw-r--r-- 1 root root 677 Jul 26  2012 README
lrwxrwxrwx 1 root root  18 Dec 28  2012 S20php5-fpm -> ../init.d/php5-fpm
lrwxrwxrwx 1 root root  15 Apr 26  2012 S50rsync -> ../init.d/rsync
lrwxrwxrwx 1 root root  14 Jun 21  2013 S75sudo -> ../init.d/sudo
lrwxrwxrwx 1 root root  17 Dec 28  2012 S91apache2 -> ../init.d/apache2
. . .

Это ссылки на конфигурационные файлы, расположенные в /etc/init.d/. Каждая ссылка, которая начинается с S, запускает сервис. Если ссылка начинается с K, она останавливает сервисы этого уровня.

Обнаружение сервисов и уровней выполнения Upstart

Ubuntu и многие Ubuntu-подобные серверы используют систему инициализации Upstart.

Чтобы узнать, использует ли систему Upstart ваш сервер, введите:

which initctl
/sbin/initctl

Если вы получили путь к исполняемому файлу, значит, ваш сервер реализует Upstart.

Просмотреть текущие сервисы можно с помощью команды:

initctl list
mountall-net stop/waiting
passwd stop/waiting
rc stop/waiting
rsyslog start/running, process 482
tty4 start/running, process 728
udev start/running, process 354
upstart-udev-bridge start/running, process 350
ureadahead-other stop/waiting
. . .

Эта команда покажет вам текущее состояние всех сервисов, управляемых Upstart. Вы можете узнать, какие сервисы выполняются в настоящее время, и посмотреть, есть ли среди них устаревшие.

Также нужно обнаружить уровни выполнения.

Для этого используйте команду initctl.

initctl show-config
mountall-net
start on net-device-up
passwd
start on filesystem
rc
emits deconfiguring-networking
emits unmounted-remote-filesystems
start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
rsyslog
start on filesystem
stop on runlevel [06]
. . .

Эта команда выдает много информации о конфигурации каждого сервиса. Часть, которую нужно искать, — это спецификация runlevel.

Если вы хотите собрать эту информацию вручную, вы можете просмотреть файлы, расположенные в каталоге /etc/init.

В этом каталоге вы найдете множество конфигурационных файлов. Уровень выполнения в этих файлах определяется так:

start on runlevel [2345]
stop on runlevel [!2345]

Обнаружение сервисов и уровней выполнения на серверах systemd

Система инициализации systemd является более новой.

Systemd расходится с другими типами систем инициализации, но она невероятно производительна. Вы можете узнать о запущенных сервисах с помощью команды:

systemctl list-units -t service
UNIT                                           LOAD   ACTIVE SUB     DESCRIPTION

atd.service                                    loaded active running ATD daemon


avahi-daemon.service                           loaded active running Avahi mDNS/DNS-SD Stack


colord.service                                 loaded active running Manage, Install and Generate Color Profiles


cups.service                                   loaded active running CUPS Printing Service


dbus.service                                   loaded active running D-Bus System Message Bus


dcron.service                                  loaded active running Periodic Command Scheduler


dkms.service                                   loaded active exited  Dynamic Kernel Modules System

. . .

Systemd неточно повторяет концепцию уровней выполнения других систем инициализации. Вместо этого она реализует концепцию так называемых «целей». В то время как традиционные системы инициализации могут быть только на одном уровне выполнения, сервер, который использует systemd, может одновременно достигать нескольких целей.

Потому определить, когда активны те или иные сервисы, немного сложнее.

Просмотреть активные цели позволяет эта команда:

systemctl list-units -t target
UNIT                LOAD   ACTIVE SUB    DESCRIPTION
basic.target        loaded active active Basic System
cryptsetup.target   loaded active active Encrypted Volumes
getty.target        loaded active active Login Prompts
graphical.target    loaded active active Graphical Interface
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target     loaded active active Local File Systems
. . .

Чтобы просмотреть все доступные цели, введите:

systemctl list-unit-files -t target
UNIT FILE                 STATE
basic.target              static
bluetooth.target          static
cryptsetup.target         static
ctrl-alt-del.target       disabled
default.target            disabled
emergency.target          static
final.target              static
getty.target              static
graphical.target          disabled
halt.target               disabled
. . .

Теперь можно переделить, какой сервис привязан к той или иной цели. Цели могут зависеть от сервисов или других целей. Чтобы узнать, какую политику реализует цель, введите:

systemctl list-dependencies target_name.target

Например:

systemctl list-dependencies multi-user.target
multi-user.target
├─atd.service
├─avahi-daemon.service
├─cups.path
├─dbus.service
├─dcron.service
├─dkms.service
├─gpm.service
. . .

Эта команда выведет на экран дерево зависимостей цели и предоставит вам список сервисов и других целей, которые запускаются, когда эта цель активна.

Другие методы обнаружения сервисов

Большинство сервисов управляется системой инициализации, но на сервере могут быть сервисы, которые работаю независимо.

Вы должны обнаружить такие сервисы и процессы. В большинстве случаев сервисы обмениваются данными друг с другом или внешними процессами, и они могут делать это только несколькими конкретными способами. Чтобы обнаружить эти сервисы, нужно проверить некоторые интерфейсы.

Для этого можно использовать netstat.

netstat -nlp
Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name


tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      762/mysqld


tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      832/apache2


tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      918/sshd


tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      799/php-fpm.conf)


tcp6       0      0 :::22                   :::*                    LISTEN      918/sshd


Active UNIX domain sockets (only servers)


Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path


unix  2      [ ACC ]     STREAM     LISTENING     1526     1/init              @/com/ubuntu/upstart


unix  2      [ ACC ]     SEQPACKET  LISTENING     1598     354/udevd           /run/udev/control


unix  2      [ ACC ]     STREAM     LISTENING     6982     480/dbus-daemon     /var/run/dbus/system_bus_socket


unix  2      [ ACC ]     STREAM     LISTENING     8378     762/mysqld          /var/run/mysqld/mysqld.sock


unix  2      [ ACC ]     STREAM     LISTENING     1987     746/acpid           /var/run/acpid.socket

Номер порта находится справа. Сокеты Unix указываются в нижней части вывода.

Если в выводе вы заметили сервисы, о которых не говорила ваша система инициализации, постарайтесь собрать о них информацию.

Аналогичную информацию о портах сервисов вы можете получить с помощью lsof:

lsof -nPi
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld    762    mysql   10u  IPv4   8377      0t0  TCP 127.0.0.1:3306 (LISTEN)
php5-fpm  799     root    6u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  800 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  801 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  802 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
php5-fpm  803 www-data    0u  IPv4   8195      0t0  TCP 127.0.0.1:9000 (LISTEN)
apache2   832     root    3u  IPv4   8210      0t0  TCP *:80 (LISTEN)
sshd      918     root    3r  IPv4   7738      0t0  TCP *:22 (LISTEN)
. . .

Также можно использовать команду ss, чтобы узнать, какие процессы используют те или иные порты и сокеты:

ss -nlpaxtudw
Netid  State      Recv-Q Send-Q   Local Address:Port     Peer Address:Port

u_str  LISTEN     0      0      @/com/ubuntu/upstart 1526                * 0     users:(("init",1,7))


u_str  ESTAB      0      0      @/com/ubuntu/upstart 1589                * 0     users:(("init",1,10))


u_str  ESTAB      0      0                         * 1694                * 0     users:(("dbus-daemon",480,6))


u_str  ESTAB      0      0                         * 1695                * 0     users:(("dbus-daemon",480,7))


u_str  ESTAB      0      0                         * 1803                * 0

Сбор информации о версиях пакетов

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

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

Чтобы получить номера версий программного обеспечения, иногда можно использовать флаги -v или —version, но обычно это проще сделать через диспетчер пакетов. Если вы находитесь в системе Ubuntu/Debian, введите:

dpkg -l | grep package_name

Если вы используете систему RHEL, введите:

rpm -qa | grep package_name

Сохраните список номеров версий важных пакетов, чтобы восстановить их в целевой системе.

Дальнейшие действия

Теперь вы знаете, какие сервисы и процессы есть на вашем исходном сервере, и какие из них понадобятся вам на целевой машине.

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

Tags: