Debian 11 (bullseye) - 自動バックアップ運用!
Updated:
Debian GNU/Linux 11 (bullseye) で自動バックアップ運用する方法についての記録です。
以前古いバージョンでの作業時に残していた記録を参考に作業を行い、今回更新した作業記録を貼付する形式の内容となっています。
(当然ながら、興味がなければスルーしてください)
0. 前提条件
- Debian GNU/Linux 11.2.0 (bullseye; 64bit) での作業を想定。
- バックファイルを配置するディレクトリは
/home/foo/bak
(foo ユーザのホーム内のbak
ディレクトリ)とする。 - root ユーザでの作業を想定。
1. バックアップスクリプトの作成
以下のような内容でバックアップスクリプトを作成する。
File: /root/backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#!/bin/bash
#
# ローカル内でバックアップ
#
LANG=C
#
# 設定開始
#
# バックアップ対象リスト名
# ※バックアップ対象をフルパスで記述したリスト
BACKUPLIST=/root/backuplist
[ ! -s $BACKUPLIST ] && echo "$BACKUPLIST is not found" && error_exit
# バックアップ対象外リスト名
# ※バックアップ対象外をフルパスで記述したリスト
BACKUPNOLIST=/root/backupnolist
# バックアップ先ディレクトリ名
BACKUPDIR=/home/foo/bak
mkdir -p $BACKUPDIR
# バックアップ保存世代数
# ※当日分を含めた過去分バックアップを保存する世代数
# ※過去分バックアップを保存しない場合は1を指定する
BACKUPGEN=8
# 暗号化・復号化パスフレーズ
# ※指定がないときは暗号化しない
PASS=''
# バックアップログファイル名
BACKUPLOG=/var/log/backup.log
#
# 設定終了
#
# 異常終了処理関数定義
error_exit () {
rm -f $TMPBACKUPNOLIST
exit 1
}
# バックアップファイルをバックアップ対象外リストに追加
# ※バックアップ先ファイルをバックアップしないようにする
TMPBACKUPNOLIST=`mktemp`
[ -s $BACKUPNOLIST ] && cat $BACKUPNOLIST > $TMPBACKUPNOLIST
echo "$BACKUPDIR/*backup.tar.bz2" >> $TMPBACKUPNOLIST
# 前回バックアップをリネーム
cd $BACKUPDIR
OLDBACKUPFILE=`ls backup.tar.bz2* 2>/dev/null`
if [ -f $OLDBACKUPFILE ]; then
TIMESTAMP=`ls --full-time $OLDBACKUPFILE|awk '{print $6}'|tr -d -`
mv $BACKUPDIR/$OLDBACKUPFILE $BACKUPDIR/${TIMESTAMP}$OLDBACKUPFILE > /dev/null 2>&1
fi
# バックアップログファイル作成
rm -f $BACKUPLOG
touch $BACKUPLOG
chmod 400 $BACKUPLOG
# バックアップ実行
echo "`date` backup start" >> $BACKUPLOG
# -X オプションが効かない => 削除
#tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST -X $TMPBACKUPNOLIST >> $BACKUPLOG 2>&1
tar cjvfP $BACKUPDIR/backup.tar.bz2 -T $BACKUPLIST >> $BACKUPLOG 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
rm -f $BACKUPDIR/backup.tar.bz2
error_exit
fi
echo "`date` backup end" >> $BACKUPLOG
# バックアップ暗号化(暗号化・復号化パスフレーズ指定時のみ)
if [ ! -z $PASS ]; then
echo "`date` encrypt start" >> $BACKUPLOG
mkdir -p $HOME/.gnupg
echo $PASS|gpg --passphrase-fd 0 --batch -c $BACKUPDIR/backup.tar.bz2 > /dev/null 2>&1
code=$?
if [ $code -ne 0 ]; then
cat $BACKUPLOG | mail -s "BACKUP NG CODE IS $code" root
rm -f $BACKUPDIR/backup.tar.bz2*
error_exit
fi
rm -f $BACKUPDIR/backup.tar.bz2
echo "`date` encrypt end" >> $BACKUPLOG
fi
# バックアップ保存世代を超えた古いバックアップを削除
if [ $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) -gt $BACKUPGEN ]; then
OLDBACKUPCNT=`expr $(ls $BACKUPDIR/*backup.tar.bz2*|wc -l) - $BACKUPGEN`
for file in `ls -t $BACKUPDIR/*backup.tar.bz2*|tail -n $OLDBACKUPCNT`
do
rm -f $file
done
fi
# バックアップ対象外リスト削除
rm -f $TMPBACKUPNOLIST
2. 実行権限の付与
# chmod +x backup.sh
3. バックアップ対象リストの作成
バックアップするディレクトリやファイルを一覧にしたファイル backuplist
を以下のように作成する。(以下は単なる一例。内容は適宜編集すること。そして、最終行で改行しないこと)
File: /root/backuplist
/home
/root
/var/www
4. バックアップ対象外リストの作成
バックアップ対象のディレクトリやファイルの中でもバックアップしたくないディレクトリやファイルを一覧にしたファイル backupnolist
を以下のように作成する。(以下は単なる一例。内容は適宜編集すること。そして、最終行で改行しないこと。また、対象外にするディレクトリやファイルが無ければ作成しなくてよい)
File: /root/backupnolist
/home/hoge
/var/www/fuga
5. バックアップの実行
# ./backup.sh
バックアップディレクトリにアーカイブファイルが作成されるはずである。
また、ファイルが増えれば最大8世代残すようになっている。(そういうスクリプトにしているから)(以下は、8日経過後の様子)
# ls -l /home/bak/
total 522
-rw-r--r-- 1 root root 84205 Jun 30 03:01 20150430backup.tar.bz2
-rw-r--r-- 1 root root 84276 Jul 1 03:01 20150501backup.tar.bz2
-rw-r--r-- 1 root root 84336 Jul 2 03:01 20150502backup.tar.bz2
-rw-r--r-- 1 root root 84133 Jul 3 03:01 20150503backup.tar.bz2
-rw-r--r-- 1 root root 84140 Jul 4 03:01 20150504backup.tar.bz2
-rw-r--r-- 1 root root 84029 Jul 5 03:01 20150505backup.tar.bz2
-rw-r--r-- 1 root root 84124 Jul 6 03:01 20150506backup.tar.bz2
-rw-r--r-- 1 root root 84128 Jul 7 03:01 backup.tar.bz2
6. 自動実行の設定
毎日定時に実行するよう cron 登録する。(/etc/cron.d/backup
を以下の内容で作成する)
以下は毎日午前3時1分にバックアップスクリプトを実行する例。
File: /etc/cron.d/backup
1 3 * * * root /root/backup.sh
7. 参考サイト
CentOS での自動バックアップ運用を参考にしている(流用している)。
以上。
Comments