メインコンテンツへスキップ

Borgによる差分バックアップシステムの構築

··2 分·
Backup Linux Borg
Makoto Morinaga
著者
Makoto Morinaga
技術メモ、コーディング、環境構築のための個人ノート。
目次

写真や動画等の各種データなどをファイルサーバに保存していますが、hddの故障や操作ミスでデータが消えてしまったら、取り返しがつきません。 今回は差分バックアップア可能なバックアップツールであるBorgを利用して、バックアップシステムを構築します。

Borgのインストール
#

サーバにて以下のコマンドでborgをインストールします:

Terminal
# Arch Linux
sudo pacman -S borg

バックアップスクリプトの準備
#

バックアップスクリプトの作成
#

/root/scripts/配下にbackup.shを以下のように作成します。

/root/scripts/backup.sh
#!/bin/bash

######################################
# 各種パラメータ
######################################
# ホスト名
hostname=`/bin/hostname`

# バックアップ日時
date=`/bin/date +"%Y%m%d_%H%M"`

# バックアップディレクトリ
backup_dir="/backup/${hostname}"

# 差分バックアップ世代数 ※以下は、直近7日間と1週間ごと(最大4週間分)のバックアップを保持
file_keep_days=7
file_keep_weeks=4

# バックアップ対象リストファイル名
backup_list_file=/root/scripts/backup_list
if [ ! -s ${backup_list_file} ]; then
    echo "${backup_list_file} is not found."
    logger -t `basename ${0}` "backup aborted."
    cleanup
    exit 1
fi

# バックアップ対象リスト
backup_list="$(cat "${backup_list_file}" | tr "\n" " ")"

# バックアップ対象外リストファイル名
excluded_backup_list_file=/root/scripts/excluded_backup_list

# 後処理関数
cleanup () {
    rm -rf ${temp_excluded_backup_list_file}
    rm -rf ${backup_log_file}
}

######################################
# 処理
######################################

# バックアップディレクトリの初期化
if [ ! -d ${backup_dir} ]; then
    mkdir -p ${backup_dir}
    borg init --encryption=none ${backup_dir}
fi

# バックアップディレクトリをバックアップ対象外リストに追加
temp_excluded_backup_list_file=`mktemp`
if [ -s ${excluded_backup_list_file} ]; then
    cat ${excluded_backup_list_file} > ${temp_excluded_backup_list_file}
fi
echo "${backup_dir}" >> ${temp_excluded_backup_list_file}

# バックアップ実行
backup_log_file=`mktemp`
logger -t `basename ${0}` "backup started."
borg create --exclude-from ${temp_excluded_backup_list_file} ${backup_dir}::${hostname}-${date} ${backup_list} > ${backup_log_file} 2>&1

code=$?
if [ ${code} -ne 0 ]; then
    logger -t `basename ${0}` "backup aborted."
    logger -t `basename ${0}` "$(cat "${backup_log_file}")"
    cleanup
    exit 1
fi

logger -t `basename ${0}` "backup finished."

# 古いバックアップ削除
borg prune -v --list --keep-daily=${file_keep_days} --keep-weekly=${file_keep_weeks} ${backup_dir} >> ${backup_log_file} 2>&1

# 後処理
cleanup

exit 0

スクリプトを保存したら、以下のコマンドで実行権限を与えます:

Terminal
sudo chmod 700 /root/scripts/backup.sh

バックアップディレクトリの準備
#

以下のコマンドでバックアップデータを保存するディレクトリを作成します。HDDの故障を考慮して、バックアップを保存するディレクトリはデータがあるHDDとは別のHDDに作成すると、なお良いです。

Terminal
sudo mkdir /backup

バックアップ対象リストの作成
#

先ほど作成したバックアップスクリプトでは、backup_listに記載されているパスのディレクトリやファイルをバックアップ対象と判断します。そのため、以下のように、backup_listにバックアップしたい対象をフルパスで記述します。

/root/scripts/backup_list
/root
/home

バックアップ対象外リストの作成
#

また、バックアップスクリプトは、excluded_backup_listに記載されているパスをバックアップ対象外と判断します。そのため、以下のように、excluded_backup_listにバックアップから除外したい対象のフルパスで記述します。 なお、ワイルドカードも利用可能です。

/root/scripts/excluded_backup_list.sh
/root/tmp
*.DS_Store
*.thumbnails

バックアップスクリプトの動作確認
#

以下のコマンドでバックアップスクリプトを実行します:

Terminal
sudo /root/scripts/backup.sh

この際に、-bash: hostname: command not foundというエラーが表示された場合は、以下のコマンドでhostnameをインストールしてから、再度バックアップスクリプトを実行します。

Terminal
# arch linux
sudo pacman -S inetutils

バックアップスクリプトの実行後に、バックアップディレクトリにサーバのホスト名と同じディレクトリが作成されていることを確認します。

バックアップの表示とリストア
#

borgではborg listコマンドで取得したバックアップのリストを表示可能なため、以下のコマンドでバックアップリストを表示します。

Terminal
sudo borg list /backup/"$(hostname)"

さらに、以下のコマンドで取得したバックアップのリストが表示できます。

Terminal
sudo borg list /backup/"$(hostname)"::"$(hostname)-20180722_0939"

バックアップからすべてを復元する場合は、リストアしたいバックアップを以下のように指定します。

Terminal
sudo borg extract /backup/"$(hostname)"::"$(hostname)-20180722_0939"

特定のファイルやディレクトリを復元する場合は、リストアしたいフォルダやディレクトリを以下のように指定します。 注意点としては、指定するパスの先頭の/は不要であり、borg listコマンドで復元したいファイルのパスを確認するのが良いです。

Terminal
sudo borg extract /backup/"$(hostname)"::"$(hostname)-20180722_0939" home/mkt3/text.txt

バックアップスクリプトの自動化
#

systemdのtimerを利用して、バックアップスクリプトを毎日1時に実行するように設定します。

サービスファイルの作成
#

/etc/systemd/systembackup.serviceというサービスファイルを作成します。

/etc/systemd/system/backup.service
[Unit]a
Description=Daily Backup

[Service]
Type=simple
ExecStart=/root/scripts/backup.sh

タイマーファイルの作成
#

/etc/systemd/systembackup.timerというサービスファイルを作成します。

/etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=*-*-* 01:00:00
Unit=backup.service

[Install]
WantedBy=timers.target

タイマーの有効化
#

以下のコマンドでタイマーを有効化します:

Terminal
sudo systemctl enable backup.timer

これで毎日1時にバックアップスクリプトが実行されます。

終わりに
#

これで突然のhddの故障や操作ミスでデータが消えても、最大で過去1ヶ月前までのバックアップからデータを復旧することができ一安心です。

関連記事

iptablesの設定
··2 分
Linux Firewall Iptables
Sambaによるファイル共有サーバの構築
··2 分
Linux Samba
NSDとUnboundによる内部向けDNSサーバの構築
··2 分
Unbound Nsd Linux