先日の
にあるように、gvinumには、たびたび苦労させられるので、FreeBSDで使える別のソフトウェアRAID機能、ataraidを使ったRAIDへと移行してみました(そのほかに、gmirrorというのもあります)。ちなみに、ataraidは、VIA(だったかな?)のRAIDチップで、BIOSメニューのところで作成できるRAIDドライブも、ataraidの「ar0」として認識されます。
ataraid(atacontrolコマンドで設定する)によるRAID1(mirroring:ミラーリング)は、1年前くらいから別のマシンで使っていて、ごくごく素直に使えているので、今回は、ataraidを選びました。
■ 移行の計画
現在は、ad0,ad1,ad2,ad3の4台のドライブにまたがって、gvinumによるRAID0+1ボリュームを使っています。
- 「ad0とad1」でストライピング
- 「ad2とad3」でストライピング
- 2つのストライピングボリュームを、ミラーリング
ということになっています(だと思った・・・)。
作業手順は、以下のような感じになると思われます。
(1) ad2とad3の中にあるplexを削除する。ad0とad1が残っているので、ミラーリングはされなくなるものの、一応、ファイルシステムにはアクセスできる
(2) ad2とad3のハードディスクを、別のより大容量のドライブへ交換する(ドライブ4台分の容量を、2台でまかなうようにするため)
(3) ad2とad3の2つを使って、ataraidにより、RAID1(ミラーリング)を作成
(4) 新しく作ったRAID1上に、ファイルシステムを作成
(5) gvinumによるボリュームの内容を、ataraidのほうへ全部コピーする
(6) gvinumを使うのを止める。さらば、gvinum!
■ (1)~(2)まで
で、さんざんやりました。gvinumコマンドの中の「rmコマンド」で、subdiskとplexを削除してしまえばOK。
あとは、ごく普通に、ハードディスクドライブを交換する。
■ atacontrolコマンドでのRAID1を作成する
いきなり、失敗しました(いまとなっては笑って話せます)。
「atacontrol create RAID1 ドライブ1 ドライブ2」というコマンドで、RAID1を作成できるはずです。やってみると・・・
# atacontrol create RAID1 ad2 ad3
atacontrol: ioctl(ATARAIDCREATE): Inappropriate ioctl for device
なんか、エラーがでて失敗しました。
あ、そういえば、ATAの同じチャンネルにぶら下がっている、masterとslaveをmirrorすることはできないという話を、どこかで聞いたことがあるような気がします!?(信頼性とか性能とかの面でも、やめといたほうがいいですね)。
というわけで、なぜか、たまたま余っていたATAを増設するのインターフェイス・カードを使って、別のchannelへ振り分けました。
こんな風なディスクの構成になりました。
# atacontrol list
ATA channel 0:
Master: ad0 <Maxtor 4R160L0/RAMB1TU0> ATA/ATAPI revision 7
Slave: ad1 <Maxtor 4R160L0/RAMB1TU0> ATA/ATAPI revision 7
ATA channel 1:
Master: no device present
Slave: no device present
ATA channel 2:
Master: ad4 <Maxtor 4R160L0/RAMB1TU0> ATA/ATAPI revision 7
Slave: no device present
ATA channel 3:
Master: ad6 <Maxtor 4R160L0/RAMB1TU0> ATA/ATAPI revision 7
Slave: no device present
再挑戦です。
# atacontrol create RAID1 ad4 ad6
atacontrol: ioctl(ATARAIDCREATE): Inappropriate ioctl for device
あれれ?また失敗しました。
ハッ!!!
そういえば、カーネルを再構築したときに、ataraidのデバイスドライバを削っちゃっていたのでした・・・
カーネルのコンフィギュレーションファイルの該当部分
# ATA and ATAPI devices
device ata
device atadisk # ATA disk drives
#device ataraid # ATA RAID drives
ataraidの行のコメントを削除して、生かしてやって、カーネル再構築。
3度目の正直。
# atacontrol create RAID1 ad4 ad6
ar0 created
やっとうまくいきました。ad4とad6という2つのドライブから、ar0というRAID1なドライブが作成されました。
RAIDのステータスを確認。
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: READY
あれれ?普通は、この瞬間から、2つのドライブ間で、同期処理が始まるんだと思ってたのですが、なんか、いきなり「READY」ってなってますね。新品のドライブだったからかしらん???
/var/log/messagesでは、こんな感じのログがでてます。
Jun 20 18:09:16 ほげ kernel: ar0: 156334MB <ATA RAID1 array> [19929/255/63] status: READY subdisks:
Jun 20 18:09:16 ほげ kernel: disk0 READY on ad4 at ata2-master
Jun 20 18:09:16 ほげ kernel: disk1 READY on ad6 at ata3-master
ググってみると、atacontrol createしたあと、一度再起動している人が何人かいたため、念のため再起動してみたのですが、やっぱりREADY。
ま、いいか。もともと空っぽのディスクなんだし。
■ ar0にファイルシステムを作成する
gvinumでは、「スライスに相当するもの」が作成されるので、そのままnewfsしちゃえばいいのですが、atacontrolで作成するataraidでは、「ドライブに相当するもの」が作成されるので、スライスを切ったり、ディスクラベルを書き込んだりできます。
以前、
では、sysinstallコマンドで、ファイルシステムを作成する方法を紹介しているので、今回は、fdiskコマンドと、disklabel(bsdlabel)コマンドを使った、オーソドックスな方法をば・・・
● fdiskで、スライスを切る
新品のディスクの場合、なんかよく知りませんが、カーネルのほうで、親切にも、デフォルトの値を用意してくれるらしいので、それをそのまま書き込んでしまいます(デフォルト値が違ってたら、一生懸命、正しい値を入力すること)。
# fdisk -i ar0
******* Working on device /dev/ar0 *******
parameters extracted from in-core disklabel are:
cylinders=19929 heads=255 sectors/track=63 (16065 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=19929 heads=255 sectors/track=63 (16065 blks/cyl)
Do you want to change our idea of what BIOS thinks ? [n]
fdisk: invalid fdisk partition table found
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 320159322 (156327 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 472/ head 254/ sector 63
Do you want to change it? [n] ←このままでいいので変更しない
The data for partition 2 is:
<UNUSED>
Do you want to change it? [n] ←変更しない
The data for partition 3 is:
<UNUSED>
Do you want to change it? [n] ←変更しない
The data for partition 4 is:
<UNUSED>
Do you want to change it? [n] ←変更しない
Partition 1 is marked active
Do you want to change the active partition? [n] ←お好きに
We haven't changed the partition table yet. This is your last chance.
parameters extracted from in-core disklabel are:
cylinders=19929 heads=255 sectors/track=63 (16065 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=19929 heads=255 sectors/track=63 (16065 blks/cyl)
Information from DOS bootblock is:
1: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 320159322 (156327 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 472/ head 254/ sector 63
2: <UNUSED>
3: <UNUSED>
4: <UNUSED>
Should we write new partition table? [n] y ←「y」と答える
● bsdlabelコマンドでパーティションを切る
これまた親切にも、「bsdlabel -w スライス」で、デフォルトのパーティションを書き込むことができるそうなので、それでいっちゃうことにしました。
# bsdlabel -w ar0s1
(確認してみる)
# bsdlabel ar0s1
# /dev/ar0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 320159306 16 unused 0 0
c: 320159322 0 unused 0 0 # "raw" part, don't edit
全スライス容量が、aパーティションに割り当てられたんですね。ま、いいか。
これが気に入らない場合は、
# bsdlabel -e ar0s1
とやると、エディタ(viとか)が起動するので、そこで、ひたすら、値を書きこむ、という方法もあります。ただ、人によっては、そのやり方はきっと面倒だと思われるでしょうから、最初から素直にsysinstallを使ったほうがいいかもしれませんね。
・・・ところで、sysinstallで、ときどきうまくいかないことがあります。1度失敗すると、もう2度と、成功しなくなるとか。そのときは、経験的に、こうやってます。
- 1度、sysinstallを終了します。
- 新しく作成したパーティションのうち、マウントされているものがあれば、アンマウント(umount)します。
- 新しく作成したスワップパーティションが、すでに使用中になっていることがあります。swapinfoで、使用されているかどうかを見る。使用されていたらそのデバイス名を確認し、swapoffコマンドで、使用停止させます。
- もう一度、sysinstallコマンドを実行します。
たいてい、これでうまくいきます。
● newfsコマンドで、ファイルシステム作成
「-U」は、soft updateを有効にするオプションです。
# newfs -U /dev/ar0s1a
/dev/ar0s1a: 156327.8MB (320159304 sectors) block size 16384, fragment size 2048
using 851 cylinder groups of 183.77MB, 11761 blks, 23552 inodes.
with soft updates
super-block backups (for fsck -b #) at:
160, 376512, 752864, 1129216, 1505568, 1881920, 2258272, 2634624, 3010976,
3387328, 3763680, 4140032, 4516384, 4892736, 5269088, 5645440, 6021792,
6398144, 6774496, 7150848, 7527200, 7903552, 8279904, 8656256, 9032608,
9408960, 9785312, 10161664, 10538016, 10914368, 11290720, 11667072, 12043424,
12419776, 12796128, 13172480, 13548832, 13925184, 14301536, 14677888,
(以下省略)
# bsdlabel ar0s1
# /dev/ar0s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 320159306 16 4.2BSD 2048 16384 28552
c: 320159322 0 unused 0 0 # "raw" part, don't edit
● mountコマンドでマウントする
# mount /dev/ar0s1a /mnt
# df /mnt
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ar0s1a 155041638 4 142638304 0% /mnt
えっと、勢いあまって、まちがえて、「mount /dev/ar0s1 /mnt」とやったら、カーネル・パニックしました。気のせいかな。見なかったことにしておこう。
● ファイルシステムの内容をコピーする
これは、dumpコマンドとrestoreコマンドを使うのが定番です。
# cd /mnt (さっきマウントした新しいファイルシステムへchdir)
# dump 0uLf - /なんとか/コピー元ファイルシステム | restore rf -
DUMP: Date of this level 0 dump: Tue Jun 20 18:23:51 2006
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping snapshot of /dev/gvinum/raid (/なんとか/コピー元ファイルシステム) to standard output
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 60740881 tape blocks.
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
warning: ./.snap: File exists
expected next file 10, got 8
DUMP: 3.82% done, finished in 2:05 at Tue Jun 20 20:34:52 2006
DUMP: 8.50% done, finished in 1:47 at Tue Jun 20 20:21:34 2006
DUMP: 13.45% done, finished in 1:36 at Tue Jun 20 20:15:27 2006
コマンドの簡単な意味:
- 0は、レベル0ダンプ
- uは、ダンプ終了後に、/etc/dumpdatesを更新する(いつダンプしたかが記録されている)
- Lは、マウント中のファイルシステムをダンプするときに指定する(本当は、マウントしていない状態でdumpすべき)
- fは、出力先ファイルを指定するもので、「-」を指定していて、これは標準出力を意味している
- 「/なんとか/コピー元ファイルシステム」で、コピー元となるファイルシステムのマウント・ポイント(mountコマンドで指定するパス)を指定します。「/dev/ad0s1e」とかのデバイス名で指定することもできますが、たまに間違える恐れがあるので、パス名の方が安全かも
- 「|」でパイプにして、restoreコマンドに標準出力をつなぎ・・・
- rは、restoreをするの意味
- fは、入力ファイルを指定するもので、「-」を指定しているので、標準入力から読み込む、という意味になる(つまり、dumpの出力を、即、restoreする)
「expected next file 10, got 8」という、気になるメッセージがでていますが、これの意味は、man restoreしてみると、こう書いてあります。
expected next file <inumber>, got <inumber>
A file that was not listed in the directory showed up. This can
occur when using a dump created on an active file system.
きっと、dumpしている間に、dump元のファイルシステムに変更があたんでしょうね(新しくファイルが作成されたとかか?)。
「DUMP: 13.45% done」のように、ときどき、dumpの進行状況と、予想される終了時刻が表示されます。最初のころに表示される予想時刻は、たいていあてになりませぬ。
待ってるのも暇なので、vmstatコマンドで、ディスクへのアクセス状況を見てみるとか。
# vmstat ad0 ad1 ar0 5 (5は5秒ごとに表示の意味)
マウントしたままdumpしたので、dump中にファイルが変更されたり新規作成されたりすると、コピーされないファイルがでてきます。まあ、マウントしたまま、動かしているファイルシステムをまるごとコピーしようとすることに無理があるわけですが、とりあえず、レベル1ダンプして、差分コピーができます。
# dump 1uLf - /なんとか/コピー元ファイルシステム | restore rf -
■ ataraidのRAID1で、ディスクの交換
以前、ドライブがエラーを出して交換したことがあったので、そのときのメモ。
これは、ad4が、新しく交換されたドライブの場合です。
# atacontrol addspare ar0 ad4
# atacontrol rebuild ar0
しばらくして...こんなかんじですすんでいく様子が見られます。
# atacontrol status ar0
ar0: ATA RAID1 subdisks: ad4 ad6 status: REBUILDING 8% completed