- Утилита rsync, синхронизация файлов в Linux
- Введение
- Что такое Rsync?
- Опции rsync
- Базовый синтаксис
- Использование rsync для синхронизации с удаленной системой
- Полезные опции
- Заключение
- Rsync: копирование и синхронизация файлов с удаленным сервером
- Установка и основные параметр rsync
- Rsync: локальное копирование/синхронизация каталогов
- Rsync: настройка синхронизации с удаленным сервером
- Другие примеры использования rsync
- Резервное копирование в Linux с помощью rsync
Утилита rsync, синхронизация файлов в Linux
Введение
Rsync, что означает «remote sync«, в переводе “удаленная синхронизация” — средство синхронизации удаленных и локальных файлов. Утилита использует алгоритм, минимизирующий объем копируемых данных за счёт перемещения только тех участков файлов, которые были изменены. В данном руководстве мы рассмотрим основы использования этой мощной утилиты. В примерах используется Ubuntu 12.04 VPS, но вы можете работать в любом современном дистрибутиве Linux.
Что такое Rsync?
Rsync — очень гибкий инструмент сетевой синхронизации. Это название может также означать сетевой протокол, созданный для его работы. В данном руководстве под rsync мы будем понимать утилиту, а не протокол. Благодаря своей повсеместной распространенности в Linux и Unix-подобных системах и популярности в качестве инструмента для системных скриптов, rsync по умолчанию включена в большинство дистрибутивов Linux.
Опции rsync
- -v — Выводить подробную информацию о процессе копирования
- -q — Минимум информации
- -c — Проверка контрольных сумм для файлов
- -a — Режим архивирования
- -R — относительные пути
- -b — создание резервной копии
- -u — не перезаписывать более новые файлы
- -l — копировать символьные ссылки
- -L — копировать содержимое ссылок
- -H — копировать жесткие ссылки
- -p — сохранять права для файлов
- -g — сохранять группу
- -t — сохранять время модификации
- -x — работать только в этой файловой системе
- -e — использовать другой порт для ssh пример rsync -e «ssh -p 1234»
- -z — сжимать файлы перед передачей
- —delete — удалять файлы которых нет в источнике
- —exclude — исключить файлы по шаблону
- -r —recursive — перебирать директории рекурсивно
- —no-recursive — отключить рекурсию
- —progress — выводить прогресс передачи файла
- —stat — показать статистику передачи
- —version — версия утилиты
Базовый синтаксис
Базовый синтаксис rsync очень прост и аналогичен ssh, scp и cp. Дли синхронизации содержимого директории dir1 в dir2 на той же системе введите команду:
Опция -r означает рекурсивную синхронизацию и обязательна для синхронизации директорий.
Вместо нее можно было воспользоваться флагом -a:
Опция -a — это комбинированный флаг. Она означает архивную синхронизацию и осуществляет рекурсивную синхронизацию с сохранением символических ссылок, специальных файлов, файлов устройств, времени изменения, группы, владельца и прав доступа. Она используется чаще чем -r, и обычно требуются именно ее функции.
Важное замечание: В конце первого аргумента в рассмотренных выше командах указан слэш (/):
Он нужен для того, чтобы определить аргумент как “содержимое dir1”. Без слэша в dir2 была бы помещена сама директория со всеми файлами внутри:
Всегда внимательно проверяйте аргументы при выполнении команды rsync. Специально для этого существуют опции -n или —dry-run (тестовый прогон без фактической синхронизации). Флаг -v (verbose, подробная информация) также полезен для полноценного просмотра выходных данных:
Удалим слэш в конце аргумента и сравним результаты:
Видно, что была передана сама директория.
Использование rsync для синхронизации с удаленной системой
Если у вас есть SSH-доступ к удаленной машине, а rsync установлена на обеих компьютерах, синхронизация с удаленной системой элементарна. После подтверждения SSH-доступа можно синхронизировать директорию dir1 с удаленным компьютером, выполнив следующую команду (обратите внимание, что в данном случае нам нужно передать саму директорию, поэтому слэш в конце не указываем):
Такая операция называется «push» (“толчок”), потому что директория “толкается” из локальной системы в удаленную. Противоположная операция — “pull” (“извлечение”), она применяется для синхронизации с удаленной системы в локальную. Если бы директория dir1 была в удаленной системе, синтаксис был бы следующим:
Как и в случае с cp и подобными командами, источник всегда является первым аргументом, а место назначения — вторым.
Для автоматического копирования, например по cron. Необходимо настроить авторизацию по ключу, как это сделать читайте в этой статье. Тогда в cron достаточно будет добавить выше указанные команды и настроить время в которое они должны выполняться.
Полезные опции
У rsync есть множество опций, которые изменяют заданное по умолчанию функционирование. Мы уже рассмотрели некоторые из них выше. Если вы передаёте несжатые файлы, например, текстовые, можно снизить объем сетевого трафика при помощи опции -z, которая выполняет компрессию:
Очень полезной опцией является -P: она объединяет флаги —progress и —partial. Первый из них показывает ход выполнения передачи, а второй позволяет возобновлять прерванные передачи:
При повторном выполнении команды выходных данных будет меньше, потому что изменений не произошло. Это показывает возможность rsync определять наличие изменений по времени модификации.
Если обновить время модификации некоторых файлов, rsync скопирует только их:
Чтобы действительно поддерживать синхронизацию двух директорий, нужно при удалении файлов в исходной директории удалять их в директории назначения. По умолчанию rsync ничего в ней не удаляет.
Это можно изменить при помощи опции —delete. Прежде чем воспользоваться ей, проведите тестирование с опцией -n, чтобы исключить потерю данных.
Если требуется исключить из синхронизации определенные файлы, их можно указать в разделенном запятыми списке после опции —exclude=:
Если указан шаблон исключения, можно игнорировать его для файлов, соответствующих другому шаблону при помощи опции —include=.
Наконец, опция —backup может использоваться для сохранения резервных копий важных файлов. Она используется совместно с опцией —backup-dir, которая указывает директорию для сохранения резервных копий.
Заключение
Использование rsync может упростить передачу файлов по сети и повысить надёжность локальной синхронизации директорий. Благодаря своей гибкости rsync является полезным инструментом для различных операций на уровне файлов.
Владение rsync позволяет выполнять сложные операции резервного копирования и точно контролировать, что и как передаётся.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Rsync: копирование и синхронизация файлов с удаленным сервером
Утилиту Rsync можно использовать для копирования и синхронизации файлов и папок с локального сервера Linux на удаленный и наоборот. Rsync позволяет копировать ваши данные между серверами внутри защищенного SSH соединения. Так же, rsync, поддерживает сжатие данных на лету, что повышает производительность системы.
Чтобы исключить потерю информации при отправке файлов, rsync сначала копирует всю передаваемую информацию во временный файл. Другая важная особенность rsync – файлы передаются в один поток, не создается отдельный поток для каждого файла (что вызывает проблему при передаче большого количества маленьких файлов в других утилитах).
В данной статье мы рассмотрим варианты использования rsync для синхронизации и копирования каталогов и файлов, и приведем примеры его расширенных настроек.
Установка и основные параметр rsync
Установка rsync не отличается от установки, любого другого пакета. В CentOS пакет rsync присутствует в базовом репозитории и устанавливается через yum (или dnf в CentOS 8):
# yum install rsync -y
Синтаксис команды выглядит следующим образом:
# rsync опции источник приемник
В качестве источника и приемника можно указать локальную или удаленную директорию на другом сервере.
- -v – вывести подробную информацию о процессе
- -c – проверка контрольных сумм файлов
- -q – минимальная информация
- -a – режим архивирования
- -R – относительные пути
- -y – не перезаписывать более новые файлы
- -b – создание резервной копии
- -l – копировать симлинки
- -L – копировать содержимое ссылок
- -H – копировать жесткие ссылки
- -g – сохранять группу
- -p – сохранять права для файлов
- -t – сохранять время модификаций
- -x – работать только в этой ФС
- -e – использовать другой транспортный протокол (например, ssh)
- -z – сжимать файлы перед передачей
- —delete – удалять файлы которых нет в источнике
- —exclude – исключить файлы
- —recursive – перебирать директории рекурсивно
- —no-recursive – отключить рекурсию
- —progress – выводить прогресс передачи файлов
- —stat – показать статистику передачи
- —max-size – максимальный размер файла для передачи
- —bwlimit — ограничение скорости для передачи файлов
- —version – версия утилиты
Rsync: локальное копирование/синхронизация каталогов
Rsync можно использовать для копирования файлов между локальными директориями сервера. Если вам нужно скопировать файлы из одной директории в другую, выполните команду:
# rsync /var/www/html/package.zip /var/www/tmp/
В этом случае файл package.zip был просто скопирован в директорию /var/www/tmp/.
Можно добавить несколько опций для выполнения копирования. Например, чтобы перед выполнением копирования предварительно сжать файл, вывести подробную информацию и прогресс копирования файла, выполните:
# rsync -vz —progress /var/www/html/package.zip /var/www/tmp/
Вы можете использовать rsync для синхронизации содержимого локальных каталогов. Например, rsync удобно использовать, когда вам требуется скопировать файлы из рабочей директории, на хранилище, которое примонтировано к какому-то разделу. Несколько примеров команд:
# rsync -zvr /var/www/site /backup/
Мы скопировали директорию /var/www/site в директорию для резервных копий, опция -r позволила рекурсивно скопировать все вложенные директории и файлы.
Чтобы сохранить все атрибуты файлов при копировании, например, дату изменения и дату создания файлов, добавьте ключ -a:
# rsync -zvra /var/www/site /backup/
Если вы хотите скопировать только измененные файлы, добавьте опцию -c:
# rsync -zvrac /var/www/site /backup/
Я изменил только один файл и запустил команду. В результате в целевую директорию, был скопирован только измененный файл.
Очень удобно использовать такую опцию, если файлы меняются не часто. Таким образом вы экономите время на копирование/синхронизацию директории.
Чтобы не захламлять директорию для бэкапов, можно добавить опцию —delete, это позволит сравнить файлы с источником и в случае присутствия файла в целевой директории и отсутствие его в исходной директории, удалить его автоматически. Но призываю использовать данную опцию с осторожностью, так как если вы настроите копирование директории по крону, в случае сбоя или вмешательства из вне в рабочую директорию, с последующим удалением рабочих файлов, у вас затрется информация и в бэкапах, что не позволит вам восстановить ваши данные. Пример:
# rsync -zvrac —delete /var/www/site /backup/
Rsync: настройка синхронизации с удаленным сервером
Чаще всего копирование/синхронизация rsync с удаленным сервером используется для резервного копирования или синхронизации конфигурации нод кластера. Можно выполнять автоматическую синхронизацию данных с рабочего сервера на резервный, и в случае проблем на продуктивном севере быстро все перевести на резервный. Это довольно удобный и простой в настройке вариант.
В современных версиях rsync протокол SSH используется для передачи файлов по-умолчанию. Однако вы можете использовать и демон rsyncd. Для этого клиент rsync должен быть установлен на удаленном компьютере, и его демон добавлен в автозагрузку:
# systemctl enable rsyncd
Конфигурационный файл rsync — /etc/rsyncd.conf. В этом файле можно настроить параметры rsync и настройки для синхронизации для разных ресурсов.
Для синхронизации через демона rsync адрес удаленного сервера указывается так rsync://. Например:
# rsync -av /var/www/site/package.zip rsync://192.168.1.32/backup
Чтобы скопировать файл на удаленный сервер, используйте команду:
# rsync -az /var/www/site/package.zip root@IP:/backup/
Где IP, это адрес удаленного сервера. После запуска команды, удаленный сервер запросит пароль пользователя (если включена авторизация по паролю). Для автоматической авотризации нужно настроить SSH ключи.
Скопируем директорию с локального сервера на удаленный:
# rsync -zvra /var/www/site root@IP:/backup/
То есть, все тоже самое, что и с локальными директориями, только мы указываем адрес удаленного сервера.
Так же вы можете синхронизировать файлы и с удаленного сервера на локальный, команда для этого немного изменится:
# rsync -zvra root@IP:/backup/ /backup
Для принудительного использования SSH протокола для копирования файлов, укажите это в вашей команде (для выбора транспортного протокола копирования файлов используется опция –e):
# rsync -zvrae ssh root@IP:/backup/ /backup
Если удаленный SSH сервер имеет отличный от стандартного порт, его так же можно указать:
# rsync -zvrae «ssh -p 2222» root@IP:/backup/ /backup
Другие примеры использования rsync
Если в рамках сессии синхронизации вы передаете много информации и важно ограничить скорость передачи, задайте это дополнительной опцией –bwlimit (указывается скорость в КБ/с):
# rsync -zvra —bwlimit=100 /var/www/site root@IP:/backup/
При передаче файлов на удаленный сервер, вы можете ограничить максимальный размер файлов, которые нужно скопировать. Например, вы хотите скопировать все файлы, кроме файлов размером более 1 Мб:
# rsync -zvra —max-size=’1m’ /var/www/site root@IP:/backup/
Если у вас на сервере нужна односторонняя синхронизация и после переноса файлов на удаленный сервер нужно удалить файлы с исходного сервера, воспользуйтесь опцией —-remove-source-files:
# rsync -zvra —remove-source-files —progress /var/www/site/package.zip root@IP:/backup/
После выполнения команды, файл был скопирован на удаленный сервер и удален на источнике:
Так же очень удобный опции —include и —exclude, с помощью этих опций, можно делать исключения по копированию директорий или файлов:
# rsync -zvra —exclude=administrator/ /var/www/site root@IP:/backup/
В данном случае мы исключили директорию “administrator” при копировании на удаленный сервер.
# rsync -zvra —include=’*.php’ —exclude=’*’ /var/www/site/administrator/ root@IP:/backup/
Добавлением опции —include мы смогли задать фильтр по файлам, скопировали только файлы с расширением php.
Резервное копирование в Linux с помощью rsync
В своей рабое я часть использую rsync для автоматических задач резервного копирования в Linux. Можно написать простые bash скрипты или просто добавить команду rsync в cron и выполнять по расписанию.
Например, можно добавить в cron команду:
01 30 * * * rsync -zvra root@IP:/backup/ /backup
В резульатате каждый день в 1-30 ночи, будет выполняться синхронизация каталогов локального и удаленного серверов.
Стоит учесть, что для выполнения команды rsync на удаленном сервер через cron, желательно настроить авторизацию серверов по SSH ключу. Примеры скриптов для бэкапа, мы приводили в статье «Скрипты для бэкапа файлов из Linux в облако», там как раз используется rsync для копирования файлов в подключенные облачные хранилища.