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

設定: ブートドライブを RAID 1 (Raidframe)にする

Caution

通常、この設定は不要です。

つまり試験機や修行用マシンでは不要です。

サーバ機など運用ホストで software RAID 1 ブート化するよう仕様書で指示がある場合にかぎり、 RAID 1 ブート化をしてください。

NetBSD のブートドライブを Raidframe (software RAID) の RAID 1 構成にすることが出来ます。 [1]

同様の説明は NetBSD.ORG にもある( "Root Filesystem on RAID-1 with NetBSD's RAIDframe" by 故 Martti Kuparinen [2] )のですが、本家の説明は長すぎますし、 やろうとしていることが複雑すぎるんじゃないかな? もっと簡単に、かつ短くなると思うのですがねぇ… というのが以下の手順です。

手順を、ざっと説明すると、次のようになります。 インストーラは RAID 1 の上へ直接インストールしたりしてくれないため、 (1) 一旦 wd0 へ(ごく普通に) NetBSD を入れ、 (2) wd1 の上に wd0 抜きの RAID1 (わざと wd0 抜きの欠陥品)を作り、 (3) RAID 1 を rebuild することで wd1 + wd0 の RAID 1 を作ります。

以下、 STEP1 から STEP8 までに分けて説明します。

RAID 1 でブート可能にする対象は、 SATA のディスクが2つ(wd0 と wd1)ある場合とします。 なお、SCSI の場合は wd を sd に読みかえて下さい。

Caution

ちなみに、128GB より大きなディスクを使う場合、 LBA48 bug (128 GB 境界での切替え間違い)が恐いので、 パーティションレイアウトでは 128GB 部分を飛ばす (小さいパーティションをつくって飛ばしておく) と良いでしょう。セクタ番号でいうと

2^28 -1 = 268435455
です(このセクタを含むダミーの小さなパーティションを作り、それを使わない)。 Seagate [3] なら LBA48 quirk 入ってるじゃんという反論はあるでしょうが、 運用していくうちに、 違うメーカーの HDD や bug ありファームの HDD と混在するかもしれないわけですから、安全側に倒すのが運用というものです。

STEP 1: 一回 wd0 へ普通に NetBSD/i386 をインストールする

最初の一回は、wd0 へ普通に NetBSD/i386 をインストールしないといけません。 [4]

たとえば、こんな感じにパーティションを切ることにしましょう。

wd0a	/
wd0b	swap
wd0e	/other
なお wd0b と wd1b は普通に SWAP として使い、 wd0e と wd1e も普通の FFS として使うつもりの設定です。 [5]

初回の OS インストール手順 は省略します。 いつもの通りです。 くわしくは the Chapter called NetBSD サーバの構築 を参照して下さい。 さて、wd0 へのインストール終了後、無事に起動しおわったとします。

STEP 2: wd1 に RAID1 を作る

まず、最初にするのは wd1 へ wd0 のディスク設定をコピーすることです。 手順は次の二段階からなります。

(1) MS-DOS 的なパーティションの設定
(2) Unix 的なパーティションの設定

まずは fdisk コマンドを使って wd0 と wd1 の情報を確認しましょう。

netbsd# fdisk /dev/wd0
Disk: /dev/wd0d
NetBSD disklabel disk geometry:
cylinders: 90774, heads: 2, sectors/track: 789 (1578 sectors/cylinder)
total sectors: 143374744

BIOS disk geometry:
cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 143374744

Partition table:
0: NetBSD (sysid 169)
    start 63, size 143374681 (70007 MB, Cyls 0-8924/169/37), Active
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.

netbsd# fdisk /dev/wd1
fdisk: primary partition table invalid, no magic in sector 0
Disk: /dev/wd1d
NetBSD disklabel disk geometry:
cylinders: 90774, heads: 2, sectors/track: 789 (1578 sectors/cylinder)
total sectors: 143374744

BIOS disk geometry:
cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 143374744

Partition table:
0: <UNUSED>
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.
wd1 には何も設定が”ないはず”です。

wd1 には何も設定が”ないはず”ですが、念のため消します。 具体的には、ディスクの先頭部分を 0 で上書きしておきます。

netbsd# dd if=/dev/zero of=/dev/rwd1d bs=8k count=1

次に fdisk で wd1 のパーティション 0 を active にします。

# fdisk -0ua /dev/wd1
いろいろ聞かれますが、よしなに答えて下さい。 RETURN たたくか yes と教えるだけで大丈夫です。

終ったら、念のため、 wd0 と wd1 の fdisk の内容を比べておきましょう。

netbsd# fdisk /dev/wd0 > /tmp/wd0 ; fdisk /dev/wd1 > /tmp/wd1 ; diff -ub /tmp/sd[01]
--- /tmp/wd0    2008-04-29 06:54:50.000000000 +0900
+++ /tmp/wd1    2008-04-29 06:54:50.000000000 +0900
@@ -1,4 +1,4 @@
-Disk: /dev/wd0d
+Disk: /dev/wd1d
 NetBSD disklabel disk geometry:
 cylinders: 90774, heads: 2, sectors/track: 789 (1578 sectors/cylinder)
 total sectors: 143374744
@@ -10,6 +10,7 @@
 Partition table:
 0: NetBSD (sysid 169)
     start 63, size 143374681 (70007 MB, Cyls 0-8924/169/37), Active
+        PBR is not bootable: All bytes are identical (0x00)
 1: <UNUSED>
 2: <UNUSED>
 3: <UNUSED>
「PBR (primary boot record) が違うよ」のメッセージは無視して下さい。 インストールすれば PBR が書かれます。

これで MS-DOS 的な設定が終りました。 次は Unix 的な設定(disklabel の設定)です。 一番めと同じレイアウトにしますが、 ファイルシステムタイプを 4.2BSD から RAID に変更します(※重要)。

netbsd# disklabel wd0
# /dev/rwd0d:
type: unknown
disk: netbsd-raid1-wd0
label: 
flags:
bytes/sector: 512
sectors/track: 789
tracks/cylinder: 2
sectors/cylinder: 1578
cylinders: 90774
total sectors: 143374744
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0 

16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  70700000        63     4.2BSD   2048 16384     0  # (Cyl.      0*-  44803*)
 b:   1974681  70700063       swap                     # (Cyl.  44803*-  46054*)
 c: 143374681        63     unused      0     0        # (Cyl.      0*-  90858*)
 d: 143374744         0     unused      0     0        # (Cyl.      0 -  90858*)
 e:  70700000  72674744     4.2BSD   2048 16384     0  # (Cyl.  46054*-  90858*)
netbsd# 
私は disklabel -I -i でインタラクティブモードになるので、 これを愛用しています。 wd0 の disklabel と同じ設定(size offset)を wd1 に入れてください。 そして wd1a の fstype (ファイルシステムのタイプ)を RAID へ変更して下さい。
netbsd# disklabel -I -i wd1
	... snip ...
partition> P
16 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:  70700000        63       RAID                     # (Cyl.      0*-  44803*)
 b:   1974681  70700063       swap                     # (Cyl.  44803*-  46054*)
 c: 143374681        63     unused      0     0        # (Cyl.      0*-  90858*)
 d: 143374744         0     unused      0     0        # (Cyl.      0 -  90858*)
 e:  70700000  72674744     4.2BSD      0     0     0  # (Cyl.  46054*-  90858*)
partition> 
このように表示されるはずです(a: 行の RAID に注目)。

要点は wd0 の a パーティションは 4.2 BSD ですが、 wd1 の a パーティションは RAID であるところです。 よく確認して下さい。 次回、起動時にカーネルが、 この RAID を見て Raidframe Autoconfig モードに入るために必要な目印です。

(備考: disklabelのコピーは次のようにやるほうが楽ですね。

# disklabel wd0 | sed s/wd0/wd1/g > template
# disklabel -R wd1 template
# disklabel -I -i wd1
	... 4.2BSD から RAID へ変更 ...
)

STEP 3: wd1 に RAID1 を作る

wd1 に Raidframe で RAID 1 を作ります。 /etc ではなく [6] /tmp や /var/tmp に raid0.conf ファイルを作り、 ファイルの内容は次のようにしてください。

# cat > /var/tmp/raid0.conf << EOF
START array
1 2 0

START disks
absent
/dev/wd1a

START layout
128 1 1 1

START queue
fifo 100
EOF
ここで wd0a 分のところが absent になっていることに注意して下さい。 absent は「片方がない」ことが設定のうちだと Raidframe に教えるためのものです。

いつものように raid0 を構築して下さい。 意味の詳細は raidctl(8) に書いてありますので、そちらを御覧下さい。

# raidctl -C /var/tmp/raid0.conf raid0
# raidctl -I YYYYMMDD raid0
# raidctl -i raid0
# raidctl -s raid0
netbsd# raidctl -s raid0
Components:
          component0: failed
           /dev/wd1a: optimal
No spares.
component0 status is: failed.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20080428, Mod Counter: 7
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 70699904
   RAID Level: 1
   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.
これで raid0 という仮想ディスクが出来ているような状態まで来ました。

raid0 ディスクに disklabel を書き、 newfs (newfs -O 2) [7] します (注: ここで raid0a は RAID ではなく FFS ですよ、OK ?)。

# disklabel -I -i raid0
# newfs -O 2 raid0a
注: あとで dump device を wd0b 等にするので raid0 全体を raid0a にして しまってかまいません(つまり size offset が raid0d と raid0a で同じ)。 また、raid0a はセクター番号 0 から全部とすることに注意 (変に気を使って 63 とかにするとブートセクタが書き込めません、 すでに raid0d == raid0a の 0 番値が、 ディスク全体のセクタ番号でいえば 63 にあたっています)。

STEP 4: wd1 に wd0 の中身をコピーする

wd1 上に RAID 1 が出来ました。 次に wd0 の中身を wd1 へコピーします。

この手順が必要なのは FFS の wd0a を raid0 化して、 その上の raid0a へ今の wd0a のデータを持っていく [8] 必要があるためです。 しかしながら、これはコマンド一発で出来ないので、次の手順が必要になります。

さて dump コマンドを使って wd0 の中身を raid0a へコピーしましょう。

# mount /dev/raid0a /mnt
# dump -0 -f - / | (cd /mnt && restore -x -f -)
-v (verbose) をつけると動作状況が表示されますが、うるさすぎるかもしれません。
# dump -0 -f - / | (cd /mnt && restore -v -x -f -)

コピーの最後に重要な変更をします。raid0a 上の /etc/fstab を編集し / を raid0a にします(注: wd0a の /etc/fstab ではありません。 この後 wd0a の中身はリブートする際に消されるので関係ないです)。 あと wd0b を dump device にしておきましょう(sw を dp に変更)。

# ${EDITOR} /mnt/etc/fstab
	... snip ...
# cat /mnt/etc/fstab
/dev/raid0a     /               ffs     rw      1       1
/dev/wd0b       none            swap    dp      0       0
/dev/wd1b       none            swap    sw      0       0
あと swapoff=yes も仕込んでおきます。
# cat >> /mnt/etc/rc.conf << EOF
swapoff=YES
EOF

STEP 5: wd1 をブート可能にする

wd1 へブートブロックを書きこみます。

netbsd# cd /usr/mdec
netbsd# installboot -v -t raid -o console=com0 /dev/rwd1a bootxx_ffsv2
File system:         /dev/rwd1a
File system type:    raid (blocksize 16384, needswap 0)
Primary bootstrap:   bootxx_ffsv2
Ignoring PBR with invalid magic in sector 0 of `/dev/rwd1a'
Boot options:        timeout 5, flags 0, speed 9600, ioaddr 0, console com0
ファイルシステムタイプは RAID (※重要)で、 ついでに(サーバ機なので)ここではシリアルコンソール化しています。 また、 boot block は bootxx_ffsv2 です(上で newfs -O 2 していますから)。 デフォルトの boot block は bootxx_ffsv1 を使います(newfs を実行した場合)。 注意して下さい。

STEP 6: Raidframe を autoconfig にする

最後に、 もう一つ重要な設定「Raidframe を autoconfig にする」をします(※重要)。 これで次回起動時、よしなに Raidframe が raid0 を有効にしてくれます。

netbsd# raidctl -A root raid0
raid0: Autoconfigure: Yes
raid0: Root: Yes
raid0 の設定をやりなおしたいなら、
netbsd# raidctl -A no raid0
で autoconfig を off にして再起動すれば元の wd0 で起動します。

リブートして下さい。

# shutdown -r now

※ チェックリスト: RAID で起動できなかった場合 ※

うまくいかなかった場合、この三つの操作のどれかを忘れていませんか? 確認してみてください。

1. disklabel のファイルシステムタイプを 4.2BSD から RAID に変更。
2. installboot で -t raid とした。
3. Raidframe を autoconfig にした。

STEP 7: RAID 1 (/dev/raid0a) の再構築

リブートすると、 カーネルは、ファイルシステムをアタッチしていくときに bootable RAID 1 を認識し、そこへ boot device を持っていきます。

これがうまく動かないと、 最初にインストールした wd0a の HDD から起動してしまいます! Raidframe の autoconfig 設定がポイントであることが分かりますね。

Caution

ここで、どこから起動したか?を、きちんと確認しておいてください。 起動時に、次のように「 boot device: raid0 」と表示されていれば成功です。

raid0: RAID Level 1
raid0: Components: component0[**FAILED**] /dev/wd1a
raid0: Total Sectors: 147859328 (72196 MB)
boot device: raid0
root on raid0a dumps on raid0b
見逃してしまったら
# dmesg|grep raid0
とでも実行してみてください。

注意: この段階では、まだ wd0a を組み込んでないので **FAILED** と表示されます。 これを、このあと(raid0 を rebuild して)直します。

うまく起動したことを確認したら raid0 を再構築です。

まずは現状(wd1 だけが RAID 1 化の状態)を確認し、

netbsd# raidctl -s raid0
Components:
          component0: failed
           /dev/wd1a: optimal
No spares.
component0 status is: failed.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20080429, Mod Counter: 46
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 70699904
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
wd0 を RAID にくみこみます(component0 を /dev/wd0a へ変更します)。 手順は次のように行ないます。

(7.1) wd0 の disklabel を wd1 へ合わせます (実質的には wd0a のタイプを FFS から RAID に変更するだけですね)。

# disklabel /dev/wd1 > disklabel.wd1
# disklabel -R -r /dev/wd0 disklabel.wd1
# disklabel /dev/wd0

(7.2) wd0a を raid0 へ組み込んでください。

netbsd#  raidctl -a /dev/wd0a raid0
Warning: truncating spare disk /dev/wd0a to 70699904 blocks (from 70699936)
スペアディスクとして wd0a が認識されているはずです。 raidctl -s で「/dev/wd0a: spare」と表示されることを確認して下さい。
netbsd# raidctl -s raid0
Components:
          component0: failed
           /dev/wd1a: optimal
Spares:
           /dev/wd0a: spare
component0 status is: failed.  Skipping label.
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20080429, Mod Counter: 46
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 70699904
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
/dev/wd0a status is: spare.  Skipping label.
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

(7.3) raid0 を rebuild します。

# raidctl -v -F component0 raid0
なお -v なしで実行してしまった場合、 後からでも実行中の様子は -S でわかります。
# raidctl -F component0 raid0
# raidctl -S raid0

(7.4) 確認: rebuild が終ったら、raid0 のステータスを確認してみましょう。

# raidctl -s raid0
Components:
          component0: spared
           /dev/wd1a: optimal
Spares:
           /dev/wd0a: used_spare
  ... 略 ...
「スペアとして wd0a を使ってるよ」と言っていれば OK です。 再起動後には wd0a wd1a ともに optimal と表示されるはずなので、 確認してくださいね。

STEP 8: wd0 もブート可能にしておく

wd0 にもブートローダを書きこんでおきましょう。 コマンドオプションは wd1 の時と同じです(wd0 と wd1 が異なるだけ)。

netbsd# cd /usr/mdec
netbsd# installboot -v -t raid -o console=com0 /dev/rwd0a bootxx_ffsv2
File system:         /dev/rwd0a
File system type:    raid (blocksize 16384, needswap 0)
Primary bootstrap:   bootxx_ffsv2
Boot options:        timeout 5, flags 0, speed 9600, ioaddr 0, console com0

終りです。おめでとう!

再起動してみてください。 (1) 期待どおり raid0 から起動しており、


raid0: RAID Level 1
raid0: Components: /dev/wd0a /dev/wd1a
raid0: Total Sectors: 147859328 (72196 MB)
boot device: raid0
root on raid0a dumps on raid0b
root file system type: ffs
(2) raidctl -s の表示は wd0a wd1a ともに optimal となるはずです。
# raidctl -s raid0
Components:
           /dev/wd0a: optimal
           /dev/wd1a: optimal
No spares.
Component label for /dev/wd0a:
   Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20110908, Mod Counter: 33
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 147859328
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Component label for /dev/wd1a:
   Row: 0, Column: 1, Num Rows: 1, Num Columns: 2
   Version: 2, Serial Number: 20110908, Mod Counter: 33
   Clean: No, Status: 0
   sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
   Queue size: 100, blocksize: 512, numBlocks: 147859328
   RAID Level: 1
   Autoconfig: Yes
   Root partition: Yes
   Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 2% complete.
Copyback is 100% complete.

Notes

[1]

現在の fml.org のサーバ機は全てこの構成です。 Raidframe は、自宅で、データセンターで、 オフィス、fml.org 、商用サービスで十年近く運用してきました。 ディスク交換まで含めていろいろなシチュエーションを体験しましたが、 まったく問題ありません。 作者自身が今でも保守していてくれる Raidframe には絶大な信頼をおいています。

三千万のファイルサーバとかならよいのですが、 それが買えないなら、 つまり安いハードウエア RAID なんか使うくらいなら、 ソフトウエア RAID のほうがマシです。

ディスクなんて、はじめから予備を搭載しておくのが当然でしょうから、 ソフトウエア RAID であれば、 リモートから on the fly でどうとでも直せます。 うむ、やはり運用は、こうありたいと。

[2]

2010/06/27 交通事故で死去。御冥福をお祈りします。

[3]

Seagate OK だったのはひと昔前の話、 2009 現在 HGST 以外の HDD なんて恐くて使えない。

でも HGST の 1T は 128G 境界で soft error と言いやがります。 念のため LBA48 bug を回避しておくべきです。

まぁ LBA48 bug 回避にはカーネルをハックするという案もアリですが。 アップグレードの際に忘れそうなんですよね、このハックを入れるの。

後日談: 結局、みんなバグってるので LBA48 quirk をデフォルトにした? から何も考えなくても OK だという見解はあるでしょうね。 カーネルは、ちゃんと HDD のファームバージョンとかも見てる? ただ、いずれにせよ、カーネル側の変更を見逃すと、地雷を踏んでしまうので、 運用としては、安全側に倒す処置をしておくべきでしょう。

[4]

実のところ、disklabel 設定の際に RAID にすればよさそうなものですが、 これだとインストールさせてくれません ;-) 一回目は、普通に FFS とかにしておかないと、 インストーラ様が作業できないらしいです。

[5]

一方、NetBSD.ORG の説明は、全部を raid0 にのせてしまうために、 raid0 の上のスワップ設定をいじくりまわすなどといった 面倒なことになっています。

本章の説明は raid0 + その他はいつもの swap と FFS です。 raid0 + swap + raid1 + ffs でも OK です。 ただ、この場合には raidframe の kernel thread が2つ走ってしまうのがデメリットです。

なお boot device を設定する際に自動的に「raid0b を使うぜ!」とカーネル は叫ぶのですが、スワップも dump device も明示的に設定し直すので、 raid0b を用意しなくても問題ないと思われまする(とカーネルを斜め読みした 結果なのに断言:-)。まぁ、このタイミング〜再設定までの間にカーネルがこ けてダンプしたら困りますけど、そんな小さい可能性まで考えなくても〜と。

[6]

最終的に Raidframe 自動構築モードに設定するため 最後までいっても /etc/raid0.conf は不要です。 /etc/raid0.conf を作ってしまうと 「すでに raid0 あるよ!」と警告が出ちゃいます。 注意して下さい。

[7]

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

[8]

この後(OS リブート後) wd0 は Raidframe に組み込まれ、 wd1 上の raid0a の中身を wd0 上の raid0a 部分へコピーバックすることになります。 その時に wd0 の現在の中身は上書きされ、 今 wd1 へコピーした内容へ切り替わります。

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