Утилита rsync, синхронизация файлов в Linux

Введение

Rsync, что означает «remote sync«, в переводе “удаленная синхронизация” — средство синхронизации удаленных и локальных файлов. Утилита использует алгоритм, минимизирующий объем копируемых данных за счёт перемещения только тех участков файлов, которые были изменены. В данном руководстве мы рассмотрим основы использования этой мощной утилиты. В примерах используется Ubuntu 12.04 VPS, но вы можете работать в любом современном дистрибутиве Linux.

Что такое Rsync?

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

Опции rsync

  • -v — Выводить подробную информацию о процессе копирования
  • -q — Минимум информации
  • -c — Проверка контрольных сумм для файлов
  • -a — Режим архивирования
  • -R — относительные пути
  • -b — создание резервной копии
  • -u — не перезаписывать более новые файлы
  • -l — копировать символьные ссылки
  • -L — копировать содержимое ссылок
  • -H — копировать жесткие ссылки
  • -p — сохранять права для файлов
  • -g — сохранять группу
  • -t — сохранять время модификации
  • -x — работать только в этой файловой системе
  • -e — использовать другой порт для ssh пример rsync -e «ssh -p 1234»
  • -z — сжимать файлы перед передачей
  • —delete — удалять файлы которых нет в источнике
  • —exclude — исключить файлы по шаблону
  • -r —recursive — перебирать директории рекурсивно
  • —no-recursive — отключить рекурсию
  • —progress — выводить прогресс передачи файла
  • —stat — показать статистику передачи
  • —version — версия утилиты

Базовый синтаксис

Базовый синтаксис rsync очень прост и аналогичен ssh, scp и cp. Дли синхронизации содержимого директории dir1 в dir2 на той же системе введите команду:

rsync -r dir1/ dir2

Опция -r означает рекурсивную синхронизацию и обязательна для синхронизации директорий.

Вместо нее можно было воспользоваться флагом -a:

rsync -a dir1/ dir2

Опция -a — это комбинированный флаг. Она означает архивную синхронизацию и осуществляет рекурсивную синхронизацию с сохранением символических ссылок, специальных файлов, файлов устройств, времени изменения, группы, владельца и прав доступа. Она используется чаще чем -r, и обычно требуются именно ее функции.

Важное замечание: В конце первого аргумента в рассмотренных выше командах указан слэш (/):

rsync -a dir1/ dir2

Он нужен для того, чтобы определить аргумент как “содержимое dir1”. Без слэша в dir2 была бы помещена сама директория со всеми файлами внутри:

~/dir2/dir1/[файлы]

Всегда внимательно проверяйте аргументы при выполнении команды rsync. Специально для этого существуют опции -n или —dry-run (тестовый прогон без фактической синхронизации). Флаг -v (verbose, подробная информация) также полезен для полноценного просмотра выходных данных:

rsync -anv dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .

Удалим слэш в конце аргумента и сравним результаты:

rsync -anv dir1 dir2
Output
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-доступа можно синхронизировать директорию dir1 с удаленным компьютером, выполнив следующую команду (обратите внимание, что в данном случае нам нужно передать саму директорию, поэтому слэш в конце не указываем):

rsync -a ~/dir1 имя_пользователя@удаленный_узел:директория_назначения

Например:

rsync -a ~/dir1 root@192.168.0.1:/home/dir1

Такая операция называется «push» (“толчок”), потому что директория “толкается” из локальной системы в удаленную. Противоположная операция — “pull” (“извлечение”), она применяется для синхронизации с удаленной системы в локальную. Если бы директория dir1 была в удаленной системе, синтаксис был бы следующим:

rsync -a имя_пользователя@удаленный узел:/home/username/dir1 место_синхронизации_на_локальной_машине

Как и в случае с cp и подобными командами, источник всегда является первым аргументом, а место назначения — вторым.

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

Полезные опции

У rsync есть множество опций, которые изменяют заданное по умолчанию функционирование. Мы уже рассмотрели некоторые из них выше. Если вы передаёте несжатые файлы, например, текстовые, можно снизить объем сетевого трафика при помощи опции -z, которая выполняет компрессию:

rsync -az /откуда /куда

Очень полезной опцией является -P: она объединяет флаги —progress и —partial. Первый из них показывает ход выполнения передачи, а второй позволяет возобновлять прерванные передачи:

rsync -azP /откуда /куда
Output
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 /откуда /куда
Output
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 источник место_назначения
Output
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. Прежде чем воспользоваться ей, проведите тестирование с опцией -n, чтобы исключить потерю данных.

rsync -a --delete /откуда /куда

Если требуется исключить из синхронизации определенные файлы, их можно указать в разделенном запятыми списке после опции —exclude=:

rsync -a --exclude=шаблон_исключения /откуда /куда

Если указан шаблон исключения, можно игнорировать его для файлов, соответствующих другому шаблону при помощи опции —include=.

rsync -a --exclude=шаблон_исключения --include=шаблон_включения /откуда /куда

Наконец, опция —backup может использоваться для сохранения резервных копий важных файлов. Она используется совместно с опцией —backup-dir, которая указывает директорию для сохранения резервных копий.

rsync -a --delete --backup --backup-dir=директория_резервных_копий /откуда /куда

Заключение

Использование rsync может упростить передачу файлов по сети и повысить надёжность локальной синхронизации директорий. Благодаря своей гибкости rsync является полезным инструментом для различных операций на уровне файлов.

Владение rsync позволяет выполнять сложные операции резервного копирования и точно контролировать, что и как передаётся.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

ИТ Проффи

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: