ttt

getttyent

(FreeBSD) gvinumをやめてataraidにする

2006-06-21 23:03:18 | デジタル・インターネット

先日の

(FreeBSD)恐怖のgvinum

にあるように、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)まで

(FreeBSD)恐怖のgvinum

で、さんざんやりました。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では、「ドライブに相当するもの」が作成されるので、スライスを切ったり、ディスクラベルを書き込んだりできます。

以前、

(VMware) FreeBSDにディスクを増設

では、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. 1度、sysinstallを終了します。
  2. 新しく作成したパーティションのうち、マウントされているものがあれば、アンマウント(umount)します。
  3. 新しく作成したスワップパーティションが、すでに使用中になっていることがあります。swapinfoで、使用されているかどうかを見る。使用されていたらそのデバイス名を確認し、swapoffコマンドで、使用停止させます。
  4. もう一度、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秒ごとに表示の意味)

Vmstat_1 

マウントしたまま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


コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。