momo zone

调核人的blog

搞定 ICH8R ISW RAID

先搞清楚从硬件软件角度理解的raid 目前raid实现主要有3中类型:

软件RAID 软件RAID(简称sw raid)是由OS来提供的RAID功能,此举会耗用较多的CPU运算资源来作动。此种raid一般之被建立软raid的os所识别,所以它和硬raid在外在表现上有很大不同。 温馨提示:上的Linux软件RAID技术已是相当成熟,使用装置/ dev/md0的,/ dev/md1 ,/ dev/md2上依此类推,md是multiple device的意思。

硬件RAID 硬件RAID由专属的RAID运算芯片,位于raid卡或直接嵌入在主板上,这时候OS只需要驱动的RAID芯片即可,如此一来把RAID的任务分工给的RAID卡,CPU的也较为轻松,管理上会比较简便。由raid管理的磁盘在所有操作系统中均可以访问(前提是raid卡被驱动)。 温馨提示:硬件RAID厂商通常会提供监控RAID的状态工具,若是遇到磁碟有故障情形时,主机会闪烁故障灯号或是发出哔哔声。

ATARAID (BIOS RAID,FAKE RAID) 这类型的RAID介于软RAID与硬RAID之间,算是半个硬件RAID(但大部分时候仍称为sw raid),通常由主板南桥来“帮忙”的RAID运算,因此有假的RAID(FAKE RAID)的之称。 要启动这个RAID的功能,要先在BIOS的磁盘模式中更改为RAID,然后在开机POST后按ctrl+i 进入RAID设置界面(搞的和硬RAID很像)。再使OS能够正确辨识装置即可。因为这款RAID的要在BIOS的内开启,所以亦有人称之为BIOS中的RAID。 ####################################################################################################

拿到WDRE4 X2 自然想到的一件事就是组raid。raid5,raid10,raid01 都可以排除了,因为首先我手里没有多余的磁盘,其次我要的是性能。所以毫无疑问我选择了raid0。在bios里面设置raid0很简单,但需要注意的是stripe size设置。默认128KB,也就是说小于128KB的底层读写请求将不会分别放入两块磁盘。可以想到这个值大些对于大文件来说是件好事,而这个值小些对于小文件更有利。但如果设置过小将会导致读写稍大文件时候增加raid负担(对于fake raid而言也就是CPU负担了)。我取中庸的设置32K。 fake raid非常接近硬raid ,对于linux而言无需任何驱动和设置即可在安装界面看到分区表。但在安装完毕后 ls /dev/ 下不会有raid块设备。原因是内核取代了bios来管理磁盘,如果内核无法理解fake raid的标记及结构,那么内核根本就不知道fake raid的存在,而仅仅能看到单块的磁盘。 研究总结了一下linux下支持fake raid的 条件:

1.内核raid子系统编译:

device driver -> Multiple devices driver support(RAID and LVM) 。 其中的raid support 指的应该是软raid:

This is called “Software RAID” since the combining of
the partitions is done by the kernel. “Hardware RAID” means that the
combining is done by a dedicated controller; if you have such a
controller, you do not need to say Y here.
所以不用选中。
另外一个是Device mapper support :
Device-mapper is a low level volume manager. It works by allowing
people to specify mappings for ranges of logical sectors. Various
mapping types are available, in addition people may write their own
modules containing custom mappings if they wish.
Higher level volume managers such as LVM2 use this driver.
To compile this as a module, choose M here: the module will be
called dm-mod.

Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。

DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。

dm targets 也就是指device mapper 所能支持的映射种类 :

 linear – maps continuous range of another block device
 striped (~RAID0) – striping across devices
 mirror (~RAID1) – mirroring devices
 crypt – encrypt data using CryptoAPI
 snapshot – online snapshots of block device
 multipath – access to multipath devices (misc. hw handlers)
 zero,error,delay – test and special targets
 truecrypt
...
 raid45 (~RAID4,5) – raid (with dedicated) parity
 loop – stack device over another or over file
 throttle, rwsplit, flakey – test targets

由此可见,DM是不了解磁盘文件机制的(比如LVM,分区表,文件系统,挂载机制)。他只能进行磁盘的底层IO ,比如访问某个扇区,某个柱面。而且每个IO都是经过重新映射过的。

dm-mod这个模块一定要有,或者直接编译到内核。成功启用后可以看到这个设备文件 :/dev/mapper/control

2.device-mapper 用户空间程序

配合dm-mod 内核模块来做磁盘映射管理。

具体提供:

/sbin/dmeventd , /sbin/dmsetup

用户接口

/lib/libdevmapper-event.so.1.02 /lib/libdevmapper.so.1.02

库文件

/lib/udev/rules.d/10-dm.rules

/lib/udev/rules.d/13-dm-disk.rules

/lib/udev/rules.d/95-dm-notify.rules

udev规则

/etc/init.d/boot.device-mapper

init 初始化脚本

/lib/mkinitrd/scripts/boot-dm.sh /lib/mkinitrd/scripts/setup-dm.sh

initrd rom盘脚本 这个很重要稍后会说明

这里举个例子,比如需要从现有物理磁盘映射出来一个虚拟磁盘,并将第9个扇区设置为坏块。最后用dd去访问,来模拟磁盘故障。

(1)

dmsetup create bad_disk
0 8 linear /dev/sdb1 0
8 1 error
9 204791 linear /dev/sdb1 9
蓝色部分的即为map table ,结束map table的输入可以按 ctrl+D 。
(2)

blockdev –setra 0 /dev/mapper/bad_disk # 设置预读扇区数为0

blockdev –getsz /dev/mapper/bad_disk # 获得磁盘扇区总数

(3)

linux:~ # dd if=/dev/mapper/bad_disk of=/dev/null bs=1k count=4
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.309579 s, 13.2 kB/s
linux:~ # dd if=/dev/mapper/bad_disk of=/dev/null bs=1k count=5
dd: reading `/dev/mapper/bad_disk’: Input/output error
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.00184017 s, 2.2 MB/s
count=4 时访问0-7扇区没有问题,当访问8 扇区是由于映射的扇区是error ,所以无法访问。

3.dmraid

基于DM的一个fake raid专用设置工具。它实际的作用是一个用户空间的驱动程序。它读取isw的metadata然后依据metadata 调用libdevmapper 建立 map table,实际对磁盘的操作也是由libdevmapper 和 dm-mod 完成的。

具体提供:

/sbin/dmevent_tool /sbin/dmraid

用户接口程序

/lib/libdmraid-events-isw.so /lib/libdmraid.so.1.0.0.rc16-3

库文件

/etc/init.d/boot.dmraid

init初始化脚本

/lib/mkinitrd/scripts/boot-dmraid.sh /lib/mkinitrd/scripts/setup-dmraid.sh

initrd rom 盘脚本

dmraid 的基本用法:

(1) #dmraid -l

asr     : Adaptec HostRAID ASR (0,1,10)
ddf1    : SNIA DDF1 (0,1,4,5,linear)
hpt37x  : Highpoint HPT37X (S,0,1,10,01)
hpt45x  : Highpoint HPT45X (S,0,1,10)
isw     : Intel Software RAID (0,1,5,01)
jmicron : JMicron ATARAID (S,0,1)
lsi     : LSI Logic MegaRAID (0,1,10)
nvidia  : NVidia RAID (S,0,1,10,5)
pdc     : Promise FastTrack (S,0,1,10)
sil     : Silicon Image(tm) Medley(tm) (0,1,10)
via     : VIA Software RAID (S,0,1,10)
dos     : DOS partitions on SW RAIDs
显示支持的fake raid的种类,也就是列出可以识别的metadata类型。
(2) #dmraid -a[y/n]
激活已建立的fake raid
(3) #dmraid -s
*** Group superset isw_cffghdacdg
–> Active Subset
name   : isw_cffghdacdg_WDRE4-400
size   : 1743812480
stride : 64
type   : stripe
status : ok
subsets: 0
devs   : 2
spares : 0
–> Active Subset
name   : isw_cffghdacdg_WDRE4-500
size   : 209715072
stride : 64
type   : stripe
status : ok
subsets: 0
devs   : 2
spares : 0
显示已存在的raid 组及属性。
(4)#dmraid -r
/dev/sdd: isw, “isw_cffghdacdg”, GROUP, ok, 976773165 sectors, data@ 0
/dev/sdc: isw, “isw_cffghdacdg”, GROUP, ok, 976773165 sectors, data@ 0
显示每个raid组 成员的属性

4.kpartx

根据块设备的分区表映射出分区对应的块设备。

比如/dev/sda 中的分区分别映射出/dev/sda1, /dev/sda2 等等。

#################################################################

前面都已经铺垫完了,下面切入正题

简单地说在各发行版中,想使用fake raid 很简单只要dmraid -ay 即可,然后mount /dev/mapper/isw_XXXX /mnt。 但如果想从一个fake raid 挂载根目录来启动 似乎大家的支持程度不一 。比如opensuse就不行。简单修改一下grub :

title Desktop -- openSUSE 11.1 - 2.6.38.4-1-desktop
    root (hd3,0)
    kernel /vmlinuz-2.6.38.4-1-desktop root=/dev/mapper/isw-ddhhicaebf_WDRE4-500_part2 resume=/dev/mapper/isw-ddhhicaebf_WDRE4-500_part3 showopts vga=0x31b
    initrd /initrd-2.6.38.4-1-desktop

启动时会提示:

Waiting for device /dev/mapper/isw_cffghdacdg_WDRE4-500_part2 to appear     然后等待超时后会hold

我看了一些说法好像是opensuse 支持mdadm而不支持redhat主导的dmraid 所以无法挂载。我认同这种说法,但我想肯定有办法自行解决这个问题。

加入kernel 参数 shell=1 可以在initrd 的 /bin/linuxrc 执行完之后开启一个shell 。

l /dev/mapper 发现是空目录,说明initrd /boot里面所有脚本执行完毕后也没有对raid 进行映射,无映射的设备文件。那么问题应该是initrd 没有包含dm-mod ,dmsetup 和 dmraid?

使用mkinitrd 中的 lsinitrd 可以列出目录,发现确实没有。看来要重新制作initrd 。通过man mkinitrd 得知-f 选项可以添加额外特性。其实mkinitrd是个脚本,他会根据当前系统环境生成合适的initrd, 不过我感觉这里存在bug, 他没有将系统中的raid放在眼里,所以生成的initrd 缺少模块支持。 根据前面的铺垫,要把dm,dmraid,kpartx 都加上:
mkinitrd -f  “dm dmraid kpartx” -k vmlinuz-2.6.37-desktop -i initrd-2.6.37-desktop -b /boot    
(-k 后面的一系列参数可以通过<initrd_root>/mkinitrd.conf 查看

展开 initrd的方法 :

mkdir /boot/initrd_dir

cd /boot/initrd_dir

cp ../initrd .

cpio -i -d < initrd

手动打包initrd的方法

find . | cpio -H newc -o > ../initrd.cpio

cd ..

cat initramfs.cpio | gzip > initrd.gz ) 

这样重新启动后然后会提示 Waiting for device /dev/mapper/isw_cffghdacdg_WDRE4-500_part2 to appear
看来要分析一下initrd 中/boot 目录下的脚本了
依照执行顺序找到 /boot/initrd_dir_3/boot/21-dmraid.sh
#!/bin/bash
#%stage: block
#%depends: dm
#%provides: dmroot
#%programs: /sbin/dmraid
#%if: -n “$root_dmraid”
#
##### Device Mapper Raid
##
## If the root device uses a software raid based on device mapper,
## this initializes and waits for the device to appear.
##
## Command line parameters
## ———————–
##
## root_dmraid=1        use device mapper raid
##
/sbin/dmraid -a y -p
wait_for_events

发现好像应该设置root_dmraid=1 内核启动参数才能执行 /sbin/dmraid -a y -p  ,最终修改grub 如下。

title Desktop -- openSUSE 11.1 - 2.6.38.4-1-desktop
    root (hd3,0)
    kernel /vmlinuz-2.6.38.4-1-desktop root=/dev/mapper/isw-ddhhicaebf_WDRE4-500_part2 resume=/dev/mapper/isw-ddhhicaebf_WDRE4-500_part3 root_dm=1 root_dmraid=1 showopts vga=0x31b
    initrd /initrd-2.6.38.4-1-desktop
最后终于搞定了 。这里还有一个小问题,boot log 会看到:
RAID set "isw_cffghdacdg_WDRE4-400" was activated
RAID set "isw_cffghdacdg_WDRE4-500" was activated
The dynamic shared library "libdmraid-events-isw.so" could not be loaded:
    libdmraid-events-isw.so: cannot open shared object file: No such file or directory
The dynamic shared library "libdmraid-events-isw.so" could not be loaded:
    libdmraid-events-isw.so: cannot open shared object file: No such file or directory
Trying manual resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Invoking userspace resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
resume: libgcrypt version: 1.4.4
Trying manual resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Invoking in-kernel resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Waiting for device /dev/mapper/isw_cffghdacdg_WDRE4-500_part2 to appear:  ok
RAID set “isw_cffghdacdg_WDRE4-400” was activated
RAID set “isw_cffghdacdg_WDRE4-500” was activated
ERROR:  Unable to register a device mapper event handler for device “isw_cffghdacdg_WDRE4-400”
ERROR:  Unable to register a device mapper event handler for device “isw_cffghdacdg_WDRE4-500”
Trying manual resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Invoking userspace resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
resume: libgcrypt version: 1.4.4
Trying manual resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Invoking in-kernel resume from /dev/mapper/isw_cffghdacdg_WDRE4-500_part3
Waiting for device /dev/mapper/isw_cffghdacdg_WDRE4-500_part2 to appear:  ok
不过未发现什么影响。
晒win2008R2-SP1 下 HDT 成绩:

 

2015/1/2 update:

发现dmraid已经渐渐合并到mdadm了 <http://www.phoronix.com/scan.php?page=news_item&px=MTUxOTk&gt; :

Besides wanting to enable SSD TRIM support for Ubuntu Linux, developers are also looking at moving from DMRAID to MDADM for fake/software RAID configurations on the desktop operating system.

MDADM has now the ability to manage external meta-data RAID devices and for some devices such as Intel Matrix RAID it’s now preferred over using the common DMRAID package. With the broader move towards MDADM for Linux RAID administrator, Ubuntu developers are looking to follow this movement and transition to MDADM by default.

MDADM supports all the standard RAID configurations (RAID 0/1/4/5/6/10) and works with both partitions and entire disks. MDADM also supports container, multi-path, faulty, and linear disk configurations as well.

For those exploring RAID on Linux or want to catch up on MDADM, see the developer blog or the Git repository. What’s new today is that Ubuntu developers are hoping to switch to MDADM by default over DMRAID.

There’s changes needed by the Ubuntu installer, initramfs changes, dmraid/imsm migration items to work through, and other issues to work through, but it’s now on the agenda for Ubuntu and potentially to be changed in 14.04 LTS. More details on the MDADM Ubuntu plans can be found via this Ubuntu vUDS page.

新的发行版默认使用mdadm管理fake raid,但貌似还有点问题,不支持一个磁盘组中的多个卷。解决办法是停掉mdadm -S /dev/md0。然后再dmraid -ay。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

%d 博主赞过: