壊れたファイルシステムの保存・復元作業
rsync
- TOP
- Old Archives
- 壊れたファイルシステムの保存・復元作業
先日の騒動、無事btrfsの修復ができたが、損失の可能性がある。 そこで、バックアップを利用して損失があった場合に備える。
基本的な考え方としては、損失がある可能性のあるファイルを上書きせずにバックアップし、その上でrsyncによりバックアップの更新を行う。
完全なsnapshotを取るのではなく、データに差分があるものについて行うこととした。 つまり、全データについて、実際に読んで、比較することになる。
まずは待避先となるサブボリュームを用意する。
# btrfs subvolume create escaped_snap
次に、さらに別のサブボリュームを用意し、そこに全データをコピーする。今回はディスクに余裕があるので、不安定なデスクトップの稼働時間を抑えることを優先した。
# btrfs subvolume create dest2
# umount /WorldMirror
# mount -o gzip,noatime,space_cache,subvol=dest2 /dev/mapper/btrvolume01 /WorldMirror
最初はrecursiveにファイルを探索して、cmpで比較し、差分があるものについてコピーしようとした。
#!/usr/bin/zsh
# $1 = olddir
# $2 = newdir
# $3 = snapshot base dir
setopt extended_glob
cd "$1"
for i in **/*(#qD.)
do
print ">>$i"
if cmp "$i" "$2/$i"
then
print "OK"
else
sha256sum "$2/**/$i" > /tmp/rec-dir-cmpsnap-sum
sum=$(sha256sum "$i" | cut -d " " -f 1)
if ! fgrep -q "$sum" /tmp/rec-dir-cmpsnap-sum
then
tar cfv - "$i" | (cd "$3"; tar xf -)
fi
fi
done
rm /tmp/rec-dir-cmpsnap-sum
だが、うまくいかなかった。理由はよくわからなかったが。
そこで、再帰的なチェックサム差分のためにrsyncのdry-runを使う。
rsync -cvna /mnt/3/ /Worldmirror/ > rsyncdiff.result
/mnt/3
には元々の、上書きされていないバックアップがある。
dry-runなので、これによってコピーされようとしているファイルが出力される。
-c
オプションでチェックサム比較しているので、「バイナリ的に違いがある、または新しいコピーには存在しないもの」がリストアップされる。
これで転送に関する余分なメッセージを削除すればファイルリストができる。 今回はファイルリストにmvした300GBを越えるファイルがあるので、それについてはリストから削除しておく。
そしてそのリストに基づいてスナップショットへとコピー
while read
do
tar cvf - "$REPLY" | (cd /mnt/2; tar xf -)
done < ~/rsyncdiff.result2
長い道のりだった