# Rsync Server

### Настройка и использование Rsync Server

Утилита rsync позволяет синхронизировать содержимое двух каталогов как для локальной системы, так и удаленных серверов. Это может использоваться как для резервного копирования, так и поддержания в актуальном состоянии нод кластера.

## Установка и запуск

По умолчанию, утилита может бытьне установлена в системе. Установка и последующий запуск выполняются следующими командами.

```
apt-get install rsync
```

Открываем следующий файл:

```
vi /etc/default/rsync
```

Находим запись:

```
RSYNC_ENABLE=false
```

И меняем на:

```
RSYNC_ENABLE=true
```

### Настройка

Открываем конфигурационный файл rsync:

```
vi /etc/rsyncd.conf
```

И настраиваем его, примерно, следующим образом:

```
max connections = 10
exclude = lost+found/
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar *.7z *.mp3 *.jpg
 

[data1]
    path = /data1/
    comment = Public folders
    read only = yes
    list = yes
    auth users = rsync_d1
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.15 192.168.0.20
    hosts deny = *
 

[data2]
    uid = root
    gid = root
    path = /data2/
    comment = Private folders
    read only = yes
    list = yes
    auth users = rsync_d2, backup
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.16 192.168.0.21
    hosts deny = *
```

Где первая группа параметров являются общими настройками:

<div class="level3" id="bkmrk-max-connections%C2%A0%E2%80%94-%D0%BC%D0%B0"><div class="level3">- <div class="li">**max connections** — максимальное число одновременных подключений. Стоит задать, чтобы не перегружать сервер.</div>
- <div class="li">**exclude** — папки, которые стоит исключить из синхронизации. В конкретном примере каталог для размещения восстановленных после проверки диска файлов.</div>
- <div class="li">**dont compress** — указываем, какие файлы не нужно сжимать при отправке. Имеет смысл указать те, сжатие которых не даст результата, например, архивы, сжатые аудио и изображения.</div>

</div></div>А также каждый ресурс настраивается отдельно (в нашем примере **data1** и **data2**):

<div class="level3" id="bkmrk-uid%C2%A0%E2%80%94-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%2C-"><div class="level3">- <div class="li">**uid** — пользователь, от которого будет выполнена синхронизация для конкретного ресурса.</div>
- <div class="li">**gid** — группа, от которой будет выполнена синхронизация для конкретного ресурса.</div>
- <div class="li">**path** — путь до ресурса, для которого выполняется синхронизация.</div>
- <div class="li">**comment** — описание для удобства.</div>
- <div class="li">**read only** — режим для чтения; позволяет защитить данные от удаления или изменения.</div>
- <div class="li">**list** — разрешает или запрещает чтения содержимого каталога. Если запрещено (no), синхронизация может выполняться для конкретно перечисленных файлов.</div>
- <div class="li">**auth users** — проверка подлинности, вводом логина с паролем.</div>
- <div class="li">**secrets file** — файл, в котором размещены логин и пароль.</div>
- <div class="li">**hosts allow** — перечисление хостов, с которых разрешено обращаться к rsync серверу.</div>
- <div class="li">**hosts deny** — перечисление хостов, с которых запрещено обращаться к rsync серверу (в данном примере, со всех, кроме разрешенных).</div>

</div></div>Создаем файл для аутентификации:

```
vi /etc/rsyncd.scrt
```

```
rsync_d1:password1
rsync_d2:password2
backup:password3
```

Где **rsync\_d1:password1** — соответственно, пользователь **rsync\_d1** с паролем **password1**.

В целях безопасности, устанавливаем доступ только для владельца:

```
chmod 600 /etc/rsyncd.scrt
```

Перезапускаем сервис:

```
systemctl restart rsyncd
```

Добавляем порты в брандмауэр.

### Запуск клиента

Устанавливаем rsync, если еще не установлен:

```
apt-get install rsync
```

Запускаем синхронизацию:

```
rsync -avv rsync_d1@192.168.0.5::data1 /tmp/
```

<div class="level3" id="bkmrk-%D0%B3%D0%B4%D0%B5-192.168.0.5-%E2%80%94-ip">- <div class="li">где 192.168.0.5 — IP-адрес rsync сервера.</div>

</div>#### Пример готового скрипта для синхронизации папок

```
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

password_file='/etc/rsyncd.scrt'
user='opros'
ip='192.168.0.15'
source='data1'
destination='/tmp/'

rsync -a --delete-after --password-file=$password_file $user@$ip::$source $destination
```

\* где:

<div class="level4" id="bkmrk-password_file%C2%A0%E2%80%94-%D0%BF%D0%B0%D1%80%D0%BE"><div class="level4">- <div class="li">**password\_file** — пароль, в котором будет храниться пароль.</div>
- <div class="li">**user** — учетная запись для авторизации.</div>
- <div class="li">**ip** — IP-адрес сервера rsync.</div>
- <div class="li">**source** — имя ресурса на сервере.</div>
- <div class="li">**destination** — каталог, в который синхронизируем файлы.</div>

</div></div>После создаем файл с паролем:

```
vi /etc/rsyncd.scrt
```

```
password
```

\* в данном файле указываем только пароль без имени учетной записи.

После задаем права:

```
chmod 600 /etc/rsyncd.scrt
```

Автоматизировать синхронизацию можно с помощью CRON:

```
crontab -e
```

```
0 */1 * * * /scripts/syncing.sh
```

\* где /scripts/syncing.sh — наш скрипт. В данном примере задание будет выполняться каждый час.

### Ключи запуска rsync

<div class="level3" id="bkmrk-%D0%9A%D0%BB%D1%8E%D1%87-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5--v%2C-%E2%80%93v"><div class="level3"><div class="table-responsive"><table class="inline table table-striped table-condensed"><thead><tr class="row0"><th class="col0 leftalign">Ключ</th><th class="col1">Описание</th></tr></thead><tbody><tr class="row1"><td class="col0">-v, –verbose</td><td class="col1">Вывод подробной информации о процессе синхронизации. Стоит использовать для отладки.</td></tr><tr class="row2"><td class="col0">-q, –quiet</td><td class="col1">Не выводит сообщения об ошибках.</td></tr><tr class="row3"><td class="col0">–no-motd</td><td class="col1">Не выводит приветствие в MOTD</td></tr><tr class="row4"><td class="col0">-c, –checksum</td><td class="col1">Сравнивать файлы по контрольной сумме, а не времени или размеру.</td></tr><tr class="row5"><td class="col0">-a, –archive</td><td class="col1">Режим архивирования или то же самое, что с ключами -rlptgoD (без -H,-A,-X). Используется для удобства, чтобы не перечислять много опций.</td></tr><tr class="row6"><td class="col0">–no-&lt;опция&gt;</td><td class="col1">Отключает конкретную опцию, например, вышеописанная no-motd.</td></tr><tr class="row7"><td class="col0">-r, –recursive</td><td class="col1">Рекурсивный режим для каталогов.</td></tr><tr class="row8"><td class="col0">-R, –relative</td><td class="col1">Использовать относительные пути.</td></tr><tr class="row9"><td class="col0">–no-implied-dirs</td><td class="col1">Выключить параметр –relative.</td></tr><tr class="row10"><td class="col0">-b, –backup</td><td class="col1">Режим резервного копирования. С его помощью при обновлении файлов в папке назначения для них создается копия.</td></tr><tr class="row11"><td class="col0">–backup-dir=&lt;каталог&gt;</td><td class="col1">В режиме резервного копирования указывает каталог, в котором будут храниться копии.</td></tr><tr class="row12"><td class="col0">–suffix=SUFFIX</td><td class="col1">В режиме резервного копирования задает суффикс для сохраненных файлов</td></tr><tr class="row13"><td class="col0">-u, –update</td><td class="col1">Пропускать файлы, которые новее в папке назначения (копировать только измененные файлы).</td></tr><tr class="row14"><td class="col0">-d, –dirs</td><td class="col1">Не использовать рекурсию для каталогов.</td></tr><tr class="row15"><td class="col0">-l, –links</td><td class="col1">Копировать симлинки как симлинки.</td></tr><tr class="row16"><td class="col0">-L, –copy-links</td><td class="col1">Копировать не симлинк а ее содержимое (трансформировать симлинк в каталог).</td></tr><tr class="row17"><td class="col0">-k, –copy-dirlinks</td><td class="col1">Преобразовать симлинк на каталог в обычный каталог.</td></tr><tr class="row18"><td class="col0">-K, –keep-dirlinks</td><td class="col1">В папке назначения обрабатывать симлинк как каталог.</td></tr><tr class="row19"><td class="col0">-H, –hard-links</td><td class="col1">Сохранять жесткие ссылки.</td></tr><tr class="row20"><td class="col0">-p, –perms</td><td class="col1">Сохранять разрешения (права доступа).</td></tr><tr class="row21"><td class="col0">-E, –executability</td><td class="col1">Сохранить права на исполнение.</td></tr><tr class="row22"><td class="col0">–chmod=&lt;права&gt;</td><td class="col1">Изменить права доступа на конкретные.</td></tr><tr class="row23"><td class="col0">-A, –acls</td><td class="col1">Сохранить права <abbr data-original-title="Access Control List" title="">ACL</abbr>.</td></tr><tr class="row24"><td class="col0">-X, –xattrs</td><td class="col1">Сохранить атрибуты файлов.</td></tr><tr class="row25"><td class="col0">-o, –owner</td><td class="col1">Сохранить владельца (только от суперпользователя).</td></tr><tr class="row26"><td class="col0">-g, –group</td><td class="col1">Сохранить группу владельца.</td></tr><tr class="row27"><td class="col0">–devices</td><td class="col1">Копировать файлы-устройства (разрешено только при выполнении команды с правами суперпользователя).</td></tr><tr class="row28"><td class="col0">–copy-devices</td><td class="col1">Копировать файлы устройства как обычные файлы.</td></tr><tr class="row29"><td class="col0">–specials</td><td class="col1">Сохранять специальные файлы.</td></tr><tr class="row30"><td class="col0">-D</td><td class="col1">Заменяет –devices и –specials одновременно.</td></tr><tr class="row31"><td class="col0">-t, –times</td><td class="col1">Сохранять временные отметки.</td></tr><tr class="row32"><td class="col0">-S, –sparse</td><td class="col1">Выполнение дефрагментации в момент копирования данных.</td></tr><tr class="row33"><td class="col0">-n, –dry-run</td><td class="col1">Режим тестирования. Выполняется пробный запуск, при котором будет показаны изменения, но сами изменения выполнены не будут.</td></tr><tr class="row34"><td class="col0">-W, –whole-file</td><td class="col1">Копировать файлы целиком. По умолчанию, для копирования файлов используется алгоритм дельта-хэфера, который позволяет переносить только часть с изменениями. На практике, это сильно ускоряет процесс копирования. Ключ применяется в тех случаях, когда нужно перенести файл целиком.</td></tr><tr class="row35"><td class="col0">-x, –one-file-system</td><td class="col1">Не разрешает переходить границы файловой системы. Например, если в один из синхронизируемых каталогов может быть примонтирована сетевая файловая система, ее копирование может вызвать неудобства.</td></tr><tr class="row36"><td class="col0">-B, –block-size=&lt;размер&gt;</td><td class="col1">Принудительно фиксировать размер блока контрольной суммы</td></tr><tr class="row37"><td class="col0">-e, –rsh=&lt;команда&gt;</td><td class="col1">Указать оболочку для использования, например SSH.</td></tr><tr class="row38"><td class="col0">–existing</td><td class="col1">Не создавать новые файлы в каталоге назначения.</td></tr><tr class="row39"><td class="col0">–ignore-existing</td><td class="col1">Не обновлять существующие файлы в каталоге назначения.</td></tr><tr class="row40"><td class="col0">–remove-source-files</td><td class="col1">Источник удаляет свои файлы после выполнения синхронизации.</td></tr><tr class="row41"><td class="col0">–delete</td><td class="col1">Удалить файлы в папке назначения, если их больше нет в папке источнике (удаление старых файлов).</td></tr><tr class="row42"><td class="col0">–delete-before</td><td class="col1">Удалить файлы в папке назначения до начала синхронизации.</td></tr><tr class="row43"><td class="col0">–delete-during</td><td class="col1">Удалить файлы в папке назначения в момент синхронизации.</td></tr><tr class="row44"><td class="col0">–delete-delay</td><td class="col1">Поиск файлов на удаление в момент синхронизации, а удаление после.</td></tr><tr class="row45"><td class="col0">–delete-after</td><td class="col1">Удалить файлы в папке назначения после синхронизации.</td></tr><tr class="row46"><td class="col0">–delete-excluded</td><td class="col1">Удалить исключенные из синхронизации файлы в каталоге назначения.</td></tr><tr class="row47"><td class="col0">–ignore-errors</td><td class="col1">Удалять файлы даже при ошибках ввода/вывода.</td></tr><tr class="row48"><td class="col0">–force</td><td class="col1">Принудительное удаление не пустых каталогов.</td></tr><tr class="row49"><td class="col0">–max-delete=&lt;число&gt;</td><td class="col1">Не удалять больше заданного числа файлов.</td></tr><tr class="row50"><td class="col0">–max-size=&lt;размер&gt;</td><td class="col1">Не передавать файлы с размером более заданного.</td></tr><tr class="row51"><td class="col0">–min-size=&lt;размер&gt;</td><td class="col1">Не передавать файлы с размером менее заданного.</td></tr><tr class="row52"><td class="col0">–partial</td><td class="col1">Оставлять файлы, которые переданы не до конца (процесс копирования завершился в процессе).</td></tr><tr class="row53"><td class="col0">–partial-dir=&lt;каталог&gt;</td><td class="col1">Хранить частично переданные файлы в специальном каталоге.</td></tr><tr class="row54"><td class="col0">–timeout=&lt;секунды&gt;</td><td class="col1">Установить время ожидания от системы ввода/вывода.</td></tr><tr class="row55"><td class="col0">–contimeout=&lt;секунды&gt;</td><td class="col1">Установить время ожидания для подключения к демону rsync.</td></tr><tr class="row56"><td class="col0">-I, –ignore-times</td><td class="col1">Все равно копировать файлы, если они имеют одинаковые разметы или время изменения.</td></tr><tr class="row57"><td class="col0">–size-only</td><td class="col1">Не копировать только те файлы, которые имеют одинаковые размеры.</td></tr><tr class="row58"><td class="col0">-T, –temp-dir=&lt;каталог&gt;</td><td class="col1">Все временные файлы размещать в определенном каталоге.</td></tr><tr class="row59"><td class="col0">-z, –compress</td><td class="col1">Сжимать данные файла во время передачи</td></tr><tr class="row60"><td class="col0">–compress-level=&lt;число&gt;</td><td class="col1">Устанавливает уровень сжатия от 0 до 9.</td></tr><tr class="row61"><td class="col0">–skip-compress=&lt;список&gt;</td><td class="col1">Не выполнять компрессию для перечисленных файлов.</td></tr><tr class="row62"><td class="col0">-C, –cvs-exclude</td><td class="col1">Исключить от копирования файлы, которые исключаются CVS (RCS/ SCCS/ CVS/ .svn/ CVS.adm RCSLOG cvslog.\* tags TAGS .make.state .nse\_depinfo \*~ #\* .#\* ,\* \*.old \*.bak \*.BAK \*.orig \*.rej .del-\* \*.a \*.o \*.obj \*.so \*.Z \*.elc \*.ln core)</td></tr><tr class="row63"><td class="col0">-f, –filter=&lt;правило&gt;</td><td class="col1">Добавить правило для фильтра.</td></tr><tr class="row64"><td class="col0">–exclude=&lt;выражение&gt;</td><td class="col1">Исключить из синхронизации файлы, соответствующие выражению.</td></tr><tr class="row65"><td class="col0">–exclude-from=&lt;файл&gt;</td><td class="col1">Исключить из синхронизации файлы, перечисленные в файле.</td></tr><tr class="row66"><td class="col0">–include=&lt;выражение&gt;</td><td class="col1">Включить в синхронизацию файлы, соответствующие выражению.</td></tr><tr class="row67"><td class="col0">–include-from=&lt;файл&gt;</td><td class="col1">Включить в синхронизацию файлы, перечисленные в файле.</td></tr><tr class="row68"><td class="col0">–files-from=&lt;файл&gt;</td><td class="col1">Читать список имен исходных файлов из файла.</td></tr><tr class="row69"><td class="col0">–address=&lt;IP-адрес&gt;</td><td class="col1">Привязать IP-адрес для исходящего сокета.</td></tr><tr class="row70"><td class="col0">–port=&lt;порт&gt;</td><td class="col1">Использовать определенный сетевой порт.</td></tr><tr class="row71"><td class="col0">–sockopts=OPTIONS</td><td class="col1">Использовать специальные опции для TCP.</td></tr><tr class="row72"><td class="col0">–blocking-io</td><td class="col1">Использовать блокирующий ввод-вывод для удаленной оболочки</td></tr><tr class="row73"><td class="col0">–stats</td><td class="col1">Вывод статистики по передаче данных.</td></tr><tr class="row74"><td class="col0">-h, –human-readable</td><td class="col1">Вывод чисел в удобном для чтения формате.</td></tr><tr class="row75"><td class="col0">–progress</td><td class="col1">Показывать строку прогресса для синхронизации.</td></tr><tr class="row76"><td class="col0">-P</td><td class="col1">То же самое, что –partial и –progress.</td></tr><tr class="row77"><td class="col0">-i, –itemize-changes</td><td class="col1">Выводить сводку изменений для всех обновлений</td></tr><tr class="row78"><td class="col0">–log-file=&lt;файл&gt;</td><td class="col1">Вывод лога в специальный файл.</td></tr><tr class="row79"><td class="col0">–password-file=&lt;файл&gt;</td><td class="col1">При аутентификации пароль можно хранить в специальном файле. Это необходимо для автоматизации выполнения команды без пароля.</td></tr><tr class="row80"><td class="col0">–list-only</td><td class="col1">Показать список файлов, но не копировать их.</td></tr><tr class="row81"><td class="col0">–bwlimit=&lt;число&gt;</td><td class="col1">Ограничить пропускную способность (КБит в секунду).</td></tr><tr class="row82"><td class="col0">–protocol=&lt;число&gt;</td><td class="col1">Принудительно использовать более старую версию протокола.</td></tr><tr class="row83"><td class="col0">–iconv=&lt;кодировка&gt;</td><td class="col1">Запрос кодировки преобразования имен файлов.</td></tr><tr class="row84"><td class="col0">-4, –ipv4</td><td class="col1">Предпочтительно, использовать IPv4.</td></tr><tr class="row85"><td class="col0">-6, –ipv6</td><td class="col1">Предпочтительно, использовать IPv6.</td></tr><tr class="row86"><td class="col0">–version</td><td class="col1">Вывод версии rsync.</td></tr><tr class="row87"><td class="col0">(-h) –help</td><td class="col1">Вывод справочной информации по использованию rsync.</td></tr></tbody></table>

</div></div></div>\* Самый свежий список ключей rsync можно посмотреть командой man rsync.