Установка, настройка и примеры синхронизации Rsync

В статье разберемся как установить и настроить утилиту Rsync, как она устроена и покажем как при помощи Rsync выполнить резервное копирование файлов в облачное хранилище Selectel.

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 --reload

Проверим статус сервиса 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, например, не требует полного копирования файла в случае изменения его части и умеет передавать все метаданные вместе с файлом.

Что еще почитать по теме

Кирилл Филипенко 14 сентября 2022

Увеличиваем FPS в аниме с помощью нейросети и GPU Tesla T4

Рассказываем про технологию интерполяции и ее практическое применение с помощью облачных серверов с GPU.
Кирилл Филипенко 14 сентября 2022
Ульяна Малышева 25 августа 2022

CDN против DDoS-атак: в каких случаях это действительно работает

Рассказываем про неочевидное преимущество CDN — услуга повышает безопасность инфраструктуры за счет защиты от DDoS-атак.
Ульяна Малышева 25 августа 2022
T-Rex 24 августа 2022

IT-инфраструктура организации: понятие, типы и функции

Рассказываем об IT-инфраструктуре предприятия и ее компонентах для малого, среднего и крупного бизнеса.
T-Rex 24 августа 2022

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022
T-Rex 28 сентября 2022

Книги по SQL: что почитать новичкам и специалистам

Собрали 6 книг, которые помогут на старте изучения SQL и при углублении в тему.
T-Rex 28 сентября 2022