Использование Rsync для синхронизации локального и удаленного каталогов на VPS

Вступление

Rsync расшифровывается как «remote sync» (удаленная синхронизация) и является инструментом удаленной синхронизации локального и удаленного файлов. Он использует алгоритм, который минимизирует объем копируемых данных при помощи перемещения только тех частей файлов, которые были изменены.

Данное руководство описывает основное использование этой мощной утилиты. В примерах был использован сервер Ubuntu 12.04, но можно использовать любой современный дистрибутив Linux.

Что такое Rsync?

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

Данное руководство в основном ссылается на rsync как на утилиту, а не на протокол.

Благодаря вездесущности данной утилиты на Linux и Unix-подобных системах и ее популярности как инструмента для сценариев системы, она включена в большинство дистрибутивов Linux по умолчанию.

Основной синтаксис

Основной синтаксис Rsync очень прост, его функционирование похоже на SSH, SCP и СР.

Чтобы создать два пробных каталога и несколько пробных файлов, используйте следующую команду:

cd ~
mkdir dir1
mkdir dir2
touch dir1/file{1..100}

Это создаст на сервере каталог под названием 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. Это создало бы иерархию, которая выглядит так:

~/dir2/dir1/[files]

Всегда проверяйте аргументы дважды перед выполнением команды 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 с удаленным компьютером при помощи следующего синтаксиса (обратите внимание, что в данном случае нужно передать непосредственно саму папку, поэтому косую черту следует опустить):

rsync -a ~/dir1 username@remote_host:destination_directory

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

Tags: , , , ,

Добавить комментарий