rsync - andyceo/documentation GitHub Wiki
-
--stats
: данная опция после завершения синхронизации выводит суммарную статистику. -
--progress
: показать прогресс во время передачи данных с одной машины на другую, отображает файлы и время, оставшееся до завершения передачи каждого файла (общий прогресс не показывает) -
--info=progress2
: показать общий прогресс передачи файлов (работает с версии 3.1.0).rsync
должен быть запущен на той же машине, где и лежит источник файлов, для расчета приемлемого прогресса -
--max-size='200k'
: будет передавать только те файлы, которые равны или меньше, чем 200k -
--bwlimit=100
: предел пропускной способности при передаче данных от одной машины к другой машине, эта опция помогает нам ограничить пропускную способность IO -
--dry-run
: не будет делать каких изменений, только выполнит прогон команды и покажет вывод команды -
--remove-source-files
: автоматически удалит все переданные файлы с сервера-источника -
--delete
: удаляет файлы, которые не существуют в каталоге-источнике, но существуют в каталоге-приемнике. Есть разновидности:--delete-after
(самый безопасный для данных, удаляет их после того, как синхронизация полностью прошла),--delete-before
и др. -
--include 'R*'
,--exclude '*'
: синхронизирует только те файлы и директории, которые начинается сR
, и исключает все другие файлы и директории -
--inplace
- если указано, тоrsync
не создает временный файл при копировании. Поведение по умолчанию -rsync
создает временный файл перед тем, как обновить старый файл на приемнике. Это дает некоторую степень безопасности: когда передача будет прервана, существующий файл на приемнике останется нетронутым.--inplace
переопределяет это поведение и говоритrsync
обновить существующий файл напрямую. При этом вы имеете риск получить битый файл на машине-приемнике, в случае, если передача будет прервана.
Полный список параметров с описанием на русском языке можно посмотреть тут: rsync (1) - Opennet
Или как правильно задавать source & destination в rsync.
Destination всегда трактуется как папка, независимо от того, указали вы оконечный слэш или нет: /dest
и /dest/
- указывает на одну и ту же папку и имеет один и тот же эффект.
Однако /source
и /source/
трактуются по-разному. Если оконечный слэш указан: /source/
, то содержимое внутри /source/
будет перемещено в /dest
, а сама папка - нет. Но если оконечный слэш не указан: /source
, то сама папка будет перемещена в /dest
, т.е. получится /dest/source
.
Таблица ниже иллюстрирует это:
source | dest | description | command |
---|---|---|---|
/path/to/source/ | /path/to/dest | Содержимое внутри source положить (синхронизировать) внутрь папки dest
|
rsync /path/to/source/ /path/to/dest |
/path/to/source | /path/to/dest | Папку source и ее содержимое положить (синхронизировать) внутрь папки dest
|
rsync /path/to/source /path/to/dest |
Обычный паттерн для локального бэкапа папки /source
в папку /dest/source
таков:
rsync -ahvz --stats --delete-after /source /dest
Или, для простейшего случая переноса папки source
в /dest/source
, когда /dest
полностью пустой:
rsync -ah --stats /source /dest
А это случай посложнее, когда надо сохранить жесткие ссылки и идентификаторы файлов, приемник пустой (идеально для переноса папки с бекапами от rsnapshot
в новое место):
rsync -ah --stats -H --numeric-ids /source /dest
И наконец, случай, когда папка с бекапами rsnapshot
уже перенесена полностью, но за время переноса источник изменился, и надо синхронизировать папки полностью, один-в-один:
rsync -ah --stats -H --numeric-ids --delete-after /source /dest
Следующая команда пригодна для выполнения по расписанию. Она синхронизирует директории и пишет подробный лог:
rsync -ahvz --stats --delete-after /source /dest >> /var/log/rsync-cron.log 2>&1
Кладем содержимое локальной папки source
в удаленную папку /dest
(операция push
). Предусловия: rsync
и ssh
установлены на обоих машинах, и ssh
работает по стандартному порту 22
.
Запускаем на локальной машине:
rsync -ahvz /source username@remote_host:/dest
Простейший скрипт:
RSYNC=/usr/bin/rsync
SSH=/usr/bin/ssh
KEY=/home/thisuser/cron/thishost-rsync-key
RUSER=remoteuser
RHOST=remotehost
RPATH=/remote/dir
LPATH=/this/dir/
$RSYNC -az -e "$SSH -i $KEY" $RUSER@$RHOST:$RPATH $LPATH
Вытягиваем содержимое удаленной папки source
в локальную папку dest
(операция pull
).
Запускаем на локальной машине:
rsync -ahvz username@remote_host:/source /dest
Команда ниже позволяет сделать операцию pull
, если ssh
на удаленной машине работает на нестандартном порту 2022
, показывая прогресс операции и время, оставшееся до окончания скачивания каждого файла:
rsync -ahvz --progress -e "ssh -p 2022" username@remote_host:/source /dest
Следующий пример позволит относительно быстро скопировать большой объем данных между файловыми системами, сохраняя жесткие ссылки (hardlinks, опция -H
):
sudo rsync -ahHz --delete --delete-during --numeric-ids rsnapshot /backups
Дело в том, что если использовать флаг --delete-after
(позволяющий безопасно, после передачи всех файлов, удалить в приемнике отсутствующие в источнике файлы), то rsync
будет строить список файлов прежде чем что-то передавать, что может очень сильно замедлить работу. Так же он начнет передачу сразу.