Archive

Linuxでへなちょこバックアップ

使用している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