В некоторых ситуациях возникает необходимость перенести свои данные и рабочую среду с одного сервера на другой. Возможно, со временем вы захотите сменить центр обработки данных и провайдера или перейти на более крупную и мощную машину.
В любом случае при переходе с одной системы в другую нужно учесть множество различных нюансов. Полностью восстановить функции и конфигурации может быть трудно, если вы не используете средства для управления конфигурацией (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
Сохраните список номеров версий важных пакетов, чтобы восстановить их в целевой системе.
Дальнейшие действия
Теперь вы знаете, какие сервисы и процессы есть на вашем исходном сервере, и какие из них понадобятся вам на целевой машине.
В следующем руководстве данной серии вы узнаете, как выполнить миграцию сервера.