RSync это быстрый и чрезвычайно универсальный инструмент для синхронизации (копирования) файлов. Его самое основное преимущество это передача только изменившиеся части файла, а не файла целиком, что несомненно отражается на скорости копирования/синхронизации. А если при копировании произойдет какой-то сбой, то достаточно перезапустить команду и копирование будет продолжено с того же места.
RSync может копировать файлы локально на компьютере, с локальной машины на удаленную (к примеру на сервер) и наоборот. Этот инструмент очень удобно использовать для создания резервных копий своих файлов, так как имеет большое обилие опций и экономно пользуется ресурсами системы.
Сам сервис работает на SSH протоколе по умолчанию, но может работать и на собственном протоколе rsyncd, но обо всем по порядку.
Установка
По умолчанию rsync есть не везде, поэтому если вы получили ошибку «bash: rsync: command not found» — значит его нужно установить (как на локальной, так и на удаленной машине):
# для debian apt install rsync # для centos yum install rsync
Базовый синтаксис
rsync <опции> <что копируем с компьютера> <пользователь@хост:/куда_копируем>
Основные опции RSync
Ниже перечислены только основные опции, которые чаще всего помогали в работе. Я попытался разделить их на некоторые подгруппы для удобства их использования.
Базовые опции:
-n, --dry-run – что-то типа тестового режима, указывает не осуществлять никаких передач, а только сообщать о тех действиях, которые могли бы произойти. -a, --archive – архивный режим, включает рекурсивное копирование и сохранение прав и владельца (эта опция включает в себя опции rlptgoD, они будут описаны следующими). Учтите, эта опция не сохраняет жесткие ссылки. -r, --recursive – рекурсивный режим (копирование всех директорий и файлов в них). -l, --links – копировать символьные ссылки как символьные ссылки. -p, --perms – сохранять права для файлов. Без указания этой опции каждый новый файл получает те права доступа, что имеет исходный с учетом umask, действующей на приемной стороне, в то время как все другие (включая обновляемые) сохраняют свои уже существующие разрешения (это то же поведение, что имеют другие утилиты копирования файлов, такие как cp). -t, --times – обновлять время модификации файла на приёмной стороне (при отсутствии этой опции или -a становиться неэффективной оптимизация передачи по времени изменения файлов). -g, --group – сохранять группу пользователя. Если удаленная сторона не действует из-под супер-пользователя, то сохранятся только те значения групп, членом которых является пользователь приемной стороны, т.е. имеет значение имя группы, а не ее id. -o, --owner – сохранять владельца на приемной стороне в точности с оригиналом. На большинстве систем только супер-пользователь имеет право устанавливать владельца файла. Нужно заметить, что если удаленный демон действует в chroot-окружении, то подразумевается наличие параметра --numeric-ids (он описан ниже), потому что на удаленной стороне в этом случае нет доступа к именам пользователей в /etc/passwd. -D, --devices – сохранять файлы устройств (root only).
Работа с файлами:
-u, --update – не перезаписывать более новые файлы: указывает пропускать любые файлы, уже существующие на приемной стороне с более поздней датой, чем у исходных файлов. --delete – удалять файлы, которых нет в источнике (полезно для создания точной копии). --ignore-errors – продолжать копирование и удаление после появления ошибок (При удалении (--delete) форсирует процесс и игнорирует любые ошибки, даже ошибки ввода-вывода.) --exclude – исключить файлы (подробно описано ниже). --include – не исключать файлы (подробно описано ниже). -F – опция которая заставляет искать файл .rsync-filter, в котором настраиваются фильтры (exclude/include). Если опция указана дважды то будет исключен и сам файл .rsync-filter. -x, --one-file-system – не переходить границ файловой системы при рекурсивном копировании. Это полезно при необходимости копирования только одной файловой системы. -R, --relative – использовать относительные пути при создании символических ссылок. Это значит, что посылаются полные пути, указанные в командной строке, а не последние части имен файлов. На практике это полезно, когда Вам нужно послать несколько различных каталогов за раз. -H, --hard-links – пересоздать жесткие ссылки на конечной стороне в соответствии с тем, что имеется на исходной. Без этого параметра жесткие ссылки обрабатываются как обычные файлы. -L, --copy-links – Если обнаружена символьная ссылка, то на приемную сторону копируется файл, на который она указывает, а не такая же символьная ссылка. --numeric-ids – не транслировать имена владельца и группы в цифровые UID и GID, оставить на удалённой стороне номера как есть. Вместо имен групп и пользователей посылаются их числовые id и ставятся в соответствие друг другу на обоих концах. По умолчанию rsync использует имена групп и пользователей для определения владельца файлов. Специальные uid 0 и gid 0 никогда не отображаются через имена пользователей/групп, даже если не указана --numeric-ids. Если исходная система работает в ограниченном chroot-окружении или если пользователь или группа не существуют на приемной стороне, то используются исходные числовые id. -m, --prune-empty-dirs – не копировать пустые директории.
Настройка синхронизации/подключения/передачи файлов:
-c, --checksum – использование сверки по контрольным суммам, а не по времени изменения и размеру файлов. --size-only – сверять только размер файлов (по умолчанию проверяется размер и время модификации). -z, --compress – компрессия данных при передаче (реализуется gzip). -e,--rsh="command" – опция позволяет выбрать альтернативный протокол подключения между удаленной и локальной машинами. --max-size – максимальный размер файла для передачи. --bwlimit — ограничение скорости для передачи файлов (Kbit/s). --partial – По умолчанию rsync будет удалять все частично-переданные файлы в случае сбоя передачи. Если этот параметр указан, то rsync будет сохранять частично-переданные файлы, что может сократить время копирования при повторном запуске. -P – данная опция включает в себя опцию --partial и --progress.
Отображение/результат:
--progress – выводить прогресс передачи файлов. --stat – показать статистику передачи. -v, --verbose – вывести подробную информацию о процессе: один -v будет выдавать список переданных файлов и итог в конце, два -v выдает детали о пропущенных файлах и более подробный итог, больше -v полезно для отладки. -q, --quiet – минимальная информация.
Опции полезные для создания инкрементальных резервных копий:
-b, --backup – создавать резервные копии ранее существовавших файлов до начала копирования на принимающей стороне. По умолчанию файлам добавляется суффикс ~, а если указана директория (--backup-dir), то суффикс не добавляется. --backup-dir=.. – указывает каталог, куда сохранять резервные копии. --suffix=.. – опция позволяет указать свой суффикс.
Теперь пройдемся по базовым примерам.
Как скопировать/синхронизировать файлы у себя на компьютере
Вот так:
rsync -av /home/user/Downloads/files/ /home/user/Downloads/copyfiles
Данная команда копирует файлы (т.е. содержимое) из каталога /home/user/Downloads/TEMP/files/ в каталог /home/user/Downloads/TEMP/copyfiles.
Важный момент:
- если в конце пути до источника (каталога) нет слэша, то будет скопирован сам каталог (в примере выше это files).
- если слэш указан, то будет скопировано содержимое каталога (т.е. то, что внутри files, из примера выше)
В случае необходимости скопировать несколько каталогов и файлов за раз в каталог, которого еще не существует, можно выполнить эту команду:
rsync -av ./2021 ./logo.svg.png ./copy2021 ./copydir
Находясь в нужном каталоге, мы скопировали каталог 2021, файл logo.svg.png и еще один каталог copy2021 в несуществующий ранее каталог copydir.
Вот как это выглядит наглядно:
rsync -av ./2021 ./logo.svg.png ./copy2021 ./copydir sending incremental file list created directory ./copydir logo.svg.png 2021/ 2021/filefromsrv 2021/filestorage.png 2021/login.png 2021/mainweb.png 2021/motiondetection.png 2021/motioneye-movies.png 2021/motioneye-recordetmovies.png copy2021/ copy2021/just-file.txt sent 723,033 bytes received 349 bytes 1,446,764.00 bytes/sec total size is 721,629 speedup is 1.00
Получается это не плохая альтернатива cp
Как скопировать/синхронизировать с компьютера на удаленный сервер
Вот так
Важно указывать полный путь на удаленном сервере, иначе rsync попытается скопировать каталог «2021» в корень удаленного сервера.
Еще важно указывать полный путь до удаленного сервера, так как, к примеру, копируя файл «file.txt» на сервер указав путь /home/user/somedir, каталог somedir не будет создан, вместо этого файл file.txt скопируется на сервер под именем somedir. Чтобы избежать этого используйте путь полный путь /home/user/somedir/.
Если мы хотим немного сжать файлы при передачи (к примеру у нас медленный интернет), можно использовать ключ -z:
Но важно понимать, что сжатие имеет смысл использовать там где это нужно, так как в новых версиях ssh уже использует сжатие передаваемых данных, тратить ресурсы CPU не стоит, особенно на слабых машинах или NAS серверах.
Как скопировать/синхронизировать с удаленного сервера на компьютер
Вот так:
В данном примере мы копируем файл filefromsrv в каталог, в котором находимся.
Как указать другой порт ssh и ключ?
С помощью опции -e (она же —rsh). Вот как скопировать файл с компьютера на сервер у которого не стандартный ssh порт:
А вот как можно указать ключ авторизации и порт:
rsync -av -e "ssh -p 2013 -i ~/.ssh/id_rsa" ./filefromsrv [email protected]:/home/user/mydir/
Кстати, если мы настроим ssh алиас, то мы можем копировать файлы не указывая лишних ключей.
Пример конфига:
$ cat ~/.ssh/config Host srv HostName 10.10.20.7 Port 2013 User user
Пример команды:
rsync -av ./filefromsrv srv:/home/user/somedir/
Я хочу видеть прогресс копирования/синхронизации
Стоит иметь в виду, что по умолчанию rsync копирует файлы без какого-либо вывода.
В примерах выше я использую ключ -v для того, чтобы видеть какие файлы были скопированы и получить некий отчет о проделанных действиях. Вот пример:
rsync -av ./somedir [email protected]:/home/leo/ sending incremental file list somedir/ somedir/Screenshot from 2021-01-22 17-42-17.png somedir/Screenshot from 2021-01-24 02-17-17.png sent 1,996,838 bytes received 58 bytes 3,993,792.00 bytes/sec total size is 2,041,319 speedup is 1.02
Если мы хотим видеть наиболее интересный вывод, то нам в этом поможет ключ —progress. Вот пример:
rsync -aP ./somedir [email protected]:/home/user/ sending incremental file list somedir/ somedir/Screenshot from 2021-01-22 17-42-17.png 194,291 100% 51.35MB/s 0:00:00 (xfr#1, to-chk=1/3) somedir/Screenshot from 2021-01-24 02-17-17.png 1,847,028 100% 21.22MB/s 0:00:00 (xfr#2, to-chk=0/3)
Некоторые могут советовать ключ -P, но имейте в виду, -P включает в себя ключ —partial и —progress одновременно (что в целом не так страшно).
Как ограничить скорость передачи файлов?
Нужно указать опцию —bwlimit=SPEED, где SPEED это скорость в Кбайт в секунду:
Полезно бывает на слабом интернете с большими файлами.
Как исключить некоторые файлы или включить определенный тип файлов?
В rsync можно создавать достаточно гибкие исключения, например, делая резервную копию домашней директории на linux мы не ходим копировать разный кеш или содержимое корзины. Вот пример, в котором я исключаю две директории:
rsync -av --exclude={'user/.local/share/Trash','user/.cache'} /home/user [email protected]:/home/user/bkp/
Конечно можно указать одну директорию:
Еще мы можем исключить файлы с определенным расширением:
Саму опцию мы можем использовать несколько раз:
rsync -av --exclude="*.tmp" --exclude="tmp/*" --exclude="*~" /var/www/site [email protected]:/home/user/bkp/
Для копирования определенного типа файлов (да и не только) мы можем использовать опцию —include. Используется она точно так же, как и exclude. Вот пример, в котором я загружаю на сервер только все файлы с расширением .sql:
Исключения с помощью .rsync-filter
Для более гибкой настройки копирования (в случае регулярного копирования это будет очень полезно) все исключения/включения можно оформить в файле .rsync-filter (это появилось в более поздних версиях rsync).
Попробую объяснить подробно на примере, как и что мы можем исключать (спасибо этому блогу за хорошее описание).
Допустим, у меня есть такой каталог (somedir), в котором я хочу исключить (красная стрелка) или оставить (зеленая стрелка) некоторые файлы/каталоги:
Ниже приведен один из примеров настройки исключений в файле .rsync-filter с комментариями:
cat .rsync-filter # исключаем только каталог .cache (не будут исключены каталоги work/lo*/.cache и dir2/.cache) - /.cache # исключаем все каталоги Trash во всех папках - /**/Trash/ # исключаем каталог Cache в каталогах .mysoft/soft*/ - /.mysoft/*/Cache # исключаем файл pass.md - pass.md # исключаем все файлы с расширением .tmp - *.tmp # исключаем весь каталог example - /example/ # Оставляем каталог Trash в каждом каталоге work/lo*/.. + /work/**/Trash/
Для того, чтобы rsync заметил файл .rsync-filter, достаточно указать опцию -F:
rsync -avF ./somedir 10.10.20.15:/home/leo/
В итоге на сервер будут скопированы только эти файлы:
Кстати, если мы не хотим чтобы сам .rsync-filter не копировался, то -F нужно будет указать дважды
Другие полезные опции
—delete / —delete-after / —del (—delete_during)
Если мы делаем ежедневные резервные копии и не хотим засорять удаленный сервер лишними файлами (которых уже нет в источнике), то мы можем использовать опцию —delete:
В результате будет удален файл, которого больше нет в директории источника (в somedir):
rsync -avz -e "ssh -p 2013" --delete ./somedir [email protected]:/home/bkp/ [email protected]'s password: sending incremental file list deleting somedir/lolo somedir/ sent 159 bytes received 77 bytes 67.43 bytes/sec total size is 2,041,319 speedup is 8,649.66
По умолчанию, rsync сначала выполняет удаление файлов перед копированием для уверенности, что хватит свободного места на приемной стороне (т.е. использует по умолчанию —delete-before). Если мы хотим удалять файлы после копирования, используйте параметр —delete-after.
Если мы хотим хотим удалять файлы в процессе передачи, а не перед, то можно использовать опцию —del (—delete_during). Это поможет сэкономить немного ресурсов и времени.
Кстати, это не все «delete» параметры, которые есть, вот их полный список с кратким описанием:
--del – an alias for --delete-during --delete – delete extraneous files from dest dirs --delete-before – receiver deletes before transfer (default) --delete-during – receiver deletes during xfer, not before --delete-delay – find deletions during, delete after --delete-after – receiver deletes after transfer, not before --delete-excluded – also delete excluded files from dest dirs
А если вам по какой-то причине не нужно обновлять файлы на принимающем сервере, вместо опции —del.. можно использовать опцию —ignore-existing.
—no-perms —no-owner —no-group
Иногда нам может потребоваться не переносить атрибуты (права файлов, пользователя и группу пользователя). Для этого мы можем воспользоваться опциями —no-p —no-o —no-g (оно же —no-perms —no-owner —no-group):
rsync -avz -e "ssh -p 2013" --no-p --no-o --no-g ./somedir
Важно соблюдать порядок (особенности работы «—no-OPTION» в rsync).
—inplace
По умолчанию rsync, при копировании существующего файла создает его новую версию, а потом заменяет старый файл на новый. Это сделано для того, чтобы исходный файл не пострадал в случае каких-то перебоев. Данная опция позволяет изменить это поведение таким образом, чтобы rsync сразу начал перезапись старого файла. Опция полезна при копировании больший файлов на одном компьютере:
rsync -av --inplace ./Видео.mp4 ./vidinplace.mp4
-W, —whole-file
Эта опция будет полезна, если мы копируем файлы с нагруженного или слабого сервера, так как она отключает дифференциальный алгоритм rsync’а и с ним весь файл передается как есть, целиком, не тратя время CPU на вычисления.
Что в итоге?
Я постарался описать наиболее частые примеры использования rsync, и сказу сразу: это только минимум того, что может эта утилита.
Если вы где-то нашли ошибку, или есть еще какие-то интересные способы использования rsync — пишите, я добавлю их в статью ;).
Источники:
- https://download.samba.org/pub/rsync/rsync.html
- http://www.opennet.ru/man.shtml?category=1&russian=0&topic=rsync
- https://www.alexeykopytko.com/2017/rsync-howto/
- https://centos.name/?page/howto/rsync
- https://obu4alka.ru/rsync-synchronization-dir-linux.html
- https://superuser.com/questions/156664/what-are-the-differences-between-the-rsync-delete-options
- https://unix.stackexchange.com/questions/102211/rsync-ignore-owner-group-time-and-perms
Хочу поделиться вариантом использования rsync для синхронизации файлов между внешней UNIX/Linux системой и локальной системой Windows.
Подобные задачи иногда возникают в работе администратора. Однако оказалось непросто быстро найти в сети работоспособный вариант версии rsync под win32 и сразу начать использовать для решения возникших задач автоматизации переноса файлов. Я не буду рассказывать о преимуществах rsync. На мой взгляд, это наиболее универсальный и гибкий инструмент синхронизации файлов между хостами.
Мною были найдены несколько вариантов реализации rsync под платформу win32:
- rsync-win — вполне работоспособная сборка версии 2.5.7, но достаточно старая — датируемая 2002 годом. Содержит в себе команду rsync, которая имеет те же ключи, что и оригинальный rsync. В работе себя показало очень медленным и нестабильным решением.
- RsyncShare — дружественная по интерфейсу реализация rsync сервера под Windows.
- winrsync — графический клиент написанный на PHP4 и использованием библиотеки GTK.
- cwRsync — сборка rsync версии 3.04.
Из рассмотренных вариантов, я выбрал cwRsync.
Инсталляция
Скачиваем дистрибутив с домашней страницы cwRsync
У меня это был файл cwRsync_2.1.5_Installer.zip
Устанавливаем в систему. Скорее всего путь будет «C:\Program Files\cwRsync\»
Поскольку это консольное приложение и вызов его может потребоваться в разных контекстах. Я рекомендую обеспечить возможность нахождения приложения с помощью переменной окружения %Path%, мне больше нравится копировать подобные утилиты в специальный каталог, предназначенный для множества консольных утилит и который давно прописан в переменной %Path%. Если такого каталога нет, можно положить в %Systemroot%, поскольку этот каталог перечислен в %Path% по умолчанию. Либо добавить путь C:\Program Files\cwRsync\ в %Path% (изменения вступают в силу после повторного входа в систему). Вообщем, выбирайте по вкусу. В любом случае при наборе rsync в коммандной строке — мы должны увидеть вывод встроенной справки.
Использование
Формат вызова:
rsync опции источник приемник
Пример вызова:
rsync -rut -v -e ssh username@192.168.0.1:/remotefolder localfolder/
Данный пример копирует файлы с внешней системы в локальный фолдер.
Итак, какие опции использованы в даном примере:
-rut — в одну «кучу» собраны ключи определяющие режим копирования файлов:
r — рекурсивный обход дерева каталогов
u — обновлять только измененные файлы
t — сохранять значения даты и времени изменения файла
-e ssh — Как известно, утилита rsync может работать, используя разные оболочки для связи хостов, по умолчанию используется ssh. Для однозначности, я всегда указываю используемую оболочку.
username@192.168.0.1:/remotefolder localfolder/ — авторизация под пользователем username на хосте с адресом 192.168.0.1, будут браться файлы из каталога /remotefolder, копируемые дерево каталогов и файлы будут помещены в папку localfolder/ относительно текущего пути в момент вызова rsync.
При каждом запуске rsync будет запрашивать пароль для username. Для пакетного режима, следует воспользоваться возможностью авторизации SSH по ключам.
Чтобы изменить направление копирования файлов, достаточно в качестве источника указать локальный ресурс, а в качестве приемника — внешний.
Авторизация по ключам
Запускаем ssh-keygen.exe под тем пользователем от имени которого будет запускаться rsync в пакетном режиме:
На все вопросы нажимаем Enter. Пароль для ключа тоже не указываем, иначе в пакетном режиме будет запрашиваться пароль, но уже для самого ключа. Ключ должен быть успешно создан — в домашнем каталоге windows пользователя (переменная %USERPROFILE%) будет создан каталог .ssh, в нем записаны файлы ключей: id_rsa и id_rsa.pub. Теперь содержимое файла id_rsa.pub нужно скопировать на сервер (в нашем случае хост 192.168.0.1), добавив эту строку в файл ~/.ssh/authorized_keys домашнего каталога пользователя, под которым мы хотим авторизоваться на внешней системе.
У нас идёт цикл об информационной суверенности: как не зависеть от зарубежных сервисов в важных компьютерных делах. Сейчас говорим о защите важных файлов. Эта операция из нескольких этапов:
- Настройка автоматического копирования на компьютере ← вы здесь.
- Запуск собственного удалённого файлового сервера ← на следующей неделе.
- Настройка автоматического копирования на свой сервер.
В чём задача
Задача — сделать так, чтобы важные файлы на нашем компьютере копировались в безопасное место без нашего участия. Например, можно иметь безопасную флешку, на которую при подключении будут записываться свежие версии важных файлов.
Важно, чтобы это происходило автоматически, то есть без вашего участия. Если флешка вставлена, на неё всё копируется само. Если не вставлена, ничего не происходит.
Решение будет состоять из двух частей:
- Нечто, что будет копировать файл без нашего участия.
- Нечто, что будет запускать копирование в нужный момент.
Что делаем
Сначала напишем скрипт, который делает бэкапы, а потом настроим всё так, чтобы он запускался автоматически. Звучит сложно, но на деле всё займёт 5 минут.
Скрипт мы сделаем с помощью системной утилиты rsync на Linux или Mac OS. На Windows используем утилиту nnBackup.
Автоматику будем запускать с помощью crontab — планировщика задач для Linux и Mac OS. На Windows используем либо встроенный планировщик задач, либо nnCron — клон crontab.
Большинство автоматизаций делается на скриптах и выполняется в терминале (командной строке). Достаточно разобраться с этим один раз, чтобы оценить всю мощь и глубину такого подхода. Помните, во всех фильмах про хакеров они что-то пишут, бегут строчки кода и всё работает? Будем делать то же самое.
Вам может быть интересно:
Настраиваем резервное копирование в Mac OS и Linux
Чтобы скопировать данные из одного места в другое, во всех дистрибутивах Linux, UNIX и Mac OS используют команду rsync. Она почти всегда идёт в комплекте с системой и решает только одну задачу — что-то куда-то копирует, при этом сам процесс можно настроить довольно гибко.
Общий вид команды такой:
rsync -как_копируем что_копируем куда_копируем
Что_копируем
— это путь к папкам, где лежат наши данные. Их мы будем копировать
Куда_копируем
— это путь к папке, где будет храниться бэкап. Если второй папки нет, программа сама её создаст. Если папка на другом устройстве, а самого устройства в системе нет, rsync может завершить работу.
-как_копируем
— её параметры копирования. Их очень много; если нужен полный список, наберите rsync —help. Сейчас нас интересует только два параметра — архив и вывод на экран. Для справки — вот полный перечень:
-v, —verbose | выводить на экран всё, что программа делает |
-q, —quiet | тихонько работать, если нет ошибок |
-c, —checksum | пропускать ненужные файлы, смотря на контрольную сумму, а не на дату |
-a, —archive | сделать архив; то же самое, как если использовать ключи -rlptgoD (no -H,-A,-X) |
—no-OPTION | не использовать какие-то опции (например, —no-D) |
-r, —recursive | обработать все вложенные папки и подпапки |
-R, —relative | использовать относительные пути к файлам |
-b, —backup | сделать бэкап-файл |
-u, —update | пропустить файлы, если в папке назначения они более свежие |
—inplace | обновить файлы в папке назначения |
-d, —dirs | обработать просто папку, без вложенных папок |
-p, —perms | сохранять разрешения |
-E, —executability | сохранять флаг возможности выполнения файла |
—chmod=CHMOD | поменять права доступа к файлам или папкам |
-X, —xattrs | сохранять внешние атрибуты файла |
-o, —owner | сохранять владельца (только для суперпользователя) |
-g, —group | сохранять группу |
—devices | сохранять файлы устройств (только для суперпользователя) |
—specials | сохранять специальные файлы |
-D | то же самое, что —devices —specials |
-t, —times | сохранять время изменения файлов |
-O, —omit-dir-times | не смотреть на папки при использовании —times |
—super | экран помощи |
—fake-super | сохранять или восстанавливать особые атрибуты, используя xattrs |
-n, —dry-run | запустить вхолостую, без изменений в файлах, просто чтобы убедиться, что ошибок не будет |
-W, —whole-file | копировать файлы целиком |
-e, —rsh=COMMAND | указать программу выполнения на удалённом компьютере |
—rsync-path=PROGRAM | путь к команде rsync на удалённом компьютере |
—existing | пропустить создание новых файлов на получателе |
—ignore-existing | не обновлять уже существующие файлы на получателе |
—remove-source-files | удалить синхронизированные файлы у отправителя (не влияет на папки) |
—del | то же самое, что —delete-during |
—delete | удалить посторонние файлы из папки получателя |
—delete-before | удалить всё у получателя перед передачей данных (используется по умолчанию) |
—delete-during | удалять файлы во время передачи |
—delete-delay | сначала найти все удаляемые файлы, а потом удалить все сразу |
—delete-after | получатель удаляет необходимые файлы после получения нужных файлов, а не до этого |
—delete-excluded | если в конечной папке есть файлы, которые попали под исключения, и их надо удалить — всё равно удалить их |
—ignore-errors | удалять файлы, даже если есть ошибки ввода-вывода |
—force | даже если папка не пустая, всё равно удалять её |
—max-delete=NUM | не удалять более стольких-то (NUM) файлов |
—max-size=SIZE | не трогать файлы больше размера SIZE |
—min-size=SIZE | не трогать файлы меньше размера SIZE |
—partial | если файл передался не полностью, всё равно сохранить его |
—partial-dir=DIR | если файл передался не полностью, положить его в папку DIR |
—delay-updates | обработать обновлённые файлы в последнюю очередь |
-m, —prune-empty-dirs | выбросить пустые папки из списка файлов на копирование |
-I, —ignore-times | не пропускать файлы, если они совпадают по времени и размеру |
—size-only | если файлы одинаковые по размеру, пропустить |
—modify-window=NUM | сравнить время изменения файлов с уменьшенной точностью (чтобы файл, изменённый через секунду, например, не считался новым) |
-T, —temp-dir=DIR | create temporary files in directory DIR |
-y, —fuzzy | если конечного файла нет, найти похожие |
—compare-dest=DIR | ещё сравнить полученные файлы относительно каталога DIR |
—copy-dest=DIR | …и приложить копии неизменённых файлов |
-z, —compress | сжимать данные при передаче |
-C, —cvs-exclude | игнорировать файлы по типу CVS |
-f, —filter=RULE | добавить правило RULE для фильтрации файлов |
-F | то же, что —filter=’dir-merge /.rsync-filter’ |
—exclude=PATTERN | исключить из копирования файлы, которые совпадают с паттерном PATTERN |
—exclude-from=FILE | взять из FILE паттерны, по которым исключить файлы из копирования |
—include=PATTERN | не исключать из копирования файлы, которые совпадают с паттерном PATTERN |
—include-from=FILE | взять из FILE параметры включения файлов в задачу копирования |
—files-from=FILE | забрать список исходных файлов для копирования из FILE |
—port=PORT | дополнительный порт для обмена данными с удалённым компьютером |
—sockopts=OPTIONS | особые параметры связи с сервером по TCP |
—stats | вывести статистику по передаче файлов |
-8, —8-bit-output | оставить нетронутыми восьмибитные символы во время вывода на экран |
-h, —human-readable | вывести всё в формате, понятном человеку |
—progress | показывать прогресс передачи |
-P | то же самое, что —partial —progress |
-i, —itemize-changes | вывести отчёт об изменениях в копированных файлах |
—log-file=FILE | записать в FILE лог событий копирования |
—password-file=FILE | взять пароль демона из FILE |
—list-only | не копировать файлы, а просто перечислить |
—bwlimit=KBPS | ограничить пропускную способность канала передачи данных, если копируем через интернет |
—protocol=NUM | использовать более древний протокол для совместимости со старым софтом и железом |
—iconv=CONVERT_SPEC | запросить преобразование названий файлов в зависимости от языка |
-4, —ipv4 | использовать протокол TCP IPv4 |
-6, —ipv6 | использовать протокол TCP IPv6 |
—version | показать версию программы |
(-h) —help | показать помощь |
Чтобы команда знала, что нам нужно не просто скопировать, а сделать бэкап, используется ключ -a. Без него компьютер будет просто копировать файлы каждый раз, даже если в резервной копии они уже есть, и тратить на это каждый раз много времени. А с ключом -a команда поймёт, что это бэкап, и не будет туда добавлять те файлы, которые там уже есть. А если в бэкапе будет лежать старая версия, а у нас уже новая, то она просто заменит старую на новую, чтобы у нас всегда были актуальные данные.
Вывод на экран — необязательный параметр, который не влияет на экран, но сейчас нам он пригодится. Его смысл в том, что так компьютер будет выводить название каждого файла, который он копирует в данный момент, — так мы увидим, что всё работает как нужно.
Ещё есть ключ —delete — он означает, что если в исходной папке какой-то файл уже удалён, то и в бэкапе его тоже нужно удалить. Если вам в резервных копиях нужна точная копия какой-то папки — добавляйте этот параметр при запуске.
Например, если нам нужно на флешке сделать бэкап папки с фотографиями, то пишем такую команду:
rsync -av /Users/mike/Pictures /Volumes/WIN10_64/Pictures
Вот что она означает:
rsync
— название нашей команды;-av
— добавляем архивный ключ и вывод процесса на экран;/Users/mike/Pictures
— здесь лежат фотографии;/Volumes/WIN10_64/Pictures
— на флешке с названием WIN10_64 появится папка Pictures, в которой будет лежать бэкап.
Если бы нам понадобилось сделать не архивный бэкап (со всеми старыми файлами), а точную копию папки с фото, то добавился бы ключ —delele:
rsync -av --delete /Users/mike/Pictures /Volumes/WIN10_64/Pictures
Что за пути к файлам? В наших примерах используются адреса файлов, которые применяются в Linux и Mac OS. В них отсчёт идёт не от физического диска, как в Windows, а от корневой папки системы. В папке есть подпапка Users, где живут данные разных пользователей системы. В папке Users лежит папка mike — это папка пользователя Миши. Внутри этой папки уже лежат все его документы.
В Windows это выглядело бы, например, так: C:/Users/mike/Pictures
.
Резервное копирование в Windows
Для Windows нет родной команды rsync, поэтому разработчику Николаю Немцову пришлось сделать её аналог — nnBackup. Она устанавливается как обычная программа, и потом тоже запускается из командной строки. Чтобы с ней было проще работать, ставим её в свою папку в корень диска C:
Единственное, что отличается в работе, — порядок аргументов и ключи запуска. Чтобы получить тот же результат, что и в предыдущем примере, нужно в командной строке написать такое:
nnbackup.exe sync -i C:\Users\Mike\Pictures\ -o
F:\Pictures\ -v -da
Теперь посмотрим, что внутри:
Устанавливаем nnBackup на диск C:
А что, если мне нужно создать бэкап нескольких папок?
Чтобы сделать копии нескольких папок, нужно выполнить несколько команд подряд — сначала для одной папки, потом для другой и так далее. Компьютер сделает всё по очереди.
rsync -av --delete /Users/mike/Pictures /Volumes/WIN10_64/Pictures
rsync -av --delete /Users/mike/Misic /Volumes/WIN10_64/Music
Как будет работать автоматизация
Мы научились создавать бэкапы, но пока всё делается вручную. Это не дело — нужно, чтобы компьютер следил за этим сам.
Самый простой способ автоматизировать бэкапы — настроить выполнение команд по времени, например каждые 10 минут. Работает это так:
- Когда проходят очередные 10 минут, компьютер запускает нашу команду на создание бэкапа.
- Если флешка вставлена — всё отлично, бекап делается, данные в безопасности.
- Если флешка не вставлена — компьютер попытается выполнить нашу команду, не найдёт флешки и просто закончит выполнение команды.
- В итоге достаточно будет вставить флешку, и через 10 минут у вас начнёт создаваться актуальная резервная копия всех важных данных.
Интервал в 10 минут мы выбрали сами — можно поставить и раз в минуту, и раз в день, всё зависит от того, насколько часто у вас обновляются за день нужные данные.
Настраиваем расписание в Mac OS и Linux
За запуск команд по расписанию в Mac OS и Linux отвечает команда crontab. У неё много параметров и возможностей, но сейчас нас интересует только одно — как с её помощью запускать нашу команду для бэкапа раз в 10 минут.
Для этого делаем так.
- В терминале пишем команду
crontab -e
и нажимаем Enter. - Появляется окно редактора, где нужно нажать сначала s, а потом вставить такую строчку:
*/10 * * * * rsync -av --delete /Users/mike/Pictures /Volumes/WIN10_64/Pictures
- Нажимаем сначала Esc, а потом по очереди :wq (двоеточие, потом w, потом q) — это сохранит нашу команду и закроет редактор.
- Проверяем, что всё записалось командой
crontab -l
— мы должны увидеть свою команду.
За запуск каждые 10 минут отвечает начало команды — */10 * * * *
. Остальные звёздочки отвечают за часы, дни, недели и месяцы, а косая черта — за постоянное повторение каждые сколько-то минут.
Теперь 6 раз в час наша команда будет запускаться и следить за актуальностью резервной копии. Если нужно несколько команд, то просто добавьте новые строчки и сохраните всё таким же образом.
Настраиваем расписание в Windows
Самый простой способ сделать что-то по расписанию в Windows — использовать «Планировщик заданий». Это встроенная программа с неудобным интерфейсом, но базовые вещи в ней можно настроить.
Главный минус «Планировщика» в том, что большинство служебных задач в нём сделать сложно — нужно заполнить много полей, настроек и постоянно следить за тем, от имени какого пользователя это делается.
Для запуска планировщика выберите Пуск → Средства администрирования → Планировщик заданий.
Мы пойдём другим путём — используем программу nnCron Lite. Это аналог crontab для Windows того же Николая Немцова. Скачиваем программу и устанавливаем её в папку C:\cron, чтобы было проще запускать.
Теперь нужно сказать программе, что и как запускать. Для этого в ней есть специальный текстовый файлик cron.tab — его нужно отредактировать.
Заходите в папку с программой C:\cron, находите там файл cron.tab, открываете в Блокноте. Логика наполнения такая же, как в MacOS: сначала звёздочками указываем периодичность запуска, а потом пишем команду, которую нужно выполнить. В нашем случае это будет так:
*/10 * * * * nnbackup.exe sync -i C:\Users\Mike\Pictures\ -o F:\Pictures\ -v -da
Что дальше
Резервное копирование по времени — просто, но неоптимально. Намного круче запускать создание бэкапов именно в тот момент, когда мы вставляем флешку в компьютер. Как это сделать, расскажем в будущих статьях. Подписывайтесь на нас везде, где ещё можно
Вёрстка:
Кирилл Климентьев
Обновлено:
Опубликовано:
Тематические термины: rsync, SSH, CentOS, Ubuntu
Утилита rsync позволяет синхронизировать содержимое двух каталогов как для локальной системы, так и удаленных серверов. Это может использоваться как для резервного копирования, так и поддержания в актуальном состоянии нод кластера.
Использование Rsync Server позволит более тонко настроить работу утилиты и оптимизировать сам процесс синхронизации.
Не стоит путать резервную копию с архивом. Если удалить важный файл, при синхронизации он также будет удален на другом устройстве. Для более корректного резервирования данных, также стоит настроить их архивирование.
Установка и запуск
Настройка
Запуск клиента
Ключи rsync
Использование на Windows
Примеры команд
Возможные ошибки
Установка и запуск
По умолчанию, утилита может быть не установлена в системе. Установка и последующий запуск выполняются следующими командами.
CentOS 8
yum install rsync rsync-daemon
systemctl enable rsyncd —now
CentOS 7
yum install rsync
systemctl enable rsyncd —now
Ubuntu
apt update
apt install rsync
Открываем следующий файл:
vi /etc/default/rsync
Находим запись:
RSYNC_ENABLE=false
И меняем на:
RSYNC_ENABLE=true
Запускаем.
а) на Linux DEB:
systemctl enable rsync
systemctl start rsync
б) на Linux RPM:
systemctl enable rsyncd
systemctl start rsyncd
Настройка
Открываем конфигурационный файл 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 = *
* где первая группа параметров являются общими настройками:
- 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 || systemctl restart rsync
Добавляем порт 873 в брандмауэр.
а) Firewalld:
firewall-cmd —permanent —add-port=873/tcp
firewall-cmd —reload
б) Iptables:
iptables -I INPUT -p tcp —dport 873 -j ACCEPT
Сохраним правила с помощью iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
Запуск клиента
Проверка на локальном компьютере
Сначала выполним следующую команду на нашем сервере:
rsync -avv —progress rsync_d1@localhost::data1 /tmp/
* данная команда выполнит синхронизацию нашего ресурса data1 с каталогом /tmp.
Проверка на удаленном компьютере
Устанавливаем rsync, если еще не установлен:
yum install rsync
apt 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). Скачать ее можно на сайте sourceforge.net в качестве пакета BackupPC. Для загрузки доступны платная и бесплатная версии. Последняя не позволит поднять 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:
C:\
cd c:\Rsyncd\bin
Выполняем команду:
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)
Причина: не доступен удаленный хост.
Решение: проверить, что хости доступен по сети. Проверить настройку брандмауэра.
Подробнее о Rsync
Rsync — это быстрый и универсальный инструмент для копирования файлов и папок. Утилита может копировать данные как локально, так и на другие хосты, включая облачные хранилища Introserv.
Опции утилиты позволяют управлять многими аспектами копирования и зеркалирования данных.
Одной из главных особенностей является возможность сжатия данных при отправке, что позволяет ускорить процесс копирования между серверами.
Еще одно преимущество — исключение при копировании одинаковых файлов. Таким образом, копироваться или передаваться будут только разные файлы, что, несомненно, сэкономит время синхронизации больших каталогов.
Возможности утилиты
Рассмотрим примеры использования Rsync для копирования файлов и каталогов на удаленное облачное хранилище Introserv по протоколу SSH. Важно! Аналогичные команды, только с указанием целевого сервера, позволят вам скопировать каталоги и файлы на любой удаленный сервер по SSH.
Рассмотрим основные опции утилиты, которые будут использоваться чаще всего. Более подробный список доступных опций можно найти в документации man( командаman rsync ):
-v — вывести подробную информацию о процессе
-c — проверка контрольных сумм файлов
-q — минимальная информация
-a — режим архивирования
-R — относительные пути
-y — не перезаписывать более новые файлы
-b — создать резервную копию
-l — копировать симлинки
-L — копировать содержимое ссылок
-H — копировать жесткие ссылки
-g — сохранить группу
-p — сохранить права доступа к файлу
-t — сохранять время модификации
-x — работать только в этой ФС
-e — использовать другой транспортный протокол (например, ssh)
-z — сжимать файлы перед передачей
—delete — удалять файлы, которых нет в источнике
—exclude — исключить файлы
—recursive — перечислять каталоги рекурсивно
—no-recursive — отключить рекурсию
—progress — отобразить прогресс передачи файлов
—stat — показать статистику передачи
—max-size — максимальный размер файла для передачи
—bwlimit — ограничение скорости передачи файлов
Краткое объяснение синтаксиса
rsync -az —progress /home/user/test.file boxxxx@boxxxxx.introserv.cloud:/remote_folder/
Опции-az —progress указывают на необходимость архивирования передаваемого файла, сжатия его перед передачей, а также отображения прогресса копирования на экране;
/home/user/test.file — это путь к файлу и сам файл, который необходимо передать;
boxxxx@boxxxxx.introserv.cloud: это ресурс назначения (в нашем примере это облачное хранилище, но это может быть и удаленный сервер) boxxxx — имя пользователя, после знака @ — имя ресурса или IP-адрес удаленного сервера;
/remote_folder/ — это папка на удаленном ресурсе. В нашем примере — в облачном хранилище Introserv Cloud Storage.
Копирование одного файла в папку на удаленном хранилище
rsync -az --progress /home/user/Desktop/test.file boxxxxx@boxxxxx.introserv.cloud:/remote_folder/
Вам будет предложено ввести пароль для подключения к хранилищу:
Введите пароль и продолжите, вы увидите прогресс и скорость передачи файла:
Копирование папки в папку на удаленном хранилище
Обратите внимание на косые черты в строках папки-источника и папки назначения. Отсутствие косой черты в исходной папке указывает на то, что мы хотим рекурсивно перенести локальную папку Desktop со всем ее содержимым в папку remote_folder.
rsync -azr --progress /home/user/Desktop boxxxx@boxxxx.introserv.cloud:/remote_folder/
Вы увидите, что каталог и все файлы в нем будут переданы:
Копирование содержимого локальной папки в папку на удаленном хранилище
Обратите внимание на косую черту в конце исходной папки. Его наличие указывает на то, что утилита должна скопировать содержимое локальной папки в папку на удаленном хранилище.
rsync -avzr --progress /home/user/Desktop/ boxxxx@boxxxx.introserv.cloud:/remote_folder/
Вы увидите прогресс и скорость копирования:
Копирование папки с удаленного хранилища в папку локального сервера
С помощью Rsync можно инициировать копирование папки с удаленного хранилища. Команда выглядит следующим образом:
rsync -zra --progress boxxxxx@boxxxxx.introserv.cloud:/remote_folder /home/user/Desktop/
Вы увидите прогресс и скорость копирования удаленной папки в папку на локальном сервере:
Копирование содержимого папки из удаленного хранилища в папку локального сервера
Здесь также стоит обратить внимание на косую черту в конце пути к исходной папке. Ее наличие указывает на то, что копировать нужно только содержимое папки
rsync -zra —progress boxxxxx@boxxxxx.introserv.cloud:/remote_folder/ /home/user/Desktop/
Копирование содержимого папки, исключая и/или включая файлы
Утилита позволяет явно указать, какие файлы нужно передать, а какие исключить. Для этого используйте опции —include и —exclude.
rsync -azr --progress --include 'test.file' --exclude 'test.file2' /home/user/Desktop/ boxxxx@boxxxx.introserv.cloud:/remote_folder/
Вы увидите, что передается только один файл, указанный опцией —include. Обратите внимание, что опции include и exclude можно использовать отдельно друг от друга
Копировать только те файлы, которые отличаются от файлов в папке назначения
Чтобы отменить копирование одинаковых файлов, используйте опцию -c для проверки контрольных сумм файлов. Это позволит исключить из процесса копирования те файлы, которые уже находятся в папке назначения
rsync -azrс --progress /home/user/Desktop/ boxxxx@boxxxx.introserv.cloud:/remote_folder/
Вы видите, что в удаленную папку было скопировано только 3 файла, за исключением файла test.odt, который уже находится на удаленном хранилище:
Использование Rsync через SSH с нестандартным портом SSH
Чтобы передать файлы с/на сервер с измененным портом SSH, используйте опцию -e ‘ssh -p port_number’ .
Команда для копирования файла на сервер, на котором порт SSH изменен на 44, будет выглядеть следующим образом:
rsync -azrс --progress -e 'ssh -p44' /home/user/Desktop/ user@server_ip:/remote_folder/