Копирование и резервное копирование файлов и папок с помощью утилиты Rsync
Rsync это быстрый и универсальный инструмент для копирования файлов и папок. Утилита может копировать данные как локально, так и на другие хосты, включая Облачное хранилище от INTROSERV. Опции утилиты позволяют управлять многими аспектами копирования и зеркалирования данных. Одна из полезных возможностей это сжатие данных во время передачи, которое может снизить сетевой трафик и повысить скорость передачи, когда узким местом является пропускная способность сети. Ещё одно преимущество в том, что Rsync не передаёт файлы, которые не требуют обновления. По умолчанию он сравнивает размер и время изменения файла и передаёт только те файлы, которые, судя по этим параметрам, изменились, что несомненно экономит время при синхронизации больших каталогов.
Зачем нужен флаг -a? Опция -a (архивный режим) это самый распространённый выбор. Она включает рекурсивное копирование и сохраняет основные атрибуты файлов: права доступа, владельца, группу, время изменения и символические ссылки. Поскольку -a уже включает рекурсию, отдельно добавлять -r не нужно.
Опции утилиты
Рассмотрим примеры использования Rsync для копирования файлов и каталогов в удалённое Облачное хранилище от INTROSERV по протоколу SSH.
Эти команды универсальны. Просто замените адрес назначения и путь, чтобы синхронизировать файлы с любым удалённым сервером по SSH.
Рассмотрим некоторые основные опции утилиты, которые используются чаще всего. Более подробный список доступных опций есть в документации man (команда man rsync):
-v – вывод подробной информации о процессе
-c – сравнение содержимого файлов по контрольной сумме вместо размера и времени изменения (надёжнее, но медленнее)
-q – минимум информации
-a – архивный режим
-R – относительные пути
-u – пропускать файлы, которые новее в месте назначения
-b – создавать резервную копию
-l – копировать символические ссылки
-L – копировать содержимое ссылок
-H – копировать жёсткие ссылки
-g – сохранять группу
-p – сохранять права доступа к файлам
-t – сохранять время изменения
-x – работать только в пределах этой ФС
-e – использовать другой транспортный протокол (например, ssh)
-z – сжимать данные при передаче для снижения сетевого трафика
--delete – удалять файлы, которых нет в источнике
--exclude – исключать файлы
--recursive – рекурсивно обходить каталоги (уже входит в -a)
--no-recursive – отключить рекурсию
--progress – показывать прогресс передачи файлов
-P – эквивалент --partial --progress. Показывает прогресс и сохраняет частично переданные файлы, чтобы последующий запуск мог продолжить с них
--stats – показывать статистику передачи
--max-size – максимальный размер файла для передачи
--bwlimit – ограничение скорости передачи файлов
Краткое объяснение синтаксиса
Правило завершающего слэша (/). Именно здесь чаще всего ошибаются: /folder (без слэша) копирует саму папку. /folder/ (со слэшем) копирует только содержимое папки.
rsync -az --progress /home/user/test.file boxxxx@storage_ip:/remote_folder/
-a – архивный режим: рекурсивное копирование с сохранением атрибутов файлов
-z – сжимает данные при передаче
--progress – показывает прогресс передачи
/home/user/test.file – это путь к файлу и сам файл, который нужно передать
boxxxx@storage_ip: – это ресурс назначения (в нашем примере это облачное хранилище, но это может быть и удалённый сервер). boxxxx это имя пользователя, после знака @ идёт имя ресурса или IP-адрес удалённого сервера
/remote_folder/ – это папка на удалённом ресурсе. В нашем примере в Облачном хранилище INTROSERV.
Копирование одного файла в папку на удалённом хранилище
rsync -az --progress /home/user/Desktop/test.file boxxxx@storage_ip:/remote_folder/
Вам будет предложено ввести пароль для подключения к хранилищу. Введите пароль и продолжите, вы увидите прогресс и скорость передачи файла.
Копирование папки в папку на удалённом хранилище
Обратите внимание на слэши в строках исходной папки и папки назначения. Отсутствие слэша у исходной папки означает, что мы хотим перенести саму локальную папку Desktop со всем её содержимым в папку remote_folder.
rsync -az --progress /home/user/Desktop boxxxx@storage_ip:/remote_folder/
Вы увидите, как передаётся каталог и все файлы внутри него.
Копирование содержимого локальной папки в папку на удалённом хранилище
Обратите внимание на слэш в конце исходной папки. Его наличие означает, что утилита должна скопировать содержимое локальной папки в папку на удалённом хранилище.
rsync -az --progress /home/user/Desktop/ boxxxx@storage_ip:/remote_folder/
Вы увидите прогресс и скорость копирования.
Копирование папки с удалённого хранилища в папку на локальном сервере
С помощью Rsync можно инициировать копирование папки с удалённого хранилища. Команда выглядит так:
rsync -az --progress boxxxx@storage_ip:/remote_folder /home/user/Desktop/
Вы увидите прогресс и скорость копирования удалённой папки в папку на локальном сервере.
Копирование содержимого папки с удалённого хранилища в папку на локальном сервере
Здесь тоже стоит обратить внимание на слэш в конце пути к исходной папке. Его наличие означает, что нужно скопировать только содержимое папки.
rsync -az --progress boxxxx@storage_ip:/remote_folder/ /home/user/Desktop/
Копирование содержимого папки с исключением и/или включением файлов
Утилита позволяет явно указать, какие файлы передавать, а какие исключить. Для этого используются опции --include и --exclude. Правила обрабатываются по порядку, поэтому правило include должно идти раньше правила exclude, которое иначе исключило бы тот же файл.
Проверьте командой вхолостую (dry run). Перед запуском команды, которая изменяет или удаляет много файлов, добавьте флаг -n или --dry-run. Rsync покажет, что именно он сделает, не перемещая и не удаляя ничего на самом деле.
rsync -az --progress --include='test.file' --exclude='*' /home/user/Desktop/ boxxxx@storage_ip:/remote_folder/
Эта команда передаёт test.file и исключает всё остальное в исходном каталоге. Именно правило --exclude='*' ограничивает передачу единственным включённым файлом, поэтому здесь обе опции нужны вместе.
Копирование только файлов, отличающихся от файлов в папке назначения
По умолчанию Rsync определяет, нужно ли передавать файл, по его размеру и времени изменения. Используйте опцию -c, когда нужно, чтобы Rsync сравнивал содержимое файлов по контрольной сумме. Это надёжнее, когда времени изменения доверять нельзя, но медленнее, потому что обеим сторонам приходится читать файлы для расчёта контрольных сумм.
rsync -azc --progress /home/user/Desktop/ boxxxx@storage_ip:/remote_folder/
С опцией -c Rsync сравнивает содержимое файлов в источнике и в назначении по контрольным суммам и передаёт только те файлы, содержимое которых различается.
Использование Rsync через SSH с нестандартным SSH-портом
Для передачи файлов с сервера или на сервер с изменённым SSH-портом используйте опцию -e 'ssh -p номер_порта'.
Команда для копирования файла на сервер, у которого SSH-порт изменён на 44, будет выглядеть так:
rsync -azc --progress -e 'ssh -p 44' /home/user/Desktop/ user@server_ip:/remote_folder/
Примечание по безопасности: Смена стандартного SSH-порта может снизить количество автоматических сканирований и нежелательных попыток подключения, но это не замена нормальным мерам защиты SSH, таким как аутентификация по ключам и правила файрвола. Всегда убеждайтесь, что файрвол разрешает трафик на выбранном порту.