RAIDをいじる。ソフトウェアRAIDだと、低価格で高度なRAIDが構築できて楽しい。

よくある使い方

アレイの状態を確認

# mdadm --detail /dev/md0

ディスク状態の確認

# mdadm --examine /dev/sdz1

 パーティションの全体サイズ、使用しているサイズ、構成状態などが分かる。

スーパーブロックの初期化

 アレイに新品ではないHDDを使用するときは、スーパーブロックを初期化する必要がある。

# mdadm --zero-superblock /dev/sdz1

ホットスワップ

 SATAでは、ハード的にホットスワップ(ホットプラグ)に対応しているので、ソフト面でも環境をそろえて、システムで使用できるようにしてみる。
 ここでは、SATA0*1にsdb、SATA1にsdaがつながっている状態から、sdaを抜いてSATA2に挿すことで、HDD故障時のリペア手順を予習する。

HDDを取り外す

 sdaに故障フラグを追加してから、アレイから外す。

# mdadm /dev/md0 -f /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md0
# mdadm /dev/md0 -r /dev/sda1
mdadm: hot removed /dev/sda1

 取り外したいHDDのSCSIデバイスを調べる。sdaは、1:0:0:0となっている。

# find /sys/devices -type l | grep block:
/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block:sdb
/sys/devices/pci0000:00/0000:00:1f.2/host1/target1:0:0/1:0:0:0/block:sda

 カーネルから削除する。

# echo 1 > /sys/class/scsi_device/1\:0\:0\:0/device/delete

 この時点で、以下のカーネルログが出力された。

[ 5071.848015] sd 1:0:0:0: [sda] Synchronizing SCSI cache
[ 5071.848015] sd 1:0:0:0: [sda] Stopping disk
[ 5071.850472] ata2.00: disabled

 これで、物理的に取り外す準備ができた。取り外すと、以下のカーネルログが出力された。

[ 5222.018849] ata2: exception Emask 0x10 SAct 0x0 SErr 0x10000 action 0xe frozen
[ 5222.018849] ata2: irq_stat 0x00400000, PHY RDY changed
[ 5222.018849] ata2: SError: { PHYRdyChg }
[ 5222.018849] ata2: hard resetting link
[ 5222.742029] ata2: SATA link down (SStatus 0 SControl 300)
[ 5222.742091] ata2: EH complete

HDDを取り付ける

 新しいHDDをSATA2に取り付ける。物理的に取り付けると、以下のカーネルログが出力された。

[ 5288.848672] ata3: exception Emask 0x10 SAct 0x0 SErr 0x4040000 action 0xe frozen
[ 5288.848672] ata3: irq_stat 0x00000040, connection status changed
[ 5288.848672] ata3: SError: { CommWake DevExch }
[ 5288.848672] ata3: hard resetting link
[ 5295.860598] ata3: link is slow to respond, please be patient (ready=0)
[ 5301.019978] ata3: COMRESET failed (errno=-16)
[ 5301.020036] ata3: hard resetting link
[ 5304.372117] ata3: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
[ 5304.401347] ata3.00: ATA-8: ST31000340NS, SN06, max UDMA/133
[ 5304.401347] ata3.00: 1953525168 sectors, multi 0: LBA48 NCQ (depth 31/32)
[ 5304.436102] ata3.00: configured for UDMA/133
[ 5304.436102] ata3: EH complete
[ 5304.448081] scsi 2:0:0:0: Direct-Access     ATA      ST31000340NS     SN06 PQ: 0 ANSI: 5
[ 5304.448081] sd 2:0:0:0: [sda] 1953525168 512-byte hardware sectors (1000205 MB)
[ 5304.448081] sd 2:0:0:0: [sda] Write Protect is off
[ 5304.448081] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 5304.448081] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 5304.448081] sd 2:0:0:0: [sda] 1953525168 512-byte hardware sectors (1000205 MB)
[ 5304.448081] sd 2:0:0:0: [sda] Write Protect is off
[ 5304.448081] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00
[ 5304.448081] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[ 5304.448081]  sda: sda1
[ 5304.948410] sd 2:0:0:0: [sda] Attached SCSI disk

 カーネルログに「Attached SCSI disk」と出たら、デバイスとして認識しているようだ。まっさらのHDDなどの場合は、ここでfdiskを実行してパーティションを設定する。
 あとは、RAIDに追加するだけ。

# mdadm /dev/md0 -a /dev/sda1

RAIDとして起動しない場合に強制的に起動させる

 RAID構成としての最低限のディスク(4台のRAID5のうち3台あるなど)がある場合でも、ディスクの壊れ方などのタイミングによっては、RAIDとして起動しなくなることがある。
 この場合、RAIDのステータスは以下のようになる(新しいディスクをスペアディスクとして追加済みの場合)。

# mdadm --detail /dev/md2
/dev/md2:
        Version : 00.90.03
  Creation Time : Sun Nov 21 20:38:58 2004
     Raid Level : raid5
    Device Size : 312568576 (298.09 GiB 320.07 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 2
    Persistence : Superblock is persistent

    Update Time : Sun Jun 17 14:35:29 2007
          State : active, degraded, Not Started
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-asymmetric
     Chunk Size : 128K

           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 0.8396843

    Number   Major   Minor   RaidDevice State
       0      22       65        0      active sync   /dev/hdd1
       1       8       33        1      active sync   /dev/sdc1
       2       3        1        2      active sync   /dev/hda1
       3       0        0        3      removed

       4       8       49        -      spare   /dev/sdd1

 ステータスが「active, degraded, Not Started」となっている。
 また、dmesgには、以下のような情報もある。

md: md2 stopped.
md: bind<sdc1>
md: bind<hda1>
md: bind<sdd1>
md: bind<hdd1>
md: md2: raid array is not clean -- starting background reconstruction
raid5: device hdd1 operational as raid disk 0
raid5: device hda1 operational as raid disk 2
raid5: device sdc1 operational as raid disk 1
raid5: cannot start dirty degraded array for md2
RAID5 conf printout:
 --- rd:4 wd:3 fd:1
 disk 0, o:1, dev:hdd1
 disk 1, o:1, dev:sdc1
 disk 2, o:1, dev:hda1
raid5: failed to run raid set md2
md: pers->run() failed ...

 この状態だと、RAIDを起動しようとしてもエラーとなる。

# mdadm --run /dev/md2
mdadm: failed to run array /dev/md2: Input/output error

 強制的に起動させるには、md_modのパラメータのstart_dirty_degradedを1に設定すればよいらしい。

# echo 1 > /sys/module/md_mod/parameters/start_dirty_degraded

 設定後、再度RAIDを起動すると、今度は正常に起動した。
 RAIDのステータスも以下のようになった。

# mdadm --detail /dev/md2
/dev/md2:
        Version : 00.90.03
  Creation Time : Sun Nov 21 20:38:58 2004
     Raid Level : raid5
     Array Size : 937705728 (894.27 GiB 960.21 GB)
    Device Size : 312568576 (298.09 GiB 320.07 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 2
    Persistence : Superblock is persistent

    Update Time : Sun Jun 17 14:35:29 2007
          State : clean, degraded, recovering
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-asymmetric
     Chunk Size : 128K

 Rebuild Status : 1% complete

           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 0.8396843

    Number   Major   Minor   RaidDevice State
       0      22       65        0      active sync   /dev/hdd1
       1       8       33        1      active sync   /dev/sdc1
       2       3        1        2      active sync   /dev/hda1
       4       8       49        3      spare rebuilding   /dev/sdd1

 ステータスが「clean, degraded, recovering」となっている。
 その後、しばらくおいておくと、今度はチェックを行っているのか、4つのディスクからデータを読んでいるようだ。

# mdadm --detail /dev/md2
/dev/md2:
        Version : 00.90.03
  Creation Time : Sun Nov 21 20:38:58 2004
     Raid Level : raid5
     Array Size : 937705728 (894.27 GiB 960.21 GB)
    Device Size : 312568576 (298.09 GiB 320.07 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 2
    Persistence : Superblock is persistent

    Update Time : Thu Jun 21 01:05:30 2007
          State : clean, resyncing
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-asymmetric
     Chunk Size : 128K

 Rebuild Status : 11% complete

           UUID : xxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxxx
         Events : 0.8396845

    Number   Major   Minor   RaidDevice State
       0      22       65        0      active sync   /dev/hdd1
       1       8       33        1      active sync   /dev/sdc1
       2       3        1        2      active sync   /dev/hda1
       3       8       49        3      active sync   /dev/sdd1

 ステータスが「clean, resyncing」となっている。

RAID1で片肺でのブート

 Debian 6(squeeze)以降の場合、以下のコマンドからメニュー形式でブートローダーを入れるドライブを選択する。

# dpkg-reconfigure grub-pc

 Debian 6(squeeze)より前の場合は、以下のようにする。
 RAID1でブートディスクを作っても、最初のHDDにしかGRUBが入らないようだ。このため、もう片方にもGRUBをインストールする。

# grub-install /dev/sdb

 上記で失敗する場合は、以下のように手動で設定する。

# grub
grub> device (hd0) /dev/sdb  # (hd0) を /dev/sdb とする
grub> root (hd0,0)           # /boot があるパーティション(/dev/sdb1)指定
grub> setup (hd0)            # (hd0) の MBR に GRUB をインストール

ディスク交換後の復旧

 HDDを交換後、アレイを再構築するには以下のコマンドを実行する。

mdadm /dev/md2 --add /dev/sdb1

 /proc/mdstat でリビルド状況がわかるはずだ。

アレイサイズ変更

 RAID6の場合、アレイサイズの変更前に、スーパーブロックの更新が必要になるかもしれない。そのときは、一度アレイを停止する必要がある。英語の情報しかないのでよくわからないけど、最新バージョンだと直っているような記事も。

# mdadm --stop /dev/md2
# mdadm -A /dev/md2 --update=devicesize /dev/sd[abcd]2
# mdadm /dev/md2 --grow --size=max

 こんなことをしなくても、OS再起動でもいけるかもしれない。

小さくする

ext3

 ファイルシステムのサイズを減らし、続いてアレイのサイズを減らす。

# umount /mnt/hoge
# e2fsck -f /dev/md0 (*1)
# resize2fs /dev/md0 100000 (*2)
# mdadm /dev/md0 --grow --size=400000 (*3)
# mount /mnt/hoge

(*1) サイズ変更前にやっておかないと、resize2fsに怒られる場合がある。
(*2) ここで指定する数値はアレイのブロック数を指定する。
(*3) ここで指定する数値はデバイスのサイズを指定する。単位はKiB(キビバイト=1024バイト)。1ブロック4Kの場合、resize2fsで指定した数値と違うので注意。

大きくする

 アレイの全パーティションのサイズを増やしたのに拡張できない場合は、実際のパーティションサイズと、RAIDとして見えているパーティションのサイズが違う可能性がある。以下のコマンドでパーティションの詳細を確認する。

# mdadm --examine /dev/sdz1

 Avail Dev Sizeが、パーティションサイズと同じことを確認する。

ext3、ext4

 アレイのサイズを増やし、ファイルシステムのサイズを増やす。ext4の場合は、e4fsck,resize4fsの場合がある。サイズが大きい場合、かなりの時間がかかる。

# umount /mnt/hoge
# mdadm /dev/md0 --grow --size=600000 (*1)
# e2fsck -f /dev/md0 (*2)
# resize2fs /dev/md0 (*3)
# mount /mnt/hoge

(*1) サイズに"max"を指定すると、指定できる最大値が設定される。
(*2) サイズ変更前にやっておかないと、resize2fsに怒られる場合がある。
(*3) アレイのサイズに合わせる場合は、ブロック数を省略できる。

jfs

 オンラインでリサイズできるのでアンマウントの必要がない。

# mdadm /dev/md0 --grow --size=max
# mount -o remount,resize /mnt/hoge (*1)

(*1) サイズの指定はできないようだ。
 1.5Tから3Tへの拡張時の応答時間は、7分程度だった。ただし、500G*4のRAID5から、1T*4のRAID5にし、裏でリビルド中の場合。
 squeeze(kernel 2.6.32)だと、3Tから6Tへの拡張の応答時間は、1分程度だった。

xfs

 サイズを増やすのは簡単。xfs_growfsではサイズの指定も出来るが、ここではデフォルトの最大を割り当てた。

# mdadm /dev/md0 --grow --size=max
# xfs_growfs /mnt/hoge

 320Gから500Gへの拡張は、ほとんど一瞬で出来た。

RAIDレベルの変更

RAID5→RAID6

 まず、アレイにデバイスを追加しておく。

# mdadm /dev/md1 -a /dev/sdd5

 RAIDレベルとデバイス数を変更する。

# mdadm -G -l6 -n5 /dev/md1 --backup-file=/root/md1.bak
# rm /tmp/md1.bak

 ポイントは、'backup-file'オプションで、これがないと、以下のようなエラーが出る。

mdadm level of /dev/md1 changed to raid6
mdadm: /dev/md1: Cannot grow - need backup-file
mdadm: aborting level change

 先にRAIDレベルを変更することも可能だが、RAIDレベル変更時とデバイス追加時の2回で、再構成が走るので効率が悪い。
 1TBx4のRAID5から、1TBx5のRAID6に変更するのに、92時間程度かかった。

auto-read-onlyとなる

 あとからアレイを追加したときに、以下のようになることがある。

md1 : active (auto-read-only) raid1 sda2[0] sdb2[1]
      979840 blocks [2/2] [UU]

 これは、そういう仕組みらしく、一度でも書き込めば戻るようだ。ただし、スワップとして使用しているときは書き込みしていても状態が変わらないことがある(カーネルバージョンによるかも)。
 気になるなら、以下のコマンドを実行すると通常の状態になる。

# mdadm --readwrite /dev/md1

参考

http://lists.debian.or.jp/debian-users/200608/msg00173.html
http://lists.debian.or.jp/debian-users/200310/msg00188.html
http://sourceforge.jp/magazine/03/10/16/1431223
http://forums.opensuse.org/archives/sf-archives/archives-install-boot/339623-swap-raid1-will-not-start-2.html
http://forums.ubuntulinux.jp/viewtopic.php?id=3947&p=2
http://blog.jojo.jp/?eid=1173352
http://d.hatena.ne.jp/dayflower/20091218/1261113963


*1 マザーボードの印字での表記

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-02 (火) 00:06:07 (2303d)