[Howto] Replace Harddisk กรณี Software RAID พังบน CentOs

ไม่เห็นว่ามีบทความนี้อยู่ในนี้เลยแฮะ ล่าสุดของตัวเองพังก็เลยจับมาเขียนก็แล้วกัน

อันดับแรก เช็คก่อนว่า disk พังมั้ย จะเห็นจาก logs ประมานนี้

ata1.00: status: { DRDY ERR }
ata1.00: error: { UNC }
ata1.00: configured for UDMA/133
ata1: EH complete
ata1.00: exception Emask 0x0 SAct 0x8 SErr 0x0 action 0x0
ata1.00: irq_stat 0x40000008
ata1.00: failed command: READ FPDMA QUEUED
ata1.00: cmd 60/08:18:b0:85:a9/00:00:00:00:00/40 tag 3 ncq 4096 in res 51/40:07:b1:85:a9/00:00:00:00:00/40 Emask 0x409 (media error) <F>

end_request: I/O error, dev sda, sector 11109809
md/raid1:md1: Disk failure on sda2, disabling device.
md/raid1:md1: Operation continuing on 1 devices.

หลังจากนั้นลองเช็คสถานะดู ก็จะเห็นประมานนี้ (อันนี้กรณี sda พังนะครับ มีทั้งหมดสองลูก sda sdb)

cat /proc/mdstat

จะได้ output ประมานนี้

Personalities : [raid1]
[B]md0 : active raid1 [COLOR=#ff0000]sda1[0][/COLOR] sdb1[1][/B]
10485632 blocks super 1.0 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]
bitmap: 0/1 pages [0KB], 65536KB chunk

[B]md1 : active raid1 sdb2[1] [COLOR=#ff0000]sda2[0][/COLOR][/B]
8384448 blocks super 1.1 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]

[B]md2 : active raid1 sdb3[1] [COLOR=#ff0000]sda3[0][/COLOR][/B]
957755200 blocks super 1.1 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]
bitmap: 5/8 pages [20KB], 65536KB chunk

ถ้ามันปกติ ที่ เน้นไว้จะเป็น UU แต่อันนี้ sda พัง มันเลยขึ้นว่า [B]U
[/B]ก็คือ sda พัง แต่ถ้า sdb พังก็จะเป็น U
[B]

Recover Software RAID

1.) อันดับแรก คือบอกว่า HDD fail ไปก่อน[/B]

จริงๆไม่ต้องสั่ง fail ก็ได้ เพราะว่ามัน fail อยู่แล้ว แต่เอาไว้เผื่อสำหรับคนอยากเปลี่ยน HDD ก็คือจะต้องสั่ง fail ให้มันก่อนที่จะ remove drive

อันนี้ของผมมีทั้งหมด 3 partition md0 md1 md2 ก็ remove จับเรียงเลยครับ

mdadm --manage /dev/md0 --fail /dev/sda1
mdadm --manage /dev/md1 --fail /dev/sda2
mdadm --manage /dev/md2 --fail /dev/sda3

[B]
2.) หลังจากนั้น Remove HDD ออกจาก Array[/B]

mdadm --manage /dev/md0 --remove /dev/sda1
mdadm --manage /dev/md1 --remove /dev/sda2
mdadm --manage /dev/md2 --remove /dev/sda3

[B]3.) เช็ค Raid Array อีกที จะเห้นประมานนี้[/B]

Personalities : [raid1]
[B]md0 : active raid1 sdb1[1][/B]
10485632 blocks super 1.0 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]
bitmap: 0/1 pages [0KB], 65536KB chunk

[B]md1 : active raid1 sdb2[1][/B]
8384448 blocks super 1.1 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]

[B]md2 : active raid1 sdb3[1][/B]
957755200 blocks super 1.1 [2/2] [B][[COLOR=#ff0000]_[/COLOR]U][/B]
bitmap: 5/8 pages [20KB], 65536KB chunk

หลังจากนั้นก็เปลี่ยน HDD กรณีของผมคือผมใช้ Supermicro รองรับ Hot-Swappable HDD ก็เลยดึงออก เปลี่ยนใหม่เลย
แต่ถ้าเป็นรุ่นอื่นที่ไม่ได้ hot-swappable ก็ shutdown เพิ่ม drive เปิดขึ้นมา แล้วก็ทำตามได้เลยครับ
หลังจากนั้นเสียบ drive เข้าไป fdisk-l ดูอีกทีว่า disk เพิ่มมาแล้วรึยัง กรณีผมไม่ต้อง scan, eject hdd เลยครับ
ผมใช้ CentOS 6 อันอื่นอาจจะใช้ ยังไงก็ลองสั่ง eject ไปละกัน

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 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: 0x00000000

OS เห็น HDD ลูกใหม่แล้ว เสร็จแล้วก็ทำการ clone partition จากอันเก่า

[COLOR=#ff0000][B]** คำสั่งนี้เป็นคำสั่งที่ค่อนข้างอันตราย make sure ว่าระบุถูก ไม่งั้นข้อมูลไปทั้งหมดนะครับ **[/B][/COLOR]

sfdisk -d /dev/sdb | sfdisk --force /dev/sda

[B]อธิบาย[/B]

/dev/sdb คือ disk คือลูกที่มีการแบ่ง partition ไว้และมีข้อมูลอยู่แล้ว ส่วน /dev/sda คือ disk ลูกใหม่ที่ใส่เข้าไป
ส่วนที่ต้อง --force เพราะว่าใน centos 6 ถ้าเราไม่ใส่ไว้มันจะบอกว่า เฮ้ยย นี่มันไม่ใช่ partition ที่มันต้องการให้เป็น แต่อย่าสนใจ เราแบ่งมาแล้ว

หลังจากนั้นรอแป๊บ มันจะรันๆๆๆ แล้วเราก็จะเห็นว่ามันก๊อป partition มาหมดแล้ว

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 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: 0x00000000

Device Boot Start End Blocks Id System
/dev/sda1 * 1 653 5242880 fd Linux raid autodetect
Partition 1 does not end on cylinder boundary.
/dev/sda2 653 1698 8388608 fd Linux raid autodetect
/dev/sda3 1698 121602 963129344 fd Linux raid autodetect

หลังจากนั้น จับ add partition เข้า array ใหม่

mdadm --manage /dev/md0 --add/dev/sda1
mdadm --manage /dev/md1 --add/dev/sda2
mdadm --manage /dev/md2 --add/dev/sda3

ถือว่าเสร็จสิ้นการ replace hdd แล้ว

หลังจากนั้นเช็ค /proc/mdstat เพื่อดูสถานะการ sync data ได้เลยครับ

เพิ่มเติมให้ครับ

[COLOR=#000000][FONT=Arial]ดู Raid Status (Sync Real-time)[/FONT][/COLOR]
[COLOR=#000000][FONT=Arial]#>watch -d -n1 cat /proc/mdstat[/FONT][/COLOR]