2015年12月31日 星期四

用舊硬碟放到mdadm做磁碟陣列要小心...

把舊的RAID上面的硬碟,配上一些新的硬碟做新的RAID,要注意舊硬碟上面會把原本舊RAID的配置訊息存在superblock上面,如果沒有清理乾淨的話,會造成mdadm判別錯誤沒有根據新的RAID配置來做磁碟陣列,下面舉例說明


例如三個硬碟sda, sdb, sdc整個不分割直接做RAID5
# mdadm -C /dev/md5 -l 5 -n 3 /dev/sd{a,b,c}

在這種情況下,md5這個磁碟陣列的訊息metadata分別會存在整個硬碟sda, sdb, sdc的superblock上面。

如果當把sda, sdb, sdc用fdisk分割如下:
# fdisk /dev/sda
    n > p > 1 > enter > enter > t > fd > w
# sfdisk -d /dev/sda | sfdisk /dev/sdb
# sfdisk -d /dev/sda | sfdisk /dev/sdc

用這些硬碟,再多加一個硬碟sdd,做一個RAID出來的時候
# mdadm -C /dev/md6 -l 5 -n 4 /dev/sd{a,b,c,d}1
新的RAID的metadata就都會存放在sda1, sdb1, sdc1等分割區的superblock上面

問題就會出現在這邊!!
原本存在sda, sdb, sdc的superblock上舊的metadata並不會消失,現在又有新的metadata存放在sda1, sdb1, sdc1上面,所以重開機後,mdadm去掃描硬碟的時候會先去認整個硬碟的superblock,而不是分割區的superblock,所以說組出來的會是舊的三個硬碟組成的RAID,而不是後來新的四個硬碟組成的RAID。

上述問題解決的方法就是拿到舊硬碟的時候要先把superblock給清除乾淨
# mdadm --zero-superblock /dev/sda
# mdadm --zero-superblock /dev/sda1

清除乾淨後用下面指令來看每個硬碟的superblock資訊
# mdadm --examine /dev/sda
# mdadm --examine /dev/sda1
如果沒有RAID相關資訊的話,那就是metadata已經被清除乾淨了



注意事項

mdadm裡面RAID的配置訊息叫做metadata,而存放的位置叫做superblock。這和平常理解的metadata與superblock不太一樣,注意不要搞混了。mdadm的superblock在硬碟上面的位址則會根據不同的metadata版本放在不一樣的位置:

  • metadata 0.9, 硬碟的最後面
  • metadata 1.0, 硬碟的最後面
  • metadata 1.1, 硬碟的最前面
  • metadata 1.2, 硬碟前面數來4k的位置

相關superblock上面資料儲存的格式請參考raid.wiki.kernel.org上面的文章,這邊有許多有用的參考資訊。

沒有留言:

張貼留言