device mapper驱动

dm(device mapper)驱动实际做的一件事就是将多个设备映射成一个块设备显示

在上层,LVM和multipath等工具都是基于这个驱动,将多个设备虚拟成一个设备

的。

dm驱动位于linux/driver/md/目录下
由dm.c dm-target.c dm-tabel.c dm-ioctl.c dm-io.c等几个文件组成框架。

因为它对上层显示的是一个虚拟的块设备,所以会接收到来自通用block层的bio

,dm框架将该bio转发给dm-multipath.c等target driver(负责向具体的设备发

送bio),从而实现从虚拟设备到具体设备的映射。

dm框架的出现相当于在通用block层(发出bio)和Io Schedule层(将接收的bio

组装成request并将request按照调度算法发给下层)插入了一个中间层,完成对

bio的复制和分发。

dm驱动对上层显示为一个块设备,实质上它是由几个target 设备组成的,因此当

上层向一个dm驱动的块设备发bio时,dm驱动将该bio转发给target driver,

target driver复制出多个bio发给它负责对应的target,target返回结果后,

target driver再将结果合并,返回给dm,dm再返回给上层。

dm驱动对上层有两个接口:

用户程序使用ioctl接口:LVM,multipath等用户态工具都是通过ioctl接口来向

dm驱动发命令创建相应的dm设备的,关键代码定义在dm-target.c中的

lookup_ioctl函数

用户使用接口:由dm驱动虚拟的设备会在/dev/目录下显示dm-0,1,2等设备,lvm

,multipath等程序通过该接口来使用dm虚拟块设备。

因为dm对上层是一个虚拟的块设备,所以要申请gendisk结构并且有一个磁盘的请

求队列
磁盘操作:
md->disk->fops = &dm_blk_dops;

queue的各种回调函数:
md->queue->backing_dev_info.congested_fn = dm_any_congested;

将bio转化为request
md->queue->make_request_fn = dm_request

合并bio到一个request
md->queue->merge_bvec_fn = dm_merge_bvec

处理request之前的准备工作
md->queue->prep_rq_fn = dm_prep_fn

处理queue中的request
md->queue->request_fn = dm_request_fn

md->queue->lld_busy_fn = dm_lld_busy

request处理完成时的回调函数
md->queue->softirq_done_fn = dm_softirq_done


1.驱动可以使用自己定义的bio转化函数,未定义的话,通用block层提供了将bio

转化为request的函数:blk_queue_bio
定义方式:
blk_queue_make_request(md->queue, dm_request);
 实际操作:
 md->queue->make_request_fn = dm_request
struct request_queue *
blk_init_allocated_queue(struct request_queue *q, request_fn_proc *rfn,
    spinlock_t *lock)
{
 ...
 /*
  * This also sets hw/phys segments, boundary and size
  */
 blk_queue_make_request(q, blk_queue_bio);
 ...
}

2.驱动可以定义request准备函数,该函数会在request从队列取出时执行,如果

未定义,则不执行直接取出request。
定义方式:
blk_queue_prep_rq(md->queue, dm_prep_fn);
 实际操作:
 md->queue->prep_rq_fn = dm_prep_fn

3.驱动定义request处理方式
定义方式:
q = blk_init_allocated_queue(md->queue, dm_request_fn, NULL);
 实际操作:
 md->queue->request_fn = dm_request_fn


使用DM驱动前提:

想要同DM驱动沟通,用户空间首先要安装device-mapper-libs-1.02.77-9.el6.x86_64,这个包里包含的库文件提供同DM驱动的ioctl接口交互的接口。

multipath用户空间的库文件包含在device-mapper-multipath-libs-0.4.9-64.el6.x86_64中。


multipath的命令:

device-mapper-multipath包含两个命令:multipath和multipathd,它们运行时都需要device-mapper-multipath-libs库的支持。

1.multipath命令主要作用是根据/etc/multipath.conf的设定收集multipath设备的信息,比如mpatha由那几个磁盘构成(即包含几条路径),

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值