
- rsyncを使ってN世代バックアップを行う。
- バックアップリストファイルを使う。
準備
インストール
$ sudo apt-get install rsync
バックアップリストディレクトリ作成
$ sudo mkdir -p /etc/backup/
バックアップ実行用 ShellScript
ファイル名:backup.sh
#!/bin/bash
#
# BackUp Script
#
USB_DEVICE=/dev/sda1
MOUNT_POINT=/backup_disk
BACKUP_CONF=/etc/backup/backup.list
#
#
#
BACKUP_DIR=”backup”
LOG_FILE=”$MOUNT_POINT/$BACKUP_DIR/log”
GENERATION=3 # 世代数=3
#
# mount
#
if [ -d $USB_DEVICE ]; then
mkdir -p $MOUNT_POINT
mount -t auto $USB_DEVICE $MOUNT_POINT
fi
#
# Output DIR
#
mkdir -p $MOUNT_POINT/$BACKUP_DIR
for i in `seq 1 $GENERATION`
do
mkdir -p $MOUNT_POINT/$BACKUP_DIR/$i
done
#
# Log
#
if [ ! -f $LOG_FILE ]; then
touch $LOG_FILE
fi
echo “*** Backup Start (`date`) ***” >> $LOG_FILE 2>&1
#
# conf file check
#
if [ ! -f $BACKUP_CONF ]; then
echo “* $BACKUP_CONF not found”
exit 1
fi
#
while read Backup_Source; do
TMP=`echo $Backup_Source | cut -c1`
if [ “$Backup_Source” != “” -a “$TMP” != “#” ]; then
FILE_MODE=
if [ -f $Backup_Source ]; then
echo “* $Backup_Source is File” >> $LOG_FILE 2>&1
FILE_MODE=”file”
fi
if [ -d $Backup_Source ]; then
echo “* $Backup_Source is Dir” >> $LOG_FILE 2>&1
FILE_MODE=”dir”
fi
if [ “$FILE_MODE” == “” ]; then
echo “$Backup_Source Not Found => byepass” >> $LOG_FILE
continue;
fi
FILE_NAME=`dirname $Backup_Source | sed -e “s/\//_/g”`
BASE_NAME=`basename $Backup_Source`
#
i=$GENERATION
while [ $i -gt 1 ];
do
j=`expr $i – 1`
SOURCE_D=”$MOUNT_POINT/$BACKUP_DIR/$j”
BACKUP_D=”$MOUNT_POINT/$BACKUP_DIR/$i”
mkdir -p $BACKUP_D/$FILE_NAME
if [ $FILE_MODE == “dir” ]; then
if [ -d $SOURCE_D/$FILE_NAME/$BASE_NAME ]; then
rsync -avH –delete –link-dest=”../../$j/$FILE_NAME” “$SOURCE_D/$FILE_NAME/$BASE_NAME” “$BACKUP_D/$FILE_NAME/” >> $LOG_FILE 2>&1
fi
fi
if [ $FILE_MODE == “file” ]; then
if [ -f $SOURCE_D/$FILE_NAME/$BASE_NAME ]; then
rsync -avH –delete –link-dest=”../../$j/$FILE_NAME” “$SOURCE_D/$FILE_NAME/$BASE_NAME” “$BACKUP_D/$FILE_NAME/$BASE_NAME” >> $LOG_FILE 2>&1
fi
fi
i=`expr $i – 1`
done
#
if [ $FILE_MODE == “dir” ]; then
rsync -avH –delete “$Backup_Source” “$MOUNT_POINT/$BACKUP_DIR/1/$FILE_NAME/” >> $LOG_FILE 2>&1
fi
if [ $FILE_MODE == “file” ]; then
mkdir -p $MOUNT_POINT/$BACKUP_DIR/1/$FILE_NAME
rsync -avH –delete “$Backup_Source” “$MOUNT_POINT/$BACKUP_DIR/1/$FILE_NAME/$BASE_NAME” >> $LOG_FILE 2>&1
fi
fi
done < $BACKUP_CONF
echo “*** Backup End (`date`)***” >> $LOG_FILE 2>&1
cronへの登録 (バックアップ実行用 ShellScriptを登録)
$ sudo crontab -e
0 0 * * * /usr/local/bin/backup.sh >/dev/null 2>&1
バックアップリスト(backup.list)のサンプル
#
# /etc/backup/backup.conf
#
# SSH ssh_configファイルのバックアップ
/etc/ssh/ssh_config
# Webディレクトリのバックアップ
/var/www/HP