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 установим из портов:
cd /usr/ports/net/rsync/ make install clean rehash
Итак примеры:
1. Синхронизация двух директорий на одном сервере
Для синхронизации двух директорий на одной машине используем ключи -zvr
z - включаем сжатие
v - детализация
r - режим рекурсии, т.е. синхронизировать вместе с внутренними каталогами, а не только файлы верхнего уровня.
Пример с машины на Freebsd:
rsync -zvr /usr/ports/net/rsync/ /home/greendail/temp sending incremental file list created directory /home/greendail/temp ./ Makefile distinfo pkg-descr pkg-plist files/ files/rsyncd.conf.sample files/rsyncd.sh.in sent 3552 bytes received 133 bytes 7370.00 bytes/sec total size is 6678 speedup is 1.81
Вывод с машины с Ubuntu аналогичен.
Сравним наши копии:
/usr/ports/net/rsync/>ls -l /usr/ports/net/rsync/ /home/greendail/temp /home/greendail/temp: total 12 -rw-r--r-- 1 root greendail 3913 Apr 26 16:13 Makefile -rw-r--r-- 1 root greendail 404 Apr 26 16:13 distinfo drwxr-xr-x 2 root greendail 512 Apr 26 16:13 files -rw-r--r-- 1 root greendail 695 Apr 26 16:13 pkg-descr -rw-r--r-- 1 root greendail 268 Apr 26 16:13 pkg-plist /usr/ports/net/rsync/: total 12 -rw-r--r-- 1 root wheel 3913 Jan 1 2010 Makefile -rw-r--r-- 1 root wheel 404 Jan 1 2010 distinfo drwxr-xr-x 2 root wheel 512 Jul 19 2010 files -rw-r--r-- 1 root wheel 695 Mar 15 2006 pkg-descr -rw-r--r-- 1 root wheel 268 May 17 2005 pkg-plist
Как мы видим, rsync изменил метки времени и группу владельца во время синхронизации.
2. Сохранение временных меток в процессе синхронизации
Для этого используется опция -a, которая показывает режим архива и включает в себя:
- рекурсивный режим
- сохраняет символические ссылки
- сохраняет разрешения (permissions)
- сохраняет временные метки
- сохраняет владельца и группу
Изменяем команду из первого примера:
#rsync -avz /usr/ports/net/rsync/ /home/greendail/temp sending incremental file list created directory /home/greendail/temp ./ Makefile distinfo pkg-descr pkg-plist files/ files/rsyncd.conf.sample files/rsyncd.sh.in sent 3554 bytes received 133 bytes 7374.00 bytes/sec total size is 6678 speedup is 1.81
И проверяем:
ls -l /usr/ports/net/rsync/ /home/greendail/temp /home/greendail/temp: total 12 -rw-r--r-- 1 root wheel 3913 Jan 1 2010 Makefile -rw-r--r-- 1 root wheel 404 Jan 1 2010 distinfo drwxr-xr-x 2 root wheel 512 Jul 19 2010 files -rw-r--r-- 1 root wheel 695 Mar 15 2006 pkg-descr -rw-r--r-- 1 root wheel 268 May 17 2005 pkg-plist /usr/ports/net/rsync/: total 12 -rw-r--r-- 1 root wheel 3913 Jan 1 2010 Makefile -rw-r--r-- 1 root wheel 404 Jan 1 2010 distinfo drwxr-xr-x 2 root wheel 512 Jul 19 2010 files -rw-r--r-- 1 root wheel 695 Mar 15 2006 pkg-descr -rw-r--r-- 1 root wheel 268 May 17 2005 pkg-plist
Как мы видим, получилась зеркальная копия.
3. Синхронизация одного файла
Тут все просто -
#rsync -v /usr/ports/net/rsync/Makefile /home/greendail/temp Makefile sent 3985 bytes received 31 bytes 8032.00 bytes/sec total size is 3913 speedup is 0.97
4. Синхронизация файлов с локальной машины на удаленную
Для примера я кидаю файлы с FreeBSD на Ubuntu, но принципиальной разницы нет, поэтому далее указывать с какой системы на какую указывать не буду.
Обратите внимание, чтобы если кидать файлы на убунту у Вас должен быть установлен openssh-server (ставится sudo apt-get install openssh, после чего не забудьте заглянуть /etc/ssh/sshd_config и изменить стандартные политики)
rsync -rvz /home/greendail/temp/ greendail@192.168.0.5:/home/sysadmin/temp1/ greendail@192.168.0.5's password: sending incremental file list created directory /home/sysadmin/temp1 ./ Makefile sent 1671 bytes received 34 bytes 148.26 bytes/sec total size is 3913 speedup is 2.30
Здесь нам необходимо указать имя пользователя, ip-aдрес сервера и путь. Общий вид - username@machinename:path. После ввода команды необходимо ввести пароль того пользователя, который указан в команде для входа на сервер. В данном примере мы указали ключ -r вместо -a, т.к. у пользователя greendail нет прав на создание файлов от имени рута (а синхронизируем мы именно такие файлы).
Для того, чтобы не вводить пароль каждый раз, например для работы из скрипта, вы можете использовать ssh-copy-id, здесь мы этого рассматривать не будем.
5. Синхронизация файлов с удаленной машины на локальную
Здесь все тоже самое, только меняются местами source и destination
rsync -rvz greendail@192.168.0.5:/home/sysadmin/temp1/ /home/greendail/temp/
6. Синхронизация с удаленной машиной имеющий нестандартный порт ssh
Для этого нам понадобиться ключ -е с указание номера порта, например -e='ssh -p 4439'
Тогда наша команда будет выглядеть:
rsync -e='ssh -p 4439' -rvz /home/greendail/temp/ greendail@192.168.0.5:/home/sysadmin/temp1/
7. Не перезаписывать измененные данные в месте назначения (destination)
Довольно типичная ситуация, если файл изменен на удаленной стороне, а мы не хотим перезаписать его старой версией из источника.
Для этого мы используем опцию -u. В примере файл "readme" изменен на удаленной стороне:
# ls -l /home/greendail/temp/readme total 39088 -rwxr-xr-x 1 root root 4096 Apr 27 11:35 readme
$ rsync -avzu greendail@192.168.0.5:/home/sysadmin/temp1 /home/greendail/temp Password: receiving file list ... done temp1/ sent 122 bytes received 505 bytes 114.00 bytes/sec total size is 45305958 speedup is 72258.31
$ ls -lrt total 39088 -rwxr-xr-x 1 root root 4096 Apr 27 11:35 readme
8. Синхронизация только дерева каталогов (без файлов)
Используем опцию - d для синхронизации дерева каталогов, без синхронизации файлов находящихся внутри каталогов (файлы с корневой директории все равно синхронизуются)
#rsync -v -d root@192.168.0.5:/home/sysadmin/temp/ . root@192.168.0.5's password: receiving file list ... done .directory 17012011056.jpg Scan009.PDF dig install-gecko.sh names.txt sape/ sent 1544 bytes received 161959 bytes 15571.71 bytes/sec total size is 323757 speedup is 1.98
9. Вывод процесса синхронизации на экран или файл
Если Вы используете rsync например для бэкапов, то очень полезно знать прогресс выполнения, то бишь сколько файлов скопировалось или в каком месте процесс сейчас находится и т.д.
Для этого импользуеться опция --progress
rsync -avz --progress root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list ./ .directory 72 100% 70.31kB/s 0:00:00 (xfer#1, to-check=5/7) 17012011056.jpg 145031 100% 1.08MB/s 0:00:00 (xfer#2, to-check=4/7) Scan009.PDF 160512 100% 979.69kB/s 0:00:00 (xfer#3, to-check=3/7) dig 16057 100% 93.90kB/s 0:00:00 (xfer#4, to-check=2/7) install-gecko.sh 2069 100% 11.82kB/s 0:00:00 (xfer#5, to-check=1/7) names.txt 16 100% 0.09kB/s 0:00:00 (xfer#6, to-check=0/7) sent 128 bytes received 306856 bytes 26694.26 bytes/sec total size is 323757 speedup is 1.05
Для вывода информации в файл используется стандартное перенаправление вывода (например > /home/greendail/backup.log)
rsync -avz --progress root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp > /home/greendail/backup.log
10. Удаление файлов в точке назначения.
Если файл не присутствует на источнике, но присутствует на конечной машине (куда мы копируем), можно удалять такие файлы в процессе синхронизации.
Для этого используется опция --delete
Создадим новый файл на конечном сервере (точке назначения) с именем new-file.txt и запускаем:
rsync -avz --delete root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list deleting new-file.txt ./ sent 14 bytes received 229 bytes 21.13 bytes/sec total size is 323757 speedup is 1332.33
11. Не создавать новые файлы на конечном сервере
Если вы хотите обновлять (синхронизировать) только сущестующие файлы, не копируя вновь созданные, то для этого нам понадобится опция --existing
Для примера, создаем на источнике файл newfile.txt и производим синхронизацию:
rsync -avz --existing root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list ./ sent 14 bytes received 249 bytes 27.68 bytes/sec total size is 323759 speedup is 1231.02
12. Просмотр разницы между источником и приемником (точкой назначения)
Просмотрим содержимое синхронизируемых директорий.
На источнике:
#ls -l total 332 -rw------- 1 10008 10000 72 Apr 28 11:01 .directory -rwxr--r-- 1 10008 10000 145031 Jan 17 2011 17012011056.jpg -rw-r--r-- 1 10008 10000 160512 Oct 31 12:39 Scan009.PDF -rw-r--r-- 1 10008 10000 16057 Apr 28 12:10 dig -rwxr-xr-x 1 10008 10000 2069 Nov 10 02:02 install-gecko.sh -rw-r--r-- 1 10008 10000 16 Mar 23 15:29 names.txt -rw-r--r-- 1 10008 10000 43 Apr 28 12:10 newfile.txt
На приемнике:
/home/greendail/temp/>ls -l total 326 -rw------- 1 10008 10000 72 Apr 28 11:01 .directory -rwxr--r-- 1 10008 10000 145031 Jan 17 2011 17012011056.jpg -rw-r--r-- 1 10008 10000 160512 Oct 31 12:39 Scan009.PDF -rw-r--r-- 1 10008 10000 16057 Apr 28 12:07 dig -rwxr-xr-x 1 10008 10000 2069 Nov 10 02:02 install-gecko.sh -rw-r--r-- 1 10008 10000 16 Mar 23 15:29 names.txt -rw-r--r-- 1 10008 10000 36 Apr 28 12:06 newfile.txt
В приведенном выше примере различия заметны для двух файлов, для newfile.txt -время и размер, для dig - время
Теперь сравним их с использованием rsync. Для этого используется опция -i
rsync -avzi root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list .d..t...... ./ >f..t...... dig >f.st...... newfile.txt sent 196 bytes received 350 bytes 57.47 bytes/sec total size is 323793 speedup is 593.03
Давайте рассмотрим что означают символы в этом выводе:
> - показывает что файл был передан (синхронизирован).
f - показывает что это файл.
d - директория
s - показывает изменение размера.
t - показывает изменение штампа времени.
o - изменение владельца
g - изменение группы.
13. Включение/исключение файлов/директорий с использованием шаблонов
Rsync позволяет задавать шаблоны для отбора нужных файлов и директорий.
Рассмотри пример в котором скопируем все файлы начинающиеся с буквы "n"
>rsync -avz --include 'n*' --exclude '*' root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list ./ names.txt newfile.txt sent 67 bytes received 256 bytes 30.76 bytes/sec total size is 59 speedup is 0.18
--include - это то, что мы включаем в синхронизацию (в нашем случае все что начинается на n)
--exclude - это то, что мы исключаем (в нашем случае все остальное)
14. Не передавать файлы большого размера
Мы можем задать rsync максимальный размер передаваемого файла. Для этого используется опция --max-size.
rsync -avz --max-size='10K' root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list ./ .directory install-gecko.sh names.txt newfile.txt sent 90 bytes received 1297 bytes 132.10 bytes/sec total size is 323800 speedup is 233.45
В данном примере мы сказали rsync копировать файлы меньше или равные 10К (max-size=100K). Для больших единиц используются обозначения M - мегабайты, G - гигабайты.
15. Передать файлы целиком
Одна из главных особенностей Rsync состоит в том, что она передает только измененные блоки к месту назначения, а не отправляет весь файл целиком.
Таким образом, если Вам не жалко пропускной способности Ваших каналов связи, то можно копировать файлы целиком. Для этого используется опция -W. Данная опция ускоряет работа rsync, т.к. не проверяется контрольная сумма на источнике и приемнике.
rsync -avzW root@192.168.0.5:/home/sysadmin/temp/ /home/greendail/temp root@192.168.0.5's password: receiving incremental file list 17012011056.jpg Scan009.PDF dig sent 68 bytes received 322073 bytes 33909.58 bytes/sec total size is 323800 speedup is 1.01
На этом пожалуй остановимся.
Напоследок несколько полезных ссылок:
Использование rsync в скриптах
Ссылка на cwRsync
Комментарии
спасибо за инфу
спасибо за инфу