本篇文章介绍嵌入式平台linux系统中raid0如何使用,并了解raid0磁盘阵列的工作原理,在后面文章中介绍pcie+switch存储方案raid0阵列的实现。在linux系统中raid0配置使用的mdadm命令,在嵌入式平台中,mdadm命令一般默认是没有的,需要手动安装mdadm命令。本次编写块设备驱动用两片内存模拟磁盘做raid0,在块设备中提供读写内存接口,打印内存接口,方便跟踪mdadm命令工作原理。

安装mdadm命令

  1. 下载mdadm.tar.gz
  2. tar –xzvf mdadm.tar.gz
  3. make  CROSS_COMPILE=arm-linux-gnueabihf- 这里指定自己平台的编译器,如果编译中报错,修改Makefile,去掉CWFLAGS中的-Werror,再次编译就可以通过。
  4. 将当前目录的mdadm命令拷贝到嵌入式平台中

块设备驱动程序编写是比较简单的,这里我仅贴代码,就不讲解具体的代码。

驱动初始化函数,提供了块设备驱动初始化和注册,分配了一块4MB大小的内存,用于模拟磁盘,具体代码如下所示。

linux bios raid设置 linux raid0_mdadm命令安装

      驱动初始化函数中提供了file_operations接口和request_queue块设备请求队列, request_queue用于文件系统与磁盘之间的数据交互,交互最小单元为一个bio结构,最常见的一次数据交互大小为4KB,请求队列函数如下所示。

linux bios raid设置 linux raid0_linux  raid0_02

  •         块设备请求队列函数中,添加了打印信息,方便查看本次bio请求读写的扇区位置和扇区的个数,通过判断bio结构的读写实现bio缓存到内存的拷贝或内存到bio缓存的拷贝,ramblock_buf这个就是用内存模拟的磁盘,大小为4MB,在file_operations结构的read函数中,程序会读取这个内存的数据,方便跟踪两块磁盘中数据的分布,file_operations结构代码如下所示。

linux bios raid设置 linux raid0_raid0介绍_03

        在read函数中,将拷贝ramblock_buf这块内存的数据到应用程序,拷贝多大通过上位机调用read函数是传入参数。应用程序将读两个驱动程序的内存数据,同时创建递增数文件,递增数文件方便对比两片内存的关联性。

递增数文件创建函数如下所示。

linux bios raid设置 linux raid0_mdadm命令安装_04

        应用程序主程序会读取内存数据,并且将数据写入到data0或者data1文件中,具体代码如下所示。

linux bios raid设置 linux raid0_linux  raid0_05

        代码准备工作已经完成,开始上板实测效果,需要先配置内核支持raid0,具体配置如下。

linux bios raid设置 linux raid0_raid0介绍_06

        在开发板中手动加载驱动程序,同时执行mdadm命令,本次chunk大小为64KB,具体操作如下所示。

linux bios raid设置 linux raid0_raid0阵列_07

        mdadm --query /dev/md0和./mdadm --detail /dev/md0命令用于查询raid0设备信息,通过查询设备信息可以确定raid0制作完成,下面开始格式化文件系统,挂载文件系统,拷贝递增数据到挂载目录,并且执行应用程序,将读取的两个内存数据分别通过tftp命令拷贝到windos。

linux bios raid设置 linux raid0_raid0介绍_08

        通过compare比较data0和data1文件,发现生成的数据文件规律为一边拷贝64k的数据,这也正是raid0的基本原理,比较数据如下所示。

linux bios raid设置 linux raid0_mdadm命令安装_09

        左右红框的内的数据,上下一行的差值都是0x4000=16KB,但是数据时32字节对齐的,所以数据的总数为16Kb*4=64KB,跟mdadm创建时指定的chunk参数一致,左右红框中,右边的结尾刚好是左边红框的开始,这也说明数据时左右以64KB大小在切换。本篇文章讲解了linux系统中raid0的使用方法,也给出了详细测试说明,后面文章分析pcie-switch价格raid0阵列方案设计。

所有命令如下:

insmod ram_drv0.ko
insmod ram_drv1.ko
./mdadm -Cv /dev/md0 --chunk=64 -l0 -n2 /dev/ramblock0 /dev/ramblock1
./mdadm --query /dev/md0
./mdadm --detail /dev/md0
mkfs.ext4 /dev/md0
mount /dev/md0 /tmp/
cp increase.data /tmp/
./test_raid0 0 0 8192
tftp -p -l data0 10.10.10.66
./test_raid0 1 0 8192
tftp -p -l data1 10.10.10.66