Linux内核中的DeviceMapper机制

上传人:平*** 文档编号:15579477 上传时间:2017-11-05 格式:DOCX 页数:9 大小:107.53KB
返回 下载 相关 举报
Linux内核中的DeviceMapper机制_第1页
第1页 / 共9页
Linux内核中的DeviceMapper机制_第2页
第2页 / 共9页
Linux内核中的DeviceMapper机制_第3页
第3页 / 共9页
Linux内核中的DeviceMapper机制_第4页
第4页 / 共9页
Linux内核中的DeviceMapper机制_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《Linux内核中的DeviceMapper机制》由会员分享,可在线阅读,更多相关《Linux内核中的DeviceMapper机制(9页珍藏版)》请在金锄头文库上搜索。

1、Linux 内核中的 Device Mapper 机制尹 洋, 在读博士生简介: 本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Rai

2、d Tool)等都是基于该机制实现的。理解该机制是进一步分析、理解这些卷管理器的实现及设计的基础。通过本文也可以进一步理解 Linux 系统块一级 IO 的设计和实现。发布日期: 2006 年 6 月 29 日 级别: 初级 访问情况 : 13591 次浏览 评论: 0 (查看 | 添加评论 - 登录)平均分 (45 个评分)为本文评分Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1。图 1 Device Mapper 的内核体系架构在内核中它通过一个一个模块化的 target

3、 driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath 表示的就是这些 target driver。 Device mapper 进一步体现了在 Linux 内核设计中策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。Device mapper 用户空间相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等等,而

4、具体过滤和重定向 IO 请求的工作由内核中相关代码完成。因此整个 device mapper 机制由两部分组成-内核空间的 device mapper 驱动、用户空间的 device mapper 库以及它提供的 dmsetup 工具。在下文中,我们分内核和用户空间两部分进行介绍。内核部分Device mapper 的内核相关代码已经作为 Linux 2.6 内核发布版的一部分集成到内核源码中了,相关代码在内核源码的 driver/md/ 目录中,其代码文件可以划分为实现 device mapper 内核中基本架构的文件和实现具体映射工作的 target driver 插件文件两部分。文章下面

5、的分析结果主要是基于上述源码文件得到的。重要概念Device mapper 在内核中作为一个块设备驱动被注册的,它包含三个重要的对象概念,mapped device、映射表、target device。Mapped device 是一个逻辑抽象,可以理解成为内核向外提供的逻辑设备,它通过映射表描述的映射关系和 target device 建立映射。从 Mapped device 到一个 target device 的映射表由一个多元组表示,该多元组由表示 mapped device 逻辑的起始地址、范围、和表示在 target device 所在物理设备的地址偏移量以及 target 类型等变

6、量组成(这些地址和偏移量都是以磁盘的扇区为单位的,即 512 个字节大小)。Target device 表示的是 mapped device 所映射的物理空间段,对 mapped device 所表示的逻辑设备来说,就是该逻辑设备映射到的一个物理设备。Device mapper 中这三个对象和 target driver 插件一起构成了一个可迭代的设备树。在该树型结构中的顶层根节点是最终作为逻辑设备向外提供的 mapped device,叶子节点是 target device 所表示的底层物理设备。最小的设备树由单个 mapped device 和 target device 组成。每个 ta

7、rget device 都是被 mapped device 独占的,只能被一个 mapped device 使用。一个 mapped device 可以映射到一个或者多个 target device 上,而一个 mapped device 又可以作为它上层 mapped device 的 target device 被使用,该层次在理论上可以在 device mapper 架构下无限迭代下去。图 2 Device mapper 内核中各对象的层次关系在图 2 中我们可以看到 mapped device1 通过映射表和 a、b、c 三个 target device 建立了映射关系,而 targe

8、t device a 又是通过 mapped device 2 演化过来,mapped device 2 通过映射表和 target device d 建立映射关系。我们进一步看一下上述三个对象在代码中的具体实现,dm.c 文件定义的 mapped_device 结构用于表示 mapped device,它主要包括该 mapped device 相关的锁,注册的请求队列和一些内存池以及指向它所对应映射表的指针等域。Mapped device 对应的映射表是由 dm_table.c 文件中定义的 dm_table 结构表示的,该结构中包含一个 dm_target 结构数组,dm_target 结

9、构具体描述了 mapped_device 到它某个 target device 的映射关系。而在 dm_table 结构中将这些 dm_target 按照 B 树的方式组织起来方便 IO 请求映射时的查找操作。Dm_target 结构具体记录该结构对应 target device 所映射的 mapped device 逻辑区域的开始地址和范围,同时还包含指向具体 target device 相关操作的 target_type 结构的指针。 Target_type 结构主要包含了 target device 对应的 target driver 插件的名字、定义的构建和删除该类型 target d

10、evice 的方法、该类 target device 对应的 IO 请求重映射和结束 IO 的方法等。而表示具体的 target device 的域是 dm_target 中的 private 域,该指针指向 mapped device 所映射的具体 target device 对应的结构。表示target device 的具体结构由于不同的 target 类型而不同,比如最简单的线性映射 target 类型对应 target device 的结构是 dm-linear.c 文件中定义的 linear_c 结构。其定义如下:struct linear_c struct dm_dev *dev;

11、sector_t start;该 target device 的定义相当简单,就只包括了表示对应物理设备的 dm_dev 结构指针和在该物理设备中以扇区为单位的偏移地址 start。上述几个数据结构关系如图 3 所示:图 3 device mapper 中几个重要数据结构的关系内核中建立过程在下面我们结合具体的代码简要介绍下在内核中创建一个 mapped device 的过程:1、 根据内核向用户空间提供的 ioctl 接口传来的参数,用 dm-ioctl.c 文件中的dev_create 函数创建相应的 mapped device 结构。这个过程很简单,主要是向内核申请必要的内存资源,包括

12、mapped device 和为进行 IO 操作预申请的内存池,通过内核提供的blk_queue_make_request 函数注册该 mapped device 对应的请求队列 dm_request。并将该 mapped device 作为磁盘块设备注册到内核中。2、 调用 dm_hash_insert 将创建好的 mapped device 插入到 device mapper 中的一个全局 hash 表中,该表中保存了内核中当前创建的所有 mapped device。3、 用户空间命令通过 ioctl 调用 table_load 函数,该函数根据用户空间传来的参数构建指定 mapped d

13、evice 的映射表和所映射的 target device。该函数先构建相应的dm_table、dm_target 结构,再调用 dm-table.c 中的 dm_table_add_target 函数根据用户传入的参数初始化这些结构,并且根据参数所指定的 target 类型,调用相应的 target 类型的构建函数 ctr 在内存中构建 target device 对应的结构,然后再根据所建立的 dm_target结构更新 dm_table 中维护的 B 树。上述过程完毕后,再将建立好的 dm_table 添加到mapped device 的全局 hash 表对应的 hash_cell 结构

14、中。4、 最后通过 ioctl 调用 do_resume 函数建立 mapped device 和映射表之间的绑定关系,事实上该过程就是通过 dm_swap_table 函数将当前 dm_table 结构指针值赋予mapped_device 相应的 map 域中,然后再修改 mapped_device 表示当前状态的域。通过上述的 4 个主要步骤,device mapper 在内核中就建立一个可以提供给用户使用的mapped device 逻辑块设备。IO 流Device mapper 本质功能就是根据映射关系和 target driver 描述的 IO 处理规则,将 IO 请求从逻辑设备 m

15、apped device 转发相应的 target device 上。Device mapper 处理所有从内核中块一级 IO 子系统的 generic_make_request 和 submit_bio 接口两个接口具体的描述可以查看参考文献1 和2 ,这两本书对内核中的块 IO 层有比较详尽的讲解。 中定向到mapped device 的所有块读写 IO 请求。IO 请求在 device mapper 的设备树中通过请求转发从上到下地进行处理。当一个 bio 请求在设备树中的 mapped deivce 向下层转发时,一个或者多个 bio 的克隆被创建并发送给下层 target devic

16、e。然后相同的过程在设备树的每一个层次上重复,只要设备树足够大理论上这种转发过程可以无限进行下去。在设备树上某个层次中,target driver 结束某个 bio 请求后,将表示结束该 bio 请求的事件上报给它上层的 mapped device,该过程在各个层次上进行直到该事件最终上传到根 mapped device的为止,然后 device mapper 结束根 mapped device 上原始 bio 请求,结束整个 IO 请求过程。Bio 在 device mapper 的设备树进行逐层的转发时,最终转发到一个或多个叶子 target 节点终止。因为一个 bio 请求不可以跨多个 target device(亦即物理空间段) , 因此在每一个层次上,device mapper 根据用户预先告知的 mapped device 的 target 映射信息克隆一个或者多个 bio,将 bio 进行拆分后转发到对应的 target device 上。这些克隆的 bio 先交给mapped device 上

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号