さて、普通のマシンで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も伸ばさないといけないのはめんどくさいけど。