| 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 と混在するかもしれないわけですから、安全側に倒すのが運用というものです。 |
最初の一回は、wd0 へ普通に NetBSD/i386 をインストールしないといけません。 [4]
たとえば、こんな感じにパーティションを切ることにしましょう。
wd0a / wd0b swap wd0e /otherなお wd0b と wd1b は普通に SWAP として使い、 wd0e と wd1e も普通の FFS として使うつもりの設定です。 [5]
初回の OS インストール手順 は省略します。 いつもの通りです。 くわしくは the Chapter called NetBSD サーバの構築 を参照して下さい。 さて、wd0 へのインストール終了後、無事に起動しおわったとします。
まず、最初にするのは 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 へ変更 ...)
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 にあたっています)。
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
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 を実行した場合)。 注意して下さい。
最後に、 もう一つ重要な設定「Raidframe を autoconfig にする」をします(※重要)。 これで次回起動時、よしなに Raidframe が raid0 を有効にしてくれます。
netbsd# raidctl -A root raid0 raid0: Autoconfigure: Yes raid0: Root: Yesraid0 の設定をやりなおしたいなら、
netbsd# raidctl -A no raid0で autoconfig を off にして再起動すれば元の wd0 で起動します。
リブートして下さい。
# shutdown -r now
うまくいかなかった場合、この三つの操作のどれかを忘れていませんか? 確認してみてください。
1. disklabel のファイルシステムタイプを 4.2BSD から RAID に変更。 2. installboot で -t raid とした。 3. Raidframe を autoconfig にした。
リブートすると、 カーネルは、ファイルシステムをアタッチしていくときに 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 と表示されるはずなので、
確認してくださいね。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.| [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 へコピーした内容へ切り替わります。 |
Copyright (C) 1993-2025 Ken'ichi Fukamachi mail:< fukachan at fml.org >