====== Копируем с RSync: основные примеры синхронизации файлов ======
==== Установка ====
По умолчанию 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'' ''-av 2021 user@10.10.20.15:/home/user/''
Важно указывать полный путь на удаленном сервере, иначе rsync попытается скопировать каталог «2021» в корень удаленного сервера.
Еще важно указывать полный путь до удаленного сервера, так как, к примеру, копируя файл «file.txt» на сервер указав путь /home/user/somedir, каталог somedir не будет создан, вместо этого файл file.txt скопируется на сервер под именем somedir. Чтобы избежать этого используйте путь полный путь /home/user/somedir**/**.
Если мы хотим немного сжать файлы при передачи (к примеру у нас медленный интернет), можно использовать ключ -z:
''rsync'' ''-avz 2021 user@10.10.20.15:/home/user/''
Но важно понимать, что сжатие имеет смысл использовать там где это нужно, так как в новых версиях ssh уже использует сжатие передаваемых данных, тратить ресурсы CPU не стоит, особенно на слабых машинах или NAS серверах.
==== Как скопировать/синхронизировать с удаленного сервера на компьютер ====
Вот так:
''rsync'' ''-av user@10.10.20.15:/home/user/filefromsrv'' ''./''
В данном примере мы копируем файл filefromsrv в каталог, в котором находимся.
==== Как указать другой порт ssh и ключ? ====
С помощью опции -e (она же —rsh). Вот как скопировать файл с компьютера на сервер у которого не стандартный ssh порт:
''rsync'' ''-av -e "ssh -p 2013"'' ''./filefrompc'' ''user@10.10.20.7:/home/user/''
А вот как можно указать ключ авторизации и порт:
''rsync'' ''-av -e "ssh -p 2013 -i ~/.ssh/id_rsa"'' ''./filefromsrv'' ''user@10.10.20.7:/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'' ''user@10.10.20.15:/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'' ''user@10.10.20.15:/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'' ''-avP –bwlimit=100 ./somedir'' ''user@10.10.20.15:/home/leo/''
Полезно бывает на слабом интернете с большими файлами.
==== Как исключить некоторые файлы или включить определенный тип файлов? ====
В rsync можно создавать достаточно гибкие исключения, например, делая резервную копию домашней директории на linux мы не ходим копировать разный кеш или содержимое корзины. Вот пример, в котором я исключаю две директории:
''rsync'' ''-av –exclude={'user/.local/share/Trash','user/.cache'} /home/user'' ''user@10.10.20.15:/home/user/bkp/''
Конечно можно указать одну директорию:
''rsync'' ''-av –exclude=.git /var/www/site'' ''user@10.10.20.15:/home/user/bkp/''
Еще мы можем исключить файлы с определенным расширением:
''rsync'' ''-av –exclude="*.tmp"'' ''/var/www/site'' ''user@10.10.20.15:/home/user/bkp/''
Саму опцию мы можем использовать несколько раз:
''rsync'' ''-av –exclude="*.tmp"'' ''–exclude="tmp/*"'' ''–exclude="*~"'' ''/var/www/site'' ''user@10.10.20.15:/home/user/bkp/''
Для копирования определенного типа файлов (да и не только) мы можем использовать опцию —include. Используется она точно так же, как и exclude. Вот пример, в котором я загружаю на сервер только все файлы с расширением .sql:
''rsync'' ''-av –exclude="*.sql"'' ''./projectname'' ''user@10.10.20.15:/home/user/sqlbkp/''
==== Исключения с помощью .rsync-filter ====
Для более гибкой настройки копирования (в случае регулярного копирования это будет очень полезно) все исключения/включения можно оформить в файле .rsync-filter (это появилось в более поздних версиях rsync).
Допустим, у меня есть такой каталог (somedir), в котором я хочу исключить (красная стрелка) или оставить (зеленая стрелка) некоторые файлы/каталоги:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/linux/rsync/rsync-filter-example-1-318x500.png?nolink&}}
Ниже приведен один из примеров настройки исключений в файле .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/''
В итоге на сервер будут скопированы только эти файлы:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/linux/rsync/rsync-filter-example2.png?nolink&}}
Кстати, если мы не хотим чтобы сам .rsync-filter не копировался, то -F нужно будет указать дважды
==== Другие полезные опции ====
==== —delete / —delete-after / —del (—delete_during) ====
Если мы делаем ежедневные резервные копии и не хотим засорять удаленный сервер лишними файлами (которых уже нет в источнике), то мы можем использовать опцию —delete:
''rsync'' ''-avz -e "ssh -p 2013"'' ''–delete ./somedir'' ''bkp@10.10.20.7:/home/bkp/''
В результате будет удален файл, которого больше нет в директории источника (в somedir):
''rsync'' ''-avz -e "ssh -p 2013"'' ''–delete ./somedir'' ''bkp@10.10.20.7:/home/bkp/''
''bkp@10.10.20.7'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 на вычисления.
Report content on this page