tl;dr
- zpoolにraidz1のvdevがぶらさがっている状況下で、そのvdevに
ada1p1といった形式でattachされているディスクがある - GPTパーティションラベルのほうが分かりやすいので、
gpt/foobarとして「貼り替え」を行いたい replaceでできるかと思ったが不可能だった
zpool
自宅サーバにはRAIDZ1構成のzpoolが用意されていて、NASとして便利に使っている。
# zpool status tank
pool: tank
state: ONLINE
...
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
ada1p1 ONLINE 0 0 0
ada3p1 ONLINE 0 0 0
ada2p1 ONLINE 0 0 0
errors: No known data errors
ada{1..3}p1がraidz1-0にぶら下がっているのがわかる。ちなみにada0にはシステムパーティションが収まっている。
GPTパーティションラベルあると便利
ところでada1とか言われてもどこに差さっているディスクなのか分からないという問題があった。geom disk listとかやったらシリアルナンバを控えられるのでこれをもとに辿ればよいのだが、そんな面倒をやりたくない。
ところで、zpoolにattachするときは命名規則つきのGPTパーティションラベルでやるといいですよ、という知見がある。
つまり、フロントベイ0番目のディスクのzpool用パーティションにはf0-シリアルナンバのような命名をした上で、それを使ってRAIDZを組むと分かりやすい、という話。注意点として、ディスクに直接ラベルをつけることはできないので、いったんディスクをGPTフォーマットして、そこに1つだけ最大領域でパーティションを切り、それにラベルをつけるという方式になるということに留意する。
つまりこうなっていてほしい。
# zpool status tank
pool: tank
state: ONLINE
...
config:
NAME STATE READ WRITE CKSUM
tank ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
gpt/f1-****** ONLINE 0 0 0
gpt/m0-****** ONLINE 0 0 0
gpt/b1-****** ONLINE 0 0 0
errors: No known data errors
ところが自分の場合は既にRAIDZアレイを組んでしまっているので、既にattach済みのディスクでそれができるのかは不明だった。それを確かめてみた記録である。
ラベリングする
いったん自宅サーバの電源を落とし、ada1がどのディスクでどこに差さっていてシリアルは何で……という対応を控える。面倒だった。
次にgpartedでラベルをつけていく。
# gpart modify -i1 -l b1-274R***** ada1
この例では、ada1のindex 1のパーティション(gparted listするとどれか分かる)にb1-274R*****というラベルをつけている。b1は底面(bottom)に差さっている1番目のディスクということ。274R以降はシリアルナンバーで、ディスクを見ることで確認できるし、geom disk listしても確認できる。
変更は即時反映される。この調子でzpoolを構成する全ディスクにラベルをほどこした。
/dev/gptの注意点
GPTラベルをつけたパーティションは、/dev/gpt以下に出現する。ただし、GPTラベル以外の名前(つまり、UUIDとかada0p1みたいな名前)で既にマウントされている場合は出現しないという点に注意が必要である。
offlineにしてreplaceしようとする
ディスクがオンラインの状態では/dev/gptに出現しないので、いったんディスクをofflineにしてGPTラベル名を使ってreplaceし、onlineに戻すという手法をとることにした。が失敗。
# zpool offline tank ada1p1 # zpool replace tank ada1p1 gpt/b1-274R***** invalid vdev specification use '-f' to override the following errors: /dev/gpt/b1-274R***** is part of active pool 'tank'
内部的にはGPT UUIDでパーティションが管理されているらしく、「それ既に繋がってるぞ」と言われて先に進めない。-fオプションをつけても駄目だった。
UUIDを書き換えるといった無理をすればうまくいくかもしれない?のだが、さすがにそこまでするのもおかしいと感じたのでここで中断。
ディスクをonlineに戻す。
# zpool online tank ada1p1
mirror環境ではdetach/してからattachするという手法が使えるのだけれど、RAIDZ1環境ではそもそもディスクを減らすこともできないので困る。
予備ディスクたらいまわし方式
そういえば先日HDDを1本搭載したので、いったんこちらにもパーティションを切り、こちらをGPTラベル名指定でreplaceして、古いディスクは参照されなくなるから、今度はこれをGPTラベル名指定で別ディスクをreplaceして……というのを行えば置換できるかもしれない。しれないけどresilverで一週間はかかりそう。
こんな感じで……
# zpool replace tank ada1p1 gpt/newdisk # zpool replace tank ada2p1 gpt/was-ada1p1 # zpool replace tank ada3p1 gpt/was-ada2p1