Duplicity (Русский)

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

Duplicity — это программа сетевого резервного копирования.

Она может сохранять снимки каталогов и файлов в удалённый зашифрованный GnuPG tar-файл, который выступает в качестве хранилища резервных копий. Соединение с удалённым хранилищем резервных копий может осуществляться по любому из следующих протоколов: rsync, ftp, HSI, WebDAV, Tahoe-LAFS или Amazon S3.

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

Установка

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

Фронтенды

  • Duply — Маленький фронтенд для Duplicity. Она управляет настройками заданий резервного копирования в профилях и позволяет пакетно выполнять команды.
https://duply.net/Main_Page || duplyAUR
  • Deja Dup — Простой инструмент резервного копирования, который скрывает сложность резервного копирования правильным способом и использует duplicity в качестве бэкенда.
https://wiki.gnome.org/Apps/DejaDup || deja-dup

Базовое использование

Выполнение резервного копирования

Для создания резервной копии локальной папки /home/me в удалённом месте /usr/backup на хосте other.host по протоколу scp/ssh используйте:

$ duplicity /home/me scp://uid@other.host//usr/backup

При первом выполнении этой команды создаётся полная резервная копия. Повторное выполнение той же команды вызывает инкрементное резервное копирование в существующее хранилище резервных копий.

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

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

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

Чтобы восстановить локальную папку /home/me до состояния последнего снимка, сохранённого в удалённом хранилище /usr/backup на хосте other.host, выполните:

$ duplicity scp://uid@other.host//usr/backup /home/me 

Обратите внимание на обратный порядок аргументов по сравнению с приведённой выше командой backup. Аргумент URL всегда рассматривается как хранилище резервных копий, а аргумент local path — как каталог для синхронизации с резервной копией. (Локальное хранилище резервных копий должно быть явно указано с помощью префикса протокола file://!)

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

  • восстанавливать конкретный файл вместо всего хранилища
  • восстановить файл(ы) до состояния, в котором они находились на определённую дату, а не до самого последнего доступного снимка

Проверка и обслуживание хранилища

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

Смотрите duplicity(1) для более подробной информации.

Пример скрипта резервного копирования

#!/bin/sh
## Remote backup script. Requires duplicity and gpg-agent with the keys and passphrases loaded as root.
## Uses separate encryption and signing keys
## Usage:  'backup_remote.sh'

enc_key=44D79E41
sign_key=F5C978E3
src="/mnt/backup/"
dest="scp://destination.com//backups/homeserver"

# Keychain is used to source the ssh-agent keys when running from a cron job
type -P keychain &>/dev/null || { echo "I require keychain but it's not installed.  Aborting." >&2; exit 1; }
eval `keychain --eval web_rsa` || exit 1
## Note: can't use keychain for gpg-agent because it doesn't currently (2.7.1) read in all the keys correctly.
## Gpg will ask for a passphrase twice for each key...once for encryption/decryption and once for signing.
## This makes unattended backups impossible, especially when trying to resume an interrupted backup.
if [ -f "${HOME}/.gnupg/gpg-agent-info" ]; then
      . "${HOME}/.gnupg/gpg-agent-info"
      export GPG_AGENT_INFO
fi

duplicity --use-agent \
         --verbosity notice \
         --encrypt-key "$enc_key" \
         --sign-key "$sign_key" \
         --full-if-older-than 60D \
         --num-retries 3 \
         --asynchronous-upload \
         --volsize 100 \
         --archive-dir /root/.cache/duplicity \
         --log-file /var/log/duplicity.log \
         --exclude /mnt/backup/fsarchiver \
         --exclude '**rdiff-backup-data' \
         "$src" "$dest"
Примечание: В текущей версии pinentry (0.8.1-3) существует проблема, которая не позволяет вводить парольную фразу для gpg-агента root при входе в систему от имени root с помощью su - или sudo. Если вы обращаетесь к удаленному серверу, где прямой вход по ssh с правами root запрещен (или нежелателен), то вам нужно либо пропатчить pinentry, либо выполнить chown root `tty` перед запуском pinentry. Это не является проблемой при запуске gpg-agent от имени пользователя, не являющегося root.

Если вы хотите запускать gpg-agent при входе в root и кэшировать пароли gpg-agent по удобства, вы можете добавить эти функции в /root/.bashrc:

function gpg_start {
       gnupginf="${HOME}/.gnupg/gpg-agent-info"
       if pgrep -u "${USER}" gpg-agent >/dev/null 2>&1; then
           eval "$(cat $gnupginf)"
           eval "$(cut -d= -f1 < $gnupginf | xargs echo export)"
       else
           eval "$(gpg-agent -s --daemon --write-env-file $gnupginf)"
       fi
}
function keys {
       touch test-gpg.txt
       touch test-gpg.txt1
       gpg -r 'Duplicity Encryption Key' -e test-gpg.txt
       gpg -r 'Duplicity Signature Key' -e test-gpg.txt1
       gpg -u <signing key> --detach-sign test-gpg.txt
       gpg -u <encryption key> --detach-sign test-gpg.txt1
       gpg -d test-gpg.txt.gpg
       gpg -d test-gpg.txt1.gpg
       rm test-gpg.txt*
}
gpg_start

Решение проблем

Если вы получаете ошибки gpg про «inappropriate ioctl for device», скорее всего это связано с изменениями в поведении агента gpg с версии gpg 2.1 и выше. Смотрите эту тему для получения дополнительной информации. Вкратце, нужно явно разрешить программам автоматически передавать пароль агенту gpg вместо того, чтобы запрашивать ввод пароля у пользователя.

Шаги по решению этой проблемы описаны в разделе GnuPG (Русский)#Автоматический ввод пароля.

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