[ TOP | Recently ]

2008-03-20 raidframeチューニング

1T×5を買ってきてNetBSDのraidframeでRAID5を組んだはいいが、いろいろハマってしまった。
列挙すると、

  • 1T*5で4Tのraid5にしたが、そもそも 2T overの時点でdisklabelが書けない。disklabelの総セクタ数は32bitなのです。(512byte/sectorだと、2T=0xFFFFFFFFセクタ)
  • NetBSD-current で MULTIPROCESSOR で raid5 を使うと panic (たぶんcurrentのバグ)
  • 異様に遅い

といったところ。順に解決していこう。

2T overのdiskはそもそもdisklabelでは管理できないので、別の仕組みが必要。
diskまるごと使うので newfs /dev/rraid0d (whole disk) とすればいい気もするが、そもそも disk type 等の情報が保存できないので、これもできない。
こういう時NetBSDでは gpt と wedge を使う。

gpt で disklabel 以外の方法でパーティション情報を定義してやる。gpt(GUID)についてはこのへん参照
NetBSD では、

# gpt create raid0
# gpt add raid0
# gpt show raid0
       start        size  index  contents
           0           1         PMBR
           1           1         Pri GPT header
           2          32         Pri GPT table
          34  7814100093      1  GPT part - NetBSD UFS/UFS2
  7814100127          32         Sec GPT table
  7814100159           1         Sec GPT header

とすれば確保できる。gpt add で全領域をデフォルトでfilesystemとして確保される。
gpt show の結果は、34セクタ目から7814100093セクタ分がNetBSD用に確保されていることを示している。
(最初と最後にGPT headerがあるのはバックアップらしい)

gpt add しただけだと「GUIDパーティション情報をディスクに書いただけ」なのでまだ使えない。
このパーティション情報とブロックデバイスを紐付けるのが、dk (wedge) である。

# dkctl /dev/rraid0d addwedge dk0 34 7814100093 ffs

とすることで、「rraid0d の 34 セクタから 7814100093 セクタ分を、dk0 (/dev/dk0) に割当てる」ことができる。
ちゃんと disk type 情報等も保持してくれるので、newfs もできるようになる。あとは

# newfs /dev/rdk0
# mount /dev/dk0 /mnt

で、2T overなディスクでも問題なく使用可能となる。

gptパーティション情報は、disk を attach する時に自動的に見てくれて、一度でも addwedge されていれば disk attach 時に自動的に addwedge してくれる。
ので、一度 gpt を作って addwedge しておけば、次回起動時は手動で dkctl する必要な無い。
逆に、自動的に addwedge されるので、gpt を作りなおしたりする場合は delwedge 忘れ (dkctl /dev/rraid0d delwedge dk0) に注意。


次こそチューニング…


EOF