[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

NetBSD ファイルサーバの構築

Table of Contents
概要: RAID 1 ファイルシステムの作成と操作 (Raidframe)
設定: RAID 1 ファイルシステムの作成 (Raidframe)
設定: RAID 0 ファイルシステムの作成 (Raidframe)
設定: RAID 5 ファイルシステムの作成 (Raidframe)
設定: RAID 1+0 ファイルシステムの作成 (Raidframe)
設定: 2TB を超えるファイルシステムを作る
運用: fsdb と find で破損したファイルを探す on NetBSD
設定: CCD (Concatenated disk driver) による RAID 0 ファイルシステム
運用: 安全側に倒したパーティッションの切り方

ファイルシステム関連の話題を一つの章にまとめ直しました。

NetBSD サーバ構築の概論は こちら 、 クライアントの構築は こちら。

概要: RAID 1 ファイルシステムの作成と操作 (Raidframe)

Raidframe を使い wd0e wd1e の2台のディスクで RAID 1 を作成する」 例を使い、 Raidframe の使い方をひととおり解説します。

Caution

ディスクは ATA や SATA という想定です。 SCSI の場合 wd を sd へ読み変えて下さい。

カーネルで有効にする

まずカーネルで Raidframe が有効になっているかどうかを確認して下さい。 現在の NetBSD GENERIC カーネルではデフォルトで有効です (昔の NetBSD では、無効がデフォルトです)。

起動時に

Kernelized RAIDframe activated
と言っていればカーネルに Raidframe は組み込まれています。

もし、組み込まれていないなら、カーネルを再構築する必要があります。 カーネルの config で次のようにコメントになっている部分

#pseudo-device  raid            4       # RAIDframe disk driver
このコメントを外し、カーネルを作りなおしてください。
pseudo-device  raid            4       # RAIDframe disk driver

/etc/raid0.conf を書く

詳しくは、raidctl(8) のマニュアルを参照。 次のような内容の /etc/raid0.conf を作成して下さい。 この例では wd0e と wd1e がペアで RAID 1 になります。

START array
1 2 0

START disks
/dev/wd0e
/dev/wd1e

START  layout
128 1 1 1

START queue
fifo 100

array の数字はディスクは ROW COLUMN SPARE です。 たいてい ROW 1 で、COLUMN はディスクの数と同じ。 スペアディスクの数は、よろしく合わせましょう。 layout の最後の数字が RAID レベルです。この例では RAID 1 。

この後、raid0.conf を Raidframe に教え込み、IDをつけます。

# raidctl -C raid0.conf raid0
# raidctl -I YYYYMMDD raid0
ID は unique なら適当で良いです。 ”-I シリアル番号”です。 適当につけると忘れるので、ぼくは日付などをつかっています。

RAID エリアを初期化する。disklabel も忘れずに

# raidctl -iv raid0
初期化後、ディスクラベルを調整し、newfs します。
# disklabel raid0 > /tmp/label
/tmp/label を適宜編集し、書き込みます。
# disklabel -R -r raid0 /tmp/label
raid0a でも raid0e でも何でもいいんですが、 ここでは raid0a にしておきます。 raid0a を作って newfs する。
# newfs -O 2 /dev/rraid0a
[1]

mount してください。

# mount /dev/rraid0a /vol
場合によっては再設定する必要があることもあるようです?
# raidctl -c raid0.conf raid0

現在のステータスを見る

復旧終了後 or 正常時の表示の様子

# raidctl -s raid0
Components:
           /dev/wd0e: optimal
           /dev/wd1e: optimal
No spares.
Component label for /dev/wd0e:
   Row: 0 Column: 0 Num Rows: 1 Num Columns: 2
   Version: 2 Serial Number: 20010220 Mod Counter: 381402380
   Clean: No Status: 0
   sectPerSU: 128 SUsPerPU: 1 SUsPerRU: 1
   RAID Level: 1  blocksize: 512 numBlocks: 3752320
   Autoconfig: No
   Root partition: No
   Last configured as: raid0
Component label for /dev/wd1e:
   Row: 0 Column: 1 Num Rows: 1 Num Columns: 2
   Version: 2 Serial Number: 20010220 Mod Counter: 381402380
   Clean: No Status: 0
   sectPerSU: 128 SUsPerPU: 1 SUsPerRU: 1
   RAID Level: 1  blocksize: 512 numBlocks: 3752320
   Autoconfig: No
   Root partition: No
   Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

修復: 基本

何らかの理由で wd1e が raidframe の制御から外れた場合の 修復を考えます。

# raidctl -s raid0
Components:
           /dev/wd0e: optimal
           /dev/wd1e: failed
No spares.
Component label for /dev/wd0e:
   Row: 0 Column: 0 Num Rows: 1 Num Columns: 2
   Version: 2 Serial Number: 20010511 Mod Counter: 381402546
   Clean: No Status: 0
   sectPerSU: 32 SUsPerPU: 1 SUsPerRU: 1
   RAID Level: 1  blocksize: 512 numBlocks: 2086432
   Autoconfig: No
   Root partition: No
   Last configured as: raid0
/dev/wd1e status is: failed.  Skipping label.
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
のように表示されている状態です。 もっともハードが完全に壊れた場合は交換しかありません。

reconsturction process は kernel thread として走ります。 raidctl で raidframe ドライバに直せと命令を送ることで 修復が始まります。

ここでは /dev/wd1e が壊れたとします。 次のように raidctl を実行してください。

# raidctl -R /dev/wd1e raid0
status をみると、修復中はこんな感じです。
# raidctl -s raid0
Components:
           /dev/wd0e: optimal
           /dev/wd1e: reconstructing
No spares.
Component label for /dev/wd0e:
   Row: 0 Column: 0 Num Rows: 1 Num Columns: 2
   Version: 2 Serial Number: 20010511 Mod Counter: 381402546
   Clean: No Status: 0
   sectPerSU: 32 SUsPerPU: 1 SUsPerRU: 1
   RAID Level: 1  blocksize: 512 numBlocks: 2086432
   Autoconfig: No
   Root partition: No
   Last configured as: raid0
/dev/wd1e status is: reconstructing.  Skipping label.
Parity status: DIRTY
Reconstruction is 1% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
この時のカーネルメッセージはこんな感じです。
SCSIRATE == 0x0
wd1(ahc1:2:0): Queuing a BDR SCB
wd1(ahc1:2:0): Bus Device Reset Message Sent
raid0: node (Wsd) returned fail, rolling forward
raid0: node (Wsd) returned fail, rolling forward
wd1(ahc1:2:0): no longer in timeout, status = 0
raid0: node (Wsd) returned fail, rolling forward
ahc1: Bus Device Reset on A:2. 4 SCBs aborted
ahc1: target 2 synchronous at 10.0MHz, offset = 0xf
raid0: node (Wsd) returned fail, rolling forward
Rebuild: 0 1
Closed the open device: /dev/wd1e
About to (re-)open the device for rebuilding: /dev/wd1e
RECON: initiating in-place reconstruction on
       row 0 col 1 -> spare at row 0 col 1
Quiescence reached..

修復: ハードウエア障害 → ディスクの変更

# raidctl -s raid0
Components:
           /dev/wd0f: failed
           /dev/wd1f: optimal
... 以下、略 ...
となっている時に、 dmesg を見ると明らかにハードウエアのエラーが始まっている場合があります。 たとえば、以下の例です。
wd0: (uncorrectable data error)
wd0f: error reading fsbn 22965696 of 22965696-22965727 (wd0 bn 52584831; cn 52167 tn 7 sn 54)wd0: (uncorrectable data error)
もちろん wd0f だけ使わないようにすれば、しばらくは使えるものですが、 無理に使っていて突然壊れても困るので、 とっとと交換するべきです。

この場合に選択肢が2つあります。

(1) wd0 のハードウエア交換。 ようするに新しいディスクを買ってくる場合です。 これは簡単で、ディスクを交換して、 上述の -R オプションで rebuild します。

(2) wd0 をやめて、別のディスクへ移動する。 ソフトウエア的に on the fly で直すということですね。 なかなか止められないとか、 wd0 と wd1 ではなく wd1 と wd2 へ移行する思惑とか、 単なる現状復帰ではない場合でしょう。

手順は、これだけです。


01. スペア wd2f を追加。

02. -F で rebuild する。表示は wd0f が spare、wd2f が used_spare へ。

03. raid0.conf の wd0f を wd2f へ書き換える。
ステップ 03. でディスクの順番を入れ替えないように注意してください。

次回 raid0 は wd2f と wd1f の RAID 1 になります。

Q&A: [raid0] とかの名前って変えられますか?

/etc/raid0.conf の名前を好きな「raid数字.conf」に変更すれば OK。

RAIDFrame のデバイス名 raid0 や raid1 は起動時に /etc/rc.d/raidframe が /etc/raid0.conf に対して

raidctl -c raid0.conf raid0
を実行するというように初期化を行なっているだけですので、 raid0.conf を raid2.conf に変更すれば次からは raid2 になります。

/etc/fstab の変更も忘れないように!

Q&A: Mod Counter がマイナスだけど、どうしましょ?

よくわからないけど、 初期化のあと raidctl -s した時に、 Mod Counter: が負になっている時がありますね。

# raidctl -s raid0
Components:
           /dev/wd0e: optimal
           /dev/wd1e: optimal
No spares.
Component label for /dev/wd0e:
   Row: 0 Column: 0 Num Rows: 1 Num Columns: 2
   Version: 2 Serial Number: 20140511 Mod Counter: -281402546

一度 raid0 の設定を壊して、wd0e wd1e をゼロで初期化とかすると直るみたい。

# raidctl -u raid0
# newfs -O 2 /dev/rwd0e
# newfs -O 2 /dev/rwd1e
注意: raid0a ではなく、wd0e wd1e の newfs です。

このあと、もう一度 raid0 を作りなおすと正常な Mod Counter になりますな。

Notes

[1]

オプション -O 2 は FFSv2 を使えという指示です。 このオプションがないと伝統の FFS (FFSv1) を使います。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >