それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

mdadm(ソフトraid)の実験をddファイルで行う。物理HDDは使わない

前回に引き続き、ハードディスク・デバイスを扱うコマンドを仮想ファイルで練習します。
今回は、ソフトウェア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も同時に依存パッケージとしてインストールされたので、除去した。

RAIDを/dev/md0 としてデバイス作製

RAIDは md(Mutiple Debice)としてディスクを割り当てるのが一般的らしい。なのでmd0に割り当てることにした

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  127 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デバイスが出来たのでフォーマットしてマウントします。

ext4RAIDアレイをフォーマット
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
RAIDアレイのデバイスをマウント

フォーマットして使えるようになったので、早速使ってみる。

takuya@atom:~/lvm_test$ sudo mount  /dev/md0 /mnt
ファイルを書き込む

マウントしたディレクトリに移動して、ファイルを書き込んでみます。

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  127 04:26 a
-rw-r--r--  1 root root     0  127 04:26 b
-rw-r--r--  1 root root     0  127 04:26 c
-rw-r--r--  1 root root     0  127 04:26 2014-01-27
drwx------  2 root root 12288  127 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

使ったサブコマンドについて

mdadm のヘルプコマンドは、サブコマンドを使うので、brew やgit のように複数書く

sudo mdadm --assemble --help

書き戻しも上手く行ってた

無事ファイルがミラーされることがわかった。

今回やらなかったこと

fstab に記述して再起動時に自動マウントなど。

raidはmdadmになったのでraiddevやmkraidなどのコマンドはない。

次回以降試したいこと

LVM -m のミラーリング
copy-on-write スナップショット
samba のシャドウコピー
iSCSI
raid5/raid10
lvmのサイズ変更

などディスクを扱うものを徐々に試したい。