前回に引き続き、ハードディスク・デバイスを扱うコマンドを仮想ファイルで練習します。
今回は、ソフトウェアRaidをやってみます。
ソフトウェアRAID
RAIDの実験やノウハウの構築のために、わざわざRAIDカードを用意しても仕方がない。
ハードディスク2本を用意すると少なくとも1万円は必要だし。
ディスクの構成を変えたい、そんな時に限ってハードディスクの予備がなくて試せなかったりで悲しい。
なので、イメージファイルを使ってLinuxのソフトRaidをつくろうと思う。
今回、実験する内容はRAID1
- ddでディスクイメージを作成
- fdisk でフォーマット
- loopデバイスに割り当て
- mdadm でソフトウェアRAID1構成
- RAID1にファイルを書き込む
- ディスクを取り外し縮退運転
- ディスクを増設して書き戻し
- RAIDディスクを消す
これらを試そうと思います。
dd でファイル作成
まずはディスクのベースとなる、1GiBのファイルを作ります
for i in {1,2,3,4} ; do sudo dd if=/dev/zero of=./1GiB-file$i bs=10MiB count=100 ; done;
RAIDだけ実験なら100MiBで足りそうな感じです。
fdisk でフォーマットします。
for i in {1,2,3,4} ; do fdisk ./100MiB-file$i ; done;
実行した結果
takuya@atom:~/lvm_test$ for i in {1,2,3,4} ; do fdisk ./100MiB-file$i ; done; デバイスは正常な DOS パーティションテーブルも、Sun, SGI や OSF ディスクラベルも 含んでいません 新たに DOS ディスクラベルをディスク識別子 0xe60a80e5 で作成します。 あなたが書き込みを決定するまで、変更はメモリ内だけに残します。 その後はもちろん以前の内容は修復不可能になります。 警告: パーティションテーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって 正常になります コマンド (m でヘルプ): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p パーティション番号 (1-4, 初期値 1): 初期値 1 を使います 最初 セクタ (2048-204799, 初期値 2048): 初期値 2048 を使います Last セクタ, +セクタ数 or +size{K,M,G} (2048-204799, 初期値 204799): 初期値 204799 を使います コマンド (m でヘルプ): w パーティションテーブルは変更されました! ディスクを同期しています。
/dev/loopにファイルを割り当てる
for i in {1,2,3,4} ; do sudo losetup /dev/loop$i ./100MiB-file$i ; done;
RAIDを作成する
raidのツールが入ってない場合はインストール
sudo aptitude install mdadm sudo aptitude purge postfix #postfixを使わない場合
なぜかpostfixも同時に依存パッケージとしてインストールされたので、除去した。
RAID1 を loop1 loop2 の2本で作成します。
sudo mdadm -C /dev/md0 -ayes -l raid1 -n 2 /dev/loop1 /dev/loop2
mdadmコマンドはroot権限で動作します。
実行結果
takuya@atom:~/lvm_test$ sudo mdadm -C /dev/md0 -ayes -l raid1 -n 2 /dev/loop1 /dev/loop2 mdadm: /dev/loop1 appears to be part of a raid array: level=raid0 devices=0 ctime=Thu Jan 1 09:00:00 1970 mdadm: partition table exists on /dev/loop1 but will be lost or meaningless after creating array mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 mdadm: /dev/loop2 appears to be part of a raid array: level=raid0 devices=0 ctime=Thu Jan 1 09:00:00 1970 mdadm: partition table exists on /dev/loop2 but will be lost or meaningless after creating array Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
正しく作成されたことを確認する(重要)
正しく作成されたことを確認して次に進みます
deviceファイルが作成されたかチェックして
takuya@atom:~/lvm_test$ ls -l /dev/md* brw-rw---- 1 root disk 9, 0 1月 27 04:17 /dev/md0
mdstat からmd の状態と本数を確認し
takuya@atom:~/lvm_test$ cat /proc/mdstat Personalities : [raid1] md0 : active raid1 loop2[1] loop1[0] 102388 blocks super 1.2 [2/2] [UU] unused devices: <none>
md0 の構成がどのように認識されたか確認する。
takuya@atom:~/lvm_test$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Jan 27 04:17:14 2014 Raid Level : raid1 Array Size : 102388 (100.01 MiB 104.85 MB) Used Dev Size : 102388 (100.01 MiB 104.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Mon Jan 27 04:17:19 2014 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : atom:0 (local to host atom) UUID : ab2a746d:a07816b0:82809f53:e58eb3c6 Events : 17 Number Major Minor RaidDevice State 0 7 1 0 active sync /dev/loop1 1 7 2 1 active sync /dev/loop2
当初の計画通り2本のディスク(loop1,loop2)がmd0に割り当てられ、raid1で動作してることが分かる。
これらの状態表示コマンドはRAIDを触る上で大事なのでメモが必要。
RAID1にファイルを書き込む。
MDデバイスが出来たのでフォーマットしてマウントします。
ext4 でRAIDアレイをフォーマット
takuya@atom:~/lvm_test$ sudo mkfs.ext4 /dev/md0 mke2fs 1.42 (29-Nov-2011) Filesystem label= OS type: Linux Block size=1024 (log=0) Fragment size=1024 (log=0) Stride=0 blocks, Stripe width=0 blocks 25688 inodes, 102388 blocks 5119 blocks (5.00%) reserved for the super user First data block=1 Maximum filesystem blocks=67371008 13 block groups 8192 blocks per group, 8192 fragments per group 1976 inodes per group Superblock backups stored on blocks: 8193, 24577, 40961, 57345, 73729 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done
ファイルを書き込む
マウントしたディレクトリに移動して、ファイルを書き込んでみます。
takuya@atom:~/lvm_test$ cd /mnt takuya@atom:/mnt$ sudo touch $(date +"%F") takuya@atom:/mnt$ sudo touch {a,b,c} takuya@atom:/mnt$ ls -l 合計 12 -rw-r--r-- 1 root root 0 1月 27 04:26 2014-01-27 -rw-r--r-- 1 root root 0 1月 27 04:26 a -rw-r--r-- 1 root root 0 1月 27 04:26 b -rw-r--r-- 1 root root 0 1月 27 04:26 c drwx------ 2 root root 12288 1月 27 04:23 lost+found
ちゃんと、ただしくファイルが作られました。意外と簡単ですね。
ディスクを取り外し縮退運転をする。
loop1デバイスを取り除き故障した状況にする。
マウント解除
マウントされていたら操作が面倒なので、まずumount でアウマウントします。
sudo umount /mnt
-f で /dev/loop1 を故障フラグをたてる
ディスク故障フラグ -f をつける
takuya@atom:/mnt$ sudo mdadm /dev/md0 -f /dev/loop1 mdadm: set /dev/loop1 faulty in /dev/md0
-r を着けて、MDアレイに属するディスクを開放
takuya@atom:/mnt$ sudo mdadm /dev/md0 -r /dev/loop1
mdadm: hot removed /dev/loop1 from /dev/md0
取外されたことを確認します。
ディスクを取り外した後の 「RAID」状態を見てみます。
takuya@atom:/mnt$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Jan 27 04:17:14 2014 Raid Level : raid1 Array Size : 102388 (100.01 MiB 104.85 MB) Used Dev Size : 102388 (100.01 MiB 104.85 MB) Raid Devices : 2 Total Devices : 1 Persistence : Superblock is persistent Update Time : Mon Jan 27 04:32:34 2014 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 0 Spare Devices : 0 Name : atom:0 (local to host atom) UUID : ab2a746d:a07816b0:82809f53:e58eb3c6 Events : 19 Number Major Minor RaidDevice State 0 0 0 0 removed #←ちゃんと1台になっている。 1 7 2 1 active sync /dev/loop2
取り外した代替ディスクを接続する
takuya@atom:/mnt$ sudo mdadm /dev/md0 -a /dev/loop3
mdadm: added /dev/loop3
接続しHDDが認識されているか確認する。
takuya@atom:/mnt$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Jan 27 04:17:14 2014 Raid Level : raid1 Array Size : 102388 (100.01 MiB 104.85 MB) Used Dev Size : 102388 (100.01 MiB 104.85 MB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Update Time : Mon Jan 27 04:37:53 2014 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : atom:0 (local to host atom) UUID : ab2a746d:a07816b0:82809f53:e58eb3c6 Events : 40 Number Major Minor RaidDevice State 2 7 3 0 active sync /dev/loop3 1 7 2 1 active sync /dev/loop2
ちゃんと loop1 の代わりに loop3 が入りました。
データがミラーリングされている確認
ミラーリングされて、loop2(md) と同じものが、loop3に書き込まれたことを確認します。
loop1 に引き続きloop2 を取り除き、loop3だけにしてみます。
takuya@atom:/mnt$ sudo mdadm /dev/md0 -f /dev/loop2 mdadm: set /dev/loop2 faulty in /dev/md0 takuya@atom:/mnt$ sudo mdadm /dev/md0 -r /dev/loop2 mdadm: hot removed /dev/loop2 from /dev/md0 takuya@atom:/mnt$ sudo mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Mon Jan 27 04:17:14 2014 Raid Level : raid1 Array Size : 102388 (100.01 MiB 104.85 MB) Used Dev Size : 102388 (100.01 MiB 104.85 MB) Raid Devices : 2 Total Devices : 1 Persistence : Superblock is persistent Update Time : Mon Jan 27 04:42:50 2014 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 0 Spare Devices : 0 Name : atom:0 (local to host atom) UUID : ab2a746d:a07816b0:82809f53:e58eb3c6 Events : 42 Number Major Minor RaidDevice State 2 7 3 0 active sync /dev/loop3 1 0 0 1 removed
シッカリ削除されています。
データを確認してみます。
takuya@atom:/mnt$ cd /mnt takuya@atom:/mnt$ ls -alt 合計 17 -rw-r--r-- 1 root root 0 1月 27 04:26 a -rw-r--r-- 1 root root 0 1月 27 04:26 b -rw-r--r-- 1 root root 0 1月 27 04:26 c -rw-r--r-- 1 root root 0 1月 27 04:26 2014-01-27 drwx------ 2 root root 12288 1月 27 04:23 lost+found
ちゃんとファイルがコピーされています。めでたい。
後始末をスル
これでRAIDを片付けて通常通りです。
takuya@atom:~$ sudo mdadm --stop /dev/md0 mdadm: stopped /dev/md0
続けて、loopデバイスも削除します。
takuya@atom:~$ sudo losetup -d /dev/loop{1,2,3,4}
RAID片肺を直接マウントしたら。。。
取り外したディスクを直接mount すると以下になる。
takuya@atom:~/lvm_test$ sudo mount ./100MiB-file3 /mnt mount: 未知のファイルシステムタイプ 'linux_raid_member'
直接マウントは出来なかった。
中身を見るときは、一端RAID1に突っ込んでからが良さそう。
mdadm のコマンドのヘルプの見方
--help コマンドをつけた場合以下のようになった。
takuya@atom:~/lvm_test$ mdadm --help mdadm is used for building, managing, and monitoring Linux md devices (aka RAID arrays) Usage: mdadm --create device options... Create a new array from unused devices. mdadm --assemble device options... Assemble a previously created array. mdadm --build device options... Create or assemble an array without metadata. mdadm --manage device options... make changes to an existing array. mdadm --misc options... devices report on or modify various md related devices. mdadm --grow options device resize/reshape an active array mdadm --incremental device add/remove a device to/from an array as appropriate mdadm --monitor options... Monitor one or more array for significant changes. mdadm device options... Shorthand for --manage. Any parameter that does not start with '-' is treated as a device name or, for --examine-bitmap, a file name. The first such name is often the name of an md device. Subsequent names are often names of component devices. For detailed help on the above major modes use --help after the mode e.g. mdadm --assemble --help For general help on options use mdadm --help-options
書き戻しも上手く行ってた
無事ファイルがミラーされることがわかった。