rsync (Русский)
rsync — утилита с открытым исходным кодом для быстрого инкрементного перемещения файлов.
Установка
Установите пакет rsync.
rsync должен быть установлен как на устройстве-отправителе, так и на устройстве-получателе.
Фронтенды
- Grsync — GTK-фронтенд.
- gutback — обёртка над rsync, написанная на Shell.
- JotaSync — графический пользовательский интерфейс Java Swing для rsync со встроенным планировщиком.
- luckyBackup — Qt-фронтенд, написанный на C++.
Другие утилиты, использующие 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,progress2 --modify-window=1 "$@" } function mvr() { rsync --archive -hh --partial --info=stats1,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
(рекурсивно, ссылки, разрешения, времена, группы, владелец, устройства)
-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
).
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
.
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 (англ.)