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
 

0
Голосов пока нет

Комментарии

спасибо за инфу