在以數據為中心的信息時代,如何妥善有效地保護數據是存儲系統的核心問題之一。人們可以忍受計算機宕機,所有應用程序重新啟動或者硬體損壞,但是他們要求信息永遠不會丟失。冗餘磁碟陣列(Redundant Array of Independent Disks )技術是各種企業信息系統和個人廣泛使用的解決方案,一般的中高檔伺服器多使用硬體RAID控制器,但是由於硬體RAID控制器的價格昂貴,導致系統成本大大增加。而隨著處理器的性能快速發展,使得軟體RAID的解決方法得到人們的重視。這裡我們主要介紹在Linux系統中軟體RAID的配置和使用方法,它既降低了系統的總投資,也能滿足系統應用的需要。
一.簡介
在Linux系統中目前以MD (Multiple Devices)虛擬塊設備的方式實現軟體RAID,利用多個底層的塊設備虛擬出一個新的虛擬塊設備,並且利用條帶化(stripping)技術將數據塊均勻分佈到多個磁碟上來提高虛擬設備的讀寫性能,利用不同的數據冗餘演算法來保護用戶數據不會因為某個塊設備的故障而完全丟失,而且還能在設備被替換后將丟失的數據恢復到新的設備上。關於不同冗餘級別的定義和數據塊以及校驗塊的分佈示意圖可以參考存儲專業委員會給出的參考資料“Common RAID Disk Data Format Specification ”。目前MD支持linear, multipath, raid0 (stripping), raid1 (mirror), raid4, raid5, raid6, raid10等不同的冗餘級別和組成方式,當然也能支持多個RAID陣列的層疊組成raid1+0, raid5+1等類型的陣列。在參考資料“Software RAID HOWTO”中介紹了早期軟體RAID陣列功能特點和使用方式,但是因為軟體RAID程序的功能不斷增加,因此很有必要寫份新的使用介紹。
本文主要先講解用戶層mdadm如何管理軟體RAID以及使用中經常遇到的問題和解決方法。在流行的Linux的發布版中,如FedoraCore,Gentoo, Ubuntu,Debian,SuseLinux系統中一般已經將MD驅動模塊直接編譯到內核中或編譯為可動態載入的驅動模塊。我們可以在機器啟動后通過cat /proc/mdstat看內核是否已經載入MD驅動或者cat /proc/devices是否有md塊設備,並且可以使用lsmod看MD是否是以模塊形式載入到系統中。
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : unused devices: <none> [root@fc5 mdadm-2.6.3]# cat /proc/devices | grep md 1 ramdisk 9 md 253 mdp [root@fc5 mdadm-2.6.3]# lsmod | grep md md_mod 73364 0 |
如果Linux系統既沒有將MD編譯到內核也沒有自動載入MD模塊,則沒有/proc/mdstat文件,那麼需要執行命令modprobe md載入驅動模塊。
[root@fc5 mdadm-2.6.3]#cat /proc/mdstat cat: /proc/mdstat: No such file or directory [root@fc5 mdadm-2.6.3]# modprobe md [root@fc5 mdadm-2.6.3]# lsmod | grep md md_mod 73364 0 |
如果系統中沒有MD驅動模塊則需要自己從Linux內核源代碼網站下載源代碼包,並且重新編譯內核,並且需要在內核的配置文件選擇。
[*]Multiple devices driver support (RAID and LVM) <*> RAID support <M> Linear (append) mode <M> RAID-0 (striping) mode <M> RAID-1 (mirroring) mode <M> RAID-10 (mirrored striping) mode (EXPERIMENTAL) <M> RAID-4/RAID-5/RAID-6 mode [*] Support adding drives to a raid-5 array <M> Multipath I/O support <M> Faulty test module for MD |
在Linux系統中用戶層以前使用raidtool工具集 來管理MD設備,目前廣泛使用mdadm軟體來管理MD設備,而且該軟體都會集成在Linux的發布版中。如果系統中沒有安裝可以到RAID驅動程序和mdadm軟體的維護者Neil Brown的個人網站 來下載源碼包進行編譯安裝,或者下載RPM包直接安裝。mdadm的最新版本是2.6.3。可以使用mdadm --version查看當前系統使用的版本。本文使用的是mdadm-2.6.3, Linux內核版本是Linux-2.6.22.1。下面的測試命令是在虛擬機環境中測試運行的。
[root@fc5 mdadm-2.6.3]# uname -r 2.6.22.1 [root@fc5 mdadm-2.6.3]# ./mdadm --version mdadm - v2.6.3 - 20th August 2007 |
二. mdadm管理軟RAID陣列
mdadm程序是一個獨立的程序,能完成所有的軟RAID管理功能,主要有7種使用模式:
模式名字 | 主要功能 |
---|---|
Create | 使用空閑的設備創建一個新的陣列,每個設備具有元數據塊 |
Assemble | 將原來屬於一個陣列的每個塊設備組裝為陣列 |
Build | 創建或組裝不需要元數據的陣列,每個設備沒有元數據塊 |
Manage | 管理已經存儲陣列中的設備,比如增加熱備磁碟或者設置某個磁碟失效,然後從陣列中刪除這個磁碟 |
Misc | 報告或者修改陣列中相關設備的信息,比如查詢陣列或者設備的狀態信息 |
Grow | 改變陣列中每個設備被使用的容量或陣列中的設備的數目 |
Monitor | 監控一個或多個陣列,上報指定的事件 |
2.1 為磁碟劃分分區
如果MD驅動被編譯到內核中,當內核調用執行MD驅動時會自動查找分區為FD(Linux raid autodetect)格式的磁碟。所以一般會使用fdisk工具將HD磁碟或者SD磁碟分區,再設置為FD的磁碟。
[root@fc5 mdadm-2.6.3]# fdisk /dev/sdk Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-512, default 1):1 Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):512 Using default value 512 Command (m for help): t Selected partition 1 Hex code (type L to list codes): FD Changed system type of partition 1 to fd (Linux raid autodetect) Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@fc5 mdadm-2.6.3]# fdisk -l /dev/sdk Disk /dev/sdk: 1073 MB, 1073741824 bytes 128 heads, 32 sectors/track, 512 cylinders Units = cylinders of 4096 * 512 = 2097152 bytes Device Boot Start End Blocks Id System /dev/sdk1 1 512 1048560 fd Linux raid autodetect |
軟RAID陣列實際上也可以使用任何標準的塊設備作為底層設備,如SCSI設備、IDE設備、RAM disk磁碟和NBD(Network Block Device)等,甚至是其他的MD設備。
如果MD驅動是模塊形式載入,需要在系統運行時由用戶層腳本控制RAID陣列啟動運行。如在FedoraCore系統中在/etc/rc.d/rc.sysinit文件中有啟動軟RAID陣列的指令,若RAID的配置文件mdadm.conf存在,則調用mdadm檢查配置文件里的選項,然後啟動RAID陣列。
echo "raidautorun /dev/md0" | nash --quiet if [ -f /etc/mdadm.conf ]; then /sbin/mdadm -A -s fi |
2.2 創建新的陣列
mdadm使用--create(或其縮寫-C)參數來創建新的陣列,並且將一些重要陣列的標識信息作為元數據可以寫在每一個底層設備的指定區間。--level(或者其縮寫-l)表示陣列的RAID級別,--chunk(或者其縮寫-c)表示每個條帶單元的大小,以KB為單位,默認為64KB,條帶單元的大小配置對不同負載下的陣列讀寫性能有很大影響。--raid-devices(或者其縮寫-n)表示陣列中活躍的設備個數,而--spare-devices(或者其縮寫-x)表示陣列中熱備盤的個數,一旦陣列中的某個磁碟失效,MD內核驅動程序自動用將熱備磁碟加入到陣列,然後重構丟失磁碟上的數據到熱備磁碟上。
創建一個RAID 0設備: mdadm --create /dev/md0 --level=0 --chunk=32 --raid-devices=3 /dev/sd[i-k]1 創建一個RAID 1設備: mdadm -C /dev/md0 -l1 -c128 -n2 -x1 /dev/sd[i-k]1 創建一個RAID 5設備: mdadm -C /dev/md0 -l5 -n5 /dev/sd[c-g] -x1 /dev/sdb 創建一個RAID 6設備: mdadm -C /dev/md0 -l6 -n5 /dev/sd[c-g] -x2 /dev/sdb /dev/sdh 創建一個RAID 10設備: mdadm -C /dev/md0 -l10 -n6 /dev/sd[b-g] -x1 /dev/sdh 創建一個RAID1+0設備: mdadm -C /dev/md0 -l1 -n2 /dev/sdb /dev/sdc mdadm -C /dev/md1 -l1 -n2 /dev/sdd /dev/sde mdadm -C /dev/md2 -l1 -n2 /dev/sdf /dev/sdg mdadm -C /dev/md3 -l0 -n3 /dev/md0 /dev/md1 /dev/md2 |
當RAID1/4/5/6/10等創建成功后,需要計算每個條帶的校驗和信息並寫入到相應磁碟上,所以RAID陣列有一個冗餘組數據同步的初始化過程(resync)。但是MD設備只要創建成功后即可對外被上層應用讀寫使用,當然由於上層數據讀寫降低數據同步的性能。初始化的時間長短和磁碟陣列自身性能以及讀寫的應用負載相關,使用cat /proc/mdstat信息查詢RAID陣列當前重構的速度和預期的完成時間。
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid10] md0 : active raid10 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU] [===>...........] resync = 15.3% (483072/3145536) finish=0.3min speed=120768K/sec unused devices: <none> [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid10] md0 : active raid10 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU] unused devices: <none> |
如果一個塊設備已經正在被其他的MD設備或者文件系統使用,則不能用來創建新的MD設備。
[root@fc5 mdadm-2.6.3]# ./mdadm -C /dev/md1 -l0 -n2 /dev/sdh /dev/sdi mdadm: Cannot open /dev/sdh: Device or resource busy mdadm: create aborted |
Build模式可以用來創建沒有元數據的RAID0/1設備,不能創建RAID4/5/6/10等帶有冗餘級別的MD設備。
[root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l0 -n6 /dev/sd[b-g] mdadm: array /dev/md0 built and started. [root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l1 -n2 /dev/sd[b-c] mdadm: array /dev/md0 built and started. [root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 -l5 -n6 /dev/sd[b-g] mdadm: Raid level 5 not permitted with --build. [root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 –l6 -n6 /dev/sd[b-g] mdadm: Raid level 5 not permitted with --build. [root@fc5 mdadm-2.6.3]# ./mdadm -BR /dev/md0 –l10 -n6 /dev/sd[b-g] mdadm: Raid level 10 not permitted with --build. |
使用陣列:
MD設備可以像普通塊設備那樣直接讀寫,也可以做文件系統格式化。
#mkfs.ext3 /dev/md0 #mkdir -p /mnt/md-test #mount /dev/md0 /mnt/md-test |
停止正在運行的陣列:
當陣列沒有文件系統或者其他存儲應用以及高級設備使用的話,可以使用--stop(或者其縮寫-S)停止陣列;如果命令返回設備或者資源忙類型的錯誤,說明/dev/md0正在被上層應用使用,暫時不能停止,必須要首先停止上層的應用,這樣也能保證陣列上數據的一致性。
[root@fc5 mdadm-2.6.3]# ./mdadm --stop /dev/md0 mdadm: fail to stop array /dev/md0: Device or resource busy [root@fc5 mdadm-2.6.3]# umount /dev/md0 [root@fc5 mdadm-2.6.3]#./mdadm --stop /dev/md0 mdadm: stopped /dev/md0 |
2.3 組裝曾創建過的陣列
模式--assemble或者其縮寫(-A)主要是檢查底層設備的元數據信息,然後再組裝為活躍的陣列。如果我們已經知道陣列由那些設備組成,可以指定使用那些設備來啟動陣列。
[root@fc5 mdadm-2.6.3]# ./mdadm -A /dev/md0 /dev/sd[b-h] mdadm: /dev/md0 has been started with 6 drives and 1 spare. |
如果有配置文件(/etc/mdadm.conf)可使用命令mdadm -As /dev/md0。mdadm先檢查mdadm.conf中的DEVICE信息,然後從每個設備上讀取元數據信息,並檢查是否和ARRAY信息一致,如果信息一致則啟動陣列。如果沒有配置/etc/mdadm.conf文件,而且又不知道陣列由那些磁碟組成,則可以使用命令--examine(或者其縮寫-E)來檢測當前的塊設備上是否有陣列的元數據信息。
[root@fc5 mdadm-2.6.3]# ./mdadm -E /dev/sdi mdadm: No md superblock detected on /dev/sdi. [root@fc5 mdadm-2.6.3]# ./mdadm -E /dev/sdb /dev/sdb: Magic : a92b4efc Version : 00.90.00 UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a Creation Time : Sun Aug 22 17:49:53 1999 Raid Level : raid10 Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB) Array Size : 3145536 (3.00 GiB 3.22 GB) Raid Devices : 6 Total Devices : 7 Preferred Minor : 0 Update Time : Sun Aug 22 18:05:56 1999 State : clean Active Devices : 6 Working Devices : 7 Failed Devices : 0 Spare Devices : 1 Checksum : 2f056516 - correct Events : 0.4 Layout : near=2, far=1 Chunk Size : 64K Number Major Minor RaidDevice State this 0 8 16 0 active sync /dev/sdb 0 0 8 16 0 active sync /dev/sdb 1 1 8 32 1 active sync /dev/sdc 2 2 8 48 2 active sync /dev/sdd 3 3 8 64 3 active sync /dev/sde 4 4 8 80 4 active sync /dev/sdf 5 5 8 96 5 active sync /dev/sdg 6 6 8 112 6 spare /dev/sdh |
從上面命令結果可以找到陣列的唯一標識UUID和陣列包含的設備名字,然後再使用上面的命令來組裝陣列,也可以使用UUID標識來組裝陣列。沒有一致的元數據的信息設備(例如/dev/sda和/dev/sda1等)mdadm程序會自動跳過。
[root@fc5 mdadm-2.6.3]# ./mdadm -Av --uuid=0cabc5e5:842d4baa:e3f6261b:a17a477a /dev/md0 /dev/sd* mdadm: looking for devices for /dev/md0 mdadm: no recogniseable superblock on /dev/sda mdadm: /dev/sda has wrong uuid. mdadm: no recogniseable superblock on /dev/sda1 mdadm: /dev/sda1 has wrong uuid. mdadm: no RAID superblock on /dev/sdi mdadm: /dev/sdi has wrong uuid. mdadm: /dev/sdi1 has wrong uuid. mdadm: no RAID superblock on /dev/sdj mdadm: /dev/sdj has wrong uuid. mdadm: /dev/sdj1 has wrong uuid. mdadm: no RAID superblock on /dev/sdk mdadm: /dev/sdk has wrong uuid. mdadm: /dev/sdk1 has wrong uuid. mdadm: /dev/sdb is identified as a member of /dev/md0, slot 0. mdadm: /dev/sdc is identified as a member of /dev/md0, slot 1. mdadm: /dev/sdd is identified as a member of /dev/md0, slot 2. mdadm: /dev/sde is identified as a member of /dev/md0, slot 3. mdadm: /dev/sdf is identified as a member of /dev/md0, slot 4. mdadm: /dev/sdg is identified as a member of /dev/md0, slot 5. mdadm: /dev/sdh is identified as a member of /dev/md0, slot 6. mdadm: added /dev/sdc to /dev/md0 as 1 mdadm: added /dev/sdd to /dev/md0 as 2 mdadm: added /dev/sde to /dev/md0 as 3 mdadm: added /dev/sdf to /dev/md0 as 4 mdadm: added /dev/sdg to /dev/md0 as 5 mdadm: added /dev/sdh to /dev/md0 as 6 mdadm: added /dev/sdb to /dev/md0 as 0 mdadm: /dev/md0 has been started with 6 drives and 1 spare. |
配置文件:
/etc/mdadm.conf作為默認的配置文件,主要作用是方便跟蹤軟RAID的配置,尤其是可以配置監視和事件上報選項。Assemble命令也可以使用--config(或者其縮寫-c)來指定配置文件。我們通常可以如下命令來建立配置文件。
[root@fc5 mdadm-2.6.3]#echo DEVICE /dev/sd[b-h] /dev/sd[i-k]1 > /etc/mdadm.conf [root@fc5 mdadm-2.6.3]# ./mdadm -Ds >>/etc/mdadm.conf [root@fc5 mdadm-2.6.3]# cat /etc/mdadm.conf DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi1 /dev/sdj1 /dev/sdk1 ARRAY /dev/md1 level=raid0 num-devices=3 UUID=dcff6ec9:53c4c668:58b81af9:ef71989d ARRAY /dev/md0 level=raid10 num-devices=6 spares=1 UUID=0cabc5e5:842d4baa:e3f6261b:a17a477a |
使用配置文件啟動陣列時,mdadm會查詢配置文件中的設備和陣列內容,然後啟動運行所有能運行RAID陣列。如果指定陣列的設備名字,則只啟動對應的陣列。
[root@fc5 mdadm-2.6.3]# ./mdadm -As mdadm: /dev/md1 has been started with 3 drives. mdadm: /dev/md0 has been started with 6 drives and 1 spare. [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid0] [raid10] md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] 3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU] md1 : active raid0 sdi1[0] sdk1[2] sdj1[1] 7337664 blocks 32k chunks unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm -S /dev/md0 /dev/md1 mdadm: stopped /dev/md0 mdadm: stopped /dev/md1 [root@fc5 mdadm-2.6.3]# ./mdadm -As /dev/md0 mdadm: /dev/md0 has been started with 6 drives and 1 spare. [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid0] [raid10] md0 : active raid10 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] 3145536 blocks 64K chunks 2 near-copies [6/6] [UUUUUU] unused devices: <none> |
2.4 查詢陣列的狀態
我們可以通過cat /proc/mdstat信息查看所有運行的RAID陣列的狀態,在第一行中首先是MD的設備名,active和inactive選項表示陣列是否能讀寫,接著是陣列的RAID級別,後面是屬於陣列的塊設備,方括弧[]里的數字錶示設備在陣列中的序號,(S)表示其是熱備盤,(F)表示這個磁碟是faulty狀態。在第二行中首先是陣列的大小,單位是KB,接著是chunk-size的大小,然後是layout類型,不同RAID級別的layout類型不同,[6/6]和[UUUUUU]表示陣列有6個磁碟並且6個磁碟都是正常運行的,而[5/6]和[_UUUUU] 表示陣列有6個磁碟中5個都是正常運行的,下劃線對應的那個位置的磁碟是faulty狀態的。
[root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [raid1] md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 -f /dev/sdh /dev/sdb mdadm: set /dev/sdh faulty in /dev/md0 mdadm: set /dev/sdb faulty in /dev/md0 [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [raid1] md0 : active raid5 sdh[6](F) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[7](F) 5242560 blocks level 5, 64k chunk, algorithm 2 [6/5] [_UUUUU] unused devices: <none> |
如果Linux系統目前支持sysfs也可以訪問/sys/block/md0目錄查詢陣列信息。
[root@fc5 mdadm-2.6.3]# ls -l /sys/block/md0/ capability holders range size stat uevent dev md removable slaves subsystem [root@fc5 mdadm-2.6.3]# ls /sys/block/md0/md/ array_state dev-sdg rd1 suspend_lo bitmap_set_bits dev-sdh rd2 sync_action chunk_size layout rd3 sync_completed component_size level rd4 sync_speed dev-sdb metadata_version rd5 sync_speed_max dev-sdc mismatch_cnt reshape_position sync_speed_min dev-sdd new_dev resync_start dev-sde raid_disks safe_mode_delay dev-sdf rd0 suspend_hi [root@fc5 mdadm-2.6.3]# ls /sys/block/md0/slaves/ sdb sdc sdd sde sdf sdg sdh |
我們也可以通過mdadm命令查看指定陣列的簡要信息(使用--query或者其縮寫-Q)和詳細信息(使用--detail或者其縮寫-D) 詳細信息包括RAID的版本、創建的時間、RAID級別、陣列容量、可用空間、設備數量、超級塊狀態、更新時間、UUID信息、各個設備的狀態、RAID演算法級別類型和布局方式以及塊大小等信息。設備狀態信息分為active, sync, spare, faulty, rebuilding, removing等等。
[root@fc5 mdadm-2.6.3]# ./mdadm --query /dev/md0 /dev/md0: 2.100GiB raid10 6 devices, 1 spare. Use mdadm --detail for more detail. [root@fc5 mdadm-2.6.3]# ./mdadm --detail /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Sun Aug 22 17:49:53 1999 Raid Level : raid10 Array Size : 3145536 (3.00 GiB 3.22 GB) Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB) Raid Devices : 6 Total Devices : 7 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Sun Aug 22 21:55:02 1999 State : clean Active Devices : 6 Working Devices : 7 Failed Devices : 0 Spare Devices : 1 Layout : near=2, far=1 Chunk Size : 64K UUID : 0cabc5e5:842d4baa:e3f6261b:a17a477a Events : 0.122 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 2 active sync /dev/sdd 3 8 64 3 active sync /dev/sde 4 8 80 4 active sync /dev/sdf 5 8 96 5 active sync /dev/sdg 6 8 112 - spare /dev/sdh |
2.5 管理陣列
mdadm可以在Manage模式下,對運行中的陣列進行添加及刪除磁碟。常用於標識failed磁碟,增加spare(熱備)磁碟,以及從陣列中移走已經失效的磁碟等等。使用--fail(或者其縮寫-f)指定磁碟損壞。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --fail /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 |
當磁碟已經損壞時,使用--remove(或者其縮寫--f)參數將這個磁碟從磁碟陣列中移走;但如果設備還正在被陣列使用,則不能從陣列中移走。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --remove /dev/sdb mdadm: hot removed /dev/sdb [root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --remove /dev/sde mdadm: hot remove failed for /dev/sde: Device or resource busy |
如果陣列帶有spare磁碟,那麼自動將損壞磁碟上的數據重構到新的spare磁碟上;
[root@fc5 mdadm-2.6.3]# ./mdadm -f /dev/md0 /dev/sdb ; cat /proc/mdstat mdadm: set /dev/sdb faulty in /dev/md0 Personalities : [raid0] [raid10] md0 : active raid10 sdh[6] sdb[7](F) sdc[0] sdg[5] sdf[4] sde[3] sdd[2] 3145536 blocks 64K chunks 2 near-copies [6/5] [U_UUUU] [=======>........] recovery = 35.6% (373888/1048512) finish=0.1min speed=93472K/sec unused devices: <none> |
如果陣列沒有熱備磁碟,可以使用--add(或者其縮寫-a)參數增加熱備磁碟
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --add /dev/sdh mdadm: added /dev/sdh |
2.6 監控陣列
可以使用mdadm對RAID陣列進行監控,監控程序定時查詢指定的事件是否發生,然後根據配置來妥善處理。例如當陣列中的磁碟設備出現問題的時候,可以發送郵件給管理員;或者當磁碟出現問題的時候由回調程序來進行自動的磁碟替換,所有監控事件都可以記錄到系統日誌中。目前mdadm支持的事件有RebuildStarted, RebuildNN(NN is 20, 40, 60, or 80), RebuildFinished, Fail,FailSpare,SpareActive,NewArray, DegradedArray, MoveSpare, SparesMissing, TestMessage。
如果配置每300秒mdadm監控進程查詢MD設備一次,當陣列出現錯誤,會發送郵件給指定的用戶,執行事件處理的程序並且記錄上報的事件到系統的日誌文件。使用--daemonise參數(或者其縮寫-f)使程序持續在後台運行。如果要發送郵件需要sendmail程序運行,當郵件地址被配置為外網地址應先測試是否能發送出去。
[root@fc5 mdadm-2.6.3]#./mdadm --monitor --mail=root@localhost --program=/root/md.sh --syslog --delay=300 /dev/md0 --daemonise |
查看系統日誌信息,可以看到哪個陣列或者陣列中的哪個設備發生過的哪些事件。
[root@fc5 mdadm-2.6.3]# mdadm -f /dev/md0 /dev/sdb mdadm: set /dev/sdb faulty in /dev/md0 [root@fc5 mdadm-2.6.3]#tail –f /var/log/messages Aug 22 22:04:12 fc5 mdadm: RebuildStarted event detected on md device /dev/md0 Aug 22 22:04:12 fc5 kernel: md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery. Aug 22 22:04:12 fc5 kernel: md: using 128k window, over a total of 1048512 blocks. Aug 22 22:04:14 fc5 mdadm: Fail event detected on md device /dev/md0, component device /dev/sdb Aug 22 22:04:14 fc5 mdadm: Rebuild80 event detected on md device /dev/md0 Aug 22 22:04:16 fc5 mdadm: RebuildFinished event detected on md device /dev/md0 Aug 22 22:04:16 fc5 mdadm: SpareActive event detected on md device /dev/md0, component device /dev/sdh Aug 22 22:04:16 fc5 kernel: md: md0: recovery done. |
回調程序從mdadm程序接受兩個或者三個參數:事件名字,監控陣列的名字和特殊事件可能使用到的底層塊設備名字。上面的事件返回的信息如下:
Eventname: RebuildStarted Device: /dev/md0 next: Eventname: Fail Device: /dev/md0 next: /dev/sdb Eventname: Rebuild80 Device: /dev/md0 next: Eventname: RebuildFinished Device: /dev/md0 next: Eventname:SpareActive Device: /dev/md0 next: /dev/sdh |
2.7 擴展陣列
如果在創建陣列時不想使用整個塊設備,可以指定用於創建RAID陣列每個塊設備使用的設備大小。
mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --size=102400 |
然後在陣列需要擴展大小時,使用模式--grow(或者其縮寫-Q)以及--size參數(或者其縮寫-z) 在加上合適的大小數值就能分別擴展陣列所使用每個塊設備的大小。
[root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0 /dev/md0: 500.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. [root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 --size=204800 [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid0] [raid10] [raid6] [raid5] [raid4] md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 1024000 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] [============>......] resync = 69.6% (144188/204800) finish=0.0min speed=10447K/sec unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0 /dev/md0: 1000.00MiB raid5 6 devices, 1 spare. Use mdadm --detail for more detail. |
如果上面是文件系統(ext2,ext3, reiserfs),在設備大小擴展后,文件系統也要同時擴展。
[root@fc5 mdadm-2.6.3]# df -h | grep md /dev/md0 485M 11M 449M 3% /mnt/md-test [root@fc5 mdadm-2.6.3]# ext2online /dev/md0 [root@fc5 mdadm-2.6.3]# df -h | grep md /dev/md0 969M 11M 909M 2% /mnt/md-test |
mdadm還提供增加或減少陣列中設備個數的功能(reshape),使用模式—grow和 --raid-disks(或者其縮寫-n)參數再加上合適的設備個數。擴展后陣列中原來的熱備盤變為活躍磁碟,所以陣列的設備個數增加,陣列的大小也相應增加。
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Sun Aug 22 22:16:19 1999 Raid Level : raid5 Array Size : 1024000 (1000.17 MiB 1048.58 MB) Used Dev Size : 204800 (200.03 MiB 209.72 MB) Raid Devices : 6 Total Devices : 7 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Sun Aug 22 22:23:46 1999 State : clean Active Devices : 6 Working Devices : 7 Failed Devices : 0 Spare Devices : 1 Layout : left-symmetric Chunk Size : 64K UUID : 53e6395c:1af16258:087cb2a0:b66b087f Events : 0.12 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 2 active sync /dev/sdd 3 8 64 3 active sync /dev/sde 4 8 80 4 active sync /dev/sdf 5 8 96 5 active sync /dev/sdg 6 8 112 - spare /dev/sdh [root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 --raid-disks=7 mdadm: Need to backup 1920K of critical section.. mdadm: ... critical section passed. [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid0] [raid10] [raid6] [raid5] [raid4] md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 1024000 blocks super 0.91 level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU] [===>.............] reshape = 19.4% (40256/204800) finish=0.7min speed=3659K/sec unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 /dev/md0: Version : 00.91.03 Creation Time : Sun Aug 22 22:16:19 1999 Raid Level : raid5 Array Size : 1024000 (1000.17 MiB 1048.58 MB) Used Dev Size : 204800 (200.03 MiB 209.72 MB) Raid Devices : 7 Total Devices : 7 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Sun Aug 22 22:26:46 1999 State : clean, recovering Active Devices : 7 Working Devices : 7 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 64K Reshape Status : 25% complete Delta Devices : 1, (6->7) UUID : 53e6395c:1af16258:087cb2a0:b66b087f Events : 0.76 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 2 active sync /dev/sdd 3 8 64 3 active sync /dev/sde 4 8 80 4 active sync /dev/sdf 5 8 96 5 active sync /dev/sdg 6 8 112 6 active sync /dev/sdh [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid0] [raid10] [raid6] [raid5] [raid4] md0 : active raid5 sdh[6] sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 1228800 blocks level 5, 64k chunk, algorithm 2 [7/7] [UUUUUUU] unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Sun Aug 22 22:16:19 1999 Raid Level : raid5 Array Size : 1228800 (1200.20 MiB 1258.29 MB) Used Dev Size : 204800 (200.03 MiB 209.72 MB) Raid Devices : 7 Total Devices : 7 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Sun Aug 22 22:37:11 1999 State : clean Active Devices : 7 Working Devices : 7 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 64K UUID : 53e6395c:1af16258:087cb2a0:b66b087f Events : 0.204 Number Major Minor RaidDevice State 0 8 16 0 active sync /dev/sdb 1 8 32 1 active sync /dev/sdc 2 8 48 2 active sync /dev/sdd 3 8 64 3 active sync /dev/sde 4 8 80 4 active sync /dev/sdf 5 8 96 5 active sync /dev/sdg 6 8 112 6 active sync /dev/sdh |
2.8 Bitmap記錄
使用bitmap模式記錄RAID陣列有多少個塊已經同步(resync)。參數--bitmap(或者其縮寫-b)指定記錄bitmap信息的文件名,如果是interval參數表示bitmap記錄在每個設備的元數據區。--bitmap-chunk表示每個bit位代表RAID設備多大的數據塊,單位是KB;而--delay(或者其縮寫-d)指定多長事件同步bitmap信息到文件或者設備上,單位是秒,默認是5秒。--force(或者其縮寫)表示覆蓋掉已經存在bitmap文件。而且使用--examine-bitmap(或者其縮寫-X)能夠查看存儲在文件或者設備元數據中的bitmap記錄的信息。
當陣列創建時指定bitmap模式,如果陣列初始化中停止陣列,當再次啟動陣列中,RAID陣列能夠利用bitmap記錄從上次中斷的位置接著執行。
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md1 -l1 -n2 /dev/sdi1 /dev/sdj1 --bitmap=internal mdadm: array /dev/md1 started. [root@fc5 tests]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [raid1] md1 : active raid1 sdj1[1] sdi1[0] 2096384 blocks [2/2] [UU] [========>......] resync = 51.2% (1075072/2096384) finish=0.1min speed=153581K/sec bitmap: 128/128 pages [512KB], 8KB chunk unused devices: <none> [root@fc5 tests]# ./mdadm -X /dev/sdi1 Filename : /dev/sdi1 Magic : 6d746962 Version : 4 UUID : bcccddb7:0f529abd:672e1f66:7e68bbc8 Events : 1 Events Cleared : 1 State : OK Chunksize : 8 KB Daemon : 5s flush period Write Mode : Normal Sync Size : 2096384 (2047.59 MiB 2146.70 MB) Bitmap : 262048 bits (chunks), 262048 dirty (100.0%) [root@fc5 tests]# ./mdadm --stop /dev/md1 mdadm: stopped /dev/md1 [root@fc5 tests]# ./mdadm -A /dev/md1 /dev/sd[i-k]1 --bitmap=internal ; cat /proc/mdstat mdadm: there is no need to specify --bitmap when assembling arrays with internal bitmaps mdadm: /dev/md1 has been started with 2 drives and 1 spare. Personalities : [raid6] [raid5] [raid4] [raid1] md1 : active raid1 sdi1[0] sdk1[2](S) sdj1[1] 1048448 blocks [2/2] [UU] [==============>...] resync = 87.6% (919616/1048448) finish=0.0min speed=89408K/sec bitmap: 27/128 pages [108KB], 4KB chunk unused devices: <none> [root@fc5 tests]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] [raid1] md1 : active raid1 sdj1[1] sdi1[0] 2096384 blocks [2/2] [UU] bitmap: 0/128 pages [0KB], 8KB chunk [root@fc5 tests]# mdadm -X /dev/sdi1 unused devices: <none> Filename : /dev/sdi1 Magic : 6d746962 Version : 4 UUID : bcccddb7:0f529abd:672e1f66:7e68bbc8 Events : 4 Events Cleared : 4 State : OK Chunksize : 8 KB Daemon : 5s flush period Write Mode : Normal Sync Size : 2096384 (2047.59 MiB 2146.70 MB) Bitmap : 262048 bits (chunks), 0 dirty (0.0%) |
使用bitmap文件記錄要求這個文件不能在RAID陣列上或者其相關的設備上,而且使用assemble命令時要指定bitmap文件名字。
[root@fc5 mdadm-2.6.3]#./mdadm -CR /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --bitmap=/tmp/md0-bm --bitmap-chunk=4 --delay=1 --force mdadm: array /dev/md0 started. [root@fc5 mdadm-2.6.3]# cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[0] 5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] [===========>.......] resync = 64.3% (675748/1048512) finish=0.7min speed=7848K/sec bitmap: 128/128 pages [512KB], 4KB chunk, file: /tmp/md0-bm unused devices: <none> Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1 Events : 1 Events Cleared : 1 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 262128 dirty (100.0%) [root@fc5 mdadm-2.6.3]# ./mdadm --stop /dev/md0 mdadm: stopped /dev/md0 [root@fc5 mdadm-2.6.3]# ./mdadm -A /dev/md0 /dev/sd[b-h] --bitmap=/tmp/md0-bm ; cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm mdadm: /dev/md0 has been started with 6 drives and 1 spare. Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] 5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] [=============>.....] resync = 70.5% (739884/1048512) finish=0.7min speed=6539K/sec bitmap: 41/128 pages [164KB], 4KB chunk, file: /tmp/md0-bm unused devices: <none> Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1 Events : 3 Events Cleared : 3 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 83696 dirty (31.9%) [root@fc5 mdadm-2.6.3]# cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb[0] sdh[6](S) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] 5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] bitmap: 0/128 pages [0KB], 4KB chunk, file: /tmp/md0-bm unused devices: <none> Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : d2f46320:40f1e154:08d7a21a:4cc9a9c1 Events : 6 Events Cleared : 6 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 0 dirty (0.0%) |
bitmap模式在陣列處於降級(degrade)狀態能夠記錄有哪些塊被寫過,當那個暫時失效的磁碟使用--re-add參數被重新添加后,陣列只重構這期間修改的數據塊,減少陣列重構的時間。bitmap信息中dirty的數量表示降級期間被修改過的塊。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 -f /dev/sdb /dev/sdh mdadm: set /dev/sdb faulty in /dev/md0 mdadm: set /dev/sdh faulty in /dev/md0 [root@fc5 mdadm-2.6.3]# cat /proc/mdstat Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdh[6](F) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] sdb[7](F) 5242560 blocks level 5, 64k chunk, algorithm 2 [6/5] [_UUUUU] bitmap: 0/128 pages [0KB], 4KB chunk, file: /tmp/md0-bm unused devices: <none> [root@fc5 mdadm-2.6.3]# ./mdadm -X /tmp/md0-bm Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : 3ede3bc0:adb1a404:49a18eed:f1b5c89a Events : 8 Events Cleared : 1 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 0 dirty (0.0%) [root@fc5 mdadm-2.6.3]# dd if=/dev/zero of=/dev/md0 bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 11.9995 seconds, 89.5 MB/s [root@fc5 mdadm-2.6.3]# ./mdadm -X /tmp/md0-bm Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : 3ede3bc0:adb1a404:49a18eed:f1b5c89a Events : 10 Events Cleared : 1 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 52432 dirty (20.0%) [root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 -r /dev/sdb --re-add /dev/sdb [root@fc5 mdadm-2.6.3]# cat /proc/mdstat ; ./mdadm -X /tmp/md0-bm Personalities : [raid6] [raid5] [raid4] md0 : active raid5 sdb[0] sdh[6](F) sdg[5] sdf[4] sde[3] sdd[2] sdc[1] 5242560 blocks level 5, 64k chunk, algorithm 2 [6/6] [UUUUUU] bitmap: 0/128 pages [0KB], 4KB chunk, file: /tmp/md0-bm unused devices: <none> Filename : /tmp/md0-bm Magic : 6d746962 Version : 4 UUID : 3ede3bc0:adb1a404:49a18eed:f1b5c89a Events : 24 Events Cleared : 24 State : OK Chunksize : 4 KB Daemon : 1s flush period Write Mode : Normal Sync Size : 1048512 (1024.11 MiB 1073.68 MB) Bitmap : 262128 bits (chunks), 0 dirty (0.0%) |
結束語
mdadm管理程序和Linux內核的MD驅動程序由同一個維護者Neil Brown統一管理,因此兩個軟體的功能也在不斷的增加,對應的軟體版本也能及時升級。本文講述了Linux系統中軟RAID的基本概念和如何使用mdadm程序來管理軟RAID設備,介紹了軟RAID設備的創建,刪除,停止和擴展等操作,以及其元數據和點陣圖bitmap數據的管理方法。我們還將在文章"Linux中軟體RAID使用常見問題解決"討論使用軟RAID設備常見的問題以及解決的方法。
(責任編輯:A6)
[火星人 ] Linux 中軟體 RAID 的使用已經有487次圍觀