Как клонировать VPS самостоятельно

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

Обратите внимание!
Способ требует приостановки обоих серверов — они не будут обслуживать сайты и сервисы, пока находятся в rescue-режиме.

Перед началом

Создайте новый VPS-сервер, на который будете переносить данные.

Обратите внимание!
Клонирование необходимо выполнять на сервер с аналогичной операционной системой, что и на исходном сервере.

Чтобы узнать версии операционной системы на обоих серверах, используйте следующую команду:

cat /etc/os-release

Затем на обоих серверах проверьте место на диске одной и той же командой:

df -h /

На исходном сервере проверьте колонку Used — сколько места занято данными. На новом сервере проверьте колонку Avail — сколько места свободно. Свободного места на новом сервере должно быть больше, чем занято на исходном.

Обратите внимание!
Если операционная система отличается — переустановите ОС на новом сервере на такую же, как на исходном, прежде чем продолжать. Если объема диска на новом сервере недостаточно, выберите тариф с большим объемом диска.

Шаг 1. Переведите оба сервера в rescue-режим

После создания сервера с нужной конфигурацией включите rescue-режим для исходного и нового сервера в ПУ.

Для этого напротив имени каждого сервера нажмите на 3 точки и выберите Rescue-режим:

rescue режим сервера

Подтвердите включение rescue-режима:

Окно подтверждения включения Rescue-режима

После включения rescue-режима перезагрузите оба сервера через reset. Для этого вновь нажмите на 3 точки и выберите Перезагрузить:

Меню действий сервера с пунктом Перезагрузить

В появившемся окне выберите Reset:

Окно выбора типа перезагрузки с кнопкой Reset

Дождитесь, пока оба сервера перезагрузятся и запустятся в rescue-режиме. У сервера появится статус Rescue-режим:

Статус rescue-режим

Шаг 2. Подключитесь к серверам и настройте доступ для переноса

Подключиться к серверу в rescue-режиме можно через веб-консоль VNC в ПУ — этот способ работает всегда, независимо от того, поднялась ли сеть.

Обратите внимание!
Если продолжите работать через VNC, учитывайте, что вставка текста из буфера обмена не работает — все команды нужно вводить вручную. Будьте внимательны при наборе длинных значений (IP-адреса, UUID, MAC-адреса), так как опечатка может привести к тому, что сервер не загрузится после переноса.

Как подключиться по SSH

При подключении по SSH, в отличие от VNC, работает вставка текста из буфера обмена. Чтобы подключиться по SSH:

  1. Через VNC войдите на нужный сервер и задайте временный пароль root:
passwd

Этот пароль действует только на время работы в rescue-режиме и не меняет пароль в обычной системе (при условии, что вы не выполняли chroot /mnt — этого делать не нужно).

  1. Узнайте IP-адрес сервера — его можно посмотреть в ПУ в блоке Реквизиты доступа, либо командой ip a в консоли.
  2. Подключитесь с вашего устройства, заменив ip_сервера на реальный IP-адрес сервера:
ssh root@ip_сервера

Как настроить SSH-ключ для переноса данных

Пароль, заданный выше на новом сервере, пригодится позже — для передачи данных через rsync (шаг 5). Вместо пароля можно настроить вход по SSH-ключу — для этого выполните следующие шаги:

  1. На исходном сервере проверьте, есть ли уже готовый ключ:
cat ~/.ssh/id_ed25519.pub

Если файл не найден — сгенерируйте новый ключ (на все вопросы можно нажимать Enter, оставляя значения по умолчанию):

ssh-keygen -t ed25519
  1. На исходном сервере передайте ключ на новый сервер одной командой:
ssh-copy-id root@ip_нового_сервера

Команда добавит ключ в файл /root/.ssh/authorized_keys на новом сервере. Когда команда запросит пароль, введите пароль root, заданный выше при помощи passwd.

Шаг 3. Определите корневой раздел на обоих серверах

Имя диска и раздела может отличаться в зависимости от конфигурации сервера (/dev/vda1/dev/sda1 и т. п.) — определите его сами на каждом сервере одной из команд:

lsblk
fdisk -l

Раздел, смонтированный в / (корень), в выводе lsblk указан в колонке MOUNTPOINTS. Например:

NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda       8:0    0   30G  0 disk
└─sda1    8:1    0   29G  0 part /
Обратите внимание!
В этом примере корневой раздел — sda1. Далее в статье используется /dev/vda1 как условное обозначение, вместо него указывайте раздел, который вы определили на этом шаге.

Шаг 4. Смонтируйте раздел на обоих серверах

Выполните команду для монтирования раздела на исходном и на новом сервере, указав в каждом случае раздел, определённый на шаге 3.

mount /dev/vda1 /mnt

Шаг 5. Запустите копирование файлов

Узнайте IP-адрес нового сервера. IP-адрес можно посмотреть в ПУ в блоке Реквизиты доступа, либо командой на новом сервере:

ip a
Обратите внимание!
Копирование большого объема данных может занять продолжительное время, а разрыв соединения прервет процесс копирования вместе с ним.

По этой причине прежде чем запускать rsync, на исходном сервере откройте сессию tmux — она продолжит работать в фоне, даже если соединение прервется:

tmux new -s clone

Убедившись, что вы находитесь внутри сессии tmux, запустите копирование на исходном сервере:

rsync -aAHP /mnt/ root@new_ip:/mnt/

В команде требуется заменить new_ip на реальный IP-адрес нового сервера.

После введите пароль, заданный на шаге 2 (если используете вход по паролю, а не по ключу).

Отключиться от сессии, не прерывая копирование, можно комбинацией Ctrl+B, затем D; вернуться и проверить прогресс — tmux attach -t clone. Полностью закрыть сессию (после того как копирование завершилось), не заходя в неё, можно командой tmux kill-session -t clone.

Проверьте, что копирование завершилось без ошибок

Как только rsync закончит работу, выполните команду в той же сессии tmux, где запускали копирование (если вы отключались от неё — сначала вернитесь командой tmux attach -t clone), не вводя перед этим никаких других команд:

echo $?

0 означает, что копирование прошло без ошибок. Любое другое число — при копировании были проблемы: пролистайте вывод rsync вверх и посмотрите, на каких файлах возникли ошибки, прежде чем переходить к следующим шагам.

Как редактировать файлы через vim

На следующих шагах потребуется править файлы внутри /mnt на новом сервере — используйте для этого vim:

  1. Откройте файл: vim /путь/к/файлу
  2. Нажмите i, чтобы войти в режим редактирования (внизу экрана появится -- INSERT --)
  3. Внесите нужные изменения
  4. Нажмите Esc, чтобы выйти из режима редактирования
  5. Сохраните и закройте файл: наберите :wq и нажмите Enter

Если нужно выйти без сохранения (например, при ошибке) — вместо :wq наберите :q! и нажмите Enter.

Шаг 6. Замените MAC-адрес

Посмотрите актуальный MAC-адрес сетевого интерфейса на новом сервере:

ip link

Затем на новом сервере проверьте скопированный файл:

cat /mnt/etc/udev/rules.d/70-persistent-net.rules

Пример содержимого:

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:10:61:a7:ad:96", NAME="eth0"

Откройте файл через vim и замените значение ATTR{address} на MAC-адрес, который ранее вы получили командой ip link.

Шаг 7. Замените старый IP-адрес во всех конфигурациях

На новом сервере сначала проверьте, в каких файлах встречается старый IP:

grep -rl old_ip /mnt/etc/

В команде требуется заменить old_ip на реальный IP-адрес исходного сервера.

Если команда нашла вхождения — список файлов появится на экране. Просмотрите его: если IP-адрес является подстрокой другого адреса (например, 192.168.1.1 и 192.168.1.10), замена может задеть лишние строки — в таких случаях лучше проверить и поправить такие файлы вручную через vim, не используя автозамену.

Если список выглядит корректным, замените старый IP на новый IP во всех найденных файлах:

grep -rl old_ip /mnt/etc/ | xargs sed -i 's#old_ip#new_ip#g'

В команде требуется заменить old_ip и new_ip на реальные IP-адреса исходного и нового сервера соответственно.

Обратите внимание!
Если предыдущая команда grep -rl old_ip /mnt/etc/ ничего не нашла (пустой вывод), не запускайте команду с sed. Команда попытается прочитать данные из терминала и «зависнет» в ожидании ввода. Если так уже произошло, нажмите Ctrl+C, чтобы прервать её.

Если на сервере используется панель управления, проверьте и её каталог конфигурации отдельно, так как старый IP может быть прописан и там.

Шаг 8. Замените UUID в grub-загрузчике

Посмотрите текущий UUID раздела на новом сервере:

blkid | grep vda1:

Если ваш раздел называется иначе (например, sda1, как определили на шаге 3) — используйте blkid | grep sda1:.

Сравните его с UUID, прописанным в скопированной конфигурации grub. Файл обычно находится по пути /mnt/boot/grub/grub.cfg:

cat /mnt/boot/grub/grub.cfg | grep UUID

Если значения UUID различаются, то откройте файл через vim и замените все вхождения старого UUID на новый (посмотренный выше). Если UUID совпадают, тогда менять ничего не нужно.

Обратите внимание!
Если пропустить эту замену при несовпадающих UUID, сервер после отключения rescue-режима не сможет найти корневой раздел при загрузке и упадёт в аварийный режим.

Шаг 9. Отмонтируйте разделы

На обоих серверах выполните команду:

umount /mnt

Шаг 10. Включите оба сервера

Отключите rescue-режим на обоих серверах через ПУ и перезагрузите их.

Для этого напротив имени каждого сервера нажмите на 3 точки и выберите Rescue-режим:

Меню действий сервера в панели управления с пунктом Rescue-режим

В появившемся окне нажмите на Выключить Rescue-режим:

Окно с кнопкой Выключить Rescue-режим

После выключения rescue-режима перезагрузите оба сервера через Reset. Для этого вновь нажмите на 3 точки и выберите Перезагрузить:

Меню действий сервера с пунктом Перезагрузить

В появившемся окне выберите Reset и нажмите Перезагрузить:

Окно выбора типа перезагрузки с кнопкой Reset

Шаг 11. Проверьте, что новый сервер работает корректно

После отключения rescue-режима и перезагрузки сервера подключитесь к новому серверу и убедитесь, что:

  • сервер загрузился нормально — отображается обычное приглашение к входу, а не аварийный режим;
  • сеть настроена верно, MAC-адрес заменен;
  • ключевые сервисы запускаются и работают без ошибок;
  • панель управления, если она используется, открывается, а сайты отвечают.

Заключение

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