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-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >