2004年08月10日

ファイル型バックアップでスナップショットを取る pdumpfs

ディレクトリ単位でバックアップを指定でき,なおかつdumpコマンドのように毎日のスナップショットを効率良くとってくれる便利なツールが,pdumpfs: Plan9もどきのバックアップシステム である.これをFreeBSDで使ってみた.

使い方は至って簡単で,バックアップ対象となるディレクトリと,保存先を指定するだけ.
% pdumpfs <対象ディレクトリ> <バックアップ先>
バックアップ対象は,ディレクトリでなければならない.ファイルやシンボリックリンクは指定できない.また,ルートディレクトリは指定できず,システム全体まるまるバックアップといった用途には向いていないといえる.

バックアップ先では,
/.../2004/08/06
/.../2004/08/09
といった日付のディレクトリが作られ,その下にデータが格納される.毎日異なるディレクトリにバックアップファイルが作成されるのであるが,更新されなかったファイルはハードリンクとして記憶され,ディスクの容量をほとんど消費しない仕掛けとなっている.ハードリンクのうまい使い方だ.

例えば,次のようなスクリプトを準備すれば,システムの大部分のバックアップができる.

#!/bin/sh
PDUMPFS='/usr/local/bin/pdumpfs'
PATH=/usr/local/bin:$PATH
${PDUMPFS} ${OPTIONS} /bin /backup
${PDUMPFS} ${OPTIONS} /boot /backup
${PDUMPFS} ${OPTIONS} /etc /backup
${PDUMPFS} ${OPTIONS} /home /backup
${PDUMPFS} ${OPTIONS} /modules /backup
${PDUMPFS} ${OPTIONS} /sbin /backup
${PDUMPFS} ${OPTIONS} /stand /backup
${PDUMPFS} ${OPTIONS} /tmp /backup
OPTIONS="--exclude '^/usr/ports' --exclude '^/usr/obj' --exclude '^/usr/src'"
${PDUMPFS} ${OPTIONS} /usr /backup
OPTIONS=""
${PDUMPFS} ${OPTIONS} /usr/src/sys /backup
${PDUMPFS} ${OPTIONS} /var /backup
# root in last, for log file
${PDUMPFS} ${OPTIONS} /root /backup

実際に,システム全体のバックアップを別のディスクに取ってみた.初回のバックアップではディスクの使用量は6.8GB増加したが,その数日後のバックアップでは0.1GBしか増加しなかった.

バックアップ実行前:
shell# df -kh
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 984M 236M 670M 26% /
/dev/ad0s1e 984M 2.1M 903M 0% /tmp
/dev/ad0s1g 3.8G 1.3G 2.2G 38% /usr
/dev/ad0s1h 19G 5.3G 12G 30% /usr/local
/dev/ad0s1f 1.9G 37M 1.7G 2% /var
/dev/ad2s1e 38G 2.4G 32G 7% /backup
procfs 4.0K 4.0K 0B 100% /proc

初回バックアップ直後:
shell# df -kh
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 984M 224M 681M 25% /
/dev/ad0s1e 984M 2.1M 903M 0% /tmp
/dev/ad0s1g 3.8G 1.3G 2.2G 38% /usr
/dev/ad0s1h 19G 5.3G 12G 30% /usr/local
/dev/ad0s1f 1.9G 37M 1.7G 2% /var
/dev/ad2s1e 38G 9.2G 26G 26% /backup
procfs 4.0K 4.0K 0B 100% /proc

数日後にバックアップした直後:
shell# df -kh
Filesystem Size Used Avail Capacity Mounted on
/dev/ad0s1a 984M 251M 654M 28% /
/dev/ad0s1e 984M 2.1M 903M 0% /tmp
/dev/ad0s1g 3.8G 1.3G 2.2G 38% /usr
/dev/ad0s1h 19G 5.3G 12G 30% /usr/local
/dev/ad0s1f 1.9G 37M 1.7G 2% /var
/dev/ad2s1e 38G 9.3G 25G 27% /backup
procfs 4.0K 4.0K 0B 100% /proc

これを cron を使って,毎日呼び出すにはこうすればいい.
shell# crontab -e
# 02:00 every day
0 2 * * * /root/pdumpfs/pdumpfs.sh > /root/pdumpfs/log 2>&1

これで,毎日のシステム管理作業を思いきり良く,失敗を恐れずにできる.
また,このソフトは開発メンテナンスが最近も継続されている点もうれしい.