Linux 中軟體 RAID 的使用

atlantisholic發表於2011-03-20

一.簡介

在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: 
[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                                        
         Linear (append) mode  
         RAID-0 (striping) mode  
         RAID-1 (mirroring) mode 
         RAID-10 (mirrored striping) mode (EXPERIMENTAL) 
         RAID-4/RAID-5/RAID-6 mode 
    [*]       Support adding drives to a raid-5 array 
         Multipath I/O support 
         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: 
[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裝置或者檔案系統使用,則不能用來建立新的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: 
[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: 

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: 
[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: 

如果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: 

如果陣列沒有熱備磁碟,可以使用--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: 
[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: 
[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: 
[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: 
[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: 
[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: 
        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: 
        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: 
        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: 
        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: 
[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 f=/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: 
        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%)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-690012/,如需轉載,請註明出處,否則將追究法律責任。

相關文章