Rsync — утилита для удаленной синхронизации и копирования файлов. Ее еще можно назвать «SCP на стероидах». Из преимуществ: позволяет не передавать файлы полностью, а только изменения в них, синхронизирует директории и файлы, имеет встроенный механизм сжатия. Это далеко не полный список.
Для демо-стенда закажем выделенный сервер. Для этого откроем панель управления my.selectel.ru, перейдем в меню Серверы и оборудование и выберем сервер.
В статье будем использовать сервер конфигурации EL09-SSD с шестиядерным процессором Intel® Xeon® E-2236, 16 Гб оперативной памяти, двумя дисками по 480 Гб и операционной системой CentOS 8 64-bit.
После выбора операционной системы можно переходить к завершению заказа и нажатию на кнопку Заказать сервер. Через несколько минут сервер готов к работе.
Возможности Rsync
Ключевое преимущество утилиты — синхронизация структуры директорий целиком или файлов по-отдельности. Можно синхронизировать данные между узлами сети, сетевыми хранилищами, дисками и каталогами.
При первой синхронизации данные файлов копируются целиком. При повторной, Rsync проверяет наличие изменений в исходном файле и передает лишь измененные блоки и байты.
Rsync использует алгоритм сжатия данных Deflate c помощью модифицированной библиотеки zlib, поэтому пропускная способность каналов связи используется экономичнее в сравнении с утилитой SCP.
Вместе с файлами или каталогами, Rsync реплицирует также и разрешения на них. Вместе с этим, для работы не требуются права root, поэтому Rsync подойдет для целей резервного копирования и восстановления данных.
Как установить, настроить и выполнить запуск Rsync на CentOS 8
Установка Rsync на Centos 8 выполняется из репозитория операционной системы, стандартным пакетным менеджером dnf:
dnf -y install rsync rsync-daemon
Эта команда установит саму утилиту rsync (клиентскую часть) и демон rsync (серверную часть). Серверная часть нужна для приема входящих обращений на синхронизацию через rsync без использования SSH. Позже покажем как обратиться к ней с внешнего сервера.
Перед началом работы необходимо выполнить настройку. Конфигурация выполняется в файле /etc/rsyncd.conf:
vi /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
[share]
path = /tmp/share/
hosts allow = localhost 192.168.56.1
hosts deny = *
list = true
uid = nonroot
gid = nonroot
read only = false
comment = Shared folder
В файле конфигурации указываются следующие переменные:
- pid file — файл, в котором будет храниться номер процесса демона Rsync;
- lock file — файл блокировки для защиты от повторного запуска Rsync;
- log file — журнал сообщений, генерируемых демоном Rsync в процессе работы;
- path — путь до каталога, для которого выполняется синхронизация или копирование;
- hosts allow — хосты, которым явно разрешено подключаться к демону Rsync для передачи файлов;
- hosts deny — хосты, которым явно запрещено подключаться к демону Rsync для передачи файлов (в примере выше со всех, кроме разрешенных);
- list — флаг разрешения/запрета чтения каталога;
- uid — пользователь, от имени которого будет выполняться синхронизация для конкретного ресурса;
- gid — группа, от имени которой будет выполняться синхронизация для конкретного ресурса;
- read only — флаг для защиты имеющихся данных от изменения или удаления;
- comment — описание конфигурации.
Рекомендуем использовать для переменных uid и gid непривилегированные учетные записи.
Перед запуском утилиты, нужно также создать указанную в конфигурации директорию:
mkdir /tmp/share
На этом настройка Rsync в Linux завершена и можно запускать утилиту:
systemctl enable --now rsyncd
Теперь выполним настройки безопасности. Чтобы Rsync работал корректно, важно настроить SELinux и сетевой экран:
setsebool -P rsync_full_access on
firewall-cmd --add-service=rsyncd --permanent
firewall-cmd --add-service=rsyncd --permanent
Проверим статус сервиса rsyncd:
Синтаксис Rsync
В этом разделе мы приведем основные параметры, с которыми выполняется Rsync. Синтаксис в общем виде выглядит так:
rsync -options <source> <destination>
-options — параметры, с которыми должна выполняться утилита.
<source>— каталог или файл, который является источником.
<destination> — каталог или файл, который является приемником.
Ниже приведены основные параметры, с которыми вызывается Rsync:
-v, —verbose — для отображения отладочной информации в процессе синхронизации.
-q, —quiet — для запрета вывода об ошибках.
-c, —checksum — для сравнения файлов по контрольной сумме, вместо даты/времени изменения или размера.
-a, —archive — включение сжатия данных.
-r, —recursive — для включения режима рекурсивного копирования директорий.
-b, —backup — для активации режима режима резервного копирования, чтобы создавались резервные копии оригинальных файлов при обновлении.
—backup-dir=<каталог> — каталог, в котором будут храниться резервные копии.
—suffix=SUFFIX — суффикс для файлов, сохраняемых в режиме резервного копирования..
-u, —update — для пропуска обновления файлов с более поздней датой изменения.
-l, —links — для сохранения символических ссылок.
-H, —hard-links — для сохранения жестких ссылок.
-p, —perms — для сохранения разрешений объекта (файла или каталога).
-E, —executability — для сохранения прав на исполнение.
—chmod=<права> — для изменения прав доступа на конкретные объекты (файлы или каталоги).
-o, —owner — для сохранения владельца объекта.
-g, —group — для сохранения группы владельца.
-S, —sparse — для выполнения дефрагментации одновременно с копированием данных.
-n, —dry-run — для тестирования без копирования;
-W, —whole-file — для копирования файлов целиком, по умолчанию копируется только часть с изменениями.
—delete — для удаления старых файлов, если их уже нет в источнике копирования.
—delete-before — для удаления файлов в папке назначения до начала синхронизации.
—max-delete=<количество файлов> — для ограничения максимального числа удаляемых файлов.
—max-size=<размер файлов> — для ограничения максимального размера передаваемых файлов.
—min-size=<размер файлов> — для ограничения минимального размера передаваемых файлов.
-z, —compress — для включения сжатия файлов во время передачи.
—compress-level=<число> — для установки уровня сжатия от 0 до 9.
—exclude=<имена файлов> — для исключения из синхронизации файлов.
—exclude-from=<имя файла> — для исключения из синхронизации файлов, указанных в файле.
—include=<имена файлов> — для включения в синхронизацию файлов.
—include-from=<имя файла> — для включения в синхронизацию файлов, указанных в файле.
—port=<порт> — для установки сетевого порта для подключения на удаленном узле.
—progress — для включения строки прогресса при синхронизации.
—log-file=<файл> — для указания места расположения лог-файла.
—password-file=<файл> — При аутентификации пароль можно хранить в специальном файле. Это необходимо для автоматизации выполнения команды без пароля.
—list-only — для отображения имен файлов без копирования.
—bwlimit=<число> — для ограничения скорости передачи в Кбит/c.
-4, —ipv4 — приоритет использования IPv4.
-6, —ipv6 — приоритет использования IPv6.
—version — для вывода версии Rsync.
Теперь разберем частные случаи работы Rsync, для которых может потребоваться ввод дополнительных параметров.
Копирование и синхронизация файлов с rsync (локально и удаленно)
При локальном режиме работы достаточно задать каталог/файл-источник и каталог/файл-приемник:
rsync -avzhHl /path/of/source/folder /path/to/destination/folder
Если копирование нужно выполнить с удаленным узлом, добавляется имя пользователя и IP-адрес или имя узла:
rsync -avzhHl /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Для корректной работы с удаленным узлами необходимо настроить доступ по ключам. Rsync этот метода подключения также поддерживает. Об использовании ключей для подключения к серверу мы рассказывали в предыдущей статье.
Синхронизация по SSH и Rsync-демон
По умолчанию синхронизация выполняется по протоколу SSH (cм. примеры выше), дополнительные параметры для этого указывать не требуется. Чтобы обращаться напрямую к Rsync, минуя SSH, на сервере-приемнике должен быть запущен демон Rsync. В предыдущем разделе мы как раз уже это сделали, поэтому можем обратиться с удаленного сервера:
rsync -avz /tmp/share rsync://192.168.56.101:/tmp/share
Автоматическая синхронизация папок
Автоматическая синхронизация папок выполняется штатным способом — планировщиком заданий (cron). Планировщиком удобнее выполнять скрипт, так будет упрощается управление конфигурацией синхронизации. Создадим скрипт:
vi rsync_to_cron.sh
!/bin/sh
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/root/.ssh/id_rsa
RUSER=root
RHOST=192.168.56.1
RPATH=/remote/dir
LPATH=/local/dir
$RSYNC -az -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH
Далее создадим задание в планировщике:
crontab -e
0 22 * * * /root/scripts/rsync_to_cron.sh
Просмотр прогресса синхронизации
Для просмотра прогресса синхронизации, вместе с запуском утилиты необходимо использовать ключ —progress:
rsync -avzhHl --progress /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Удаление при синхронизации
В процессе синхронизации можно удалять файлы на сервере-приемнике, которых уже нет на сервере-источнике. Для этого используется опция —delete:
rsync -avzhHl --delete /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Ограничение максимального размера и скорости передачи
Rsync также имеет встроенную возможность ограничения максимального размера синхронизируемого файла. Для этого нужно использовать опцию —max-size:
rsync -avzhHl --max-size=’100M’ /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Для ограничения скорости передачи предназначена опция —bwlimit (значение указывается в Кбит/с):
rsync -avzhHl --bwlimit=’100’ /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Опции include и exclude
Специальные опции —include и —exclude позволяют включать или исключать из синхронизации файлы с определенными именами:
rsync -avzhHl --include='.txt' --exclude='' /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Есть возможность перечислить включаемые или исключаемые имена в файле, для этого используются опции —include-from и —exclude-from соответственно:
rsync -avzhHl --include-from='/root/rsync_include.conf' --exclude='/root/rsync_exclude.conf' /path/of/source/folder root@192.168.56.1:/path/to/destination/folder
Пример использования Rsync для синхронизации с облачным хранилищем Selectel
В этом разделе покажем пример синхронизации. Rsync напрямую в облачное хранилище это делать не умеет, но есть один интересный способ. Для начала создадим контейнер в облачном хранилище Selectel. Для этого откроем панель управления my.selectel.ru, перейдем в меню Облачное хранилище и нажмем на кнопку Создать контейнер:
Зададим имя для контейнера и нажмем кнопку Создать контейнер:
Утилита Rsync умеет синхронизироваться по SSH с директориями или через демон Rsync. SSH-подключение к облачному хранилищу или установка в него Rsync невозможны. Один из вариантов доступа к облачному хранилищу — S3 API. В связи с этим есть возможность примонтировать его к файловой системе, чтобы обращаться как к локальному разделу. Чтобы реализовать такой подход, нам нужно установить и настроить специальную утилиту s3fs. Важно: для реализации сценария нужно использовать версию s3fs ниже 1.89.
Предварительно установим необходимые пакеты:
dnf -y install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
Далее перейдем в директорию /tmp, клонируем в нее репозиторий этой утилиты, скомпилируем ее и установим:
cd /tmp
git clone https://github.com/s3fs-fuse/s3fs-fuse.git
cd s3fs-fuse
./autogen.sh
./configure
make
make install
Теперь выполним подготовительные действия: создадим пользователя для доступа к облачному хранилищу Selectel, создадим в системе точку монтирования и примонтируем хранилище.
Чтобы создать пользователя облачного хранилища, перейдем в меню Пользователи и нажмем кнопку Создать пользователя:
Имя пользователя создается в формате НомерАккаунта_ИмяПользователя, например, 12345_rsync. Пароль можно сгенерировать в этом же меню. Обязательно нужно выбрать чекбокс Использовать эти данные для доступа по протоколу S3. Теперь можно нажимать кнопку Создать:
Сохраним имя пользователя и пароль в специальном файле и ограничим права на чтение:
echo : > ~/.passwd-s3fs
chmod 600 ~/.passwd-s3fs
Создадим точку монтирования и примонтируем к ней облачное хранилище при помощи утилиты s3fs:
mkdir /mnt/s3selectel
s3fs container /mnt/s3selectel -o passwd_file=~/.passwd-s3fs -o url=https://s3.selcdn.ru/ -o use_path_request_style -o dbglevel=info
Теперь можно проверить результат. Перейдем в директорию /mnt/selectel и попробуем создать там пустой файл:
cd /mnt/s3selectel
touch testfile.txt
В результате этот же файл мы увидим в интерфейсе панели управления:
Теперь все готово к работе утилиты Rsync. Уже знакомым способом, можно выполнить синхронизацию так, как будто мы работаем с локальной директорией:
rsync -avzhHl /mnt/s3selectel /tmp/share
В результате выполнения получим следующий вывод:
Таким образом, можно настроить синхронизацию выделенного сервера с облачным хранилищем Selectel или наоборот.
Заключение
Мы разобрали основные принципы работы утилиты Rsync и показали живой пример ее использования. Как вы смогли увидеть, она имеет множество преимуществ перед обычными для таких случаем SSH и SCP, например, не требует полного копирования файла в случае изменения его части и умеет передавать все метаданные вместе с файлом.