Утилита Rsync в Linux
Rsync
программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и папок с локального компьютера на удаленный и наоборот. Примечательная особенность, возможность передавать зашифрованные файлы с помощью SSH
и SSL
. Кроме того, здесь передача файлов выполняется в один поток, в отличие от других подобных программ, создающий отдельный поток для передачи каждого файла. Это увеличивает скорость и убирает дополнительные задержки, которые становятся проблемой при передаче большого количества маленьких файлов. Примечательные особенности Rsync
:
- Возможность поддерживать синхронизацию целых деревьев каталогов
- Можно сохранять символические ссылки, жесткие ссылки, владельцев и права файла, метаданные и время создания
- Не требует особых привилегий
- Передача файлов одним потоком
- Поддержка
RSH
,SSH
в качестве транспорта - Поддержка анонимного Rsync
Синтаксис команды Rsync
:
rsync опции источник приемник
Опции Rsync
-v
выводить подробную информацию о процессе копирования;-q
минимум информации;-c
проверка контрольных сумм для файлов;-a
режим архивирования, когда сохраняются все атрибуты оригинальных файлов;-R
относительные пути;-b
создание резервной копии;-u
не перезаписывать более новые файлы;-l
копировать символьные ссылки;-L
копировать содержимое ссылок;-H
копировать жесткие ссылки;-p
сохранять права для файлов;-g
сохранять группу;-t
сохранять время модификации;-x
работать только в этой файловой системе;-e
использовать другой транспорт, например, ssh;-z
сжимать файлы перед передачей;--delete
удалять файлы которых нет в источнике;--exclude
исключить файлы по шаблону;--recursive
перебирать директории рекурсивно;--no-recursive
отключить рекурсию;--progress
выводить прогресс передачи файла;--stat
показать статистику передачи;--version
версия утилиты.
Служба rsync
Для большего контроля над процессом синхронизации Rsync
позволяет вместо протокола SSH
использовать собственную службу rsync-daemon (rsyncd)
.
Настройка службы Rsync
выполняется в файле /etc/rsyncd.conf
, который нужно создать:
sudo nano /etc/rsyncd.conf
Файл может выглядеть примерно так:
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
[share]
path = /tmp/share/
hosts allow = 192.168.56.1
hosts deny = *
list = true
uid = root
gid = root
read only = false
Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip
адреса 192.168.56.1
и запрещаем все остальные подключения. Параметры uid
и gid
указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root
, а создать нового пользователя и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.
Настройка Rsync
завершена, остается сохранить файл, запустить сервер rsync:
systemctl start rsync
Добавить Rsync
в автозагрузку:
systemctl enable rsync
Копирование и синхронизация файлов на локальном компьютере
Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование Rsync
для синхронизации файла на локальном компьютере:
rsync -zvh file /tmp/backups/
Указав опцию --progress
вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:
rsync -zvh --progress file /tmp/backups/
Синхронизация папок на локальной машине
Синхронизация папок Rsync
выполняется так же просто, как и файлов:
rsync -zvh /home/user/documents /tmp/backups/
Если вы хотите, чтобы все атрибуты файлов, такие, как дата изменения и создания сохранялись, необходимо использовать опцию -a
:
rsync -azvh /home/user/documents /tmp/backups/
Синхронизация с удаленным сервером
Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents
, на удаленный сервер:
rsync -avz /home/sergiy/tmp/ root@192.168.56.102:/home/
По умолчанию Rsync
попытается использовать транспорт ssh
. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:
rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share
Точно также можно синхронизировать файлы с Rsync
из удаленного сервера:
rsync -avz root@192.168.56.102:/home/ /home/sergiy/tmp/
Адрес удаленного сервера записывается в таком формате:
имя_пользователя@адрес_машины/папка/на/удаленной_машине
Синхронизация файлов по SSH
Чтобы задать протокол подключения используется опция -e
. При использовании SSH
все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить. Для использования SSH
вам нужно знать пароль пользователя в системе.
Синхронизация файлов Rsync
с удаленного сервера по SSH
будет выглядеть вот так:
rsync -avzhe ssh root@192.168.56.102:/root/install.log /tmp/
Если вы используете другой порт для ssh, то здесь его можно указать:
rsync -avzhe "ssh -p 22" root@192.168.56.102:/root/install.log /tmp/
А теперь передадим данные на тот же сервер:
rsync -avzhe ssh backup.tar root@192.168.0.101:/backups/
Просмотр прогресса при синхронизации
Для просмотра прогресса копирования файла с одной машины на другую используется опция progress
:
rsync -avzhe ssh --progress /home/user/documents root@192.168.56.102:/root/documents
Синхронизация не всех файлов в rsync
Опции include
и exclude
позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями. Например, скопируем все файлы, начинающиеся на букву R
:
rsync -avze ssh --include 'R*' --exclude '*' root@192.168.56.102:/root/documents/ /root/documents
Удаление при синхронизации
Во время синхронизации можно удалять файлы, которых нет на машине откуда идет Rsync
синхронизация, для этого используется опция --delete
:
rsync -avz --delete root@192.168.56.102:/documents/ /tmp/documents/
Максимальный размер файлов
Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция --max-size
. Например, будем синхронизировать только файлы меньше 200 килобайт
:
rsync -avzhe ssh --max-size='200k' /user/documents/ root@192.168.56.102:/root/documents
Удаление исходных файлов
Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:
rsync --remove-source-files -zvh backup.tar /tmp/backups/
Таким образом, файл backup.tar
будет удален после завершения копирования в папку /tmp/backups
.
Режим симуляции rsync
Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений:
rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/
Ограничить скорость передачи
Вы можете ограничить использование пропускной способности сети с помощью опции --bwlimit
:
rsync --bwlimit=100 -avzhe ssh /user/home/documents/ root@192.168.56.102:/root/documents/
Как я уже писал выше, Rsync
синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию -W
:
rsync -zvhW backup.tar /tmp/backups/backup.tar
backup.tar
Автоматическая синхронизация папок rsync
Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH
необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля.
Создаем ключи:
ssh-keygen -t rsa
Загружаем публичный ключ на сервер к с которым собираемся синхронизироваться:
ssh-copy-id -i /home/sk/.ssh/id_rsa.pub sk@192.168.1.250
Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день:
crontab -e
00 05 * * * rsync -azvre ssh /home/user/Downloads/ 192.168.56.102:/share
Синхронизация каталогов будет выполняться каждый день в пять утра.