Linux RAID の実験環境 †何か最近,Linux のソフトウェア RAID のクラッシュについてよく耳にする. クラッシュした RAID からデータをサルベージしようとすると,そのしくみや動作を理解していなくてはならない. というわけで,そこらへんについてちょろちょろ書いていこうと思う. 実験環境を作る †もちろん現実のハードディスクを必要な分だけ用意できれば最高なのだけど,そんな金も暇も無い,というときのための実験方法を. 要点を書くと
この2点である. これで理解できる人は,この後の説明は不要だろう. sparse file とは †sparse file とは
というものである. UNIX では昔からファイルシステム上にこのようなカラクリを持っていたが,最近では NTFS でもこの機能を備えている. 作り方は,C で言うと
ことで,eof から write の開始位置までが void となる. このようなプログラムをゴリゴリ書いてやってもいいが,コマンドラインから実行するには dd コマンドが使える. # dd if=/dev/zero of=newfile bs=1M seek=1024 count=0 newfile が存在しない場合,これでファイル全体が void のファイルを作成することができる. 注意点だが,sparse file というのは空手形のようなもので,書き込んで行くうちにディスクの実使用量は次第に増加していく. というわけで,この機能を使うときはそこらへん十分注意するように. というわけで,RAID の子ボリューム用のファイルを作成してみよう. # dd if=/dev/zero of=d0 bs=1M seek=1024 count=0 # dd if=/dev/zero of=d1 bs=1M seek=1024 count=0 # dd if=/dev/zero of=d2 bs=1M seek=1024 count=0 # dd if=/dev/zero of=d3 bs=1M seek=1024 count=0 これで d0, d1, d2, d3 の 4 つのファイルができる. # ls -l d0 -rw-r--r-- 1 root root 1073741824 2008-01-15 21:42 d0 # du d0 0 d0 見た目は 1GB の容量があるけど,ディスク上の実際の占有量は 0 である. loopback device †loopback device とは,ファイルシステム上のファイルをブロックデバイスのように見せかけるデバイスドライバで,iso9660 CD-ROM イメージの mount なんかに使ったことがある人も多いだろう. ここでは mount 動作はせずにファイル→ブロックデバイスのエミュレーションの機能だけを使う. これには losetup コマンドを使う. # losetup /dev/loop0 d0 # losetup /dev/loop1 d1 # losetup /dev/loop2 d2 # losetup /dev/loop3 d3 RAID5 ボリュームを作ってみる †ソフトウェア RAID ボリュームの作成・動作開始・停止などの制御を行うには mdadm コマンドを使う. # mdadm -C --level=raid5 --raid-devices=4 --assume-clean /dev/md0 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3 ここで --assume-clean オプションについて. 通常,RAID を作成すると,各子ボリューム間のパリティを合わせるリビルド動作に入る. が,--assume-clean オプションを付けるとその「リビルド動作が既に完了している」ということにして,すぐさま通常運用状態に移行する. 実は Linux のソフトウェア RAID では,読み込み時は
と冗長性は無視しているので,これでも動作自体には支障は無い. もちろん,ここで1台故障して縮退状態になった場合,RAID ボリュームの一貫性は保てなくなるのだが,当然
ので,縮退時に RAID ボリュームとしてのデータが失われるのは,未書き込み領域だけである. また,
ので,実は問題は発生しない. 実はここでは sparse file を使っている関係上,--assume-clean オプションを使ったのである. ここでリビルド動作をされてしまうと sparse file 上に書き込みが発生し,ディスクの使用量がどんどん増加することになる. ためしに使ってみる †# mke2fs /dev/md0 ext2 で論理フォーマットして # mount /dev/md0 /mnt mount して # ls /mnt 中を覗いてみる. 確かに動いてますね. 多少は書き込んでも大丈夫だけど,sparse file を使ってる関係上,あまり大きなファイルを書き込まないように. |