RAIDをいじる。ソフトウェアRAIDだと、低価格で高度なRAIDが構築できて楽しい。 #contents *よくある使い方 [#zed1a638] **アレイの状態を確認 [#kb2c0131] # mdadm --detail /dev/md0 **ディスク状態の確認 [#d3baeeb0] # mdadm --examine /dev/sdz1 パーティションの全体サイズ、使用しているサイズ、構成状態などが分かる。 **スーパーブロックの初期化 [#dbea1313] アレイに新品ではないHDDを使用するときは、スーパーブロックを初期化する必要がある。 # mdadm --zero-superblock /dev/sdz1 *ホットスワップ [#mfc106a4] SATAでは、ハード的にホットスワップ(ホットプラグ)に対応しているので、ソフト面でも環境をそろえて、システムで使用できるようにしてみる。~ ここでは、SATA0((マザーボードの印字での表記))にsdb、SATA1にsdaがつながっている状態から、sdaを抜いてSATA2に挿すことで、HDD故障時のリペア手順を予習する。 **HDDを取り外す [#nfad6ae1] 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を取り付ける [#v1d3d16c] 新しい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として起動しない場合に強制的に起動させる [#x4f804f9] 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で片肺でのブート [#l11f7ba1] 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 をインストール *ディスク交換後の復旧 [#l2bd072c] HDDを交換後、アレイを再構築するには以下のコマンドを実行する。 mdadm /dev/md2 --add /dev/sdb1 /proc/mdstat でリビルド状況がわかるはずだ。 *アレイサイズ変更 [#r2da8839] RAID6の場合、アレイサイズの変更前に、スーパーブロックの更新が必要になるかもしれない。そのときは、一度アレイを停止する必要がある。英語の情報しかないのでよくわからないけど、最新バージョンだと直っているような記事も。 # mdadm --stop /dev/md2 # mdadm -A /dev/md2 --update=devicesize /dev/sd[abcd]2 # mdadm /dev/md2 --grow --size=max こんなことをしなくても、OS再起動でもいけるかもしれない。 **小さくする [#p8c4732a] ***ext3 [#cebfb4c5] ファイルシステムのサイズを減らし、続いてアレイのサイズを減らす。 # 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で指定した数値と違うので注意。 **大きくする [#s4b075f2] アレイの全パーティションのサイズを増やしたのに拡張できない場合は、実際のパーティションサイズと、RAIDとして見えているパーティションのサイズが違う可能性がある。以下のコマンドでパーティションの詳細を確認する。 # mdadm --examine /dev/sdz1 ''Avail Dev Size''が、パーティションサイズと同じことを確認する。 ***ext3、ext4 [#y409c9b4] アレイのサイズを増やし、ファイルシステムのサイズを増やす。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 [#ud2ed804] オンラインでリサイズできるのでアンマウントの必要がない。 # 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 [#o1be22ca] サイズを増やすのは簡単。xfs_growfsではサイズの指定も出来るが、ここではデフォルトの最大を割り当てた。 # mdadm /dev/md0 --grow --size=max # xfs_growfs /mnt/hoge 320Gから500Gへの拡張は、ほとんど一瞬で出来た。 *RAIDレベルの変更 [#ff608e82] **RAID5→RAID6 [#n701ddd4] まず、アレイにデバイスを追加しておく。 # 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時間程度かかった。 *スーパーブロックの初期化 [#dbea1313] アレイに新品ではないHDDを使用するときは、スーパーブロックを初期化する必要がある。 # mdadm --zero-superblock /dev/hda1 *auto-read-onlyとなる [#qf557670] あとからアレイを追加したときに、以下のようになることがある。 md1 : active (auto-read-only) raid1 sda2[0] sdb2[1] 979840 blocks [2/2] [UU] これは、そういう仕組みらしく、一度でも書き込めば戻るようだ。ただし、スワップとして使用しているときは書き込みしていても状態が変わらないことがある(カーネルバージョンによるかも)。~ 気になるなら、以下のコマンドを実行すると通常の状態になる。 # mdadm --readwrite /dev/md1 *参考 [#y723ae49] 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~