歡迎您光臨本站 註冊首頁

Linux中軟RAID常見問題解決

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  在文章「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 : 50e886b9: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的郵件列表尋找是否有相關的問題解答或者詳細描述該問題的發生過程請求大家幫助.

  本文出自 「石頭博客」 博客,請務必保留此出處http://shitou118.blog.51cto.com/715507/254725


[火星人 ] Linux中軟RAID常見問題解決已經有522次圍觀

http://coctec.com/docs/linux/show-post-52249.html