rsync (англ. Remote Synchronization) - программа для UNIX- подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодировку данных при необходимости. Важным отличием rsync от многих других программ/протоколов является то, что зеркалирование осуществляется одним потоком в каждом направлении (а не по одному или несколько потоков на каждый файл). rsync может копировать или отображать содержимое каталога и копировать файлы, опционально используя сжатие и рекурсию.
Демон rsyncd, реализующий протокол rsync, по умолчанию использует TCP порт 873.
Применение. rsync была создана как замена для rcp и scp. Одним из первых применений rsync стало зеркалирование или резервное копирование клиентских Unix- систем на центральный Unix- сервер с использованием rsync/ssh и обычной учётной записи Unix. С планировщиком задач, таким как cron, возможно организовать автоматизированное основанное на rsync зеркалирование по защищённому криптографически каналу между многими компьютерами и центральным сервером.
Утилита 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 ключи исходный_каталог пользователь@хост:/каталог_назначения
Где:
Вы можете отключить одну или несколько опций (–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 для получения более подробной информации)
-r, --recursive — рекурсивный режим; -l, --links — пересоздание symlinks, это значит, что символические ссылки будут так же переноситься; -p, --perms — перенос прав; -t, --times — передача времени модификации и его обновление на удаленной системе. Этот ключ должен быть установлен для точной синхронизации; -g, --group — установить группу конечного файла таким же, как и у исходного; -o, --owner — установить владельца конечного файла таким же, как и у исходного; -D, - same as --devices --specials — установить тип файла устройства и файла специального типа таким же, как у исходного.
Это быстрый способ сказать, что вы хотите рекурсивную обработку и сохранить практически всё (добавьте опцию -H если нужно сохранять жесткие ссылки). Единственным исключением из вышеупомянутой равносильности, это когда указан -files-from , в случае которого опция -r не работает. Обратите внимание, что опция -a не сохраняет жёсткие ссылки, потому что поиск множественно-символьных файлов, требует много затрат. Необходимо отдельно использовать опцию -H.
--compress-level=NUM explicitly set compression level --skip-compress=LIST skip compressing files with suffix in LIST
--backup-dir=DIR делать бэкапы в указанную директорию --suffix=SUFFIX суффикс бэкапов (по умолчанию ~ )
-delete отличается от –delete-after тем, что удаление производится вначале, а не на завершающей стадии процесса бэкапа. –delete-after работает быстрее, так как не требует лишней стадии обхода списка файлов, но требует использования опции –force для обработки таких ситуаций как удаление файла и появление директории с тем же именем;
Шаблоны исключения и включения, будучи заданными, позволяют гибко выделять, какие файлы должны передаваться, а какие должны быть пропущены.
rsync строит упорядоченный список на основе параметров –include/–exclude, указанных в командной строке. Rsync проверяет каждое имя файла или каталога относительно соответствия каждому шаблону включения/исключения. В действие вступает первое же совпадение. Если совпавший шаблон исключающий, то соответствующий файл пропускается. Если шаблон включающий, то не пропускается. При отсутствии подходящих шаблонов к имени файла он также не пропускается.
Имена файлов проверяемых по таким шаблонам задаются относительно каталога назначения, "верхнего каталога", так что шаблоны необязательно должны включать элементы исходного или конечного каталогов. Единственный случай, когда шаблоны будут проверяться относительно абсолютных путей к файлам или каталогам, - это случай, когда исходным путем является корневой каталог файловой системы.
Заметьте, что при использовании параметра -r (он подразумевается при -a) каждая отдельная часть каждого пути просматривается сверху вглубь, так что шаблоны включения/исключения применяются рекурсивно к каждой такой части.
Также обратите внимание, что параметры –include и –exclude допускают только по одному шаблону каждый. Для добавления множества шаблонов используйте параметры –include-from и –exclude-from или множество параметров –include и –exclude соответственно.
Шаблоны могут быть заданы в нескольких формах. Правила для них таковы:
Правила +/- наиболее полезны в списках, читаемых из файла, позволяя Вам иметь один общий список, который содержит как исключающие, так и включающие шаблоны.
Если Вы завершите исключающий список указанием –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/ нужно включать явно, иначе он будет пропущен из-за "*")
Простой скрипт наглядно демонстрирующий возможности утилиты rsync синхронизировать локальные директории на удаленный сервер при помощи протокола SSH.
Алгоритм скрипта: в текстовом файле backup.lst в каждой новой строчке указываете путь к директории которую нужно скопировать/синхронизировать. В конце слеш не ставим, пустая строки удаляем. Например:
cat backup.lst /home/darkfire/pictures /home/darkfire/documents
В скрипте считывается файл backup.lst и его содержимое передается в цикл while оболочки bash. Для каждой строчки файла backup.lst запускается выполнение rsync для копирования/синхронизации директории на удаленный сервер, при помощи протокола SSH. Используемые ключи: e для указания использования SSH; a включение архивного режима; c включает проверки передаваемых файлов MD4; q уменьшает выводимую информацию (удобно если скрипт будет запускаться при помощи cron); delete удалять файлы, которых нет на передающей стороне (синхронизация); force принудительно удалять не пустые каталоги.
#!/bin/bash # полный путь к вашему списку каталогов BACKUP_LST=/home/darkfire/scripts/backup.lst cat ${BACKUP_LST} | while read Res; do rsync -e ssh -acq --delete --force $Res root@xxx.xxx.xxx.xxx:/root/bakdir2 done
Скрипт можно сделать более удобным не используя напрямую SSH, а подключив удалённую директорию на локальный сервер, при помощи технологии fuse: sftp (sshfs), curlftpfs.
Rsync позволяет копировать файлы и папки
rsync -avz --progress file /tmp/backups/ rsync -avz /src/dir_a/ /data/dir_b/ rsync -avz --progress /src/dir_a/ root@10.10.10.22:/root/dir_b/
Не обязательная опция progress позволяет видеть сколько процентов уже скопировано, а сколько еще осталось.
Рекурсивно синхронизируется содержимое папки dir_a c директорией dir_b. Файлы передаются в "аrchive" режиме, который обеспечивают, что при трансфере будут сохранены символьные ссылки, файлы устройств, атрибуты, права, полномочия доступа и т.д. Использовано сжатие, для уменьшения размера передаваемых данных. В директории dir_b удаляются файлы отсутствующие в источнике (dir_a).
rsync -avz --delete /src/dir_a/ /data/dir_b
Синхронизация на удаленный сервер с использованием нестандартного порта SSH:
rsync --rsh='ssh -p1004' -acq --delete --force /src/dir_a/ backup@backup.example.com:dir_b
Для переноса локальной директории в другое место можно использовать rsync, например так
rsync -aHx --numeric-ids --progress --stats /var/www/ /tmp/www/
Где а архивный режим и рекурсия; H сохранять жесткие ссылки; x запрет на переходит границ файловой системы при рекурсивном копировании; numeric-ids вместо имен групп и пользователей посылаются их числовые id; progress показать % выполнения: stats выводить подробную статистику по передаче файлов.
Как известно, Rsync работает в 1 поток. Часто это является узким местом в скорости передачи файлов. Ниже предоставляю решения для запуска Rsync в несколько потоков.
Если нужно перенести много директорий, то лучше запускать rsync в несколько потоков. В примере ниже вы должны находиться в директории /var/www/. Ключ P указывает количество потоков, в данном случае 5 потоков.
ls | xargs -I '{}' -P 5 -n1 rsync -aHx --numeric-ids --progress --stats /var/www/'{}'/ 10.10.10.10:/var/www/'{}'/
Второй вариант многопоточности rsync. У нас имеются директория с вложениями как фалов, так и еще поддиректориями со своими файлами.
find . -type d | xargs -I '{}' -P 5 -n1 rsync -a --delete /home/old/Foto/'{}'/ /home/old/CloudDisk/'{}'/
Разберем данный пример:
Ещё пример:
ls -p | grep -v / | xargs -I '{}' -P 5 -n1 rsync -av --exclude="lost+found" --no-links /home/myuser/files/'{}'
Надеюсь эта практическая информация будет полезна многим. Примеры в статье взяты из повседневного опыта использования rsync для бэкапа/синхронизации/копирования данных между VPS. Освоение rsync позволит системным администраторам и пользователям Unix-систем значительно оптимизировать процессы резервного копирования и синхронизации данных. Регулярная практика и эксперименты с различными опциями помогут вам полностью раскрыть потенциал этой мощной утилиты.
Помните, что правильное использование rsync может существенно повысить эффективность управления данными в вашей инфраструктуре, обеспечивая надежность и безопасность при минимальных затратах ресурсов.