さて、普通のマシンでHotswapするにはどうしたらいいんだろう
今回はミスにすぎなかったですが、リアルにデグレードした時にはどうしたらいいんでしょう?
無停止を強要されるのでなければ再起動しろってことなんでしょうけど...
手順としては、デバイス落として、抜いて挿して、SCSIをrescanさせればよかったのだったっけ?
というわけで、リビルドがせっかく終わったのだけど、演習する。
前に調べたのは2006年で、そのときはマトモな方法がなかったのね。
http://d.hatena.ne.jp/kinneko/20060407/p13
ttp://linux-ata.org/って、ロシア語のサイトに行っちゃうなぁ...
いまはこのあたり?
https://ata.wiki.kernel.org/index.php/Libata_Feature_Table
さすがにhotplugはサポートされている。
https://ata.wiki.kernel.org/index.php/Software_status#Hotplug_support
使っているマシンは、ICH9ですね。
https://ata.wiki.kernel.org/index.php/Hardware,_driver_status#AHCI_.28newer_Intel_ICH.2C_ULi.2C_others.29
対応済み。
具体的な手順はこのへんに書かれている。
https://raid.wiki.kernel.org/index.php/Hotplug
まずは、mdadmのバージョンが3.1.2以降でないとhotplugに対応していないのだそう。
root@redmine:~# mdadm --version mdadm - v3.1.4 - 31st August 2010
これは大丈夫。
接続されているSATAデバイスとドライブ名の対応を調べる。
まずは、ドライブの確認。
root@redmine:~# cat /sys/bus/scsi/devices/2\:0\:0\:0/model SAMSUNG HA500LJ root@redmine:~# cat /sys/bus/scsi/devices/3\:0\:0\:0/model SAMSUNG HA500LJ
このマシンは妙で、0,1が外に向いていると言ってたな。
確かに0,1がなく、2からはじまっている。
順番的には、2がsdaで、3がsdbかな?
root@redmine:~# dmesg | grep 'Attached SCSI disk' [ 4.150583] sd 2:0:0:0: [sda] Attached SCSI disk [ 4.165018] sd 3:0:0:0: [sdb] Attached SCSI disk
間違いない。
dmesgがいつでもアテになるとは限らないので、この対応を調べる方法はないかな。
これがいいかな。
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* /sys/bus/scsi/devices/2:0:0:0/block/sda /sys/bus/scsi/devices/3:0:0:0/block/sdb
なんかで再利用する時には、こんな感じか。
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sda 2:0:0:0 sdb 3:0:0:0
RAIDを崩壊させる。
あんまりいい方法はない。
擬似的にやる。
https://raid.wiki.kernel.org/index.php/Detecting,_querying_and_testing
root@redmine:~# mdadm --manage --set-faulty /dev/md0 /dev/sda1 mdadm: set /dev/sda1 faulty in /dev/md0 root@redmine:~# cat /proc/mdstat Personalities : [raid1] md1 : active (auto-read-only) raid1 sda5[0] sdb5[1] 5998528 blocks [2/2] [UU] md0 : active raid1 sda1[2](F) sdb1[1] 482384832 blocks [2/1] [_U] unused devices: <none> root@redmine:~# mdadm --manage --remove /dev/md0 /dev/sda1 mdadm: hot removed /dev/sda1 from /dev/md0 root@redmine:~# cat /proc/mdstat Personalities : [raid1] md1 : active (auto-read-only) raid1 sda5[0] sdb5[1] 5998528 blocks [2/2] [UU] md0 : active raid1 sdb1[1] 482384832 blocks [2/1] [_U] unused devices: <none>
同じドライブ上にあるので、sda1も同様にする。
root@redmine:~# mdadm --manage --remove /dev/md1 /dev/sda5 mdadm: hot remove failed for /dev/sda5: Device or resource busy root@redmine:~# mdadm --manage --set-faulty /dev/md1 /dev/sda5 mdadm: set /dev/sda5 faulty in /dev/md1 root@redmine:~# mdadm --manage --remove /dev/md1 /dev/sda5 mdadm: hot removed /dev/sda5 from /dev/md1 root@redmine:~# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sdb5[1] 5998528 blocks [2/1] [_U] md0 : active raid1 sdb1[1] 482384832 blocks [2/1] [_U] unused devices: <none>
logには、こんな感じで出ている。
[ 802.508972] md: unbind<sda1> [ 802.537044] md: export_rdev(sda1) [ 897.737030] md: unbind<sda5> [ 897.765041] md: export_rdev(sda5)
ドライブを抜けるようにする。
sdaは、2:0:0:0だった。
root@redmine:~# echo 1 > /sys/class/scsi_device/2\:0\:0\:0/device/delete
logにはこのような表示が。
[ 1121.136338] sd 2:0:0:0: [sda] Synchronizing SCSI cache [ 1121.136840] sd 2:0:0:0: [sda] Stopping disk [ 1121.568061] ata3.00: disabled
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sdb 3:0:0:0
1つしか見えなくなっている。
ドライブを抜く。
[ 1263.849204] ata4: exception Emask 0x50 SAct 0x0 SErr 0x4090800 action 0xe frozen [ 1263.849320] ata4: irq_stat 0x00400040, connection status changed [ 1263.849403] ata4: SError: { HostInt PHYRdyChg 10B8B DevExch } [ 1263.849490] ata4: hard resetting link [ 1264.572024] ata4: SATA link down (SStatus 0 SControl 300) [ 1269.572025] ata4: hard resetting link [ 1269.892025] ata4: SATA link down (SStatus 0 SControl 300) [ 1269.892037] ata4: limiting SATA link speed to 1.5 Gbps
あれ?
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' ls: cannot access /sys/bus/scsi/devices/?:0:0:0/block/*: No such file or directory
バスが死んじゃった...
あはは...
ファイルにアクセスできないな...
完全に死んだ。
抜く方間違えたかな?
むぅ。
強制電源断して、ドライブを入れて、再起動。
普通に上がってきた(^^;。
RAIDはさっきと変わらない。
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sda 2:0:0:0 sdb 3:0:0:0
もう一度。
root@redmine:~# echo 1 > /sys/class/scsi_device/2\:0\:0\:0/device/delete root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sdb 3:0:0:0
[ 130.201419] sd 2:0:0:0: [sda] Synchronizing SCSI cache [ 130.201922] sd 2:0:0:0: [sda] Stopping disk [ 130.629828] ata3.00: disabled
今度は右のドライブを抜く。
[ 199.854500] ata3: exception Emask 0x10 SAct 0x0 SErr 0x4010000 action 0xe frozen [ 199.854616] ata3: irq_stat 0x00400040, connection status changed [ 199.854699] ata3: SError: { PHYRdyChg DevExch } [ 199.854782] ata3: hard resetting link [ 200.576023] ata3: SATA link down (SStatus 0 SControl 300) [ 200.576037] ata3: EH complete
メッセージは同じだがsdbは生きている。
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sdb 3:0:0:0
キャッシュに入りきれないような、ディスクにアクセスする作業をしても、特に問題は出ない。
抜くのはできた。
ドライブを挿入する。
[ 662.061936] ata3: exception Emask 0x10 SAct 0x0 SErr 0x4050002 action 0xe frozen [ 662.062052] ata3: irq_stat 0x00400040, connection status changed [ 662.062135] ata3: SError: { RecovComm PHYRdyChg CommWake DevExch } [ 662.062227] ata3: hard resetting link [ 672.076018] ata3: softreset failed (device not ready) [ 672.076105] ata3: hard resetting link [ 673.300023] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300) [ 673.320676] ata3.00: ATA-8: SAMSUNG HA500LJ, CW300-11, max UDMA7 [ 673.320683] ata3.00: 976773168 sectors, multi 0: LBA48 NCQ (depth 31/32), AA [ 673.322814] ata3.00: configured for UDMA/133 [ 673.322829] ata3: EH complete [ 673.323026] scsi 2:0:0:0: Direct-Access ATA SAMSUNG HA500LJ CW30 PQ: 0 ANSI: 5 [ 673.323734] sd 2:0:0:0: [sda] 976773168 512-byte logical blocks: (500 GB/465 GiB) [ 673.323893] sd 2:0:0:0: [sda] Write Protect is off [ 673.323901] sd 2:0:0:0: [sda] Mode Sense: 00 3a 00 00 [ 673.323968] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA [ 673.324387] sda: sda1 sda2 < sda5 > [ 673.363166] sd 2:0:0:0: [sda] Attached SCSI disk
root@redmine:~# ls -d /sys/bus/scsi/devices/?\:0\:0\:0/block/* | awk 'BEGIN { FS="/"} {print $8 "\t" $6}' sda 2:0:0:0 sdb 3:0:0:0
またsdaとして認識している。
このへん、どこでドライブ名がフラつかないようにしているんだろう。
問題なくアクセスできる。
root@redmine:~# fdisk -l /dev/sda Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0000f5f2 Device Boot Start End Blocks Id System /dev/sda1 1 60055 482384896 fd Linux raid autodetect /dev/sda2 60055 60802 5998593 5 Extended /dev/sda5 60055 60802 5998592 fd Linux raid autodetect
バスでデバイスを再スキャンさせる手順は不要のようだ。
root@redmine:~# cat /sys/bus/scsi/devices/2\:0\:0\:0/state running
/sys/bus/scsi/devices/2\:0\:0\:0/rescan なんかは、特にさわらなくていいのかな。
リビルドする。
パーティション構成などは、そのままなので、リビルドだけ。
小さいほうから。
root@redmine:~# mdadm --manage --add /dev/md1 /dev/sda5 mdadm: re-added /dev/sda5 root@redmine:~# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda5[2] sdb5[1] 5998528 blocks [2/1] [_U] [=>...................] recovery = 8.1% (490496/5998528) finish=2.2min speed=40874K/sec md0 : active raid1 sdb1[1] 482384832 blocks [2/1] [_U] unused devices: <none>
ちょっと遅いので、リビルドのスピードアップをする。
root@redmine:~# cat /proc/sys/dev/raid/speed_limit_max 200000 root@redmine:~# cat /proc/sys/dev/raid/speed_limit_min 1000
45768K/secしか出てないから、maxのほうは足りているのじゃないかな。
下限のほうを上げるか。
root@redmine:~# echo "200000" > /proc/sys/dev/raid/speed_limit_min
md1 : active raid1 sda5[2] sdb5[1] 5998528 blocks [2/1] [_U] [==============>......] recovery = 74.5% (4470400/5998528) finish=0.6min speed=40546K/sec
あまり変化はない... orz
ビルド終わり。
次は大きいほう。
root@redmine:~# mdadm --manage --add /dev/md0 /dev/sda1 mdadm: re-added /dev/sda1
speed=84246K/secか。
終了予想が、100分くらいというのは変わらない。
mdadmに、growなんてオプションもできたのね...
昔はなかったズラ。
あとでfsも伸ばさないといけないのはめんどくさいけど。