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

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

Тирекс
Тирекс Самый зубастый автор
4 февраля 2021

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