NetBSD9 zfs デバイス名の変わった時

新年あけましておめでとうございます。のときにzfs遊び。

NetBSDのZFS(zpool)ではプール構築時にgptのラベル名での指定が できないのでzpoolには生の物理デバイス名が入ることになる。 もしくはgptで作成したパーティションに対するディスクの /dev/dkN が入る。 これ結構困って、接続デバイスやgptパーティションが増減して デバイス番号が変わると再起動時にzpoolを認識しなくなる。 どういうときにそうなって、どうすれば直せるのか実験。

前提: mirror化のzpoolの2つのデバイスが A と B だとする。 zpool名が pool だと仮定。

実際には A=/dev/wd2d, B=/dev/wd3d で実験。

  1. AまたはBどちらか片方だけデバイス名が変わる:

    リブート後: 認識する

  2. AとB両方のデバイスが変わる:

    リブート後: 認識せず

    対策: zpool export pool; zpool import -f pool

ということで、1個でも元のデバイス名と同じならIDを比べてくっつけてくれ るようだが、以前のデバイス名とどれも一致しない場合は見つけてくれない。 そんな場合はこういう風になってとっても不安。

zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
pool      -      -      -         -      -      -      -  UNAVAIL  -

statusを見ると一応記録は残っている。

zpool status
  pool: pool
 state: UNAVAIL
status: One or more devices could not be opened.  There are insufficient
        replicas for the pool to continue functioning.
action: Attach the missing device and online it using 'zpool online'.
   see: http://illumos.org/msg/ZFS-8000-3C
  scan: none requested
config:

        NAME                      STATE     READ WRITE CKSUM
        pool                      UNAVAIL      0     0     0
          mirror-0                UNAVAIL      0     0     0
            2964961224200736063   UNAVAIL      0     0     0  was /dev/wd2d
            17056533253814297529  UNAVAIL      0     0     0  was /dev/wd3d

残っているのでこのままだと元のpool名ではimportできない。 それゆえ export してから import -f する。export の代わりに destroy でもよい。