бро 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 ... SRC [SRC ]... DEST rsync ... SRC [SRC ]... HOST:DEST rsync ... SRC [SRC ]... HOST ::DEST rsync ... SRC [SRC ]... rsync://HOST [:PORT ]/DEST rsync ... SRC rsync ... HOST:SRC [DEST ] rsync ... HOST::SRC [DEST ] rsync ... rsync://HOST[:PORT ]/SRC [DEST ]

Описание

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

Возможности программы:

  • поддержка копирования ссылок, устройств, владельцев, групп и прав доступа к файлам;
  • использовать функции, аналогичные tar в графической оболочке;
  • режим, игнорирующий CVS файлы;
  • возможность использования удаленных консольных соединений ssh и rsh;
  • не требует привилегий суперпользователя (root);
  • конвейерная передача данных, уменьшающая время синхронизации
  • поддержка анонимного копирования с помощью демонов, что позволяет создавать автоматические "зеркала" данных.

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

Существует два варианта связи с удаленным компьютером, это использование rcync-демона а в этом случае связь идет напрямую, через протокол TCP и соединение с помощью дистанционного терминального соединения, такого как ssh.

Для указания типа соединения с узлом используется символ двоеточия ":", если оно использовано один раз перед именем узла, то это будет соединение через ssh. При использовании демона, двоеточие указывается дважды или адрес узла задается в виде rsync://имяузла.

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

Необходимо помнить, что rsync должен быть установлен и на компьютере получателе и отправителе.

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

Примеры:

Перенести все файлы, совпадающие с шаблоном *.c из текущей папки на компьютер foo в папку scr. При этом если на удаленном компьютере существуют файлы с такими именами, то будут передаваться только изменения, а не файлы целиком.

Rsync -t *.c foo:src/

Перенести все файлы из папки src/bar, включая подпапки и их содержимое с компьютера foo в папку /data/tmp/bar на локальном компьютере. При этом при переносе будет использован режим сжатия данных и "архивный" режим, позволяющий сохранить символьные ссылки, права, атрибуты, владельцев.

Rsync -avz foo:src/bar /data/tmp

Слэш в конце указания пути источника данных позволяет изменить поведение команды и не создавать новую подпапку на компьютере получателе, например две следующие команды выполняют одинаковое действие:

Rsync -av /src/foo /dest rsync -av /src/foo/ /dest/foo

Скопировать файлы file1 и file2 с помощью демона на локальный компьютер в папку /dest. Каждый добавленный файл или папка источник должен содержать /modname/ и перед ним должен быть пробел. Все остальные пробелы считаются частью имени файла.

Rsync host::"modname/dir1/file1 modname/dir2/file2" /dest

Скопировать файлы file1 и file2 на локальный компьютер в папку /dest с помощью дистанционного подключения к оболочке bash. Обработка имен файлов происходит на удаленном компьютере и возможна ситуация, когда удаленный компьютер неправильно обработает пробелы (очень редко).

Rsync -av host:"dir1/file1 dir2/file2" /dest

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

Rsync -av host:"file\ name\ with\ spaces" /dest rsync -av host:file?name?with?spaces /dest

Работа через демона

Прямое подключение к rsync демону обычно происходит через 873 TCP порт и необходимо, чтобы он был запущен для приема на удаленном компьютере. Работа через демона аналогична работе через оболочку bash за исключением:

  • Необходимо использование двух символов "::" для разделения имени компьютера (хоста) и пути или указание в виде rsync://имяузла.
  • первое слово в "пути" это имя модуля.
  • удаленный демон может вывести сообщение о моменте подключения
  • если не указать путь на удаленном компьютере, то будет показан список доступных путей
  • нельзя использовать параметры, предназначенные для режима --rsh

Например, копировать все файлы, доступные удаленному модулю с именем src.

Rsync -av host::src /dest

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

Возможно подключение через прокси сервер с помощью установки значения переменной в оболочке bash RSYNC_PROXY. При этом необходимо проверить, что конфигурация web proxy поддерживает соединения через порт 873.

Иногда полезно использовать возможности демона при соединении по ssh. Такой режим полезен, например, для шифровки передачи данных. С точки зрения пользователя синтаксис команды передачи данных с помощью демона через удаленное sh соединение практически не отличается от обычного соединения с помощью демона. За исключением необходимости явного указания соединения через rsh в командной строке с помощью параметра --rsh=КОМАНДА . (Переменная bash RSYNC_RSH в данном случае не может быть применена). Например:

Rsync -av --rsh=ssh host::module /dest

В случае если необходимо использование другого пользователя удаленного компьютера, то нужно учитывать, что Пользователь, указанный перед символом @ указывает на имя пользователя модуля rsync, а не компьютера. А пользователь ssh указывается с помощью параметра -l например:

Rsync -av -e "ssh -l ssh-user1" rsync-user2@host::module /dest

Где user1 - это пользователь ssh, а user2 пользователь для доступа к модулю, если это требуется.

Запуск rsync-демона для приема соединений.

Для того чтобы было возможно соединение с помощью демона, он должен быть запущен на удаленном компьютере. Процедура запуска и настройки демона описана в описании rsyncd.conf (5) . При использовании --rsh ручной запуск не требуется.

Параметры rsync

Многие параметры команды имеют длинное и короткое написание, некоторые имеют только "длинный" вариант. Для установки значения после параметра необходимо использовать конструкцию "=Значение".

Краткое Длинное написание Описание параметра
--help Напечатать описание параметров и выйти
-version Показать версию программы
-v --verbose Подробный режим. Увеличивает объем информации, показываемый во время передачи данных. Однократное использование -v дает информацию о времени передачи и краткое резюме в конце. Двойное использование -v дополнительно сообщит о пропущенных файлах и дополнительную информацию о передаче. Использование большего количества -v возможно только во время отладки.
-q --quiet Этот параметр уменьшает объем диагностической информации о передаче данных. Полезен при синхронизации по расписанию, с помощью CRON .
--no-motd Подавляет вывод информации при запуске передачи с помощью демона. И запрещает выводить список доступных модулей при команде "rsync host::"
-I --ignore-times Обычно rsync не синхронизирует файлы, имеющие одинаковый размер и время редактирования. Этот параметр отключает "быструю проверку" изменений и требует полного копирования.
--size-only В случае применения данного параметра файлы, имеющие одинаковый размер на источнике и получателе не будут переноситься независимо от времени их создания и изменения.
--modify-window При сравнении двух дат rsync будет считать даты равными, если они будут отклоняться на значение меньшее, чем задано в данном параметре. Например, при обмене файлами с накопителем в формате MS FAT желательно установить временной интервал в 2 секунды (--modify-window=2).
--checksum Это параметр заставляет отправителя передать контрольные суммы каждого файла (128-бит MD4 CRC). Это происходит в начале сканирования файловой системы, при построении списка доступных файлов, и используется для проверки изменений файлов на приемнике (в том случае если размер и метки времени совпадают). Так как требуется вычисление контрольных сумм на обоих компьютерах, то данная процедура может значительно замедлить процесс обмена данными.
При этом необходимо знать, что rsync всегда проверяет полученные файлы на правильность их восстановления с получением итоговой контрольной суммы всего файла. Но данная процедура не имеет ничего общего с расчетом контрольных сумм для определения изменений в файле.
-a --archive Данный параметр аналогичен группе параметров -rlptgoD . Это простой способ сказать, что необходимо сохранить почти все включая подпапки. Для сохранения жестких ссылок необходимо добавить параметр -x .
--no-OPTION С помощью префикса --no указанного перед параметром его действие можно отключить. К сожалению, не все параметры можно отключить данным способом. Можно использовать для отключения как коротких, так и длинных параметров, например: --no-R или --no-relative .
Так же можно отключить какой-либо параметр в составном ключе. Так можно в параметре -a, состоящего из -rlptgoD отключить -o:
-a --no-o или -a --no-owner .
При использовании --no необходимо учитывать, что существуют позиционные параметры, в которых учитывается последний параметр и непозиционные.
-r --recursive Рекурсивное копирование, включая подпапки. Дополнительно смотреть в команде -d --dirs .
-R --relative Использование относительных путей. Наглядно это видно на примере команды:
rsync -av /foo/bar/baz.c remote:/tmp/ В данном случае файл baz.c будет скопирован в папку /tmp/, а в случае команды:
rsync -avR /foo/bar/baz.c remote:/tmp/ файл будет скопирован в папку /tmp/foo/bar/
Начиная с версии 2.6.7 в путь можно вставить символы "./", которые отменят создание папок до символа точки, например команда:
rsync -avR /foo/./bar/baz.c remote:/tmp/ создаст на получателе файл /tmp/bar/baz.c
--no-implied-dirs Параметр влияет на работу параметра -R --relative . В этом случае атрибуты исходных каталогов не передаются, существующие папки не меняют свои атрибуты, а новые папки создаются с атрибутами по умолчанию
-b --backup Если уже существуют аналогичные файлы в папке назначения, то они будут переименованы, перенесены в другую папку или удалены. Можно указать папку для архива с помощью --backup-dir или задать суффикс с помощью --suffix .
--delete-excluded
--backup-dir=DIR Совместно с -b указывает на папку, куда будут архивироваться старые версии файлов на принимающей стороне. Это может быть использовано для послойных архивов. Также возможно использование параметра -suffix.
--suffix=SUFFIX Используется совместно с -b. Переопределяет суффикс по умолчанию для архивных копий заменяемых файлов. Если не указан каталог архивирования, то по умолчанию суффикс "~", иначе пустая строка.
-u --update Если файл на принимающей стороне свежее файла из источника, то он будет пропущен. Если метки времени файлов совпадают, а их размеры не, то файл будет заменен.
--inplace В этом случае rsync не будет создавать при копировании новый файл и затем им замещать старый, а сразу начнет перезапись старого файла. Такой алгоритм не сможет сохранить целостность файла в случае сбоя соединения между компьютерами, за исключением использования совместно с параметром --backup.
Этот параметр полезен в случае копирования файлов на одном компьютере или при копировании больших файлов с изменениями на уровне блоков или добавленными в конец файла данными.
Параметр включает в себя --partial (обрыв соединения не приводит к удалению файла), но конфликтует с --partial-dir и --delay-updates
--append Данный параметр принуждает rsync добавлять данные в конец файла, предполагает, что начало файлов идентичное. В случае из различия происходит сбой при проверке контрольной суммы файла и полное обновление как у --inplace. Передаются только те файлы, которые короче отправляемых и новые файлы.
-d --dirs Копировать каталоги, которые встречаются. В отличие от --recursive игнорируются каталоги, начинающиеся с точки "." или заканчивающиеся косой чертой "/", например ".", "dir/." или "dir/". При совместном использовании параметр --recursive имеет приоритет перед этим параметром.
-l --links Если встречается символическая ссылка, то воссоздавать ее на файл, указываемый исходной ссылкой.
-L --copy-links Если встречается символическая ссылка, то копировать файл, на который она указывает, а не ссылку. В старых версиях работа данного параметра несколько отличалась от современных версий.
--copy-unsafe-links Указывает утилите, что необходимо копировать файлы вне копируемого дерева, если на них ведут символические ссылки. Параметр не дает никакого эффекта, если указан --copy-links.
--safe-links Указывает утилите, что нельзя копировать файлы вне копируемого дерева, если туда указывают символические ссылки. Использование данного параметра совместно с --relative может дать непредсказуемые результаты.
--copy-dirlinks Данный параметр говорит отправляющей стороне обрабатывать символические ссылки на папки, как будто это реальный каталог. Это полезно если вы не хотите копировать файлы, на которые указывают символические ссылки, но хотите скопировать дерево папок.
--keep-dirlinks Принимающая сторона обрабатывает символическую ссылку на каталог, если она указывает на реальный каталог у отправителя.

Предположим, что идет перенос каталога "foo" и в нем есть файл "file", но реально "foo" это символическая ссылка на каталог "bar". Без данного параметра ссылка "foo" будет удалена, будет создан полноценный каталог "foo" и в него будет занесен "file", с параметром файл "file" будет перенесен в "bar"

-H --hard-links Говорит rsync рассматривать жесткие ссылки и связывать воедино их соответствующими файлами на принимающей стороне. Без этого жесткие ссылки рассматриваются как отдельные файлы. Работает только, если в передаче участвует и жесткая ссылка и сам файл.
-p --perms Устанавливать права доступа к файлу на принимающей стороне такие же, как и у исходного файла. (Дополнительно управление правами может задаваться параметром --chmod). Если параметр выключен, то права устанавливаются следующим образом:
  • Существующие файлы, в том числе и обновляемые не меняют прав доступа к ним (параметр --executability может менять выполняемость).
  • Новые файлы получают "нормальные" значения прав от исходного файла с учетом настроек umask, за исключением случаев, когда каталог наследует права родительского каталога.
Таким образом, когда отключены --perms и --executability утилита обрабатывает права доступа аналогично другим командам копирования, таким как cp и tar
--executability С помощью этого параметра при копировании сохраняется выполняемость или неисполнимость файла. Если в правах доступа файла источника включен хоть один бит "исполнимости" то сам файл считается исполняемым. Если конечный файл отличается по "исполнимости" от исходного, то утилита изменяет права доступа следующим образом:
  • Если новый файл считается "неисполняемым", то будут отключены все признаки "x" в конечном файле
  • Если исходный файл "исполняемый", то в конечном файле признаки исполнимости будут включены в тех правах, где он доступен для чтения.
Если --perm включена, данный параметр игнорируется.
--chmod Указывает rsync применить заданные права доступа, выраженные в строковом виде. Данные права будут рассматривать как права исходного файла, но она не влияет на уже существующие файлы (если не использован параметр --perm ).
Дополнительно к правилам построения прав команды chmod в строке можно указать применение правил к каталогу, указав "D" или к файлу "F":
--chmod=Dg+s,ug+w,Fo-w,+X
Возможно указание нескольких параметров --chmod они просто добавляются к списку изменений.
-o -owner Установить владельца конечного файла того же, что у исходного, но только в том случае если команда выполняется суперпользователем (смотреть команду sudo). Иначе владельцем файла будет пользователь запустивший утилиту на принимающей стороне.
Как правило, владелец идентифицируется по имени, но иногда по ID.
-g --group При запуске от имени суперпользователя, сохранять группу владельцев файла при копировании, иначе группа будет установлена по группе принимающей стороны. Обычно идентификация производится по имени, а не по ID.
--devices Переносить символьные и блочные устройства с воссозданием этих устройств на получателе. Не работает, если утилита не запущена от имени суперпользователя и нет параметра --super.
--specials Переносить специальные файлы, такие как socket и FIFO.
-D Параметр эквивалентен параметрам --devices --specials
-t --times Передавать время последнего изменения файла и обновлять его на удаленной системе. Если не использовать данный параметр, то последующее копирование с параметром -i вызовет повторное обновление неизененных файлов. Хотя алгоритм обновлений rsync достаточно эффективен все равно лучше использовать данный ключ.
--omit-dir-times Пропускать каталоги при синхронизации времени изменений (параметр --times ). Желательно использовать если файлы копируются на NFS диски.
--super Принуждает принимающую сторону попытаться работать с правами суперпользователя, даже если принимающий модуль не был запущен с такими правами. Эти действия включают в себя сохранение пользователей (смотреть --owners ), групп владельцев (--groups ) и копирование устройств (--devices ).
-S --sparse Использовать файлы образов для хранения скопированных фалов. Конфликтует с --inplace , так как невозможно переписать файлы в образе.
Не использовать в файловой системе Solaris "tmpfs".
-n --dry-run Сообщить о файлах, которые необходимо скопировать, но не копировать их.
-W --whole-file Не использовать передачу файла по частям. Если исходные файлы и получатели находятся на локальных дисках, то данный параметр используется по умолчанию. Имеет смысл его использовать, когда скорость передачи по каналу выше, чем скорость работы диска.
-x --one-file-system Не переходить не другую файловую систему во время рекурсии. При этом можно указать в команде файлы из разных файловых систем.
--existing,
--ignore-non-existing
Копировать только существующие файлы. То есть если файла или каталога получателя нет, то файл не будет создан. В сочетании с --ignore-existing никакие файлы не будут обновлены. Это может быть полезно для удаления лишних файлов.
--ignore-existing Пропускать файлы, которые уже существуют на получателе.
--remove-source-files Удалять исходные файлы (не каталоги), которые уже успешно скопированы.
--delete При синхронизации каталогов rsync будет удалять файлы в каталоге-получателе, если их нет на отправителе. Файлы, исключенные из передачи удаляться не будут, так же не будут удалены файлы, заданные по параметру --delete-excluded . В версиях младше 2.6.7 данный параметр не работает.
При неправильном использовании данный параметр может быть опасен, имеет смысл предварительно проверить, что будет удалено с помощью параметра --dry-run .
В случае возникновения ошибки ввода-вывода удаление файлов будет автоматически отменено, если не использован ключ --ignore-errors .
Параметр может комбинироваться с --delete-WHEN и -delete-excluded , однако если вместе с --delete-WHEN не будут заданы дополнительные параметры, то она будет работать как --delete-before.
--delete-before Запрашивает удаление файлов на принимающем диске до начала передачи файлов. Если указаны --delete или --delete-exclude без --delete-WHEN , то это параметр по умолчанию.
Использование данного ключа полезно, если мало места на диске-получателе и для копирования необходимо предварительно его освободить.
-delete-during, --del Удаление файлов будет постепенным в процессе передачи файлов. Это быстрее, чем --delete-before или --delete-tranfer , но работает начиная с версии 2.6.4. Под удалением понимается работа параметра --delete .
--delete-after Запрос на удаление файла будет сделан после завершения передачи.
--delete-excluded Исключить из удаления файлы на принимающей стороне, указанные согласно правилам фильтрации. Используется совместно с --delete .
--ignore-errors Продолжать работу и удалять файлы, даже при наличии ошибок ввода-вывода. Используется совместно с --delete .
--force Если полное имя файла источника совпадает с именем каталога на приемнике, то каталог должен быть удален и заменен на файл, даже если он непустой. Не работает вместе с --delete .
--max-delete=NUM Не удалять больше чем NUM файлов. Полезно при синхронизации больших деревьев каталогов, для предотвращения сбоя. NUM не может быть меньше 1.
--max-size=SIZE Не копировать файлы, размер которых превышает SIZE . Можно использовать суффиксы для указания размера: "K" или "KiB" (1024 байт), "M" или "MiB" (1024 байт *1024), "G" или "GiB" (1024 байт *1024 *1024). Если вам удобнее умножать на 1000 то суффиксы будут "KB", "MB", "GB". регистр символов в суффиксе значения не имеет. После суффикса можно добавить символы "+1" или "-1", что изменит значение на один байт в ту или иную сторону. Например:
--max-size=1.5mb-1 это 1499999 байт
--max-size=2g+1 это 2147483649 байт.
--min-size=SIZE Не передавать файлы размером меньше указанных в SIZE . Размеры указываются аналогично --max-size .
-B --block-size=BLOCKSIZE Задает фиксированный размер блоков для алгоритма rsync . Обычно он меняется в зависимости от размера файла.
-e --rsh=COMMAND Данный параметр позволяет выбрать альтернативную программу для соединения с удаленным компьютером. По умолчанию используется ssh, но его можно изменить, например на rsh. При использовании совместно с host::module/path, заданная программа будет использована для запуска rsync демона на удаленном хосте и через это соединение будут передаваться данные, а не через прямое подключение сокета.
Программа для удаленной связи так же может быть назначена с помощью переменной среды RSYNC_RSH, которая должна иметь значения, как и при описании -e . Примеры задания параметра:

E "ssh -p 2234"

E "ssh -o "ProxyCommand nohup ssh firewall nc -w1 %h %p""

--rsync-path=PROGRAM Указать программу, которая будет использована на удаленном компьютере для запуска rsync. Используется в случае, если путь к rsync не описана в глобальной переменной path на удаленном компьютере, например
--rsync-path=/usr/local/bin/rsync
rsync -avR --rsync-path="cd /a/b && rsync" hst:c/d /e/
-C --cvs-exclude Применение данного параметра полезно если необходимо исключать из переноса большое количество разнообразных файлов. Для фильтра используется механизм аналогичный CVS файлам. Например, сначала инициализируется следующий список:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
Пото к нему добавляется список из файла $HOME/.cvsignore, затем значения глобальной переменной CVSIGNORE. (имена игнорируемых файлов разделяются пробелами).
Также если в копируемом каталоге есть файл.cvsignore будут проигнорированы файлы из этого каталога совпадающие с шаблоном содержащийся в файле. Подробнее смотреть команду cvs(1).

-f --filter=RULE Исключить файлы, заданные в RULE из списка копируемых. Полезно при использовании рекурсивного копирования. Параметр может быть использован несколько раз в одной команде. Правила фильтрации описаны ниже.
--filter="dir-merge /.rsync-filter"
-F Является сокращением для повторного использования параметра --filter .
--exclude=PATTERN Упрощенный вариант параметра --filter.
--exclude-from=FILE Аналогично параметру --exclude , но FILE указывает на файл, который содержит шаблоны исключения (по одному в строке). Игнорируются пустые строки и строки, начинающиеся на символы ";" и "#". Если вместо имени файла указать дефис, то данные для фильтра будут взяты из стандартного ввода.
--include=PATTERN Функция, противоположная параметру --filter . Шаблон PATTERN указывает на файлы, которые должны быть скопированы. Подробнее в Правилах фильтрации.
--include-from=FILE Функция аналогичная --include , ни использующая шаблоны для создания списка копируемых файлов из файла FILE . Игнорируются пустые строки и строки начинающиеся на символы ";" и "#". Если вместо имени файла указать дефис, то данные для фильтра будут взяты из стандартного ввода.
--files-from=FILE Данный параметр позволяет точно указать, какие файлы должны быть скопированы. Список файлов читается из файла FILE или из стандартного ввода, если указать дефис "-". Данный параметр существенно влияет на работу rsync с другими параметрами:
  • Совместно с --relative (-R), сохраняет информацию о пути для каждого элемента в файле FILE . Для отключения укажите --no-relative или --no-R.
  • Совместно с --dirs (-d) создает папки указанные в списке, вместо того, чтобы пропустить их. Для отключения использовать --no-dirs или --no-d.
  • --archive (-a) не вызывает рекурсию, поэтому если необходима рекурсия, укажите -r или --recursive.
  • Место нахождения параметра --files-from не влияет на изменение работы rsync - она влияет на работу данных параметров с любого места в командной строке.
Пути к файлам указанных в FILE задаются относительно исходного каталога, а не корня тома.
rsync -a --files-from=/tmp/foo /usr remote:/backup Если /tmp/foo содержит строку "bin" или "/bin" на удаленном хосте будет создан /backup/bin.
Если перед именем FILE указать "host:" или просто ":", то он может быть прочитан с удаленного хоста, например:
rsync -a --files-from=:/path/file-list src:/ /tmp/copy Файл /path/file-list будет прочитан с удаленного компьютера src.
-0 --from0 Сообщает утилите, что файлы содержащие файлы или правила заканчиваются нулевой символ ("\0") а не символы перевода строки, возврата каретки и т.п. Влияет на --exclude-from, --include-from, --files-from и на соединение файлов в параметре --filter . Не влияет на --cvs-exclude .
-T --temp-dir=DIR Задает временный каталог DIR для файлов на принимающей стороне. По умолчанию временные файлы создаются там же, где должен будет находиться принимаемый файл.
Часто используется при передаче раздела диска, когда на диске для приема файлов может не хватить места. Если DIR расположен на другом томе, то после копирования rsync будет вынуждена сделать еще одно копирование, а не переименование файлов.
Если параметр используется по другим причинам, кроме как в случаях недостаточности места на диске, то его можно комбинировать с --delay-updates . Она обеспечивает помещение скопированных файлов в целевые каталоги после завершения передачи данных.
-y --fuzzy Если файл на в каталоге назначения rsync будет искать в этом каталоге файл, совпадающий по размерам, дате изменения или имени. Если такой файл существует, то утилита использует его для ускорения передачи данных. Использование ключа --delete может стереть все потенциально подходящие файлы до начала обмена, поэтому при совместном использовании лучше использовать параметр --delete-after .
--compare-dest=DIR Дополнительно сравнивать файлы с каталогом DIR . Если файл отсутствует в целевом каталоге, но есть в папке DIR он не будет передаваться.
Начиная с версии 2.6.4 можно указывать данный параметр несколько раз.
--copy-dest=DIR Аналогично --compare-dest , но при этом будет сделана копия совпадающих с передаваемыми файлами в папке DIR в каталог назначения. Это удобно если копия делается в новое место и сокращает трафики и время копирования. Начиная с версии 2.6.4 можно указывать данный параметр несколько раз.
--link-dest=DIR Данный параметр ведет себя подобно --copy-dest, но вместо копирования папку назначения там будут созданы жесткие ссылки. Файлы должны быть одинаковыми, в том числе и по атрибутам (права доступа, владельцы). rsync-av - --link-dest=$PWD/prior_dir host:src_dir/ new_dir/

Начиная с версии 2.6.4 можно указывать данный параметр несколько раз.

-z --compress Сжимать данные перед отправкой. Степень сжатия будет ниже, чем обычными архиваторами, так как требуется сравнение блоков и многие другие данные.
--compress-level=NUM Установить уровень сжатия, отличный от уровня по умолчанию. Для сжатия NUM должно быть больше 0.
--numeric-ids Передавать не имена пользователей и групп, а их ID и сравнивать по ним. По умолчанию rsync использует имена владельцев файлов и имена групп.
Если на принимающей стороне пользователя (группы) с таким ID не существует, то ID будет использован и в качестве имени.
--address IP адрес для соединения с rsync демоном.
--port=PORT Задает альтернативный номер порта взамен стандартного 873.
--sockopts Позволяет установить всевозможные опции сокета для управления передачей данных. По умолчанию никаких специальных параметров не устанавливается и влияет только на прямой сокет соединения с удаленным rsync демоном.
--blocking-io Использовать блокировку ввода-вывода при запуске удаленной командной среды. Если это rsh, remsh или rsync, то этот параметр будет использован по умолчанию.
-i --itemize-changes Запрашивает простой подробный список изменений для каждого измененного файла, включая изменения атрибутов. Аналогично параметру --out-format="%i %n%L" . Если указат параметр дважды, то будет выведен и список неизмененных файлов (расширенную информацию можно получить и используя параметр -vv)
Подстановочный символ "%i" создает кодированный вывод из 9 букв. Общий формат выглядит как строка формата YXcstpogz, где Y замещается типом обновления, X - тип файла, остальные символы указывают на измененные атрибуты.
Тип обновления Y может быть следующим:
  • < файл передается на удаленный сервер
  • > файл передается на локальный компьютер
  • c локальное изменение(создание каталога или символической ссылки)
  • h изменение жесткой ссылки
  • . файл не обновлялся, хотя у него могли измениться атрибуты.

Тип файлов X может быть заменен на: f - файл; d - каталог; L - символическая ссылка; D- устройство; S -специальный тип файла (например: socket или fifo).
Остальные символы строки могут быть выведены, если были изменены связанные с ними атрибуты файлы. (существуют некоторые исключения).
Следующие буквы связаны с атрибутами файлов:

  • c - контрольная сумма файлов отличается и будет обновлена передачей файла (необходим параметр --checksum).
  • s - размер файлов не совпадает и будет произведена передача файла
  • t - время последнего изменения файлов отличается (требует --times).
  • p - отличаются права доступа к файлам (требует --perms).
  • o - отличаются владельцы файла, будет обновлено на владельца отправителя (требует --owner и прав супер-пользователя).
  • g -группы владельцев разные и требуется обновление на группы отправителя (необходим параметр --group и права супер-пользователя).
  • z -символ зарезервирован для будущих версий rsync.
Возможен вывод других символов, в случае удаления файла будет выведено "deleting"
--out-format=FORMAT Данный параметр позволяет точно определить, какая информация будет выведена после копирования файлов. Строка FORMAT представляет собой последовательность символов начинающихся с приставки в виде символа %. Список возможных параметров описан в разделе "log format".
При выводе будет упомянут каждый файл, который был изменен в процессе копирования.
--log-file=FILE Параметр определяет файл, в который будет занесен протокол работы программы. Это похоже на работу ведения журнала демоном rsync, однако в данном случае журнал может находиться на клиентском компьютере или на отдающем компьютере без работы демона. Данная функция полезна для анализа работы в случаях аварийного завершения утилиты. По умолчанию строка формата выводимой информации имеет вид: "%i %n%L", но она может быть переопределена в параметре --log-file-format.
Пример:
rsync -av --rsync-path="rsync --log-file=/tmp/rlog" src/ dest/ Данная команда сохраняет файл журнала на серверной стороне.
--log-file-format=FORMAT Позволяет указать, какая информация будет помещена в файл журнала. Список символов подстановки вместо FORMAT описан в разделе "log format"
--stats Говорит утилите о необходимости вывести подробную статистику о передаче файлов, с целью подобрать оптимальный алгоритм копирования данных.
Статистика содержит следующую информацию:
  • Общее количество файлов (включая каталоги, ссылки, специальные файлы)
  • Количество передаваемых обычных файлов, не включая создаваемые каталоги, ссылки и т.п.
  • Общий размер файла и сумма размеров всех передаваемых файлов. Размер каталогов и специальных файлов не учитывается, символические ссылки учитываются.
  • Суммарный размер всех передаваемых файлов
  • Символьные данные сколько данных пришлось отправить получателю для сравнения файлов и для воссоздания файлов.
  • Данные сопоставления, сколько приемник данных для воссоздания файлов
  • Список размеров файлов, если отправитель направлял его получателю.
  • Время, затрачиваемое на создание списка файлов.
  • Время, затраченное на передачу списка файлов получателю
  • Общее количество переданных байт посланных на стороне клиента и на стороне сервера
  • Размер всех данных non-message в байтах.
-8 --8-bit-output Не проверять на соответствие настройкам локализации и сохранять старшие биты в байтах.
-h --human-readable Выводить числа в человекочитаемом виде. Большие числа будут иметь суффиксы K (1000), M (1000*1000) и G (1000*1000*1000). Если не использовать данный параметр, то базой будет 1024.
--partial По умолчанию в случае разрыва связи или внезапного прекращения передачи rsync удаляет частично переданные файлы. Данный параметр сохраняет их с целью сокращения передачи пра повторной передаче.
--partial-dir=DIR В случае если используется параметр --partial имеет смысл указать каталог, где будут находиться файлы переданные частично.
Данный каталог будет создан, если он не существует.
Каталог не должен быть доступен для записи другими пользователями.
Имя каталога можно задать переменной среды bash RSYNC_PARTIAL_DIR, но он будет работать только при указании параметра --partial .
--delay-updates Данный параметр принуждает создавать временный файл для каждого обновляемого файла, пока не будет закончена передача после окончания которой, все переданные файлы будут переименованы. По умолчанию все файлы помещаются в папку ".~tmp~" в каталоге назначения. Но каталог для временных файлов может быть переназначен параметром -partial-dir. Параметр конфликтует с --inplace и --append.
Использование данного параметра требует дополнительного места на накопителе получателя, так как будут созданы копии всех копируемых файлов. Нельзя использовать абсолютный путь при при указании в --partial-dir, в этом случае файлы с одинаковыми именами будут перезаписаны.
-m -prune-empty-dirs Не создавать пустых каталогов. Если при рекурсивном копировании иерархии будут обнаружены каталоги, из которых нет необходимости копировать файлы они не будут создаваться на диске получателя.
Пример копирования всех файлов с расширением.pdf при этом гарантированно не будут созданы "пустые" папки.
rsync -avm --del --include="*.pdf" -f "hide,! */" src/ dest
--progress Выводить информацию о процесс копирования. При передаче обычного файла выводится примерно такая информация:
782448 63% 110.64kB/s 0:00:04
Передано 782448 байт или 63% файла со скоростью 110.64kB/s, до завершения осталось 4 секунды, если скорость передачи не изменится.
Данная статистика может быть недостоверной при использовании частичной (incremental) передачи данных.
-P Аналогично указанию одновременно двух опций --partial --progress.
--password-file Позволяет указать файл с паролем для доступа к удаленному демону rsync. Файл должен содержать только пароль в виде одной строки. Полезна, только в случае использования встроенного программу протокола доступа.
--list-only Показать список файлов, которые должны быть переданы, но не передавать их.
--bwlimit=KBPS Ограничить максимальную скорость. KBPS задается в килобайтах в секунду.
--write-batch=FILE Записывать файл, который впоследствии может быть применён в параметре --read-batch . Подробнее описано ниже в пакетном режиме ("BATCH MODE")
--only-write-batch=FILE Работает аналогично --write-batch , однако не делает изменений в системе-получателе.
--read-batch=FILE Выполнить действия, записанные в файле FILE в пакетном режиме. Файл может быть сгенерирован с помощью --write-batch или создан вручную.
--protocol=NUM Использовать старые версии протокола обмена. Целесообразно при создании пакетного файла, предназначенного для использования ранними версиями rsync.
-4 или -6 --ipv4 или --ipv6 Сообщает программе, какой из протоколов является предпочтительным. Влияет только на сокеты, над которыми имеется прямой контроль. Например, исходящие сокеты при непосредственно контакте с rsync демоном.
--checksum-seed=NUM
-E --extended-attributes Копировать специальные атрибуты файлов в Apple Mac OS X. Требует специальной версии rsync для OS X.
--cache Специальный параметр для версий в Mac OS X. Включает кэширование операций ввода/вывода файловой системы. В противном случае для ограничения потребляемой памяти используется fcntl(F_NOCACHE).

Параметры, используемые при запуске демона rsync

--daemon Говорит rsync, что она запускается как демон. Запуск демона может быть выполнен клиентом, используя host::module или синтаксис rsync://host/module/.
--address Позволяет определить IP адрес или имя хоста при запуске демона, с которым он связан. Это позволяет использовать виртуальный хостинг с параметром --config.
--bwlimit=KBPS Позволяет задать максимальную скорость отправляемых данных демоном. При этом клиент может задать меньшую скорость.
--config=FILE Задает альтернативный файл конфигурации. Используется только если задан параметр --daemon. По умолчанию используется файл /etc/rsyncd.conf, за исключением запуска демона через программу удаленного доступа и удаленный пользователь не является суперпользователем. В этом случае ищется файл rsyncd.conf в папке $HOME
--no-detach Заставляет демона не отсоединяться и остаться фоновым процессом. Полезна для отладки, при запуске службы под Cygwin. Параметр игнорируется, если rsync запущен под управлением inetd или ssh.
--port=PORT Задает альтернативный порт для прослушивания демоном. По умолчанию 873.
--log-file=FILE Задает имя файла журнала, вместо файла указанного в конфигурационном файле.
--log-file-format=FORMAT Позволяет определить формат данных выводимых в журнал протокола. Если строка FORMAT пустая, то отключает ведение журнала.
--sockopts Переопределяет формат сокета заданного в rsyncd.conf и имеет аналогичный синтаксис.
-v, --verbose Увеличивает объем выводимых данных в журнал работы демона во время его работы.
-4, --ipv4 или -6, --ipv6 Определяет формат предпочтительных сокетов IPv4/IPv6, которые rsync демон будет использовать для прослушивания соединений. Если в Linux возникает ошибка "address already in use", а порт при этом не используется никакой другой программой, попробуйте использовать данный параметр.
-h, --help При указании после --daemon, позволяет напечатать краткую подсказку по параметрам, которые можно использовать при запуске демона

Правила фильтрации

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

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

Шаблоны правил имеют следующий синтаксис:

RULE

RULE,MODIFIERS

Возможно использование коротких или длинных имен правил, которые описаны ниже. Если Вы используете имена, то необходимо использовать запятую для разделения правил (RULE) и модификаторов (MODIFIERS). Шаблон должны следовать после одиночного пробела или символа подчеркивания. Допустимо использование следующих приставок для описания правил:

Exclude, - определяет шаблон исключений.

Include, + определяет шаблон включений.

Merge, . указывает на файл, в котором описаны дополнительные правила.

Dir-merge, : указывает на каталог слияния.

Hide, H определяет шаблон для передачи скрытых файлов.

Show, S файлы, которые не совпадают с шаблоном и не скрытые.

Protect, P задает шаблон для файлов, которые нельзя удалять.

Risk, R файл совпадающие с шаблоном и незащищенные.

Clear, ! очищает текущие значения включений/исключений. Не требует параметров.

Если правила считываются из файла, то строки начинающиеся с символа # и пустые строки игнорируются.

Параметры --include/--exclude не дают тех возможностей для фильтрации файлов как описано выше. Данные параметры, как и --filter могут принимать только одно правило (шаблон для каждого). Для полного использования всех возможностей используйте импорт правил из файла с параметрами --filter (синтаксис для файла) или --include-from/--exclude-from.

Правила шаблонов для включения/исключения файлов.

INCLUDE/EXCLUDE PATTERN RULES

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

Если шаблон начинается с символа "/", то это означает привязку файла к конкретному месту в иерархии файлов, в противном случае сравнение происходит с конца пути. Это действие похоже на начальный символ "^" в регулярных выражениях. Таким образом "/foo" будет соответствовать корневой папке передачи или в файле слияния (merge-file).

Обычное указание "foo" будет соответствовать файлу с таким именем, встреченным в любом месте выборки. Подробнее о применении "/" в начале шаблона в разделе ANCHORING INCLUDE/EXCLUDE PATTERNS.

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

Последовательность символов "dir_name/***" будет совпадать и с каталогом (если было бы указано "dir_name/") и с файлами в данной папке, как если было указано "dir_name/**" (начиная с версии 2.6.7)

Однако когда вы используете параметр --recursive (-r) (он встроен в -a), то каждый подкаталог посещается сверху вниз, то шаблоны include/exclude для файлов и каталогов применяются с рекурсивно. Например, include "/foo/bar/baz" не должны исключать содержимое "/foo" и "/foo/bar"). Если вы исключите отдельный каталог, то rsync может исключить из обхода его подкаталоги, поэтому важно правильно использовать "*"

Следующая группа шаблонов неправильная:

+ /some/path/this-file-will-not-be-found

+ /file-is-included

Это ошибка, так как родительский каталог "same" исключен из выборки и rsync никогда не найдет файлы, находящиеся в папках "some" или "some/path". Одним из решений проблемы будет прямое указание включения всех каталогов в иерархии, как это сделано в следующем примере:

+ /some/path/this-file-is-found

+ /file-also-included

Вот некоторые примеры фильтров включения/исключения:

  • "- *.o" будут исключены все файлы, совпадающие с *.o
  • "- /foo" исключить копирования файлы или папки с именем foo в корневой папке копирования
  • "- foo/" исключить из копирования каталог foo, встреченный в любом месте дерева
  • "- /foo/*/bar" будут исключены файлы bar из копирования, встреченные в каталогах на два уровня ниже начального.
  • "+ */", "+ *.c", and "- *" - данное сочетание позволит скопировать дерево каталогов и все файлы расширением.c. Больше ничего скопировано не будет.
  • Комбинация "+ foo/", "+ foo/bar.c", and "- *" скопирует только сами каталоги foo и файлы foo/bar.c.

Правила фильтров для MERGE-FILE

Существует возможность объединения файлов с фильтрами в условиях правил фильтрации, указав объединение (.) или объединение каталогов (:)

Существует два типа объединения файлов - одиночный (.) или на каталог (:). В случае одиночного типа файл считывается один раз, и эти правила включаются в список фильтров. В режиме (:) rsync сканирует все каталоги и отслеживает merge файлы. И если такой файл существует, то включает их содержимое в список унаследованных правил. Эти правила должны быть созданы на отправляющей стороне, потому что именно она сканирует каталоги для выявления файлов предназначенных для копирования. Эти файлы в случае необходимости могут быть переданы принимающей стороне^ если вы хотите, чтобы файлы не удалялись. (смотреть раздел PER-DIRECTORY RULES AND DELETE).

Некоторые примеры:

merge /etc/rsync/default.rules . /etc/rsync/default.rules dir-merge .per-dir-filter dir-merge,n- .non-inherited-per-dir-excludes:n- .non-inherited-per-dir-excludes

Следующие модификаторы могут быть применены:

  • - файл с фильтрами состоит исключительно из шаблонов исключения (возможно использование комментариев)
  • + Файл состоит только из шаблонов включения и комментариев.
  • C файл должен быть прочитан CVS совместимым способом. Если имя не указано, то предполагается ".cvsignore".
  • e исключить имя merge-файла из передачи. Например "dir-merge,e .rules" аналогично "dir-merge .rules" и "- .rules".
  • n указывает, что правила не распространяются на подкаталоги.
  • w предполагает разделение слов с помощью пробелов (whitespace) вместо нормального построчного считывания. В этом случае строка "- foo + bar" будет считаться двумя шаблонами.

После "+" и "-" могут быть использованы следующие модификаторы:

  • "/" шаблон должен сравниваться с абсолютным путем к объекту. Например, "-/ /etc/passwd" исключить передаче файла passwd из каталога "/etc", а "-/ subdir/foo" должна исключать "foo" в том случае если она находится в любом каталоге с именем "subdir" даже если "foo" находится в начальном каталоге, предназначенном для копирования.
  • "!" Логическое "нет". Например, последовательность "-! */" должна исключать из копирования все, что не является каталогом.
  • C указывает, что все глобальные правила CVS-исключений должны быть вставлены в месте "-C".
  • s - правило используется отправляющей стороной. По умолчанию считается, что шаблон влияет на обе стороны в копировании, если не указано --delete-excluded.
  • r - указывает, что данные правила должны быть использованы на отправляющей стороне.

В режиме объединения каталогов (:) правила фильтрации файла действуют и для всех подкаталогов относительно каталога, где он был найден, если только не был указан модификатор "n". В случаях если в подкаталогах, на которые были унаследованы правила тоже есть merge-files, то правила из новых файлов будут иметь более высокий приоритет. Чтобы предотвратить действие одного конкретного правила можно использовать указание абсолютного пути с лидирующим "/".

Вот пример фильтра, который должен быть указан с помощью параметра --filter: --filter=". file"

Merge /home/user/.global-filter - *.gz dir-merge .rules + *. - *.o

Это позволит объединить содержимое файла.global-filter в начале списка и также включает содержимое файлов.rules в фильтры.

Если в режиме по каталогам в merge-file указан вместе с путем начала дерева копирования, rsync будет сканировать все родительские папки начиная с начального каталога копирования.

Filter=": /.rsync-filter"

Данное правило заставляет программу отсканировать все каталоги, начиная со стартового на наличие файлов.rsync-filter.

Некоторые примеры команд предварительного сканирования для merge-files:

Rsync -avF /src/path/ /dest/dir rsync -av --filter=": ../../.rsync-filter" /src/path/ /dest/dir rsync -av --filter=": .rsync-filter" /src/path/ /dest/dir

Первые две команды будут искать файлы с правилами ".rsync-filter" в "/" и "/src" до того как будет начато нормальное сканирование в каталоге "/src/path" и его подкаталогах. Третья команда избегает поиска файла с правилами фильтрации в родительском каталоге и ищет его во всех каталогах, которые передаются.

Если вы хотите включить содержимое ".cvsignore" в ваш шаблон, вы должны использовать модификатор ":C", который включит в шаблоны (:), но будет разбирать его по CVS-совместимым правилам.

Правила очистки списка фильтров.

LIST-CLEARING FILTER RULE

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

Закрепленные INCLUDE/EXCLUDE шаблоны

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

Предположим, что мы хотим сравнить два исходных файла, один как абсолютный путь "/home/me/foo/bar", а второй просто с путем "/home/you/bar/baz". Ниже как различные команды сравнивают файлы для передачи

Пример команды: rsync -a /home/me /home/you /dest +/- pattern: /me/foo/bar +/- pattern: /you/bar/baz Файл назначения: /dest/me/foo/bar Файл назначения: /dest/you/bar/baz Пример команды: rsync -a /home/me/ /home/you/ /dest +/- pattern: /foo/bar (note missing "me") +/- pattern: /bar/baz (note missing "you") Файл назначения: /dest/foo/bar Файл назначения: /dest/bar/baz Пример команды: rsync -a --relative /home/me/ /home/you /dest +/- pattern: /home/me/foo/bar (note full path) +/- pattern: /home/you/bar/baz (ditto) Файл назначения: /dest/home/me/foo/bar Файл назначения: /dest/home/you/bar/baz

Пример команды:

Cd /home; rsync -a --relative me/foo you/ /dest +/- pattern: /me/foo/bar (начать с указанного пути) +/- pattern: /you/bar/baz (ditto) Файл назначения: /dest/me/foo/bar Файл назначения: /dest/you/bar/baz

Самый простой способ узнать, что будет скопировано, это использовать параметр --dry-run --verbose и задать / в начале имени.

Режимы фильтрации по каталогам и удаления файлов.

PER-DIRECTORY RULES AND DELETE

Без параметра delete правила (:) действуют только на отправляющей стороне, так что можно спокойно исключить передачу файлов с правилами. Следующие две команды эквивалентны:

Rsync -av --filter=": .excl" --exclude=.excl host:src/dir /dest rsync -av --filter=":e .excl" host:src/dir /dest

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

Rsync -avF --delete-after host:src/dir /dest

Однако если файлы с шаблонами (merge-files) сами не передаются, то необходимо указать глобальные правила исключения, указав их в командной строке или поддерживать свои файлы фильтрации на принимающем компьютере. Пример:

Rsync -av --filter=": .rules" --filter=". /my/extra.rules" --delete host:src/dir /dest

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

Пакетный режим

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

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

Для удобства во время записи дополнительно создается скрипт с расширением ".sh" и заданным именем. Данный файл содержит команду, подходящую для обновления дерева файлов на удаленном компьютере. Он может, выполнен в bash с параметром, указывающим на каталог компьютера назначения.

Примеры:

$ rsync --write-batch=foo -a host:/source/dir/ /adest/dir/ $ scp foo* remote: $ ssh remote ./foo.sh /bdest/dir/ $ rsync --write-batch=foo -a /source/dir/ /adest/dir/ $ ssh remote rsync --read-batch=- -a /bdest/dir/

В данных примерах программа используется для обновления /adest/dir/ из /source/dir/ и информация для повторения будет записана в файлах "foo" и "foo.sh". Различия между двумя примерами показывают возможную гибкость применения.

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

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

Предостережения:

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

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

При чтении пакетного файла будут принудительно установлены некоторые параметры для сравнения данных. Другие параметры могут быть изменены. Например --write-batch изменяется на --read-batch, --files-from отбрасывается. --filter/--include/--exclude не требуются, кроме использования --delete.

Символические ссылки.

Существует три варианта поведения программы, когда она встречает символическую ссылку в каталоге.

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

Ssh remotehost /bin/true > out.dat

И последующее изучение файла out.dat. Если все работает нормально, то размер этого файла, должен быть равен 0. Если же вы имеете описанную ошибку от rsync, то вероятно обнаружите в этом файле текст или данные. Их необходимо изучить и разобраться в чем проблема. Очень частой ошибкой является неправильно сконфигурированный скрипт запуска (такие файлы как.cshrc или.profile) в которых есть команды для неинтерактивного входа.

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

Статусы завершения Rsync.

0 Успешное завершение (Success)

1 Синтаксическая ошибка или ошибка выполнения (Syntax or usage error)

2 Несовместимые протоколы (Protocol incompatibility)

Используемые файлы /etc/rsyncd.conf или rsyncd.conf

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 .

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

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

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