# = синхронизация через удаленный шелл вместо демона rsync.
Поведение rsync почти такое же, как и у программы копирования rcp, однако у rsync намного больше опций, и она использует протокол удаленного обновления (rsync remote-update) для значительного ускорения передач файла, когда он уже присутствует в месте назначения. Rsync широко используется для создания бекапов и зеркалирования данных, а также как улучшенная утилита копирования для каждодневного использования.
Rsync находит файлы, которые нужно передать, используя алгоритм быстрой проверки ("quick check", используется по умолчанию), который обнаруживает файлы, у которых поменялся размер или время последнего изменения (last-modified time). Любые изменения в других зарезервированных атрибутах (которые запрошены опциями) вносятся непосредственно в файл назначения, когда быстрая проверка показала, данные файла не нуждаются в обновлении.
Вот некоторые дополнительные возможности, которыми обладает rsync:
● Поддерживается копирование ссылок (links), файлов устройств (devices), атрибутов владельца (owners), группы (groups) и прав доступа (permissions). ● Опции исключения (exclude и exclude-from), аналогичные GNU tar. ● Режим CVS exclude (аббревиатура CVS расшифровывается как Concurrent Versioning System, т. е. система управления версиями) для игнорирования тех же файлов которые должна игнорировать CVS. ● Может использовать любой прозрачный удаленный шелл (transparent remote shell), включая rsh или ssh. ● Не требует привилегий суперпользователя (root). ● Использует конвейеризацию (pipelining) передач файлов для минимизации издержек латентости. ● Поддерживаются серверы с анонимной (anonymous) или проверяемой аутентификацией (идеально подходит для зеркалирования данных).
[Как используется rsync]
Вы можете использовать rsync точно так же, как и rcp. Нужно указать место источника данных (source) и место назначения. Одно из этих мест может быть сетевым файловым ресурсом (remote, удаленный хост).
Наверное лучше всего объяснить синтаксис на некоторых простых примерах:
$ rsync -t *.c foo:src/
Эта команда передает все файлы, которые совпали с шаблоном *.c из текущей директории в каталог src машины foo (remote хост). Если какой-либо файл на хосте назначения уже существует, то для обновления файла используется протокол rsync remote-update, в котором передаются только различия между файлами.
$ rsync -avz foo:src/bar /data/tmp
Эта команда рекурсивно передает все файлы из директории src/bar машины foo в директорию /data/tmp/bar на локальной машине. Файлы передаются в режиме архивирования (archive mode), который гарантирует, что в транзакции будут переданы символические ссылки, устройства, атрибуты разрешения, информация владельца и т. п. Дополнительно используемая компрессия уменьшает объем передаваемого трафика.
$ rsync -avz foo:src/bar/ /data/tmp
Завершающий слеш в указании source меняет это поведение так, что все файлы из директории src/bar машины foo передаются в директорию /data/tmp/ локальной машины. Завершающий слеш / в имени источника означает "копировать содержимое этой директории". Без слеша это означает "копировать директорию". Эта разница в поведении оказывается важной, в частности, когда используется опция --delete.
Вы также можете использовать rsync только локально (local-only mode), когда у source и destination нет ':' в имени. В этом случае rsync ведет себя так же, как и улучшенная команда копирования (cp или rcp).
$ rsync somehost.mydomain.com::
Эта команда выведет список всех анонимных модулей rsync, доступных на хосте somehost.mydomain.com (подробности см. в следующей секции).
[Соединение с сервером RSYNC]
Существует возможность использовать без rsh или ssh в качестве транспорта. В этом случае вы будете подключаться к серверу rsync, работающем на TCP-порту 873.
Вы можете установить соединение через web-прокси, используя переменную окружения RSYNC_PROXY, указывающую на пару значений hostname:port для вашего web proxy. Обратите внимание, что ваша конфигурация web proxy должна позволять проксирование порта 873.
Использование rsync таким способом будет таким же, как и с rsh или ssh, за исключением:
● Используется двойное двоеточие :: вместо одиночного : для разделения имени хоста и пути на нем. ● Первое слово пути в действительности указывает имя модуля. ● Remote-демон может печатать сообщение с указанием дня, когда вы подключились. ● Если вы не указали имени пути на remote-демоне, то будут показаны доступные пути демона. ● Если вы не указали локальное назначение, то предоставляется список указанных файлов на remote сервере. ● Не указывается опция --rsh (-e).
Некоторые пути на remote сервере могут потребовать аутентификации. В этом случае при подключении будет предложено ввести пароль. Можно избежать предложения интерактивного ввода пароля путем установки пароля в переменной окружения RSYNC_PASSWORD, или путем указания опции --password-file. Это бывает полезным при использовании rsync в скрипте.
ПРЕДУПРЕЖДЕНИЕ: на некоторых системах переменные окружения видят все пользователи. Для такого случая рекомендуется использовать опцию --password-file.
Запуск сервера RSYNC. Сервер rsync по умолчанию конфигурируется файлом /etc/rsyncd.conf. Дополнительную информацию см. man-документацию в rsyncd.conf(5).
[Примеры использования rsync]
Бекап домашней директории с использованием задания планировщика (cron job):
rsync -Cavz . ss64:backup
Эта команда через PPP-соединение выполнит дублирование текущей директории на машине "ss64".
Для синхронизации source-дерева файловой системы samba используйте следующие Makefile targets:
get:
→→rsync -avuzb --exclude '*~' samba:samba/ .
put:
→→rsync -Cavuzb . samba:samba/
sync: get put
Это позволяет синхронизироваться с директорией CVS на другом конце соединения. В этом случае экономится время cvs-операций на удаленной машине, поскольку протокол remote cvs не очень эффективен.
Пример зеркалирования директории между старым и новым сайтами ftp:
Здесь приведено краткое описание опций. Полное описание см. в следующей врезке.
Что копировать:
-r, --recursiveрекурсивно заходить в директории -R, --relative использовать относительные имена путей --exclude=PATTERNисключать файлы, которые совпали с шаблоном PATTERN --exclude-from=FILEпрочитать шаблоны исключения из файла FILE -I, --ignore-times не исключать файлы, которые совпали по длине и времени --size-onlyиспользовать только размер файла в принятии решения для передачи файла -@ --modify-window=NUM окно метки времени (в секундах) для совпадения файла (умолчание=0) --include=PATTERN не исключать файлы, совпавшие с шаблоном PATTERN (шаблон включения) --include-from=FILE прочитать шаблоны включения из файла FILE
Как копировать:
-n, --dry-run тестовый запуск (trial run), без каких-либо изменений -l, --links копировать символические ссылки (symlinks) как символические ссылки -L, --copy-links преобразовать symlink в соответствующие file/dir --copy-unsafe-links преобразовывать только "unsafe" ссылки --safe-links игнорировать ссылки, выходящие за пределы дерева destination --munge-links уничтожение символических ссылок, чтобы сделать их безопаснее -H, --hard-links сохранение жестких ссылок (hard links) --devices сохранение файлов устройств (только с правами super-user) --specials сохранение специальных файлов -D, --devices --specials сохранение devices (только с правами super-user) +files -g, --group сохранение группы -o, --owner сохранение владельца (только с правами super-user) -p, --perms сохранение разрешений --remove-source-files отправитель удаляет синхронизированные файлы (не dir) -t, --times сохранение времен -S, --sparse эффективная обработка разреженных файлов -x, --one-file-system не пересекать границ файловой системы -B, --block-size=SIZE принудительно зафиксировать размер блока контрольной суммы (умолчание 700) -e, --rsh=COMMAND указать замену rsh --rsync-path=PATH указать путь для rsync на remote-машине --numeric-ids не отображать значения uid/gid на имена user/group --timeout=SECONDS установить таймаут IO в секундах -W, --whole-file копировать файлы целиком, без проверок инкремента
Опции места назначения (destination):
-a, --archive режим архива, эквивалентный -rlptgoD (без -H,-A,-X) -b, --backup делать бекапы (см. --suffix и --backup-dir) --backup-dir=DIR делать бекапы в этой директории -z, --compress применять сжатие данных файла при передаче -c, --checksum пропускать файлы, основываясь на контрольной сумме, а не времени модификации и размере -C, --cvs-exclude автоматически игнорировать данные так же, как это делает CVS --existing обновлять только те файлы, которые уже существуют --delete удалять файлы, которые не существуют на стороне отправки --delete-excluded также удалять исключенные файлы на стороне приема --delete-after получатель выполняет удаление после передачи, не во время передачи --force принудительное удаление директорий, даже если они не пустые --ignore-errors удалять даже если были ошибки ввода/вывода (IO errors) --max-delete=NUM не удалять больше чем NUM файлов --log-file-format=FMT передача файла лога, используя указанный формат --partial сохранять частично переданные файлы --progress показывать прогресс во время передачи -P эквивалентно --partial --progress --stats выдавать некоторое состояние транзакции файла -T --temp-dir=DIR создавать временные файлы в директории DIR --compare-dest=DIR также сравнивать файлы назначения относительно DIR -u, --update только обновление (не перезаписывать более новые файлы)
Разные другие опции:
--address=ADDRESS привязка к указанному адресу --blocking-io использовать блокирующий ввод/вывод (blocking IO) для remote shell --bwlimit=KBPS ограничить полосу пропускания I/O в килобайтах в секунду --config=FILE указать альтернативный файл rsyncd.conf (для демона rsyncd) --daemon запустить rsync в качестве демона --no-detach не отключаться от родителя (демона) --password-file=FILE взять пароль доступа к демону из файла FILE --port=PORT указать другой номер порта rsyncd -f, --read-batch=FILE прочитать командный файл -F, --write-batch=FILE записать командный файл --version напечатать номер версии -v, --verbose повысить подробность вывода сообщений -q, --quiet понизить подробность вывода сообщений -4, --ipv4 предпочитать IPv4 -6, --ipv6 предпочитать IPv6 -h, --help вывести этот экран подсказки
Полное описание опций rsync см. в статье [2].
[Шаблоны исключения (Exclude Patterns)]
Для rsync можно указать шаблоны exclude (исключение) и include (включение), чтобы гибко управлять тем, какие файлы пропускать (exclude) или принудительно включать (include) в процесс передачи.
Утилита rsync составляет упорядоченный список опций include/exclude так, как они были указаны в командной строке. Когда встретилось имя файла, rsync проверяет это имя для каждого шаблона exclude/include по очереди. При этом сработает первое совпадение с указанным шаблоном. Если было совпадение с шаблоном exclude, то файл пропускается. Если было совпадение с шаблоном include, то файл не пропускается. Если не было обнаружено совпадение ни с каким шаблоном include/exclude, то файл не пропускается.
Обратите внимание, что если используется -r (что подразумевается при -a), то каждый субкомпонент каждого обрабатывается сверху вниз, т. е. шаблоны include/exclude применяются рекурсивно к каждому субкомпоненту. Также имейте в виду, что опции --include и --exclude принимают один шаблон каждая. Чтобы указать несколько шаблонов, используйте опции --include-from и --exclude-from (которые дают возможность прочитать шаблоны из файла), либо указывайте несколько опций --include и/или --exclude.
Шаблоны могут принимать несколько форм. Правила следующие:
● Если шаблон начинается с /, то он сопоставляется с началом имени файла, иначе с концом имени файла. Таким образом "/foo" будет соответствовать файлу "foo" в основании дерева. С другой стороны, "foo" будет соответствовать любому файлу "foo" в любом месте дерева, потому что алгоритм рекурсивно просматривает директории сверху вниз; он ведет себя так, как будто каждый компонент пути получает поворот в конце имени файла. ● Если шаблон заканчивается на / то он будет соответствовать только директории, и не файлу, ссылке или устройству. ● Если шаблон содержит символ макроподстановки (wildcard character) из набора *?[, то применяется соответствие выражения с использованием правил сопоставления имен шелла. Иначе используется простое совпадение строки. ● Если шаблон содержит двойную звездочку "**" то все wildcards в шаблоне будут соответствовать слешам, иначе они останавливаются на слешах. ● Если шаблон содержит / (не завершающий /), то он соответствует полному имени, включая начальную директорию. Если шаблон не содержит /, то он совпадает только с конечным компонентом имени. И опять, помните, что алгоритм применяется рекурсивно, так что "полное имя" может быть фактически любой порцией пути. ● Если шаблон начинается с "+ " (плюс, за которым идет пробел) то это всегда считается шаблоном include, даже если он указан как часть опции exclude. Часть "+ " отбрасывается перед совпадением. ● Если шаблон начинается с "- " (минус, за которым идет пробел), то это всегда считается шаблоном exclude, даже если он указан как часть опции include. Часть "- " отбрасывается перед совпадением. ● Если шаблон одиночный восклицательный знак !, то текущий список include/exclude сбрасывается, удаляя все ранее определенные шаблоны.
Правила +/- наиболее полезны в списках exclude, позволяя вам создать один список exclude, который содержит как опции include, так и exclude.
Если вы завершаете список exclude --exclude '*', то имейте в виду, что алгоритм применяется рекурсивно, и если явно не включить родительские директории файлов, которые вы хотите подключить, то алгоритм остановиться на родительских директориях и не будет просматривать файлы ниже. Чтобы включить все директории, используйте --include '*/' перед --exclude '*'.
Некоторые примеры exclude/include:
--exclude "*.o" исключит все имена файлов, совпадающие с *.o. --exclude "/foo" исключит файл в базовой директории с именем foo. --exclude "foo/" исключит любую директорию с именем foo. --exclude "/foo/*/bar" исключит любой файл с именем bar на 2 уровня ниже базовой директории с именем foo. --exclude "/foo/**/bar" исключит любой файл с именем bar на 2 или больше уровней ниже базовой директории с именем foo. --include "*/" --include "*.c" --exclude "*" исключит все директории и файлы исходного кода C. --include "foo/" --include "foo/bar.c" --exclude "*" исключить только foo/bar.c (директория foo/ должна быть включена явно, или должна быть исключена через "*")
[Пакетный режим (Batch Mode)]
Следующая команда сгенерирует 4 файла, в котором инкапсулирована информация для синхронизации содержимого target_dir с обновлениями, которые найдены в src_dir.
Сгенерированные файлы помечены общей меткой времени:
# rsync_argvs. аргументы командной строки # rsync_flist. файл внутренних метаданных rsync # rsync_csums. контрольные суммы rsync # rsync_delta. блоки данных для обновления и изменения файла
[Символические ссылки (symlink)]
Возможны 3 базовых поведения, когда rsync встречает символические ссылки в директории источника.
По умолчанию символические ссылки вообще не передаются. Для любой существующей символической ссылки выводится сообщение пропуска "skipping non-regular file".
Если указана опция --links, то символические ссылки заново создаются на ту же цель уже в месте назначения. Обратите внимание, что опция --archive подразумевает --links.
Если указана опция --copy-links, то символические ссылки "коллапсируют" путем копирования цели, на которую они указывают, вместо самой символической ссылки.
Утилита rsync также разделяет "безопасные" (safe) и небезопасные (unsafe) символические ссылки. Пример, где это может использоваться - зеркалирование web-сайта, где в копирование не включаются символические ссылки на /etc/passwd в публичной секции сайта. Использование опции --copy-unsafe-links приведет к тому, что любые ссылки будут скопированы в место назначения в виде файла. Использование --safe-links приведет к полному пропуску небезопасных ссылок.
[Диагностика]
Утилита rsync иногда выдает сообщения об ошибках, которые могут показаться несколько загадочными. Одно из наиболее запутанных: "protocol version mismatch - is your shell clean?".
Это сообщение обычно вызвано тем, что ваши скрипты запуска (startup scripts) или удаленный шелл создают нежелательный мусор в потоке, который rsync использует для своего транспорта. Для диагностики этой проблемы запустите удаленный шелл командой наподобие следующей:
$ rsh remotehost /bin/true > out.dat
После этого просмотрите содержимое файла out.dat. Если все работает корректно, то файл out.dat должен быть нулевой длины. Если вы получили вышеупомянутую ошибку от rsync то вероятно в out.dat будут содержаться некоторые текстовые данные. На основе этих данных попробуйте разобраться с причиной, вызывающей проблему.
Чаще всего причина в некорректно сконфигурированных скриптах первоначального запуска шелла (shell startup scripts, таких как .cshrc или .profile), когда в них содержатся операторы вывода для неинтерактивных логинов.
Если вы сталкиваетесь с проблемами при отладке шаблонов include и exclude, то попробуйте указать опцию -vv. Это повысит уровень подробности вывода (verbosity level), на котором rsync будет показывать каждый отдельный файл, который был включен или исключен.
[Установка rsync]
Просмотрите файл README для получения инструкций по установке.
После того, как утилита rsync установлена, вы можете использовать на любой машине, для которой можно использовать rsh. Утилита rsync использует rsh для своих процессов обмена данными за исключением случая, когда source и destination находятся локально.
Также вы можете указать альтернативу для rsh либо опцией -e, либо установкой переменной окружения RSYNC_RSH. Общей заменой является ssh (указание опции -e ssh), которая представляет высокую степень безопасности.
Имейте в виду, что утилита rsync должна быть установлена на обоих сторонах сетевого соединения - на обоих машинах source и destination.
[Переменные окружения]
CVSIGNORE Предоставляет любые шаблоны ignore в файлах .cvsignore, см. подробности в описании опции --cvs-exclude.
RSYNC_RSH Позволит вам переназначить шелл по умолчанию, который используется как транспорт для rsync. Это может быть использовано вместо опции -e.
RSYNC_PROXY Позволяет перенаправить вашего клиента rsync на использование web proxy, когда происходит подключение к демону rsync. Вы должны установить RSYNC_PROXY в значение пары hostname:port (имя хоста и порт прокси).
RSYNC_PASSWORD Установка RSYNC_PASSWORD в значение требуемого пароля позволит вам запустить аутентифицированные соединения rsync к демону rsync без необходимого интерактивного ввода пароля. Обратите внимание, что это не предоставит пароль для шелла транспорта, такого как ssh.
USER или LOGNAME Эти переменные окружения используются для определения имени пользователя по умолчанию, отправляемого на сервер rsync.
HOME Используется, чтобы найти файла пользователя .cvsignore по умолчанию.
[Связанные с rsync команды Linux]
Grsync - GUI для rsync [6]. Как установить, см. [7]. rsyncd.conf(5). rsnapshot - сохранение нескольких бекапов с помощью rsync [8]. rcp - копирование файлов между двумя машинами [9]. cp - копирование одного или большее количество файлов в другое место. install - копирование файлов и установка атрибутов [10]. dd - Data Duplicator - преобразование и копирование файла [11]. remsync - удаленная синхронизация через email. Эквивалентная команда Windows: ROBOCOPY [12].