ubuntuの差分バックアップ

[`evernote` not found]
Bookmark this on Hatena Bookmark
Share on Facebook
LINEで送る

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で回すくらいがオススメ.