块IO子系统上承文件系统,下启SCSI等具体的存储设备子系统,对下层的诸多设备进行统一的抽象,以向上提供统一的块存储视图,同时,也使得deviceMapper,RAID等模块的设计变得容易。在内核IO路径中,块IO子系统到交通枢纽的作用,其在内核中的相对位置如下
对上,Block子系统位于文件系统层的下方,通过bdev伪文件系统管理系统中的所有磁盘抽象,使得其他文件系统等访问接口可以找到一个磁盘的抽象
对下,为具体的存储设备提供通用的服务,包括磁盘和分区抽象、IO请求优化、重映射等。
就块设备本身来说,可以分为三层
- 通用块层位于最上,对存储设备的设备和分区进行文件系统可用的抽象
- IO调度层位于中间,负责对上层下发的IO的合并优化等工作,提供NOOP,CFQ,DeadLine,Anticipatory 4种IO调度器
- 块设备驱动层,将通用块设备作为操作对象的”驱动”,MultiDisk子系统就是工作在这一层。
在内核源码中,块IO子系统的文件主要分布在block/目录下,相关文件的简介如下:
file | description |
---|---|
include/linux/genhd.h | 通用块层,封装了gendisk、hd_struct等对象,对所有的设备进行统一的抽象,io下发必须经过这一层,在设备初始化的时候被构造进内核 |
block/genhd.c | register_blkdev |
include/linux/blk_types.h | bio定义和相关宏 |
include/linux/blkdev.h | request、request_queue及其在block设备上的操作方法 |
block/blk-core.c | blkdev.h ->blk-core.c |
include/linux/fs.h | inode,file,super_block,file_operations以及block_device的定义 |
fs/block_dev.c | 块设备和文件系统的接口部分,eg,bdev文件系统 |
block/partition-generic.c | 分区partition的相关操作 |
block/blk-merge.c | 和include/linux/elevator.h block/elevator.c一同构成了通用块层到块核心层的边界 |
blk-sysfs.c | 封装了块设备在sysfs中输出的信息 |
blk-setting.c | 封装了对块设备进行设置(队列深度,DMA地址)的方法 |
block/bio.h、block/bio.c | bio操作函数 |
include/linux/blk-mq.h、block/blk-mq.c | 与MultiDisk子系统相关的操作 |
block/blk-lib.c | 封装了一下helper类的函数 |
block/blk-flush.c | 封装了下刷request相关函数 |