Linux的基本學習(十一)——磁盤配額 與 磁盤陣列

前言:

承接前面的內容來繼續學習Linux

 

 

 

 

 


磁盤配額(Quota)的應用於實踐

磁盤配額

由於Linux系統是多人多任務的環境,所以會有多人共同使用一個磁盤空間的情況發生。如果其中有少數幾個用戶大量地佔用了硬盤空間的話,那勢必壓縮其他用戶的使用權力。因此管理員應該限制用戶的硬盤容量,以妥善分配系統資源,避免有人抗議。

舉例來說,用戶的默認家目錄都是在/home下面,如果/home是一個獨立的分區,假設這個分區有10GB,而/home下面共有30個賬號,也就是說,每個用戶平均應該會有333MB的空間纔對。偏偏有個用戶在它的家目錄放了很多影片,一個人佔用了8G,這就很不合理了。

如果想要讓磁盤的容量公平分配,這個時候就要靠磁盤配額幫忙。

磁盤配額的一般用途

比較常用磁盤配額的幾種情況是:

  • 針對網站服務器,例如:每個人的網頁空間容量限制
  • 針對郵件服務器,例如:每個人的郵件空間限制
  • 針對文件服務器,例如:每個人最大的可用網絡硬盤空間

這些是針對網絡服務的設計,如果是針對Linux系統主機上面的設置,那麼使用的地方有下面這些:

  • 限制某一用戶組所能使用的最大磁盤配額(使用用戶組限制)
  • 限制某一用戶的最大磁盤配額(使用用戶限制)
  • 限制某一目錄的最大磁盤配額

基本上,磁盤配額就是爲管理員提供磁盤使用率以及讓管理員管理磁盤使用情況的一個工具。比較特別的是,xfs的磁盤配額是整合到文件系統內的,並不是其他外置的程序來管理的,因此通過磁盤配額來直接報告磁盤使用率,要比UNIX工具快很多,比如命令du可以重新計算目錄下的磁盤使用率,但xfs可以通過xfs_quota來直接報告各目錄的使用率,速度會快很多。

磁盤配額的使用限制

  • ext文件系統僅能針對整個文件系統,不能針對某個單一的目錄來設置磁盤配額。
  • 內核必須支持磁盤配額
  • 磁盤配額僅對一般用戶有效
  • 若啓用SELinux,非所有目錄均可設置磁盤配額

     新版的CentOS都支持SELinux這個內核功能,該功能會加強某些特殊的權限控制。所以即使你是xfs文件系統,可能很多文件目錄你也不能設置磁盤配額。

磁盤配額的規範設置選項

磁盤配額這玩意兒針對xfs文件系統的限制選項主要分爲下面幾個部分:

  • 分別針對用戶、用戶組或個別目錄(user、group、project):xfs文件系統的磁盤配額中,主要是針對用戶、用戶組、個別目錄進行磁盤使用率的限制。
  • 容量限制或文件數量限制(block或inode):文件系統主要規劃爲存放屬性的inode與實際文件數據的block區塊,磁盤配額既然是管理文件系統,所以當然也可以管理inode或block,這兩個管理的功能爲
    • 限制inode使用量:管理用戶可以建立的【文件數量】
    • 限制block使用量:管理用戶磁盤容量的限制,這種方式較爲常見
    • 軟限制與硬限制(soft/hard):既然是規範,當然就有限制值。不管inode還是block,限制值都有兩個,分別是soft與hard。通常hard限制值要比soft還要高。這兩個限制值的意義爲:
      • hard:表示用戶的使用量絕對不會超過這個限制值,以上面的設置爲例,用戶所能使用的磁盤容量絕對不會超過500MB,若超過這個值則系統會鎖定該用戶的磁盤使用權。
      • soft:表示用戶在低於soft限值時(此例中爲400MB),可以正常使用磁盤,但超過soft但低於hard的限值,每次用戶登錄時,系統會主動發出磁盤容量即將耗盡的警告,並給與一個寬限時間(grace time)。不過,若用戶在寬限時間倒數期限就將容量再次降低與soft之下,則寬限時間會停止。
      • 回倒數計時的寬限時間:一般默認的寬限時間是七天,如果七天內你都不進行任何磁盤管理,那麼soft限制值會即將替換hard限制值來作爲磁盤配額的配置。

一個xfs文件系統的磁盤配額實踐範例

  • 目的與賬號:現在我想要讓我的實習生五個爲一組,這五個用戶的賬號都是 myquota1、myquota2、myquota3、myquota4、myquota5,這五個用戶的密碼都是 passwd ,且這五個用戶所屬的初始用戶組都是 myquotagrp,其他賬號的屬性使用默認值。
  • 賬號的磁盤容量限制值:我想讓五個用戶都能夠獲得300MB的磁盤使用量(hard),文件數量不做限制。此外,只要容量使用超過250MB,就予以警告(soft)。
  • 用戶組的配額(option1):由於我的系統裏面還有其他用戶存在,因此我僅承認 myquotagrp 這個用戶組最多使用 1GB 的容量。
  • 共享目錄配額(option2):另一種設置方式,每個用戶還是具有自己獨特的容量限制,但是五個人的實習共享目錄在 /home/myquota 裏面這裏,該目錄設置爲其他人沒有任何權限的共享目錄空間,僅有 myquotagrp 用戶組擁有全部的權限。且無論如何該目錄最多僅能夠接受 500MB的容量。請注意,用戶組(group)與目錄(directory/project)的限制無法同時並存。
  • 寬限時間的限制:最後,我希望每個用戶在超過soft限制值後,都還能夠有14天的寬限時間。

在這一小節咱們先來創建這五個實習生的賬號

2770不知道是什麼?複習一下這篇文章吧!

下面我們正式開始磁盤配額的練習

實踐磁盤配額流程-1:文件系統的支持與查看

對於單個文件或目錄,如果要設置磁盤配額,請注意文件系統要是xfs。

此外,不要在根目錄下面進行磁盤配額設置,因爲文件系統會變的太複雜。

因此,我們是以/home 這個xfs文件系統爲例。使用df來檢查看看。

-h  :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;
-T  :連同該硬盤分區的文件系統名稱 (例如 xfs) 也列出;

在過去的版本中,管理員似乎可以通過 mount -o remount 的機制來重新掛載啓動磁盤配額功能,不過xfs文件文件系統的磁盤配額似乎是在掛載之初就聲明瞭,因此無法使用remount來重新啓動磁盤配額功能,一定得要寫入/etc/fstab (設置啓動掛載的系統配置文件)當中,或是在初始掛載過程中加入這個選項,否則不會生效。

基本上,針對磁盤配額限制的主要選項主要有三項:

  1. uquota/usrquota/quota:針對用戶賬號的設置
  2. gquota/grpquota:針對用戶組的設置
  3. pquota/prjquota:針對單一目錄的設置,但是不可與 grpquota 同時存在

再次強調,修改/etc/fstab後,務必要測試一下。若發生錯誤就要趕緊處理。因爲這個文件如果修改錯誤,是會造成無法啓動的情況。此外,由於一般用戶的家目錄是在/home目錄下,因此刪除這個選項時,一定要將一般賬號的身份註銷,否則肯定無法刪除。

 

實踐磁盤配額流程-2:查看磁盤配額報告數據

設置文件系統支持之後,當然得要來看一看到底有沒有正確地將磁盤配額的管理數據列出來纔好,這時我們得要使用 xfs_quota 這個命令。裏面參數很多,不過稍微查看一下即可。先讓我們來查看目前磁盤配額的設置信息。

xfs_quota -x -c “命令” [掛載點]
-x:專家模式,後續才能夠加入-c的命令參數
-c:後面就是命令,這個小節我們先來談談數據報告的命令
命令:
print:單純地列出目前主機內的文件系統參數等數據
df:與原本的df,可以加上-b(block)、-i(inode)、-h(加上單位)等
report:列出目前的磁盤配額選項、有-ugr(user、group、project )及 -bi 等
state:說明目前支持磁盤配額的文件系統的信息,有沒有使用相關選項等

上面的report加上了u,就是讓它只列出用戶的限制信息,如果不加,它會將支持的user、group、directory相關信息顯示出來。

 

實踐磁盤配額流程-3:限制值設置方式

確認文件系統的磁盤配額支持順利啓用後,也能夠查看到相關的磁盤配額限制,接下來就是要實際設置用戶或用戶組限制。回去看看,我們需要每個用戶 250MB/300MB 的容量限制,用戶組共 950MB/1GB 的容量限制,同時 grace time設置爲14天。

xfs_quota  -x  -c  "limit [-ug] b[soft|hard]=N i[soft|hard]=N name"
xfs_quota  -x  -c  "timer [-ug] [-bir] Ndags"   
limit:實際限制的選項,可以針對 user/group 來限制,限制的選項有以下內容:
       bsoft/bhard:block的soft/hard 限制值,可以加單位
       isoft/ihard:inode的soft/hard 限制值。
       name:就是用戶/用戶組的名稱
timer:用來設置grace time的選項,也是可以針對 user/group 以及 block/inode 設置。

設置用戶限制(示例中那裏是ubih,寫成n了,對不住)

設置用戶組限制

設置grace time(限制時間)

xfs_quota -x -c "timer -u -b 14days" /home
xfs_quota -x -c "timer -g -b 14days" /home

測試一下:

實踐磁盤配額流程-4:project的限制(針對目錄限制)

如果限制的是目錄而不是用戶組時,那該如何處理呢?

要注意限制的是/home/myquota這個目錄本身,而不是針對myquotagrp 這個組。這兩種設置方法的意義不同。

例如,以前一個小節談到的測試範例來說,myquota1已經使用了300MB的容量,而/home/myquota其實還沒有任何的使用量(因爲是在myquota1的家目錄做的dd命令)。不過如果你使用了xfs_quota -x -c “report -h” /home 這個命令來查看,就會發現其實 myquotagrp 已經用掉了300MB,如此一來,對於目錄的限制來說,就不會有效果。

爲了解決這個問題,我們這個小節來設置project選項,注意這個選項不可以與 group 同時設置,因此我們需要先取消掉group設置然後再加入project設置,下面我們實驗看看:

首先,要將grpquota的參數取消,然後加入prjquota,並且卸載/home再重新掛載。

mount -a
依照配置文件 [/etc/fstab]的數據將所有未掛載的磁盤都掛載上來

然後,規範目錄、選項名稱(Project)與選項ID

目錄的配置比較奇怪,它必須要指定一個所謂的【選項名稱、選項標識符】來規範才行,而且還需要用到兩個配置文件。

現在,我們要規範的目錄是/home/myquota,其選項名稱爲muquotaproject的選項名稱,其標識符爲11,這些都是自己指定的,若不喜歡可以指定另外一個。

接下來我們來進行設置,/home/myquota 指定爲450/500MB的容量限制

我就不測試了,總之後面連root在該目錄下建立文件都會受到限制。

這樣就設置好了,未來你還要針對某些目錄進行限制,那麼就修改/etc/projects、/etc/projid的配置,然後直接處理目錄的初始化與設置,就完成了設置。

 

xfs磁盤配額的管理與額外命令對照表

不管多麼完美的系統,都要爲可能的突發情況準備應對方案。所以,接下來我們就來談一談,萬一需要暫停磁盤配額的限制,或是需要重新啓動磁盤配額的限制時,該如何處理?還是使用xfs_quota,使用下面幾個內部命令即可:

  • disable:暫時取消磁盤配額的限制,但其實系統還是在計算磁盤配額中,只是沒有管制而已,應該算是最有用的功能。
  • enable:就是恢復到正常管制的狀態中,與disable可以互相取消、啓用
  • off:完全關閉磁盤配額的限制,使用了這個狀態後,你只有卸載再重新掛載才能夠再次啓動磁盤配額。也就是說,用了off狀態後,你無法使用enable再次恢復磁盤配額的管制。注意不要亂用這個狀態,一般建議用disable即可,除非你需要執行remove操作。
  • remove:必須要在off的狀態下才能夠執行的命令。這個remove命令可以【刪除】磁盤配額的限制設置,例如要取消project的設置,無需重新設置爲0,只需要remove -p即可。

 

最後一個“remove -p” 會刪除掉/home下面的所有project配額限制,無法恢復。

 

設定流程項目 XFS 文件系統 EXT 家族
/etc/fstab 參數設定 usrquota/grpquota/prjquota usrquota/grpquota
quota 配置文件 不需要 quotacheck
設定用戶/羣組限制值 xfs_quota -x -c “limit…” edquota 或 setquota
設定 grace time xfs_quota -x -c “timer…” edquota
設定目錄限制值 xfs_quota -x -c “limit…”
觀察報告 xfs_quota -x -c “report…” repquota 或 quota
啓動與關閉 quota 限制 xfs_quota -x -c “[disable|enable]…” quotaoff, quotaon
發送警告信給用戶 目前版本尚未支持 warnquota

 

不修改既有系統的磁盤配額實例

想一想,如果你的主機原先沒有想到要設定成爲郵件主機,所以並沒有規劃將郵件信箱所在的 /var/spool/mail/ 目錄獨立成爲一個 分區,而目前你的主機已經沒有辦法新增或分區出任何新 的分區了。我們知道 quota 的支持與文件系統有關, 所以並無法跨文件系統來設計 quota 的 project 功能啊!因此,你是否就無法針對 mail 的使用量給予 quota 的限制呢?

如果你想要讓使用者的郵件信箱與家目錄的總體磁盤使用量爲固定,那又該如何是好? 由於 /home 及 /var/spool/mail 根本不可能是同一個 filesystem (除非是都不分區,使用根目錄,纔有可能 整合在一起), 所以,該如何進行這樣的 quota 限制呢?

既然 quota 是針對 filesystem 來進行限制,假設你又已經有 /home 這個獨立的分區槽了,那麼你只要:

  1. 將 /var/spool/mail 這個目錄完整的移動到 /home 底下;
  2. 利用 ln -s /home/mail /var/spool/mail 來建立鏈接數據;
  3. 將 /home 進行 quota 限額設定

您也可以依據不同的使 用者與羣組來設定 quota 然後同樣的以上面的方式來進行 link 的動作!嘿嘿嘿!就有不同的限額針 對不同的使用者提出囉!


軟件磁盤陣列(Software RAID)

什麼是RAID

磁盤陣列全名是【Redundant Arrays of Inexpensive Disks ,RAID】,中文意思是 獨立冗餘磁盤陣列。RAID 可以通過技術(軟件或硬件)將多個較小的磁盤整合成爲一個較大的磁盤設備,而這個較大的磁盤功能可不止存儲而已,他還具有保護數據的功能。整個RAID由於選擇的級別(level)不同,而使得整合後的磁盤具有不同的功能,基本常見的level有這幾種:

RAID 0(等量模式,stripe):性能最佳

這種模式如果使用相同型號與容量的磁盤來組成時,效果較佳。這種模式的RAID會將磁盤先切出等量的數據塊(名爲chunk,一般可設置爲4KB~1MB),然後當一個文件要寫入RAID時,該文件會根據chunk的大小切割好,之後再依序放到各個磁盤裏去。由於每個磁盤會交錯地存放數據,因此當你的數據要寫入RAID時,數據會被等量地放置在各個磁盤上面。舉例來說,你有兩顆磁盤組成 RAID-0 , 當你有 100MB 的數據要寫入時,每個磁盤會各被分配到 50MB 的儲存量。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 模式囉~

 

如上圖所示,一份數據傳送到 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 的意思。

如上圖所示,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 讀寫的情況有點像下面這樣:

如上圖所示,每個循環寫入時,都會有部分的奇偶校驗值(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 那才更具有性能上的優勢哩!

 

硬件RAID、軟件RAID

爲何磁盤陣列又分爲硬件和軟件呢?所謂的硬件磁盤陣列(hardware RAID)是通過磁盤陣列卡來完成磁盤陣列的功能。磁盤陣列卡上面有一塊專門的芯片用於處理RAID的任務,因此在性能方面會比較好。在很多任務(例如RAID 5 的奇偶校驗值計算上),磁盤陣列並不會重複消耗原本系統的I/O總線,理論上性能會比較佳。此外目前一般的中高級磁盤陣列卡都支持熱插拔,即在不關機的情況下抽換損壞的磁盤,在系統的恢復與數據的可靠性方面非常的好用。

不過一塊好的磁盤陣列卡動不動就上千塊,便宜的在主板上面附贈的磁盤陣列功能可能又不支持某些高級功能。例如底端主板若有磁盤陣列芯片,通常僅支持到RAID 0,RAID 1。此外,操作系統也必須擁有磁盤陣列卡的驅動程序,才能夠正確地識別到磁盤陣列所產生的磁盤驅動器。

因此就發展出軟件來模擬磁盤陣列的功能,這就是所謂的軟件磁盤陣列(Software RAID)。軟件磁盤陣列主要是通過軟件來模擬磁盤陣列的任務,因此會損耗很多的系統資源,比如說CPU運算與I/O總線的資源等。不過目前我們的個人計算機已經非常快了,以前的速度限制現在已經不存在,所以我們可以來玩一玩軟件磁盤陣列。

我們的CentOS提供的軟件磁盤陣列爲mdadm這個軟件,這個軟件會以分區或disk爲單位,也就是說你不需要兩塊以上的磁盤,只要有兩個以上的磁盤分區(partition)就能夠設計的你得磁盤陣列了。此外,mdadm支持剛剛我們前面提到的RAID 0、RAID 1、RAID 5、熱備份磁盤等。而且提供的管理機制可以達到類似熱插拔的功能,可以在線(文件系統正常使用)進行分區的抽換,使用上也非常的方便。

另外,硬件磁盤陣列在Linux下面看起來就是一塊實際的大磁盤,因此硬件磁盤陣列的設備文件名爲 /dev/sd[a-p],因爲使用到SCSI的模塊之故。至於軟件磁盤陣列則是系統模擬的,因此使用的設備文件名就是系統的設備文件,文件名爲/dev/md0、/dev/md1等,兩者的設備文件名並不相同,不要搞混了。

 

軟件磁盤陣列的設置

使用 mdadm這個命令,語法:

mdadm --detail /dev/md0
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的軟件磁盤陣列給您看看。

  • 利用4個分區組成 RAID 5
  • 每個分區約1GB,需確定每個分區一樣大較佳
  • 將1個分區設置爲熱備份磁盤
  • chunk設置爲256kb這麼大即可
  • 這個熱備份磁盤的大小與其他RAID所需分區一樣大
  • 將此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
&#124;-vda1          252:1    0    2M  0 part
&#124;-vda2          252:2    0    1G  0 part /boot
&#124;-vda3          252:3    0   30G  0 part
&#124; &#124;-centos-root 253:0    0   10G  0 lvm  /
&#124; &#124;-centos-swap 253:1    0    1G  0 lvm  [SWAP]
&#124; `-centos-home 253:2    0    5G  0 lvm  /home
&#124;-vda4          252:4    0    1G  0 part /srv/myproject
&#124;-vda5          252:5    0    1G  0 part
&#124;-vda6          252:6    0    1G  0 part
&#124;-vda7          252:7    0    1G  0 part
&#124;-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 \
&gt;  --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: &lt;none&gt;

上述的數據比較重要的在特別指出的第一行與第二行部分[3]:

  • 第一行部分:指出 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 的設備,而且真的可以讓你使用呢!還不賴!

 

模擬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      &lt;==出錯的磁盤有一個!
  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) 的情況下進行! 所以,您說這樣的咚咚好不好用啊! ^_^

 

開機自動啓動 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 你的系統並等待看看能否順利的啓動吧! ^_^

關閉軟件 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 的實驗。不過朋友們要注意的是,如果真的要實作軟件磁盤陣列, 最好是由多顆不同的磁盤來組成較佳!因爲這樣才能夠使用到不同磁盤的讀寫,性能纔會好! 而數據分配在不同的磁盤,當某顆磁盤損毀時數據才能夠藉由其他磁盤挽救回來!這點得特別留意呢!

 

 


 

 

 

商業轉載 請聯繫作者獲得授權,非商業轉載 請標明出處,謝謝

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章