手上已有一台現成的 NAS,不過自己從頭跑一次才會知道細節。
格式化磁碟
其實使用 mdadm 建立磁碟陣列之前,並不一定需要先建立磁碟分割區,也可以直接使用整顆硬碟直接做。二種作法僅有些微差異,詳細內容可以參考 kernal.org 的討論。
假設除了基本硬碟 sda
以外,其他還有 sdb1
、sdc1
、sdd1
、sde1
、sdf1
、sdg1
共 6 個分割區要格式化為 ext4
,一個方法是 mkfs.ext4
一個一個硬碟慢慢來,另一個是寫 script 自動處理。以下範例是除了 sda
以外的所有分割區都格式化為 ext4
:
# 沒看懂前不要複製貼上,很危險 for DEV in $(ls sd*1 | grep -v sda); do yes y | sudo mkfs.ext4 $DEV done
建立 RAID
東西準備好以後,就可以換 mdadm
上場了。
建立新的 RAID 用的是參數 --create
,指令大致如下:
mdadm --create /dev/md/md0 \ --level=6 \ --raid-devices=6 \ /dev/sd[bcdefg]1
- /dev/md/md0:磁碟陣列建立以後欲使用的 device name。除了 md0 以外,也可以用
md_home
等較為易懂的方式命名。 --level
:要使用什麼類型的磁碟陣列。RAID 1 (mirror) 就給--level=1
;RAID 6 就給--level=6
--raid-devices
:這個磁碟陣列總用要用幾個 device 來建立。由於建立 RAID 時,不一定一次就要給足硬碟,所以這個參數要給正確。/dev/sdX
:要用來建立 RAID 的硬碟、或磁碟分割。把 device ID 當作參數一個一個補齊 (範例是偷懶的寫法)
如果一切正常,就不會顯示錯誤訊息,且可以透過 /proc/mdstat
來檢視 RAID 建立的進度:
.... Continue creating array? y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md/md-main started. $ cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md127 : active raid6 sdg1[5] sdf1[4] sde1[3] sdd1[2] sdc1[1] sdb1[0] 121024512 blocks super 1.2 level 6, 512k chunk, algorithm 2 [6/6] [UUUUUU] [=>...................] resync = 5.2% (1573464/30256128) finish=88.5min speed=5397K/sec unused devices: <none>
RAID 建立完成後,會在 /dev 變成一個 device,把 RAID 的資訊寫入 mdadm.conf 設定檔中:
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
在 mount 之前,記得先用 mkfs 格式化。
一切都順利的話,可以在 /dev/disk/by-uuid 看到新的 UUID,接著就可以使用一般的方式去 fstab 設定自動掛載的資料了。
參考資料:A guide to mdadm – Linux Raid Wiki
刪除 RAID
步驟為:停止 RAID => 刪除 RAID。
使用 --stop
來停止、umount RAID md0
:
mdadm --stop /dev/md/md0
mdadm 會在硬碟中寫入 metadata 來識別資訊,可以使用 lsblk
看出來:
$ lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT NAME SIZE FSTYPE TYPE MOUNTPOINT loop0 60.7M squashfs loop /snap/lxd/21843 .... sda 238.5G disk ├─sda1 60G btrfs part /var/lib └─sda2 178.5G btrfs part sdb 28.9G linux_raid_member disk sdc 28.9G linux_raid_member disk sdd 28.9G linux_raid_member disk sde 28.9G linux_raid_member disk sdf 28.9G linux_raid_member disk sdg 28.9G linux_raid_member disk
接下來使用 --zero-superblock
來把 metadata 清乾淨:
mdadm --zero-superblock /dev/sd[bcdefg]1
最後再用 lsblk
確定一次,只要沒有出現 linux_raid_member
就可以放心將硬體資源挪作他用了。
寫了一個 script 去檢查 RAID 是否有異常,若有異常則透過 Mailgun 發送警告
https://gist.github.com/johnroyer/94ee13a8e9718cad7c3b7fc8282accaf