# 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 ``` 查看硬碟的掛載情形 ![](https://i.imgur.com/wC6QZX5.png) 會發現linux沒有讀取到我的SSD,這是因為還沒掛載到系統中。 可以發現有一個 **sdc**,所以可以猜到2個SSD分別代表 sda & sdb 透過 ```linux= ls /dev/[sh]d* ``` 可以證實我們的猜測 ![](https://i.imgur.com/usfYxYm.png) 再用 ```fdisk``` 確認一下 ```linux= fdisk -l /dev/sda ``` ![](https://i.imgur.com/qgTfgJB.png) 很好,我們確定要處理的是 sda 這顆disk了 這邊主要是確認不是系統碟,或是有重要資料的硬碟,不然等等就要欲哭無淚了! :cry: 接著開始分割,首先進入 ```fdisk```: ```linux= fdisk /dev/sda ``` ![](https://i.imgur.com/cKkDxVi.png) 會看到很多可以下的指令 我們這邊主要會用到 - d:刪除分割區 - F:列出沒被分割的區域 - n:新增一個新分割區 - p:列出現在的分割表 - w:儲存並離開 - q:離開但並不儲存 可以看到有q這個選項,所以如果手殘的話還有得挽救哈 首先我們要刪掉舊的分割區,並新增一個分割區,步驟如下 1. 按 `d` 以刪掉分割區,輸入`1`,刪掉1號分割區 2. 再按 `d` 以刪掉分割區,輸入`2`,刪掉2號分割區 3. 輸入 `F`,確認一下現在分割的情況 !![](https://i.imgur.com/AiMNZ1R.png) 5. 很好,都刪掉舊的了,按`w`儲存並離開,並執行 `partprobe` 以重新讀取硬碟 ```linux = sudo partprobe ``` 5. 執行`fdisk /dev/sda` 重新進入`fdisk`,按`p`最後一下確認目前table有沒有問題![](https://i.imgur.com/gCD23Ae.png) 6. 沒有問題之後按 `n`來新增分割區,按`1`或Enter選 1號分割區 7. First Sector這也直接按 Enter 8. 接著輸入你想要多少容量的大小,就輸入 +size{K,M,G,T,P},例如我要20G,就輸入`+20GB`![](https://i.imgur.com/zjxWwKz.png) 9. 看你要建立多少個分割區就重複以上步驟6~8幾次! 10. 最後按`w`儲存後離開,執行 `partprobe` 以重新讀取硬碟 ![](https://i.imgur.com/L4Wj9tv.png) --- 以上,分割區的部分大功告成~~ :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詳細內容,完成後便會長這樣 ![](https://i.imgur.com/2ws0Z2z.png) 以上,就完成了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/* ``` ![](https://i.imgur.com/VrhcBvO.png) 把`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 ``` 看到磁碟狀態 & 重建狀況 & 重建預估時間 等等的資訊 ![](https://i.imgur.com/Pxs9Enj.png) 重建完後,就會長這樣了 ![](https://i.imgur.com/6McYEGL.png) 可以看到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 ``` ![](https://i.imgur.com/qIugURz.png) 很好!一切搞定! 接著,我們要來讓系統可以在開機後自動啟動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不是備份~ 要備份請遵照「不要將雞蛋放在同一個籃子」的原則 做好異地備援,才是上上策 感謝您的閱讀,有任何問題歡迎留言討論~