device mapper读书笔记

Device Mapper,是linux 2.6内核中提供的一种从逻辑设备到物理设备的映射框架机制,在内核中被作为块设备驱动注册,它可以将多个不同物理设备上的部分空间映射成一个地址空间连续的逻辑设备,也就是mapped device,它是内核对外提供的一种逻辑抽象,而映射的物理设备则称为target device。

它通过模块化的target driver插件实现IO请求的过滤和重定向。本质上,就是将发往逻辑设备的IO请求转发到target device,也就是映射到的多个物理设备。

DM是作为内核驱动实现的,它提供了一种架构。包括3个重要概念:mapped device、映射表和target device。其中,md是内核对外的抽象接口,表现为逻辑设备。它通过映射表建立与target device的映射关系,从md到target device的映射关系由多元组表示,该多元组由表示该target device所映射的md的逻辑起始地址和范围、target device对应物理设备的地址偏移量及target类型表示。target device就是md的每个扇区对应的物理设备,表示的是md映射到的物理空间段。这三个元素和target driver一起构成了一棵迭代树,树根是md,可对应多个target device,其中每个target device又可是对应一个md。可无限循环。

下面,我们来看下dm的具体实现。它的代码包括了两部分,一部分是实现了内核基本映射架构的代码,另一部分是target driver,负责具体的io处理。dm.c中的mapped_device结构用来表示mapped device,主要包括相关的锁、一些IO用到的内存池,以及指向它所对应映射表的指针。映射表由dm_table.c中的dm_table表示,包含有一个dm_target数组,每个dm_target代表了md映射到的物理设备,揭示了由md到某一target device的映射关系,如target device所映射到的md的逻辑地址和范围等;dm_target以B树的形式被组织起来,方便IO请求的查找。dm_target结构还包含了指向操作类型target_type的指针,实现了target_device的创建、删除、io的映射及完成函数等。dm_target的private域指向真实的物理设备,也就是target_device结构。

在内核中的创建过程:

1)接收由用户ioctl接口传送的参数,初始化mapped_device结构,并申请必要的资源;

      调用内核blk_queue_make_request函数实现dm的请求队列在dm_request,向内核注册md块设备驱动;

2)调用dm_insert_hash将此md插入md的全局哈希表中

3)接收由用户ioctl接口传送的参数,初始化dm_table和dm_target结构。根据target类型,调用对应的ctl函数创建target device对应结构,再根据建立的dm_target结构更新                   dm_table维护的B树。上述步骤完成后,现将dm_table插入md对就的全局哈希表中的hash_cell中

4) 建立md与dm_table之间的绑定关系


BIO的转发:

md接收系统块一级子系统generic_make_request和submit_bio发送到逻辑设备的BIO,DM根据逻辑设备的块大小设备dm_target中的split_bio字段,并根据此值将bio拆分成与逻辑设备块大小一样的bio,再转发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值