- 追加された行はこの色です。
- 削除された行はこの色です。
* Linux RAID の実験環境 [#aaf55ea6]
何か最近,Linux のソフトウェア RAID のクラッシュについてよく耳にする.
クラッシュした RAID からデータをサルベージしようとすると,そのしくみや動作を理解していなくてはならない.
というわけで,そこらへんについてちょろちょろ書いていこうと思う.
** 実験環境を作る [#kef7a8c9]
もちろん現実のハードディスクを必要な分だけ用意できれば最高なのだけど,そんな金も暇も無い,というときのための実験方法を.
要点を書くと
- sparse file を使う
- loopback device を使う
この2点である.
これで理解できる人は,この後の説明は不要だろう.
** sparse file とは [#b750dd4b]
sparse file とは
- ファイルシステム上は一定の領域(例えば 1GB)を占めているように見え
- 読み出すと sparse している部分(void とも呼ばれる)は 0
- あるセクタ書き出した時点でその領域が実際の HDD 上に割り当てられる
というものである.
UNIX では昔からファイルシステム上にこのようなカラクリを持っていたが,最近では NTFS でもこの機能を備えている.
作り方は,C で言うと
- ファイルを open(2) して
- eof の更に向こうまで lseek(2) して
- write(2) する
ことで,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 [#d2288de1]
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 ボリュームを作ってみる [#l21c30a8]
ソフトウェア 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 では,読み込み時は
- RAID1 は,論理ヘッド位置が近い子ボリュームから
- RAID5 ではパリティを無視
と冗長性は無視しているので,これでも動作自体には支障は無い.
もちろん,ここで1台故障して縮退状態になった場合,RAID ボリュームの一貫性は保てなくなるのだが,当然
> RAID 書き込み時はパリティやミラードライブなど,冗長性部分にも書き込む
ので,縮退時に RAID ボリュームとしてのデータが失われるのは,未書き込み領域だけである.
また,
> ファイルシステムも,一度も書き込まれていない領域を参照することは無い
ので,実は問題は発生しない.
実はここでは sparse file を使っている関係上,--assume-clean オプションを使ったのである.
ここでリビルド動作をされてしまうと sparse file 上に書き込みが発生し,ディスクの使用量がどんどん増加することになる.
** ためしに使ってみる [#ge7730d8]
# mke2fs /dev/md0
ext2 で論理フォーマットして
# moun t/dev/md0 /mnt
# mount /dev/md0 /mnt
mount して
# ls /mnt
中を覗いてみる.
確かに動いてますね.
多少は書き込んでも大丈夫だけど,sparse file を使ってる関係上,あまり大きなファイルを書き込まないように.