ZFSのsnapshotから失われたデータを復元

FreeBSD,Mac,NAS,netatalk

1年ほど前に、LaCieの中に入っていた外付け1TBのHDDが死亡しました。この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

さあ、どこまで復旧できるでしょうか? 今年のイースターは過ぎてしまいましたが、失われたデータを復活できるかな?

 [フリーイラスト] 金の卵の背景でアハ体験

[amazonjs asin="B009METW0O" locale="JP"]

Posted by お市のかた