ホーム便利なスクリプト達

CD-R でバックアップ


 CD-R で個人データをバックアップします。 部分バックアップを tar.gz にとり、 マルチセッションで CD-R に書き込むスクリプトです。

 私はすでに2年以上もこのスクリプトで毎週バックアップをしています。 いざという時に何度助かったかわかりません。 日ごろから手間をかけずにバックアップを取れる体制が重要だと実感しています。


必要環境と方針

 このスクリプトには sh, cdrecord, mkisofs, tar 等が必要です。 動作確認は Vine Linux 2.0 で行っていますが、 その他の Unix には多少の修正が必要かもしれません。 お気づきの点がございましたら、ぜひご教授ください。

 メディア単価が安いので、過去の記録は永遠?に保存するつもりで CD-R にバックアップを書き込みます。もちろん CD-RW にも同じ操作で書き込めます。 緊急の場合はどこででもデータを読み込めることを目指して、 よく使われる記録方法をとることにします。


マルチセッション

 私の場合バックアップ対象になるファイルサイズが 200Mbyte 程度なので、 全バックアップをとったとしても CD 1枚に収まります。 ですから、複数の CD に分割することは考えません。

 逆に1枚の CD で複数回の書き込みを行いたいので、 マルチセッションを使うことにします。 マルチセッションの書き込みに失敗したとしても、 過去のバックアップデータが読めなくなる心配はないはずです。 最悪でも mount 時に '-o session=x' オプションで 過去のセッション番号を指定すれば、 昔のように読み込めるはずです (が、そういう事故には会ったことがないです)。


tar.gz

 小心者なので、データ圧縮を行います。 tar.gz が手軽ですので、これで行きます。 ただし tar.gz だけでは、 ファイル名の一覧を見るのにも展開に時間がかかるので、 ファイル名一覧は別ファイルに無圧縮で保存することにします。 このファイル一覧は、削除したファイルを探し出すのにも有益です。

 なお、tar.gz は一部でもビット化けが起こると、 それ以降のデータは一切読めなくなるという恐い側面もありますが、 CD-ROM にはエラー訂正がしっかりと入っていますし、 過去のバックアップは蓄積されるので、 たまに全バックアップをとることにすれば問題にならないでしょう。

 それでも心配な方は afio (→Backup-mini-HOWTO(日本語)) を使うのがよいのでしょう。ただし普及率が低いため、 バックアップデータを別マシンで読み込むのに手間がかかることでしょう。 (データ盗難予防という面からは多少は安全ではあります。)


部分バックアップ

 更新ファイルのみの部分バックアップを行います。 幸い 'tar' コマンドには

 を抽出することができます。

 どちらを使うかは好みによるでしょうが、 古い hoge.tar.gz の展開ファイルや、 古いファイルを日付ごとコピー(='cp -p' ) したものが抽出される/されないという違いがあります。

 ...と書くと、後者が良いように思えますが、 'wget -m' で取ったファイルまで影響するので、悩ましいです。 たまには全バックアップをとれば解決します。:-p

 時間までの指定は必要性を感じないので特に考慮していません。 このスクリプトでは、 1日に最大1回のバックアップしか取れないということです。 ('find -mmin' などでバックアップファイル一覧を作る方法もありますね。)


設定ファイル/作業用ディレクトリ

 個人ファイルのバックアップを考えているので、 設定ファイルは "~/.backup/" 以下に置くことにします。

"~/.backup/lastbackup"
最終バックアップ日・"20010423" という書式で書きます。
"~/.backup/nobackup"
バックアップから除外するファイル・1行1ファイルで列挙します。 ユーザー名のディレクトリから書きはじめます。ワイルドカードも使えます。 最低限以下のように書いておけばよいでしょう。
username/.backup
username/.netscape/cache
username/.netscape/xover-cache
*~
"~/.backup/backup/"
一時ファイル置き場・バックアップファイルを書き込める容量が必要です。

tar.gz 制作 script

 以上の前提で、tar.gz とファイル一覧を書き出すスクリプトです。

 ファイル一覧は、tar.gz の中身ではなく、 "~/" 以下のファイルすべてについて書き出しています。 "~/.backup/backup/" の下に "2001-04-30" の形式のディレクトリを掘って、その下にバックアップファイルを作ります。

 スクリプトのオプションに '-a' を指定すると全バックアップ、 無指定で部分バックアップを行います。

backup
#!/bin/sh

cd $HOME

BACKUPDIR=.backup
DATE=`date "+backup/%Y-%m-%d"`
LASTBACKUP="--newer-mtime=`cat $BACKUPDIR/lastbackup`"
NOBACKUP=$BACKUPDIR/nobackup
TARGZ=$BACKUPDIR/$DATE/$USER.tar.gz
FILES=$BACKUPDIR/$DATE/$USER

while [ -n "$1" ]; do
	if [ "$1" = "-a" ]; then LASTBACKUP=
	else echo "unknown option $1"
	fi
	shift
done

mkdir -p $BACKUPDIR/$DATE
rm -f $TARGZ

nice -10 find > $FILES
nice -10 tar cvf - -C ../ $LASTBACKUP --exclude-from=$NOBACKUP \
	$USER/$FILES $USER/$NOBACKUP $USER | gzip -9 > $TARGZ
du $TARGZ
backup


CD-R 書き込み script

 上のスクリプトで作ったバックアップファイルを、 CD-R に書き込むスクリプトです。 root 権限が必要なところでパスワードを尋ねてきます。

 スクリプトのオプションに '-f' を指定すると新規 CD-R として、 無指定では直前のセッションに追加して書き込みます。 いずれにしてもマルチセッションで、追記可能にしています。

 標準ではオンザフライ(CD-R のイメージファイルを HD に作らない) で書き込みますが、なぜか書き込み量が少ない時に限って、 ごくたまに cdrecord が標準入力待ちで書き込み前に止まってしまいます。 '-t tmp-file' オプションで一時ファイルを作るようになりますので、 これで回避して下さい。

backup2
#!/bin/sh

DEVIN=/dev/scd0
DEVOUT=0,6,0
SPEED="speed=4"

BACKUPDIR=.backup
CDRECORD="cdrecord dev=$DEVOUT -v -eject -multi $SPEED"
MKISOFS="mkisofs -r -J -V backup"

while [ -n "$1" ]; do
	if [ "$1" = "-f" ]; then
	    echo "== 1st session =="
	    FIRST=yes
	elif [ "$1" = "-t" ]; then
	    if [ -n "$2" ]; then TMP=$2; shift;
	    else TMP=/tmp/backup-isofs.$$;
	    fi
	    echo "== temporary ISO file '$TMP' =="
	else echo "unknown option $1"
	fi
	shift
done

# not first session of multi sessiton CD
if [ -z "$FIRST" ]; then
    SECOND="-M $DEVIN -C `cdrecord dev=$DEVOUT -msinfo`"
fi

# get ISO size for "on the fly"
du $HOME/.backup/backup/
SIZE=`$MKISOFS $SECOND -print-size -q $HOME/$BACKUPDIR/backup/ 2>&1 | \
      sed -e "s/.* = //" `
echo "size = $SIZE sector  (1sector=2Kbyte)"
echo ""


if [ -n "$TMP" ]; then
    # NOT on the fly
    nice -+10 $MKISOFS $SECOND $HOME/.backup/backup/ > $TMP
    trap "rm -f $TMP" EXIT
    su -c "nice --20 $CDRECORD $TMP"
else
    # on the fly
    su -c "nice --20 $MKISOFS $SECOND $HOME/.backup/backup/ | \
	   nice --20 $CDRECORD -tsize=${SIZE}s -"
fi
backup2


実際の運用の流れ

  1. 'backup'
  2. 不要ファイルがあれば消して 1 に戻る。
  3. 'backup2'
  4. (できれば別ドライブで)焼いた CD-R の読み込みチェック。
  5. "~/.backup/lastbackup" を今日の日付に書き換えて "~/.backup/backup/*" を消去。
  6. バックアップした CD-ROM を、できれば分散して保管する。

 CD-ROM ライブによっては、マルチセッションを認識しない時があって、 何度かトレイの開け閉めを繰り返すとようやく認識することがあります。

 どんなファイルシステムについても言えることですが、 UNIX で他のユーザーに読めないようにしているファイル 'chmod 600 hoge' であっても、 メディアごと他人の手に渡ってしまえば、読まれてしまいます。 バックアップメディアもこの例外ではありません。

 火事や地震などの物理的な被害を受けることを考えると、 古いメディアは物置に移すなどの方法で、 メディアの保存場所を分散したほうがよいのですが、 データ機密を守るためには、 なおかつ盗難からも安全な場所を選ぶ必要があるというわけです。


完成する CD-ROM のファイル構成

 ユーザー hoge さんが作る CD-ROM には、 以下のようなファイルが含まれることになります。

/mnt/cdrom +- 2001-06-04 +- hoge
           |             +- hoge.tar.gz
           +- 2001-06-10 +- hoge
                         +- hoge.tar.gz
% cat hoge
.
./.acrorc
./.addressbook
./.backup
./.backup/backup
./.backup/backup/2001-06-04
./.backup/backup/2001-06-04/hoge
./.backup/nobackup
./.backup/lastbackup
./.bash_history
./.bash_logout
./.bash_profile
./.bashrc
.......
% tar tzvf hoge.tar.gz
drwxr-xr-x hoge/hoge         0 2001-06-04 03:27:37 hoge/
-rw-r--r-- hoge/hoge      1901 2001-05-28 07:28:43 hoge/.acrorc
-rw-r--r-- hoge/hoge      1591 1999-12-14 20:51:55 hoge/.addressbook
-rw-r--r-- hoge/hoge     15657 2001-06-03 05:24:28 hoge/.bash_history
-rw-r--r-- hoge/hoge        24 2000-04-19 14:43:26 hoge/.bash_logout
-rw-r--r-- hoge/hoge       239 2000-04-19 14:43:26 hoge/.bash_profile
-rw-r--r-- hoge/hoge       409 2000-04-19 14:43:26 hoge/.bashrc
........

ホーム便利なスクリプト達
リンクはご自由にどうぞ。
土村 展之(tutimura(a)nn.iij4u.or.jp) '(a)'は'@'に置き換えて
更新日 6/14 21:55, 2001