Linuxでへなちょこバックアップ
linux
|
comments(0) | 2008/12/30 23:05
使用しているPCを整理し、ついでにrsyncを使用してバックアップする簡単なラッパースクリプトを作成、 cronで定期実行することにしました。私レベルの使用だと、RAIDなんて高度なものは必要無いです。
my-backupという非常に安易な名前のスクリプトに仕上げましたが、使用方法はまずます簡単です。 いくつか例を挙げると、
# /homeから/mnt/backupへ同期する
# 当然/homeは一切変更されない
my-backup /home /mnt/backup
# /homeから/mnt/backupへ同期する
# しかし/home/dummyディレクトリ以下は同期対象としない
# -eは除外(exclude)
my-backup /home /mnt/backup -e /home/dummy
# /home/usrから/mnt/backupへ同期する
# /home/usrの直下で.ではじまるファイル(ドットファイル)を除外する
my-backup /home/usr /mnt/backup -e /home/usr/.*
# /home/dummyディレクトリ以下は同期対象としないが、
# /home/dummy/importantディレクトリ以下は同期する
# -iは含有(include)
my-backup /home /mnt/backup -i /home/dummy/important -e /home/dummy
# /home/usr/.* (ドットファイル)を除外するが
# /home/usr/.fluxboxは対象とする
my-backup /home/usr /mnt/backup -i /home/usr/.fluxbox -e /home/usr/.*
# -e と -i の順番は変わっても常に-iの方が優先される
my-backup /home /mnt/backup -e /home/dummy -i /home/dummy/important
# -e と -i はそれぞれ複数指定可能。競合する場合は常に-iの方が優先される
my-backup /home /mnt/backup -e /home/dummy /home/dummy2 -i /home/dummy/important /home/dummy2/bin
# -ssh をつけるとsshを使用して他PCのデータもバックアップも可能
my-backup root@my-server.net:/home /mnt/backup -e /home/dummy -i /home/dummy/important -ssh
# -test をつけると実際に同期は行わず、rsyncコマンドを表示しておしまい。テスト用
my-backup root@my-server.net:/home /mnt/backup -e /home/dummy -i /home/dummy/important -ssh -test
こんな感じですか。ちなみに私の場合はサーバマシンのデータのバックアップもsshを使用して手元のPCへ同期させています。 手元PCのwindowsデータもこのスクリプトを使用してバックアップしてます。
使用している実際のコマンドはソースを見れば分かりますが、
rsync -auvz --delete --include=hogehoge --exclude=hogehoge (-e ssh)
です。root権限が無いと使用できないようになっているので、もしuser権限で使用したければ-auvzの部分を変更してください。
というわけでスクリプト。再配布、改変などご自由に。但し一切は自己責任でお願いします。
#!/bin/bash
#-*- Shell-Script -*-
##### variable
_ErrorMessage=""
_ExcludeFileList=
_IncludeFileList=
_RSyncArgment=
_SSHFlag=
_TESTFLag=
_Flag=
_SourceFile=
_DestFile=
##### error message
_ErrorMessage="${_ErrorMessage}rsyncCentral Usage : <SourceFile> <DestFile>"
_ErrorMessage="${_ErrorMessage}[-e <file1> <file2> ... | -c <file1> <file2> ... | -ssh | -test ]\n"
_ErrorMessage="${_ErrorMessage}\t-i\trsync's '--include' option\n"
_ErrorMessage="${_ErrorMessage}\t-e\trsync's '--exclude' option\n"
_ErrorMessage="${_ErrorMessage}\t-ssh\trsync's '-e ssh' option\n"
_ErrorMessage="${_ErrorMessage}\t-test\tfor debug\n"
##### error check
if [ $# -lt 2 ]; then
echo -e $_ErrorMessage 1>&2
exit 1
fi
##### get argment
_SourceFile=$1
_DestFile=$2
shift 2
for s in $@ ; do
case $s in
-e)
_Flag=exclude ;;
-i)
_Flag=include ;;
-ssh)
_SSHFlag=1
_Flag=
;;
-test)
_TESTFLag=1
_Flag=
;;
*)
case $_Flag in
exclude)
_ExcludeFileList="$_ExcludeFileList $s" ;;
include)
_IncludeFileList="$_IncludeFileList $s" ;;
*)
echo "Error with argment"
exit 1
;;
esac
esac
done
##### check file/dir exists
if [ ! -r $_SourceFile -a x = x$_SSHFlag ]; then
echo "error ... $_SourceFile isn't readable."
exit 1
fi
if [ ! -w $_DestFile -a x = x$_SSHFlag ]; then
echo "error ... $_DestFile isn't writable."
exit 1
fi
##### ssh set
if [ ! x = x$_SSHFlag ]; then
_RSyncArgment="$_RSyncArgment -e ssh"
fi
##### include file set
for i in $_IncludeFileList ; do
_RSyncArgment="$_RSyncArgment --include="$i""
done
##### exclude file set
for i in $_ExcludeFileList ; do
_RSyncArgment="$_RSyncArgment --exclude="$i""
done
##### execute
if [ x = x$_TESTFLag ]; then
rsync -auvz --delete $_RSyncArgment $_SourceFile $_DestFile
else
echo -e "\n\n\t*** Test Result ***"
echo "rsync -auvz --delete $_RSyncArgment $_SourceFile $_DestFile"
fi