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

Thank you for reading this post, don't forget to subscribe!

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

Исполь­зо­ва­ние Rsync Server поз­во­лит более тон­ко настро­ить рабо­ту ути­ли­ты и опти­ми­зи­ро­вать сам про­цесс синхронизации.

Не сто­ит путать резерв­ную копию с архи­вом. Если уда­лить важ­ный файл, при син­хро­ни­за­ции он так­же будет уда­лен на дру­гом устрой­стве. Для более кор­рект­но­го резер­ви­ро­ва­ния дан­ных, так­же сто­ит настро­ить их архивирование.

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

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

CentOS 7

yum install rsync

systemctl enable rsyncd

systemctl start rsyncd

Настройка

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

vi /etc/rsyncd.conf

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

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

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

  • max connections — мак­си­маль­ное чис­ло одно­вре­мен­ных под­клю­че­ний. Сто­ит задать, что­бы не пере­гру­жать сервер.
  • exclude — пап­ки, кото­рые сто­ит исклю­чить из син­хро­ни­за­ции. В кон­крет­ном при­ме­ре ката­лог для раз­ме­ще­ния вос­ста­нов­лен­ных после про­вер­ки дис­ка файлов.
  • dont compress — ука­зы­ва­ем, какие фай­лы не нуж­но сжи­мать при отправ­ке. Име­ет смысл ука­зать те, сжа­тие кото­рых не даст резуль­та­та, напри­мер, архи­вы, сжа­тые аудио и изображения.

а так­же каж­дый ресурс настра­и­ва­ет­ся отдель­но (в нашем при­ме­ре data1 и data2):

  • uid — поль­зо­ва­тель, от кото­ро­го будет выпол­не­на син­хро­ни­за­ция для кон­крет­но­го ресурса.
  • gid — груп­па, от кото­рой будет выпол­не­на син­хро­ни­за­ция для кон­крет­но­го ресурса.
  • path — путь до ресур­са, для кото­ро­го выпол­ня­ет­ся синхронизация.
  • comment — опи­са­ние для удобства.
  • read only — режим для чте­ния; поз­во­ля­ет защи­тить дан­ные от уда­ле­ния или изменения.
  • list — раз­ре­ша­ет или запре­ща­ет чте­ния содер­жи­мо­го ката­ло­га. Если запре­ще­но (no), син­хро­ни­за­ция может выпол­нять­ся для кон­крет­но пере­чис­лен­ных файлов.
  • auth users — про­вер­ка под­лин­но­сти, вво­дом логи­на с паролем.
  • secrets file — файл, в кото­ром раз­ме­ще­ны логин и пароль.
  • hosts allow — пере­чис­ле­ние хостов, с кото­рых раз­ре­ше­но обра­щать­ся к rsync серверу.
  • hosts deny — пере­чис­ле­ние хостов, с кото­рых запре­ще­но обра­щать­ся к rsync сер­ве­ру (в дан­ном при­ме­ре, со всех, кро­ме разрешенных).

Созда­ем файл для аутентификации:

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
/etc/init.d/rsync restart
service rsyncd restart

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

Firewalld:

firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload

Iptables:

iptables -I INPUT 1 -p tcp --dport 873 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT

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

Проверка на локальном компьютере

Сна­ча­ла выпол­ним сле­ду­ю­щую коман­ду на нашем сервере:

rsync -avv --progress rsync_d1@localhost::data1 /tmp/

* дан­ная коман­да выпол­нит син­хро­ни­за­цию наше­го ресур­са data1 с ката­ло­гом /tmp.

Проверка на удаленном компьютере

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

yum install rsync

apt-get install rsync

* пер­вая коман­да для CentOS, вто­рая — Ubuntu.

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

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

* где 192.168.0.5 — IP-адрес rsync сервера.

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

Скрипт доволь­но прост:

#!/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

* где:

  • password_file — пароль, в кото­ром будет хра­нить­ся пароль.
  • user — учет­ная запись для авторизации.
  • ip — IP-адрес сер­ве­ра rsync.
  • source — имя ресур­са на сервере.
  • destination — ката­лог, в кото­рый син­хро­ни­зи­ру­ем файлы.

После созда­ем файл с паролем:

vi /etc/rsyncd.scrt

password

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

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

chmod 600 /etc/rsyncd.scrt

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

crontab -e

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

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

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

Общий син­так­сис:

rsync <опции> <источ­ник> <назна­че­ние>

Спи­сок и опи­са­ние опций:

Ключ Опи­са­ние
-v, --verbose Вывод подроб­ной инфор­ма­ции о про­цес­се син­хро­ни­за­ции. Сто­ит исполь­зо­вать для отладки.
-q, --quiet Не выво­дит сооб­ще­ния об ошибках.
--no-motd Не выво­дит при­вет­ствие в MOTD
-c, --checksum Срав­ни­вать фай­лы по кон­троль­ной сум­ме, а не вре­ме­ни или размеру.
-a, --archive Режим архи­ви­ро­ва­ния или то же самое, что с клю­ча­ми -rlptgoD (без -H,-A,-X). Исполь­зу­ет­ся для удоб­ства, что­бы не пере­чис­лять мно­го опций.
--no-<опция> Отклю­ча­ет кон­крет­ную опцию, напри­мер, выше­опи­сан­ная no-motd.
-r, --recursive Рекур­сив­ный режим для каталогов.
-R, --relative Исполь­зо­вать отно­си­тель­ные пути.
--no-implied-dirs Выклю­чить пара­метр --relative.
-b, --backup Режим резерв­но­го копи­ро­ва­ния. С его помо­щью при обнов­ле­нии фай­лов в пап­ке назна­че­ния для них созда­ет­ся копия.
--backup-dir=<каталог> В режи­ме резерв­но­го копи­ро­ва­ния ука­зы­ва­ет ката­лог, в кото­ром будут хра­нить­ся копии.
--suffix=SUFFIX В режи­ме резерв­но­го копи­ро­ва­ния зада­ет суф­фикс для сохра­нен­ных файлов.
-u, --update Про­пус­кать фай­лы, кото­рые новее в пап­ке назна­че­ния (копи­ро­вать толь­ко изме­нен­ные файлы).
-d, --dirs Не исполь­зо­вать рекур­сию для каталогов.
-l, --links Копи­ро­вать сим­лин­ки как симлинки.
-L, --copy-links Копи­ро­вать не сим­линк а ее содер­жи­мое (транс­фор­ми­ро­вать сим­линк в каталог).
-k, --copy-dirlinks Пре­об­ра­зо­вать сим­линк на ката­лог в обыч­ный каталог.
-K, --keep-dirlinks В пап­ке назна­че­ния обра­ба­ты­вать сим­линк как каталог.
-H, --hard-links Сохра­нять жест­кие ссылки.
-p, --perms Сохра­нять раз­ре­ше­ния (пра­ва доступа).
-E, --executability Сохра­нить пра­ва на исполнение.
 --chmod=<права> Изме­нить пра­ва досту­па на конкретные.
-A, --acls Сохра­нить пра­ва ACL.
-X, --xattrs Сохра­нить атри­бу­ты файлов.
-o, --owner Сохра­нить вла­дель­ца (толь­ко от суперпользователя).
-g, --group Сохра­нить груп­пу владельца.
--devices Копи­ро­вать фай­лы-устрой­ства (раз­ре­ше­но толь­ко при выпол­не­нии коман­ды с пра­ва­ми суперпользователя).
--copy-devices Копи­ро­вать фай­лы устрой­ства как обыч­ные файлы.
--specials Сохра­нять спе­ци­аль­ные файлы.
-D Заме­ня­ет --devices и --specials одновременно.
-t, --times Сохра­нять вре­мен­ные отметки.
-S, --sparse Выпол­не­ние дефраг­мен­та­ции в момент копи­ро­ва­ния данных.
-n, --dry-run Режим тести­ро­ва­ния. Выпол­ня­ет­ся проб­ный запуск, при кото­ром будет пока­за­ны изме­не­ния, но сами изме­не­ния выпол­не­ны не будут.
-W, --whole-file Копи­ро­вать фай­лы цели­ком. По умол­ча­нию, для копи­ро­ва­ния фай­лов исполь­зу­ет­ся алго­ритм дель­та-хэфе­ра, кото­рый поз­во­ля­ет пере­но­сить толь­ко часть с изме­не­ни­я­ми. На прак­ти­ке, это силь­но уско­ря­ет про­цесс копи­ро­ва­ния. Ключ при­ме­ня­ет­ся в тех слу­ча­ях, когда нуж­но пере­не­сти файл целиком.
-x, --one-file-system Не раз­ре­ша­ет пере­хо­дить гра­ни­цы фай­ло­вой систе­мы. Напри­мер, если в один из син­хро­ни­зи­ру­е­мых ката­ло­гов может быть при­мон­ти­ро­ва­на сете­вая фай­ло­вая систе­ма, ее копи­ро­ва­ние может вызвать неудобства.
-B, --block-size=<размер> При­ну­ди­тель­но фик­си­ро­вать раз­мер бло­ка кон­троль­ной суммы
-e, --rsh=<команда> Ука­зать обо­лоч­ку для исполь­зо­ва­ния, напри­мер SSH.
--existing Не созда­вать новые фай­лы в ката­ло­ге назначения.
--ignore-existing Не обнов­лять суще­ству­ю­щие фай­лы в ката­ло­ге назначения.
--remove-source-files Источ­ник уда­ля­ет свои фай­лы после выпол­не­ния синхронизации.
--delete Уда­лить фай­лы в пап­ке назна­че­ния, если их боль­ше нет в пап­ке источ­ни­ке (уда­ле­ние ста­рых файлов).
--delete-before Уда­лить фай­лы в пап­ке назна­че­ния до нача­ла синхронизации.
--delete-during Уда­лить фай­лы в пап­ке назна­че­ния в момент синхронизации.
--delete-delay Поиск фай­лов на уда­ле­ние в момент син­хро­ни­за­ции, а уда­ле­ние после.
--delete-after Уда­лить фай­лы в пап­ке назна­че­ния после синхронизации.
--delete-excluded Уда­лить исклю­чен­ные из син­хро­ни­за­ции фай­лы в ката­ло­ге назначения.
--ignore-errors Уда­лять фай­лы даже при ошиб­ках ввода/вывода.
--force При­ну­ди­тель­ное уда­ле­ние не пустых каталогов.
--max-delete=<число> Не уда­лять боль­ше задан­но­го чис­ла файлов.
--max-size=<размер> Не пере­да­вать фай­лы с раз­ме­ром более заданного.
--min-size=<размер> Не пере­да­вать фай­лы с раз­ме­ром менее заданного.
--partial Остав­лять фай­лы, кото­рые пере­да­ны не до кон­ца (про­цесс копи­ро­ва­ния завер­шил­ся в процессе).
--partial-dir=<каталог> Хра­нить частич­но пере­дан­ные фай­лы в спе­ци­аль­ном каталоге.
--timeout=<секунды> Уста­но­вить вре­мя ожи­да­ния от систе­мы ввода/вывода.
--contimeout=<секунды> Уста­но­вить вре­мя ожи­да­ния для под­клю­че­ния к демо­ну rsync.
-I, --ignore-times Все рав­но копи­ро­вать фай­лы, если они име­ют оди­на­ко­вые раз­ме­ты или вре­мя изменения.
--size-only Не копи­ро­вать толь­ко те фай­лы, кото­рые име­ют оди­на­ко­вые размеры.
-T, --temp-dir=<каталог> Все вре­мен­ные фай­лы раз­ме­щать в опре­де­лен­ном каталоге.
-z, --compress Сжи­мать дан­ные фай­ла во вре­мя передачи
--compress-level=<число> Уста­нав­ли­ва­ет уро­вень сжа­тия от 0 до 9.
--skip-compress=<список> Не выпол­нять ком­прес­сию для пере­чис­лен­ных файлов.
-C, --cvs-exclude Исклю­чить от копи­ро­ва­ния фай­лы, кото­рые исклю­ча­ют­ся 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)
-f, --filter=<правило> Доба­вить пра­ви­ло для фильтра.
--exclude=<выражение> Исклю­чить из син­хро­ни­за­ции фай­лы, соот­вет­ству­ю­щие выражению.
--exclude-from=<файл> Исклю­чить из син­хро­ни­за­ции фай­лы, пере­чис­лен­ные в файле.
--include=<выражение> Вклю­чить в син­хро­ни­за­цию фай­лы, соот­вет­ству­ю­щие выражению.
--include-from=<файл> Вклю­чить в син­хро­ни­за­цию фай­лы, пере­чис­лен­ные в файле.
--files-from=<файл> Читать спи­сок имен исход­ных фай­лов из файла.
--address=<IP-адрес> При­вя­зать IP-адрес для исхо­дя­ще­го сокета.
--port=<порт> Исполь­зо­вать опре­де­лен­ный сете­вой порт.
--sockopts=OPTIONS Исполь­зо­вать спе­ци­аль­ные опции для TCP.
--blocking-io Исполь­зо­вать бло­ки­ру­ю­щий ввод-вывод для уда­лен­ной оболочки
--stats Вывод ста­ти­сти­ки по пере­да­че данных.
-h, --human-readable Вывод чисел в удоб­ном для чте­ния формате.
--progress Пока­зы­вать стро­ку про­грес­са для синхронизации.
-P То же самое, что --partial и --progress.
-i, --itemize-changes Выво­дить свод­ку изме­не­ний для всех обновлений
--log-file=<файл> Вывод лога в спе­ци­аль­ный файл.
--password-file=<файл> При аутен­ти­фи­ка­ции пароль мож­но хра­нить в спе­ци­аль­ном фай­ле. Это необ­хо­ди­мо для авто­ма­ти­за­ции выпол­не­ния коман­ды без пароля.
--list-only Пока­зать спи­сок фай­лов, но не копи­ро­вать их.
--bwlimit=<число> Огра­ни­чить про­пуск­ную спо­соб­ность (КБит в секунду).
--protocol=<число> При­ну­ди­тель­но исполь­зо­вать более ста­рую вер­сию протокола.
--iconv=<кодировка> Запрос коди­ров­ки пре­об­ра­зо­ва­ния имен файлов.
-4, --ipv4 Пред­по­чти­тель­но, исполь­зо­вать IPv4.
-6, --ipv6 Пред­по­чти­тель­но, исполь­зо­вать IPv6.
--version Вывод вер­сии rsync.
(-h) --help Вывод спра­воч­ной инфор­ма­ции по исполь­зо­ва­нию rsync.

* самый све­жий спи­сок клю­чей rsync мож­но посмот­реть коман­дой man rsync.

Rsync на Windows

Реа­ли­за­ция rsync для Windows носит назва­ние cwRsync (не явля­ет­ся ана­ло­гом про­грам­мы — по сути, это ути­ли­та Rsync + биб­лио­те­ка Cygwin). Ска­чать ее мож­но на офи­ци­аль­ном сай­те. Для загруз­ки доступ­ны плат­ная и бес­плат­ная вер­сии. Послед­няя не поз­во­лит под­нять Rsync-сер­вер, полу­чать под­держ­ку, обнов­ле­ния без­опас­но­сти и воз­мож­ность рабо­тать в гра­фи­че­ском интерфейсе.

Про­це­ду­ра исполь­зо­ва­ния кли­ен­та cwRsync ана­ло­гич­на опи­сан­но­му выше. Ска­чи­ва­ем архив про­грам­мы и рас­па­ко­вы­ва­ем его. Запус­ка­ем команд­ную стро­ку и пере­хо­дим в ката­лог bin (нахо­дит­ся в пап­ке, куда была рас­па­ко­ва­на программа).

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

rsync.exe -avv --progress admin@192.168.0.15::data1 /cygdrive/c/temp

* обра­ти­те вни­ма­ние на путь назна­че­ния — что­бы обра­тить­ся к дис­ку C мы напи­са­ли /cygdrive/c. Ито­го­вое назна­че­ние — C:\temp.

Копи­ро­ва­ние с помо­щью SSH:

rsync.exe -avv -e "./ssh -p 22" --progress admin@192.168.0.15:/data/ /cygdrive/c/temp

* обра­ти­те вни­ма­ние, что мы пишем не ssh, а ./ssh, ина­че, если мы исполь­зу­ем 64-х бит­ную систе­му и бес­плат­ный пакет cwRsync, систе­ма не най­дет путь до ssh и выдаст ошиб­ку Failed to exec ssh: No such file or directory.

Примеры использования rsync

Про­стая коман­да для син­хро­ни­за­ции двух каталогов:

rsync -a --delete-after user@192.168.0.15::data_source /data_destination

 

Коман­да для резерв­но­го копирования:

rsync -ab --delete-after user@192.168.0.15::data_source /data_destination

 

Выпол­не­ние син­хро­ни­за­ции по SSH:

rsync -a --delete-after -e "ssh -p 22" user@192.168.0.15:/data_source /data_destination

* по SSH запро­сы идут не через rsync server. В дан­ном при­ме­ре под­клю­че­ние будет выпол­не­но по 22 пор­ту, под учет­ной запи­сью user.

 

Копи­ро­ва­ние фай­лов на уда­лен­ную машину:

rsync -a --delete-after /data_destination user@192.168.0.15::data_source

 

Син­хро­ни­за­ция в обе сто­ро­ны (запус­ка­ем две коман­ды по очереди):

rsync -a --delete-after user@192.168.0.15::data_source /data_destination

rsync -a --delete-after /data_destination user@192.168.0.15::data_source

 

Син­хро­ни­за­ция фай­лов по маске:

rsync -a --include='*.txt' --exclude='*' user@192.168.0.15::data_source /data_destination

* в этом при­ме­ре будут син­хро­ни­зи­ро­ва­ны толь­ко фай­лы с рас­ши­ре­ни­ем txt.

 

Исклю­чить каталог:

rsync -a --exclude='folder/*' user@192.168.0.15::data_source /data_destination

Возможные проблемы

rsync: change_dir "/" failed: Permission denied

При­чи­на: нет прав на син­хро­ни­зи­ру­е­мые файлы.

Реше­ние: задать пра­виль­но­го поль­зо­ва­те­ля (uid) в настрой­ках ресур­са на сто­роне сервера.

rsync: failed to connect to x.x.x.x (x.x.x.x): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(122)

При­чи­на: не досту­пен уда­лен­ный хост.

Реше­ние: про­ве­рить, что хости досту­пен по сети. Про­ве­рить настрой­ку брандмауэра.