# Soft RAID 在 Linux上的建置 - mdadm
###### tags: `Linux`
>[name=CHIA WEI, HU] [time=Sun, May 30, 2021 03:10 PM] [color=#907bf7]
mdadm是 Linux下的一款 RAID 管理工具。
我們可以利用 mdadm 在 Linux 系統中建立軟體RAID。
以下教學將簡單介紹如何在 Ubuntu 20.04 下建立RAID。
更詳細的教學與參數設定可以參考 [鳥哥的 Linux 私房菜](http://linux.vbird.org/linux_basic/0420quota/0420quota-centos5.php#raid_auto) ~
或是 外國網友的 [教學文](https://www.digitalocean.com/community/tutorial_series/how-to-configure-raid-arrays-on-ubuntu-16-04)
開始吧!
## 事前準備
當我們要在系統中建立RAID,我們必須有一顆(或以上)的未格式化,或是說未配置的硬碟。
我這邊手上的是兩顆 240GB 的SSD,原本在windows系統中有在使用。
我想要用240GB其中的40GB做RAID1(鏡像),所以是20GB的可用空間,另有20GB做spare space
確認資料都備份出來之後 (很重要 :ok_hand: 因為RAID會清空硬碟內容)
將其插在 linux 機器上之後,利用
```linux=
df -h
```
查看硬碟的掛載情形

會發現linux沒有讀取到我的SSD,這是因為還沒掛載到系統中。
可以發現有一個 **sdc**,所以可以猜到2個SSD分別代表 sda & sdb
透過
```linux=
ls /dev/[sh]d*
```
可以證實我們的猜測

再用 ```fdisk``` 確認一下
```linux=
fdisk -l /dev/sda
```

很好,我們確定要處理的是 sda 這顆disk了
這邊主要是確認不是系統碟,或是有重要資料的硬碟,不然等等就要欲哭無淚了! :cry:
接著開始分割,首先進入 ```fdisk```:
```linux=
fdisk /dev/sda
```

會看到很多可以下的指令
我們這邊主要會用到
- d:刪除分割區
- F:列出沒被分割的區域
- n:新增一個新分割區
- p:列出現在的分割表
- w:儲存並離開
- q:離開但並不儲存
可以看到有q這個選項,所以如果手殘的話還有得挽救哈
首先我們要刪掉舊的分割區,並新增一個分割區,步驟如下
1. 按 `d` 以刪掉分割區,輸入`1`,刪掉1號分割區
2. 再按 `d` 以刪掉分割區,輸入`2`,刪掉2號分割區
3. 輸入 `F`,確認一下現在分割的情況 !
5. 很好,都刪掉舊的了,按`w`儲存並離開,並執行 `partprobe` 以重新讀取硬碟
```linux =
sudo partprobe
```
5. 執行`fdisk /dev/sda` 重新進入`fdisk`,按`p`最後一下確認目前table有沒有問題
6. 沒有問題之後按 `n`來新增分割區,按`1`或Enter選 1號分割區
7. First Sector這也直接按 Enter
8. 接著輸入你想要多少容量的大小,就輸入 +size{K,M,G,T,P},例如我要20G,就輸入`+20GB`
9. 看你要建立多少個分割區就重複以上步驟6~8幾次!
10. 最後按`w`儲存後離開,執行 `partprobe` 以重新讀取硬碟

---
以上,分割區的部分大功告成~~ :clap:
## 建立RAID區
先安裝 mdadm
```linux=
sudo apt-get install mdadm
```
接著短短2行就建立了RAID陣列
```linux=
mdadm --create --auto=yes /dev/md0 --level=1 \
--raid-device=2 --spare-devices=1 /dev/sda{1,2,3}
```
什麼!你說太快了?好吧,以下來說明一下參數
```linux=
/dev/md0 # 建立的raid名稱
--level=1 # RAID1
--raid-device=2 # 2個分割區
--spare-devices=1 # 1個備援
/dev/sda{1,2,3} # 分別是sda1, sda2, sda3 這3個分割區
```
就按照你的需求輸入你自己需要的參數吧
稍等一下等他跑完,可以輸入
```linux=
mdadm --detail /dev/md0
cat /proc/mdstat
```
看一下進度跟RAID詳細內容,完成後便會長這樣

以上,就完成了RAID的建置 ~
## 格式化與掛載
建置完RAID之後,還需格式化並掛載才能使用
因為我這邊是預計透過SAMBA,使win10可以存取這個磁碟陣列
詳細步驟可以看 [這邊](https://hackmd.io/@cwhu/S1OgwzAt_)
因此我會格式化成 NTFS 格式,依序輸入以下指令
```linux=
mkfs -t ntfs /dev/md0
# 這裡要稍等一下...
mkdir /mnt/raid
mount /dev/md0 /mnt/raid
```
就可以在 /mnt/raid 中取得剛剛做好 RAID 的 md0 囉~~
輸入
```linux=
df /mnt/raid ; du -sm /mnt/raid/*
```
可以再check一下
## 模擬RAID錯誤與重建
為了更了解RAID在出錯時怎麼運作,因此我們來模擬一下出錯的情況吧
首先把一些東西複製進 `/mnt/raid`
```linux=
cp -a /etc /var/log /mnt/raid
```
確認是不是有東西進去了
```linux=
df /mnt/raid ; du -sm /mnt/raid/*
```

把`sda1` 設定成錯誤的狀態
```linux=
mdadm --manage /dev/md0 --fail /dev/sda1
```
就會出現確認訊息
```
mdadm: set /dev/sda1 faulty in /dev/md0
```
接著,其實就已經自動開始重建了!可以用
```linux=
/etc/samba# mdadm --detail /dev/md0
cat /proc/mdstat
```
看到磁碟狀態 & 重建狀況 & 重建預估時間 等等的資訊

重建完後,就會長這樣了

可以看到sda1 是損壞的
所以,接著我們要來練習如何將錯誤的分割區移除並加入新的磁碟
## 移除錯誤的分割區並加入新的磁碟
要先建立一個跟其他分割區一樣大的分割槽,也就是sad2、sda3的大小,20G
這邊因為我只有128GB,切好2個sda2 sda3後,已經沒有多餘空間切sda4
所以我選擇先將sda1移除
```linux=
mdadm --manage /dev/md0 --remove /dev/sda1
```
以上指令代表的動作是
1. 將sda1這個磁區從 /dev/md0 移出(取消raid)
2. Linux 系統關機 ( 我不確定現在有沒有支援 hot remove ! 但應該有 )
3. 拔出 /dev/sda1 這顆磁碟,裝上新的 /dev/sda1 磁碟,接著開機
再來,安裝新的 dev/sda1 進入 /dev/md0
```linux=
mdadm --manage /dev/md0 --add /dev/sda1
```
最後,確認一下
```linux=
mdadm --detail /dev/md0
```

很好!一切搞定!
接著,我們要來讓系統可以在開機後自動啟動RAID 掛載硬碟
## 開機後自動啟動RAID 掛載硬碟
先利用 `mdadm --detail /dev/md0 | grep -i uuid` 或是 `sudo blkid`
看一下 md0 的 UUID
```
UUID : 9f13c9f6:590abef9:6ffab2c5:0142f291
```
修改設定檔 `/etc/mdadm/mdadm.conf`
新增
```=
ARRAY /dev/md0 UUID=9f13c9f6:590abef9:6ffab2c5:0142f291
```
修改開機掛載設定檔 `/etc/fstab`
新增
```linux=
/dev/md0 /mnt/raid ntfs defaults 1 2
```
`/etc/fstab` 參數依序說明
```linux=
/dev/md0 # device:磁區或標頭。
/mnt/raid # MountPoint:掛載的目錄。
ntfs # filesystem/type:該磁區的檔案格式。
defaults # parameters/options:檔案格式參數區。
1 # dump:是否可以被 dump 指令備份
# 0:不要做備份﹔1:要做備份﹔2:要做備份,重要度比 1 小。
2 # fsck/pass:是否於開機時以 fsck 檢驗磁區
# 0:不檢驗﹔1:先檢驗﹔2:後檢驗。
```
最後,取消現有的掛載,並掛載config內設定的內容
```linux=
umount /dev/md0; mount -a
```
利用 `df /mnt/raid`
確認沒問題後,重開機看看RAID是否運作正常吧~~ :satisfied:
## 關閉RAID
最後的最後,除非以後都還要用這個RAID
否則還是建議在不使用之後,將此RAID關閉,以免未來遇到奇怪的問題 :no_mouth:
卸載 md0
```linux=
umount /dev/md0
```
修改 `/etc/fstab`
```linux=
# /dev/md0 /mnt/raid ntfs defaults 1 2
# 將以上這一行刪掉,或者是加'#'註解掉也可以。
```
直接關閉 /dev/md0
```linux=
mdadm --stop /dev/md0
```
就一句,md0 的 RAID 就關閉了!
另外因為分割槽並沒有重新規劃過,如果沒有刪除metadata,系統還是會建立起這個RAID
```linux=
dd if=/dev/zero of=/dev/sda1 bs=1M count=10
dd if=/dev/zero of=/dev/sda2 bs=1M count=10
dd if=/dev/zero of=/dev/sda3 bs=1M count=10
```
利用 `cat /proc/mdstat` 確認一下
還有 mdadm 設定檔 `/etc/mdadm/mdadm.conf` 也要修改
```linux=
# ARRAY /dev/md0 UUID=9f13c9f6:590abef9:6ffab2c5:0142f291
# 一樣將以上這一行刪掉,或者是加'#'註解掉也可以。
```
---
## 結語
以上,恭喜完成一串長長的設定,相信彼此都學到不少了!
建議在做RAID時,可以使用不同的硬碟來做RAID
除了可以用 RAID 加速存取速度外
在硬碟一次壞一顆時,也比較好用以上教學的觀念去做處置
---
最後提醒:exclamation:RAID不是備份~
要備份請遵照「不要將雞蛋放在同一個籃子」的原則
做好異地備援,才是上上策
感謝您的閱讀,有任何問題歡迎留言討論~