Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

ada1p1みたいな形式でzpoolにattachしたディスクをgptラベルで再認識させるのは不可能っぽい

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}p1raidz1-0にぶら下がっているのがわかる。ちなみにada0にはシステムパーティションが収まっている。

GPTパーティションラベルあると便利

ところでada1とか言われてもどこに差さっているディスクなのか分からないという問題があった。geom disk listとかやったらシリアルナンバを控えられるのでこれをもとに辿ればよいのだが、そんな面倒をやりたくない。

ところで、zpoolにattachするときは命名規則つきのGPTパーティションラベルでやるといいですよ、という知見がある。

jyuch.hatenablog.com

つまり、フロントベイ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みたいな名前)で既にマウントされている場合は出現しないという点に注意が必要である。

forums.freebsd.org

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環境ではそもそもディスクを減らすこともできないので困る。

dan.langille.org

予備ディスクたらいまわし方式

そういえば先日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
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?