Как использовать rsync для копирования файлов и папок в Linux

Скопируйте каталоги и файлы с помощью программы передачи файлов rsync для Linux . Команда включает в себя дополнительные параметры помимо обычных функций копирования.

Задача

Синхронизация файлов между серверами — часто востребованная задача, которая наиболее просто решается с помощью Rsync. Однако, в некоторых случаях использование rsync затруднено. Например, это может быть ситуация, когда требуется как можно быстрее осуществить синхронизацию, а обработка по расписанию не подходит. В этом случае на помощь приходят утилиты, которые используют inotify — специализированный интерфейс Linux, позволяющий реагировать на изменения в файловой системе.

В более сложных конфигурациях в группе может быть несколько серверов, тогда настройка синхронизации «каждый с каждым» весьма утомительна — при добавлении к группе из N серверов еще одного, вам необходимо произвести 2xN настроек — на каждом из существующих серверов с новым и на новом сервере с существующими. Конечно, эта задача может быть автоматизирована с помощью средств управления инфраструктурой как кодом (Ansible, Chef, Puppet), но само решение, где необходимо настраивать взаимосвязь каждый с каждым выглядит весьма неудобно.

Для решения проблемы синхронизации файлов в группе серверов приходят на помощь утилиты, использующие пиринговые протоколы синхронизации. Один из популярных открытых инструментов называется SyncThing.

Далее мы рассмотрим, как с помощью SyncThing настроить синхронизацию файлов между несколькими серверами. Мы будем использовать операционную систему Linux. Руководство подойдет для любого дистрибутива, который использует systemd — Debian 9, Ubuntu , Ubuntu , CentOS 7 и т.п.

Синтаксис команды

Для правильного использования команды rsync необходимо соблюдать правильный синтаксис :

rsync [ОПЦИЯ] … [SRC] … [DEST] rsync [ОПЦИЯ] … [SRC] … [ПОЛЬЗОВАТЕЛЬ @] ВЕДУЩАЯ: DEST rsync [ОПЦИЯ] … [SRC] … [ USER @] HOST :: DEST rsync [ОПЦИЯ] … [SRC] … rsync: // [USER @] HOST [: ПОРТ] / DEST rsync [ОПЦИЯ] … [USER @] Хост: SRC [ DEST] rsync [ОПЦИЯ] … [USER @] HOST :: SRC [DEST] rsync [ОПЦИЯ] … rsync: // [USER @] HOST [: ПОРТ] / SRC [DEST]

Некоторые часто используемые переключатели включают в себя:

  • -v , —verbose : увеличить детализацию (предоставляет больше подробностей о том, что делает команда).
    • —info = FLAGS : Предоставляет подробные информационные сообщения.
    • —debug = FLAGS : Предоставляет подробные сообщения отладки.
    • —msgs2stderr : специальная обработка вывода для отладки.
  • -q , —quiet : подавляет сообщения, не связанные с ошибками.
    • —no-motd : Подавляет сообщение дня в режиме демона (MOTD).
  • -c , —checksum : Пропускает файлы на основе контрольной суммы , а не времени и размера мода.
  •  -r , —recursive : искать в подкаталогах дополнительные файлы.
  • -b , —backup : делать резервные копии.
    • —backup-dir = DIR : Сделать резервные копии в соответствующей иерархии каталогов.
    • —suffix = SUFFIX : Добавляет суффикс текст до конца скопированных файлов.
  • -d , —dirs : переносить только каталоги, не просматривая их.

Как сделать синхронизацию папки c Linux на Windows?

Для того чтобы отправить файлы в windows c помощью rsync самый лучший способ — это смонтировать файловую систему локального windows-компьютера на сервер через ssh-туннель по smb. Тогда не потребуется устанавливать rsync на сам Windows и это решает проблему с доступом между сервером и домашним компьютером.

Для этого нужно подключаясь к серверу с локального компьютера сделать проброс R-типа. Пробрасывать нужно localhost:445. Затем, нужно чтобы в системе на сервере был установлен пакет cifs-utils. Расшариваете на локальном компьютере нужную папку, затем создаете точку монтирования на сервере, и монтируете туда уже c localhost. Кстати, на нашем сайте есть генератор-скриптов для бэкапов сайта, и в нем реализована генерация такого скрипта.

Опции Rsync

Теперь давайте кратко рассмотрим параметры rsync. Здесь перечислены не все опции. Для более подробной информации смотрите man 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 — Версия утилиты.
Читайте также:  Bash скрипты в операционной системе Linux

Колонка FD

Дескриптор файла в столбце FD может быть одним из многих вариантов; на странице руководства они перечислены все:

man lsof

Запись в столбце FD может состоять из трёх частей: дескриптор файла, символ режима и символ блокировки.

Некоторые популярные файловые дескрипторы:

  • cwd: текущий рабочий каталог.
  • err: информация об ошибке FD (см. столбец NAME).
  • ltx: текст разделяемой библиотеки (код и данные).
  • m86: файл сопоставления DOS Merge.
  • mem: файл с отображением в памяти.
  • mmap: устройство с отображением в памяти.
  • pd: родительский каталог.
  • rtd: корневой каталог.
  • txt: текст программы (код и данные)

Символ режима может быть одним из следующих:

  • r: доступ для чтения.
  • w: доступ для записи.
  • u: Доступ для чтения и записи.
  • : Пробел, если режим неизвестен и нет символа блокировки.
  • : режим неизвестен и есть символ блокировки.

Символ блокировки может быть одним из:

  • r: Блокировка чтения на часть файла.
  • R: Блокировка чтения на весь файл.
  • w: Блокировка записи для на часть файла.
  • W: Блокировка записи для на весь файл.
  • u: Блокировка чтения и записи любой длины.
  • U: неизвестный тип блокировки.
  • : символ пробела. Нет блокировки.

Примеры синхронизации Rsync

Дальше давайте рассмотрим использование rsync, примеры синхронизации.

Копирование и синхронизация файлов на локальном компьютере

Rsync позволяет синхронизировать файлы и папки в пределах одной машины. Давайте сначала рассмотрим использование rsync для синхронизации файла на локальном компьютере:

$ rsync -zvh file /tmp/backups/

Синхронизация папок на локальной машине

Синхронизация папок rsync выполняется так же просто, как и файлов:

$ rsync -avzh /home/user/documents /tmp/backups/

Синхронизация с удаленным сервером

Ненамного сложнее синхронизировать файлы с удаленным сервером. Скопируем локальную папку documents, на удаленный сервер:

$ rsync -avz documents/ [email protected]:/home/

Также само можно синхронизировать файлы с rsync из удаленного сервера:

$ rsync -avz [email protected]:/home/ documents/

Адрес удаленного сервера записывается в таком формате:

имя_пользователя@адрес_машины:порт/папка/на/удаленной_машине

Порт указывать не обязательно, тогда rsync синхронизация папок будет выполняться на стандартном порту.

Синхронизация файлов по SSH

Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить.

Для использования SSH вам нужно знать пароль пользователя в системе.

Читайте также:  Что лучше, Linux или Windows?

Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так:

$ rsync -avzhe ssh [email protected]:/root/ /tmp/

А теперь передадим данные на тот же сервер:

$ rsync -avzhe ssh [email protected]:/backups/

Просмотр прогресса при синхронизации

Для просмотра прогресса копирования файла с одной машины на другую используется опция progress:

$ rsync -avzhe ssh —progress /home/user/documents [email protected]:/root/documents

Синхронизация не всех файлов в rsync

Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями.

Например, скопируем все файлы, начинающиеся на букву R:

$ rsync -avze ssh —include ‘R*’ —exclude ‘*’ [email protected]:/root/documents/ /root/documents

Удаление при синхронизации

Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция —delete.

Например:

$ rsync -avz —delete [email protected]:/documents/ /tmp/documents/

Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален.

Максимальный размер файлов

Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция —max-size. Например, будем синхронизировать только файлы меньше 200 килобайт:

$ rsync -avzhe ssh —max-size=’200k’ /user/documents/ [email protected]:/root/documents

Удаление исходных файлов

Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером:

$ rsync —remove-source-files -zvh /tmp/backups/

Таким образом, файл будет удален после завершения копирования в папку /tmp/backups.

Режим симуляции rsync

Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений:

$ rsync —dry-run —remove-source-files -zvh /tmp/backups/

Ограничить скорость передачи

Вы можете ограничить использование пропускной способности сети с помощью опции —bwlimit:

$ rsync —bwlimit=100 -avzhe ssh /user/home/documents/ [email protected]:/root/documents/

Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию -W:

$ rsync -zvhW /tmp/backups/

Автоматическая синхронизация папок rsync

Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля.

Создаем ключ:

$ ssh-keygen -t rsa

Загружаем ключ на сервер к с которым собираемся синхронизироваться:

$ ssh-copy-id -i /home/sk/.ssh/id_ [email protected]

Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день:

$ crontab -e$ 00 05 * * * rsync -azvr /home/user/Downloads/ ::share

rsync синхронизация каталогов будет выполняться каждый день в пять утра.