Duplicity
Duplicity はネットワークバックアッププログラムです。
ディレクトリやファイルのスナップショットを GnuPG で暗号化されたリモートの tar ファイルに保存することができ、ファイルをバックアップリポジトリとして使用します。リモートのバックアップリポジトリと接続するのに使えるプロトコルは次のとおりです: rsync, ftp, HSI, WebDAV, Tahoe-LAFS, Amazon S3。
バックアップは差分で実行されるため、(最後のバックアップから) ファイルの変更した部分だけが保存されます。
目次
インストール
フロントエンド
- duply — Duplicity のシェルフロントエンド。
- https://www.duply.net/ || duplyAUR
- Deja Dup — 正しい方法でバックアップするための複雑さを隠し、duplicityをバックエンドとして使用するシンプルなバックアップツールです。
基本的な使用方法
バックアップの実行
scp/ssh プロトコルを使ってローカルフォルダの /home/me をリモートの other.host 内の /usr/backup にバックアップする場合:
$ duplicity /home/me scp://uid@other.host//usr/backup
上記のコマンドを初めて実行したときは、完全なバックアップが作成されます。同じコマンドをもう一度実行すると、既存のバックアップリポジトリに差分バックアップが行われます。
コマンドラインオプションを追加することで以下のようなことができます:
- バックアップから特定のファイルやディレクトリを追加・除外 (シェルパターンや正規表現が使えます)。
- 暗号化の設定やバックアップの署名。
バックアップからファイルを復元
other.host のリモートリポジトリ /usr/backup に保存されている最後のスナップショットからローカルフォルダの /home/me を復元したい場合:
$ duplicity scp://uid@other.host//usr/backup /home/me
上記のコマンドはバックアップの際に使用するコマンドと順番が逆になっています。URL 引数は常にバックアップリポジトリとして扱われ、ローカルパス引数は同期するディレクトリとして扱われます (ローカルのバックアップリポジトリを指定したいときは file:// プロトコルを付けて指定する必要があります)。
コマンドラインオプションを追加することで以下のようなことができます:
- リポジトリ全体ではなく特定のファイルだけ復元。
- 特定時刻の状態にファイルを復元。
メンテナンス
リポジトリの状態をローカルファイルと比較することができるコマンドラインオプションが存在します。また、古いスナップショットを削除したり、一定のスナップショットだけを確保したり、指定した時間よりも新しいスナップショットだけ残すこともできます。
詳しくは man ページを見てください。
サンプルバックアップスクリプト
#!/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"
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
トラブルシューティング
“inappropriate ioctl for device” というような GPG のエラーが発生する場合、GPG のバージョン 2.1 以上から変わった GPG エージェントの挙動が原因です。詳しくは こちらのスレッド を見てください。基本的には GPG エージェントにパスフレーズを渡すためにプログラムを明示的に許可する必要があります。
問題を解決するGnuPG#無人のパスフレーズに手順が載っています。