Утилита rcync: синхронизация директорий и backup-ы
15.12.2019
Теги: CLI • Linux • Директория • Команда • Конфигурация • Настройка • Сервер • Файл
Утилита rsync — это программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и директорий с локального компьютера на удаленный и наоборот. Примечательная особенность rsync — возможность передавать файлы с шифрованием, используя ssh в качестве транспорта.
Синтаксис команды
$ rsync опции источник приемник
Примеры использования
Перед тем, как копировать файлы, всегда стоит сделать пробный прогон (ключ -n) в режиме с показом подробностей (-v):
$ rsync -avn /path/to/src/ user@example.com:/path/to/dst
В этом режиме rsync покажет список файлов, которые он скопирует. После этого можно запускать настоящее копирование:
$ rsync -av /path/to/src/ user@example.com:/path/to/dst
В этой команде ключ -a подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты: владелец, группа, дата создания и изменения. Ключ -v даст подробный отчет о работе по мере выполнения и по окончании.
/path/to/src/файлы будут размещены в
/path/to/dst/src/файлы. А при наличии слэша в конце первого аргумента — файлы будут в /path/to/dst/файлы, что скорее всего и нужно.
По умолчанию rsync попытается использовать транспорт ssh. При использовании другого порта для ssh, его нужно указать:
$ rsync -av -e "ssh -p 2222" /path/to/src/ user@example.com:/path/to/dst
Точно также можно скопировать файлы из удаленного сервера на локальную машину:
$ rsync -av user@example.com:/remote/machine/path/ /local/machine/path
Обратите внимание, что источник всегда является первым аргументом, а приемник — вторым.
cron, необходимо настроить авторизацию с использованием ключей.
Основные опции
Опция -a или --archive — рекурсивно копирует файлы, включая разыменованные символьные ссылки, с сохранением связанных с файлами сведений об их владельцах, групповых и индивидуальных правах и времени последнего изменения. Использование этого ключа равносильно указанию ключей --group, --links, --owner, --perms, --recursive и --times.
Опция -b или --backup — переименовывает файлы, которые в противном случае должны быть удалены или перезаписаны, добавляя к их существующим именам знак тильды (~). Эта опция обычно используется вместе с --backup-dir — вместо переименования rsync перемещает эти файлы в указанный каталог.
--backup-dir=dir — используется вместе с --backup и перемещает в директорию dir те файлы, которые в противном случае должны быть удалены или перезаписаны. После перемещения старой версии файла в каталог dir новая версия из источника копируется в приемник.
dir указан с использованием относительного пути, то это путь относительно приемника.
Опция --copy-unsafe-links — для каждого файла, являющегося символьной ссылкой на файл за пределами той иерархии, которой принадлежит источник, производится копирование файла, на который указывает ссылка, а не символьной ссылки на него.
Опция --delete заставляет rsync удалять файлы в приемнике, которые отсутствуют в источнике.
Опция -n или --dry-run — запуск утилиты без записи на диск. С опцией --verbose позволяет посмотреть, что будет сделано, если запустить rsync без --dry-run. Особенно полезно запускать перед использованием --delete.
Опция -g или --group — сохранение групповых связей копируемых файлов.
Опция -l или --links — для каждого файла, являющегося символьной ссылкой, копирование символьной ссылки, а не файла, на который указывает ссылка, даже если файл, на который указывает ссылка, не присутствует в источнике.
Опция --link-dest=dir — если файл существует в источнике, но его нет в приемнике, rsync ищет в каталоге dir файл с точно таким же именем. Если точная копия файла будет найдена, rsync создает из файла в dir жесткую ссылку на него в приемнике. Если точная копия не будет найдена, rsync копирует файл в приемник.
Опция -o или --owner — сохранение данных о владельце копируемых файлов (только для пользователей с root-правами).
Опция -p или --perms — сохранение данных о правах доступа копируемых файлов.
Опция -r или --recursive — рекурсивный спуск по каталогу-источнику и копирование всех файлов в иерархии.
Опция -t или --times — сохранение данных о времени последнего изменения копируемых файлов.
Опция -u или --update — пропускать файл, если в приемнике оказался файл новее, чем в источнике.
Опция -v или --verbose — вывод информации о том, что в данный момент делает rsync.
Опция -z или --compress — сжатие файлов в процессе копирования.
Зеркальное копирование
Утилиту rsync можно использовать для создания зеркальной копии каталога. На удаленной системе должен быть установлен ssh-сервер (к нему можно подключиться с использованием утилиты ssh). Если нужно запускать копирование по расписанию, следует настроить авторизацию с использованием ключей.
$ rsync --archive --update --delete /path/to/mirror/ user@example.com:/path/to/mirror
Опция --update заставляет rsync не перезаписывать самые последние версии файлов на удаленной системе более старыми версиями таких же файлов, взятых из локальной системы. Опция --delete заставляет rsync удалять на удаленном сервере файлы, отсутствующие на локальной системе.
Резервное копирование
После проведения исходного резервного копирования rsync может эффективно осуществлять дополнительное резервное копирование, экономя место на диске и время копирования. При дополнительном (инкрементном) копировании сохраняются только те файлы, которые претерпели изменения со времени последнего резервного копирования.
С помощью опции --link-dest=dir можно превращать каждое дополняющее резервное копирование в полноценное, путем создания жестких ссылок между дополняющими резервными копиями и неизменившимися файлами, имеющимися в исходной полноценной резервной копии.
Если dir задается как отосительный путь, то он задается относительно файла-приемника.
$ rsync --archive --link-dest=../backup /path/to/src/ user@example.com:/path/to/dst
При запуске этой команды rsync проходит сверху вниз по содержимому каталога /path/to/src, проверяя каждый найденный файл. Для каждого файла в каталоге /path/to/src утилита ищет в каталоге /path/to/dst точную копию этого файла.
- Если она находит точную копию в каталоге
/path/to/dst— переходит к следующему файлу - Если она не находит точную копию в каталоге
/path/to/dst— ищет точную копию в каталогеbackup- Если она находит точную копию файла в каталоге
backup, утилита создает жесткую ссылку из файла в каталогеbackupна файл в каталоге/path/to/dst - Если она не находит точную копию файла в каталоге
backup, утилита копирует файл из каталога/path/to/srcв каталог/path/to/dst
- Если она находит точную копию файла в каталоге
Небольшой bash-скрипт, демонстрирующий создание полноценной и дополняющей резервной копии:
#!/bin/bash rm -rf backup-two-days-ago mv backup-one-day-ago backup-two-days-ago mv backup-latest-state backup-one-day-ago rsync --archive --link-dest=../backup-one-day-ago /some/path/data/ backup-latest-state
Можно немного доработать этот скрипт, чтобы хранить не три, а тридцать резервных копий:
#!/bin/bash SOURCE='/home/evgeniy/data' BACKUP='/home/evgeniy/backup' COUNT=30 # кол-во бэкапов rm -rf ${BACKUP}/backup-${COUNT} for (( i = COUNT; i > 1; i-- )); do mv ${BACKUP}/backup-$((i - 1)) ${BACKUP}/backup-${i} done rsync --archive --link-dest=../backup-2 ${SOURCE}/ ${BACKUP}/backup-1
#!/bin/bash SOURCE='/home/evgeniy/data' BACKUP='/home/evgeniy/backup' COUNT=30 # кол-во бэкапов touch ${SOURCE}/file-$(date '+%Y-%m-%d--%H-%M') today=$(date '+%Y-%m-%d') dayago=$(date -d '1 day ago' '+%Y-%m-%m') oldest=$(date -d "${COUNT} days ago" '+%Y-%m-%m') # если предыдущего бэкапа не существует, тогда сразу создаем; # это полный бэкап, который будет создан при первом запуске if [[ ! -d ${BACKUP}/${dayago} ]]; then rsync --archive ${SOURCE}/ ${BACKUP}/${today} exit $? fi # если бэкап за сегодня уже существует, то ничего не делаем if [[ -d ${BACKUP}/${today} ]]; then echo "Backup ${BACKUP}/${today} already exists" exit 0 fi # выполняем инкрементный бэкап относительно предыдущего бэкапа rsync --archive --link-dest=${BACKUP}/${dayago} ${SOURCE}/ ${BACKUP}/${today} result=$? # удаляем самый старый бэкап, потому что теперь он не нужен if [[ $result == 0 ]]; then if [[ -d ${BACKUP}/${oldest} ]]; then rm -rf ${BACKUP}/${oldest} fi fi exit $result
Поиск: CLI • Linux • Директория • Команда • Файл • Backup • rsync • Сервер • Резервное копирование • Настройка • Конфигурация