1. 简介
RAID技术是利用多个块设备来模拟一个单个的块设备。Linux内核在多个块设备的基础上,注册了一个特殊的块设备,称为Multi-Disk(MD)设备,这个MD设备形成了一个逻辑层,支持不同级别的RAID技术。
2.分层架构
Linux内核中RAID功能的实现属于MD模块。MD模块是一个虚拟块设备层,它属于块I/O子系统中的块设备驱动层,架构于物理块设备层,比如SCSI磁盘驱动之上。MD模块分为两层:
• RAID共性层:也被称为RAID公共层,它提取各种级别的RAID的公共特性,依照块设备的实现模板向上层注册,同时向RAID个性层提供公共函数,以及接口注册函数;
• RAID个性层:是各种级别RAID的个性体现,它向RAID公共层注册个性接口,利用RAID公共层提供的公共函数,基于低层实现个性化功能。RAID个性以独立模块的形式实现,可以动态加载。
3.RAID模块对象
核心MD设备结构mddev_t及其成员磁盘设备结构mdk_rdev_t是系统中的两个关键结构。核心MD设备结构mddev_t是内核中RAID设备保存自身信息的结构体,它包括了完整的RAID设备的信息。成员磁盘设备结构mdk_rdev_t反映了组成MD设备的底层块设备的信息。两个结构相互关联。
MD设备通过块设备号和块设备描述符(block_device)关联起来,低层成员磁盘也指向和它相对应的块设备描述符,正是以块设备描述符为“纽带”,使得MD可以构建在其他的物理或虚拟磁盘设备之上,成为一个“栈式”块设备。
4. 初始化
MD模块加载时,它的初始化函数md_init将被执行,md_init的代码如程序6-1所示。 函数md_init()代码(文件drivers/md/md.c)。所有块设备模块初始化时,都应该调用这个register_blkdev函数。例如对于SCSI磁盘模块,对应的代码在其初始化函数(init_sd)中。
注册的节点结构md_notifier中,给出了节点优先级,以及一个回调函数。由于MD设备需要在底层磁盘之前停止,因此优先级数值设置得较大(为INT_MAX)。回调函数md_notify_reboot的实现也在文件drivers/md/md.c中,它仅仅是遍历所有的MD设备,停止之。接下来,调用register_sysctl_table注册MD模块的系统控制表,主要用于设置用于控制同步速度的内核参数。然后,调用md_geninit创建/proc/mdstat,关于MD设备的状态都是通过这个proc项来输出的。、
5.设备创建
在加载MD模块后,用户可以通过管理工具创建MD设备。实际上,管理工具内部执行的是open和ioctl系统调用。
用户在mdadm命令行中给定RAID设备名。标准的设备名格式为/dev/md#或/dev/mdp#,其中#代表一个数值。mdadm根据设备名md或mdp可以解析出主设备编号,以#作为次设备编号。之后调用mknod创建具有上述设备编号的块设备文件/dev/md#或/dev/mdp#。
6.参考书目
《存储技术原理分析》