Приёмы работы c rsync. Эффективное использование rsync

rsync (англ. Remote Synchronization) - программа для UNIX- подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодировку данных при необходимости. Важным отличием rsync от многих других программ/протоколов является то, что зеркалирование осуществляется одним потоком в каждом направлении (а не по одному или несколько потоков на каждый файл). rsync может копировать или отображать содержимое каталога и копировать файлы, опционально используя сжатие и рекурсию.

Демон rsyncd, реализующий протокол rsync, по умолчанию использует Порты TCP порт 873.

    Алгоритм

Утилита rsync использует алгоритм, разработанный австралийским программистом Эндрю Триджеллом, для эффективной передачи структур (например, файлов) по коммуникационным соединениям в том случае, когда принимающий компьютер уже имеет отличающуюся версию этой структуры. Принимающий компьютер разделяет свою копию файла на неперекрывающиеся куски фиксированного размера S, и вычисляет контрольную сумму для каждого куска: MD4-хеш и более слабый rolling checksum, и отправляет их серверу, с которым синхронизируется. Сервер, с которым синхронизируются, вычисляет контрольные суммы для каждого кусочка размера S в своей версии файла, в том числе перекрывающиеся куски. Это может быть эффективно подсчитано ввиду особого свойства rolling checksum: если rolling checksum байт от n до n+S-1 равняется R, то rolling checksum байт от n+1 до n+S может быть посчитана исходя из R, байта n и байта n+S без необходимости учитывать байты, лежащие внутри этого интервала. Таким образом, если уже подсчитана rolling checksum байт 1-25, то для подсчета rolling checksum байт 2-26 используется предыдущая контрольная сумма и байты 1 и 26.

    Rsync находит файлы, которые нужно отправить, используя "quick check" алгоритм (алгоритм используется по умолчанию), ищутся файлы, которые изменились в размере, или в дате последней модификации.

    Обратите внимание, rsync должен быть установлен на обоих узлах, локальном и удалённом.

    Применение . rsync была создана как замена для rcp и scp. Одним из первых применений rsync стало зеркалирование или резервное копирование клиентских Unix- систем на центральный Unix- сервер с использованием rsync/Настройка и использование SSH и обычной учётной записи Unix. С планировщиком задач, таким как Использование планировщика cron в Linux , возможно организовать автоматизированное основанное на rsync зеркалирование по защищённому криптографически каналу между многими компьютерами и центральным сервером.

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

    Пример : Локальные директории. Рекурсивно синхронизируется содержимое папки dir_a (если на конце исходной директории стоит «/», то это означает копирование содержимого директории; отсутствие слеша означает копирование директории и ее содержимого.) c директорией dir_b. Файлы передаются в "аrchive" режиме, который обеспечивают, что при трансфере будут сохранены символьные ссылки, файлы устройств, атрибуты, права, полномочия доступа и т.д. Использовано сжатие, для уменьшения размера передаваемых данных. В директории dir_b удаляются файлы отсутствующие в источнике (dir_a). rsync -avz --delete /src/dir_a/ /data/dir_b

    Пример : Удаленная директория синхронизируется с локальной директорией: rsync -az -e ssh --delete 192.168.1.14:/home/pub_remote/ /home/pub_local

    Пример : передача ключа идентификации ssh через командную строку rsync -avz --delete --exclude=**/stats --exclude=**/error --exclude=**/files/pictures -e "ssh -i /root/rsync/mirror-rsync-key"

    -n, –dry-run Отладочный режим. В этом случае, rsync не будет менять или удалять файлы, но покажет весь ход работы.

    -q, –quiet Опция уменьшает количество выводимой информации во время трансфера, значительно подавляется количество сообщений от сервера. Опция полезна, когда rsync запускается по крону.

    -v, –verbose Опция увеличивает количество выводимой информации во время трансфера. По умолчанию rsync ничего не выводит. Одна -v опция даст вам информацию о том, какие файлы переносятся и короткое заключение в конце. Две опции -v дадут информацию о том, какие файлы переносятся, какие не требуют обновления и немного больше информации в конце. Более чем две опции -v используются при отладке rsync. Формат вывода файлов по умолчанию задан, как -out-format "%n%L", он показывает только имена файлов и если объект является ссылкой, то на что он ссылается. На первом уровне отладки (одна -v) не показывается смена атрибутов файла. Если вы попросите детализированный список изменившихся атрибутов(указать опцию -itemize-changes, либо добавить "%i" к -out-format), то вывод (в клиенте) увеличится до упоминания всех пунктов, которые изменились. Смотрите опцию -out-format для получения более подробной информации.

    -a, –archive Равносильно -rlptgoD. Это быстрый способ сказать, что вы хотите рекурсивную обработку и сохранить практически всё(c опцией -H будет заметным упущением). Единственным исключением из вышеупомянутой равносильности, это когда указан -files-from , в случае которого опция -r не работает. Обратите внимание, что опция -a не сохраняет жёсткие ссылки, потому что поиск множественно-символьных файлов, требует много затрат. Необходимо отдельно использовать опцию -H.

    –no-OPTION Вы можете отключить одну или несколько опций, подставив перед названием опции префикс "no-". Не ко всем опциям может быть пременён этот префикс: только к опциям, которые вытекают из других опций (например -no-D, -no-perms) или имеют разные обязательства в различных обстоятельствах (например -no-whole-file, -no-blocking-io, -no-dirs). Вы можете указать длинные или короткие опции после префикса (например -no-R или -no-relative). Например: если вы хотите использовать опцию -a (-archive) но не хотите -o (-owner), вместо превращения -a в -rlptgD, вы можете указать -a -no-o (или -a -no-owner). Порядок расположения опций важен: если вы укажете -no-r -a, опция -r всё равно будет включена, необходимо указывать -a -no-r. Обратите внимание, что побочный эффект опции -files-from НЕ позиционный, в то время как она влияет на состояние по умолчанию в нескольких опциях и слегка меняет смысл опции -a (смотрите опцию -files-from для получения более подробной информации)

    -z, –compress с этим параметром rsync сжимает все передаваемые данные файлов. Это полезно на медленных линиях. Метод сжатия, используемый при этом, тот же, что реализует gzip. Заметьте, что при этом обычно достигается лучший коэффициент сжатия, чем может быть достигнут, используя сжатие программ удаленной оболочки или сжатие транспортного уровня, т.к. в процесс сжатия вовлекается вся информация, посылаемая в соответствующих блоках данных. --compress-level=NUM explicitly set compression level --skip-compress=LIST skip compressing files with suffix in LIST

    -b, –backup делать бэкапы --backup-dir=DIR делать бэкапы в указанную директорию --suffix=SUFFIX суффикс бэкапов (по умолчанию ~)

    –numeric-ids Вместо имен групп и пользователей посылаются их числовые id и ставятся в соответствие друг другу на обоих концах. По умолчанию rsync использует имена групп и пользователей для определения владельца файлов. Специальные uid 0 и gid 0 никогда не отображаются через имена пользователей/групп, даже если не указана –numeric-ids.

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

    -c, –checksum Меняет способ проверки на изменившиеся файлы. Без этой опции, rsync использует "quick chech" алгоритм (установлен по умолчанию), который проверяет различие в размере и времени модификации файлов. Эта опция меняет алгоритм на сравнивание по 128-разрядным контрольным суммам MD4 для каждого файла, который соответствует размеру. Составление контрольных сумм означает, что обе стороны будут тратить много дискового ввода/вывода читая все данные в передаваемых файлах(и это перед любым чтением, которое будет для передачи изменившихся файлов), так что это может значительно замедлить работу. Посылающая сторона генерирует контрольные суммы, в то время как она делает сканирование файловой системы, что составляет список доступных файлов. Получатель генерирует контрольные суммы, когда он просматривает на изменившиеся файлы, и проверяет контрольные суммы любого файла, который имеет такой же размер, как и у соответствующего посылаемого файла: файлы с изменившемся размером или изменившейся контрольной суммой выбираются для передачи. Обратите внимание, rsync всегда проверяет, что каждый переданный файл был правильно восстановлен на принимающей стороне, делает он это проверкой всей контрольной суммы файла, что была сгенерирована во время передачи файла.

    -e , –rsh=COMMAND -можно указать любую удалённую оболочку (Настройка и использование SSH , rsh , remsh), либо задать переменную окружения RSYNC_RSH. --rsync-path=PROGRAM specify the rsync to run on remote machine --existing skip creating new files on receiver --ignore-existing skip updating files that exist on receiver --remove-source-files sender removes synchronized files (non-dir) --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 “-after” означает, что удалить файлы нужно, только после окончания синхронизации. --delete-excluded also delete excluded files from dest dirs --ignore-errors delete even if there are I/O errors. Удалить даже при наличии ошибок ввода/вывода. --force force deletion of dirs even if not empty --max-delete=NUM don"t delete more than NUM files --max-size=SIZE don"t transfer any file larger than SIZE --min-size=SIZE don"t transfer any file smaller than SIZE --partial keep partially transferred files --partial-dir=DIR put a partially transferred file into DIR --delay-updates put all updated files into place at end

Delete отличается от –delete-after тем, что удаление производится вначале, а не на завершающей стадии процесса бэкапа. –delete-after работает быстрее, так как не требует лишней стадии обхода списка файлов, но требует использования опции –force для обработки таких ситуаций как удаление файла и появление директории с тем же именем;

Шаблоны исключения

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

rsync строит упорядоченный список на основе параметров –include/–exclude, указанных в командной строке. Rsync проверяет каждое имя файла или каталога относительно соответствия каждому шаблону включения/исключения. В действие вступает первое же совпадение. Если совпавший шаблон исключающий, то соответствующий файл пропускается. Если шаблон включающий, то не пропускается. При отсутствии подходящих шаблонов к имени файла он также не пропускается.

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

Заметьте, что при использовании параметра -r (он подразумевается при -a) каждая отдельная часть каждого пути просматривается сверху вглубь, так что шаблоны включения/исключения применяются рекурсивно к каждой такой части.

Также обратите внимание, что параметры –include и –exclude допускают только по одному шаблону каждый. Для добавления множества шаблонов используйте параметры –include-from и –exclude-from или множество параметров –include и –exclude соответственно .

Шаблоны могут быть заданы в нескольких формах. Правила для них таковы:

    Если шаблон начинается с /, то он проверяется на соответствие с началом имени файла, в противном случае - относительно завершающей части имени. Это эквивалент начального ^ в регулярных выражениях. Таким образом, "/foo" должен соответствовать файлу с именем "foo" в вершине передаваемого дерева. С другой стороны, "foo" должен соответствовать любому файлу "foo" везде в пределах дерева каталогов, потому что алгоритм применяется рекурсивно сверху вглубь. Он работает так, как если бы каждая составная часть пути была завершением имени файла. Начальный / не превращает шаблон в абсолютный путь.

    Если шаблон заканчивается на /, то он соответствует только каталогу, не файлу, не ссылке и не устройству.

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

    В соответствия двойной звёздочки входит слэш, в то время как для одиночной звездочки * на слэше совпадение заканчивается.

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

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

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

    Если шаблоном указан одиночный восклицательный знак! , то текущий список включения/исключения сбрасывается удалением всех ранее определённых шаблонов.

Правила +/- наиболее полезны в списках, читаемых из файла, позволяя Вам иметь один общий список, который содержит как исключающие, так и включающие шаблоны.

Если Вы завершите исключающий список указанием –exclude "*", то обратите внимание, что из-за рекурсивного характера алгоритм остановится на родительских каталогах и не будет пробовать файлы внутри них за исключением тех случаев, когда Вы явно укажете включать родительские каталоги файлов, которые Вы хотите включить. Для включения всех каталогов используйте –include "*/" до –exclude "*".

Несколько примеров включения/исключения:

Exclude "*.o" исключить все имена файлов, соответствующие *.o --exclude "/foo" исключить файл с именем foo в верхнем каталоге --exclude "foo/" исключить любой каталог с именем foo --exclude "/foo/*/bar" исключить любой файл с именем bar в двух уровнях вглубь по иерархии от каталога "foo" в вершине дерева --exclude "/foo/**/bar" исключить любой файл с именем bar в двух и более уровнях вглубь по иерархии от верхнего каталога "foo" --include "*/" --include "*.c" --exclude "*" включить только каталоги и файлы с Си-исходниками --include "foo/" --include "foo/bar.c" --exclude "*" включит только foo/bar.c (каталог foo/ нужно включать явно, иначе он будет пропущен из-за "*")

Коды завершения

0 Успешно 1 Синтаксическая ошибка или ошибка использования 2 Несовместимость протоколов 3 Ошибки выбора входных/выходных файлов и каталогов 4 Запрошенное действие не поддерживается: была сделана попытка работы с 64-битными файлами на платформе, которая их не поддерживает; или указан параметр, который поддерживается только клиентом и не поддерживается сервером. 5 Ошибка при попытке начать работать по протоколу клиент-сервер 10 Ошибка сокета ввода/вывода 11 Ошибка ввода/вывода файла 12 Ошибка в потоке данных rsync-протокола 13 Ошибки при диагностике 14 Ошибка в IPC-коде 20 Получены сигналы или SIGUSR1, или SIGINT 21 Вызов waitpid() возвращает ошибку 22 Error allocating core memory buffers 23 Незавершенная передача из-за ошибки 24 Незавершенная передача из-за пропадания исходного файла 30 Время ожидания при передаче/приеме данных

Переменные окружения

CVSIGNORE Переменная окружения CVSIGNORE дополняет исключающие шаблоны из файла.cvsignore. За деталями см. параметр --cvs-exclude. RSYNC_RSH Переменная окружения RSYNC_RSH позволяет переопределить программу удаленной оболочки, используемую rsync"ом как транспорт. Параметры командной строки для оболочки указываются после имени программы, также как и для параметра -e. RSYNC_PROXY Переменная окружения RSYNC_PROXY позволяет указать rsync-клиенту использовать web-прокси для подключения к rsync-серверу. Вы должны указать прокси в виде пары hostname:port . RSYNC_PASSWORD Установка значения RSYNC_PASSWORD позволяет осуществить rsync-соединение к rsync-серверу без вмешательства пользователя для ввода пароля. Заметьте, что это не тоже самое, что и пароль для транспортной оболочки, например, ssh. USER или LOGNAME Переменные окружения USER или LOGNAME используются для определения пользователя по умолчанию, имя которого предоставляется rsync-серверу для аутентификации. HOME Переменная HOME используется для поиска пользовательского файла.cvsignore.

Примеры скриптов rsync

#!/bin/bash # полный путь к вашему списку каталогов BACKUP_LST =/ etc/ backup/ backup.lst cat ${BACKUP_LST} | while read Res; do rsync -e ssh -acq --delete --force $Res backup@ B:/ var/ backup$Res done

Есть несколько идентичных серверов (4 ноды) на Amazon EC2 с Ubuntu. Каждый генерирует и хранит у себя на диске кэш, который хотелось бы синхронизировать. Но простой rsync тут не подойдет - файлов несколько миллиардов, nfs - слишком медлителен, и т. д. Полный список рассмотренных вариантов с пояснениями ниже.

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

После теста нескольких кластерных технологий и файловых систем, по совету старшего товарища, решили использовать тот же rsync, но в связке с inotify. Немного поискав в интернете готовое такое решение, дабы не изобретать велосипед, наткнулся на csyncd, inosync и lsyncd. На хабре уже была , но он тут не подходит, т.к. хранит список файлов в базе SQLite, которая вряд-ли сможет сносно работать даже с миллионом записей. Да и лишнее звено при таких объемах ни к чему. А вот lsyncd оказался именно тем, что нам и было нужно.

4. Стартуем демон на всех нодах:

/etc/init.d/lsyncd start

Если Вы оставили «nodaemon = true» в конфиге, то сможете видеть что происходит.

Скорость передачи данных достигает 300 Мбит/с и на загрузку сервера это мало влияет (по сравнению с тем же GlusterFS, например), да и задержка в данном случае сглаживает пики. Многое еще зависит от используемой ФС. Тут тоже пришлось провести маленькое исследование, с цифрами и графиками, так как ситуация довольно специфическая и результаты существующих опубликованных тестов не отражают того, что требуется в задаче.

Что еще было рассмотрено и почему не подходит в данном случае

Все исследование было нацелено на работу с Amazon EC2, с учетом ее ограничений и особенностей, поэтому полученные выводы в основном касаются только ее.
  • DRBD – репликация идет на блочном уровне. В случае деградации одного носителя убиваются оба. Ограничение в 2 ноды. (Больше можно, но 3 и 4-й можно подключить только как слейвы.)
  • Ocfs2 – используется либо поверх DRBD (о чем есть хорошая на хабре), либо нужно иметь возможность монтировать один раздел с нескольких нод. Невозможно на ec2.
  • Gfs2 – аналог ocfs2. Не пробовал, т. к. согласно тестам эта ФС медленней ocfs2, в остальном - ее аналог.
  • GlusterFS – вот тут все заработало практически сразу и как надо! Проста и логична в администрировании. Можно сделать кластер до 255 нод с произвольным значением реплик. Создал кластерный раздел из пары серверов и примонтировал его на них же но в другую директорию (то есть сервера были одновременно и клиентами). К сожалению на клиенте этот кластер монтируется через FUSE, и скорость записи оказалась ниже 3 МБ/сек. А так, впечатления от использования очень хорошие.
  • Lustre - чтобы запустить сие дело в krenel mode нужно патчить ядро. Как ни странно, в репозитории Ubuntu есть пакет с этими патчами, но вот самих патчей под нее или хотя-бы под Debian я не нашел. И судя по отзывам, понял, что завести это в deb-системе - шаманство.
  • Hadoop w/ HDFS, Cloudera - не пробовал, поскольку было найдено другое решение (см. ниже). Но первое что бросается в глаза - написано на Java, следовательно ресурсов кушать будет много, да и масштабы не как у Фесбука или Яху, всего 4 ноды пока.

UPD: Данное решение отлично себя показало на тестах (после чего и была написана статья), но в боевых условиях все оказалось совсем по другому. Минимальная продакшн-конфигурация - 584 тысячи вложенных директорий. А lsyncd навешивает inotify"и на каждую директорию. Сделать это сразу для всего дерева невозможно. Памяти, 584 тысячи нотифаев, съедают относительно немного, около 200 Мб (из 16 ГБ имеющихся), но вот процесс этот занимает 22 минуты. В принципе, не страшно: раз запустил и забыл. Но после этого, при стандартной конфигурации, lsyncd запускает синхронизацию всех файлов, которая в наших условиях либо глючила, либо занимала дни. В общем - не вариант. 100%-ная консистентность не требуется и без начальной синхронизации можно обойтись. Оставалось ее «выключить». Благо, демон написан так, что можно изменить практически все его функции прямо из конфига. Также, для увеличения производительности default.rsync был заменен на default.rsyncssh, а ядро натюнино на предмет лимитов inotify"а. То есть, для большинства задач подойдет конфиг выше, но в нашей конкретной ситуации работает следующее:

Settings = { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", statusInterval = 5, --<== чтобы видеть что происходит без включения подробного лога } sync { default.rsyncssh, source = "/raid", host = "node02", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, --<== описано выше delay = 3, --<== ставим по-меньше, чтобы очередь не забивать init = function(event) --<== перезагрузка функции инициализации. как она выглядела в оригинале можно посмотреть в документации или в исходниках log("Normal","Skipping startup synchronization...") --<== чтобы знать, что мы этот код вообще запускали и когда end } sync { default.rsyncssh, source = "/raid", host = "node03", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, delay = 3, init = function(event) log("Normal","Skipping startup synchronization...") end }

Настройки ядра

У inotify есть три параметра (см. ls /proc/sys/fs/inotify/):
max_queued_events - максимальное число событий в очереди; default = 16384;
max_user_instances - сколько инстансов inotify может запустить один пользоваетль; default = 128;
max_user_watches - сколько файлов может отслеживать один пользоваль; default = 8192.

Рабочие значения:
echo " fs.inotify.max_user_watches = 16777216 # fs.inotify.max_queued_events = 65536 " >> /etc/sysctl.conf echo 16777216 > /proc/sys/fs/inotify/max_user_watches echo 65536 > /proc/sys/fs/inotify/max_queued_events

Так все заработало уже в продакшине.

Спасибо за внимание!

рекрут 24 октября 2011 в 00:52

Rsync: мощная утилита для быстрого, гибкого удаленного и локального копирования файлов

  • Чулан *

Rsync разработан для замены rcp – древней программы для удаленного копирования под Unix. Благодаря широким возможностям синхронизации и передачи файлов, rsync часто применяется для создания зеркал.
Использование хитроумного алгоритма, позволяет rsync передавать только изменения в файлах, причем для выявления изменений ему не надо сравнивать два файла. Кроме того, rsync производит сжатие на лету, позволяя тем самым передавать файлы с максимальной эффективностью.
Кроме вышеописанных вкусностей, rsync обладает также и несколькими полезными возможностями обеспечения безопасности. Он поддерживает ssh – рекомендованный протокол для безопасной передачи данных; перед обработкой информации производит ее запись во временный файл, чтобы ничего не случилось с оригиналом, наконец, он поддерживает специальный режим безопасной отладки команд.
Rsync прост в использовании, но не является программой «click-and-play». Это -мощный инструмент, который может быть очень полезным, но не стоит забывать об осторожности, так как его с помощью легко что-нибудь испортить.

Синтаксис утилиты
Синтаксис утилиты простой и довольно обыденный.
rsync [опции] источник [приемник]
Указав только источник, мы увидим список файлов без операции копирования.

Опции и примеры
Для простоты понимания, операции синхронизации привожу сперва локально.
Быстрый способ синхронизировать два каталога, это использовать опцию -a :
rsync -a foobar_src/ foobar_dst/
В данном случае файлы и директории из источника скопируются в приемник, при этом, если там были файлы, то совпавшие по имени будут перезаписаны, а остальные не тронуты.

Опция -a задает архивный режим работы утилиты, и является эквивалентом набора опций:
-r, --recursive - рекурсивный режим;
-l, --links - пересоздание symlinks , это значит, что символические ссылки будут так же переноситься;
-p, --perms - перенос прав;
-t, --times - передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации;
-g, --group - установить группу конечного файла таким же, как и у исходного;
-o, --owner - установить владельца конечного файла таким же, как и у исходного;
-D, - same as --devices --specials - установить тип файла устройства и файла специального типа таким же, как у исходного.
В итоге получаем копию директории источника. Кстати, это можно использовать при переносе ОС на другой винчестер, подправив /etc/fstab, установив/переустановив grub на новом винте - получаем рабочую систему, но это уже другая тема.

Для вывода информации о работе утилиты, существует опция -v, --verbose . Чем больше опций -v , тем боле информативным будет вывод утилиты. Максимальная информативность достигается при четырех опциях -v, --verbose .

Если у нас содержится в директории источника актуальная информация, то чтобы не засорять приемник информацией, которая в процессе работы была удалена или перемещена в источнике, нужно старые файлы и директории удалить. Для этого есть несколько опций удаления, каждая из которых предоставляет свой алгоритм удаления. Их аж шесть!
--del - сокращенная форма --delete-during ;
--delete - просто удалить посторонние файлы из приемника;
--delete-before - приемник удаляет перед передачей;
--delete-during - приемник удаляет в процессе передачи, но не перед;
--delete-delay - отложенное удаление/найти файлы для удаления в процессе передачи, но удалить после передачи;
--delete-after - приемник удаляет после передачи, но не перед ней;
--delete-excluded - так же удалить исключенные файлы в приемнике, для этого задается шаблон (--exclude=PATTERN).

Допустим у нас на приемнике есть более свежие файлы, и мы не хотим что бы они были перезаписаны старыми из источника, то для этого применяется ключ -u, --update .
-u, --update - пропустить файлы, если на приемнике файл новее.
Не стоит пугаться если изменились даты директорий, т.к. сами файлы небыли перезаписаны.

Порой файлы могут повредится или быть модифицырованы, но совпадать и датой и размером. То можно использовать проверку контрольной суммы, опция -c, --checksum .

Моей задачей было разобраться, как сделать резервную копию коллекций фотографий, музыки, наработок по университету и работе. При этом в источнике информация всегда актуальная, а то что удалено - мусор. Пример для решения моей задачи:
rsync -auvv --delete-during foobar_src/ foobar_dst/
Это обновит мой приемник, если он был уже чем то заполнен - вычистит то, чего нет в источнике, но не затронет файлы которые поновее, выведет статистику и состояние по каждому файлу.

Удаленная работа
Кроме того, очень полезным будет его способность работать через ssh. Что обеспечивает шифрование канала, что очень важно, если вы синхронизируете два сервера в сети интернет. Для уменьшение трафика, rsync так-же умеет сжимать данные, при передаче по сети.
Необходимы следующие опции:
-e - задать удаленный шелл для использования;
-z - сжимать передаваемые данные, либо задать:
-compress-level=9 - сжатие с установкой уровня компрессии.

Пример копирования с удаленного хоста по протоколу ssh:
rsync -avv --delete-during -compress-level=9 -e "ssh -p remote_ssh_port" user@host:/dir/to/foobar_src foobar_dst/
При этом, на стороне источника нужно иметь установленную утилиту rsync.

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

Теги: rsync, копирование, резервирование файлов, синхронизация файлов

rsync использует соглашение о длинных именах параметров GNU. Многие из параметров командной строки имеют два варианта: один - короткий, а другой - длинный. Ниже это отражено в разделении запятой двух вариантов. Некоторые параметры имеют только длинный вариант. Знак "=" для параметров с дополнительным значением необязателен и может быть заменен на пробел.

    H, --help Печатает короткую подсказку, описывающую доступные параметры rsync

    Version Печатает номер версии rsync и завершается

    V, --verbose Этот параметр увеличивает сумму подробностей, которые выводятся в течение передачи. По умолчанию, rsync работает молча. Один -v будет иметь следствием выдачу списка переданных файлов и короткий итог в конце. Два -v раскрывают детали о пропущенных файлах и выдают несколько больше информации в завершение. Большее число может понадобится только при отладке rsync.

    Q, --quiet Уменьшает сумму подробностей о передаче, преимущественно, сообщения от удаленного сервера. Этот параметр полезен при вызове из cron.

    I, --ignore-times Обычно rsync пропускает файлы, чей размер и время модификации идентичны. Этот параметр отключает такое поведение "быстрой проверки".

    Size-only Обычно rsync пропускает файлы, чей размер и время модификации идентичны. С --size-only файлы будут пропускаться, если их размер одинаков, независимо от времени модификации. Это полезно при использовании rsync сразу после работы другой зеркалирующей системы, которая не сохранила точно времена.

    Modify-window При сравнение двух меток времени rsync рассматривает эти метки равными, если они расходятся в пределах значения modify_window. Обычно это значение ноль, но Вы можете найти полезным установку его в большую величину в некоторых случаях. На практике, при передаче на файловую систему Windows FAT, которая не может представлять время с точностью до секунды, --modify_window=1 весьма полезна.

    C, --checksum Принуждает на передающей стороне подсчитывать контрольные суммы всех файлов, используя 128-битный алгоритм MD4 перед передачей. Контрольная сумма затем проверяется на приемной стороне для того, чтобы пропускать передачи уже существующих файлов с одинаковыми размером и контрольной суммой. Этот параметр может приводить к некоторому замедлению.

Однако заметьте, что -a не сохраняет жесткие ссылки, потому что поиск многосвязных файлов дорог. Вам придется отдельно указывать -H.

    R, --relative Использовать относительные пути. Это значит, что посылаются полные пути, указанные в командной строке, а не последние части имен файлов. На практике это полезно, когда Вам нужно послать несколько различных каталогов за раз. Например, если указать команду:

rsync foo/bar/foo.c remote:/tmp/

то она создаст файл foo.c в /tmp на удаленной машине. Если вместо этого указать

Rsync -R foo/bar/foo.c remote:/tmp/

то файл создастся в /tmp/foo/bar/foo.c на удаленной машине - полный путь сохранится.

Выключает параметр --relative. Это нужно только если Вы хотите использовать параметр --files-from без подразумеваемого им поведения с включенным параметром --relative.

    No-implied-dirs

В комбинации с --relative все затрагиваемые каталоги в каждом пути явно не копируются как часть процесса передачи. Это делает передачу более оптимальной и также позволяет иметь непарные (см. пример ниже) символьные ссылки в подразумеваемых передачей путях. Например, если передается файл "/path/foo/file" с параметром -R, то по умолчанию rsync следит, чтобы "/path" и "/path/foo" в точности соответствовали каталогам/ссылкам на приемной стороне. Параметр --no-implied-dirs позволяет игнорировать несоответствие, когда "/path" - реальный каталог на одной стороне и символьная ссылка на другой. rsync не пытается с этим параметром что-либо менять в этом случае.

    B, --backup С этим параметром существовавшие до передачи файлы на приемной стороне переименовываются, как только соответствующий файл передан или удален. Вы можете контролировать, куда перемещаются файлы и какой суффикс (если нужно) добавляется к имени, используя параметры --backup-dir и --suffix.

    Backup-dir=DIR В комбинации с --backup указывает каталог, куда сохранять резервные копии. Это весьма полезно для инкрементального резервирования. Вы можете дополнительно указать суффикс с помощью --suffix (иначе резервные копии файлов будут сохранять свои исходные имена).

    Suffix=SUFFIX Этот параметр позволяет указать суффикс, отличный от суффикса по умолчанию, для резервных копий файлов при установленном --backup (-b). По умолчанию этот суффикс установлен в ~ без установки --backup-dir, установка которого сбрасывает этот суффикс в пустую строку.

    U, --update Указывает пропускать любые файлы, уже существующие на приемной стороне с более поздней датой, чем у исходных файлов.

    L, --copy-links Если обнаружена символьная ссылка, то на приемную сторону копируется файл, на который она указывает, а не такая же символьная ссылка.

    Copy-unsafe-links Копирует все объекты за пределами исходного дерева каталогов, на которые ссылаются символьные ссылки. Абсолютные символьные ссылки, а также, при выставленном --relative, любые символьные ссылки в пределах исходного дерева каталогов, рассматриваются как обычные файлы.

    Safe-links Указывает игнорировать любую символьную ссылку, которая относится к объекту за пределами конечного дерева каталогов. Все абсолютные ссылки также пропускаются. Использование этого параметра в комбинации с --relative может дать неожиданные результаты.

    H, --hard-links Указывает пересоздать жесткие ссылки на конечной стороне в соответствии с тем, что имеется на исходной. Без этого параметра жесткие ссылки обрабатываются как обычные файлы.

Обратите внимание, что rsync может обнаруживать жесткие ссылки, только если обе части ссылки попадают в список предназначенных к передаче файлов. С этим параметром передача может быть довольно-таки медленной, так что пользуйтесь им только при необходимости.

    W, --whole-file Этот параметр отключает дифференциальный алгоритм rsync"а и с ним весь файл передается как есть, целиком. Передача может происходить быстрее с этим параметром, если полоса пропускания между исходной и конечной машинами шире, чем полоса пропускания доступа к диску (особенно, если "диск" в действительности сетевая файловая система). Этот параметр включен по умолчанию, если и исходная, и конечная цели находятся локально.

    No-whole-file Выключает действие параметра --whole-file, если последний включен по умолчанию.

    P, --perms Копирует все права на приемную сторону точь в точь с оригиналом.

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

    O, --owner Копирует атрибуты владельца на приемную сторону в точности с оригиналом. На большинстве систем только супер-пользователь имеет право устанавливать владельца файла. Нужно заметить, что если удаленный демон действует в chroot-окружении, то подразумевается наличие параметра --numeric-ids, потому что на удаленной стороне в этом случае нет доступа к именам пользователей в /etc/passwd.

    G, --group Копирует атрибуты группы на приемную сторону в точности с оригиналом. Если удаленная сторона не действует из-под супер-пользователя, то сохранятся только те значения групп, членом которых является пользователь приемной стороны (имеет значение имя группы, а не ее id).

    D, --devices Указывает передавать информацию о символьных и блочных устройствах для пересоздания их на приемной стороне. Доступно только супер-пользователю.

    T, --times Указывает передавать время модификации файлов и обновлять им соответствующий атрибут на приемной стороне. Обратите внимание, что если этот параметр не установлен, то становится неэффективной оптимизация передачи по исключению не изменявшихся по времени файлов; другими словами, пропуск -t или -a будет означать, что следующая передача будет осуществляться с параметром -I, для всех файлов будут сравниваться контрольные суммы, а в журнале появятся соответствующие сообщения о них, даже если они не изменялись.

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

    S, --sparse Пытаться эффективнее обработать фрагментацию файлов, чтобы сэкономить пространство на приемной стороне.

ЗАМЕЧАНИЕ: Не используйте этот параметр, если в точке назначения имеется файловая система "tmpfs" Solaris. Не представляется возможным правильно управлять поиском среди "дырок" (null regions), что заканчивается повреждением файлов.

    Existing Указывает не создавать никаких новых файлов - только обновить те, которые уже существуют на приемной стороне.

    Ignore-existing Указывает не обновлять файлы, которые уже существуют на приемной стороне.

    Max-delete=NUM Не удалять больше, чем NUM файлов и каталогов. Это полезно при зеркалировании очень массивных деревьев каталогов для предохранения от неприятностей.

    Delete Удалять любые файлы на приемной стороне, которых нет на передающей. Файлы, исключенные из передачи, исключаются также и из процесса удаления, если не указана --delete-excluded.

Этот параметр не оказывает никакого влияния, если не включено рекурсивное копирование каталогов. Этот параметр может быть опасным при неправильном использовании! Очень хорошим правилом может стать использование сначала холостого выполнения rsync (-n) для просмотра того, что за файлы могут удалиться и нет ли среди них важных. При возникновении каких-либо ошибок ввода-вывода на передающей стороне удаление любых файлов на приемной автоматически отключается. Это предотвращает от массивного удаления файлов на приемной стороне из-за временных ошибок файловой системы (например, NFS) на передающей. Это поведение можно отключить параметром --ignore-errors.

    Delete-excluded В дополнение к файлам, удаляемым на приемной стороне из-за отсутствия их на передающей, указывает удалять также любые исключенные параметром --exclude файлы на приемной стороне. Подразумевается наличие параметра --delete.

    Delete-after По умолчанию, rsync сначала выполняет удаление файлов перед копированием для пущей уверенности, что хватит свободного места на приемной стороне. Если же Вы хотите, чтобы удаление производилось после, то используйте --delete-after. Подразумевается наличие параметра --delete.

    Ignore-errors При удалении (--delete) форсирует процесс и игнорирует любые ошибки, даже ошибки ввода-вывода.

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

    Delete, потому что удаление происходит только каталогов одного уровня. Требует --recursive (который подразумевается, если -a) для значимого эффекта.

    B, --block-size=BLOCKSIZE Регулирует размер блока, используемый rsync-алгоритмом. См. техническое описание на предмет деталей.

    E, --rsh=COMMAND Позволяет выбрать альтернативную программу удаленной оболочки для осуществления соединения между удаленной и локальной копиями rsync. Обычно rsync сконфигурирован для использования ssh по умолчанию, но Вы можете предпочесть использовать rsh в локальной сети.

Если этот параметр используется с указанием пути вида host::module/path, то программа удаленной оболочки COMMAND будет использована для запуска rsync-сервера на удаленной стороне, а все данные будут передаваться через соединение удаленной оболочки, а не напрямую через соединение с rsync-сервером на "том" конце. См. раздел "ПОДКЛЮЧЕНИЕ К RSYNC-СЕРВЕРУ ЧЕРЕЗ УДАЛЕННУЮ ОБОЛОЧКУ". Аргументы командной строки для COMMAND разрешено указывать в форме, при которой COMMAND представляется для rsync в виде одного аргумента. Например:

    E "ssh -p 2234" (Заметьте, что ssh-пользователи могут альтернативно настраивать специфичные для своего окружения параметры подключения в своих.ssh/config файлах.)

Вы также можете выбирать программу удаленной оболочки через переменную окружения RSYNC_RSH, которая принимает тот же диапазон значений, что и -e. См. также --blocking-io, на которую влияет установка параметра -e.

    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 затем файлы, перечисленные в $HOME/.cvsignore , добавляются к первоначальному списку, а также любые, перечисленные в переменной окружения CVSIGNORE (разделенные пробелами). В заключение, любой файл пропускается, если в том же каталоге есть файл.cvsignore, в котором есть соответствующий файлу шаблон. См. руководство по cvs(1) для дальнейшей информации. * --exclude=PATTERN Позволяет выборочно исключать определенные файлы из процесса передачи. Это наиболее полезно при рекурсивной передаче.

Вы можете использовать так много --exclude, как Вам заблагорассудится для построения произвольного списка исключаемых файлов. См. секцию "ШАБЛОНЫ ИСКЛЮЧЕНИЯ" за информацией о синтаксисе для этого параметра.

    Exclude-file=FILE Подобен параметру --exclude, но в отличие от него использует шаблоны исключаемых фалов, перечисленные в файле FILE. Пустые строки вместе со строками, начинающимися с ";" или "#", игнорируются. Если FILE указан как -, то список шаблонов читается со стандартного ввода.

    Include=PATTERN Указывает шаблоны для имен тех файлов, которые нельзя исключать из процесса. Полезен тем, что позволяет Вам строить довольно сложные правила включения/исключения.

См. секцию "ШАБЛОНЫ ИСКЛЮЧЕНИЯ" за информацией о синтаксисе для этого параметра.

    Include-from=FILE Указывает брать список обязательно включаемых в передачу файлов из файла FILE. Если FILE указан как -, то список шаблонов читается со стандартного ввода.

    Files-from=FILE Позволяет задать точный список файлов для передачи (который будет прочитан из указанного FILE или из стандартного ввода, если указан -). Это также меняет поведение rsync по умолчанию в целях облегчения процесса передачи заданных файлов и каталогов. Например, по умолчанию включается использование опции --relative (для отключения этого используйте --no-relative), на принимающей стороне создаются все указанные в списке каталоги (а не пропускаются безгласно, как если бы не использовалась опция -r), а поведение -a (--archive) не подразумевает наличие -r (--recursive) - его, при необходимости, нужно указывать явно.

Все имена файлов, прочитанные из FILE, считаются относительными к исходному каталогу -- первые слэши убираются и не допускаются ссылки "..", указывающие выше по дереву исходного каталога. Для примера рассмотрим:

    rsync -a --files-from=/tmp/foo /usr remote:/backup

Если /tmp/foo содержит строку bin (или даже "/bin"), каталог /usr/bin будет создан как /backup/bin на удаленной машине (но содержимое /usr/bin не должно передаваться, кроме тех случаев, когда объекты явно указаны в /tmp/foo, или в случае указания параметра -r). Также учитывайте, что эффект от --relative (включенный по умолчанию) касается копирования путей, прочитанных из файла, -- он не принуждает копировать полностью указанный исходный путь (/usr в примере). В дополнение, --files-from файл может быть прочитан с удаленной машины, а не локально, если указать перед именем файла "host:" (это должно соответствовать одному из концов передачи). Для краткости, можно указывать только префикс ":" для обозначения удаленного участника копирования. Например: rsync -a --files-from=:/path/file-list src:/ /tmp/copy эта команда должна скопировать все файлы указанные в файле /path/file-list, который расположен на удаленной машине "src".

    0, --from0 Говорит rsync, что имена файлов, читаемые извне, заканчиваются символом "\0", не NL, CR или CR+LF. Это касается параметров --exclude-from, --include-from, and --files-from.

    T, --temp-dir=DIR

Инструктирует использовать DIR как каталог временных копий передаваемых файлов на принимающей стороне. По умолчанию временные файлы создаются в каталоге назначения.

    Compare-dest=DIR Инструктирует использовать DIR на машине назначения как каталог, относительно содержимого которого осуществляется сравнение во время процесса передачи при условии отсутствия файлов в каталоге назначения. Это полезно для осуществления передачи в новое место, оставляя существующие файлы неприкосновенными, а затем перенося и очищая, когда все файлы были переданы (например, при перемещении каталогов в новое место и удалении старого, хотя при этом пропускаются не изменявшиеся файлы; см. также --link-dest).

Прим. переводчика: Существование этого параметра обусловлено необходимостью обновлять, например, дерево с взаимозависимыми файлами. В этом случае нежелательно осуществлять копирование на пофайловой основе. Параметр --compare-dest позволяет указывать временный каталог назначения, куда и копируются передаваемые файлы. По окончании процесса передачи rsync переименовывает оригинальное дерево назначения, затем переименовывает временный каталог DIR в оригинальный и, наконец, удаляет переименованный на первом шаге оригинальный каталог со "старыми" файлами. Этот параметр повышает полезность --partial, потому что частично переданные файлы будут оставаться в новом временном каталоге до тех пор, пока не окажутся целиком на месте. Если DIR задан как относительный путь, то он соотносится к каталогу назначения.

    Link-dest=DIR Ведет себя также, как и --compare-dest, но также создает жесткие ссылки в DIR на не изменявшиеся файлы в каталоге назначения. Файлы с измененными правами и владением не подвергаются этому. Как и в случае --compare-dest, если DIR задается относительным именем, то и действия осуществляются относительно каталога назначения.

    Z, --compress С этим параметром rsync сжимает все передаваемые данные файлов. Это полезно на медленных линиях. Метод сжатия, используемый при этом, тот же, что реализует gzip.

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

    Numeric-ids Вместо имен групп и пользователей посылаются их числовые id и ставятся в соответствие друг другу на обоих концах.

По умолчанию rsync использует имена групп и пользователей для определения владельца файлов. Специальные uid 0 и gid 0 никогда не отображаются через имена пользователей/групп, даже если не указана --numeric-ids. Если исходная система работает в ограниченном chroot-окружении или если пользователь или группа не существуют на приемной стороне, то используются исходные числовые id.

    Timeout=TIMEOUT Позволяет устанавливать максимальное время ожидания ввода-вывода в секундах. Если за указанный период ничего не передано, то работа rsync завершается. По умолчанию 0, что означает без ожидания.

    Daemon Запускает rsync как демон. Демон доступен для клиентов через синтаксис host::module или rsync:/\/host/module. Если стандартным вводом является сокет, то rsync полагает условием запуск от inetd, иначе он отключается от текущего терминала и становится фоновым процессом-демоном. Демон читает конфигурационный файл (rsyncd.conf) на каждое соединение от клиентов и соответственно отвечает на их запросы.

    No-detach При запуске демоном этот параметр инструктирует rsync не отключаться от терминала и стать фоновым процессом. Он требуется при запуске службой под Cygwin, и также может быть полезен, если rsync находится под наблюдением таких программ как daemontools или AIX"s System Resource Controller. --no-detach также рекомендуется к применению при запуске rsync под отладчиком. Этот параметр не имеет никакого эффекта при запуске от inetd или sshd.

    Address По умолчанию rsync использует групповой адрес 0.0.0.0, когда запускается как демон с --daemon или при подключениях к rsync-серверу. --address позволяет Вам указать точный IP-адрес (или хост-имя) для этого. Это делает возможным виртуальный хостинг в сочетании с --config.

    Config=FILE Указывает альтернативный файл конфигурации. Это имеет значение только если указан --daemon. По умолчанию /etc/rsyncd.conf за исключением случая, когда демон запускается поверх удаленной оболочки и удаленный пользователь не root. В последнем случае rsyncd.conf по умолчанию располагается в текущем каталоге (обычно $HOME).

    Port=PORT Указывает альтернативный номер TCP порта для работы, а не 873 по умолчанию.

    Blocking-io Указывает использовать блокирующий ввод-вывод при запуске поверх программы-транспорта удаленной оболочки. Если этой программой являются либо rsh, либо remsh, то rsync использует блокирующий ввод-вывод по умолчанию, иначе по умолчанию используется неблокирующий ввод-вывод. (Заметьте, что ssh предпочитает неблокирующий.)

    No-blocking-io Отключает действие --blocking-io, когда оно активировано по умолчанию.

    Log-format=FORMAT Позволяет Вам точно указывать, что rsync сообщает (журналирует) на стандартный вывод на по-файловой основе. Формат сообщений определяется тем же соглашением, что и для параметра журналирования в файле rsyncd.conf.

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

    Partial По умолчанию rsync будет удалять все частично-переданные файлы в случае прерывания передачи. В некоторых случаях более желательно сохранять такие файлы. Используя параметр --partial, можно указать rsync сохранять частично-переданный файл, что может ускорить передачу всего файла при последовательном повторении таких передач.

    Progress Указывает выводить rsync информацию о ходе передачи. Скучающему пользователю будет на что посмотреть. Подразумевает наличие --verbose без увеличения подробностей.

    P Эквивалент для --partial --progress . Автор нашел для себя частым использование этой комбинации, поэтому для облегчения ввел отдельный параметр.

    Password-file Позволяет Вам предоставить пароль для доступа к rsync-серверу, сохранив его в файле. Заметьте, что этот параметр полезен только при использовании для доступа к rsync-серверу встроенного rsync-транспорта, при использовании программы удаленной оболочки он бесполезен. Файл не должен быть всем доступен на чтение. Он должен содержать только пароль, в одну строчку.

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

    Write-batch=PREFIX Генерирует набор файлов, которые могут быть переданы в пакетном обновлении. Каждое имя файла в наборе начинается с PREFIX. См. раздел "ПАКЕТНЫЙ РЕЖИМ" за деталями.

    Read-batch=PREFIX Применяет ранее сгенерированный пакет изменений, используя тот набор файлов, чьи имена начинаются с PREFIX. См. раздел "ПАКЕТНЫЙ РЕЖИМ" за деталями.

Опции rsync

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

    V - подробный вывод информации о происходящем. Можно указывать несколько раз. Позволяет развлечься разглядыванием кучи внутренней информации о пересылки данных в процессе обновления.

    Inplace - обновление образа производится без создания временного файла. Полезно при недостатке места, а также в случае нестабильной связи: --inplace позволяет продолжить обновление образа с того места, на котором обновление прекратилось из-за обрыва связи. Использование этой опции слегка снижает эффективность работы алгоритма расчёта разницы между файлами.

    H, --human-readable - показывать размеры переданных/обработанных данных в удобном виде (вместо байт), например 234K или 1,35G

    Z, --compress - включить сжатие передаваемых данных.

    Progress - показывать индикацию процесса обработки файла.

    Partial - не удалять локальный файл перед синхронизацией

    P - тоже что и --partial вместе с --progress

    Stats - выводить статистику - показывает сколько было принято/передано, сколько удалось сэкономить и т.п.

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

Rsync примеры синхронизации: основное использование

Давайте создадим две директории внутри / tmp, называемые «foo» и «bar», и создадим большое количество фиктивных файлов внутри / tmp / foo

mkdir /tmp/foo /tmp/bar
for i in `seq 1 100`;do touch /tmp/foo/file$i;done

Теперь у нас есть 100 файлов в / tmp / foo; / Tmp / bar все равно не должно быть. Мы можем использовать rsync для копирования всех файлов из / tmp / foo в / tmp / bar:

rsync /tmp/foo/* /tmp/bar

Используя базовое файловое расширение, мы можем захватить все файлы и скопировать их в другой каталог. Что делать, если есть каталог внутри / tmp / foo? Он не будет передан. Нам нужно будет использовать флаг -r (-рекурсивный), чтобы пройти по каталогу, передав каждый файл внутри:

rsync -r /tmp/foo/ /tmp/bar

Это очень простой пример и даже не затрагивает реальную силу команды rsync. Существуют флаги для сохранения разрешений, владельцев, групп, символических ссылок и т. Д. Поскольку эти флаги так часто используются, флаг -a (-archive) действует как псевдоним, чтобы включить их все, включая -r.

Очистите / tmp / bar, создайте символическую ссылку на один файл в / tmp / foo и используйте rsync для рекурсивной копирования всех файлов:

find /tmp/bar -delete
ln -s /tmp/foo/file100 /tmp/foo/file101
rsync -r /tmp/foo/ /tmp/bar

Мы видим, что rsync опустил символическую ссылку, которую мы создали. Снова очистите / tmp / bar, и давайте попробуем еще раз, на этот раз с использованием флага -a:

find /tmp/bar -delete
rsync -a /tmp/foo/ /tmp/bar

Используйте chown для изменения права собственности на файл в / tmp / foo другому пользователю и скопируйте файлы, используя -a to / tmp / bar. Запустите ls -l и обратите внимание, что право собственности перемещено вместе с файлом. Удобный материал!

ПРИМЕЧАНИЕ . Существует разница между включением косой черты (/) в конце пути источника и ее отсутствием; Первый передаст все файлы ВНУТРИ указанного каталога, в то время как последний передаст сам каталог со всеми файлами внутри.

The -a Flag

Как мы и говорили ранее, в этой статье мы разберем Rsync примеры синхронизации и команды. Но для того чтобы их выполнять, нужно знать основы для набора флагов.
Ранее мы упоминали, что флаг -a (-archive) является псевдонимом для набора других флагов -rltpgoD. Сломанный, каждый флаг выполняет следующие действия:

R — Рекурсивный

L — Перенести любые обнаруженные символические ссылки

T — Сохранять метки времени

P — Сохранять разрешения

G — Сохранять группы

O — Сохранять право собственности

D — Сохранение блоков и символьных устройств

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

H — Удобный для чтения формат файлов

Все любят отзывы

Флаг -v (–verbose) даст вам больше информации о состоянии передачи, включая краткое изложение в конце, которое будет выглядеть примерно так:

$ rsync -av foo/ bar
building file list … done
sent 1040 bytes received 20 bytes 2120.00 bytes/sec
total size is 7 speedup is 0.01

Если вы хотите получить больше статистики, запустите rsync с флагом -stats. Это даст вам подробный список общего количества файлов, переданных файлов, контрольных показателей и даже усредненной скорости передачи. С другой стороны, -q (-quiet) будет подавлять весь вывод, который может использоваться для скриптов, когда обратная связь не требуется.

Удаленные передачи сделаны просто

Истинная сила rsync заключается в способности выполнять не только локальные передачи, но и отдаленные передачи. Если вы раньше использовали scp, синтаксис для удаленных передач очень похож:

rsync @:

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

rsync -avh /tmp/foo/ root@host2:/tmp/bar

Обратите внимание на: (двоеточие) между удаленным сервером и удаленным путем; Это необходимо.

Больше вариантов

Rsync поставляется с большим списком доступных опций, слишком много, чтобы переходить в одну статью. Последними флагами, которые мы рассмотрим, являются флаги -exclude, -exclude-from, -update и -delete

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

Исключить файлы, перечисленные в файле с разделителями строк.

Обновлять файлы в месте назначения ТОЛЬКО, если исходная копия была изменена совсем недавно

Удалите файлы в месте назначения ТОЛЬКО, если исходная копия больше не существует.

Альтернативные порты SSH

Если вы изменили порт SSH на своем сервере, вам нужно будет указать rsync использовать новый номер порта.

Пример с обычным портом SSH:
rsync -azh /local/path/file [email protected]:/remote/path/file

Пример с альтернативным портом SSH (22334):
rsync -azh /local/path/file -e ‘ssh -p 22334’ [email protected]:/remote/path/file

Удаленные передачи без пароля

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

Если у Вас остались вопросы по теме «Rsync примеры синхронизации» - пишите их в комментарии. Обязательно укажите какую версию операционной системы вы используете, чтобы мы могли помочь с вашим вопросом.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter .