Администрирование FreeBSD, Linux, ... rsync: синтаксис, примеры использования Sat, December 07 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


rsync: синтаксис, примеры использования Печать
Добавил(а) microsin   

Утилита rsync осуществляет синхронизацию деревьев файловых каталогов между локальными дисками или между хостами сети.

[Синтаксис rsync]

Локальный файл - локальный файл:

   rsync [option]... Source [Source]... Dest

Локальный файл - файл в сети:

   rsync [option]... Source [Source]... [user@]host:Dest   #
   rsync [option...] [user@]host::Source... [Dest]
   rsync [option...] rsync://[user@]host[:PORT]/Source... [Dest]

Файл в сети - локальный файл:

   rsync [option]... [user@]host:Source... [Dest]          #
   rsync [option]... [user@]host::Dest
   rsync [option]... rsync://[user@]host[:PORT]/Dest

# = синхронизация через удаленный шелл вместо демона 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:

rsync -az -e ssh --delete ~ftp/pub/samba/ nimbus:"~ftp/pub/tridge/samba"

Эта команда запускается заданием cron каждые несколько часов.

Здесь приведено краткое описание опций. Полное описание см. в следующей врезке.

Что копировать:

-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 -F [здесь указываются другие опции rsync] \
/somewhere/src_dir /somewhere/target_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].

[Ссылки]

1. rsync site:ss64.com.
2. rsync Full List Of Options site:ss64.com.
3. Joomla: организация автоматического бекапа сайта на виртуальном хостинге Агава.
4. Bash-скрипт для бэкапа сайта/сервера с ротацией.
5Автоматическая синхронизация баз данных сайтов.
6. Grsync: Home site:opbyte.it.
7. HowTo: Use Grsync and OpenSSH to sync your /home directory over a network site:ubuntuforums.org.
8. rsnapshot site:rsnapshot.org.
9. rcp Remote Copy site:ss64.com.
10. install site:ss64.com.
11. dd Data Duplicator site:ss64.com.
12. ROBOCOPY.exe Robust File and Folder Copy site:ss64.com.

 

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


Защитный код
Обновить

Top of Page