mdadm 用於建設,管理和監控RAID陣列
用法:
mdadm --create device options...
用未使用的設備,創建raid選項,
mdadm --assemble device options...
合並先前創建的raid陣列。
mdadm --build device options...
創建或合並沒有元數據的一個raid。
mdadm --manage device options...
對現有陣列進行更改
mdadm --misc options... devices
報告或修改各種MD相關設備的。
mdadm --grow options device
調整以激活的raid陣列
mdadm --incremental device
從一個raid中,添加/刪除設備
mdadm --monitor options...
監視一個或多個raid陣列的變化
mdadm device options...
--manage的簡寫
mdadm --create 主要參數
--auto=yes :決定建立後面接的軟體磁盤陣列設備,亦即/ dev/md0的,/ dev/md1上...
--raid-devices=N :使用幾個磁盤 (partition) 作為磁盤陣列的設備
--spare-devices=N :使用幾個磁盤作用磁盤陣列的備用設備
--level=[015] :設置磁盤陣列的等級,常用0,1,5
mdadm --manage 主要參數
--add :會將後面的設備加入到這個MD中!
--remove :會將後面的設備由這個MD中移除
--fail :會將後面的設備設定成為出錯的狀態
一、在linux系統中目前以MD(Multiple Devices)虛擬塊設備的方式實現軟件RAID,利用多個底層的塊設備虛擬出一個新的虛擬設備,並且利用條帶化(stripping)技術將數據塊均勻分布到多個磁盤上來提高虛擬設備的讀寫性能,利用不同的數據冗祭算法來保護用戶數據不會因為某個塊設備的故障而完全丟失,而且還能在設備被替換後將丟失的數據恢復到新的設備上.
目前MD支持linear,multipath,raid0(stripping),raid1(mirror),raid4,raid5,raid6,raid10等不同的冗余級別和級成方式,當然也能支持多個RAID陳列的層疊組成raid1 0,raid5 1等類型的陳列,
本文主要講解用戶層mdadm如何管理軟件RAID及使用中經常遇到的問題及解決辦法.現流行的系統中一般已經將MD驅動模塊直接編譯到內核中或編譯為可動態加載的驅動模塊,我們可以在機器啟動後通過cat /proc/mdstat看內核是否已經加載MD驅動或者cat /proc/devices是否有md塊設備,並且可以使用lsmod看MD是否可以模塊加載到系統中.
復制代碼代碼如下:
[root@testggv ~]# cat /proc/mdstat
Personalities :
unused devices:
[root@testggv ~]#
[root@testggv ~]# cat /proc/devices | grep md
1 ramdisk
9 md
254 mdp
[root@testggv ~]#mdadm --version
[root@testggv ~]# mdadm --version
mdadm - v2.5.4 - 13 October 2006
[root@testggv ~]#
二、mdadm管理軟raid陳列
mdadm程序是一個獨立的程序,能完成所有的軟件raid管理功能,主要有7種使用模式:
Create
使用空閒的設備創建一個新的陣列,每個設備具有元數據塊
Assemble
將原來屬於一個陣列的每個塊設備組裝為陣列
Build
創建或組裝不需要元數據的陣列,每個設備沒有元數據塊
Manage
管理已經存儲陣列中的設備,比如增加熱備磁盤或者設置某個磁盤失效,然後從陣列中刪除這個磁盤
Misc
報告或者修改陣列中相關設備的信息,比如查詢陣列或者設備的狀態信息
Grow
改變陣列中每個設備被使用的容量或陣列中的設備的數目
Monitor
監控一個或多個陣列,上報指定的事件
如果MD驅動被編譯到內核中,當內核調用執行MD驅動時,會自動查找分區為FD(linux raid autodetect格式的磁盤。所以一般會使用fdisk工具將HD磁盤或者SD磁盤分區,再設置為FD的磁盤。
復制代碼代碼如下:
[root@testggv ~]# fdisk /dev/hdc
The number of cylinders for this disk is set to 25232.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-25232, default 1):
Using default value 1
Last cylinder or size or sizeM or sizeK (1-25232, default 25232):
Using default value 25232
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.
WARNING: Re-reading the partition table failed with error 16: Device or
busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
[root@testggv ~]#
如果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 -A:指裝載一個已存在的陳列 -s: 指查找mdadm.conf文件中的配置信息。
手工停止盤陳:
復制代碼代碼如下:#mdadm -S /dev/md0
創建新的陳列
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/sdb1 /dev/sdc1 /dev/sdd1
創建一個raid 1設備:
復制代碼代碼如下:
mdadm --create /dev/md0 --level=1 --chunk=128 --raid-devices=2 --spare-devices=1 /dev/sdb1 /dev/sdc1 /dev/sdd1
創建一個RAID5設備:
復制代碼代碼如下:
mdadm --create /dev/md0 --level=5 --raid-devices=5 /dev/sd[c-g]1 --spare-devices=1 /dev/sdb1
創建一個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
初始化的時間長短和磁盤陣列自身性能以及讀寫的應用負載相關,使用cat /proc/mdstat信息查詢RAID陣列當前重構的速度和預期的完成時間。
復制代碼代碼如下:
cat /proc/mdstat
[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:
[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:
使用陳列:
MD設備可以像普通塊設備那樣直接讀寫,也可以做文件系統格式化。
復制代碼代碼如下:
#mke2fs -j /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/md02.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)來指定配置文件。我們通常可以如下命令來建#立配置文件
復制代碼代碼如下:
#echo DEVICE /dev/sdc1 /dev/sdb1 /dev/sdd1 > /etc/mdadm.conf
#mdadm --detail --scan >> /etc/mdadm.conf
使用配置文件啟動陣列時,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:
[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:
查詢陣列的狀態
我們可以通過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:
[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:
我們也可以通過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
管理陣列
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:
如果陣列沒有熱備磁盤,可以使用--add(或者其縮寫-a)參數增加熱備磁盤
復制代碼代碼如下:
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --add /dev/sdh
mdadm: added /dev/sdh
監控陣列
可以使用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