RSync. Примеры использования
Что-такое rsync, я думаю знают все, но на всякий случай освежим.
Rsync — утилита для Unixlike-систем, использующаяся для синхронизации файлов и папок из одного месторасположения в другое, не важно на одном физическом устройстве находятся или на разных. Имеется ввиду передача по сети.
Важным отличием rsync от многих других программ/протоколов является то, что зеркалирование осуществляется одним потоком в каждом направлении (а не по одному или несколько потоков на каждый файл). Rsync была создана как замена для rcp и scp
Существует реализация rsync для Winows, а точнее не прямая реализация, а сборка из rsync и cygwin, называемая cwRsync. Ссылку на нее Вы сможете найти в конце статьи.
Основные преимущества rsync:
— Скорость: Первоначально rsync реплицирует все содержимое между источником и местом назначения (приемником). Далее rsync передает только изменившиеся блоки или биты в место назначения, что делает синхронизацию действительно быстрой.
— Безопасность: rsync включает в себя шифрование данных при передаче с использованием протокола SSH
— Маленькая нагрузка: rsync использует сжатие и распаковку данных блок за блоком на передающей и принимающей стороне соответственно. Таким образом используемая rsync пропускная способность ниже по сравнению с другими протоколами передачи файлов.
Синтаксис:
$ rsync options source destination
Source (источник) и Destination (место назначения) могут быть как локальными, так и удаленными. В случае использования с удаленными объектами указывает логин, имя сервера и путь.
Рассмотрим несколько примеров.
В качестве тестового стенда взяты Ubuntu Server и FreeBSD. По умолчанию rsync присутствует в Ubuntu Server, для freebsd установим из портов:
1. Синхронизация двух директорий на одном сервере
Для синхронизации двух директорий на одной машине используем ключи -zvr
z — включаем сжатие
v — детализация
r — режим рекурсии, т.е. синхронизировать вместе с внутренними каталогами, а не только файлы верхнего уровня.
Пример с машины на Freebsd:
Вывод с машины с Ubuntu аналогичен.
Сравним наши копии:
Как мы видим, rsync изменил метки времени и группу владельца во время синхронизации.
2. Сохранение временных меток в процессе синхронизации
Для этого используется опция -a, которая показывает режим архива и включает в себя:
— рекурсивный режим
— сохраняет символические ссылки
— сохраняет разрешения (permissions)
— сохраняет временные метки
— сохраняет владельца и группу
Изменяем команду из первого примера:
Как мы видим, получилась зеркальная копия.
3. Синхронизация одного файла
4. Синхронизация файлов с локальной машины на удаленную
Для примера я кидаю файлы с FreeBSD на Ubuntu, но принципиальной разницы нет, поэтому далее указывать с какой системы на какую указывать не буду.
Обратите внимание, чтобы если кидать файлы на убунту у Вас должен быть установлен openssh-server (ставится sudo apt-get install openssh, после чего не забудьте заглянуть /etc/ssh/sshd_config и изменить стандартные политики)
Здесь нам необходимо указать имя пользователя, ip-aдрес сервера и путь. Общий вид — username@machinename:path . После ввода команды необходимо ввести пароль того пользователя, который указан в команде для входа на сервер. В данном примере мы указали ключ -r вместо -a, т.к. у пользователя greendail нет прав на создание файлов от имени рута (а синхронизируем мы именно такие файлы).
Для того, чтобы не вводить пароль каждый раз, например для работы из скрипта, вы можете использовать ssh-copy-id, здесь мы этого рассматривать не будем.
5. Синхронизация файлов с удаленной машины на локальную
Здесь все тоже самое, только меняются местами source и destination
6. Синхронизация с удаленной машиной имеющий нестандартный порт ssh
Для этого нам понадобиться ключ -е с указание номера порта, например -e=’ssh -p 4439′
Тогда наша команда будет выглядеть:
7. Не перезаписывать измененные данные в месте назначения (destination)
Довольно типичная ситуация, если файл изменен на удаленной стороне, а мы не хотим перезаписать его старой версией из источника.
Для этого мы используем опцию -u. В примере файл «readme» изменен на удаленной стороне:
8. Синхронизация только дерева каталогов (без файлов)
Используем опцию — d для синхронизации дерева каталогов, без синхронизации файлов находящихся внутри каталогов (файлы с корневой директории все равно синхронизуются)
9. Вывод процесса синхронизации на экран или файл
Если Вы используете rsync например для бэкапов, то очень полезно знать прогресс выполнения, то бишь сколько файлов скопировалось или в каком месте процесс сейчас находится и т.д.
Для этого импользуеться опция —progress
Для вывода информации в файл используется стандартное перенаправление вывода (например > /home/greendail/backup.log)
10. Удаление файлов в точке назначения.
Если файл не присутствует на источнике, но присутствует на конечной машине (куда мы копируем), можно удалять такие файлы в процессе синхронизации.
Для этого используется опция —delete
Создадим новый файл на конечном сервере (точке назначения) с именем new-file.txt и запускаем:
11. Не создавать новые файлы на конечном сервере
Если вы хотите обновлять (синхронизировать) только сущестующие файлы, не копируя вновь созданные, то для этого нам понадобится опция —existing
Для примера, создаем на источнике файл newfile.txt и производим синхронизацию:
12. Просмотр разницы между источником и приемником (точкой назначения)
Просмотрим содержимое синхронизируемых директорий.
В приведенном выше примере различия заметны для двух файлов, для newfile.txt -время и размер, для dig — время
Теперь сравним их с использованием rsync. Для этого используется опция -i
Давайте рассмотрим что означают символы в этом выводе:
> — показывает что файл был передан (синхронизирован).
f — показывает что это файл.
d — директория
s — показывает изменение размера.
t — показывает изменение штампа времени.
o — изменение владельца
g — изменение группы.
13. Включение/исключение файлов/директорий с использованием шаблонов
Rsync позволяет задавать шаблоны для отбора нужных файлов и директорий.
Рассмотри пример в котором скопируем все файлы начинающиеся с буквы «n»
—include — это то, что мы включаем в синхронизацию (в нашем случае все что начинается на n)
—exclude — это то, что мы исключаем (в нашем случае все остальное)
14. Не передавать файлы большого размера
Мы можем задать rsync максимальный размер передаваемого файла. Для этого используется опция —max-size.
В данном примере мы сказали rsync копировать файлы меньше или равные 10К (max-size=100K). Для больших единиц используются обозначения M — мегабайты, G — гигабайты.
15. Передать файлы целиком
Одна из главных особенностей Rsync состоит в том, что она передает только измененные блоки к месту назначения, а не отправляет весь файл целиком.
Таким образом, если Вам не жалко пропускной способности Ваших каналов связи, то можно копировать файлы целиком. Для этого используется опция -W. Данная опция ускоряет работа rsync, т.к. не проверяется контрольная сумма на источнике и приемнике.
Использование Rsync для синхронизации локального и удаленного каталогов на VPS
Вступление
Rsync расшифровывается как «remote sync» (удаленная синхронизация) и является инструментом удаленной синхронизации локального и удаленного файлов. Он использует алгоритм, который минимизирует объем копируемых данных при помощи перемещения только тех частей файлов, которые были изменены.
Данное руководство описывает основное использование этой мощной утилиты. В примерах был использован сервер Ubuntu 12.04, но можно использовать любой современный дистрибутив Linux.
Что такое Rsync?
Rsync является очень гибким инструментом синхронизации, рассчитанным на работу в сетевой среде. Сетевой протокол, разработанный для использования данного инструмента, также называется Rsync.
Данное руководство в основном ссылается на rsync как на утилиту, а не на протокол.
Благодаря вездесущности данной утилиты на Linux и Unix-подобных системах и ее популярности как инструмента для сценариев системы, она включена в большинство дистрибутивов Linux по умолчанию.
Основной синтаксис
Основной синтаксис Rsync очень прост, его функционирование похоже на SSH, SCP и СР.
Чтобы создать два пробных каталога и несколько пробных файлов, используйте следующую команду:
mkdir dir1
mkdir dir2
touch dir1/file
Это создаст на сервере каталог под названием dir1, содержащий 100 пустых файлов.
ls dir1
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90
file10 file19 file28 file37 file46 file55 file64 file73 file82 file91
file100 file2 file29 file38 file47 file56 file65 file74 file83 file92
file11 file20 file3 file39 file48 file57 file66 file75 file84 file93
file12 file21 file30 file4 file49 file58 file67 file76 file85 file94
file13 file22 file31 file40 file5 file59 file68 file77 file86 file95
file14 file23 file32 file41 file50 file6 file69 file78 file87 file96
file15 file24 file33 file42 file51 file60 file7 file79 file88 file97
file16 file25 file34 file43 file52 file61 file70 file8 file89 file98
file17 file26 file35 file44 file53 file62 file71 file80 file9 file99
Также был создан пустой каталог dir2.
Чтобы синхронизировать содержимое каталогов dir1 to dir2 на одной системе, введите:
rsync -r dir1/ dir2
Флаг «-r» значит «рекурсивный», что необходимо для синхронизации каталогов.
Вместо него можно использовать флаг «-а»:
rsync -a dir1/ dir2
«-a» является комбинированным флагом.
Он означает «архив» и синхронизирует рекурсивно, сохраняя символьные ссылки, специальные файлы и файлы устройств, время изменения, группу, владельца и разрешения.
Он удобнее и потому используется чаще, чем «-r».
Важное примечание
В конце первого аргумента вышеприведенных команд используется конечная косая, или слеш (/):
rsync -a dir1/ dir2
Слеш необходим для обозначения «содержимого dir1».
Альтернативный вариант без использования конечной косой, поместит dir1, включая каталог, в dir2. Это создало бы иерархию, которая выглядит так:
Всегда проверяйте аргументы дважды перед выполнением команды Rsync.
Rsync позволяет это сделать при помощи команд -n или –dry-run. Флаг -v (что значит «подробно») также необходим для получения адекватного результата:
rsync -anv dir1/ dir2
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
Сравните данный результат с результатом, выведенным при снятии слеша:
rsync -anv dir1 dir2
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .
Здесь можно увидеть, что сам каталог был перенесен.
Использование Rsync для синхронизации с удаленной системой
Синхронизация с удаленной системой проста, если есть SSH-доступ к удаленному компьютеру и на обеих системах установлена Rsync. Если вам нужно настроить ключи SSH, нажмите здесь.
Установив и проверив доступ SSH между двумя машинами, можно синхронизировать папку dir1 с удаленным компьютером при помощи следующего синтаксиса (обратите внимание, что в данном случае нужно передать непосредственно саму папку, поэтому косую черту следует опустить):
Данная процедура называется «push», так как она «толкает» каталог из локальной системы на удаленную.
Противоположная ей операция зовется «извлечением» («pull»). Она используется для синхронизации удаленного каталога с локальной системой. Если бы dir1 находился не на локальной, а на удаленной системе, синтаксис выглядел бы так:
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
Как в «ср» и подобных инструментах, первый аргумент всегда указывает на источник, а второй – на назначение.
Полезные опции Rsync
Rsync предоставляет множество команд для изменения стандартного поведения утилиты. Некоторые из наиболее необходимых флагов уже рассматривались.
При передаче еще не сжатых файлов, таких как текстовые файлы, можно уменьшить сетевой трафик, сжимая файлы при помощи параметра -z:
rsync -az source destination
Флаг «-P» также очень полезен. Он совмещает флаги «–progress» и «–partial». Первый выводит индикатор выполнения передачи, а второй позволяет возобновить прерванную передачу:
rsync -azP source destination
sending incremental file list
./
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file100
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)
file11
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101)
. . .
Если запустить команду снова, будет выведен более короткий результат, потому что никакие изменения не были внесены.
Это иллюстрирует способность rsync использовать время последнего изменения, чтобы определить, были ли внесены изменения в файлы.
rsync -azP source destination
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
Если обновить время последнего изменения некоторых файлов, можно увидеть, что rsync повторно копирует только измененные файлы:
touch dir1/file<1..10>
rsync -azP source destination
sending incremental file list
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file2
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)
file3
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101)
. . .
По умолчанию, Rsync ничего не удаляет из каталога назначения. Следовательно, необходимо удалить файлы из каталога назначения, если они удаляются из исходного каталога, чтобы сохранить полную синхронизацию каталогов.
Такое поведение можно изменить с помощью флага «–delete». Прежде чем применять данный флаг, используйте команду «–dry-run» и проведите тестирование, чтобы предотвратить потерю данных.
rsync -a —delete source destination
При необходимости исключить некоторые файлы или каталоги, расположенные в синхронизируемом каталоге, можно внести их в разделенный запятыми список при помощи команды «–exclude=»:
rsync -a —exclude=pattern_to_exclude source destination
Если шаблон исключений был определен, при помощи команды «–include=» исключение можно снять, установив другой шаблон:
rsync -a —exclude=pattern_to_exclude —include=pattern_to_include source destination
Выводы
Rsync может упростить передачу файлов по сетевым соединениям и повысить устойчивость локальной синхронизации каталогов. Гибкость данной утилиты делает ее хорошим инструментом для выполнения различных операций на уровне файлов.
Владение Rsync позволяет проектировать сложные операции резервного копирования, а также получить многоуровневый контроль над тем, что и как передается.