vinum

書いてる途中

FreeBSDでRAID1(ミラーリング)しましょう。こいつは Solaris DiskSuite に 匹敵するスグレもんです。

まず、RAID1でのミラーについて概念をおぼえておかないと操作の意味がちん ぷんかんぷんなのでこれを理解しましょう。そのまえに、ミラーリングは ディスクを多重化することによって、その一つがイカれても元気な方だけで ちゃんとデータを保持できるようにするというものです。vinumでHDDのパーティ ションを多重化するときには、電池の並列繋ぎをイメージすると良いでしょう。 電池が壊れやすかったとしましょう。

       ////----→(+)端子へ
       |
  +----+----+
 (+)       (+)
 | |A     B| |
 (-)       (-)
  +----+----+
       ////------(-)端子へ

てな風にやっとけば電池A、電池Bどちらかが壊れてもだいじょうぶ。 ああ安心。概ねこれで良いです。が、一つ不便なことが。これだと、

「1.5Vしか使えないやん」

という不満を感じます。感じなさい! HDDでいえば、小さいディスクを くっつけてでかいディスクにして使いたいってことがあるでしょ。

てことで、さっきの並列装置を改良しましょう。電池をそのまま繋ぐんじゃ なくて、直列電池ボックスにしましょう。

          ////----→(+)端子へ
           |
     +-----+-----+
 +--(+)--+   +--(+)--+
 | | | | |   | | | | | 
 | | | | |   | | | | |
 +--(-)--+   +--(-)--+ 
     +-----+-----+
          ////------(-)端子へ

はい。これで、電池ボックスを6本タイプにすれば9Vに、12本タイプにすれば 18Vに。さらに電池ボックスを3セット用意すれば、3重化になります。

はい、vinumでは

という3つの層で管理します。乾電池の場合、1.5V(or 1.2V)と相場は決まっ てますが、ハードディスク(のパーティション)はサイズがまちまちです。 ついでにいうと、べつに10GB空いてたからって10GBまるまる使わなきゃいけない という決まりは無いわけです。てことで、「空いてるパーティションから 好きなだけの容量をちぎって持って来たもの」をsubdiskだと考えます。 ここで比喩の話からvinumに忠実に用語を定義すると、

となり、volumeが実際に利用できるファイルシステムとなります。てことで、 vinumを利用してRAIDミラーを組みたいときは、

  1. 空きパーティションを片っ端から drive として登録。
    (といっても、普通はわざわざ細切れのまま使わないから 1つのHDDに付き1つのパーティションをdriveとして使うことになるだろう)
  2. 作りたいファイルシステム(volume)の容量に応じて
  3. でき上がった subdisk をplexにする。ミラー化したい本数だけplex を作る。
  4. 容量の等しいplexを(並列に)まとめてvolumeにする。

という手順になります。まあ、今回はミラー化するときの話題なので、 同じplexを2本作るという前提で操作例を考えましょう。

作成手順

実際にミラー化ファイルシステムを作る手順は以下のようになります。

  1. HDDの空きパーティションを vinum 用に予約する
  2. vinum を起動して、1で予約した空きパーティションをdriveとして登録
  3. volumeを作成

作成例 - 70GB パーティションが空いてるぜい

「おっと、70GBのパーティションが2つ余っちまった。じゃあこれで ミラー化したファイルシステムでも作るかー」

ってことがあったとしましょう(随分無理がありますな)。ad0とad2に こういうパーティションがあったと…

# disklabel ad0
  :
  g: 143713410 12582912    4.2BSD     2048 16384    89  # (Cyl.  783*- 9728*)
  :

これと
# disklabel ad2
  :
  g: 143713410 12582912    4.2BSD     2048 16384    89  # (Cyl.  783*- 9728*)

こんな全く同じサイズの ad0s1g と ad2s1g がありました。じゃあこれを使 いましょう。まず、ディスクラベルエディタで、これらのパーティションの属性 を変えましょう。この例だと 4.2BSD とありますが、これを vinum に書き換え ます。

# disklabel -e ad0

これで、エディタが起動するので

  g: 143713410 12582912    4.2BSD     2048 16384    89  # (Cyl.  783*- 9728*)

の部分を

  g: 143713410 12582912    vinum      2048 16384    89  # (Cyl.  783*- 9728*)

に書き換えます。ad2のパーティションについても同様です。

さて、いよいよvinum登場。コマンドラインから

# vinum start

でvinumがシステムに組み込まれます。が、忘れないうちに次にリブートした ときに自動的にvinumがロードされるように /etc/rc.conf に 以下の行を追加しておきましょう。

start_vinum=YES

ではコマンドラインに戻り、vinumを操作しましょう。

# vinum

プロンプトが変わります。

vinum ->

ではvolumeを作ります。このときに、ミラー状態をどのように作るか 頭の中に図を書いておくと分かりやすいでしょう。今回はこんな感じ。

          30GB
           | volume
     +-----+-----+
 plex|       plex|
 +--(+)--+   +--(+)--+
 |+-----+|   |+-----+| 
 || (a) ||   || (b) || 
 ||30GB ||   ||30GB || 
 ||sub- ||   ||sub- || 
 || disk||   || disk|| 
 |+-----+|   |+-----+| 
 +-------+   +-------+ 
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
                      [d0]
       +-----------------+-----------------+
ad0s1g |     30GB (a)    |   未使用        |
       +-----------------+-----------------+

                      [d2]
       +-----------------------------------+
ad2s1g |     30GB (b)    |   未使用        |
       +-----------------------------------+
  1. driveの登録

    vinum用に予約した /dev/ad0s1g, /dev/ad2s1g をvinumの ``drive'' として登録します。このときに、/dev/ad0s1g とか /dev/ad2s1g の名前 をずっと使うのは面倒なので、driveに登録するときにはそれぞれに分か りやすい名前をつけます。``taro'' と ``hanano'' でも構いませんが、 それだと余計分かりにくくなるという説もあるので、それぞれ ``d0'' と ``d2'' という名前にしておきます。vinumプロンプトでcreateと入力しま す。

    vinum -> create

    エディタ(デフォルトでvi)が起動します。ここに各ドライブに 名前をつけて登録します。こんな感じに記入。

    drive d0 device /dev/ad0s1g
    drive d2 device /dev/ad2s1g

    色を変えて表記した部分は時と場合によって 変わります。逆にいうと drive, device は必ずそういう風 に打つ「キーワード」です。さて、ファイルを保存&終了(viなら :wq [RET])すると、しゃかしゃかっとHDDのアクセスランプがついてvinum情報 が書き込まれます。本当に登録できたか見てみましょう。vinum で list とタイプします(l だけでも可)。

    vinum -> list
    2 drives:
    D d0     State: up  Device /dev/ad0s1g   Avail: 69080/69080 MB (0%)
    D d2     State: up  Device /dev/ad2s1g   Avail: 69080/69080 MB (0%)
    
    0 volumes:
    
    0 plexes:
    
    0 subdisks:
    

    よっしゃ、できました。

  2. volumeの作成

    さー、概念の説明では、subdiskをつくって、それを組み合わせて plex, それを組み合わせて volume, という風に進みましたが、実際には 一気に進みます。先ほどの30GBパーティションの図を樹形図風に書くと

    [30GB-volume]
        |
        +----[30GB plex]
        |        |
        |        +--[30GB subdisk]
        |
        +----[30GB plex]
                 |
                 +--[30GB subdisk]
    

    てな感じになるので、これをイメージしてcreate作業をします。 作りましょう。まず、作りたい30GBパーティションの名前を考えます。と いうか普通は作りたいファイルシステムの名前が決まってるのが先ですね。 ここでは、ホームディレクトリ用のパーティションを作ろうとしてました。 ってことにして下さい。はい、納得。

    ということで、[30GB-volume]は home と名付けることにします。 じゃ、上記の樹形図をそのまま反映する形で create します。 やはり、vinumプロンプトでcreateと入力します。

    vinum -> create

    エディタが起動するので、30GB-volume(home)を、plex2つで組み立て ます。ついでに、各plexは1個のsubdiskから構築します。それを作るの が以下の宣言です。

    volume home
      plex org concat
       sd drive d0 length 30g
      plex org concat
       sd drive d2 length 30g
    

    書き終わったら保存してエディタを終了します。またまたアクセスラ ンプがついてHDDにvolume情報が書き込まれます。

  3. volumeの確認

    vinumプロンプトで l (list) してみましょう。うまくできていれば このようになります。

    vinum -> list
    2 drives:
    D d0     State: up  Device /dev/ad0s1g   Avail: 38360/69080 MB (56%)
    D d2     State: up  Device /dev/ad2s1g   Avail: 38360/69080 MB (56%)
    
    1 volume:
    V home           State: up   Plexes:       2 Size:       30720 MB
    
    2 plexes:
    P home.p0      C State: up   Subdisks:     1 Size:       30720 MB
    P home.p1      C State: up   Subdisks:     1 Size:       30720 MB
    
    2 subdisks:
    S home.p0.s0     State: up   PO:        0  B Size:       30720 MB
    S home.p1.s0     State: up   PO:        0  B Size:       30720 MB
    

    でけた。C-dをタイプしてvinumを抜けます。

  4. できたvolumeをファイルシステムとして利用

    vinumで作成したボリュームは、/dev/vinum/vol/ボリューム名 というデバイスファイルで利用できます。まずは、newfs から。 vinum ボリュームをnewfsするには -v オプションをつけます。

    # newfs -v /dev/vinum/vol/home
    # tunefs -n enable /dev/vinum/vol/home
    

    これを普通に mount すればおしまい。

    # mount /dev/vinum/vol/home /home

    fstabにも書いときましょう。

HDD障害発生! さてそのとき

vinumに限らず、RAID-1ミラーリングをしているときは、ミラーリングの構成 を作ることよりも、障害が起きたときにHDDを入れ換え、ミラーリング状態を再 構築することの方が重要です。

さて、HDD2(ad2)が調子悪くなりました。アクセス不能。てなことになると、 vinum の list が次のように変わります。

vinum -> list
2 drives:
D d0     State: up  Device /dev/ad0s1g   Avail: 38360/69080 MB (56%)
D d2     State: up  Device /dev/ad2s1g   Avail: 38360/69080 MB (56%)

1 volume:
V home           State: up      Plexes:       2 Size:       30720 MB

2 plexes:
P home.p0      C State: up      Subdisks:     1 Size:       30720 MB
P home.p1      C State: faulty  Subdisks:     1 Size:       30720 MB

2 subdisks:
S home.p0.s0     State: up      PO:        0  B Size:       30720 MB
S home.p1.s0     State: faulty  PO:        0  B Size:       30720 MB

faultyというのが「調子悪い」ところで、同期が取れてないと ころです。最も理想的に行く場合のシナリオを以下に記します。

  1. 新しいHDDを用意する

    買いに行きましょう。同じ型番のものが理想ですが、1台のHDDが壊れ る頃には同じものは売ってないでしょう。より大きい容量のものを買って 来ましょう。

  2. HDD2を外す

    shutdownして、HDD2(ad2)を外します。ad0だけで起動できるか確かめ ましょう。vinumミラーしているパーティション以外でad2を利用していな ければ問題なく上がるでしょう。

  3. 新しいHDDをつける

    買って来たHDDを元のad2の置き換えとして取り付けましょう。

  4. vinum情報の復活


Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]