近頃版/another blog@hatena/Wiki/BBS
< pdumpfsバックアップの移行手順を考えてみる | そうだ、京都行こう >
バックアップディスクの置き換えを目論んでいた家LinuxBoxが久々の再起動をかけてみたらなんか起動時にDMA回りでこけるようになった。しかもバックアップ側も同様の現象に見舞われる(何のためのバックアップだ!)。仕方ないのでバックアップの置き換え用にと思っていたディスクをシステムディスクに一気に昇格。
幸いLinuxBoxで動かないHDDどもは予備であるところの少し世代の新しいマシンにつないだら動いたのでデータの吸出しを。
その過程でpdumpfsによるバックアップを移行させるためにこんなスクリプトを書いた:
#!/bin/bash
#転送元のホスト名とバックアップのあるディレクトリ
SRC_HOST=192.168.0.0
SRC_BACKUP=/backup
#転送したいバックアップ名
TARGET=white
#スナップショットの一時転送先・一番古い日付のデータをtarかなんかで転送しておくと良いかも
SNAPSHOT=/snapshot/
#転送先ディレクトリ
DEST_BACKUP=/backup
#転送する日付の一覧を得る
LIST=`ssh $src_host "find ${SRC_BACKUP}/ -maxdepth 3 -type d -path '*/????/??/??' | sort"`
TEMPNAME=${DEST_BACKUP}/_tmpLATEST
for i in ${LIST}
do
echo target ${i}...
rsync -au --delete ${SRC_HOST}:${i}/${TARGET}/ ${SNAPSHOT}/${TARGET}/
pdumpfs /SNAPSHOT/${TARGET}/ ${DEST_BACKUP} > /dev/null
#pdumpfsが作った「最新の」バックアップをいったん別の名前にして退避
LATEST=`find ${DEST_BACKUP}/ -maxdepth 3 -type d -path '*/????/??/??'|sort|tail -n 1`
echo pdumpfs make backup as $LATEST , rename to $TEMPNAME
mv $LATEST $TEMPNAME
#空の「月」ディレクトリができていたら削除
TO_MONTH=`echo ${i} | sed 's/...$//'`
LATEST_M=`find ${DEST_BACKUP}/ -maxdepth 2 -type d -path '*/????/??'|sort|tail -n 1`
LS_LATEST_M=`ls ${LATEST_M}`
[ "${LS_LATEST_M}" = "" ] && rmdir ${LATEST_M} && echo remove empty directory: ${LATEST_M}
#退避しておいたバックアップを元々の名前に再配置
[ ! -d ${TO_MONTH} ] && mkdir ${TO_MONTH} && echo create month directory: ${TO_MONTH}
mv ${TEMPNAME} ${i} && echo rename ${TEMPNAME} to ${i}
done
rsyncでいったんコピーしてから処理するようになっているが、local to localだったらrsyncしない方がいいと思う。pdumpfsのソースをいじってtodayをオプションで与えられるようにするかどうか悩んだが、そんな半端で限定的な改造のほうをよりダサいと感じたのでシェル側でなんとかする泥臭い実装を選択。rsyncしてpdumpfsかける部分は「pdumpfs-rsyncとやってること一緒じゃん?」とも思ったが気にするまい。
でまあ、予想通り時間はかかった。スナップショット30個を移動させるのになんだかんだで2日ぐらい。いろいろ無造作に放り込んである私の使い方の問題もあるだろうけど。