FreeBSDのディスクデバイスの指定の話。 NetBSDの場合の似た話は2016/3/3に。
複数台 HDD を繋いでると入れ換えなどによってデバイス番号がずれてく。たとえば 3台繋いでると ada0, ada1, ada2 となるが、2台目が壊れて認識しなくなったら ada2 だったのが ada1 になる。もし、2台目の第2パーティションを swap に指定するように、/etc/fstab に
/dev/ada1p2 none swap sw 0 0
なんて書いてたら2台目壊れたときに3台目の第2パーティションになる。 またかなしいのはzfsのデバイス表示がおかしくなっちゃう。たとえば最初、
NAME STATE READ WRITE CKSUM zvz0 ONLINE 0 0 0 raidz1-0 ONLINE 0 0 0 ada0p3 ONLINE 0 0 0 ada1p3 ONLINE 0 0 0 ada2p3 ONLINE 0 0 0
みたいだったのが、デバイスずれるとこうなっちゃう(例は適当)。
NAME STATE READ WRITE CKSUM zvz0 DEGRADED 0 0 0 raidz1-0 DEGRADED 0 0 0 ada0p3 ONLINE 0 0 0 123456789 OFFLINE 0 0 0 was /dev/ada1p3 diskid/DISK-HOGE123p3 ONLINE 0 0 0 was /dev/ada2p3
一度diskid認識になっちゃうともうたいへん(起動ディスクでないなら export/import で直るらしい)。さらになぜか、diskid 認識になるとそのHDDのgpart showができなくなる(なじぇ)。
ならばラベルを使おう。
FreeBSDの場合はglabelが使えるが、GPTラベルだと一手間減らせる。 GPTパーティションを作るときに
gpart add -t freebsd-swap -s 2g -l swap0 ada0 gpart add -t freebsd-swap -s 2g -l swap1 ada1 gpart add -t freebsd-zfs -s 2g -l zfsA ada0 gpart add -t freebsd-zfs -s 2g -l zfsB ada1 gpart add -t freebsd-zfs -s 2g -l zfsC ada2
などとしておいてzpool構築時にGPTラベルを使う。
zpool create -o mountpoint=/mnt pool0 raid gpt/zfs{A,B,C}
これでデバイス番号ずれてもzpoolの構成名がぶっ壊れない!
ちなみに個人的にはgptラベルにHDDのメーカ名を入れておいて、 交換時に分かりやすいようにした。