2015年12月30日 星期三

以mdadm做磁碟陣列要注意硬碟壞軌

在Linux上面,做磁碟陣列(RAID)最方便又不用另外買磁碟陣列卡的辦法就是Neil Brown開發的mdadm,是一種做software RAID的程式

但是,由於mdadm只是拿來做磁碟陣列,所以當組成的硬碟壞軌這種沒有死透的損壞,mdadm並不會因此就把這個硬碟給踢出RAID,再加上通常做RAID的硬碟都會是同一批,所以就會有可能出現同一個RAID上面多個硬碟在很短的時間內同時損壞,此時就會造成資料消失的大災難



在短時間內同個RAID多個硬碟損壞聽起來很雖小,不過在人品大崩壞的情況下還真的被我給遇到。去年就遇到做系統mirror的兩個硬碟同時損壞,導致要重新安裝系統; 今天又遇到RAID6的磁區兩個硬碟同時出問題... (阿不就好棒棒還好有做RAID6不然真的要哭哭惹)

原本以為是雖小,但是一而再的發生就代表是有原因的,而原因就是mdadm不檢查硬碟健康狀況只有判定死了沒有,平常還是要關心一下各個硬碟的狀況。觀察的方法最簡單就是dmesg後去看每個硬碟有沒有怪訊息


以下介紹在使用mdadm的時,當硬碟還沒有死透之前要如何更換硬碟


狀況一:系統有備用硬碟(spare disk)

假設RAID是由三個硬碟sda, sdb, sdc所組成,在做RAID的時候已經加入另外一個硬碟sdx來當作備用硬碟。

首先,用fdisk分割硬碟sda
# fdisk /dev/sda
    n > p > 1 > enter > enter > t > fd > w
如果sdb, sdc, sdx和sda都是同型號的硬碟,用sfdisk來複製分割方式
# sfdisk -d /dev/sda | sfdisk /dev/sdb
# sfdisk -d /dev/sda | sfdisk /dev/sdc
# sfdisk -d /dev/sda | sfdisk /dev/sdx

再來,用mdadm來製作RAID-5的磁碟陣列,sda1, sdb1, sdc1是組成的硬碟,sdx是hot spare
# mdadm -C /dev/md5 -l 5 -n 3 /dev/sd{a,b,c}1 -x 1 /dev/sdx1
# cat /proc/mdstat | grep -A 3 md5
# mkfs.ext4 -L RAID5 /dev/md5
# mount /dev/md5 /mnt
# mdadm --detail /dev/md5
等RAID製作完之後再做下面的步驟

檢查RAID5,還有每個組成的硬碟
# mdadm --detail /dev/md5
# mdadm --examine /dev/sda
# mdadm --examine /dev/sda1

假設用dmesg看到硬碟sdc有一些問題,不過現在RAID5還在跑,所以要先設定sdc損壞
# mdadm --fail /dev/md5 /dev/sdc1

由於有備用硬碟,這個時候mdadm會使用hot spare,直接把sdx1加到RAID裡面開始重建(rebuild)。待重建完成後,把sdc1移出md5
# mdadm --remove /dev/md5 /dev/sdc1

這樣就可以安心地拔出損壞的sdc了


狀況二:系統沒有備用硬碟

假設RAID是由三個硬碟sda, sdb, sdc所組成
# mdadm -C /dev/md5 -l 5 -n 3 /dev/sd{a,b,c}1

先設定sdc損壞,並且移出磁碟陣列
# mdadm --fail /dev/md5 /dev/sdc1
# mdadm --remove /dev/md5 /dev/sdc1

拔掉硬碟,更換一個新的上去,用dmesg去看新的硬碟編號,假設叫做/dev/sdy

先分割新的硬碟,產生一個拿來做RAID的分割區,再加入原來的RAID裡面
# sfdisk -d /dev/sda | sfdisk /dev/sdy
# mdadm --add /dev/md5 /dev/sdy1
# cat /proc/mdstat | grep -A 5 md5


相關注意事項


  1. 要--remove之前必須要先做--fail,不然--remove會失敗。如果說sdc已經死透(也就是mdadm已經判定是fail了),那這樣才能直接--remove。
  2. 如果sdc已經被系統給判定fail,那這樣還是要下--remove把這個硬碟移出RAID,才能夠拔硬碟。直接把他給拔掉的話RAID會一直認為有一個壞掉的組成硬碟喲~
  3. 想要定期檢查Software RAID的狀態,參考WEITHENN的文章


沒有留言:

張貼留言