rsync (Русский) - ArchWiki

Jump to content
From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи rsync. Дата последней синхронизации: 6 марта 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- System backup
- Программы синхронизации и резервного копирования

rsync — утилита с открытым исходным кодом для быстрого инкрементного перемещения файлов.

## Установка

Установите пакет rsync.

rsync должен быть установлен как на устройстве-отправителе, так и на устройстве-получателе.

### Графические интерфейсы

- Grsync — GTK-фронтенд.

  https://www.opbyte.it/grsync/ || grsync

- JotaSync — графический пользовательский интерфейс Java Swing для rsync со встроенным планировщиком.

  https://trixon.se/projects/jotasync/ || jotasyncAUR

- luckyBackup — Qt-фронтенд, написанный на C++.

  https://luckybackup.sourceforge.net/index.html || luckybackupAUR

Другие утилиты, использующие rsync: rdiff-backupAUR и osyncAUR.

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

Примечание: Использование rsync вместо cp/mv эффективно между различными файловыми системами, но не для копирования или перемещения файлов внутри одной файловой системы. Смотрите [1]

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

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

Опция `-P` эквивалентна `--partial --progress`, которая оставляет частично переданные файлы и показывает шкалу прогресса во время передачи.

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

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

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

или

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

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

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

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

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

- `-hh` : вывод чисел в удобном для чтения виде

- `--info=stats1,progress2` : `stats1` выводит статистику трансфера rsync с уровнем детализации 1. `progress2` выводит общий прогресс трансфера, а не по каждому файлу (`progress1`)

- `--modify-window=1` : при сравнении временных меток у файлов, считать их эквивалентными если разница составляет не более 1 секунды.

- `--remove-source-files` : удалить файлы из каталога источника после успешной передачи.

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

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

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

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

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

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

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

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

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

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

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

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

## Как утилита для резервного копирования

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

### Автоматическое резервное копирование

В этом примере сценарий будет создан в каталоге `/etc/cron.daily` и будет запускаться ежедневно, если демон cron должным образом установлен и настроен. Настройка и использование cron выходит за рамки этой статьи.

Сперва создайте сценарий, содержащий подходящие опции команды:

    /etc/cron.daily/backup

    #!/bin/sh
    rsync -a --delete --quiet /каталог/для/резервного/копирования /расположение/резервной/копии

- `-a` : означает, что файлы должны быть архивированы, то есть большинство их характеристик сохранятся (но не список контроля доступа, жёсткие ссылки или расширенные атрибуты, такие как их возможности)
- `--delete` : означает, что файлы, удалённые в источнике, должны быть удалены и из резервной копии

Здесь `/каталог/для/резервного/копирования` следует заменить на каталог, нуждающийся в резервной копии (например `/home`), а `/расположение/резервной/копии` на каталог, куда следует сохранять резервную копию (например `/media/disk`).

В конце надо сделать сценарий исполняемым.

### Автоматическое резервное копирование по SSH

Для резервного копирования на удалённый хост при помощи SSH, используйте следующий сценарий:

    /etc/cron.daily/backup

    #!/bin/sh
    rsync -a --delete --quiet -e ssh /каталог/для/резервного/копирования пользователь@хост:/расположение/резервной/копии

- `-e ssh` : указывает rsync использовать SSH
- `пользователь` : пользователь на `хост`
- `-a` : включает опции `-rlptgoD` (рекурсивно, ссылки, разрешения, времена, группы, владелец, устройства)

Примечание: Rsync попытается изменить любые файлы с существующими резервными копиями на целевом устройстве, чтобы они соответствовали их состоянию на устройстве-источнике, при каждом инкрементном резервном копировании. Это означает, что при резервном копировании файлов, владеемых root, при помощи SSH (и когда включено сохранение разрешений и владения например опцией `-a`), требуются root права на целевом устройстве. Предпочтительный способ достижения этого при автоматизации — настроить демон SSH, разрешив вход для root, используя публичный ключ без пароля (англ.) и запустить команды rsync с правами root.

### Автоматическое резервное копирование с помощью NetworkManager

Этот сценарий запускает резервное копирование при установлении сетевого соединения.

Сперва создайте сценарий, содержащий подходящие опции команды:

    /etc/NetworkManager/dispatcher.d/backup

    #!/bin/sh

    if [ x"$2" = "xup" ] ; then
            rsync --force --ignore-errors -a --delete --bwlimit=2000 --files-from=files.rsync /каталог/для/резервного/копирования /расположение/резервных/копий
    fi

- `-a` : включает опции `-rlptgoD` (рекурсивно, ссылки, разрешения, времена, группы, владелец, устройства)
- `--files-from` : считывает относительный путь /каталога/для/резервного/копирования из этого файла
- `--bwlimit` : ограничивает пропускную способность ввода/вывода; килобайты в секунду

Root должен владеть сценарием (для изучения подробностей см. NetworkManager#Network services with NetworkManager dispatcher (англ.))

### Автоматическое резервное копирование с помощью systemd и inotify

Примечание:

- В связи с ограничениями inotify и systemd (см. этот вопрос и ответ(англ.)), рекурсивный мониторинг файловой системы невозможен. Несмотря на возможность просматривать каталог и его содержимое, нельзя рекурсивно заходить в подкаталоги и просматривать их содержимое; вам необходимо явно указывать каждый каталог для просмотра, даже если этот каталог является дочерним для другого указанного каталога.
- Эта настройка основана на systemd/User.

Вместо запуска резервного копирования по расписанию, например при помощи cron, можно запускать резервное копирование каждый раз, когда в один из файлов, подлежащих резервному копированию, вносятся изменения. Модули `systemd.path` используют `inotify` для мониторинга файловой системы, и могут быть использованы в связке с файлами `systemd.service` для запуска любого процесса (в данном случае резервного копирования при помощи rsync) на основе события файловой системы.

Сперва, создайте юнит `systemd.path`, который будет отслеживать файлы для резервного копирования:

    ~/.config/systemd/user/backup.path

    [Unit]
    Description=Проверяет, изменились ли файлы, для которых необходимо создавать резервные копии

    [Path]
    PathChanged=%h/documents
    PathChanged=%h/music

    [Install]
    WantedBy=default.target

Затем создайте файл `systemd.service`, который будет активирован при обнаружении изменений. По умолчанию будет запущен файл службы, названный так же, как и модуль пути (в данном случае `backup.path`), за исключением расширения `.service` вместо `.path` (в данном случае `backup.service`).

Примечание: Если вам нужно запустить несколько команд rsync, используйте `Type=oneshot`. Это позволяет указывать несколько параметров `ExecStart=`, один для каждой команды rsync, которая будет выполнена. Другим способом является просто написание сценария для запуска создания всех резервных копий, такого как сценарий cron.

    ~/.config/systemd/user/backup.service

    [Unit]
    Description=Создаёт резервные копии файлов

    [Service]
    ExecStart=/usr/bin/rsync %h/./documents %h/./music -CERrltm --delete ubuntu:

Теперь запустите/включите `backup.path`, как обычную службу systemd и она начнёт отслеживать изменения в файлах и автоматически запускать `backup.service`.

### Дифференциальное резервное копирование в течение недели

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

Сперва создайте сценарий, содержащий подходящие командные опции:

    /etc/cron.daily/backup

    #!/bin/sh

    DAY=$(date +%A)

    if [ -e /расположение/для/инкрементной/копии/$DAY ] ; then
      rm -fr /расположение/для/инкрементной/копии/$DAY
    fi

    rsync -a --delete --quiet --inplace --backup --backup-dir=/расположение/для/инкрементной/копии/$DAY /каталог/для/резервного/копирования/ /расположение/для/полной/резервной/копии/

Опция `--inplace` автоматически включает `--partial` и обновляет целевые файлы напрямую.

### Резервное копирование при помощи создания снимков

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

Этот легко реализуемый базовый сценарий создаёт быстрые инкрементные снимки, используя опцию `--link-dest` для создания жёстких ссылок на неизменённые файлы:

    /usr/local/bin/snapbackup.sh

    #!/bin/sh

    # Базовый скрипт для создания снимков при помощи rsync

    # Config
    OPT="-aPh"
    LINK="--link-dest=/snapshots/пользователь/last/"
    SRC="/home/пользователь/файлы/"
    SNAP="/snapshots/пользователь/"
    LAST="/snapshots/пользователь/last"
    date=`date "+%Y-%b-%d:_%T"`

    # Запуск rsync для создания снимка
    rsync $OPT $LINK $SRC ${SNAP}$date

    # Удаление символической ссылки на предыдущий снимок
    rm -f $LAST

    # Создание новой символической ссылки на последний снимок, на который следует создавать жёсткие ссылки
    ln -s ${SNAP}$date $LAST

Символическая ссылка должна уже существовать в качестве назначения `--link-dest`. Если предыдущий снимок удаляется, то символическая ссылка должна быть пересоздана на наиболее недавний снимок. Если `--link-dest` не найдёт работающей символической ссылки, rsync продолжит копировать все исходные файла вместо копирования только изменений.

Более продвинутая версия поддерживает актуальную полную резервную копию `$SNAP/latest` и в случае изменения определённого количества файлов с прошлой полной резервной копии, создаёт снимок `$SNAP/$DATETAG` текущей полной резервной копии, используя `cp -al` для создания жёстких ссылок на неизменённые файлы:

    /usr/local/bin/rsnapshot.sh

    #!/bin/sh

    ## Моя процедура для создания снимков на основе rsync
    ## (cc) marcio rps AT gmail.com

    # Конфигурационные переменные

    SRC="/home/пользователь/файлы/" #не забудьте замыкающий слэш!
    SNAP="/snapshots/пользователь"
    OPTS="-rltgoi --delay-updates --delete --chmod=a-w"
    MINCHANGES=20

    # запуск этого процесса с низким приоритетом

    ionice -c 3 -p $$
    renice +12  -p $$

    # синхронизация

    rsync $OPTS $SRC $SNAP/latest >> $SNAP/rsync.log

    # проверка, достаточно ли файлов поменялось, если да, то
    # создаётся жёсткая ссылка, называемая по дате

    COUNT=$( wc -l $SNAP/rsync.log|cut -d" " -f1 )
    if [ $COUNT -gt $MINCHANGES ] ; then
            DATETAG=$(date +%Y-%m-%d)
            if [ ! -e $SNAP/$DATETAG ] ; then
                    cp -al $SNAP/latest $SNAP/$DATETAG
                    chmod u+w $SNAP/$DATETAG
                    mv $SNAP/rsync.log $SNAP/$DATETAG
                   chmod u-w $SNAP/$DATETAG
             fi
    fi

Чтобы сделать всё намного проще, этот сценарий можно запускать как модуль systemd/Timers.

### Полная резервная копия системы

Этот раздел об использовании rsync для передачи копии полного дерева `/`, исключая несколько выбранных каталогов. Этот подход считается лучше, чем клонирование диска с помощью `dd`, так как он позволяет использовать различные размеры, таблицы разделов и файловые системы и лучше, чем копирование с помощью `cp -a`, так как предоставляет больший контроль над разрешениями, атрибутами файлов, списками контроля доступа и расширенными атрибутами (англ.).

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

Этот подход хорошо подходит для переноса существующей установки на новый жёсткий диск или SSD.

Запустите следующую команду с правами root, чтобы удостовериться, что rsync имеет доступ ко всем системным файлам и может сохранять владельцев:

    # rsync -aAXHv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /каталог/для/резервного/копирования

При использовании набора опций `-aAX`, файлы передаются в режиме архива, что гарантирует сохранность символических ссылок, устройств, разрешений, владельцев, времени изменения, списков контроля доступа и расширенных атрибутов, в предположении, что целевая файловая система поддерживает соответствующие функции. Опция `-H` сохраняет жёсткие ссылки, но использует больше памяти.

Опция `--exclude` исключает файлы, подходящие под заданные шаблоны. Каталоги `/dev`, `/proc`, `/sys`, `/tmp` и `/run` будут созданы этой командой, однако их содержимое будет исключено из резервной копии. `/lost+found` зависит от файловой системы. Команда выше зависит расширения скобок в оболочках bash (англ.) и zsh (англ.). При использовании другой оболочки. шаблоны в `--exclude` должны повторяться вручную. Кавычки в исключаемых шаблонах позволят избежать расширения оболочкой, что важно например при резервном копировании по SSH. Окончание исключаемых путей символом `*` гарантирует, что сами каталоги будут созданы, если они ещё не существуют.

Примечание:

- Если вы планируете записывать резервную копию в каталог, отличный от `/mnt` или `/media`, не забудьте добавить его в список исключаемых шаблонов, чтобы избежать бесконечного цикла.
- Если в системе есть смонтированные привязанные каталоги, то они должны быть также исключены, чтобы их содержимое скопировалось только один раз.
- Если вы используете файл подкачки, убедитесь, что вы его исключили.
- Примите к сведению, если хотите создать резервную копию каталога `/home/`. Если он содержит ваши данные, то может оказаться значительно больше, чем система. В ином случае, исключите неважные подкаталоги, такие как `/home/*/.thumbnails/*`, `/home/*/.cache/mozilla/*`, `/home/*/.cache/chromium/*`, и `/home/*/.local/share/Trash/*`, в зависимости от программного обеспечения, установленного в системе.
- Если установлен GVFS, то необходимо исключить `/home/*/.gvfs` чтобы избежать ошибок rsync.
- Если установлен Dhcpcd ≥ 9.0.0, исключите каталог `/var/lib/dhcpcd/*` т.к. dhcpcd монтирует туда несколько системных каталогов в качестве подкаталогов.

Возможно вы захотите добавить или убрать некоторые опции rsync, например следующие. Смотрите rsync(1) для полного списка.

- Если в вашей системе очень мало памяти, может иметь смысл убрать опцию `-H`; однако это не должно быть проблемой на большинстве современных устройств. Количество жёстких ссылок в файловой системе может быть большим при использовании некоторых программ, например Flatpak. Много жёстких ссылок находится в каталоге `/usr/`.
- Вы можете захотеть добавить опцию rsync `--delete`, если запускаете его несколько раз для одного и того же каталога. В этом случае, убедитесь, что каталог источника на заканчивается на `/*`, иначе эта опция затронет файлы внутри подкаталогов источника, но не затронет файлы, находящиеся в самом источнике.
- Если вы используете разреженные файлы, такие как виртуальные диски, образы Docker и т.п., добавьте опцию `-S`.
- Опция `--numeric-ids` отключит сопоставление имён для групп и пользователей; вместо этого передаваться будут цифровые идентификаторы групп и пользователей. Это полезно при резервном копировании через SSH или при использовании live системы для резервного копирования другого системного диска.
- Выбрав опцию `--info=progress2` вместо `-v`, вы увидите информацию об общем прогрессе и скорости передачи вместо списка передаваемых файлов.
- Для избежания выхода за пределы файловой системы при рекурсивном обходе, добавьте опцию `-x`/`--one-file-system`. Она предотвратит резервное копирование любых точек монтирования в иерархии.

### Восстановление резервной копии

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

## Клонирование файловой системы

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

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

    rsync -qaHAXS ИСТОЧНИК НАЗНАЧЕНИЕ

Их значение (из справочной страницы):

    --hard-links, -H      сохранять жёсткие ссылки
    --acls, -A            сохранять списки контроля доступа (вызывает --perms)
    --xattrs, -X          сохранять расширенные атрибуты
    --sparse, -S          сжимать последовательности нулей в разреженные блоки

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

Полученная копия может быть легко прочитана заново и проверена (например после попытки восстановления файлов) на уровне файловой системы с помощью рекурсивной опции `diff`:

    diff -r ИСТОЧНИК НАЗНАЧЕНИЕ

Возможно осуществить успешный переход на другую файловую систему, используя rsync как описано в этой статье и обновив fstab и загрузчик, как описано в Перенос установки на новое оборудование (англ.). Это в сущности позволяет поменять любую корневую файловую систему на любую другую.

## Демон rsync

rsync можно запускать на сервере в качестве демона, слушающего порт `873`.

Отредактируйте шаблон `/etc/rsyncd.conf`, настройте общий доступ и запустите `rsyncd.service`.

Примечание: На момент rsync 3.2.0-1 пакет использует файлы модулей systemd `rsyncd.service` и `rsyncd@.service`. Изменение `ProtectHome` было закомментировано, функция безопасности `ProtectSystem=full` в разделе `[Service]` до сих пор активна. Это делает каталоги `/boot/`, `/etc/` и `/usr/` доступными только для чтения. Если вы хотите, чтобы rsyncd записывал в системные каталоги, отредактируйте модуль и установите `ProtectSystem=off` в разделе `[Service]` переопределяемого фрагмента.

Использование на клиенте, например перечисление содержимого сервера:

    $ rsync rsync://server/share

передача файла с клиента на сервер:

    $ rsync локальный-файл rsync://server/share/

Подумайте об использовании iptables для открытия порта `873` и аутентификации пользователей.

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

### Пример конфигурации

#### Раздача файлов по списку

    /etc/rsyncd.conf

    ...

    # Необходимо при пересечении границ файловой системы.
    #use chroot  = no
    read only = yes

    ...

    [sync]
        path         = /
    # Список файлов для копирования.
        include from = /backup.list
    # Исключение оставшихся.
        exclude      = *

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

    /backup.list

    /etc/
    /etc/conf.d/
    /etc/conf.d/hwclock
    /etc/fonts/***

## Смотрите также

- Больше примеров использования можно найти на форумах Вклад Сообщества (англ.) и Общее Программирование (англ.)
- Локальные и удалённые снимки с использованием rsync и жёстких ссылок Включает дедупликацию файлов с помощью жёстких ссылок, MD5 подписи, защиту 'chattr', правил фильтров, квоту на диск, политику хранения с экспоненциальным распределением (ротация резервных копий с сохранением большего числа недавних копий, чем более старых)
- Использование файлов ключей/идентификатора SSH с rsync (англ.)

Categories:

- Synchronization (Русский)
- Backup (Русский)
- Commands (Русский)