ubuntu は deja-dup が標準で入っているので,使われていることが多いと思うが,NW越しにパスワードをかけて保存しようとすると,うまくいかないことがある.
で,deja-dupが呼び出しているduplicityを直接叩くことにする.
あと,うちの環境では何故かsmb経由では保存がうまくできなかったので,FTP経由にした.
これで保存したバックアップは,deja-dupから読み込むことができるけど,リストアスクリプトも用意してみた.
ちなみに,deja-dupが呼び出す時のオプションは,適当なバックアップを手動で走らせている間に,$ ps aux | grep duplicity
で見ると良い.
設定ファイル,定期バックアップスクリプト,古いバックアップの削除スクリプト,リストアスクリプトの例.
# 保存するディレクトリリストをスペース区切りで
DIRS='/home/USERNAME /MYDIR'
# 連想配列の宣言
declare -A INCLUDE
declare -A EXCLUDE
# duplicity は include/exclude に合致するディレクトリが実際にないとエラーを吐くので,
# ターゲットディレクトリ毎に指定する必要がある
# deja-dup がここを include に入れていた..cacheをexcludeしつつ,このファイルだけincludeしたりできる.
INCLUDE['/home/USERNAME']='/home/USERNAME/.cache/deja-dup/metadata'
# 半角スペース入りのディレクトリは後ろのfor loopでどうしても分割されてしまうので,半角スペース抜きに設定を変更するのが楽(vboxとか)
EXCLUDE['/home/USERNAME']='/home/USERNAME/mountedvolumes /home/USERNAME/Dropbox /home/USERNAME/Downloads /home/USERNAME/.cache /home/USERNAME/.rnd /home/USERNAME/VirtualBoxVMs'
INCLUDE['/MYDIR']=''
EXCLUDE['/MYDIR']='/MYDIR/lost+found'
#!/bin/bash
. ~/bin/duplicity_dirs.conf
# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)
# command
CMD=/usr/bin/duplicity
# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意
# options
# 1ヶ月ごとにフルバックアップを取る
OPTIONS='--volsize=100 --gpg-options=--no-use-agent --archive-dir=/home/USERNAME/.cache/deja-dup --tempdir=/tmp --full-if-older-than 1M'
# include オプションの生成
COMBINE_INC() {
RESULT=""
for STRING in $*
do
RESULT="${RESULT} --include=$STRING"
done
}
# exclude オプションの生成
COMBINE_EXC() {
RESULT=""
for STRING in $*
do
RESULT="${RESULT} --exclude=$STRING"
done
}
# loop for all target directories
for DIR in $DIRS
do
echo backup $DIR
# include
COMBINE_INC ${INCLUDE[$DIR]}
INC_OPT=$RESULT
# exclude
COMBINE_EXC ${EXCLUDE[$DIR]}
EXC_OPT=$RESULT
# command
echo $CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
$CMD $INC_OPT $EXC_OPT $OPTIONS $DIR ${DESTSRV}$DIR
done
export PASSPHRASE=""
export FTP_PASSWORD=""
#!/bin/bash
. ~/bin/duplicity_dirs.conf
# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)
# command
CMD=/usr/bin/duplicity
SUBCMD=remove-older-than # 経過時間を条件に削除するモード
# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意
# options
PARAM=6M # 6ヶ月より古いものを消す
OPTIONS='--force'
# loop for all target directories
for DIR in $DIRS
do
echo clear $DIR
echo $CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR
$CMD $SUBCMD $PARAM $OPTIONS ${DESTSRV}$DIR \
&& echo "clear old data for $DIR" \
|| echo "some error may happen in the process for $DIR"
done
export PASSPHRASE=""
export FTP_PASSWORD=""
##!/bin/bash
. ~/bin/duplicity_dirs.conf
# environment variables
# パスワードとかコマンドにもスクリプトにも入れたくない場合は,読み込むしかない
USER=$(cat /home/USERNAME/username)
# GnuPGに渡されるパスフレーズ
export PASSPHRASE=$(cat /home/USERNAME/passphrase)
# FTPログイン時に使用されるパスワード
export FTP_PASSWORD=$(cat /home/USERNAME/password)
# command
CMD=/usr/bin/duplicity
SUBCMD=restore
# バックアップ保存先
# destination
DESTADDR=192.168.1.200
DESTPATH=/BackupDirectory
# FTPの場合
DESTSRV=ftp://${USER}@${DESTADDR}/array1${DESTPATH}
# LinkStationの場合,array1が間にはさまることに注意
# 入力処理 - バックアップのURLを特定する
# ターゲットディレクトリに部分一致があれば,DIRに値が入ったままbreakする仕組み
for DIR in $DIRS
do
[ "${1#$DIR}" != "$1" ] && break
DIR=""
done
[ "$DIR" == "" ] && exit
# 対象ファイルの相対化
# duplicityは,バックアップ先のディレクトリからの相対パスが必要
RELPATH="${1#$DIR/}"
OPTIONS="--file-to-restore $RELPATH"
# リストアしたファイルを格納するテンポラリファイル
# 直接書き戻すこともできるけど,リスキーだからやめた方が良い
TARGET=~/restore
mkdir -p $TARGET
TARGET="${TARGET}/${RELPATH}"
echo restore $1
echo $CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET
$CMD $SUBCMD $OPTIONS ${DESTSRV}$DIR $TARGET \
&& echo "files are restore into ${TARGET}" \
|| echo "some error may happen in the process for ${TARGET}"
export PASSPHRASE=""
export FTP_PASSWORD=""
個人的には,バックアップをdaily,削除をmonthlyで回すくらいがオススメ.