Клонирование живого (работающего) Linux-сервера — задача, которая часто возникает при создании резервной копии, переносе системы на новое оборудование или подготовке «горячего» запасного сервера (дурка еще та и именно для подготовки донора для быстрой миграции с минимальным простоем). Утилита rsync — идеальный инструмент для этой цели, поскольку она позволяет синхронизировать файлы и директории с сохранением всех атрибутов, прав доступа и ссылок. Однако при работе с работающей системой необходимо соблюдать осторожность: исключать виртуальные файловые системы и временные точки монтирования, чтобы избежать повреждения данных (хотя потом на отключенном мы все синхронизируем) или бесконечных циклов в ФС (здесь есть приколы).
В этой заметке мы прикинем и разберём, как правильно клонировать живой Linux-сервер с помощью rsync, какие флаги использовать, как синхронизировать данные с удалённым сервером, и приведём практические примеры, включая использование флага —delete-after (и еще несколько других про которые я постоянно забываю).
Идея в том, что если надо сделать перенос VPS (или физической железки) с минимальным простоем, мы делаем его клон и вот таким образом, через rsync на него вытаскиваем данные. Когда миграция согласована укладываем боевой спать и второй итерацией вытаскиваем измененные данные. Это гораздо быстрее, чем клонировать много террабайтный механизм еще раз.
Основная команда для клонирования
Для клонирования работающего сервера выполните синхронизацию с правами root, используя флаги, сохраняющие разрешения и ссылки: -avxHAXS. При этом необходимо явно исключить псевдо-файловые системы, такие как /dev, /proc и /sys.
Стандартная безопасная команда выглядит так:
$ sudo rsync -avxHAXS --delete \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/path/to/source/ /path/to/destination/
Пояснение:
- sudo — выполнение с правами суперпользователя, необходимо для чтения всех файлов и сохранения владельцев (при запуске от имени непривилегированного пользователя).
- /path/to/source/ — исходный каталог (например, корень системы
/). - /path/to/destination/ — целевой каталог (например, точка монтирования нового диска или каталог для резервной копии).
- Флаг —delete удаляет файлы в целевой директории, которых нет в источнике, что обеспечивает точную копию.
- exclude исключает перечисленные директории, чтобы не копировать виртуальные файловые системы и временные данные.
Основные флаги rsync
| Флаг | Описание |
|---|---|
| -a (archive) | Сохраняет символические ссылки, устройства, атрибуты, права, владельцев и временные метки. Эквивалентен комбинации -rlptgoD. |
| -v (verbose) | Показывает, какие файлы обрабатываются в процессе синхронизации. |
| -x (one-file-system) | Запрещает rsync пересекать границы файловых систем. Это предотвращает копирование внешних смонтированных разделов или других дисков. |
| -H (hard-links) | Сохраняет жёсткие ссылки внутри файловой системы. |
| -A (ACLs) | Сохраняет списки контроля доступа (Access Control Lists). |
| -X (xattrs) | Сохраняет расширенные атрибуты файлов (extended attributes). |
| -S (sparse) | Эффективно обрабатывает разреженные файлы (файлы с пустыми областями), экономя место. |
Дополнительные полезные флаги:
- —numeric-ids — сохраняет числовые идентификаторы владельцев и групп (полезно при переносе на другую машину).
- —progress — показывает прогресс передачи.
- —dry-run — выполняет пробный запуск без реального копирования (для проверки).
- —delete-after — удаляет лишние файлы в целевой директории после завершения передачи (подробнее ниже).
Критические директории для исключения
При клонировании работающей системы необходимо исключить виртуальные файловые системы ядра и временные точки монтирования, чтобы предотвратить повреждение данных или бесконечные циклы:
- /dev/* — устройства (создаются динамически ядром).
- /proc/* — виртуальная файловая система процессов.
- /sys/* — виртуальная файловая система sysfs.
- /run/* — временные данные, создаваемые при загрузке.
- /tmp/* — временные файлы.
- /mnt/* и /media/* — точки монтирования внешних носителей.
- /lost+found — каталог восстановления файловой системы (если есть).
Также рекомендуется исключить каталоги, которые не нужно копировать, например, кэши, лог-файлы, если они не требуются для целевой системы.
Синхронизация с удалённым сервером
rsync позволяет синхронизировать данные не только между локальными каталогами, но и с удалённым сервером по SSH. Это удобно для создания резервных копий на другом хосте или для клонирования системы на удалённую машину.
Базовая команда для удалённой синхронизации
$ sudo rsync -avxHAXS --delete \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/path/to/source/ user@remote_host:/path/to/destination/
Здесь user@remote_host — учётная запись и адрес удалённого сервера. Для работы потребуется SSH-доступ (можно и нужно настроить ключи для автоматизации).
Пример с флагом --delete-after
Флаг —delete-after изменяет порядок удаления лишних файлов: вместо того чтобы удалять их до передачи новых данных (как делает —delete по умолчанию), он удаляет их после завершения копирования. Это может быть полезно в следующих ситуациях:
- Если вы хотите минимизировать время, в течение которого целевая директория неполна (например, при работе с активной службой).
- Если существует риск, что передача прервётся — в этом случае лишние файлы останутся, но новые уже будут скопированы, и вы сможете повторить синхронизацию.
Пример команды с --delete-after для удалённого клонирования:
$ sudo rsync -avxHAXS --delete-after \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/ user@backup-server:/backup/live-server/
Пояснение:
- delete-after гарантирует, что удаление файлов, отсутствующих в источнике, произойдёт только после успешной передачи всех новых данных. Это снижает риск потери данных при сбое сети.
- В данном примере мы копируем корень файловой системы
/на удалённый сервер в каталог /backup/live-server/. Исключения предотвращают копирование виртуальных ФС.
Другие примеры использования --delete-after
- Синхронизация веб-каталога с удалённым сервером
# rsync -av --delete-after /var/www/html/ user@web-server:/var/www/html/
Здесь после обновления файлов сайта лишние файлы на удалённом сервере будут удалены, но только после успешной загрузки новых.
- Резервное копирование домашнего каталога
# rsync -av --delete-after /home/user/ user@nas:/backups/home/
Это обеспечит точную копию домашнего каталога, удаляя устаревшие файлы после завершения передачи.
Пост-клон шаги
После завершения синхронизации необходимо выполнить несколько важных действий, чтобы целевая система стала загрузочной и работоспособной. У меня есть отдельная статья на эту тему, но быстро пробежимся по основным тезисам.
1. Установка загрузчика (GRUB)
rsync не копирует таблицу разделов и не устанавливает загрузчик GRUB. Если вы клонируете систему на новый диск или сервер, вам нужно вручную установить и настроить GRUB на целевом диске. Обычно это делается с помощью команды grub-install и обновления конфигурации (update-grub).
Перенос системы на другой хостинг может сломать UUID (точнее 100% сломает)
2. Обновление UUID и сетевых настроек
Если вы переносите систему на новое оборудование (не на идентичный «горячий» запасной диск), необходимо:
- Обновить /etc/fstab — заменить UUID разделов на новые (можно узнать с помощью blkid).
- Исправить сетевые настройки (например, в /etc/network/interfaces или через netplan), если изменился MAC-адрес сетевой карты или имя интерфейса.
Итого по факту.
Клонирование работающего Linux-сервера с помощью rsync тот еще цирк с конями, если правильно подобрать флаги и исключения, то все вполне реализуемо. Помните, что после клонирования необходимо настроить загрузчик и обновить конфигурацию системы для нового оборудования. Соблюдая эти рекомендации, вы сможете быстро и безопасно создать точную копию вашего сервера, но опять же базы отдельно бэкапим и прочие если.




