mdadmコマンドあれこれ

mdadmコマンドを使ったソフトウェアRAIDの作成方法に関して
備忘録も兼ねて書いてみることします。


といいつつ、自宅にはそんなに沢山ハードディスクは転がっていないので、
再びループバックデバイスを使って、ローカルディスク上に環境を作る方法で行います。


RAIDについてはWikipediaにまとめられてますね。

事前準備


ループバックデバイスを用意しておくことにします。
loop7まで用意しておきます。

 # dd if=/dev/zero of=loop1.img bs=1024 count=100000
 # losetup /dev/loop1 loop1.img

 # dd if=/dev/zero of=loop2.img bs=1024 count=100000
 # losetup /dev/loop2 loop2.img

 # dd if=/dev/zero of=loop3.img bs=1024 count=100000
 # losetup /dev/loop3 loop3.img

 # dd if=/dev/zero of=loop4.img bs=1024 count=100000
 # losetup /dev/loop4 loop4.img

 # dd if=/dev/zero of=loop5.img bs=1024 count=100000
 # losetup /dev/loop5 loop5.img

 # dd if=/dev/zero of=loop6.img bs=1024 count=100000
 # losetup /dev/loop6 loop6.img

 # dd if=/dev/zero of=loop7.img bs=1024 count=100000
 # losetup /dev/loop7 loop7.img

RAIDのモードをいろいろ試す

 いろいろやってみます。

リニアモード

 複数のハードディスクパーティションを論理的にひとつのパーティションにします。
 あんまり使うことはないかもしれません。


 下は2つのパーティションをリニアモードで設定した例です。

 # mdadm --create /dev/md1 -l linear -n 2 /dev/loop1 /dev/loop2
 mdadm: array /dev/md1 started.


 設定した直後の「/proc/mdstat」です。

 # cat /proc/mdstat
 Personalities : [linear]
 md1 : active linear loop2[1] loop1[0]
      199808 blocks 64k rounding

 unused devices: <none>


 ファイルシステムを作成してマウントしてみます。
 2つのイメージファイルをまとめたので、約200MBの容量になっています。

 # mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 50000 inodes, 199808 blocks
 9990 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 25 block groups
 8192 blocks per group, 8192 fragments per group
 2000 inodes per group
 Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 35 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3146188   2292232  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                193495      5664    177841   4% /mnt
RAID0


 RAID0を組む例です。

 # mdadm --create /dev/md1 -l raid0 -n 2 /dev/loop1 /dev/loop2
 mdadm: array /dev/md1 started.


 設定した直後の「/proc/mdstat」です。


 # cat /proc/mdstat
 Personalities : [linear] [raid0]
 md1 : active raid0 loop2[1] loop1[0]
       199808 blocks 64k chunks

 unused devices: <none>


 ファイルシステムを作成してマウントします。

 # mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 50000 inodes, 199808 blocks
 9990 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 25 block groups
 8192 blocks per group, 8192 fragments per group
 2000 inodes per group
 Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729

 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done

 This filesystem will be automatically checked every 26 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3146200   2292220  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                193495      5664    177841   4% /mnt
RAID1


 今度はRAID1(ミラーリング)です。

 # mdadm --create /dev/md1 -l raid1 -n 2 /dev/loop1 /dev/loop2
 mdadm: array /dev/md1 started.


 設定した直後の「/proc/mdstat」です。

 # cat /proc/mdstat
 Personalities : [raid1]
 md1 : active raid1 loop2[1] loop1[0]
       99904 blocks [2/2] [UU]

 unused devices: <none>


 同様にファイルシステムを作成してマウントします。

 # mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 25064 inodes, 99904 blocks
 4995 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
 1928 inodes per group
 Superblock backups stored on blocks:
         8193, 24577, 40961, 57345, 73729
 
 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 22 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3144708   2293712  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                 96732      5664     86073   7% /mnt
RAID5


 同様にRAID5です。

 # mdadm --create /dev/md1 -l raid5 -n 3 /dev/loop1 /dev/loop2 /dev/loop3
 mdadm: array /dev/md1 started.


 設定した直後の「/proc/mdstat」です。

 # cat /proc/mdstat
 Personalities : [raid1] [raid6] [raid5] [raid4]
 md1 : active raid5 loop3[2] loop2[1] loop1[0]
       199808 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
 
 unused devices: <none>


 ファイルシステムを作成してマウントします。

 # mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 50000 inodes, 199808 blocks
 9990 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 25 block groups
 8192 blocks per group, 8192 fragments per group
 2000 inodes per group
 Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729
 
 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 38 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3146352   2292068  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                193495      5664    177841   4% /mnt
RAID6


 続いてRAID6です。

 # mdadm --create /dev/md1 -l raid6 -n 4 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4
 mdadm: array /dev/md1 started.


 設定した直後の「/proc/mdstat」です。

 # cat /proc/mdstat
 Personalities : [raid1] [raid6] [raid5] [raid4] [raid10]
 md1 : active raid6 loop4[3] loop3[2] loop2[1] loop1[0]
      199808 blocks level 6, 64k chunk, algorithm 2 [4/4] [UUUU]


 ファイルシステムを作成してマウントします。

 # mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 50000 inodes, 199808 blocks
 9990 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 25 block groups
 8192 blocks per group, 8192 fragments per group
 2000 inodes per group
 Superblock backups stored on blocks:
         8193, 24577, 40961, 57345, 73729
 
 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 31 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3146364   2292056  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                193495      5664    177841   4% /mnt
RAID10


 RAID10です。

 # mdadm --create /dev/md1 -l raid10 -n 4 /dev/loop1 /dev/loop2 /dev/loop3 /dev/loop4
 mdadm: array /dev/md1 started.>||


 設定した直後の「/proc/mdstat」です。

 # cat /proc/mdstat
 Personalities : [raid6] [raid5] [raid4] [raid10]
 md1 : active raid10 loop4[3] loop3[2] loop2[1] loop1[0]
       199808 blocks 64K chunks 2 near-copies [4/4] [UUUU]

 unused devices: <none>


 ファイルシステムを作ってマウントします。

 #mkfs.ext3 /dev/md1
 mke2fs 1.39 (29-May-2006)
 Filesystem label=
 OS type: Linux
 Block size=1024 (log=0)
 Fragment size=1024 (log=0)
 50000 inodes, 199808 blocks
 9990 blocks (5.00%) reserved for the super user
 First data block=1
 Maximum filesystem blocks=67371008
 25 block groups
 8192 blocks per group, 8192 fragments per group
 2000 inodes per group
 Superblock backups stored on blocks:
         8193, 24577, 40961, 57345, 73729
 
 Writing inode tables: done
 Creating journal (4096 blocks): done
 Writing superblocks and filesystem accounting information: done
 
 This filesystem will be automatically checked every 25 mounts or
 180 days, whichever comes first.  Use tune2fs -c or -i to override.

 # mount /dev/md1 /mnt

 # df -k
 Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
 /dev/sda3              5734416   3146428   2291992  58% /
 /dev/sda1               101086     17055     78812  18% /boot
 tmpfs                   257652         0    257652   0% /dev/shm
 /dev/md1                193495      5664    177841   4% /mnt
スペアデバイスについて

 スペアデバイスの設定も出来るわけです。「-x」オプションで指定すればOK
 下はRAID5でスペアを1つとした場合です。

 # mdadm --create /dev/md1 -l raid5 -n 3 /dev/loop1 /dev/loop2 /dev/loop3 -x 1 /dev/loop4
 mdadm: array /dev/md1 started.


スペアデバイスとした「/dev/loop4」に対して(S)マークがついてます。

 # cat /proc/mdstat
 Personalities : [raid6] [raid5] [raid4]
 md1 : active raid5 loop3[2] loop4[3](S) loop2[1] loop1[0]
       199808 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
 
 unused devices: <none>


RAIDデバイスの詳細は「mdadm --misc -D [デバイス名]」で表示されます。

 # mdadm --misc -D /dev/md1
 /dev/md1:
         Version : 0.90
   Creation Time : Sun Oct 10 08:15:31 2010
      Raid Level : raid5
      Array Size : 199808 (195.16 MiB 204.60 MB)
   Used Dev Size : 99904 (97.58 MiB 102.30 MB)
    Raid Devices : 3
   Total Devices : 4
 Preferred Minor : 1
     Persistence : Superblock is persistent

     Update Time : Sun Oct 10 08:17:14 2010
           State : clean
  Active Devices : 3
 Working Devices : 4
  Failed Devices : 0
   Spare Devices : 1

          Layout : left-symmetric
      Chunk Size : 64K

            UUID : 8cbf7a7b:73ef83cc:36ba3bbe:9568c19c
          Events : 0.2

    Number   Major   Minor   RaidDevice State
       0       7        1        0      active sync   /dev/loop1
       1       7        2        1      active sync   /dev/loop2
       2       7        3        2      active sync   /dev/loop3

       3       7        4        -      spare   /dev/loop4
デバイスの取り外し

 ディスクする必要が出てきたなどで、デバイスを交換する場合は、まず「-f」オプションで不良マークをつけます。
 その後、「-r」オプション該当するデバイスを取り外します。
 再度追加する場合は「-a」オプションです。


 ちなみに今回はOSの再起動が発生しないことを前提にやっています。
 OS起動時に再度RAIDデバイスを有効にするには「/etc/mdadm.conf」などに設定が必要になります。
 (こちらはまた折を見てまとめてみようと思います)
 


 さて、下の例は先ほどスペアデバイスを1つ含めたRAID5の例です。
 不良マークを付けたタイミングでスペアデバイスが有効になり、同期がかかっています。

 # mdadm --manage /dev/md1 -f /dev/loop2
 mdadm: set /dev/loop2 faulty in /dev/md1
 
 # cat /proc/mdstat
 Personalities : [raid6] [raid5] [raid4]
 md1 : active raid5 loop3[2] loop4[3] loop2[4](F) loop1[0]
       199808 blocks level 5, 64k chunk, algorithm 2 [3/2] [U_U]
       [=>...................]  recovery =  9.1% (9728/99904) finish=0.4min speed=3242K/sec

 unused devices: <none>

 # mdadm --misc -D /dev/md1
 /dev/md1:
         Version : 0.90
   Creation Time : Sun Oct 10 08:15:31 2010
      Raid Level : raid5
      Array Size : 199808 (195.16 MiB 204.60 MB)
   Used Dev Size : 99904 (97.58 MiB 102.30 MB)
    Raid Devices : 3
   Total Devices : 4
 Preferred Minor : 1
     Persistence : Superblock is persistent
 
     Update Time : Sun Oct 10 09:07:25 2010
           State : clean, degraded, recovering
  Active Devices : 2
 Working Devices : 3
  Failed Devices : 1
   Spare Devices : 1

          Layout : left-symmetric
      Chunk Size : 64K

  Rebuild Status : 45% complete

            UUID : 8cbf7a7b:73ef83cc:36ba3bbe:9568c19c
          Events : 0.4

    Number   Major   Minor   RaidDevice State
       0       7        1        0      active sync   /dev/loop1
       3       7        4        1      spare rebuilding   /dev/loop4
       2       7        3        2      active sync   /dev/loop3

       4       7        2        -      faulty spare   /dev/loop2


取り外します。

 # mdadm --manage /dev/md1 -r /dev/loop2
 mdadm: hot removed /dev/loop2

 # cat /proc/mdstat
 Personalities : [raid6] [raid5] [raid4]
 md1 : active raid5 loop3[2] loop4[1] loop1[0]
       199808 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]
 
 unused devices: <none>

 # mdadm --misc -D /dev/md1
 /dev/md1:
         Version : 0.90
   Creation Time : Sun Oct 10 08:15:31 2010
      Raid Level : raid5
      Array Size : 199808 (195.16 MiB 204.60 MB)
   Used Dev Size : 99904 (97.58 MiB 102.30 MB)
    Raid Devices : 3
   Total Devices : 3
  referred Minor : 1
     Persistence : Superblock is persistent

     Update Time : Sun Oct 10 09:52:01 2010
           State : clean
  Active Devices : 3
 Working Devices : 3
  Failed Devices : 0
   Spare Devices : 0

          Layout : left-symmetric
      Chunk Size : 64K

            UUID : 8cbf7a7b:73ef83cc:36ba3bbe:9568c19c
          Events : 0.12

    Number   Major   Minor   RaidDevice State
       0       7        1        0      active sync   /dev/loop1
       1       7        4        1      active sync   /dev/loop4
       2       7        3        2      active sync   /dev/loop3


「/dev/loop5」を代わりに追加します。

 # mdadm --manage /dev/md1 -a /dev/loop5
 mdadm: added /dev/loop5

 # cat /proc/mdstat
 Personalities : [raid6] [raid5] [raid4]
 md1 : active raid5 loop5[3](S) loop3[2] loop4[1] loop1[0]
       199808 blocks level 5, 64k chunk, algorithm 2 [3/3] [UUU]

 unused devices: <none>

 # mdadm --misc -D /dev/md1
 /dev/md1:
         Version : 0.90
   Creation Time : Sun Oct 10 08:15:31 2010
      Raid Level : raid5
      Array Size : 199808 (195.16 MiB 204.60 MB)
   Used Dev Size : 99904 (97.58 MiB 102.30 MB)
    Raid Devices : 3
   Total Devices : 4
 Preferred Minor : 1
     Persistence : Superblock is persistent

     Update Time : Sun Oct 10 09:52:01 2010
           State : clean
  Active Devices : 3
 Working Devices : 4
  Failed Devices : 0
   Spare Devices : 1

          Layout : left-symmetric
      Chunk Size : 64K

           UUID : 8cbf7a7b:73ef83cc:36ba3bbe:9568c19c
         Events : 0.12

    Number   Major   Minor   RaidDevice State
       0       7        1        0      active sync   /dev/loop1
       1       7        4        1      active sync   /dev/loop4
       2       7        3        2      active sync   /dev/loop3

       3       7        5        -      spare   /dev/loop5


結構気軽に試せるので、いろいろやってみるのも面白いと思います。


今日はこんな所で。