## 14.2 軟件磁盤陣列 (Software RAID)
在過去鳥哥還年輕的時代,我們能使用的硬盤容量都不大,幾十 GB 的容量就是大硬盤了!但是某些情況下,我們需要很大容量的儲存空間, 例如鳥哥在跑的空氣品質模式所輸出的數據文件一個案例通常需要好幾 GB ,連續跑個幾個案例,磁盤容量就不夠用了。 此時我該如何是好?其實可以通過一種儲存機制,稱為磁盤陣列 (RAID) 的就是了。這種機制的功能是什么?他有哪些等級?什么是硬件、軟件磁盤陣列?Linux 支持什么樣的軟件磁盤陣列? 下面就讓我們來談談!
### 14.2.1 什么是 RAID
磁盤陣列全名是“ Redundant Arrays of Inexpensive Disks, RAID ”,英翻中的意思是:容錯式廉價磁盤陣列。 RAID 可以通過一個技術(軟件或硬件),將多個較小的磁盤整合成為一個較大的磁盤設備; 而這個較大的磁盤功能可不止是儲存而已,他還具有數據保護的功能呢。整個 RAID 由于選擇的等級 (level) 不同,而使得整合后的磁盤具有不同的功能,基本常見的 level 有這幾種[[2]](#ps2):
* RAID-0 (等量模式, stripe):性能最佳
這種模式如果使用相同型號與容量的磁盤來組成時,效果較佳。這種模式的 RAID 會將磁盤先切出等量的區塊 (名為chunk,一般可設置 4K~1M 之間), 然后當一個文件要寫入 RAID 時,該文件會依據 chunk 的大小切割好,之后再依序放到各個磁盤里面去。由于每個磁盤會交錯的存放數據, 因此當你的數據要寫入 RAID 時,數據會被等量的放置在各個磁盤上面。舉例來說,你有兩顆磁盤組成 RAID-0 , 當你有 100MB 的數據要寫入時,每個磁盤會各被分配到 50MB 的儲存量。RAID-0 的示意圖如下所示:
圖14.2.1、RAID-0 的磁盤寫入示意圖
上圖的意思是,在組成 RAID-0 時,每顆磁盤 (Disk A 與 Disk B) 都會先被區隔成為小區塊 (chunk)。 當有數據要寫入 RAID 時,數據會先被切割成符合小區塊的大小,然后再依序一個一個的放置到不同的磁盤去。 由于數據已經先被切割并且依序放置到不同的磁盤上面,因此每顆磁盤所負責的數據量都降低了!照這樣的情況來看, 越多顆磁盤組成的 RAID-0 性能會越好,因為每顆負責的數據量就更低了! 這表示我的數據可以分散讓多顆磁盤來儲存,當然性能會變的更好啊!此外,磁盤總容量也變大了! 因為每顆磁盤的容量最終會加總成為 RAID-0 的總容量喔!
只是使用此等級你必須要自行負擔數據損毀的風險,由上圖我們知道文件是被切割成為適合每顆磁盤分區區塊的大小, 然后再依序放置到各個磁盤中。想一想,如果某一顆磁盤損毀了,那么文件數據將缺一塊,此時這個文件就損毀了。 由于每個文件都是這樣存放的,因此 RAID-0 只要有任何一顆磁盤損毀,在 RAID 上面的所有數據都會遺失而無法讀取。
另外,如果使用不同容量的磁盤來組成 RAID-0 時,由于數據是一直等量的依序放置到不同磁盤中,當小容量磁盤的區塊被用完了, 那么所有的數據都將被寫入到最大的那顆磁盤去。舉例來說,我用 200G 與 500G 組成 RAID-0 , 那么最初的 400GB 數據可同時寫入兩顆磁盤 (各消耗 200G 的容量),后來再加入的數據就只能寫入 500G 的那顆磁盤中了。 此時的性能就變差了,因為只剩下一顆可以存放數據嘛!
* RAID-1 (映射模式, mirror):完整備份
這種模式也是需要相同的磁盤容量的,最好是一模一樣的磁盤啦!如果是不同容量的磁盤組成 RAID-1 時,那么總容量將以最小的那一顆磁盤為主!這種模式主要是“讓同一份數據,完整的保存在兩顆磁盤上頭”。舉例來說,如果我有一個 100MB 的文件,且我僅有兩顆磁盤組成 RAID-1 時, 那么這兩顆磁盤將會同步寫入 100MB 到他們的儲存空間去。 因此,整體 RAID 的容量幾乎少了 50%。由于兩顆硬盤內容一模一樣,好像鏡子映照出來一樣, 所以我們也稱他為 mirror 模式啰~
圖14.2.2、RAID-1 的磁盤寫入示意圖
如上圖所示,一份數據傳送到 RAID-1 之后會被分為兩股,并分別寫入到各個磁盤里頭去。 由于同一份數據會被分別寫入到其他不同磁盤,因此如果要寫入 100MB 時,數據傳送到 I/O 總線后會被復制多份到各個磁盤, 結果就是數據量感覺變大了!因此在大量寫入 RAID-1 的情況下,寫入的性能可能會變的非常差 (因為我們只有一個南橋啊!)。 好在如果你使用的是硬件 RAID (磁盤陣列卡) 時,磁盤陣列卡會主動的復制一份而不使用系統的 I/O 總線,性能方面則還可以。 如果使用軟件磁盤陣列,可能性能就不好了。
由于兩顆磁盤內的數據一模一樣,所以任何一顆硬盤損毀時,你的數據還是可以完整的保留下來的! 所以我們可以說, RAID-1 最大的優點大概就在于數據的備份吧!不過由于磁盤容量有一半用在備份, 因此總容量會是全部磁盤容量的一半而已。雖然 RAID-1 的寫入性能不佳,不過讀取的性能則還可以啦!這是因為數據有兩份在不同的磁盤上面,如果多個 processes 在讀取同一筆數據時, RAID 會自行取得最佳的讀取平衡。
* RAID 1+0,RAID 0+1
RAID-0 的性能佳但是數據不安全,RAID-1 的數據安全但是性能不佳,那么能不能將這兩者整合起來設置 RAID 呢? 可以啊!那就是 RAID 1+0 或 RAID 0+1。所謂的 RAID 1+0 就是: (1)先讓兩顆磁盤組成 RAID 1,并且這樣的設置共有兩組; (2)將這兩組 RAID 1 再組成一組 RAID 0。這就是 RAID 1+0 啰!反過來說,RAID 0+1 就是先組成 RAID-0 再組成 RAID-1 的意思。
圖14.2.3、RAID-1+0 的磁盤寫入示意圖
如上圖所示,Disk A + Disk B 組成第一組 RAID 1,Disk C + Disk D 組成第二組 RAID 1, 然后這兩組再整合成為一組 RAID 0。如果我有 100MB 的數據要寫入,則由于 RAID 0 的關系, 兩組 RAID 1 都會寫入 50MB,又由于 RAID 1 的關系,因此每顆磁盤就會寫入 50MB 而已。 如此一來不論哪一組 RAID 1 的磁盤損毀,由于是 RAID 1 的圖像數據,因此就不會有任何問題發生了!這也是目前儲存設備廠商最推薦的方法!

**Tips** 為何會推薦 RAID 1+0 呢?想像你有 20 顆磁盤組成的系統,每兩顆組成一個 RAID1,因此你就有總共 10組可以自己復原的系統了! 然后這 10組再組成一個新的 RAID0,速度立刻拉升 10倍了!同時要注意,因為每組 RAID1 是個別獨立存在的,因此任何一顆磁盤損毀, 數據都是從另一顆磁盤直接復制過來重建,并不像 RAID5/RAID6 必須要整組 RAID 的磁盤共同重建一顆獨立的磁盤系統!性能上差非常多! 而且 RAID 1 與 RAID 0 是不需要經過計算的 (striping) !讀寫性能也比其他的 RAID 等級好太多了!
* RAID 5:性能與數據備份的均衡考慮
RAID-5 至少需要三顆以上的磁盤才能夠組成這種類型的磁盤陣列。這種磁盤陣列的數據寫入有點類似 RAID-0 , 不過每個循環的寫入過程中 (striping),在每顆磁盤還加入一個同位檢查數據 (Parity) ,這個數據會記錄其他磁盤的備份數據, 用于當有磁盤損毀時的救援。RAID-5 讀寫的情況有點像下面這樣:
圖14.2.4、RAID-5 的磁盤寫入示意圖
如上圖所示,每個循環寫入時,都會有部分的同位檢查碼 (parity) 被記錄起來,并且記錄的同位檢查碼每次都記錄在不同的磁盤, 因此,任何一個磁盤損毀時都能夠借由其他磁盤的檢查碼來重建原本磁盤內的數據喔!不過需要注意的是, 由于有同位檢查碼,因此 RAID 5 的總容量會是整體磁盤數量減一顆。以上圖為例, 原本的 3 顆磁盤只會剩下 (3-1)=2 顆磁盤的容量。而且當損毀的磁盤數量大于等于兩顆時,這整組 RAID 5 的數據就損毀了。 因為 RAID 5 默認僅能支持一顆磁盤的損毀情況。
在讀寫性能的比較上,讀取的性能還不賴!與 RAID-0 有的比!不過寫的性能就不見得能夠增加很多! 這是因為要寫入 RAID 5 的數據還得要經過計算同位檢查碼 (parity) 的關系。由于加上這個計算的動作, 所以寫入的性能與系統的硬件關系較大!尤其當使用軟件磁盤陣列時,同位檢查碼是通過 CPU 去計算而非專職的磁盤陣列卡, 因此性能方面還需要評估。
另外,由于 RAID 5 僅能支持一顆磁盤的損毀,因此近來還有發展出另外一種等級,就是 RAID 6 ,這個 RAID 6 則使用兩顆磁盤的容量作為 parity 的儲存,因此整體的磁盤容量就會少兩顆,但是允許出錯的磁盤數量就可以達到兩顆了! 也就是在 RAID 6 的情況下,同時兩顆磁盤損毀時,數據還是可以救回來!
* Spare Disk:預備磁盤的功能:
當磁盤陣列的磁盤損毀時,就得要將壞掉的磁盤拔除,然后換一顆新的磁盤。換成新磁盤并且順利啟動磁盤陣列后, 磁盤陣列就會開始主動的重建 (rebuild) 原本壞掉的那顆磁盤數據到新的磁盤上!然后你磁盤陣列上面的數據就復原了! 這就是磁盤陣列的優點。不過,我們還是得要動手拔插硬盤,除非你的系統有支持熱拔插,否則通常得要關機才能這么做。
為了讓系統可以實時的在壞掉硬盤時主動的重建,因此就需要預備磁盤 (spare disk) 的輔助。 所謂的 spare disk 就是一顆或多顆沒有包含在原本磁盤陣列等級中的磁盤,這顆磁盤平時并不會被磁盤陣列所使用, 當磁盤陣列有任何磁盤損毀時,則這顆 spare disk 會被主動的拉進磁盤陣列中,并將壞掉的那顆硬盤移出磁盤陣列! 然后立即重建數據系統。如此你的系統則可以永保安康啊!若你的磁盤陣列有支持熱拔插那就更完美了! 直接將壞掉的那顆磁盤拔除換一顆新的,再將那顆新的設置成為 spare disk ,就完成了!
舉例來說,鳥哥之前所待的研究室有一個磁盤陣列可允許 16 顆磁盤的數量,不過我們只安裝了 10 顆磁盤作為 RAID 5。 每顆磁盤的容量為 250GB,我們用了一顆磁盤作為 spare disk ,并將其他的 9 顆設置為一個 RAID 5, 因此這個磁盤陣列的總容量為: (9-1)*250G=2000G。運行了一兩年后真的有一顆磁盤壞掉了,我們后來看燈號才發現! 不過對系統沒有影響呢!因為 spare disk 主動的加入支持,壞掉的那顆拔掉換顆新的,并重新設置成為 spare 后, 系統內的數據還是完整無缺的!嘿嘿!真不錯!
* 磁盤陣列的優點
說的口沫橫飛,重點在哪里呢?其實你的系統如果需要磁盤陣列的話,其實重點在于:
1. 數據安全與可靠性:指的并非網絡信息安全,而是當硬件 (指磁盤) 損毀時,數據是否還能夠安全的救援或使用之意;
2. 讀寫性能:例如 RAID 0 可以加強讀寫性能,讓你的系統 I/O 部分得以改善;
3. 容量:可以讓多顆磁盤組合起來,故單一文件系統可以有相當大的容量。
尤其數據的可靠性與完整性更是使用 RAID 的考慮重點!畢竟硬件壞掉換掉就好了,軟件數據損毀那可不是鬧著玩的! 所以企業界為何需要大量的 RAID 來做為文件系統的硬件基準,現在您有點了解了吧?那依據這三個重點,我們來列表看看上面幾個重要的 RAID 等級各有哪些優點吧!假設有 n 顆磁盤組成的 RAID 設置喔!
| 項目 | RAID0 | RAID1 | RAID10 | RAID5 | RAID6 |
| --- | --- |
| 最少磁盤數 | 2 | 2 | 4 | 3 | 4 |
| 最大容錯磁盤數(1) | 無 | n-1 | n/2 | 1 | 2 |
| 數據安全性(1) | 完全沒有 | 最佳 | 最佳 | 好 | 比 RAID5 好 |
| 理論寫入性能(2) | n | 1 | n/2 | <n-1 | <n-2 |
| 理論讀出性能(2) | n | n | n | <n-1 | <n-2 |
| 可用容量(3) | n | 1 | n/2 | n-1 | n-2 |
| 一般應用 | 強調性能但數據不重要的環境 | 數據與備份 | 服務器、云系統常用 | 數據與備份 | 數據與備份 |
因為 RAID5, RAID6 讀寫都需要經過 parity 的計算機制,因此讀/寫性能都不會剛好滿足于使用的磁盤數量喔!
另外,根據使用的情況不同,一般推薦的磁盤陣列等級也不太一樣。以鳥哥為例,在鳥哥的跑空氣品質模式之后的輸出數據,動輒幾百 GB 的單一大文件數據, 這些情況鳥哥會選擇放在 RAID6 的陣列環境下,這是考慮到數據保全與總容量的應用,因為 RAID 6 的性能已經足以應付模式讀入所需的環境。
近年來鳥哥也比較積極在作一些云程序環境的設計,在云環境下,確保每個虛擬機能夠快速的反應以及提供數據保全是最重要的部份! 因此性能方面比較弱的 RAID5/RAID6 是不考慮的,總結來說,大概就剩下 RAID10 能夠滿足云環境的性能需求了。在某些更特別的環境下, 如果搭配 SSD 那才更具有性能上的優勢哩!
### 14.2.2 software, hardware RAID
為何磁盤陣列又分為硬件與軟件呢?所謂的硬件磁盤陣列 (hardware RAID) 是通過磁盤陣列卡來達成陣列的目的。 磁盤陣列卡上面有一塊專門的芯片在處理 RAID 的任務,因此在性能方面會比較好。在很多任務 (例如 RAID 5 的同位檢查碼計算) 磁盤陣列并不會重復消耗原本系統的 I/O 總線,理論上性能會較佳。此外目前一般的中高階磁盤陣列卡都支持熱拔插, 亦即在不關機的情況下抽換損壞的磁盤,對于系統的復原與數據的可靠性方面非常的好用。
不過一塊好的磁盤陣列卡動不動就上萬元臺幣,便宜的在主板上面“附贈”的磁盤陣列功能可能又不支持某些高階功能, 例如低階主板若有磁盤陣列芯片,通常僅支持到 RAID0 與 RAID1 ,鳥哥喜歡的 RAID6 并沒有支持。 此外,操作系統也必須要擁有磁盤陣列卡的驅動程序,才能夠正確的捉到磁盤陣列所產生的磁盤機!
由于磁盤陣列有很多優秀的功能,然而硬件磁盤陣列卡偏偏又貴的很~因此就有發展出利用軟件來仿真磁盤陣列的功能, 這就是所謂的軟件磁盤陣列 (software RAID)。軟件磁盤陣列主要是通過軟件來仿真陣列的任務, 因此會損耗較多的系統資源,比如說 CPU 的運算與 I/O 總線的資源等。不過目前我們的個人計算機實在已經非常快速了, 因此以前的速度限制現在已經不存在!所以我們可以來玩一玩軟件磁盤陣列!
我們的 CentOS 提供的軟件磁盤陣列為 mdadm 這套軟件,這套軟件會以 partition 或 disk 為磁盤的單位,也就是說,你不需要兩顆以上的磁盤,只要有兩個以上的分區 (partition) 就能夠設計你的磁盤陣列了。此外, mdadm 支持剛剛我們前面提到的 RAID0/RAID1/RAID5/spare disk 等! 而且提供的管理機制還可以達到類似熱拔插的功能,可以線上 (文件系統正常使用) 進行分區的抽換! 使用上也非常的方便呢!
另外你必須要知道的是,硬件磁盤陣列在 Linux 下面看起來就是一顆實際的大磁盤,因此硬件磁盤陣列的設備文件名為 /dev/sd[a-p] ,因為使用到 SCSI 的模塊之故。至于軟件磁盤陣列則是系統仿真的,因此使用的設備文件名是系統的設備文件, 文件名為 /dev/md0, /dev/md1...,兩者的設備文件名并不相同!不要搞混了喔!因為很多朋友常常覺得奇怪, 怎么他的 RAID 文件名跟我們這里測試的軟件 RAID 文件名不同,所以這里特別強調說明喔!

**Tips** Intel 的南橋附贈的磁盤陣列功能,在 windows 下面似乎是完整的磁盤陣列,但是在 Linux 下面則被視為是軟件磁盤陣列的一種! 因此如果你有設置過 Intel 的南橋芯片磁盤陣列,那在 Linux 下面反而還會是 /dev/md126, /dev/md127 等等設備文件名, 而他的分區竟然是 /dev/md126p1, /dev/md126p2... 之類的喔!比較特別,所以這里加強說明!
### 14.2.3 軟件磁盤陣列的設置
軟件磁盤陣列的設置很簡單呢!簡單到讓你很想笑喔!因為你只要使用一個指令即可!那就是 mdadm 這個指令。 這個指令在創建 RAID 的語法有點像這樣:
```
[root@study ~]# mdadm --detail /dev/md0
[root@study ~]# mdadm --create /dev/md[0-9] --auto=yes --level=[015] --chunk=NK \
> --raid-devices=N --spare-devices=N /dev/sdx /dev/hdx...
選項與參數:
--create :為創建 RAID 的選項;
--auto=yes :決定創建后面接的軟件磁盤陣列設備,亦即 /dev/md0, /dev/md1...
--chunk=Nk :決定這個設備的 chunk 大小,也可以當成 stripe 大小,一般是 64K 或 512K。
--raid-devices=N :使用幾個磁盤 (partition) 作為磁盤陣列的設備
--spare-devices=N :使用幾個磁盤作為備用 (spare) 設備
--level=[015] :設置這組磁盤陣列的等級。支持很多,不過建議只要用 0, 1, 5 即可
--detail :后面所接的那個磁盤陣列設備的詳細信息
```
上面的語法中,最后面會接許多的設備文件名,這些設備文件名可以是整顆磁盤,例如 /dev/sdb , 也可以是分區,例如 /dev/sdb1 之類。不過,這些設備文件名的總數必須要等于 --raid-devices 與 --spare-devices 的個數總和才行!鳥哥利用我的測試機來創建一個 RAID 5 的軟件磁盤陣列給您瞧瞧! 下面是鳥哥希望做成的 RAID 5 環境:
* 利用 4 個 partition 組成 RAID 5;
* 每個 partition 約為 1GB 大小,需確定每個 partition 一樣大較佳;
* 利用 1 個 partition 設置為 spare disk
* chunk 設置為 256K 這么大即可!
* 這個 spare disk 的大小與其他 RAID 所需 partition 一樣大!
* 將此 RAID 5 設備掛載到 /srv/raid 目錄下
最終我需要 5 個 1GB 的 partition。在鳥哥的測試機中,根據前面的章節實做下來,包括課后的情境仿真題目,目前應該還有 8GB 可供利用! 因此就利用這部測試機的 /dev/vda 切出 5 個 1G 的分區。實際的流程鳥哥就不一一展示了,自己通過 gdisk /dev/vda 實作一下! 最終這部測試機的結果應該如下所示:
```
[root@study ~]# gdisk -l /dev/vda
Number Start (sector) End (sector) Size Code Name
1 2048 6143 2.0 MiB EF02
2 6144 2103295 1024.0 MiB 0700
3 2103296 65026047 30.0 GiB 8E00
4 65026048 67123199 1024.0 MiB 8300 Linux filesystem
5 67123200 69220351 1024.0 MiB FD00 Linux RAID
6 69220352 71317503 1024.0 MiB FD00 Linux RAID
7 71317504 73414655 1024.0 MiB FD00 Linux RAID
8 73414656 75511807 1024.0 MiB FD00 Linux RAID
9 75511808 77608959 1024.0 MiB FD00 Linux RAID
# 上面特殊字體的部份就是我們需要的那 5 個 partition 啰!注意注意!
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 40G 0 disk
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
|-vda3 252:3 0 30G 0 part
| |-centos-root 253:0 0 10G 0 lvm /
| |-centos-swap 253:1 0 1G 0 lvm [SWAP]
| `-centos-home 253:2 0 5G 0 lvm /home
|-vda4 252:4 0 1G 0 part /srv/myproject
|-vda5 252:5 0 1G 0 part
|-vda6 252:6 0 1G 0 part
|-vda7 252:7 0 1G 0 part
|-vda8 252:8 0 1G 0 part
`-vda9 252:9 0 1G 0 part
```
* 以 mdadm 創建 RAID
接下來就簡單啦!通過 mdadm 來創建磁盤陣列先!
```
[root@study ~]# mdadm --create /dev/md0 --auto=yes --level=5 --chunk=256K \
> --raid-devices=4 --spare-devices=1 /dev/vda{5,6,7,8,9}
mdadm: /dev/vda5 appears to contain an ext2fs file system
size=1048576K mtime=Thu Jun 25 00:35:01 2015 # 某些時刻會出現這個東西!沒關系的!
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
# 詳細的參數說明請回去前面看看啰!這里我通過 {} 將重復的項目簡化!
# 此外,因為鳥哥這個系統經常在創建測試的環境,因此系統可能會抓到之前的 filesystem
# 所以就會出現如上前兩行的訊息!那沒關系的!直接按下 y 即可刪除舊系統
[root@study ~]# mdadm --detail /dev/md0
/dev/md0: # RAID 的設備文件名
Version : 1.2
Creation Time : Mon Jul 27 15:17:20 2015 # 創建 RAID 的時間
Raid Level : raid5 # 這就是 RAID5 等級!
Array Size : 3142656 (3.00 GiB 3.22 GB) # 整組 RAID 的可用容量
Used Dev Size : 1047552 (1023.17 MiB 1072.69 MB) # 每顆磁盤(設備)的容量
Raid Devices : 4 # 組成 RAID 的磁盤數量
Total Devices : 5 # 包括 spare 的總磁盤數
Persistence : Superblock is persistent
Update Time : Mon Jul 27 15:17:31 2015
State : clean # 目前這個磁盤陣列的使用狀態
Active Devices : 4 # 啟動(active)的設備數量
Working Devices : 5 # 目前使用于此陣列的設備數
Failed Devices : 0 # 損壞的設備數
Spare Devices : 1 # 預備磁盤的數量
Layout : left-symmetric
Chunk Size : 256K # 就是 chunk 的小區塊容量
Name : study.centos.vbird:0 (local to host study.centos.vbird)
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
Events : 18
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
2 252 7 2 active sync /dev/vda7
5 252 8 3 active sync /dev/vda8
4 252 9 - spare /dev/vda9
# 最后五行就是這五個設備目前的情況,包括四個 active sync 一個 spare !
# 至于 RaidDevice 指的則是此 RAID 內的磁盤順序
```
由于磁盤陣列的創建需要一些時間,所以你最好等待數分鐘后再使用“ mdadm --detail /dev/md0 ”去查閱你的磁盤陣列詳細信息! 否則有可能看到某些磁盤正在“spare rebuilding”之類的創建字樣!通過上面的指令, 你就能夠創建一個 RAID5 且含有一顆 spare disk 的磁盤陣列啰!非常簡單吧! 除了指令之外,你也可以查閱如下的文件來看看系統軟件磁盤陣列的情況:
```
[root@study ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 vda8[5] vda9[4](S) vda7[2] vda6[1] vda5[0] <==第一行
3142656 blocks super 1.2 level 5, 256k chunk, algorithm 2 [4/4] [UUUU] <==第二行
unused devices: <none>
```
上述的數據比較重要的在特別指出的第一行與第二行部分[[3]](#ps3):
* 第一行部分:指出 md0 為 raid5 ,且使用了 vda8, vda7, vda6, vda5 等四顆磁盤設備。每個設備后面的中括號 [] 內的數字為此磁盤在 RAID 中的順序 (RaidDevice);至于 vda9 后面的 [S] 則代表 vda9 為 spare 之意。
* 第二行:此磁盤陣列擁有 3142656 個block(每個 block 單位為 1K),所以總容量約為 3GB, 使用 RAID 5 等級,寫入磁盤的小區塊 (chunk) 大小為 256K,使用 algorithm 2 磁盤陣列演算法。 [m/n] 代表此陣列需要 m 個設備,且 n 個設備正常運行。因此本 md0 需要 4 個設備且這 4 個設備均正常運行。 后面的 [UUUU] 代表的是四個所需的設備 (就是 [m/n] 里面的 m) 的啟動情況,U 代表正常運行,若為 _ 則代表不正常。
這兩種方法都可以知道目前的磁盤陣列狀態啦!
* 格式化與掛載使用 RAID
接下來就是開始使用格式化工具啦!這部分就需要注意喔!因為涉及到 xfs 文件系統的優化!還記得第七章的內容吧?我們這里的參數為:
* srtipe (chunk) 容量為 256K,所以 su=256k
* 共有 4 顆組成 RAID5 ,因此容量少一顆,所以 sw=3 喔!
* 由上面兩項計算出數據寬度為: 256K*3=768k
所以整體來說,要優化這個 XFS 文件系統就變成這樣:
```
[root@study ~]# mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0
# 有趣吧!是 /dev/md0 做為設備被格式化呢!
[root@study ~]# mkdir /srv/raid
[root@study ~]# mount /dev/md0 /srv/raid
[root@study ~]# df -Th /srv/raid
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 33M 3.0G 2% /srv/raid
# 看吧!多了一個 /dev/md0 的設備,而且真的可以讓你使用呢!還不賴!
```
### 14.2.4 仿真 RAID 錯誤的救援模式
俗話說“天有不測風云、人有旦夕禍福”,誰也不知道你的磁盤陣列內的設備啥時會出差錯,因此, 了解一下軟件磁盤陣列的救援還是必須的!下面我們就來玩一玩救援的機制吧!首先來了解一下 mdadm 這方面的語法:
```
[root@study ~]# mdadm --manage /dev/md[0-9] [--add 設備] [--remove 設備] [--fail 設備]
選項與參數:
--add :會將后面的設備加入到這個 md 中!
--remove :會將后面的設備由這個 md 中移除
--fail :會將后面的設備設置成為出錯的狀態
```
* 設置磁盤為錯誤 (fault)
首先,我們來處理一下,該如何讓一個磁盤變成錯誤,然后讓 spare disk 自動的開始重建系統呢?
```
# 0\. 先復制一些東西到 /srv/raid 去,假設這個 RAID 已經在使用了
[root@study ~]# cp -a /etc /var/log /srv/raid
[root@study ~]# df -Th /srv/raid ; du -sm /srv/raid/*
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 144M 2.9G 5% /srv/raid
28 /srv/raid/etc <==看吧!確實有數據在里面喔!
51 /srv/raid/log
# 1\. 假設 /dev/vda7 這個設備出錯了!實際仿真的方式:
[root@study ~]# mdadm --manage /dev/md0 --fail /dev/vda7
mdadm: set /dev/vda7 faulty in /dev/md0 # 設置成為錯誤的設備啰!
/dev/md0:
.....(中間省略).....
Update Time : Mon Jul 27 15:32:50 2015
State : clean, degraded, recovering
Active Devices : 3
Working Devices : 4
Failed Devices : 1 <==出錯的磁盤有一個!
Spare Devices : 1
.....(中間省略).....
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 spare rebuilding /dev/vda9
5 252 8 3 active sync /dev/vda8
2 252 7 - faulty /dev/vda7
# 看到沒!這的動作要快做才會看到! /dev/vda9 啟動了而 /dev/vda7 死掉了
```
上面的畫面你得要快速的連續輸入那些 mdadm 的指令才看的到!因為你的 RAID 5 正在重建系統! 若你等待一段時間再輸入后面的觀察指令,則會看到如下的畫面了:
```
# 2\. 已經借由 spare disk 重建完畢的 RAID 5 情況
[root@study ~]# mdadm --detail /dev/md0
....(前面省略)....
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
2 252 7 - faulty /dev/vda7
```
看吧!又恢復正常了!真好!我們的 /srv/raid 文件系統是完整的!并不需要卸載!很棒吧!
* 將出錯的磁盤移除并加入新磁盤
因為我們的系統那個 /dev/vda7 實際上沒有壞掉啊!只是用來仿真而已啊!因此,如果有新的磁盤要替換,其實替換的名稱會一樣啊! 也就是我們需要:
1. 先從 /dev/md0 陣列中移除 /dev/vda7 這顆“磁盤”
2. 整個 Linux 系統關機,拔出 /dev/vda7 這顆“磁盤”,并安裝上新的 /dev/vda7 “磁盤”,之后開機
3. 將新的 /dev/vda7 放入 /dev/md0 陣列當中!
```
# 3\. 拔除“舊的”/dev/vda7 磁盤
[root@study ~]# mdadm --manage /dev/md0 --remove /dev/vda7
# 假設接下來你就進行了上面談到的第 2, 3 個步驟,然后重新開機成功了!
# 4\. 安裝“新的”/dev/vda7 磁盤
[root@study ~]# mdadm --manage /dev/md0 --add /dev/vda7
[root@study ~]# mdadm --detail /dev/md0
....(前面省略)....
Number Major Minor RaidDevice State
0 252 5 0 active sync /dev/vda5
1 252 6 1 active sync /dev/vda6
4 252 9 2 active sync /dev/vda9
5 252 8 3 active sync /dev/vda8
6 252 7 - spare /dev/vda7
```
嘿嘿!你的磁盤陣列內的數據不但一直存在,而且你可以一直順利的運行 /srv/raid 內的數據,即使 /dev/vda7 損毀了!然后通過管理的功能就能夠加入新磁盤且拔除壞掉的磁盤!注意,這一切都是在上線 (on-line) 的情況下進行! 所以,您說這樣的咚咚好不好用啊! ^_^
### 14.2.5 開機自動啟動 RAID 并自動掛載
新的 distribution 大多會自己搜尋 /dev/md[0-9] 然后在開機的時候給予設置好所需要的功能。不過鳥哥還是建議你, 修改一下配置文件吧! ^_^。software RAID 也是有配置文件的,這個配置文件在 /etc/mdadm.conf !這個配置文件內容很簡單, 你只要知道 /dev/md0 的 UUID 就能夠設置這個文件啦!這里鳥哥僅介紹他最簡單的語法:
```
[root@study ~]# mdadm --detail /dev/md0 | grep -i uuid
UUID : 2256da5f:4870775e:cf2fe320:4dfabbc6
# 后面那一串數據,就是這個設備向系統注冊的 UUID 識別碼!
# 開始設置 mdadm.conf
[root@study ~]# vim /etc/mdadm.conf
ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# RAID設備 識別碼內容
# 開始設置開機自動掛載并測試
[root@study ~]# blkid /dev/md0
/dev/md0: UUID="494cb3e1-5659-4efc-873d-d0758baec523" TYPE="xfs"
[root@study ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0
[root@study ~]# umount /dev/md0; mount -a
[root@study ~]# df -Th /srv/raid
Filesystem Type Size Used Avail Use% Mounted on
/dev/md0 xfs 3.0G 111M 2.9G 4% /srv/raid
# 你得確定可以順利掛載,并且沒有發生任何錯誤!
```
如果到這里都沒有出現任何問題!接下來就請 reboot 你的系統并等待看看能否順利的啟動吧! ^_^
### 14.2.6 關閉軟件 RAID(重要!)
除非你未來就是要使用這顆 software RAID (/dev/md0),否則你勢必要跟鳥哥一樣,將這個 /dev/md0 關閉! 因為他畢竟是我們在這個測試機上面的練習設備啊!為什么要關掉他呢?因為這個 /dev/md0 其實還是使用到我們系統的磁盤分區, 在鳥哥的例子里面就是 /dev/vda{5,6,7,8,9},如果你只是將 /dev/md0 卸載,然后忘記將 RAID 關閉, 結果就是....未來你在重新分區 /dev/vdaX 時可能會出現一些莫名的錯誤狀況啦!所以才需要關閉 software RAID 的步驟! 那如何關閉呢?也是簡單到爆炸!(請注意,確認你的 /dev/md0 確實不要用且要關閉了才進行下面的玩意兒)
```
# 1\. 先卸載且刪除配置文件內與這個 /dev/md0 有關的設置:
[root@study ~]# umount /srv/raid
[root@study ~]# vim /etc/fstab
UUID=494cb3e1-5659-4efc-873d-d0758baec523 /srv/raid xfs defaults 0 0
# 將這一行刪除掉!或者是注解掉也可以!
# 2\. 先覆蓋掉 RAID 的 metadata 以及 XFS 的 superblock,才關閉 /dev/md0 的方法
[root@study ~]# dd if=/dev/zero of=/dev/md0 bs=1M count=50
[root@study ~]# mdadm --stop /dev/md0
mdadm: stopped /dev/md0 <==不啰唆!這樣就關閉了!
[root@study ~]# dd if=/dev/zero of=/dev/vda5 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda6 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda7 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda8 bs=1M count=10
[root@study ~]# dd if=/dev/zero of=/dev/vda9 bs=1M count=10
[root@study ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
unused devices: <none> <==看吧!確實不存在任何陣列設備!
[root@study ~]# vim /etc/mdadm.conf
#ARRAY /dev/md0 UUID=2256da5f:4870775e:cf2fe320:4dfabbc6
# 一樣啦!刪除他或是注解他!
```
你可能會問,鳥哥啊,為啥上面會有數個 dd 的指令啊?干麻?這是因為 RAID 的相關數據其實也會存一份在磁盤當中,因此,如果你只是將配置文件移除, 同時關閉了 RAID,但是分區并沒有重新規劃過,那么重新開機過后,系統還是會將這顆磁盤陣列創建起來,只是名稱可能會變成 /dev/md127 就是了! 因此,移除掉 Software RAID 時,上述的 dd 指令不要忘記!但是...千千萬萬不要 dd 到錯誤的磁盤~那可是會欲哭無淚耶~

**Tips** 在這個練習中,鳥哥使用同一顆磁盤進行軟件 RAID 的實驗。不過朋友們要注意的是,如果真的要實作軟件磁盤陣列, 最好是由多顆不同的磁盤來組成較佳!因為這樣才能夠使用到不同磁盤的讀寫,性能才會好! 而數據分配在不同的磁盤,當某顆磁盤損毀時數據才能夠借由其他磁盤挽救回來!這點得特別留意呢!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀