Олег Букатчук

Синхронизация файлов с помощью rsync по ssh в Debian Linux

Янв
11

Rsync – удобная утилита для синхронизации файлов или директорий. Передавать файлы можно поверх ssh. При синхронизации пересылаются только изменения, что способствует минимизации трафика.

Приведу краткий перечень основных параметров:

Параметр Описание
-a работа в режиме архивирования, экфивалентна набору параметров -rlptgoD.
Передав rsync эту опцию вы получите:
-r, рекурсивное копирование каталогов;
-l, копирование символических ссылок «как есть», то есть rsync не будет следовать по ним, обращаясь к файлам;
-p, сохранение прав доступа к файлам;
-t, сохранение штампов времени модификации файлов;
-g, -o, сохранение владельца и группы файла соответственно;
-D, эквивалентно —devices —specials
—devices сохранение файлов устройств (опция будет работать только для суперпользователя);
—specials сохранение специальных файлов.
-u режим обновления — пропускаются файлы на получателе, имеющие более позднюю дату модификации, чем в источнике.
-v заставляющая rsync выводить имена копируемых файлах.
-q не выводит сообщения об ощибках.
-z включает режим сжатия.
-P отображать прогресс при копировании.
заставляет rsync проверять файлы по контрольной сумме, а не просто по размеру и дате модификации. Опция полезная, но дает дополнительную нагрузку на процессор и значительно увеличивает время синхронизации. Рекомендую использовать для передачи важных данных.
-n режим тестирования, нужен для проверки, что скопирует rsync. Используется с -v и/или -i.
-i показывать, какие изменения выполняются. Используется часто с -n.
-H сохранять жесткие ссылки, оставляя их на другом конце бэкапа.
-x не выходить за пределы текущей точки монтирования.
—delete удалять из бэкапа файлы, которых уже нет на стороне источника. Этот параметр отличается от —delete-after тем, что удаление производится вначале, а не на завершающей стадии процесса бэкапа.
—delete-after работает быстрее, так как не требует лишней стадии обхода списка файлов, но требует использования опции.
—force для обработки таких ситуаций как удаление файла и появление диретории с тем же именем.
—delete-excluded удалять части которые уже есть на стороне бэкапа, но появились в списке исключения.
-compare-dest=DIR сохранять новые и измененные файлы в отдельной директории, не трогая на время копирования основную директорию назначения, в конце разом, путем переименования, обновить содержимое бэкапа.
—link-dest=DIR использовать жесткие ссылки на файлы в DIR, например, для создания подобия снапшотов.
—ignore-errors продолжать копирование и удаление после появления ошибок.
—max-delete ограничение максимально числа удаляемых за один раз файлов и каталогов.
-A сохранять не только права доступа, но и ACL.
—files-from=FILE задать список директорий и файлов для бэкапа в файле.
-e ssh использование при копировании ssh.
—bwlimit=KBPS ограничение скорости копирования.

В документации по rsync вариант, когда копируются файлы с локальной системы на удалённую, называется push. В случае же, когда файлы копируют с удалённой системы на локальную, называется pull.

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

Обмен ssh-ключами

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

user@host:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
2f:f6:b9:25:d8:97:cf:db:42:c7:71:c9:68:a6:8a:e6 user@host
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|              o .|
|           + = +.|
|        S   o ..o|
|         +   o  +|
|        + = =  ..|
|       . = * o ..|
|        oE+. + .o|
+-----------------+

После этого будет создан каталог .ssh с таким содержимым:

user@host:~$ ls -la .ssh/
drwx------ 2 user user 4096 янв 11 08:32 .
drwxr-xr-x 9 user user 4096 окт 14 15:28 ..
-rw------- 1 user user 1195 авг  5 23:41 authorized_keys
-rw------- 1 user user 1675 янв 11 08:32 id_rsa
-rw-r--r-- 1 user user  393 янв 11 08:32 id_rsa.pub
-rw-r--r-- 1 user user  884 фев 10  2016 known_hosts

id_rsa.pub — это открытый ключ, который необходимо скопировать в файл ~/.ssh/authorized_keys на другой машине. В Debian GNU/Linux для облегчения процедуры есть утилита ssh-copy-id, которая делает все автоматически:

user@host:~$ ssh-copy-id -i .ssh/id_rsa.pub user@11.22.33.44
The authenticity of host '11.22.33.44 (11.22.33.44)' can't be established.
ECDSA key fingerprint is b2:c4:a9:cc:01:d7:3a:66:f8:84:4b:c8:00:8d:f7:34.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@11.22.33.44's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘user@11.22.33.44'"
and check to make sure that only the key(s) you wanted were added.

Для второго сервера проделывает аналогичную процедуру с ssh-ключами.

user@host:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
4c:6c:56:1c:6a:2f:64:bb:c6:63:f1:01:6e:98:3b:bc user@host
The key's randomart image is:
+---[RSA 2048]----+
|         .o.     |
|       + o.      |
|        X        |
|       O.o       |
|       +S..      |
|      o +o.      |
|     . ooo .     |
|      +. .+      |
|      Eo ...     |
+-----------------+

После этого будет создан каталог .ssh с таким содержимым:

user@host:~$ ls -la .ssh/
drwx------ 2 cis cis 4096 Jan 11 08:44 .
drwxr-xr-x 5 cis cis 4096 Jan 11 08:35 ..
-rw------- 1 cis cis  393 Jan 11 08:35 authorized_keys
-rw------- 1 cis cis 1679 Jan 11 08:44 id_rsa
-rw-r--r-- 1 cis cis  391 Jan 11 08:44 id_rsa.pub

id_rsa.pub — это открытый ключ, который необходимо скопировать в файл ~/.ssh/authorized_keys на другой машине. В Debian GNU/Linux для облегчения процедуры есть утилита ssh-copy-id, которая делает все автоматически:

user@host:~$ ssh-copy-id -i .ssh/id_rsa.pub user@44.33.22.11
The authenticity of host '44.33.22.11 (44.33.22.11)' can't be established.
RSA key fingerprint is c3:12:52:99:d3:48:eb:3d:45:0b:f1:f4:64:19:ae:e3.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@44.33.22.11's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘user@44.33.22.11'"
and check to make sure that only the key(s) you wanted were added.

Теперь можно залогиниться на оба сервера под пользователем user с авторизацией по ключам, без ввода пароля с любого из этих серверов.

Примеры использования rsync

Скопируется на сервер 11.22.33.44 содержимое папок /backup/file1/ /backup/file2/ в папку backup

# rsync -zavP /backup/file1/ /backup/file2/ user@11.22.33.44:/backup

В этом примере уже скопируются сами папки

# rsync -zavP /backup/file1 /backup/file2 user@11.22.33.44:/backup

Как ограничить скорость передачи файлов? Нужно поставить опцию —bwlimit :

# rsync -zavP --bwlimit=100 /backup/file1/ user@11.22.33.44:/backup

Как синхронизировать файлы с проверкой по контрольной сумме?

# rsync -сzavP /backup/file1/ user@11.22.33.44:/backup

Как скопировать файлы с удаленной машины на локальную?

# rsync -zavP user@11.22.33.44:/backup /backup/file1/

Как исключить файл или директорию при копировании? (Исключаем директорию /temp)

# rsync -azVP --exclude /temp/ /home/data/ user@11.22.33.44:/backup

Как использовать нестандартный порт ssh при копировании rsync?

# rsync -zavP '-e ssh -p 12345' /var/lib/ user@11.22.33.44:/backup

Как запустить тестовое копирование без реального перемещения файлов, но с соблюдение всех условий боевого использования rsync?

# rsync -czavnP /mnt/cloud/ user@11.22.33.44:/data

Не учитывать пользователя, группу и права при передаче файлов и директорий

# rsync -rvz --no-p --no-o --no-g /home/data/ user@server.com:/home/data/

Особенности и исключения

(«—exclude-from=файл» или «—exclude маска1 —exclude маска2»)
Для того чтобы исключить из бэкапа содержимое директории, но саму директорию оставить, нужно указать в «exclude» файле «/dir/*», а не «/dir/» (под «/dir» подпадет и /dir123, и файл /dir.txt, для директорий указание «/» в конце обязательно).

Звездочка («*») в шаблоне действует только на имя файла/каталога, чтобы маской охватывалась часть пусти, включая «/», нужно писать «**».

Шаблон не начинающийся с ‘/’ проверяется с конца строки. Например «/dir/test» будет проверен c начала пути, а «dir/test.txt» или «*.log» с конца.

Если необходимо исключить все поддиректории в /dir, кроме /dir/best, в список исключений нужно поместить: + /dir/best/ — /dir/* При переборе содержимого «exclude» файла, срабатывает первое правило под которое подпадает текущий путь, не важно исключающие или нет.

Запрещение двойного сжатия при передаче данных по SSH. rsync при задании опции «-z» более оптимально сжимает передаваемые данные, поэтому сжатие средствами ssh можно отключить:

# export RSYNC_RSH="ssh -c arcfour -o Compression=no -x"
# rsync -zavP --bwlimit=16 /dir1 /dir2 user@11.22.33.44:/dir/