Приёмы работы c rsync — Сложно о простом

У замечательной и очень популярной программы есть множество удобных опций и необычайных способностей, вот только их не так-то просто найти. Ну, если только вы не готовы прочитать весь мануал от корки до корки.

Попробую сберечь вам немного времени на чтение мануала и рассказать о самом важном и полезном. Простыми словами, как есть.

Зачем нужен rsync?

Зачем пользоваться если есть привычные и , спросите вы.

  1. В одной части удобней и лучше упомянутых аналогов потому что он дает вам возможность увидеть все что он сделает при копировании файлов до непосредственно операции копирования.

  2. В другой части — по умолчанию копирует только новые и изменившиеся файлы, и даже не только файлы — а отдельные их части, делая это жестоко и эффективно.

Только этих двух причин достаточно чтобы в своей ежедневной работе забыть про , променяв эту команду и ее аналоги на .

Принцип применения

Если мы говорим о простом копировании файлов, то первым делом всегда стоит сделать пробный прогон (ключ ) в режиме с показом подробностей ():

В этом режиме покажет список файлов, которые он скопирует. Будут скопированы только новые и изменившиеся файлы. Вы сможете убедиться что копируется сам каталог, а не содержимое, или что копируется именно содержимое.

После того как вы убедились что копируется именно то, что вы хотите, можно запускать самое настоящее копирование:

В этой команде ключ подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты, такие как дата создания и дата изменения. Ключ даст вам подробный отчет о работе по мере выполнения и по окончании.

Правила копирования каталогов

С одной стороны правила очень простые.

  1. Если в конце пути до именованного источника нет слеша, то скопируется сам каталог.

  2. Если слеш есть, или источник указывает на каталог без имени, то скопируется содержимое каталога.

С другой стороны вполне можно в пылу забыть что и как, скопировав содержимое каталога вместо самого каталога, получив кучу хлопот с удалением лишних файлов, появившихся из ниоткуда с датами в прошлом (ключик , помните?).

Потому лучше всегда следовать обычному сценарию с предварительной проверкой операции.

Некоторые полезные ключи

Сначала поговорим об опциях которые вам будет здорово знать без шпор и шпаргалок.

  1. Ключ включает сразу несколько опций. С этим ключем и покажет процесс копирования отдельных файлов, и продолжит копирование если оно было прервано. Особо эта опция пригождается при копировании больших файлов. Ключ нужно указывать каждый раз, иначе удалит файлы которые не успели полностью закачаться.

  2. Если вы копируете файлы с какого-то очень занятого, или слабого, сервера, то можно исключить трату ресурсов процессора на вычисление изменившихся частей файлов, скопировав их целиком. Для этого нужен ключ .

  3. Если вам хочется знать сколько всего, по мнению rsync, осталось работать, вам нужен ключ . Если вы копируете целую файловую систему, то этот ключ, будучи использован сам по себе, вас разочарует: информация об итоговом объёме будет постоянно обновляться. Это происходит потому что не пытается считать всю файловую систему до того как начнёт копирование, а делает обе задачи сразу.

    Но не отчаивайтесь! Если вы хотите знать точно сколько осталось работать с самого начала, то можно отключить последовательное сканирование ключём или, короче, .

    Ключи выше есть начиная с версии 3.1.0, то есть уже работают в Debian stable.

  4. Если требуется не просто скопировать файлы, а полностью синхронизировать содержимое каталогов, удалив лишние файлы, при этом вам почему-то не с руки синхронизировать файлы с помощью Git, то пригодится ключ (или эквивалентный ему ).

    С этим ключём удалит лишние файлы из каталого-назначения.

    Ключ в команде выше был оставлен намеренно.

Дальше я рассмотрю в деталях более интересные, хоть более редко используемые, опции.

О сжатии замолвим слово

Вопреки популярному заблуждению от использования сжатия внутри rsync (ключ ) больше вреда, чем пользы. Дело в том что всюду используемый OpenSSH уже с версии конца 2005 года по-умолчанию использует сжатие передаваемых данных. Сами понимаете, сжатие уже сжатых данных только лишь использует ресурсы процессора, не уменьшая объем передаваемых данных.

В том, что при соединении с вашим сервером уже используется сжатие, можно убедиться так:

Если эта команда не покажет, в числе прочих, такую строчку про включение сжатия как выше, то может быть вам стоит использовать сжатие. Стоит проверить что от сжатия есть толк. Особенно это касается маломощных устройств с быстрым соединением: вашему NAS может быть быстрее скопировать что-то по гигабитному линку без сжатия, чем пытаться обогнать гигабитную сеть маломощным процессором.

К счастью, достаточно умен чтобы не использовать сжатие если вы копируете файлы локально, из каталога на диск и т.п.

Копируем частично

Наверняка вам когда-нибудь понадобится чтобы пропускал некоторые файлы при копировании.

В самом простейшем случае вам нужно чтобы rsync не копировал файлы разных систем контроля версий, включая каталог вроде и . В этой задаче вам не нужно ничего кроме ключа (или в полной форме). Так файлы большинства популярных VCS будут проигнорированы будто их нет. Не забываем использовать при первом запуске.

Может получиться так что вы, по ошибке, скопируете кучу таких файлов от VCS. В этом случае для получения чистой копии вам пригодится ключ , с которым все исключенные файлы будут удалены.

Исключаем через .rsync-filter

Если нужные более гибкие правила, что особенно актуально если копирование делается регулярно, то лучше не мелочиться и оформить все исключения в файле .

Для исключения чего-либо из списка на перенос нужно добавить в этот файл строчку с правилом ( или в начале строки).

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

  2. Если нужно исключить файл или каталог относительно каталога в котором находится , то укажем со слешем в начале:

  3. В правилах звездочка соответствует любым символам кроме слеша, а две звездочки соответствуют вообще любым символам:

  4. Наконец, если нужно чтобы какие-то файлы всё-таки копировались, не смотря на ранее заданные правила, то их можно отметить правилом в начале строки.

Файлы команда умеет искать по всей структуре каталогов будучи запущена с ключём .

Если нужно чтобы сами эти файлы не копировались, то нужно указать этот ключ два раза так:

Как видите, лишние файлы не скопировались:

Ограничим rsync по ssh

Случается нужно разрешить работу по ssh, удалённо и без пароля, только определённого для каталога и хоста, исключив копирование чего-либо в другие места или из других мест.

Например, вы хотите чтобы можно было скопировать файлы на сервер только с хоста , только и только в каталог , и только с этими опциями:

То сначала нужно получить команду, которую выполняет при вызове ssh на удаленном хосте:

Соответственно, в на следует добавить для известного ssh ключа запуск этой команды по-умолчанию при подключении:

Таким образом, даже если при запуске будут указаны какие-то другие опции, на сервере-назначении всё равно выполнится команда соответствующая исходным, заданным вами, опциям и настройкам.

Если нужно чтобы ваш бекап нельзя было перезаписать или удалить на сервере назначения, то опцию следует заменить на .

Машина времени

Те пользователи macOS и OS X, что делают бэкап, наверняка оценили работу Time Machine.

Эта программа позволяет буквально в два клика вернуться к прошлой версии любого файла. Не смотря на все красивости, Time Machine не делает ничего такого чего мы не можем сделать с помощью .

Скрипт следует положить в корень того диска или каталога, куда следует делать бэкапы.

Rsync Примеры синхронизации

Запускать с указанием единственного аргумента: каталога с исходными файлами. Например, так.

После нескольких запусков получается такая структура каталога:

При этом указывает на самый последний бэкап.

В каждом из каталогов содержится слепок того, что было в исходном каталоге в момент копирования. Можно подумать что и место на диске занято пропорционально количеству копий, однако это не так.

Всё множество копий занимает лишь немного больше места чем исходный каталог. Место уходит на изменившиеся файлы.

Если ничего не менялось, то место всё равно расходуется на создание каталогов, которые нельзя хранить как жесткие ссылки.

Такая существенная экономия возможна благодаря упомянутым жестким ссылкам, которые делает для файлов, не изменившихся с последнего копирования.

У одинаковых, не менявшихся, файлов будет один и тот же inode.

Конечно, по возможной экономии места на диске такому способу резервного копирования далеко до специальных программам, таких как Borg или Restic.

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

В rsync используется довольно-таки сложный алгоритм, с помощью которого передаются фактически только изменения в файлах, к тому же, для того, чтобы понять, что файл изменен, rsync не требуется сравнение двух файлов, что довольно сильно повышает производительность по сравнению с другими инструментами синхронизации. Ещё один плюс rsync — сжатие данных на лету, что ещё больше увеличивает эффективность.

Помимо указанных выше преимуществ, у rsync есть возможность передачи данных по защищенному соединению — ssh, это, несомненно, плюс к безопасности этой программы. Также, rsync сначала записывает передаваемую информацию во временный файл, чтобы исключить потерю информации в случае непредвиденных обстоятельств(отключение интернета или электричества).

Если имеется доступ по ssh к серверу, это наиболее простой способ для осуществления синхронизации. Rsync по ssh — это частный случай использования, общий вид команды выглядит так:

rsync [ОПЦИИ] [ПОЛЬЗОВАТЕЛЬ@]СЕРВЕР:ИСТОЧНИК… [ПОЛУЧАТЕЛЬ]
Pull (копирование файлов с удаленной системы на локальную)

rsync [ОПЦИИ] ИСТОЧНИК 1 [ИСТОЧНИК N] [ПОЛЬЗОВАТЕЛЬ@]СЕРВЕР:ПОЛУЧАТЕЛЬ
Push (копирование файлов с локальной машины на удаленную)

В официальной документации по rsync «Push» — это копирование файлов с локальной машины на удалённую, а «Pull» — с удалённой на локальную.
Обязательным параметром является «ИСТОЧНИК», их может быть несколько.

Основные ключи:

-a,  режим архивирования, включает ключи -rlptgoD;
-r,  каталоги копируются рекурсивно;
-l,  копировать символические ссылки «как есть», то есть rsync не будет следовать по ним, обращаясь к файлам;
-p,  сохранение прав доступа к файлам;
-t,  сохранение времени модификации файлов;
-g, -o, сохранение владельца и группы файла;
-D,  сохранение файлов устройств и специальных файлов;
-u,  режим обновления, пропускаются файлы на получателе, имеющие более позднюю дату модификации, чем в источнике;
-v,  выводит имена копируемых файлов;
-q,  не выводит сообщения об ошибках;
-z,  включение режим сжатия;
-P,  отображение прогресса при копировании;
-с,  проверка файлов по контрольной сумме, а по размеру и дате модификации. Дополнительная нагрузка на процессор, сильно увеличивает время синхронизации;
—ignore-errors,  продолжение копирования и удаления даже после появления ошибок;
—max-delete,  максимальное число удаляемых за один раз файлов и каталогов;
—files-from=FILE,  задается список файлов и директорий для копирования в файле;
-e ssh,  использование при копировании ssh;
—bwlimit=KBPS,  ограничение скорости копирования.

Примеры:

# rsync -zavP /backup/file1/ /backup/file2/ user@192.168.0.1:/backup
Скопируется на сервер 192.168.0.1 содержимое папок /backup/file1/ /backup/file2/ в папку backup

# rsync -zavP /backup/file1 /backup/file2 user@192.168.0.1:/backup
В этом примере уже скопируются сами папки

Как ограничить скорость передачи файлов?

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

Нужно поставить опцию —bwlimit :

# rsync -zavP —bwlimit=100 /backup/file1/ user@192.168.0.1:/backup

Как синхронизировать файлы с проверкой по контрольной сумме?

# rsync -сzavP /backup/file1/ user@192.168.0.1:/backup

Как скопировать файлы с удаленной машины на локальную?

# rsync -zavP user@192.168.0.1:/backup /backup/file1/

Как исключить файл или директорию при копировании?

# rsync -azVP —exclude /temp/ /home/data/ user@192.168.0.1:/backup
Исключаем директорию /temp

Как использовать нестандартный порт ssh при копировании rsync?

# rsync -zavP ‘-e ssh -p 12345’ /var/lib/ root@192.168.0.1:/backup

Запись опубликована автором MishLen в рубрике ПО (Linux) с метками rsync, ssh. Добавьте в закладки постоянную ссылку.

.

Добавить комментарий

Закрыть меню