Rsync linux, или команда удалённой синхронизации

Синхронизация по сети (SSH)

Для корректной передачи данных по сети с помощью SSH, нужно настроить возможность беспарольного подключения, затем — сам Lsyncd. Рассмотрим оба процесса по очереди.

SSH без пароля (по сертификату)

На компьютере, с которого будем передавать файлы (lsyncd) генерируем ключи:

ssh-keygen -t rsa

… на все запросы просто нажимаем Enter.

Переносим id_rsa.pub на целевой компьютер (куда будем передавать данные с помощью lsyncd):

scp /root/.ssh/id_rsa.pub dmosk@192.168.1.15:/home/dmosk/.ssh/authorized_keys

* если мы получим ошибку scp: /home//.ssh/authorized_keys: No such file or directory, необходимо на удаленном компьютере создать каталог .ssh в профиле пользователя, которому мы пытаемся передать ключ

Например, командами, mkdir /home/dmosk/.ssh и chown dmosk:dmosk /home/dmosk/.ssh.
* обратите внимание, что мы передаем созданный ключ в каталог пользователя dmosk. Это значит, что мы будем подключаться к целевому компьютеру от этого пользователя

Важно, чтобы у последнего были подходящие права для редактирования файлов в целевой папке, в которую мы будем синхронизировать данные. Пробуем подключиться к удаленному компьютеру:

Пробуем подключиться к удаленному компьютеру:

ssh dmosk@192.168.1.15

Мы должны подключиться по SSH без ввода пароля. В противном случае, на целевом компьютере (к которому у нас не получилось подключиться) открываем конфигурационный файл для ssh:

vi /etc/ssh/sshd_config

И приводим опцию AuthorizedKeysFile к следующему значению:

AuthorizedKeysFile     .ssh/authorized_keys

Перезапускаем sshd:

systemctl restart sshd

Снова пробуем подключиться по SSH.

Настройка Lsyncd для синхронизации по сети

Открываем конфигурационный файл:

vi /etc/lsyncd.conf

Добавляем блок настроек sync:

sync {
    default.rsyncssh,
    source = «/tmp/source»,
    host = «dmosk@192.168.1.15»,
    targetdir = «/tmp/target»,
    rsync = {
        _extra = { «-a» }
    }
}

* где:

  • default.rsyncssh — в качестве протокола будем использовать rsync через ssh.
  • source — указываем источник данных.
  • host — удаленный компьютер, на который будет идти передача данных. До знака @ указывается пользователь, под которым будет идти подключение.
  • targetdir — каталог на удаленном хосте, в который будет выполняться синхронизация.
  • rsync, _extra — дополнительные ключи запуска rsync. В нашем примере запускаем в режиме архивирования.

На целевом компьютере создаем каталог, куда будем синхронизировать данные:

mkdir /tmp/target

И не забываем назначить ему владельца, от пользователя которого мы планируем подключиться по ssh:

chown dmosk:dmosk /tmp/target

Также на целевом компьютере необходимо установить rsync.

а) на CentOS:

yum install rsync

б) на Ubuntu:

apt-get install rsync

После на компьютере источнике перезапускаем lsync:

systemctl restart lsyncd

Ждем 5-10 секунд и проверяем на целевом компьютере наличие файла:

ls /tmp/target/

Мы должны увидеть файл:

testfile

Передача по сети работает.

Настройка rsync

Теперь приступаем к настройке. Логика наших бэкапов будет следующая. При первом запуске мы делаем полный бэкап интересующей нас информации в папку current. Потом раз в сутки мы сверяем имеющийся архив с источником и делаем его вновь актуальным, перезаписывая все изменившиеся файлы, но при этом не удаляем их, а складываем в папку increment, где каждый день создается папка с именем в виде даты, в которую складываются все измененные файлы за текущий день. Таким образом, у нас всегда будет полный архив, актуальный на момент последней синхронизации, плюс набор папок за каждый день с изменившимися в этот день файлами. Сколько дней хранить, можно выбрать по необходимости.

Получается у нас такая картинка:

При этом подключение и работа rsync будет проходить по своему отдельному порту tcp 873. Не забудьте настроить iptables и открыть этот порт. Приступаем к реализации. В первую очередь настраиваем rsync на серверах источниках информации, с которых мы будем забирать данные для backup.

Создаем файл конфигурации rsync:

# mcedit /etc/rsyncd.conf
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log
transfer logging = true
munge symlinks = yes

# папка источник для бэкапа

path = /data
uid = root
read only = yes
list = yes
comment = Data backup Dir
auth users = backup
secrets file = /etc/rsyncd.scrt

Создаем файл с учетными данными для подключения:

# mcedit /etc/rsyncd.scrt
backup:12345

где backup — имя пользователя, 12345 — пароль.
Делаем права на чтение только root, иначе rsync не запустится:

# chmod 0600 /etc/rsyncd.scrt

После настройки перезапускаем rsync. На Centos:

# systemctl restart rsyncd

На Debian/Ubuntu:

# systemctl restart rsync

Теперь идем на сервер приемник, в котором будут храниться архивные копии с серверов источников. Там создаем скрипт инкрементного бэкапа c использованием rsync:

# mcedit /root/bin/backup-server1.sh
#!/bin/bash
date
# Папка, куда будем складывать архивы
syst_dir=/backup/
# Имя сервера, который архивируем
srv_name=server1
# Адрес сервера, который архивируем
srv_ip=10.10.1.55
# Пользователь rsync на сервере, который архивируем
srv_user=backup
# Ресурс на сервере для бэкапа
srv_dir=data
echo "Start backup ${srv_name}"
# Создаем папку для инкрементных бэкапов
mkdir -p ${syst_dir}${srv_name}/increment/
# Запускаем непосредственно бэкап с параметрами
/usr/bin/rsync -avz --progress --delete --password-file=/etc/rsyncd.scrt ${srv_user}@${srv_ip}::${srv_dir} ${syst_dir}${srv_name}/current/ --backup --backup-dir=${syst_dir}${srv_name}/increment/`date +%Y-%m-%d`/
# Чистим папки с инкрементными архивами старше 30-ти дней
/usr/bin/find ${syst_dir}${srv_name}/increment/ -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
date
echo "Finish backup ${srv_name}"

Делаем скрипт исполняемым:

# chmod 0744 /root/bin/backup-server1.sh

Создаем файл с паролем для авторизации на сервере источнике:

# mcedit /etc/rsyncd.scrt
12345

Делаем права на чтение только root, иначе rsync выдаст ошибку:ERROR: password file must not be other-accessible
Исправляем это:

# chmod 0600 /etc/rsyncd.scrt

На этом все, теперь можно запускать скрипт и ожидать его выполнения. Если получите ошибку на клиенте:

rsync: opendir "/." (in data) failed: Permission denied (13)

и вот эту на сервере:

SELinux is preventing rsync from getattr access on the file

Проверьте настройки SELinux. Это он блокирует доступ к файлам. Нужно либо отключить selinux, либо настроить. В данном случае настройка простая:

# setsebool -P rsync_full_access on

Осталось добавить скрипт в cron:

# mcedit /etc/crontab
30 23 * * * root /root/bin/backup-server1.sh

Я обычно создаю несколько скриптов для каждого сервера отдельно. Потом объединяю их запуск в одном общем скрипте и уже его добавляю в cron. А потом по мере необходимости редактирую уже его, добавляю или удаляю сервера.

Установка и тестовый запуск

Выполним установку lsyncd на CentOS, а также настроим сервис для синхронизации двух каталогов на локальном компьютере.

Установка

Выполняем команды:

yum install epel-release

yum install lsyncd

Разрешаем автозапуск сервиса:

systemctl enable lsyncd

Настройка и запуск

Открываем конфигурационный файл:

vi /etc/lsyncd.conf

Приводим его к виду:

settings {
    logfile = «/var/log/lsyncd.log»,
    statusFile = «/var/log/lsyncd.stat»,
    statusInterval = 5,
    insist = true,
    nodaemon = false,
}
sync {
    default.rsync,
    source=»/tmp/source»,
    target=»/tmp/target»,
}

* где:

  • settings — общие настройки.

    • logfile — путь до файла логов.
    • statusFile — файл, в который заносятся изменения, найденные с помощью inotify.
    • statusInterval — интервал в секундах для обновления statusFile.
    • insist — позволяет продолжить работу сервиса, даже если одна или несколько целевых директорий недоступны.
    • nodaemon — отключаться или нет от вызывающей стороны. Проще говоря, если разрешить, то будет больше информации по его работе. Для боевого режима можно отключить.
  • sync — настройка для синхронизации конкретного ресурса. Для каждого создается своя секция sync.
    • default.rsync — должен использоваться протокол для синхронизации rsync.
    • source — источник, откуда синхронизируем данные.
    • target — куда синхронизируем.

* в данном примере мы синхронизируем два каталога на локальном компьютере. Таким же образом, можно синхронизировать данные и в подмонтированных каталогах, например, по nfs или cifs (smb).

Создадим два тестовых каталога:

mkdir /tmp/source

mkdir /tmp/target

Перезапускаем сервис lsyncd:

systemctl restart lsyncd

Пробуем создать тестовый файл к каталоге-источнике:

touch /tmp/source/testfile

Ждем 5-10 секунд. Проверяем содержимое каталога-цели:

ls /tmp/target/

Мы должны увидеть файл:

testfile

Сервис готов к работе.

Как исключить некоторые файлы или включить определенный тип файлов?

В rsync можно создавать достаточно гибкие исключения, например, делая резервную копию домашней директории на linux мы не ходим копировать разный кеш или содержимое корзины. Вот пример, в котором я исключаю две директории:

rsync -av --exclude={'user/.local/share/Trash','user/.cache'} /home/user :/home/user/bkp/

Конечно можно указать одну директорию:

rsync -av --exclude=.git /var/www/site :/home/user/bkp/

Еще мы можем исключить файлы с определенным расширением:

rsync -av --exclude="*.tmp" /var/www/site :/home/user/bkp/

Саму опцию мы можем использовать несколько раз:

rsync -av --exclude="*.tmp" --exclude="tmp/*" --exclude="*~" /var/www/site :/home/user/bkp/

Для копирования определенного типа файлов (да и не только) мы можем использовать опцию —include. Используется она точно так же, как и exclude. Вот пример, в котором я загружаю на сервер только все файлы с расширением .sql:

rsync -av --exclude="*.sql" ./projectname :/home/user/sqlbkp/

Исключения с помощью .rsync-filter

Для более гибкой настройки копирования (в случае регулярного копирования это будет очень полезно) все исключения/включения можно оформить в файле .rsync-filter (это появилось в более поздних версиях rsync).

Попробую объяснить подробно на примере, как и что мы можем исключать (спасибо этому блогу за хорошее описание).Допустим, у меня есть такой каталог (somedir), в котором я хочу исключить (красная стрелка) или оставить (зеленая стрелка) некоторые файлы/каталоги:

Ниже приведен один из примеров настройки исключений в файле .rsync-filter с комментариями:

cat .rsync-filter 
# исключаем только каталог .cache (не будут исключены каталоги work/lo*/.cache и dir2/.cache)                                                                        
- /.cache
# исключаем все каталоги Trash во всех папках
- /**/Trash/
# исключаем каталог Cache в каталогах .mysoft/soft*/
- /.mysoft/*/Cache
# исключаем файл pass.md
- pass.md
# исключаем все файлы с расширением .tmp
- *.tmp
# исключаем весь каталог example
- /example/
# Оставляем каталог Trash в каждом каталоге work/lo*/..
+ /work/**/Trash/

Для того, чтобы rsync заметил файл .rsync-filter, достаточно указать опцию -F:

rsync -avF ./somedir 10.10.20.15:/home/leo/

В итоге на сервер будут скопированы только эти файлы:

Кстати, если мы не хотим чтобы сам .rsync-filter не копировался, то -F нужно будет указать дважды

Полезные опции

Рассмотрим примеры использования некоторых настроек, которые могут показаться полезными.

Исключения

Мы можем настроить исключение файлов по маске, которые не нужно передавать в другую директорию. Это делается с помощью опций exclude или excludeFrom в разделе sync, например:

sync {
    …
    exclude = { ‘*.bak’ , ‘*.tmp’ },
}
sync {
    …
    excludeFrom=»/etc/lsyncd.exclude»,
}

* в первом блоке мы исключим все файлы, которые заканчиваются на .bak или .tmp. Для второго мы будем использовать файл /etc/lsyncd.exclude, в котором перечислим исключения.

Для второго блока создаем файл с исключениями:

vi /etc/lsyncd.exclude

*.tmp
*.bak
testfile.txt
test/

* в данном примере мы игнорируем файлы, заканчиваются на .bak или .tmp,а также файл testfile.txt и содержимое каталога test.

Комментарии

Стоит обратить внимание, что комментарии в конфигурационном файле ставятся с помощью двух дефисов, например: 

sync {
    — протокол синхронизации
    default.rsyncssh,
    — источник данных
    source = «/tmp/source»,
    — сервер назначения
    host = «dmosk@192.168.1.15»,
    — каталог назначения
    targetdir = «/tmp/target»,
}

Порт SSH

Отдельный порт для подключения по ssh мы можем указать в блоке sync, разделе ssh:

sync {
    default.rsyncssh,
    source = «/tmp/source»,
    …
    ssh = {
        port = 2222
    }
}

* в этом примере мы указываем использовать порт 2222 для подключения по SSH.

Ограничения

При необходимости, мы можем установить некоторые значения для ограничения или обхода ограничений. Настройки задаются в блоке settings:

settings {
    …
    statusInterval = 5
    maxDelays = 900,
    maxProcesses = 6,
}

* где:

  • statusInterval — как говорилось выше, задает интервал обновления статус-файла в секундах. Чем ниже значение, тем быстрее файлы попадают в очередь для синхронизации.
  • maxDelays — задает количество файлов в очереди, при достижении которого задачи синхронизации будут запускаться ниже таймера задержки.
  • maxProcesses — максимальное количество процессов, которое сможет запустить lsync.

Установка прав

Мы можем задать права после синхронизации. Это настраивается в блоке sync, разделе rsync:

sync {
    …
    rsync = {
        …
        owner=true,
        chown=»nginx:nginx»
        chmod=»775″
        perms=true
    }
}

* где:

  • owner — говорит, сохранять ли владельца файла.
  • chown — задает конкретного владельца и группу.
  • chmod — задает права на синхронизированные файлы.
  • perms — говорит, сохранять ли права.

Машина времени

Те пользователи macOS и OS X, что делают бэкап, наверняка оценили работу Time Machine. Эта программа позволяет буквально в два клика вернуться к прошлой версии любого файла. Не смотря на все красивости, Time Machine не делает ничего такого чего мы не можем сделать с помощью .

Скрипт следует положить в корень того диска или каталога, куда следует делать бэкапы.

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

После нескольких запусков получается такая структура каталога:

При этом указывает на самый последний бэкап.

В каждом из каталогов содержится слепок того, что было в исходном каталоге в момент копирования. Можно подумать что и место на диске занято пропорционально количеству копий, однако это не так.

Всё множество копий занимает лишь немного больше места чем исходный каталог. Место уходит на изменившиеся файлы.

Если ничего не менялось, то место всё равно расходуется на создание каталогов, которые нельзя хранить как жесткие ссылки.

Такая существенная экономия возможна благодаря упомянутым жестким ссылкам, которые делает для файлов, не изменившихся с последнего копирования.

У одинаковых, не менявшихся, файлов будет один и тот же inode.

Конечно, по возможной экономии места на диске такому способу резервного копирования далеко до специальных программам, таких как Borg или Restic.

Создание пиринговой группы

Добавим все серверы в пиринговую группу, чтобы между ними могла производиться синхронизация данных. Данную операцию необходимо выполнить на всех узлах. После формирования группы серверы могут начать сами «проситься» на добавление к других хостам, что уменьшает количество «ручных» операций.

Определите ID каждого сервера. Для добавления серверов необходимо знать их ID, чтобы не добавить случайно посторонние серверы.

Добавьте все серверы в группу удаленных устройств, нажав на кнопку «Добавить удаленное устройство«.

Далее, для каждого удаленного устройства выполните настройку «автопринятия» каталогов. Это позволит узлам автоматически уведомлять другие узлы о доступных каталогах:

Выполните эти действия на каждом хосте, для каждого удаленного хоста в группе.

Некоторые полезные ключи

Сначала поговорим об опциях которые вам будет здорово знать без шпор и шпаргалок.

  1. Ключ включает сразу несколько опций. С этим ключем и покажет процесс копирования отдельных файлов, и продолжит копирование если оно было прервано. Особо эта опция пригождается при копировании больших файлов. Ключ нужно указывать каждый раз, иначе удалит файлы которые не успели полностью закачаться.

  2. Если вы копируете файлы с какого-то очень занятого, или слабого, сервера, то можно исключить трату ресурсов процессора на вычисление изменившихся частей файлов, скопировав их целиком. Для этого нужен ключ .

  3. Если вам хочется знать сколько всего, по мнению rsync, осталось работать, вам нужен ключ . Если вы копируете целую файловую систему, то этот ключ, будучи использован сам по себе, вас разочарует: информация об итоговом объёме будет постоянно обновляться. Это происходит потому что не пытается считать всю файловую систему до того как начнёт копирование, а делает обе задачи сразу.

    Но не отчаивайтесь! Если вы хотите знать точно сколько осталось работать с самого начала, то можно отключить последовательное сканирование ключём или, короче, .

    Ключи выше есть начиная с версии 3.1.0, то есть уже работают в Debian stable.

  4. Если требуется не просто скопировать файлы, а полностью синхронизировать содержимое каталогов, удалив лишние файлы, при этом вам почему-то не с руки синхронизировать файлы с помощью Git, то пригодится ключ (или эквивалентный ему ).

    С этим ключём удалит лишние файлы из каталого-назначения.

    Ключ в команде выше был оставлен намеренно.

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

О сжатии замолвим слово

Вопреки популярному заблуждению от использования сжатия внутри rsync (ключ ) больше вреда, чем пользы. Дело в том что всюду используемый OpenSSH уже по умолчанию использует сжатие передаваемых данных. Сами понимаете, сжатие уже сжатых данных только лишь использует ресурсы процессора, не уменьшая объем передаваемых данных.

В том, что при соединении с вашим сервером уже используется сжатие, можно убедиться так:

Если эта команда не покажет, в числе прочих, такую строчку про включение сжатия как выше, то может быть вам стоит использовать сжатие. Стоит проверить что от сжатия есть толк. Особенно это касается маломощных устройств с быстрым соединением: вашему NAS может быть быстрее скопировать что-то по гигабитному линку без сжатия, чем пытаться обогнать гигабитную сеть маломощным процессором.

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

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

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

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

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

Указав опцию —progress вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:

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

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

Если вы хотите, чтобы все атрибуты файлов, такие, как дата изменения и создания сохранялись, необходимо использовать опцию -a:

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

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

По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:

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

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

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

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

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

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

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

Если вы используете другой порт для ssh, то здесь его можно указать:

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

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

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

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

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Полезные опции

У rsync есть множество опций, которые изменяют заданное по умолчанию функционирование. Мы уже рассмотрели некоторые из них выше. Если вы передаёте несжатые файлы, например, текстовые, можно снизить объем сетевого трафика при помощи опции -z, которая выполняет компрессию:

rsync -az /откуда /куда

Очень полезной опцией является -P: она объединяет флаги —progress и —partial. Первый из них показывает ход выполнения передачи, а второй позволяет возобновлять прерванные передачи:

rsync -azP /откуда /куда
Output
sending incremental file list
./
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file100
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)
file11
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101)
. . .

При повторном выполнении команды выходных данных будет меньше, потому что изменений не произошло. Это показывает возможность rsync определять наличие изменений по времени модификации.

rsync -azP /откуда /куда
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00

Если обновить время модификации некоторых файлов, rsync скопирует только их:

touch dir1/file{1..10}
rsync -azP источник место_назначения
Output
sending incremental file list
file1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)
file10
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)
file2
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)
file3
0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101)
. . .

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

Это можно изменить при помощи опции —delete. Прежде чем воспользоваться ей, проведите тестирование с опцией -n, чтобы исключить потерю данных.

rsync -a --delete /откуда /куда

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

rsync -a --exclude=шаблон_исключения /откуда /куда

Если указан шаблон исключения, можно игнорировать его для файлов, соответствующих другому шаблону при помощи опции —include=.

rsync -a --exclude=шаблон_исключения --include=шаблон_включения /откуда /куда

Наконец, опция —backup может использоваться для сохранения резервных копий важных файлов. Она используется совместно с опцией —backup-dir, которая указывает директорию для сохранения резервных копий.

rsync -a --delete --backup --backup-dir=директория_резервных_копий /откуда /куда

How to Exclude Files and Directories with Rsync

21 Июня 2020
|

Терминал

Rsync — это быстрая и универсальная утилита командной строки, которая синхронизирует файлы и папки между двумя местами удаленной оболочки.

С Rsync вы можете зеркалировать данные, создавать инкрементные резервные копии и копировать файлы между системами. При копировании данных вы можете исключить один или несколько файлов или каталогов на основе их имени или местоположения.

Прежде чем вы начнете

Вы должны иметь базовые знания о том, как работает rsync .

В приведенных ниже примерах мы будем использовать rsync с опцией,. Это говорит rsync о рекурсивной синхронизации каталогов, передаче специальных и блочных устройств и сохранении символических ссылок, времени модификации, группы, владельца и прав доступа.

При исключении файлов или каталогов вам необходимо использовать их относительные пути к исходному каталогу.

Существует два варианта указания файлов и каталогов, которые вы хотите исключить:

  • Из командной строки , используя опцию.
  • Из файла , используя опцию.

Исключить определенный файл

Чтобы исключить конкретный файл, передайте относительный путь к файлу опции.

В следующем примере файл не будет передан:

Исключение определенного каталога аналогично исключению файла, просто передайте относительный путь к каталогу для опции, как показано ниже:

Если вы хотите исключить содержимое каталога, но не сам каталог, используйте вместо :

Чтобы исключить несколько файлов или каталогов, просто укажите несколько параметров:

Если вы предпочитаете использовать один параметр, вы можете перечислить файлы и каталоги, которые вы хотите исключить, в фигурных скобках, разделенных запятой, как показано ниже:

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

Команда ниже делает то же самое, что и выше:

исключить-file.txt

С rsync вы также можете исключить файлы и каталоги на основе шаблона, соответствующего имени файла или каталога.

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

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

Одним из вариантов является использование следующей команды:

При использовании нескольких параметров включения / исключения применяется первое правило соответствия.

  • — Сначала мы включаем все файлы.
  • — Затем мы включаем все каталоги в каталоге. Без этого rsync будет копировать только файлы в каталоге верхнего уровня.
  • — Удаляет пустые каталоги.

Другой вариант — перенаправить вывод команды в rsync:

  • — удалит из пути к файлу.
  • — означает включать только файлы из стандартного ввода (файлы, переданные из команды find).

Из этого руководства вы узнали, как исключать файлы и каталоги при передаче данных с помощью Rsync. Еще много информации о Rsync можно найти на странице руководства пользователя Rsync .

Как использовать Rsync для синхронизации данных с / на удаленный компьютер

При использовании для удаленной передачи он должен быть установлен как на исходном, так и на конечном компьютере. Новые версии настроены на использование SSH в качестве удаленной оболочки по умолчанию.

В следующем примере мы переносим каталог с локального на удаленный компьютер:

Если вы не установили пароль на удаленном компьютере, вам будет предложено ввести пароль пользователя.

Если вы хотите перенести данные с удаленного на локальный компьютер, вам нужно использовать удаленное местоположение в качестве источника:

         Если SSH на удаленном хосте прослушивает порт, отличный от порта по умолчанию 22, вы можете указать порт, используя опцию:

         При передаче больших объемов данных рекомендуется выполнить команду внутри сеанса screen или использовать параметр:

Как альтернатива cp/mv

rsync может использоваться как продвинутая альтернатива команде или , особенно при копировании больших файлов.

$ rsync -P источник назначение

Опция эквивалентна , которая оставляет частично перемещённые файлы и показывает шкалу прогресса во время перемещения.

Используйте опцию / для рекурсивного обхода каталогов.

Файлы могут копироваться локально, как при помощи cp, но rsync интересна прежде всего возможностью удалённого копирования файлов, то есть между двумя разными хостами. Удалённые расположения могут быть указаны при помощи синтаксиса хост-двоеточие:

$ rsync источник хост:назначение

или

$ rsync хост:источник назначение

Передача файлов по сети по умолчанию использует протокол SSH и может быть как реальным именем хоста, так и предопределённым профилем/псевдонимом из .

Для быстрого использования разумных значений по умолчанию, можете использовать следующие псевдонимы:

function cpr() {
  rsync --archive -hh --partial --info=stats1,progress2 --modify-window=1 "$@"
} 
function mvr() {
  rsync --archive -hh --partial --info=stats1,progress2 --modify-window=1 --remove-source-files "$@"
}

Примечание: Использование термина контрольная сумма не соответствует поведению опции . Опция ответственна за использование эвристики пропуска файла перед передачей любого файла. Независимо от , контрольная сумма всегда используется для поблочного построения файла, при помощи которого rsync перемещает файл.

Предостережение о замыкающем слэше

По умолчанию Arch использует GNU cp (часть GNU ). Однако rsync следует соглашениям BSD cp, которые особо обрабатывают каталоги источника с замыкающим слэшем «/». Несмотря на то, что

$ rsync -r источник назначение

создаёт каталог «назначение/источник» с содержимым «источника», команда

$ rsync -r источник/ назначение

копирует все файлы из «источник/» напрямую в «назначение», без промежуточного каталога — так же, как при вызове

$ rsync -r источник/. назначение

Это поведение отличается от такового в GNU cp, которая одинаково обрабатывает «источник» и «источник/» (но не «источник/.»). Кроме того, некоторые оболочки автоматически добавляют замыкающий слэш при tab-дополнении имён каталогов. В виду этих обстоятельств, новые или нечастые пользователи rsync могут зачастую забывать про разное поведение rsync и случайно создавать беспорядок или даже перезаписывать важные файлы, оставляя замыкающий слэш в командной строке.

Поэтому имеет смысл использовать сценарий-обёртку, чтобы автоматически удалять замыкающий слэш перед вызовом rsync:

#!/bin/zsh
new_args=();
for i in "$@"; do
    case $i in /) i=/;; */) i=${i%/};; esac
    new_args+=$i;
done
exec rsync "${(@)new_args}"

Этот сценарий может быть размещён где-нибудь в и назначен псевдонимом для rsync в файле инициализации оболочки.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: