分类: LINUX
2014-08-18 11:06:55
原文地址:[原创] Software-RAID 笔记 - (中篇) 作者:ailms
一、
内核及引导相关
1、
内核和 Software-RAID
Software-RAID 的实现需要内核的支持,有两种方式 :一种是 built-in ,也就是把各个级别的
sofatware-RAID 的代码集成到内核文件中;一种就是 module 方式,类似驱动文件,放到
/lib/modules/
a)
如果 / 系统是 Software-RAID ,则必须用 built-in 方式。除非在创建 initrd 文件时指定 –-preload
b)
如果想让某个级别的 software-RAID 在系统启动时自动激活,就必须把该级别的 software-RAID support 以 built-in 方式编译到内核中,否则用 modules
c)
默认是以 Modules 方式编译,除非你在安装 Linux 时把 / 做成 software-RAID 的方式。
2、
如何判断当前各个级别的 RAID support 的方式?
a)
如果是 Redhat 9 ,必须kernel-source RPM
包;如果是 RHEL ,必须安装 kernel-devel RPM 包。这个步骤一定要做,否则无法继续下面的操作
b)
如果是 Redhat 9 ,先进入
/usr/src/linux-2.4/ 目录下,执行make menuconfig
c)
如果是 Redhat AS ,先进入
/usr/src/kernels/
d)
如果是 Redhat 9 ,选择 “Multi-device
support (RAID and LVM)” → “RAID support” ,看下面各个级别的 RAID 前面的 <> 中是字母 M (表示module 方式)还是 * 号(built-in);如果为空,则默认为 module 方式
3、
利用脚本自动判断
上面的方法比较麻烦,需要先安装 RPM 包,有没有什么方法可以直接判断呢?其实我们也可以不用安装 RPM 包,而是通过查找一些文件就可以知道了。
总体思路是 :
a)否存在 /proc/mdstat 文件,如果没有就彻底不支持 RAID
b)查看
/lib/modules/
c)如果没有,可能是 built-in 也可能根本不支持,分两步走 :
1)如果是 built-in ,则 /proc/mdstat 的 personalities 会列出该 RAID 级别。
2)如果是不支持,则
/proc/mdstat 的 personalities 不会有该 RAID 级别。
d)还要注意一点,Redhat 9 和 Redhat AS 4 的 RAID 模块名不一样,前者是 *.o ,后者是 *.ko 。
整个 shell 脚本如下 :(支持 Redhat 9 和 Redhat AS 4 )
[root@mail
~]# cat ./check_md.sh
#!/bin/bash
kernel_ver=$(uname
-r)
echo
echo
"Current Kernel : $kernel_ver
"
echo
"================================="
# if /proc/mdstat
file NOT exists, if must be the RAID-Support NOT enable"
[ ! -f
/proc/mdstat ] && echo "RAID-Support NOT enable" &&
exit 1
list="linear
raid0 raid1 raid5 raid6 raid10 multipath"
for i in
$list; do
# First. search the /lib/modules/
[ -f
"/lib/modules/${kernel_ver}/kernel/drivers/md/${i}.o" ] &&
echo " $i ...... [ Module ]"
&& continue
[ -f
"/lib/modules/${kernel_ver}/kernel/drivers/md/${i}.ko" ] &&
echo "$i ...... [ Module ]"
&& continue
# Second. check the /proc/mdstat file
and grep the "Personalities ... " line to see if the specical was
built-in supported
if
grep Personalities /proc/mdstat |grep -i $i >/dev/null 2>&1
;then
echo " $i ...... [ Built-in ]"
else
# this LEVEL is supposed NOT to be supported
echo " $i ...... [ NOT
Support ]"
fi
done
echo
"================================="
[root@mail
~]#
下面是 Redhat AS 上的输出 :
[root@mail ~]# ./check_md.sh
Current Kernel
: 2.6.9-5.EL
=================================
linear ...... [ Module ]
raid0 ...... [ Module ]
raid1 ...... [ Module ]
raid5 ...... [ Module ]
raid6 ...... [ Module ]
raid10 ...... [ Module ]
multipath ...... [ Module ]
=================================
[root@mail ~]#
下面是 Redhat 9 上的输出:
[root@monitor root]# ./check_md.sh
Current Kernel
: 2.4.20-8smp
=================================
linear
...... [ Module ]
raid0
...... [ Module ]
raid1
...... [ Module ]
raid5
...... [ Module ]
raid6 ...... [ NOT Support ]
raid10 ...... [ NOT Support ]
multipath
...... [ Module ]
=================================
[root@monitor root]#
1、
如何让 Software-RAID 在系统引导时自动激活
a)
RAID-Support 是 Built-in 方式
b)
建立分区时用 fdisk 的 t 命令把分区的 partition
ID 改为 0xFD(Linux raid autodetect)
c)
建立 Software-RAID 时必须设置
persistent-superblock 参数值为 1
d)
这三个方面缺一不可,条件1是最基本的,条件2是让系统在引导时能够自己搜索所有 software-RAID 设备,而
Persistent-superblock 则是用于组合各个 software-RAID,所以从依赖关系上讲,每个条件都是建立在前一个条件的基础上的。
2、
内核的相关参数
a)
raid=noautodetect
b)
raid=partitionable
c)
md_mod.start_ro=1
d)
md_mod.start_dirty_degraded=1
e)
/proc/sys/dev/raid/speed_limit_min
f)
/proc/sys/dev/raid/speed_limit_max