birdpdumpfs のアーカイブ領域を移動する

pdumpfs のアーカイブ領域を移動する

僕は現在、この web サーバ等をサービスしている Debign GNU/Linux サーバを、pdumpfs を使って日々バックアップしています1。pdumpfs は、毎日バックアップ対象として指定したディレクトリツリーの完全なコピーをバックアップしつつ、前日から変化のないファイルについてはハードリンクを使うことでバックアップ先ディスクの容量を節約できることが特徴のツールです。pdumpfs のバックアップ先は対象ディレクトリツリーの daily snapshot のような形になっていて、そのまま自由にアクセスできるので、誤って消してしまったようなファイルも後日簡単に取り出すことができます。

ただ、僕のように「メイン HDD のほぼ全域を毎日バックアップ」というような使い方をしている場合、絶対的なディスク領域は確かに節約できるのですが、ディレクトリエントリの数 (見た目のファイル数) がべらぼうな数になります。そのべらぼうな数のファイル (ハードリンクされたファイル) が、いざ pdumpfs のアーカイブ領域 (pdumpfs のバックアップ先) を移動しようと思った時に、やっかいな障害になります。

今回、アーカイブ先として使っていた外付け USB HDD を交換したいと思い、別のやっぱり外付け USB HDD にアーカイブ全体をコピーしようとしました。

最初、何も考えずに tar を使って次のように実行してみました2

# (cd /mnt0 && tar cf - *) | (cd /mnt1 && tar xvfp -)

一番最初にトライしたときは、2つの USB HDD を USB 1.1 のホストに接続していたため (ThinkPad X20 の本体 USB 端子はなんと USB 2.0 未対応なのです)、df で確認した転送スループットを元に軽く計算してみたバックアップ完了までの時間がとんでもないことになりそうだったので、早々に止めて、急遽 CardBus の USB 2.0 インターフェイスカードを 3,000 円くらいで買ってきて繋ぎなおしました。

さて二度目のトライ。最初のうちこそ順調に処理されているように見えたのですが、大量のハードリンクを含む pdumpfs 領域を処理し始めると、tar のプロセスサイズがみるみるふくらみ、CPU 利用率も 100% に張り付き、最後にはマシンがダウンしてしまいました (昨日このサイトにアクセスできなかったのはそのダウンが原因です)3。何か別の手を考えなければなりません。

僕が pdumpfs でバックアップを取り始めたのは去年の 8 月くらいのようですが、そもそも、去年の8月からのすべての daily backup を保存しているのはちょっと無駄です。元々その外付け HDD の容量が逼迫してきたら、一定期間よりも古いバックアップは順次消していこう、と考えていましたが、軽くググってみたところやっぱり似たように思っていた人はいて、pdumpfs-clean というツールが作られていました。僕は単純に「一定期間よりも古いものは全削除、それ以降は全保存」としか考えていませんでしたが、このツールは「古くなるに従ってだんだん密度が薄くなっていくような残し方」ができるようになっています。つまり、直近 30 日はすべて残すけれども、それより古いものは週次、月次、年次でのみ残す、という指定が可能になっています。

早速このツールをダウンロードし、以下のように実行してアーカイブを掃除しました。

# ./pdumpfs-clean -k 99Y99M99W99D -v /mnt0/time_machine  

pdumpfs-clean のおかけでかなりアーカイブ先のファイルも減り、うまくすれば今度は tar でもうまくいくかもしれなかったんですが、どうせなら、と思い、pdumpfs のアーカイブを移動する方法をググってみました。すると、鵜飼さんの次のような記事を見つけました。

pdumpfsした領域をコピーする時は、rsyncしてpdumpfs -d 日付 でがんばるよりも、昨日のぶんをcp –link -aしてきてその上にrsync -a –deleteかけるほうが早いような気がするがどうだろうか。

鵜飼さんの示されたサンプルコードは下記の通りです。

today=2002/06/04  
end=2003/12/31  
mkdir -p /archive/${today}  
while test "$today" != "$end"  
do  
 cd /archive/${today}  
 rsync -a --delete hikaru.fsij.org::archive/${today}/ .  
 tomorrow=$(date -d "next day ${today}" +'%Y/%m/%d')
 mkdir -p /archive/$tomorrow  
 cp --link -a . /archive/$tomorrow  
 today=${tomorrow}  
done  

そこで、上記鵜飼さんのスクリプトを若干修正して4、以下のようなスクリプトでコピーしてみることにしました。

#!/bin/bash  
  
if [ $# -lt 4 ]; then  
        echo "$0: $0 [START_DATE] [END_DATE] [SRC_DIR] [DST_DIR]"  
        exit 0  
fi  
  
start_date=$1  
end_date=$2  
src_dir=$3  
dst_dir=$4  
next_date=""  
before_date="x"  
  
copySnapshot() {  
        echo -n "Copying ${start_date} "  
        mkdir -p ${dst_dir}/${start_date}  
        echo -n "."  
        cd ${dst_dir}/${start_date}  
        echo -n "."  
        if [ -d "${dst_dir}/${before_date}" ]; then  
                cp --link -a ${dst_dir}/${before_date}/. .  
        fi  
        echo -n "."  
        rsync -a --delete ${src_dir}/${start_date}/ .  
        echo " done."  
}  
  
while [ "$start_date" != "$end_date" ]  
do  
        copySnapshot  
        next_date=$(date -d "next day ${start_date}" +'%Y/%m/%d')
        until test -d "${src_dir}/${next_date}"  
        do  
                next_date=$(date -d "next day ${next_date}" +'%Y/%m/%d')
        done  
        before_date=${start_date}  
        start_date=${next_date}  
done  
copySnapshot  

今のところそれなりにうまく動いている感じですが、完全に無保証ですので利用される際は注意してください。


  1. デジカメデータやらなにやら最近は結構たくさんある唯一無二のデータも、あゆみさんマシンとこの Linux box 双方に置くことで冗長化し、かつ外付け disk にもバックアップする、という形で運用しています。 ↩︎

  2. 一部のページでは「tar はハードリンクを保存してくれない」と書かれていることがありますが、少なくとも Debian に入っている tar はちゃんと保存してくれるようです。 ↩︎

  3. 後でログを見ても特に変なエラーは書かれておらず、見たところいきなり電源が落ちてしまったようにしか見えませんでした。 ↩︎

  4. pdumpfs-clean によって歯抜けになったアーカイブでも大丈夫なように対応したり、とか。 ↩︎