Примеры синхронизации Rsync. Приёмы работы c rsync

Мартин Стрейчер (Martin Streicher)
Опубликовано 11.02.2010

Серия контента:

За последние 20 лет применение компьютерных сетей стало чрезвычайно широким. Это произошло главным образом благодаря развитию Интернет, инвестициям в национальную и международную сетевую инфраструктуру и падению цен на сетевое и компьютерное оборудование. Сегодня сети являются повсеместными, и всё новые приложения увеличивают требования к масштабируемости и скорости сетей. Когда-то Интернет начинался с нескольких небольших рабочих станций , но сейчас он и его частные аналоги соединяют бесчисленное количество компьютеров.

Часто используемые сокращения
  • FTP : File Transfer Protocol (протокол передачи файлов)
  • WebDAV : Web-based Distributed Authoring and Versioning (основанный на Web, распределенный протокол с поддержкой авторства и версионности файлов)

На протяжении этого же периода UNIX® также рос и предлагал для использования все более мощное ПО. Протокол FTP был одним из первых инструментов для обмена файлами между системами, он широко распространен и в наши дни. Команда rcp (сокращение от "remote copy" – удаленное копирование) была шагом вперед по сравнению с FTP, так как она не только предоставляла возможности стандартной утилиты cp , но и копировала файлы с одной машины на другую. rdist , основанная на rcp , автоматически распространяла файлы с одной машины на множество систем.

Сегодня все эти инструменты устарели, например, rcp и rdist не обеспечивают безопасность при передаче файлов. Теперь их место занимает scp . Хотя FTP все так же широко распространен, но везде, по возможности, следует использовать SFTP (Secure FTP), безопасную версию FTP. Есть также и другие возможности для обмена файлами, например WebDAV и BitTorrent™. Конечно, чем больше машин у вас есть, тем сложнее поддерживать их в синхронизованном или хотя бы известном состоянии. При работе с scp и WebDAV для этого необходимо написать свой собственный сценарий, выполняющий синхронизацию.

Идеальным инструментом для распределения файлов является rsync . Он умеет возобновлять передачу файлов после разрыва соединения, передает только те куски файла, которые различаются в исходном файле и его копии назначения, а также может выполнять полное или инкрементное резервное копирование. Кроме того, он доступен на всех разновидностях UNIX, в том числе Mac OS X, благодаря чему с его помощью можно легко связать практически любые версии UNIX.

Для знакомства с rsync сначала рассмотрим типичные варианты его использования, а затем перейдем к более сложным возможностям его применения. Для демонстрации работы rsync я буду использовать Mac OS X версии 10.5, Leopard (разновидность FreeBSD) и Ubuntu Linux® версии 8. Если вы используете другую операционную систему, то есть возможность перенести большинство примеров и на нее; обращайтесь к странице руководства (man) rsync на вашей машине чтобы узнать, поддерживаются ли у вас используемые здесь операции, и при необходимости попытаться найти аналог.

Знакомимся с rsync

Так же как cp , rsync копирует файлы из одного места в другое. В отличие от cp , rsync может осуществлять как локальное, так и удаленное копирование. Например, команда, приведенная в , копирует директорию /tmp/photos со всем ее содержимым в домашнюю директорию.

Листинг 1. Копируем директорию и ее содержимое
$ rsync -n -av /tmp/photos ~ building file list ... done photos/ photos/Photo 2.jpg photos/Photo 3.jpg photos/Photo 6.jpg photos/Photo 9.jpg sent 218 bytes received 56 bytes 548.00 bytes/sec total size is 375409 speedup is 1370.11

Параметр -v включает вывод подробных сообщений. Параметр -a (здесь a обозначает архив), является краткой формой записи параметров -rlptgoD , обозначающих, что нужно выполнять рекурсивное (recurse) копирование, копируя символические ссылки как символические ссылки (links), сохраняя у всех файлов права доступа (permissions), время создания (times), группу(group) и владельца файла (owner), а также сохраняя файлы устройств и специальные файлы (devices). Обычно ключ -a создает зеркальную копию файлов за исключением случаев, когда система, на которую выполняется копирование, не поддерживает какие-либо атрибуты копируемых файлов. Например, при копировании директории с UNIX на Windows® не всегда удается идеально отобразить атрибуты. Ниже приводятся несколько предложений для работы в нестандартных ситуациях.

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

Листинг 7. Копируем файлы на локальную машину
rsync --port=7777 mymachine.example.com::pickup/ Hello! Welcome to Martin"s rsync server. drwxr-xr-x 4096 2009/08/23 08:56:19 . -rw-r--r-- 0 2009/08/23 08:56:19 article21.html -rw-r--r-- 0 2009/08/23 08:56:19 design.txt -rw-r--r-- 0 2009/08/23 08:56:19 figure1.png

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

Листинг 8. Меняем местами директории источника и назначения
$ rsync -v --port=7777 application.js mymachine.example.com::dropbox Hello! Welcome to Martin"s rsync server. application.js sent 245 bytes received 38 bytes 113.20 bytes/sec total size is 164 speedup is 0.58

Это был беглый, но довольно полный обзор возможностей rsync . Теперь давайте посмотрим, как можно применять этот пакет для повседневных задач. rsync особенно полезен для резервного копирования. А поскольку он умеет синхронизировать локальные и удаленные файлы или даже файловые системы, то он является идеальным инструментом для управления большими кластерами машин, которые должны быть (по крайней мере, частично) идентичными.

Организуем резервное копирование своих данных с помощью rsync

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

Чтобы сделать эту задачу безболезненной, используйте для резервного копирования rsync и удаленный сервер, возможно, предоставляемый вашим провайдером. Каждая из ваших UNIX-машин может использовать этот механизм, который является идеальным решением для безопасного хранения ваших данных.

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

Листинг 9. Создаем ежедневные резервные копии файлов
#!/bin/sh # This script based on work by Michael Jakl (jakl.michael AT gmail DOTCOM) and used # with express permission. HOST=mymachine.example.com SOURCE=$HOME PATHTOBACKUP=home-backup date=`date "+%Y-%m-%dT%H:%M:%S"` rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date ssh $HOST "rm $PATHTOBACKUP/current && ln -s back-$date $PATHTOBACKUP/current"

Замените HOST именем вашего сервера резервного копирования, а SOURCE – директорией, которую вы хотите сохранять. Замените PATHTOBACKUP на имя модуля. (Также три последние строки сценария можно заключить в цикл и, изменяя переменную SOURCE , делать резервные копии множества директорий). Данный сценарий работает следующим образом.

  • Сначала в переменную date помещается строка вида 2009-08-23T12:32:18 , содержащая текущую дату и время; эта строка будет уникально идентифицировать каждую резервную копию.
  • Главную работу здесь выполняет команда rsync. Параметры -az сохраняют всю информацию о файлах и выполняют сжатие данных перед их передачей, а параметр --link-dest=$PATHTOBACKUP/current указывает, что если какой-либо файл не менялся, нужно не копировать его в новый экземпляр резервной копии, а создать жесткую ссылку, указывающую на этот файл в существующем архиве. Другими словами, новая резервная копия содержит только файлы, претерпевшие изменения , остальные файлы являются ссылками.

    Рассмотрим сценарий более подробно (и подставим вместо всех переменных их значения). Текущим архивом является mymachine.example.com::home-backup/current . Новый архив для каталога /home/strike будет находиться в каталоге mymachine.example.com::home-backup/back-2009-08-23T12:32:18 . Если файл в /home/strike не был изменен, то файл в новом архиве будет представлен жесткой ссылкой на соответствующий файл в текущем архиве. В противном случае новый файл копируется в новый архив.

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

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

Начав работать с удаленным rsync в повседневных задачах, вам, вероятно, понадобится, чтобы демон был всегда в рабочем состоянии. Для Linux- и UNIX-машин имеется загрузочный сценарий rsync , который обычно находится по адресу /etc/init.d/rsync . Воспользовавшись этим сценарием и утилитой вашей операционной системы, управляющей включением и выключением компонентов, можно организовать запуск rsync при загрузке системы. Если же вы запускаете демон rsync без привилегий суперпользователя или у вас нет доступа к загрузочным сценариям, то вы можете запускать rsync с помощью cron:

@reboot /usr/bin/rsync --daemon --port=7777 --config=/home/strike/rsyncd/rsyncd.conf

Эта команда запускает демон каждый раз при перезагрузке машины. Поместите эту строку в файл crontab и сохраните его.

Вы уже видели, как можно заранее обнаружить проблему, используя предварительный просмотр с помощью -n . Также можно отслеживать состояние задач rsync с помощью двух параметров: --progress и --stats . Первый из этих параметров отображает шкалу хода выполнения задания. Второй показывает статистику сжатия и передачи данных. С помощью --compress можно ускорить передачу данных между машинами. Вместо пересылки данных в изначальном виде отправитель выполняет сжатие перед отправкой, а получатель их распаковывает, и в результате меньшее количество байтов передается за меньшее время.

По умолчанию rsync копирует все файлы из источника данных в место назначения. Это называется дублированием. Если вы хотите организовать зеркалирование данных, т.е. чтобы локальные и удаленные данные в точности совпадали, следует использовать параметр --delete . Например, если в источнике имеются файлы A, B и C, то по умолчанию rsync создаст на удаленной машине копии всех трех файлов. Однако если удалить из источника, например, файл B и выполнить дублирование еще раз, то на удаленной машине файл B останется, т.е. удаленная копия перестанет быть точной копией локальных данных. Команда --delete обеспечивает зеркалирование данных, убирая из удаленной копии файлы, которые уже не существуют в исходных данных.

Зачастую имеются файлы, которые вы не хотели бы помещать в архив или резервную копию. Это могут быть вспомогательные файлы, создаваемые редакторами (их имена обычно заканчиваются тильдой [ ~ ]) и другими утилитами, а также множество не имеющих для вас ценности файлов в вашей домашней директории, таких как MP3-файлы, которые при необходимости можно будет восстановить. В таком случае можно указать rsync шаблоны, по которым он будет исключать файлы из обработки. Можно указать в командной строке шаблон или же текстовый файл, содержащий список шаблонов. Также шаблоны можно использовать совместно с командой --delete-excluded , чтобы удалить подобные файлы из удаленной копии.

Чтобы исключить файлы, соответствующие определенному шаблону, используйте команду --exclude . Помните, что если какие-либо символы в шаблоне имеют для оболочки особое значение, например * , то шаблон следует заключить в одиночные кавычки:

$ rsync -a --exclude="*~" /home/strike/data example.com::data

Допустим, что файл /home/strike/excludes содержит следующий список шаблонов:

*~ *.old *.mp3 tmp

Тогда скопировать все файлы за исключением тех, которые соответствуют какомy-либо из этих шаблонов, можно с помощью следующей команды:

$ rsync -a --exclude-from=/home/strike/excludes /home/strike/data example.com::data

Синхронизируй это

Теперь, когда вы знакомы с rsync , у вас не осталось никаких причин не выполнять регулярное резервное копирование. Что случилось? Ваша собака разгрызла жесткий диск? (Бывает и такое!) Примите меры заранее, и тогда ваши данные останутся в полном порядке. Ведь теперь все ваши ценные файлы хранятся в

Есть несколько идентичных серверов (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

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

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

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 есть множество удобных опций и необычайных способностей, вот только их не так-то просто найти. Ну, если только вы не готовы прочитать весь мануал от корки до корки.

Попробую сберечь вам немного времени на чтение мануала и рассказать о самом важном и полезном. Простыми словами, как есть.

Зачем нужен rsync?

Зачем пользоваться rsync если есть привычные cp и scp , спросите вы.

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

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

Только этих двух причин достаточно чтобы в своей ежедневной работе забыть про cp , променяв эту команду и ее аналоги на rsync .

Принцип применения

Если мы говорим о простом копировании файлов, то первым делом всегда стоит сделать пробный прогон (ключ -n) в режиме с показом подробностей (-v):

rsync -avn source example.com:destination

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

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

rsync -av source example.com:destination

В этой команде ключ -a подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты, такие как дата создания и дата изменения. Ключ -v даст вам подробный отчет о работе по мере выполнения и по окончании.

Правила копирования каталогов

С одной стороны правила очень простые.

    Если в конце пути до именованного источника нет слеша, то скопируется сам каталог.

    $ rsync -avn path/to/source example.com:destination sending incremental file list source/ source/example.html ...

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

    $ rsync -avn path/to/source/ example.com:destination ^^^ sending incremental file list example.html ... # Что эквивалентно такой команде: $ cd path/to/source; rsync -avn . example.com:destination

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

Потому лучше всегда следовать обычному сценарию с предварительной проверкой операции.

Некоторые полезные ключи

Сначала поговорим об опциях которые вам будет здорово знать без шпор и шпаргалок.

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

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

    Если вам хочется знать сколько всего, по мнению rsync, осталось работать, вам нужен ключ --info=progress2 . Если вы копируете целую файловую систему, то этот ключ, будучи использован сам по себе, вас разочарует: информация об итоговом объёме будет постоянно обновляться. Это происходит потому что rsync не пытается считать всю файловую систему до того как начнёт копирование, а делает обе задачи сразу.

    Но не отчаивайтесь! Если вы хотите знать точно сколько осталось работать с самого начала, то можно отключить последовательное сканирование ключём --no-inc-recursive или, короче, --no-i-r .

    $ rsync -ah --partial --info=progress2 --no-i-r source example.com:destination 623.38M 0% 82.23MB/s 0:11:10

    Ключи выше есть начиная с версии 3.1.0, то есть уже работают в Debian stable.

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

    С этим ключём rsync удалит лишние файлы из каталого-назначения.

    $ rsync -avn --delete source example.com:destination sending incremental file list deleting source/bad.txt source/ source/test.txt

    Ключ -n в команде выше был оставлен намеренно.

О сжатии замолвим слово

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

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

$ ssh -v [email protected] false 2>&1 | grep compression debug1: Enabling compression at level 6.

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

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

Копируем частично

Наверняка вам когда-нибудь понадобится чтобы rsync пропускал некоторые файлы при копировании.

В самом простейшем случае вам нужно чтобы rsync не копировал файлы разных систем контроля версий, включая каталог вроде.svn и.git . В этой задаче вам не нужно ничего кроме ключа -C (или --cvs-exclude в полной форме). Так файлы большинства популярных VCS будут проигнорированы будто их нет. Не забываем использовать -n при первом запуске.

rsync -nC example.com:source destination

Может получиться так что вы, по ошибке, скопируете кучу таких файлов от VCS. В этом случае для получения чистой копии вам пригодится ключ --delete-excluded , с которым все исключенные файлы будут удалены.

rsync -nC --delete-excluded example.com:source destination

Исключаем через.rsync-filter

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

$ cat source/.rsync-filter - test.bin - *.tmp - /.cache - /example/ - /**/Trash/ - /.mozilla/firefox/*/Cache/ + Projects/**/Trash/

Для исключения чего-либо из списка на перенос нужно добавить в этот файл строчку с правилом (- или + в начале строки).

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

    # никакой файл test.bin не будет скопирован - test.bin # все файлы.tmp будут пропущены - *.tmp

    Если нужно исключить файл или каталог относительно каталога в котором находится.rsync-filter , то укажем со слешем в начале:

    # не будет скопирован каталог или файл.cache, но будут скопированы foo/.cache и foo/bar/.cache - /.cache # не будет скопирован каталог example, но будет скопирован файл example - /example/

    В правилах звездочка соответствует любым символам кроме слеша, а две звездочки соответствуют вообще любым символам:

    # будут пропущены каталоги.local/share/Trash/ и Documents/example/Trash/ - /**/Trash/ # не будет пропущен каталог.mozilla/firefox/abcd.profile/ext/Cache/ # но будет пропущен каталог.mozilla/firefox/abcd.profile/Cache/ - /.mozilla/firefox/*/Cache/

    Наконец, если нужно чтобы какие-то файлы всё-таки копировались, не смотря на ранее заданные правила, то их можно отметить правилом + в начале строки.

    # каталог Projects/Example/layout/Trash/ будет скопирован + Projects/**/Trash/

Файлы.rsync-filter команда rsync умеет искать по всей структуре каталогов будучи запущена с ключём -F .

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

$ rsync -avFFn source example.com:destination sending incremental file list source/ source/example.html source/tmp/ source/tmp/foo.bin sent 174 bytes received 30 bytes 408.00 bytes/sec total size is 18,400 speedup is 90.20 (DRY RUN)

Как видите, лишние файлы не скопировались:

$ ls source/.rsync-filter source/foo.tmp source/foo.tmp source/.rsync-filter $ cat source/.rsync-filter - *.tmp

Ограничим rsync по ssh

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

Например, вы хотите чтобы можно было скопировать файлы на сервер backup.example.com только с хоста server.example.com , только и только в каталог backup-example , и только с этими опциями:

$ rsync -aW --del source/ backup.example.com:destination/backup-example/

То сначала нужно получить команду, которую rsync выполняет при вызове ssh на удаленном хосте:

$ rsync -e "ssh -t -v" -aW --del source/ backup.example.com:destination/backup-example/ 2>&1 | grep command debug1: Sending command: rsync --server -lWogDtpre.iLsfxC --delete-during . destination/backup-example/

Соответственно, в ~/.ssh/authorized_keys на example.com следует добавить для известного ssh ключа запуск этой команды по-умолчанию при подключении:

from="server.example.com",command="rsync --server -lWogDtpre.iLsfxC --delete-during . destination/backup-example/",no-pty,no-port-forwarding ssh-rsa AAAA... # дальше ваш ключ

Таким образом, даже если при запуске rsync будут указаны какие-то другие опции, на сервере-назначении всё равно выполнится команда rsync соответствующая исходным, заданным вами, опциям и настройкам.

Если нужно чтобы ваш бекап нельзя было перезаписать или удалить на сервере назначения, то опцию --del следует заменить на --ignore-existing .

Машина времени

Те пользователи macOS и OS X, что делают бэкап, наверняка оценили работу Time Machine . Эта программа позволяет буквально в два клика вернуться к прошлой версии любого файла. Не смотря на все красивости, Time Machine не делает ничего такого чего мы не можем сделать с помощью rsync .

#!/bin/bash set -o nounset -o errexit cd $(dirname " $0 " ) date = $(date --iso-8601 = seconds) test -L latest || ln -s " $date " latest rsync --delete-excluded --prune-empty-dirs --archive -F --link-dest = ../latest " $@ " "./ $date " rm latest ln -s " $date " latest

Скрипт следует положить в корень того диска или каталога, куда следует делать бэкапы.

Запускать с указанием единственного аргумента: каталога с исходными файлами. Например, так.

/mnt/backups/backup /home

После нескольких запусков получается такая структура каталога:

2017-02-08T22:05:04+09:00 2017-02-08T22:10:05+09:00 2017-02-08T22:15:05+09:00 2017-02-08T22:20:06+09:00 2017-02-08T22:25:05+09:00 2017-02-08T22:30:04+09:00 latest -> 2017-02-08T22:30:04+09:00

При этом latest указывает на самый последний бэкап.

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

$ du -sh /mnt/backups 4,5M /mnt/backups $ du -sh /home 3,8M /home

Всё множество копий занимает лишь немного больше места чем исходный каталог. Место уходит на изменившиеся файлы.

Если ничего не менялось, то место всё равно расходуется на создание каталогов, которые нельзя хранить как жесткие ссылки .

$ du -hs 2017-02-08T22:20:06+09:00 2017-02-08T22:25:05+09:00 2017-02-08T22:30:04+09:00 3,8M 2017-02-08T22:20:06+09:00 136K 2017-02-08T22:25:05+09:00 136K 2017-02-08T22:30:04+09:00

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

$ stat -c "%i" 2017-02-08*/example.txt | uniq 31819810

У одинаковых, не менявшихся, файлов будет один и тот же inode.

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

Программа Rsync (во FreeBSD есть в портах), используется для удаленного копирования () или синхронизации файлов и каталогов, с минимальными затратами трафика. Может практически целиком заменить cp и scp , умеет кодировать данные, поддерживает сжатие и рекурсию, кроме того, прерванные передачи можно с легкостью перезапустить. На страницах руководства, все описано довольно подробно.

Вот несколько примеров: Копировать директорию с контентом: # rsync -a /home/colin/ /backup/colin/ # rsync -a /var/ /var_bak/ # rsync -aR --delete-during /home/user/ /backup/ # Используется относительный путь (см. ниже) То-же что и выше, только по сети и с компрессией. По-умолчанию, Rsync использует для передачи протокол SSH в том числе и с ключами, если таковые имеются. Символ ": " используется как в SCP . Типичный пример удаленного копирования: # rsync -axSRzv /home/user/ user@server:/backup/user/ Исключить из процесса удаленного копирования, директорию tmp в /home/user/ и сохранить иерархию, удаленная директория будет иметь структуру /backup/home/user/ . Данный пример типичен для резервного копирования: # rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/ Использовать 20022 порт для SSH : # rsync -az -e "ssh -p 20022" /home/colin/ user@server:/backup/colin/ Можно использовать демон rsync (с ":: "), это гораздо быстрее, но трафик не шифруется. Местонахождение папки папки для резервного копирования (например /backup ) можно настроить в файле /etc/rsyncd.conf . Переменная RSYNC_PASSWORD служит для того, что-бы избежать необходимости ввода пароля вручную. # rsync -axSRz /home/ ruser@hostname::rmodule/backup/ # rsync -axSRz ruser@hostname::rmodule/backup/ /home/ # Копировать обратно Некоторые важные опции:

  • -a, --archive режим архива; то-же что и -rlptgoD (без -H )
  • -r, --recursive обходить директории (рекурсия)
  • -R, --relative относительные пути
  • -H, --hard-links сохранять жесткие ссылки (hardlink )
  • -S, --sparse handle sparse files efficiently
  • -x, --one-file-system не пересекать границы файловой системы
  • --exclude=PATTERN исключить файлы заданного образца
  • --delete-during приемник удаляется ПРИ ПЕРЕДАЧЕ
  • --delete-after приемник удаляется ПОСЛЕ ПЕРЕДАЧИ

winrsync

Под Windows, rsync можно использовать через cygwin или отдельным приложением cwrsync. Очень удобно для автоматизации резервного копирования. Установите ОДИН из вариантов и добавьте путь в системные переменные Windows: Control Panel -> System -> tab Advanced, button Environment Variables . Отредактируйте переменную "Path ", добавив полный путь до rsync , например так: C:\Program Files\cwRsync\bin или C:\cygwin\bin . Это позволит использовать rsync и ssh из командной строки Windows.

Авторизация по ключу

Rsync автоматически туннелируется через SSH протокол, а тот использует SSH авторизацию на сервере. Автоматическое используется для минимизации участия пользователя в этом процессе, как раз для этого и нужна авторизация по публичному ключу, что-бы не запрашивать у пользователя ввод пароля. Все команды выполняются в командной оболочке Windows (Start -> Run -> cmd ). Создайте и загрузите ключи, как описано в материале , "user " и "server " установите соответствующие. # ssh-keygen -t dsa -N "" # Создаем ключи # rsync user@server:.ssh/authorized_keys2 # Копируем файл ssh/authorized_keys2 на локальную машину # cat id_dsa.pub >> authorized_keys2 # Или используйте редактор, что-бы добавить ключ # rsync authorized_keys2 user@server:.ssh/ # Копируем файл обратно на сервер # del authorized_keys2 # Удаляем локальную копию Теперь проверяем (одной строкой): rsync -rv "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" "user@server:My\ Documents/"

Автоматизация резервного копирования

Планировка и выполнение задания резервного копирования, можно вполне возложить на какой-нибудь планировщик или пакетные файлы (Programs -> Accessories -> System Tools -> Scheduled Tasks). Например, можно создать такой файл, заменив "user@server" на свои:
@ECHO OFF REM rsync the directory My Documents SETLOCAL SET CWRSYNCHOME=C:\PROGRAM FILES\CWRSYNC SET CYGWIN=nontsec SET CWOLDPATH=%PATH% REM uncomment the next line when using cygwin SET PATH=%CWRSYNCHOME%\BIN;%PATH% echo Press Control-C to abort rsync -av "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \ "user@server:My\ Documents/" pause