ディスクが壊れた。
また、だ。家の Aspire One のディスクが壊れてから、2週間も経ってないのに。
今度は研究室のサーバで、ad4 と ad6 が同じサイズのディスクで、gmirror でパーティションごとにミラーされている構成。同じサイズのディスクは研究室のあちこちで使ってるので、新品も使いかけも含めて予備もいっぱいあるので、シャットダウンして交換すればよい。
なぜ気づいたかというと、特になにか重たいプロセスが走っているわけでもないのにずっと load average が 1.0 前後で、CPU 使用率も、user が 0% なのに system が 50% になっていたりとか、なんでかなー、と思っていた。で、試しに再起動してみたら、いつまでたっても起動しないので、シリアルコンソールでのぞいてみたら、BIOS が “SATA port A にディスクがつながってないよー” と。認識すらされてないので、おそらく基板ごとディスクが壊れました (取り外すだけ外して、まだ確認してない)。
生きているほうのディスクから起動したところちゃんと起動した。Filesystem も clean である。gmirror で動いてるのだから当然といえば当然なんだけど、すごいな。gmirror status すると、全部 degraded になっている。これも当然。
それで、新しいハードディスクを入れて、ミラーを復活させるまでの作業が以下の通り。ad4 が正常に起動しているディスク、ad6 が新しいディスク、gm0 がミラー。
まず fdisk -p でパーティション (スライス) 情報が出るのを確認。
root# fdisk -p /dev/ad4
# /dev/ad4
g c969021 h16 s63
p 1 0xa5 63 976773105
a 1
これをファイル (/tmp/configにした) に落として、fdisk -f で新しいディスクに書き込めば OK.
root# fdisk -p /dev/ad4 > /tmp/config
root# fdisk -f /tmp/config /dev/ad6
******* Working on device /dev/ad6 *******
fdisk: WARNING line 2: number of cylinders (969021) may be out-of-range
(must be within 1-1024 for normal BIOS operation, unless the entire disk
is dedicated to FreeBSD)
これでちゃんと /dev/ad6s1 ができるはず。次は disklabel で同じことをして、BSD パーティションを作る。まずは確認から。
# disklabel /dev/ad4s1
# /dev/ad4s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 4194304 0 4.2BSD 0 0 0
b: 16777216 4194304 swap
c: 976773105 0 unused 0 0 # “raw” part, don’t edit
d: 16777216 20971520 4.2BSD 0 0 0
e: 8388608 37748736 4.2BSD 0 0 0
f: 268435456 46137344 4.2BSD 0 0 0
g: 662200305 314572800 4.2BSD 0 0 0
disklabel: partition c doesn’t cover the whole unit!
disklabel: An incorrect partition c may cause problems for standard system utilities
同様にファイルに落として、今度は disklabel -R で書きこみ。
root# disklabel /dev/ad4s1 > /tmp/config
disklabel: partition c doesn’t cover the whole unit!
disklabel: An incorrect partition c may cause problems for standard system utilities
root# disklabel -R /dev/ad6s1 /tmp/config
これで、/dev/ad6s1a とかが見えるようになる。
ここまでは順調だったが、新しいディスクを mirror に参加させるところではまった。普通、新しいディスクを mirror のメンバにするには、
root# gmirror insert gm0s1a /dev/ad6s1a
のようにすればよいのだが、こうすると “not all disks connected” となる。つまり、gmirror 的には昔のメンバの一覧と違う状態になっている (degraded) からなのだ。これを解決するには、
root# gmirror forget gm0s1a
とする。そうすると、壊れちゃったほうのディスク上のパーティションのことは忘れ去られるので、gmirror status でみたときの状態は complete に変わる。そこで gmirror insert すれば OK.
というわけで、すべてのパーティションを mirror して、終了。
swap はミラーしてなかったんだけど、メモリが多かったから助かったのかしらん。
あと、片方のディスクが壊れたら何か通知がくるようにしたいな…