どせいたんさき。

ナスダヨー

cron をつかって定期的にバックアップをとる設定メモ

先日ハードディスクが死んでしまったデスクトップですが,中を開けてみたら一台生きていたので新しいデスクトップに USB で接続してバックアップ用のハードディスクとして使うことにしました.


ハードディスクをデスクトップに接続する

なにはともあれハードディスクをデスクトップに接続しなければならないので,大学生協にて『裸族のお立ち台』の類似品が売っていたので購入.ガシャンとはめ込んでデスクトップと接続しました.

ハードディスクをフォーマットしてマウントする

続いて内容を吸い出してからフォーマット & マウントしました.ディスクのマウントに関してはこのサイトを参考にしました.マウント先は /backups としました.

バックアップ用スクリプト(bash)

バックアップには以前から使っていた rsyncスクリプトを流用します.以下のようなスクリプトです.

#!/bin/bash -f
### 
### It rsync /home and /usr/local to /backups.
###
### usage:
###   ./backup [option]
###
### There are three options available.
###    -m: monthly backup
###    -w: weekly backup
###    -d: dayly backup

### backup targets
TARGETS=("/home" "/usr/local");

### backup destination
DEST=("/backups/m" "/backups/w" "/backups/d");

### usage
usage()
{
  cat <<EOF >&2
usage:
   ./backup [option]

options:
  -m: monthly backup
  -w: weekly backup
  -d: dayly backup

description:
  It run rsync on /home and /usr/local to /backups.
EOF
  exit -1;
}


case $1 in
  "-m")
### monthly backup routine ###
    echo -e '\n###' `date` '###'
    echo "$0: Running monthly backup."
## check destination ##
    [ ! -d ${DEST[0]} ] && \
      echo "$0: error: Cannot find ${DEST[0]}" >&2 && exit -1;
## do backup ##
    for T in ${TARGETS[@]}
    do
      rsync -av --delete ${T} ${DEST[0]}
    done
    ;;
  "-w")
### weekly backup routine
    echo -e '\n###' `date` '###'
    echo "$0: Running weekly backup."
## check destination ##
    [ ! -d ${DEST[1]} ] && \
      echo "$0: error: Cannot find ${DEST[1]}" >&2 && exit -1;
##  replace older backup with newer ##
    [ -d ${DEST[1]}/3 ] && rm -rf ${DEST[1]}/3
    [ -d ${DEST[1]}/2 ] && mv ${DEST[1]}/2 ${DEST[1]}/3
    [ -d ${DEST[1]}/1 ] && mv ${DEST[1]}/1 ${DEST[1]}/2
    mkdir ${DEST[1]}/1
## do backup ##
    for T in ${TARGETS[@]}
    do
      rsync -av --link-dest=${DEST[1]}/2 ${T} ${DEST[1]}/1
    done
    ;;
  "-d")
### dayly backup routine
    echo -e '\n###' `date` '###'
    echo "$0: Running dayly backup."
## check destination ##
    [ ! -d ${DEST[2]} ] && \
      echo "$0: error: Cannot find ${DEST[2]}" >&2 && exit -1;
##  replace older backup with newer ##
    [ -d ${DEST[2]}/6 ] && rm -rf ${DEST[2]}/6
    [ -d ${DEST[2]}/5 ] && mv ${DEST[2]}/5 ${DEST[2]}/6
    [ -d ${DEST[2]}/4 ] && mv ${DEST[2]}/4 ${DEST[2]}/5
    [ -d ${DEST[2]}/3 ] && mv ${DEST[2]}/3 ${DEST[2]}/4
    [ -d ${DEST[2]}/2 ] && mv ${DEST[2]}/2 ${DEST[2]}/3
    [ -d ${DEST[2]}/1 ] && mv ${DEST[2]}/1 ${DEST[2]}/2
    mkdir ${DEST[2]}/1
## do backup ##
    for T in ${TARGETS[@]}
    do
      rsync -av --link-dest=${DEST[2]}/2 ${T} ${DEST[2]}/1
    done
    ;;
  *) usage ;;
esac

3 種類のオプションがそれぞれ monthly, weekly, daily のバックアップに対応しています.weekly, daily のバックアップについては --link-dest オプションを有効にしているため更新があったファイルだけ容量を食うようになっている……はずです.

crontab に登録して自動実行

あとはこれを cron に登録して自動で実行させます. crontab の設定については『cron の設定ガイド』を参考にしました.

# m h  dom mon dow   command
 0 5 1 * * /usr/local/bin/backup -m
10 5 * * 1 /usr/local/bin/backup -w
20 5 * * * /usr/local/bin/backup -d

これで早朝にバックアップが定期的に実行されるようになる……はずです.