Duplicity (Русский)
Duplicity — это программа сетевого резервного копирования.
Она может сохранять снимки каталогов и файлов в удалённый зашифрованный GnuPG tar-файл, который выступает в качестве хранилища резервных копий. Соединение с удалённым хранилищем резервных копий может осуществляться по любому из следующих протоколов: rsync, ftp, HSI, WebDAV, Tahoe-LAFS или Amazon S3.
Резервные копии являются гранулярно инкрементными, то есть сохраняются только изменения в файлах (с момента последнего снимка).
Установка
Установите пакет duplicity.
Фронтенды
- Duply — Маленький фронтенд для Duplicity. Она управляет настройками заданий резервного копирования в профилях и позволяет пакетно выполнять команды.
- Deja Dup — Простой инструмент резервного копирования, который скрывает сложность резервного копирования правильным способом и использует duplicity в качестве бэкенда.
Базовое использование
Выполнение резервного копирования
Для создания резервной копии локальной папки /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"
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 (Русский)#Автоматический ввод пароля.