# Linux Software Raid - MDADM開機磁碟

## 前言

 為了資料的安全Raid一直是必要的手段，高階伺服器使用Raid Card固然方便效能也較好，但價格也相對來說較高，隨著時代的進步，Linux上的Software Raid安裝也越來越便利，在預算有限又想要有Raid功能的話可以嘗試看看Software Raid，由於是使用CPU+OS來做Raid，效能上有一定程度的影響是必然的，但如果你都能接受使用Synology/QNAP這種NAS設備，那你應該也會能夠接受Software Raid，畢竟原理是一樣的。

## 安裝步驟 

#### 一、安裝媒體準備

 為了方便截圖，我使用最新版的Fedora 40來Demo，CentOS / Rocky / Oracle 等Redhat Like的OS安裝方式應該也一樣，Ubuntu / Debian 系我改天如果有空再來做(看心情 囧)。

 至 [https://fedoraproject.org/workstation/download](https://fedoraproject.org/workstation/download) 下載安裝Fedora Media Writer來製作USB安裝媒體，以下就不贅述了。

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/Dkkimage.png)

#### 二、使用USB安裝媒體開機安裝OS

 以下Demo是基於UEFI+GPT的環境，Legacy Bios上會有部分不同操作會稍微複雜一點，在這裡我就先不展示了。(一樣看哪天有心情再說 囧)

 首先找兩顆HDD，先把資料清空後接上(這張圖以後還會用到，先記得有這件事)，使用上面做好的USB開機 。

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/Vd4image.png)

選擇要安裝的位置。

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/waaimage.png)

點選剛剛接上的兩顆HDD，自訂組態選完成。

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/2SRimage.png)

修改每個Partition的裝置類型，全都改為RAID，改完之後點"完成"下一步

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/EmWimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/y9Bimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/D5Cimage.png)

確認變更

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/Jjcimage.png)

開始安裝，就完成了 &lt;&lt; 全文完 &gt;&gt; (開玩笑的)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/nDYimage.png)

此時如果先不要重新啟動，在Terminal中就可以看到Mirror正在進行中，不過不用管他直接重開機即可

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/ZZzimage.png)

## 確認Raid狀態

 安裝完成後，開機進入OS (請記得把USB拔掉......) ，來看一下我的Demo環境狀態

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/mv7image.png)

透過下面指令來確認Raid狀態，以下圖來說可知道md126已同步完成，md127正在同步、md125尚未開始同步

```
cat /proc/mdstat
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/2QTimage.png)

透過以下指令可確認各md的狀態

```
mdadm -D /dev/mdxxx
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/2CEimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/lhwimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/j1Cimage.png)

透過glances也可確認到抄寫的狀態

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/G2oimage.png)

LSBLK狀態

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/9QQimage.png)

FDISK狀態

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/9Swimage.png)

DF、FSTAB、mdadm.conf、BLKID 、grub.cfg 相關資訊

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/zctimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/fo6image.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/qecimage.png)

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/gcJimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/gcJimage.png)

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/UTyimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/UTyimage.png)

觀察上BLKID與grub.cfg就可以知道，sda1、sdb1的UUID都是df4f，sda2、sdb2的UUID都是382c，sda3、sdb3的UUID都是dfb3，但sda、sdb的UUID\_SUB不同(如黃線)，記得上面那張實體硬碟圖嗎 ? 我在上面依照 sda2 (09f3)、sdb2 (273f)標註了UUID\_SUB，讀者可以對照上面那張圖來確認一下。

好了，我們確認完這些事之後，再次確認一下 mdstat，等待同步完成後我們就可以進行後續的測試了

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/mCEimage.png)

## 讀寫測試

 同步好之後，我們來做一下讀寫測試

 讀取測試，由下圖可見兩顆磁碟會同時讀取

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/84oimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/84oimage.png)

 寫入測試，由下圖明顯可以看到資料寫入時 sda與sdb同時寫入

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/ccFimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/ccFimage.png)

## 手動移除磁碟測試

來看看如何手動將磁碟退出與加入Raid，首先先看一下Raid狀態

```
mdadm -D /dev/md127
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/GtIimage.png)

 手動將/dev/sda1變成故障狀態

```
mdadm /dev/md127 --fail /dev/sda1
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/gMmimage.png)

手動將/dev/sda1退出Raid

```
mdadm /dev/md127 --remove /dev/sda1
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/XbDimage.png)

再將/dev/sda1加回/dev/md127

```
mdadm /dev/md127 --add /dev/md127
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/517image.png)

由於磁碟不大只有1G，很快就同步完了

## Fail Over測試

 由於我的demo環境沒有熱插拔，所以我關機後將 sda (09f3) 拔掉後開機，開機後可以看到原本的sdb (273f)現在變成了sda

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/diLimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/diLimage.png)

我把原本sda (09f3)這顆HDD清除乾淨後，再關機後插上後開機，可以發現依然可以正常開機沒有問題，但原本的sda(273f)又變成sdb了

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/PEZimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/PEZimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/M7Gimage.png)

mdadm顯示另一顆HDD為Removed

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/wWjimage.png)

## Raid Rebuid

 首先先確認sdb (273f)的fdisk分割，我們要將sda建成一模一樣的狀態

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/BHuimage.png)

使用fdisk建立分割，並變更磁碟類別

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/D96image.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/UJximage.png)

將磁碟重新加入Raid，即會自動Rebuild

```
partprobe
mdadm /dev/md125 --add /dev/sda2
mdadm /dev/md126 --add /dev/sda1
mdadm /dev/md127 --add /dev/sda3
```

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/BpOimage.png)

![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/DO4image.png)

Raid Rebuid中...... 請稍後......

透過glances可以觀察到寫入狀況如下

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/o1ximage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/o1ximage.png)

等到Raid Rebuid完成後，關機拔掉sdb (273f)，來確認一下Rebuild完成的Disk是否可以正常運作，同時透過blkid確認到磁碟UUID\_SUB由原本的sda (09f3)變成sda (737f)了，但uuid還是382c沒有問題 (參照實體硬碟圖)

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/P6Yimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/P6Yimage.png)

反過來，關機將sda (737f)拔掉，插上sdb (273f)，依樣正常開機沒有問題

[![image.png](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/scaled-1680-/NvWimage.png)](https://mdfk.goddamn.idv.tw/uploads/images/gallery/2024-06/NvWimage.png)

如此一來便可以確信此機制能夠穩定運作沒有問題 ^^

## 後語

 透過以上實作，可以發現現在在UEFI環境下Linux設定Software Raid再也不像以前那麼困難了，在某些不想花大錢買中高階Server的環境下，或許可以透過這種方式獲得一定程度的Raid保護，再加上良好的備份應該也就可以符合不少使用情境，希望以上的技術分享會有幫助。