- Rsync через ssh
- Проверяем коннект ssh с паролем
- Готовим почву
- Запускаем rsync через ssh
- Настройка и использование Rsync Server
- Установка и запуск
- CentOS 8
- CentOS 7
- Ubuntu
- Настройка
- Запуск клиента
- Проверка на локальном компьютере
- Проверка на удаленном компьютере
- Пример готового скрипта для синхронизации папок
- Ключи запуска rsync
- Rsync на Windows
- Запуск в качестве сервера
- Запуск клиента
- Права на папки и файлы
- Примеры использования rsync
- Возможные проблемы
- rsync: change_dir «/» failed: Permission denied
- 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)
Rsync через ssh
У нас есть два сервера:
1) 1.1.1.1 — основной сервер (файлы, почта, что угодно иное), пользователь user1.
2) 2.2.2.2 — сервер, на котором хранятся резервные копии, пользователь user2.
Считаем, что раньше вы не настраивали доступ по ssh к серверам по ключам, а используете пароли. Заодно от паролей избавимся.
Идея: находясь на сервере 2.2.2.2, мы запускаем процесс копирования данных с основного сервера 1.1.1.1 (к себе, на 2.2.2.2).
Проверяем коннект ssh с паролем
Если мы с сервера 2.2.2.2 не сможем с паролем соединиться по ssh к 1.1.1.1, то дальше можно и не продолжать.
Готовим почву
На серверах установим rsync:
yum install xinetd rsync
Редактируем конфиг xinetd для rsync:
.
disable = no
# flags = IPv6
.
Создадим отдельного пользователя rsync без домашней директории и /sbin/nologin. Да, я люблю вместо общего nobody для важных задач создавать отдельных пользователей. Никогда не знаешь наперед, когда придется анализировать, что и где глючит.
Редактируем (создаем) минимальный конфиг rsync на сервере 1.1.1.1:
service xinetd restart
netstat -lnpt | grep 873
tcp 0 0 . 873 . * LISTEN 16269/xinetd
Ок, xinetd слушает порт rsync и при запросе запустит его.
На сервере 2.2.2.2 (с которого будем коннектится) сгенерируем сертификат для доступа без пароля:
/.ssh/id_rsa -q -P «» -b 4096
- -q — silense
- -f — имя файла ключа
- -P «» — пустой пароль
- -b 4096 — размер ключа, бит
Просмотрим публичный ключ, который надо будет скопировать на 1.1.1.1, куда будем впоследствии подсоединяться:
На сервере 1.1.1.1 (откуда будем копировать файлы).
Скопируем этот ключ на сервер 1.1.1.1, на который будем логиниться, в директорию пользователя user1, под которым будем логинитсья, в файл
Если директории .ssh на 1.1.1.1 не существует, создадим ее:
/.ssh/authorized_keys
chmod 0644
/.ssh/authorized_keys копируем содержимое публичного ключа, созданного на сервере 2.2.2.2 (файл id_rsa.pub) и перезапускаем sshd:
# service sshd restart
Все, мы готовы проверить соединение с 2.2.2.2 на 1.1.1.1 по ssh:
ssh -i /home/user2/.ssh/id_rsa -p 22 user1@1.1.1.1
Если соединение прошло, можно двигаться дальше. Если нет — надо обязательно понять, где проблема (firewall, ошибка copy/paste ключа, забыли restart sshd, что-то еще).
Запускаем rsync через ssh
Мы будем копировать файлы /data/* с сервера 1.1.1.1 на сервер 2.2.2.2 в папку /backup/.
Формат простой: rsync [опции] [откуда] [куда]
rsync -avz -e «ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null» —progress 1.1.1.1:/data/data.zip /backup/
rsync -avz -e «ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null» —progress user1@1.1.1.1:/data/* /backup/
rsync -avz -e «ssh -p 22» —progress user1@1.1.1.1:/data/* /backup/
-e «ssh . « — указываем, что хотим все передавать по ssh;
-p 22 — указываем порт, на котором работает ssh на сервере 1.1.1.1;
-a, —archive – архивный режим, включает рекурсивное копирование и сохранение прав и владельца;
-v — расширенный вывод;
-z — использовать компрессию данных;
user1 — локальный пользователь сервера 1.1.1.1, настроенный на логин по ssh по ключу.
Естественно, пользователь user1 должен иметь права доступа в /data/.
Вот и все. После копирования проверим, создался ли файл на сервере 2.2.2.2:
Настройка и использование Rsync Server
Утилита rsync позволяет синхронизировать содержимое двух каталогов как для локальной системы, так и удаленных серверов. Это может использоваться как для резервного копирования, так и поддержания в актуальном состоянии нод кластера.
Использование Rsync Server позволит более тонко настроить работу утилиты и оптимизировать сам процесс синхронизации.
Не стоит путать резервную копию с архивом. Если удалить важный файл, при синхронизации он также будет удален на другом устройстве. Для более корректного резервирования данных, также стоит настроить их архивирование.
Установка и запуск
По умолчанию, утилита может быть не установлена в системе. Установка и последующий запуск выполняются следующими командами.
CentOS 8
yum install rsync rsync-daemon
systemctl enable rsyncd —now
CentOS 7
yum install rsync
systemctl enable rsyncd —now
Ubuntu
apt-get install rsync
Открываем следующий файл:
Настройка
Открываем конфигурационный файл rsync:
И настраиваем его, примерно, следующим образом:
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 = *
где первая группа параметров являются общими настройками:
- 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 серверу (в данном примере, со всех, кроме разрешенных).
Создаем файл для аутентификации:
rsync_d1:password1
rsync_d2:password2
backup:password3
* где rsync_d1:password1 — соответственно, пользователь rsync_d1 с паролем password1.
В целях безопасности, устанавливаем доступ только для владельца:
chmod 600 /etc/rsyncd.scrt
Перезапускаем сервис одной из команд:
systemctl restart rsyncd
service rsyncd restart
Добавляем порты в брандмауэр.
firewall-cmd —permanent —add-port=873/tcp
firewall-cmd —permanent —add-port=22/tcp
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 сервера.
Пример готового скрипта для синхронизации папок
Скрипт довольно прост:
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 — каталог, в который синхронизируем файлы.
После создаем файл с паролем:
* в данном файле указываем только пароль без имени учетной записи.
После задаем права:
chmod 600 /etc/rsyncd.scrt
Автоматизировать синхронизацию можно с помощью CRON:
0 */1 * * * /scripts/syncing.sh
* где /scripts/syncing.sh — наш скрипт. В данном примере задание будет выполняться каждый час.
Ключи запуска 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-адрес для исходящего сокета. |
—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-сервер, получать поддержку, обновления безопасности и возможность работать в графическом интерфейсе.
Запуск в качестве сервера
Мы будем использовать бесплатную поставку для поднятия сервера. Переходим на страницу загрузки backuppc и дожидаемся скачивание архива. Создаем в корне системного диска папку, например, C:\Rsyncd, распаковываем содержимое загруженного архива в созданную папку.
Находим в корне содержимого файл rsyncd.conf и открываем его в блокноте. Добавляем следующие строки:
[data1]
path = /cygdrive/d/backup
read only = false
transfer logging = yes
[data2]
path = /cygdrive/d/Папки пользователей
read only = false
transfer logging = yes
strict modes = false
auth users = home
secrets file = /cygdrive/c/Rsyncd/rsyncd.secrets
* в данном примере мы создали группы настроек data1 для папки D:\backup и data2 для D:\Папки пользователей. Регистр важен! Для второй папке для синхронизации требуется аутентификация.
* синтаксис для настройки аналогичен описанному выше для Linux. Только пути пишутся, начиная с /cygdrive/ .
Регистрируем rsync в качестве службы — для этого открываем командную строку от администратора и выполняем команду:
c:\rsyncd\bin\cygrunsrv -I «RsyncServer» -p /cygdrive/c/rsyncd/bin/rsync.exe -a «—config=/cygdrive/c/rsyncd/rsyncd.conf —daemon —no-detach» -o -t auto -e «CYGWIN=nontsec binmode» -1 /cygdrive/c/rsyncd/rsyncd-stdin.log -2 /cygdrive/c/rsyncd/rsyncd-stderr.log -y tcpip -f «Rsync service»
* где c:\rsyncd или /cygdrive/c/rsyncd — каталог, куда мы распаковали скачанный архив.
Теперь открываем службы Windows, и находим зарегистрированную службу RsyncServer. Кликаем по ней правой кнопкой и выбираем Запустить:
Пробуем выполнить локальную синхронизацию. В командной строке переходим в каталог установки rsync:
rsync.exe -avv —progress 127.0.0.1::data1 /cygdrive/c/Temp
* данная команда синхронизирует содержимое модуля data1 (в нашей настройке это папка D:\backup) в папку C:\Temp (если ее нет, нужно создать перед выполнением команды).
Или в обратном направлении:
rsync.exe -avv —progress /cygdrive/c/Temp 127.0.0.1::data1
Запуск клиента
Процедура использования клиента cwRsync аналогична описанному выше для Linux. Скачиваем архив программы и распаковываем его. Запускаем командную строку и переходим в каталог 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 в Windows не умеет копировать права для файлов и папок. В результате, мы получим либо копию с неправильными ACL-правами, либо они будут назначены неправильно (права будут выданы по хаотичному алгоритму). Чтобы решить данную проблему после клонирования, можно воспользоваться утилитой robocopy — она входит в состав Windows, начиная с 7-ки.
Команда, которая позволит выполнить исправление прав:
robocopy c:\test d:\backup /MIR /SEC /SECFIX
* в данном примере мы возьмем папку c:\test в качестве источника и отзеркалируем его d:\backup. Ранее скопированные данные не будут копироваться вновь, но будут исправлены права.
Примеры использования 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)
Причина: не доступен удаленный хост.
Решение: проверить, что хости доступен по сети. Проверить настройку брандмауэра.