先日の騒動、無事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

長い道のりだった

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.