zpool が ZFS-8000-5E のエラーで壊れた2020年08月30日 04時57分26秒

外付けの USB ディスクで使っている ZFS が壊れた。最近、接続時のデバイスの認識に時間が掛かるときもあるなと思っていたディスク。

事の発端は、USB ケーブルを付け変えて起動する PC を変えた後。電源を入れるが、どうもデバイスが認識されていない。他にあり起動時に ZFS よりも先にマウントされる UFS パーティションの認識に失敗しシングルユーザモードに落ちた。そのため、一度電源を落し、電源ケーブルも含めて全部接続しなおした。二度目は UFS のマウントはうまくいき、ZFS のマウントの段階になった。ここで、失敗したので、再度電源を落し、物理接続の再確認。これを二、三回行った後に起動できたが、ZFS がマウント出来ていない。zpool status で調べると破損とのこと。

プール名は scratch。名前通りに雑多なファイルの置き場所。

# zpool status scratch
  pool: scratch
 state: FAULTED
status: One or more devices could not be used because the label is missing 
        or invalid.  There are insufficient replicas for the pool to continue
action: Recovery is possible, but will result in some data loss.
        Returning the pool to its state as of Wed Aug 26 23:33:01 2020
        should correct the problem.  Approximately 2589 minutes of data
        must be discarded, irreversibly.  Recovery can be attempted
        by executing 'zpool clear -F scratch'.  A scrub of the pool
        is strongly recommended after recovery.
   see: http://illumos.org/msg/ZFS-8000-5E
  scan: scrub repaired 0 in 7 days 02:48:12 with 0 errors on Tue Mar 26 23:33:37 2019

        NAME                    STATE     READ WRITE CKSUM
        scratch                 FAULTED      0     0     1
          14468974728316441802  FAULTED      0     0     6  was /dev/da0s4g
# zpool clear -F scratch
internal error: Integrity check failed
Abort (core dumped)
# zpool clear -Fn scratch
internal error: out of memory
エラーがメモリが足りないと出たので、搭載メモリの多い機械に繋ぎ変えて復旧を試みてみたが、相変わらず out of memory。5GB 以上の割当機で失敗し、top でメモリ利用量を見ても変わらない。

折角なので truss で様子を見てみた。

mmap(0x0,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 545128448 (0x207e0000)
mmap(0x0,8192,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 545136640 (0x207e2000)
ioctl(3,0xc0145a21 { IORW 0x5a('Z'), 33, 20 },0xffdfc408) ERR#97 'Integrity check failed'
internal error: out of memory
write(2,"internal error: out of memory\n",30)    = 30 (0x1e)
process exit, rval = 1
mmap は大量に行っているが、物理メモリはまだ余裕があった。どうも ioctl の失敗が原因の様だ。

ZFS-8000-5E を見るとそちらは復旧は無理とある。バックアップからデータを戻せと指示。手元では一応復旧出来そうな雰囲気だが、ioctl が失敗している現状では無理な感じだ。