zfsとFreeBSDとギガバイトのMBとhdparm

概要

ガバイトマザーボードのHPAに呪われたzfsのディスクはknoppixとhdparmで救えた

むき身のHDDを箱に入れる作業は簡単なはずだったのに

ZM-HDR1というHDD用の箱にHDDを入れたんだけど、これちょっとマウンタをケースに押し込むときにコツが必要で、ちゃんと押し込めないと当然認識せず、あれーおかしいなぁとか言いながらHDDを挿す場所替えたりとかしたのが敗因。

つい余計な作業をしてしまい

BIOSアップデート&今までSATAカードに刺さってたSATAHDDをオンボードの方に差し替えた
(ちなみにマザーボードGIGABYTE GA-G31M-ES2L rev1.1で元のBIOSはF5。最新のF10にした)
HDD認識しないなーとか言いながらメーカーサイト見てたらBIOSの最新版が目に入って、そういえばこのマザーボードUSBメモリから起動するとHDD認識の順番が変わっておかしいんだよなーとか思いながらBIOSアップデートしてしまったんだよ

そして起こる悲劇

プールが見えなくなったのでとりあえずexportしてimportし直してみようと思ってexportしたけどimport出来ない
ここからおなかが痛くなりはじめる
うちの旦那のアニメコレクションとか怪しい伝説とかアメリカンチョッパーとかウィスカーズとか全滅all\(^o^)/とかどうしたらいいのー

必死でググる

failed to unpack label zfsでググって一番始めに出てきた日本語の情報
d:id:navyfox:20091129
NavyFoxさんの日記が似た状況で必死で内容を読んだ
自分でもzdb -l /deb/ad4とかやって先頭のラベル(LABEL 0と1)が生きているのとラベルが正常なHDDと比較してシリンダ数が足りなくなってるっぽい事も判明
HDDが壊れたのではなくてBIOSが何かやらかしてHDDの容量が小さくなってるんじゃないか、それならデータは生きてるはず!とあきらめずすんだ
NavyFoxさんの日記と状況が同じだったので書いてあるとおり翌日HDDを買って来て作業することに。

お店が開くまでの時間もzfsとかfailed to unpack labelでググりまくったらマザーボードbios替えてジオメトリがおかしくなってるならbios戻したら良いじゃん的な海外フォーラムの記事を見つけて作業をしたけど駄目だった

11時にお店が開くのを待ってお買い物に

とかつぶやきつつお出かけの支度。出かけてる最中にtwitterTL見てたら師匠から@メッセージ来てた!

ガバイトマザーボードBIOSでなにやら管理する用の領域を勝手にHDDの末尾に作るらしという情報を得た!
ここからググるキーワードにHPAが追加されて何が起こってるのかやっとわかってきた

raidzだとHDDの台数が多い

http://hub.opensolaris.org/bin/download/Community+Group+zfs/docs/ondiskformat0822.pdf
NavyFoxさんが調べて記録しておいてくれたのがとても助かったzfsのラベル
ディスク末尾のラベルの位置はディスクが1台なら8192 + (asize/512)だけど、うちみたいに3台でraidzとかやってるなら
8192+(asize/HDD台数/512)
で良いみたい。
買って来たHDDにad6のバックアップをとって実験したらそれで成功した
うちのばあい
8192 + (asize 4500891107328 / disk台数3 / 512) = 0xAEA87600
だったので

# dd if=ad6.img count=0x200 of=ad6label_head
# dd if=ad6label_head count=0x200 skip 0xAEA87600 of=ad6.img

とかやってzdb -l ad6.imgってやったらちゃんとLABEL0〜3まで見えた!

knoppixとhdparmでHPAを無効にする

予算の都合でHDDを何台も買ってられないので、今あるHDDのHPAにとられた部分を取り返さないといけない。
取り戻せなければ今使ってる1.5TBよりも確実に大きいサイズのHDDが3台別に必要になるのでそれは痛い
HPAでいろいろググるlinuxのhdparmで取り戻せるらしい事が判明。linuxの入ったHDD無いからknoppixをCDに焼いた
手近にCDのメディアしかなかったのでknoppixのCD版焼いたらなかにhdparm入ってなかった\(^o^)/

# apt-get update ;apt-get install hdparm

とかやってhdparmを使える様にして

# hdparm -i /dev/sdb

でデバイスと作業したいHDDが合ってるか確認して

# hdparm -N /dev/sdb ←これをやると
/dev/sdb:
 max sectors   = 認識してるサイズ/全体のサイズ, HPA is enabled

とか出るので

# hdparm -Np全体のサイズ /dev/sdb

ってやったらHPA is disabledになってHPAの呪いが解けた!
(HDIO_SET_PIO_MODE failedとか出るけどタイミングが良いとdisableになるなんなのこれ)

そして復旧

HPAの呪いのかかった2台のHDDの呪いを解いて、先ほど計算したLABELを末尾に書いたらおkだーと思ったらLABELを書くまでも無くzpool importで認識できました。HPA領域確保だけして中身はいじって無いっぽいです?

という情報も得たので、とりあえずad6のイメージを吸い出したHDDを生け贄にマザーボードのSATA0の場所にさして起きました。
案の定、起動後にはad6のイメージの入っていた筈のzfs領域が見えなくなってたよ\(^o^)/
(HPAが作られた状態でzfs領域作ってバックアップ用に使うから良いんだけどさー)

もうギガバイトマザーボード買わない><

HPAとかzfsでググってる時に海外フォーラムで同じような事質問してる人がいて*1、フォーラムの人たちも原因不明で、俺らの為にマザーボードの型番教えてくれよって書き込みがあって、型番見たらギガバイトでした
HDDの末尾とはいえユーザに内緒で変更を加えるなんて酷すぎると思います><
とりあえずWindowsを入れない用途にはもうギガバイトのMB買うの辞めようって決意する位悲惨な出来事でした><

*1:上の方にかいたbios書き戻せよって言われてた人だと思う