Skip to content


FreeBSD+ZFSで4KBセクタのAFT HDDを扱う

物理フォーマットが4KBセクタのAFT HDDを効率的にアクセスするためにはブロック開始位置とセクタアクセスサイズの両方を合わせないといけない。

gnopを使う方法は探せば結構出てくるような気がするけど、再起動の度に再度gnopを使ってNOPを作成しているケースが多いように思う。NOPを使う目的は4KBセクタのデバイスだと騙し続ける事ではなくzfsが4KBセクタ境界でアクセスする様にashift=12のpoolを作成する事なので、poolを作った後はNOPを再作成する必要は無い。
zfs自体はデバイスがなにであろうとpoolの構成デバイスを適当に認識して取り込むので問題ない筈(をい)。

というような事を踏まえ、3TBのHDDを5つ買ったのでこれでraidz2のpoolを作成した際の作業メモ。

2014-09-29 追記

FreeBSD 10.xでは構築時に下記のNOP作業等しなくても4KBセクタと認識してashift=12のpoolが作成されます。
gpartを”-a 4k”でパーティションを切っておくだけで済むので非常に楽になりました。

 

開始位置の合わせ方

gpartでパーティション作成時にブロック開始位置を4K境界で作成する。

“da0″~”da4″が今回新たに追加するHDD、”data”が作成するpool名。

パーティションサイズをめいっぱいにしないでサイズを指定しているのは、HDDに障害が発生して交換する時、サイズが足りなくて泣かなくて済む様にちょっとだけ天使の取り分を残しておくため。

 

zfsでセクタアクセスサイズを4KBにする

zfsがデータをアクセスするサイズは各poolのashiftプロパティが保持している。

512byteセクタ:ashift=9

4KBセクタ: ashift=12

この値はpoolを作成時に決まった後は変更されないし、変換するには現在の処pool自体を再作成するしかない。また、現在(FreeBSD 9.0Release-p3)、AFTを自動で判別してashift=12とはならない。

※ FreeBSD 10.0では自動でashift=12となる様になった(FreeBSD 10.0-p8で確認) 2014-09-29追記

そこでgnopで論理セクタサイズ4KBの透過的なデバイスを使ってashift=12なpoolを作成した後、export→gnopデバイス削除→importとする。

ashift=12で作った後に512byteセクタのディスクを入れるとあまり宜しいことにはならないが、hddのreplaceは同容量以上である必要があることを考えると2TB以上のHDDで物理フォーマットが512byteのものと入れ替える事はまずないので良しとする。

zdbの出力を見てると判る通り、zfsのashift値はデバイス個別ではなくpool単位のプロパティとなっている。つまり512バイトセクタか4KBセクタかはpool毎でどちらかになる。このことから512byteセクタと4KBセクタのHDDを混在したpoolもあまり宜しくないと思われるので、混在はしない方向で統一する。

デバイスを差し替えるとzpool statusで表示されるデバイス名が長ったらしいgptidになってしまう事がある。見た目がわかりにくいだけでなく、障害が発生したときにどのHDDなのか判りにくくなるので、そうならない様に/boot/loader.confに以下を追加しておく。※FreeBSD 10.0化に伴い内容変更。2014年2月26日

この後、古いpoolから

によりデータを移行し作業終了。

 

2012年7月4日追記

同じ4.11TBのデータをバックアップpoolから戻すのに要した時間はそれぞれ以下の通りでした。

ashift: 9  6時間48分

ashift: 12 6時間6分

2012年7月5日修正

gptパーティションを切るところで余計な”-s gpt”が入っていたので削除。

ashiftプロパティとpoolの関係を追記。

2012年8月10日追記

man zpool…と見ていて”zpool create [-fn] [-o property=value] …”の記述でフト思いついたが、わざわざgnop云々とかやらなくてもいきなり”zpool create -o ashift=12″でpoolを作ってもいけそうな気がする。次に追加するときに試してみよう。

2012年8月12日追記

zpool createでashift=12を試してみた。

# zpool create -o ashift=12 foo /tank/test.dat
property ‘ashift’ is not a valid pool property

どうやらまだ指定できるpropertyとしてサポートされていないらしい。

2013年10月01日追記

この夏の暑さを越えて気が緩んだのかda2のHDDが壊れた。

そこでamazonから同容量のHDDを買って入れ替えを行った。
まずはデバイスを認識している事を確認。

続いてgpartテーブルとパーティションの作成。

そしてリプレースの実行。

直後のstatusはこんな感じ。
終了まで45時間45分!

でも、しばらくすると理性的な(?)時間表示に変わるのでひとまず安心。

あとは同期が完了するまで放置。

約7時間半で完了していました。
zfsはこのあたりが非常にお手軽。

2014年2月26日追記

FreeBSD 10.0でkern.geom.label.~系のパラメータが増えていた。

そこで、gptラベルは有効にして、ディスクIDは表示しない様に/boot/loader.confの記述を見直した。

Posted in FreeBSD.

Tagged with , , , .


2 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. ささみ says

    参考にさせてもらって3Tx8のraidzを組みました。
    1つ疑問に思っていることがあるのですが・・・。
    HDDが壊れて交換する場合に、*.nop でついかするべきなのでしょうか?
    交換するHDDのnopを作成してリプレース
    その後、export>nop削除>import ですか?

    • kannose says

      nopは仮想的なデバイスでI/Oは透過です。
      問題はzfsがどう認識するかですが、poolが認識するashift値は一つだけですので、最初にashift=12でpoolを構築した後は気にせずそのままaddでもreplaceでも行えばいいと思います。
      もちろん一つのpoolに物理4KBセクタのHDDと512BセクタのHDDの混在はないという前提で。
      将来バージョンでどうなるかは判りませんが、少なくとも今のzpoolではそうなります。