在文章“Linux 中軟件 RAID 的使用”中我們講述了 Linux 系統中軟 RAID 的基本概念和如何使用 mdadm 程序來管理軟 RAID 設備,通過對 mdadm 命令的主要參數來介紹軟 RAID 設備的創建,刪除,停止和擴展等操作,以及其元數據和位圖 bitmap 數據的管理方法。在本文中我們討論使用軟 RAID 設備常見的問題以及解決的方法。
1. RAID 的子設備物理上要獨立不相關
對一個磁盤上的多個磁盤分區做RAID是沒有價值的,因為不但違背了RAID陣列中設備獨立性的原則,不能增加陣列的可靠性,當這個磁盤失效後必然不可避免的導致數據丟失,而且還導致陣列的性能顯著降低,當數據讀寫時磁頭在磁盤的多個分區上來回抖動帶來長時間的搜索耗時。
2. RAID 0 沒有數據冗余功能
RAID 0 只能使用數據塊條帶化(stripping)功能來提高性能,如果有磁盤失效則會導致MD設備上的數據丟失,在讀寫MD設備時出錯。
3. 快速測試命令
當創建磁盤時,如果已知設備上的數據已經是同步(sync)成功過,或者僅僅是用來測試陣列,可以使用--assume-clean參數來通知MD驅動不必初始化陣列。
mdadm -C /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
如果想避免mdadm每次創建命令時,因為設備上還有以前的元數據的提示,避免手工輸入,可以使用--run(或者其縮寫-R)通知陣列直接運行。
mdadm --create --run /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
4. 異構磁盤組成的RAID
RAID0可以支持不同大小的磁盤構造多個區域(zone)的RAID,每個區域有不同的磁盤個數。使用fdisk命令查詢/dev/sdi1為2GB, /dev/sdj1為4GB,/dev/sdk1為1GB,所以做成RAID0設備為7GB。
mdadm -C /dev/md0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh --assume-clean
而RAID1,RAID456, RAID10等對不同大小的磁盤只能使用最小的磁盤的容量作為公共的大小,多余的部分被浪費掉。/dev/sdi1,/dev/sdj1,/dev/sdk1做成的RAID5設備為2GB,是最小的設備/dev/sdk1的2倍,設備/dev/sdi1和sdj1分別浪費了1GB和3GB。
[root@fc5 mdadm-2.6.3]# ./mdadm –CR /dev/md1 -l0 -n3 /dev/sd[i-k]1
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
Array Size : 7337664 (7.00 GiB 7.51 GB)
在陣列的狀態信息查詢中的大小(ArraySize)前面使用的是KB,也表示MD塊設備的實際大小;而後面的兩個值只是為了顯示處理後的結果。
[root@fc5 mdadm-2.6.3]# ./mdadm –CR /dev/md1 -l0 -n3 /dev/sd[i-k]1
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
Array Size : 7337664 (7.00 GiB 7.51 GB)
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md1 -l5 -n3 /dev/sd[i-k]1
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md1 | grep "Array Size"
Array Size : 2096896 (2048.09 MiB 2147.22 MB)
5. 配置共享的熱備盤
mdadm程序是允許多個RAID組共享冗余磁盤的。 例如有/dev/md0和/dev/md1兩個陣列,在創建時/dev/md0裡面有一個熱備磁盤,而/dev/md1沒有熱備磁盤。我們只要在/etc/mdadm.conf中配置兩個陣列使用相同的spare-group組。
[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 spare-group=sparedisks
UUID=dcff6ec9:53c4c668:58b81af9:ef71989d
ARRAY /dev/md0 level=raid10 num-devices=6 spare-group=sparedisks
UUID=0cabc5e5:842d4baa:e3f6261b:a17a477a
並運行mdadm 的監控(monitor)模式命令。當/dev/md1陣列中的一個磁盤/dev/sdi1失效時,mdadm會自動從/dev/md0組中上移走spare磁盤,並加入/dev/md1中。
[root@fc5 mdadm-2.6.3]#./mdadm --monitor --mail=root@localhost --syslog --program=/root/md.sh
--delay=300 /dev/md* --daemonise
8105
[root@fc5 mdadm-2.6.3]#./mdadm /dev/md1 -f /dev/sdi1
mdadm: set /dev/sdi1 faulty in /dev/md1
[root@fc5 mdadm-2.6.3]#./mdadm -D /dev/md1
/dev/md1:
Version : 00.90.03
Creation Time : Mon Aug 23 00:10:00 1999
Raid Level : raid5
Array Size : 2096896 (2048.09 MiB 2147.22 MB)
Used Dev Size : 1048448 (1024.05 MiB 1073.61 MB)
Raid Devices : 3
Total Devices : 4
Preferred Minor : 1
Persistence : Superblock is persistent
Update Time : Mon Aug 23 00:13:15 1999
State : clean, degraded, recovering
Active Devices : 2
Working Devices : 3
Failed Devices : 1
Spare Devices : 1
Layout : left-symmetric
Chunk Size : 64K
Rebuild Status : 78% complete
UUID : 34d3de75:6912dc24:e1316607:4e72cd01
Events : 0.4
Number Major Minor RaidDevice State
3 8 112 0 spare rebuilding /dev/sdh
1 8 145 1 active sync /dev/sdj1
2 8 161 2 active sync /dev/sdk1
4 8 129 - faulty spare /dev/sdi1
6. 多種元數據格式
目前MD設備有兩種主要的元數據格式(0.9版本和1.x版本),主要是元數據占用的空間不同和支持的底層設備個數不同,而且1.x版本還可以指定元數據寫入設備的具體位置(1.0為在設備尾部,1.1為在設備開始,1.2為在設備開始的4KB位置)。創建陣列通過--metadata(或者其縮寫-e)參數來指定元數據格式版本。
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 /dev/sd[b-h]
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
Version : 00.90.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.0 /dev/sd[b-h]
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
Version : 01.00.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.1 /dev/sd[b-h]
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
Version : 01.01.03
[root@fc5 mdadm-2.6.3]# ./mdadm -CR /dev/md0 -l5 -n6 -x1 -e1.2 /dev/sd[b-h]
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0 | grep Version
Version : 01.02.03
當陣列將磁盤移走後,也使用--zero-superblock清空設備上面的元數據信息。
[root@fc5 mdadm-2.6.3]# ./mdadm -Es /dev/sdh
ARRAY /dev/md0 level=raid5 num-devices=6
UUID=acd2b182:4695ee20:37689502:eb0423e1
spares=1
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 -f /dev/sdh -r /dev/sdh
mdadm: set /dev/sdh faulty in /dev/md0
mdadm: hot removed /dev/sdh
[root@fc5 mdadm-2.6.3]# ./mdadm --zero-superblock /dev/sdh
[root@fc5 mdadm-2.6.3]# ./mdadm
-Es /dev/sdh
[root@fc5 mdadm-2.6.3]#
7. 可分區的RAID設備
如果想對支持分區的MD設備(Partitionable raid array)進行分區,需要在創建時使用/dev/md_d0來替代前面的/dev/md0。創建陣列是通過--auto=mdp(或者其縮寫-ap)參數指定。
[root@fc5 mdadm-2.6.3]# ./mdadm -Cv --auto=mdp /dev/md_d0 -l5 -n6 /dev/sd[b-g] -x1 /dev/sdh
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 64K
mdadm: size set to 1048512K
mdadm: array /dev/md_d0 started.
[root@fc5 mdadm-2.6.3]# fdisk /dev/md_d0
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.
The number of cylinders for this disk is set to 1310640.
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)
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-1310640, default 1):1
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1310640, default 1310640): +1024M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (250002-1310640, default 250002):250002
Using default value 250002
Last cylinder or +size or +sizeM or +sizeK (250002-1310640, default 1310640):1310640
Using default value 1310640
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/md_d0
Disk /dev/md_d0: 5368 MB, 5368381440 bytes
2 heads, 4 sectors/track, 1310640 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Device Boot Start End Blocks Id System
/dev/md_d0p1 1 250001 1000002 83 Linux
/dev/md_d0p2 250002 1310640 4242556 83 Linux
MD設備支持兩種塊設備,
一種是不可分區類型的名字是md設備,主設備號是9,另一種是可分區的名字是mdp設備,mdp的主設備號是動態分配的,一個mdp設備最多能支持63個分區。查看/proc/device信息能看到mdp的主設備號,查詢/proc/partitions信息能看到md和mdp設備的主設備號和從設備號。
[root@fc5 mdadm-2.6.3]# cat /proc/devices | grep md
1 ramdisk
9 md
253 mdp
[root@fc5 mdadm-2.6.3]# cat /proc/partitions | grep md
9 1 2096896 md1
253 0 5242560 md_d0
253 1 1000002 md_d0p1
253 2 1000002 md_d0p2
8. 怎樣擴展RAID設備
Grow模式中的容量擴展(resize)功能不但支持設備大小增加,也可以支持設備大小減少,但要求使用者自己來保證MD設備有效數據上不被截斷導致丟失。
[root@fc5 mdadm-2.6.3]# ./mdadm /dev/md0 --grow --size=102400
[root@fc5 mdadm-2.6.3]# ./mdadm -Q /dev/md0
/dev/md0: 600.00MiB raid5 7 devices, 0 spares. Use mdadm --detail for more detail.
而磁盤個數擴展(reshape)功能不支持設備個數減少,如果在陣列中空閒的熱備盤而且也沒有指定backup文件,則不能擴展。如果對於RAID5陣列有備份(backup)文件可以支持擴展一個磁盤,擴展後的磁盤陣列是降級模式的,不支持擴展多個磁盤或者對降級的RAID5陣列再擴展。這些擴展模式不夠安全,僅僅是暫時沒有熱備盤的權宜之計,一般合理的操作還是先增加空閒的熱備磁盤再執行擴展命令。
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n6
mdadm: /dev/md0: Cannot reduce number of data disks (yet).
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n8
mdadm: Need to backup 2688K of critical section.
mdadm: /dev/md0: Cannot grow - need a spare or backup-file to backup critical section
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n9 --backup-file=/root/bak-reshape
mdadm: Need to backup 1024K of critical section..
mdadm: /dev/md0: failed to initiate reshape
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n8 --backup-file=/root/bak-reshape
mdadm: Need to backup 2688K 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]
6291072 blocks super 0.91 level 5, 64k chunk, algorithm 2 [8/7] [UUUUUUU_]
[>..................] reshape = 2.6% (28608/1048512) finish=4.1min speed=4086K/sec
md1 : active raid0 sdk1[2] sdj1[1] sdi1[0]
7337664 blocks 64k chunks
unused devices: < none >
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
Version : 00.91.03
Creation Time : Sun Aug 22 23:46:29 1999
Raid Level : raid5
Array Size : 6291072 (6.00 GiB 6.44 GB)
Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
Raid Devices : 8
Total Devices : 7
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sun Aug 22 23:46:56 1999
State : clean, degraded, recovering
Active Devices : 7
Working Devices : 7
>Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
Reshape Status : 4% complete
Delta Devices : 1, (7->8)
UUID : 50e886b9:9e28d243:a7f6457d:5eb47f2e
Events : 0.94
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
7 0 0 7 removed
[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]
7339584 blocks level 5, 64k chunk, algorithm 2 [8/7] [UUUUUUU_]
md1 : active raid0 sdk1[2] sdj1[1] sdi1[0]
7337664 blocks 64k chunks
unused devices: < none >
[root@fc5 mdadm-2.6.3]# ./mdadm -D /dev/md0
/dev/md0:
Version : 00.90.03
Creation Time : Sun Aug 22 23:46:29 1999
Raid Level : raid5
Array Size : 7339584 (7.00 GiB 7.52 GB)
Used Dev Size : 1048512 (1024.11 MiB 1073.68 MB)
Raid Devices : 8
Total Devices : 7
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Sun Aug 22 23:50:18 1999
State : clean, degraded
Active Devices : 7
Working Devices : 7
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 64K
UUID : 5
0e886b9:9e28d243:a7f6457d:5eb47f2e
Events : 0.766
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
7 0 0 7 removed
[root@fc5 mdadm-2.6.3]# ./mdadm -G /dev/md0 -n9 --backup-file=/root/bak-reshape
mdadm: Need to backup 3584K of critical section..
mdadm: /dev/md0: failed to find device 7. Array might be degraded.
--grow aborted
9. 為什麼不能擴展RAID設備
當使用grow模式時,如果內核不支持sysfs或者MD驅動版本較低不支持時則會返回錯誤。另外使用strace命令跟蹤能導致在哪個函數調用上出錯返回。
[root@fc5 mdadm-2.6.3]# ./mdadm --grow /dev/md0 -n6
mdadm: Need to backup 1280K of critical section..
mdadm: /dev/md0: Cannot get array details from sysfs
如果系統沒有加載sysfs,需要使用mount命令加載。
mount –t sysfs sysfs /sys/
10. 為什麼不能停止MD設備
當停止MD陣列時,有時被返回MD設備正在被使用錯誤,需要檢查MD設備被哪個上層設備使用。一個情況是被文件系統使用,如已經被mount起來:
[root@fc5 mdadm-2.6.3]# df -h | grep md
/dev/md0 485M 11M 449M 3% /mnt/md-test
另一種情況是MD設備被用戶層其他程序打開使用,如nbd-server導出MD設備:
[root@fc5 md0]#fuser -u /dev/md0
/dev/md0: 3507(root)
[root@fc5 md0]#ps ax| grep 3507
3507 ?
還有可能是內核驅動程序打開使用,如被LVM程序當作物理卷(PV)使用:
[root@fc5 mdadm-2.6.3]# ls -l /sys/block/md0/holders/
total 0
lrwxrwxrwx 1 root root 0 08-22 23:31 dm-0 -> ../../../block/dm-0
小結
如果在軟RAID使用中遇到問題不能解決,應該首先查看mdadm的幫助信息;如果還不能解決,可以到mdadm的郵件列表尋找是否有相關的問題解答或者詳細描述該問題的發生過程請求大家幫助