写真や動画等の各種データなどをファイルサーバに保存していますが、hddの故障や操作ミスでデータが消えてしまったら、取り返しがつきません。 今回は差分バックアップア可能なバックアップツールであるBorgを利用して、バックアップシステムを構築します。
Borgのインストール #
サーバにて以下のコマンドでborgをインストールします:
# Arch Linux
sudo pacman -S borg
バックアップスクリプトの準備 #
バックアップスクリプトの作成 #
/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
スクリプトを保存したら、以下のコマンドで実行権限を与えます:
sudo chmod 700 /root/scripts/backup.sh
バックアップディレクトリの準備 #
以下のコマンドでバックアップデータを保存するディレクトリを作成します。HDDの故障を考慮して、バックアップを保存するディレクトリはデータがあるHDDとは別のHDDに作成すると、なお良いです。
sudo mkdir /backup
バックアップ対象リストの作成 #
先ほど作成したバックアップスクリプトでは、backup_list
に記載されているパスのディレクトリやファイルをバックアップ対象と判断します。そのため、以下のように、backup_list
にバックアップしたい対象をフルパスで記述します。
/root
/home
バックアップ対象外リストの作成 #
また、バックアップスクリプトは、excluded_backup_list
に記載されているパスをバックアップ対象外と判断します。そのため、以下のように、excluded_backup_list
にバックアップから除外したい対象のフルパスで記述します。
なお、ワイルドカードも利用可能です。
/root/tmp
*.DS_Store
*.thumbnails
バックアップスクリプトの動作確認 #
以下のコマンドでバックアップスクリプトを実行します:
sudo /root/scripts/backup.sh
この際に、-bash: hostname: command not found
というエラーが表示された場合は、以下のコマンドでhostname
をインストールしてから、再度バックアップスクリプトを実行します。
# arch linux
sudo pacman -S inetutils
バックアップスクリプトの実行後に、バックアップディレクトリにサーバのホスト名と同じディレクトリが作成されていることを確認します。
バックアップの表示とリストア #
borgではborg listコマンドで取得したバックアップのリストを表示可能なため、以下のコマンドでバックアップリストを表示します。
sudo borg list /backup/"$(hostname)"
さらに、以下のコマンドで取得したバックアップのリストが表示できます。
sudo borg list /backup/"$(hostname)"::"$(hostname)-20180722_0939"
バックアップからすべてを復元する場合は、リストアしたいバックアップを以下のように指定します。
sudo borg extract /backup/"$(hostname)"::"$(hostname)-20180722_0939"
特定のファイルやディレクトリを復元する場合は、リストアしたいフォルダやディレクトリを以下のように指定します。
注意点としては、指定するパスの先頭の/
は不要であり、borg list
コマンドで復元したいファイルのパスを確認するのが良いです。
sudo borg extract /backup/"$(hostname)"::"$(hostname)-20180722_0939" home/mkt3/text.txt
バックアップスクリプトの自動化 #
systemdのtimerを利用して、バックアップスクリプトを毎日1時に実行するように設定します。
サービスファイルの作成 #
/etc/systemd/system
にbackup.service
というサービスファイルを作成します。
[Unit]a
Description=Daily Backup
[Service]
Type=simple
ExecStart=/root/scripts/backup.sh
タイマーファイルの作成 #
/etc/systemd/system
にbackup.timer
というサービスファイルを作成します。
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 01:00:00
Unit=backup.service
[Install]
WantedBy=timers.target
タイマーの有効化 #
以下のコマンドでタイマーを有効化します:
sudo systemctl enable backup.timer
これで毎日1時にバックアップスクリプトが実行されます。
終わりに #
これで突然のhddの故障や操作ミスでデータが消えても、最大で過去1ヶ月前までのバックアップからデータを復旧することができ一安心です。