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 будет строить список файлов прежде чем что-то передавать, что может очень сильно замедлить работу. Так же он начнет передачу сразу.