Linux 繼承大型主機系統優點之一即是強大的「磁碟管理」能力,而針對磁碟管理功能的細項來說,Linux 不僅有著相當優秀的檔案系統(常見的有 ext3 與 ReiserFS 檔案系統),並搭配多樣化、Enterprise 級的磁碟工具與管理能力,像是「軟體模擬磁碟陣列」(SoftRAID)與「邏輯磁碟管理」(LVM,Logical Volume Manager)等等。
只要是曾經從事 MIS 的工作人員或是 IT 產業相關的讀者朋友們對於 SoftRAID 想必不陌生,LVM 應該也都聽說過(或許有使用過),較可惜的是沒有更深入的去了解使用 SoftRAID 與 LVM 這兩者的好處分別在那裡?還有就是 SoftRAID 與 LVM 可否綜合應用的問題,所以本文的特色之一就是介紹 SoftRAID+LVM 的結合應用。
因為筆者手邊恰巧有著一台多磁碟的主機(共十顆),所以就成為本文撰寫的起源,倘若讀者手邊並沒有「多磁碟的主機」來測試本文中的指令也沒關係,稍待會在本文的中後段說明怎樣使用「虛擬」方式來產生練習用的磁碟,虛擬出來的磁碟雖然不是真正的磁碟,但至少還是可以打指令來實驗一下並過一過乾癮囉!
這台測試用的主機,同時擁有 RAID 介面卡(IBM ServeRAID)與 SCSI 介面卡(LSI Logic / Symbios Logic 53c875),其中 RAID 介面卡上有著三顆硬碟已經做好硬體式的 RAID 5 拿來當作系統磁碟,而 SCSI 介面卡上有著七顆硬碟(當作資料磁碟),主要就是用來測 SoftRAID 以及之後的 LVM,預計兩顆拿來測 RAID 0、兩顆拿來測 RAID 1、剩下的三顆拿來測 RAID 5。
因為這台主機 BIOS 磁碟順序將 SCSI 卡排在 RAID 卡前面,所以 /dev/sda~/dev/sdg 這七顆是資料磁碟(接在 SCSI 卡上)而 /dev/sdh 這一顆(接在 RAID 卡三顆做 RAID 5)的預計裝成系統磁碟。
| RAID 介面卡 | SCSI 介面卡 | |
| 硬體RAID/軟體RAID | 使用 Hardware RAID | 預計用來測試 Software RAID |
| 磁碟數量(共十顆) | 連接三顆 | 連接七顆 |
| RAID 層級 | RAID 5 已設定好 | 用來測試 兩顆做 RAID 0 兩顆做 RAID 1 三顆做 RAID 5 |
| 磁碟主要用途 | 系統磁碟 | 資料磁碟 |
至於這次所選用的 Linux Distribution,則是使用 RedHat Enterprise Linux ES 4 Update 4(簡稱 RHEL4),可測試「ext2online」指令來『線上增大 ext3 磁區』(搭配 LVM 來應用更佳);若要使用 SuSE Linux Enterprise Server 10(SLES10)來測試類似功能也可以,SLES 10 預設使用 ReiserFS 檔案系統,所以測試『線上增大 ReiserFS 磁區』則是使用「resize_reiserfs」指令(一樣也是可以搭配 LVM 來應用)。
| Distribution | 主推的檔案系統 | Resize 磁區所使用的指令 |
| RHEL4 | ext3/ext2 | ext2online(在線 Resizing 增大) resize2fs(下線 Resizing 縮小) |
| SLES10 | ReiserFS | resize_reiserfs(在線 Resizing 增大) resize_reiserfs(下線 Resizing 縮小) |
我們就從 RHEL4 安裝好後的環境開始說起,若是單顆硬碟(以下稱為系統磁碟)標準安裝的話,RHEL4 預設會切成「/boot」+「/」+「Swap」,如同下圖「fdisk -l /dev/sdh」、「df -h」所顯示的情形;此外 RHEL4 預設會用到 LVM 來管理磁碟,使用指令「pvscan」、「vgscan」與「lvscan」得到基礎訊息;至於 Swap 用到那個磁區,使用指令「grep swap /etc/fstab」查詢即可。

一般磁碟代號通常為 /dev/hda(IDE/ATA 介面)或 /dev/sda(SATA 或 SCSI 介面),上例將 RHEL 裝在 /dev/sdh 磁碟上,這 sdh 是 HardRAID 做 RAID 5 所生成的磁碟(三顆 18 GB 做 RAID 5 成為可用的 36 GB),事實上還有 sda、sdb、sdc … 到 sdg 這七顆尚未用到的硬碟(接在 SCSI 卡上);使用「lspci」指令可觀察介面卡資訊,第三行是 RAID 卡、最後兩行是 SCSI 卡的資訊。

之前曾提到過,我們做 SoftRAID 的規劃如下:兩顆做 RAID 0、兩顆做 RAID 1 以及三顆做 RAID 5(共七顆),建議需先做磁碟切割的動作並且將 Partition ID 設定成 fd(Linux raid autodetect)以利後續作業,以下是切割 /dev/sda 成 /dev/sda1 單一個 Partition 並將 Partition ID 設定成 fd 的運作情形(使用指令 fdisk /dev/sda)。

上圖只是切割好,下圖續接到改 Partition ID 的部份,請記得最後使用「w」來存檔。

當我們將七顆磁碟統統切割好、也改好 Partition ID 成 fd 後,接下來就是使用 mdadm 指令來設定 SoftRAID 了,按照我們的規劃如下表:
| 使用實體磁碟操作 | RAID LEVEL | RAID 裝置名稱 |
| /dev/sda1 /dev/sdb1 | RAID LEVEL 0 | /dev/md0 |
| /dev/sdc1 /dev/sdd1 | RAID LEVEL 1 | /dev/md1 |
| /dev/sde1 /dev/sdf1 /dev/sdg1 | RAID LEVEL 5 | /dev/md2 |
分別使用以下的指令,來建立 /dev/md0、/dev/md1 與 /dev/md2 這三個 SoftRAID 磁碟,RAID LEVEL 分別為 0、1 與 5
「mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sd[ab]1」
「mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sd[cd]1」
「mdadm --create /dev/md2 --level=5 --raid-devices=3 /dev/sd[efg]1」

使用「cat /proc/mdstat」指令可以觀察 SoftRAID 運作情況,會發現做 RAID 1 與 RAID 5 的 /dev/md1 與 /dev/md2 正在 resync 與 recovery;md1 段落中的 [2/2] [UU]代表兩顆健康正常運作,至於 md2 段落中的 [3/2] [UU_] 代表三顆中兩顆正常使用中,有一顆正在 recovery。

使用下圖的 fdisk 指令可看出 SoftRAID 磁碟的大小,以每一顆成員磁碟(/dev/sda1~/dev/sdg1)皆為 36 GB 來說,磁碟空間應該會符合 RAID 0、1 及 5 的標準規格。

將 SoftRAID 磁碟做格式化與掛載、卸載及掛載點相關的技術應用,相信讀者不陌生,在此僅提供以下快照作為參考
圖為將 /dev/md0 格式化成 ext3 檔案格式後,接著將 /dev/md0 掛載在 /mnt/md0 掛載點的情況

以下兩段是寫給沒有那七顆實體硬碟的讀者朋友,一個替代的練習方案。
使用「dd if=/dev/zero of=vda count=1 seek=1048576」建立一個名為 vda的檔案(大小可經由改變 seek 的數量 1048576 來決定)
使用「losetup /dev/loop0 vda」將 vda 與 loop0 連接起來
使用「losetup /dev/loop0」顯示 loop0 連接的檔案
使用「losetup -d /dev/loop0」可將 loop0 解除連接
當 /dev/loop0 連接上 vda 後,可將 /dev/loop0 當成磁區(像是 /dev/sda1)來使用,功能上與實際的磁區還是有許多差異,勉強拿來練習還可以。

至於使用 loop device 來練習的讀者,也請備便好 vda~vdg,以及與 /dev/loop0~/dev/loop6 的串連後,使用以下指令做類似的動作(主要是 RAID 成員磁碟裝置的代號不同)
| 使用 loop device 模擬 | RAID LEVEL | RAID 裝置名稱 |
| /dev/loop0 /dev/loop1 | RAID LEVEL 0 | /dev/md0 |
| /dev/loop2 /dev/loop3 | RAID LEVEL 1 | /dev/md1 |
| /dev/loop4 /dev/loop5 /dev/loop6 | RAID LEVEL 5 | /dev/md2 |
備便好 loop0~loop6 的情況,每個 disk 大約 512 MB 左右

mdadm 指令下達的方式很類似,主要是後面 RAID 成員磁碟裝置的部份改成 loop device

SoftRAID 運作情況同樣也是觀察 /proc/mdstat 的檔案內容

使用類似先前的 fdisk 指令,同樣可看出 SoftRAID 磁碟的大小,以每一顆成員磁碟(/dev/loop0~/dev/loop6)皆為 512 MB 來說,磁碟空間同樣會符合 RAID 0、1 及 5 的標準規格。

關於 SoftRAID 的實戰流程大致上已經介紹完畢,至於使用 LVM 的部份就留給「下篇」來介紹,在「上篇」的最後針對一些關於 SoftRAID 常見的一些問題,整理如下:
如果您過去曾經使用過 Linux SoftRAID 應該對於 /etc/raidtab 這個設定檔案不陌生,可是在我們設定期間並未提到,原因是新版本 mdadm 程式不使用 /etc/raidtab 當作 SoftRAID 的設定檔,取而代之的是使用 /etc/mdadm.conf 來當作設定檔。
至於我們設定期間並未提到 /etc/mdadm.conf 設定檔,主要是新版本的 SoftRAID 會將部份的資料寫到 RAID 的 Partition 去,所以即使重新開機,還是可以抓到先前 RAID 磁碟設定的資料,這也就是為什麼最好要將磁區的 Partition ID 設定成 fd(Linux raid autodetect)的主因(可使用指令 mdadm --query /dev/sda1 來查詢 /dev/sda1 關於 RAID 的設定資訊),至於如何設定 /etc/mdadm.conf 的方式,請使用指令「man mdadm.conf」參考設定檔說明文件以及指令「man mdadm」關於 EXAMPLES 那一段(請參考下圖的快照)。

SoftRAID 既然可以啟用也就代表著可以停用,例如使用指令「mdadm --manage --stop /dev/md0」可用來停止 SoftRAID /dev/md0 的運作,也可以使用指令「mdadm --assemble /dev/md0 /dev/sda1 /dev/sdb1」將 /dev/md0 組合回來,藉由觀察 /proc/mdstat 的資料,就能夠知道 RAID 有無啟用以及運作情況。

在筆者使用期間,恰巧遇到 /dev/sdc1 壞掉,導致 /dev/md1(/dev/md1 做 RAID 1 其成員磁碟 /dev/sdc1 與 /dev/sdd1)只有 /dev/sdd1 在運作,藉由這個機會來實做 SoftRAID 的故障與還原。在換上另一顆硬碟並且切割好磁碟與設定好 Partition ID 成 fd(Linux raid autodetect)後,使用「mdadm --manage --add /dev/md1 /dev/sdc1」來做 recovery 的動作。
若是讀者想要模擬練習的話,可參考以下這幾個指令玩玩看(模擬 /dev/md2 內成員硬碟之一 /dev/sdf1 故障與復原)。
設定 /dev/sdf1 成故障磁碟的指令「mdadm --manage --fail /dev/md2 /dev/sdf1」
觀看 /proc/mdstat 檔案內容來了解 RAID 情況,其中 sdf1[3] 後面 F 代表故障,md2 的最後一行 [3/2]與[U_U]表示出有一顆磁碟壞掉了。
將 /dev/sdf1 設定成故障後,將之移出 /dev/md2 陣列的指令「mdadm --manage --remove /dev/md2 /dev/sdf1」
使用指令「mdadm --manage --add /dev/md2 /dev/sdf1」將磁碟 /dev/sdf1 加回去 /dev/md2 磁碟陣列中

在本文實戰介紹 SoftRAID 使用方式,甚至使用虛擬裝置來練習操作,應該會覺得 Linux 相當地神奇吧!其實更神奇地還在本文「下篇」LVM 基礎操作、LVM Snapshot 與 LVM Online Resizing 的部份。讀者只要靜下心來仔細想想其他平台(Windows Server、Mac Server 或其他 Unix Server)能否達成 Linux 在這個領域同樣的功能(或是能夠辦到卻需要負擔較高額的軟硬體費用)就會了解到 Linux 在磁碟管理與儲存設備這一塊領域的強大功能與其領先優勢。
Linux 還有一個相當可愛的好處,就是對於想要實做這部份技術的人員,只要挪出您寶貴的時間、花費心思心力去練習並實際操作,不見得須要購買高貴的硬體設備,也不見得須要先行購買磁碟管理軟體與作業系統軟體授權(甚或非法地私底下破解序號),就能夠以相當低廉的軟硬體建置費用,學習 Enterprise 等級的電腦技術與知識,可說是「便宜又大碗」。若談到後續商用的部份,不論您是要以 IT 人員的角度去幫公司企業節省經費,或是直接從事關於專業的 Linux/Unix 儲存技術行業,先前的 Linux 學習都能夠幫助您打下紮實的電腦能力。