rsync

rsync

Программа rsync имеет следующий синтаксис:

rsync параметры источник приемник

Где роль источника и приемника могут играть:

  • Локальный файл или каталог;
  • Удаленный файл или каталог в форме .[пользователь@]хост:путь;.
  • Удаленный сервер rsync, определяемый идентификатором URI rsync://[пользователь@]хост[:порт]/путь.

Nota Bene, что: либо источник, либо приемник должен находиться в локальной системе. Копирование из удаленной системы в удаленную систему не поддерживается.

Давайте попробуем синхронизировать несколько локальных файлов (в качестве примера будем использовать песочницу описанную в этой статье). Сначала очистим наш каталог foo:

rm -rf foo/*

Далее синхронизируем каталог playground с соответствующей копией в foo:

rsync -av playground foo/

Здесь добавили два параметра: -a (для архивирования — обеспечивает рекурсивный обход и сохранение атрибутов файлов) и -v (подробный вывод), чтобы отразить каталог playground в каталог foo. В процессе выполнения команды можно просматривать список копируемых файлов и каталогов. В конце программа выведет итоговое сообщение, как показано ниже, включающее общий объем скопированных данных:

sent 138,933 bytes  received 49,867 bytes  377,600.00 bytes/sec
total size is 0  speedup is 0.00

Если теперь запустить команду еще раз, результат будет другой:

 rsync -av playground foo/
sending incremental file list
 
sent 37,179 bytes  received 133 bytes  74,624.00 bytes/sec
total size is 0  speedup is 0.00

Обратите внимание на отсутствие списка файлов. Это объясняется тем, что программа rsync не обнаружила различий между ~/playground и ~/foo/playground и поэтому ничего не скопировала. Если теперь изменить файл в playground и запустить rsync еще раз, она обнаружит изменившийся файл и скопирует только его:

touch playground/dir-086/file-Z
 
rsync -av playground foo/
sending incremental file list
playground/dir-086/file-Z
 
sent 37,231 bytes  received 158 bytes  74,778.00 bytes/sec
total size is 0  speedup is 0.00

Как видите, rsync обнаружила изменения и скопировала только изменившийся файл.

Есть одна маленькая, но важная деталь, связанная с определением источника в команде rsync. Пусть у нас есть два каталога:

ls
source destination

Каталог source содержит один файл с именем file1, а каталог destination пуст. Если выполнить копирование source в destination так:

rsync -r source destination/

rsync скопирует каталог source в destination

Но если в имя каталога source добавить завершающий слеш, rsync скопирует только содержимое каталога source, но не сам каталог:

rsync -r source/ destination/

Это удобно, когда требуется скопировать только содержимое каталога, без создания еще одного уровня в дереве каталогов приемника. Этот трюк действует подобно source/*, но, в отличие от последнего, обеспечит копирование всего содержимого каталога-источника, включая скрытые файлы.

В качестве практического примера представим воображаемый внешний жесткий диск – BigDisk. Если после подключения такого диска к системе он снова будет смонтирован в каталог /media/BigDisk, мы сможем выполнить первое резервное копирование системы, cначала создав каталог /backup на внешнем устройстве, а затем вызвав rsync для копирования наиболее важных компонентов системы на внешнее устройство:

mkdir /media/BigDisk/backup
 
sudo rsync -av --delete /etc /home /usr/local/ /media/BigDisk/backup/

В этом примере мы скопировали каталоги /etc, /home и /usr/local из нашей системы на воображаемый внешний диск. Также добавили параметр --delete, чтобы удалить файлы, которые могут присутствовать на устройстве с резервной копией, но отсутствовать на устройстве-источнике (этот параметр не нужен при создании резервной копии в первый раз, но является полезным дополнением в последующих операциях копирования). Периодическое повторение процедуры подключения внешнего диска и запуск этой команды rsync является неплохим (хотя и не идеальным) способом сохранения резервной копии небольшой системы. Конечно, здесь также могло бы пригодиться создание псевдонима. Определим псевдоним и добавим его в свой файл .bashrc, чтобы обеспечить возможность быстрого резервного копирования:

<alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup'

Теперь, чтобы выполнить всю работу, достаточно просто подключить внешний диск и ввести команду backup.

Одно из самых больших достоинств rsync – возможность копирования файлов по сети, об этом нам «говорит» буква r в названии rsync, что означает remote (удаленная). Удаленную синхронизацию можно выполнить одним из двух способов. Первый можно использовать с удаленными системами, где установлена rsync и программа удаленной командной оболочки, такая как ssh. Допустим, что в локальной сети имеется другая система с огромным объемом дискового пространства, и мы хотели бы использовать эту систему для хранения резервной копии вместо внешнего диска. Если допустить, что в этой системе уже имеется каталог /backup, куда можно было бы сохранить наши файлы, мы могли бы выполнить резервное копирование так:

sudo rsync -av --delete --rsh=ssh /etc/ /home/ user@remote-host:/backup

Мы внесли два изменения в команду, чтобы обеспечить копирование по сети. Во-первых, добавили параметр --rsh=ssh, который требует от rsync использовать в качестве удаленной командной оболочки программу ssh. Благодаря этому для передачи данных из локальной системы в удаленную мы можем использовать шифрованный туннель SSH. Во-вторых, мы добавили имя удаленного узла (в данном примере remote-host) перед именем удаленной директории.

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

Описание ключей. Вообще ключей дохерища, опишу только те, которые использую

-r , --recursive    # синхронизировать сабдиректории
-n, --dry-run       # эмуляция выполнения rsync, удобно запускать с ключом -v
-v, --verbose       # режим болтун
-a, --archive       # сохранять права доступа и информация о владельцах
--delete            # удаляет файлы в принимающей директории, которых нет в источнике
-z, --compress      # сжимает данные во время отправки
-P                  # тоже, что и --progress,показывает прогресс во время передач
--compare-dest=DIR  # сравнение директории источника с удаленной директорией

Так можно посмотреть, чем отличается удаленная директория от источника. Отличия обозначаются буквами:

  • d - указывает на изменение в файле назначения
  • f - указывает на файл
  • t - указывает на изменение меток времени
  • s - указывает на изменение размера
rsync --dry-run -avzi  destination/ source/

На удаленном хосте, тоже должен быть установлен rsync, ибо при работе rsync по протоколу SSH последний запускает на удаленном компьютере копию rsync с ключом –server , т.е. в режиме сервера. Вот типичный отбой, свидетельствующий об отсутствие на удаленном хосте rsync

bash: rsync: команда не найдена
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: remote command not found (code 127) at io.c(600) [receiver=3.0.6]

синхронизации двух директорий или файлов по ssh

rsync -zaP /source/dir user@10.10.10.14:/backup/dir

Можно синхронизировать сразу два каталога или файла

rsync -zaP /source1 /source2 user@10.10.10.14:/backup/dir

Копирование с удаленного хоста на локальный

rsync -zaP user@10.10.10.14:/backup /source

ssh с нестандартным портом

rsync -zaP '-e ssh -p 21493' /source user@10.10.10.14:/backup

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

mkdir /tmp/empty

Если место на диске вообще закончилось, то можно поступить так

mkdir /dev/shm/empty

На созданный каталог /dev/shm/empty нужно назначить те же права, как и у того, который мы собираемся разорить.

chown user:user /tmp/empty
chmod 755 /tmp/empty

И отчищаем бедолагу

rsync -a --delete /tmp/empty/ /some/dir/for/clean
  • rsync.txt
  • Последнее изменение: 2021/06/11 15:32
  • admin