rsync (Русский)

From ArchWiki
Jump to navigation Jump to search

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

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

Установка

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

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

Фронтенды

  • Grsync — GTK-фронтенд.
http://www.opbyte.it/grsync/ || grsync
  • gutback — обёртка над rsync, написанная на Shell.
https://github.com/gutenye/gutbackup || gutbackupAUR
  • JotaSync — графический пользовательский интерфейс Java Swing для rsync со встроенным планировщиком.
https://trixon.se/projects/jotasync/ || jotasyncAUR
  • luckyBackup — Qt-фронтенд, написанный на C++.
http://luckybackup.sourceforge.net/index.html || luckybackupAUR

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

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

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

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

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

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

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

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

или

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

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

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

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

function cpr() {
  rsync --archive -hh --partial --info=stats1 --info=progress2 --modify-window=1 "$@"
} 
function mvr() {
  rsync --archive -hh --partial --info=stats1 --info=progress2 --modify-window=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/zsh
new_args=();
for i in "$@"; do
    case $i in /) i=/;; */) i=${i%/};; esac
    new_args+=$i;
done
exec rsync "${(@)new_args}"

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

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

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

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

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

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

/etc/cron.daily/backup
#!/bin/bash
rsync -a --delete --quiet /каталог/для/резервного/копирования /расположение/резервной/копии
-a 
означает, что файлы должны быть архивированы, то есть большинство их характеристик сохранятся (но не список контроля доступа, жёсткие ссылки или расширенные атрибуты, такие как их возможности)
--delete 
означает, что файлы, удалённые в источнике должны быть удалены и из резервной копии

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

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

# chmod +x /etc/cron.daily/backup

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

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

/etc/cron.daily/backup
#!/bin/bash
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/bash

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/bash

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/bash

# Базовый скрипт для создания снимков при помощи 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/bash

## Моя процедура для создания снимков на основе 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) для полного списка.

  • Если в вашей системе очень мало памяти, может иметь смысл убрать опцию {{ic|-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 и аутентификации пользователей.

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

См. также