ZFSのsnapshotから失われたデータを復元
1年ほど前に、LaCieの中に入っていた外付け1TBのHDDが死亡しました。このHDDの中にしか残していないデータが多数あって、かなりの物が消失したと思われ…。(泣)
外付けHDD壊れた
Macbook Pro本体のSSDや、FreeBSD上に構築しているNASの容量が不足していて、HDDの方に退避してたんですよね。SSDはHDDより安全だと思われますし、FreeBSDの方はZFSでミラーリングしていて、かなり安全な状態にしています。それをわざわざ、シングルディスクの危険なHDDにコピーするなんて。おかしいですよね?
ZFSには、Snapshotと言う、バックアップ機構があります。その時点のディスクの状態を保存してくれます。Snapshotを調べてみました。
# zfs list -t snapshot -r upool/home/makoto NAME USED AVAIL REFER MOUNTPOINT upool/home/oichinokata@20140330 37.2G - 273G - upool/home/oichinokata@20140927 127M - 500G - upool/home/oichinokata@20141111 27.2G - 533G -
おぉ! なんと、残っているではないですか! ちょっと古いですが。2014年11月11日までのデータには戻れそうです。外付けHDDが壊れたのは、2015年末〜2016年初だと思うので、2014年末〜2015年末までの1年間のデータが失われたことになりますが。
まずは、これらのsnapshotを書き戻す領域を確保しなければなりません。こんな時のために、3TBのHDDとケースを買ってあるのです。
玄人志向のGW3.5AA-SUP3はUASPに対応している模様
このドライブをUSB3.0でつなげたら、FreeBSDはすぐに/dev/da0として認識してくれました。超簡単です。と言うか、ケーブルをつないだだけです。
まずは、中身を確認して、GPTで初期化します。中身が空でなかったので途中で怒られています。-Fオプションで、強制的に初期化しています。
# gpart show => 34 5860533101 da0 GPT (2.7T) 34 6 - free - (3.0K) 40 409600 1 efi (200M) 409640 2337372184 2 apple-hfs (1.1T) 2337781824 262144 - free - (128M) 2338043968 2348774000 3 apple-hfs (1.1T) 4686817968 262144 - free - (128M) 4687080112 1173190872 4 apple-hfs (559G) 5860270984 262151 - free - (128M) => 34 5860533101 diskid/DISK-0123456789ABCDEF GPT (2.7T) 34 6 - free - (3.0K) 40 409600 1 efi (200M) 409640 2337372184 2 apple-hfs (1.1T) 2337781824 262144 - free - (128M) 2338043968 2348774000 3 apple-hfs (1.1T) 4686817968 262144 - free - (128M) 4687080112 1173190872 4 apple-hfs (559G) 5860270984 262151 - free - (128M) # gpart destroy da0 gpart: Device busy # gpart destroy -F da0 da0 destroyed # gpart create -s gpt da0 da0 created # gpt show => 34 5860533101 da0 GPT (2.7T) 34 5860533101 - free - (2.7T) => 34 5860533101 diskid/DISK-0123456789ABCDEF GPT (2.7T) 34 5860533101 - free - (2.7T)
そして、ZFS用にラベル付け(disk100)し、ZFSのpool(vpool)を作ります。
# gpart add -t freebsd-zfs -l disk100 da0 da0p1 added # zpool create vpool gpt/disk100 # zpool status pool: vpool state: ONLINE scan: none requested config: NAME STATE READ WRITE CKSUM vpool ONLINE 0 0 0 gpt/disk100 ONLINE 0 0 0 errors: No known data errors
ここまで来たら簡単で、リストアします。ZFSのsnapshotの呼び出しと再構築は、sendとrecvを組み合わせるだけです。先ほどの3つのsnapshotを復元しました。
# zfs create vpool/home # zfs send upool/home/oichinokata@20140330 | zfs recv vpool/home/oichinokata-20140330 # zfs send upool/home/oichinokata@20140927 | zfs recv vpool/home/oichinokata-20140927 # zfs send upool/home/oichinokata@20141111 | zfs recv vpool/home/oichinokata-20141111
こういう作業って、ZFSだと本当に楽ですね。
netatalkでアクセスできる様にします。
;
; Netatalk 3.x configuration file
;
[Global]
mac charset = MAC_JAPANESE
afpstats = yes
log file = /var/log/netatalk.log
vol dbpath = /export/netatalk/CNID
vol preset = my_default_values
[my_default_values]
file perm = 0660
directory perm = 0770
[Homes]
basedir regex = /usr/home
home name = $u-home
spotlight = yes
file perm = 0600
[ypool]
path = /ypool/home/oichinokata
spotlight = yes
file perm = 0600
[vpool-20140330]
path = /vpool/home/oichinokata-20140330
spotlight = yes
file perm = 0600
[vpool-20140927]
path = /vpool/home/oichinokata-20140927
spotlight = yes
file perm = 0600
[vpool-20141111]
path = /vpool/home/oichinokata-20141111
spotlight = yes
file perm = 0600
ypoolはhome外のバックアップ、vpool-20140330, vpool-20140927, vpool-20141111が今回リストアした物です。これらを組み合わせて、なるべくデータを復元します。
なお、差分は、次のdiffコマンドで調べてあります。
# diff -qr /vpool/home/oichinokata-20140330 /vpool/home/oichinokata-20140927 > diff-20140330-20140927.txt # diff -qr /vpool/home/oichinokata-20140927 /vpool/home/oichinokata-20141111 > diff-20140927-20141111.txt # diff -qr /vpool/home/oichinokata-20141111 /ypool/home/oichinokata > diff-20141111-ypool.txt
さあ、どこまで復旧できるでしょうか? 今年のイースターは過ぎてしまいましたが、失われたデータを復活できるかな?
ディスカッション
コメント一覧
まだ、コメントがありません