- 论坛徽章:
- 0
|
什么是Device Mapper
Device mapper 是 Linux 2.6
内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,如条带化,镜像,快照
等. 当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2
version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper
Raid Tool)等都是基于该机制实现的. 只要用户在用户空间制定好映射策略,按照自己的需要编写处理具体IO请求的 target
driver插件,就可以很方便的实现这些特性.
Device Mapper的结构
Device Mapper主要包含内核空间的映射和用户空间的device mapper库及dmsetup工具.
内核部分
Device mapper 在内核中作为一个块设备驱动被注册的,它包含三个重要的对象概念,mapped
device、映射表、target device。Mapped device
是一个逻辑抽象,可以理解成为内核向外提供的逻辑设备,它通过映射表描述的映射关系和 target device 建立映射。从 Mapped
device 到一个 target device 的映射表由一个多元组表示,该多元组由表示 mapped device
逻辑的起始地址、范围、和表示在 target device 所在物理设备的地址偏移量以及target
类型等变量组成(这些地址和偏移量都是以磁盘的扇区为单位的,即 512 个字节大小)。Target device 表示的是 mapped
device 所映射的物理空间段,对 mapped device 所表示的逻辑设备来说,就是该逻辑设备映射到的一个物理设备。Device
mapper 中这三个对象和 target driver
插件一起构成了一个可迭代的设备树。在该树型结构中的顶层根节点是最终作为逻辑设备向外提供的 mapped device,叶子节点是 target
device 所表示的底层物理设备。最小的设备树由单个 mapped device 和 target device 组成。每个 target
device 都是被mapped device 独占的,只能被一个 mapped device 使用。一个 mapped device
可以映射到一个或者多个 target device 上,而一个 mapped device 又可以作为它上层 mapped device的
target device 被使用,该层次在理论上可以在 device mapper 架构下无限迭代下去。
内核同用户空间的交互
Device mapper以ioctl的方式向外提供接口,用户通过用户空间的device mapper库,向device
mapper的字符设备发送ioctl命令,完成向内的通信。它还通过ioctl提供向往的事件通知机制,允许target
driver将IO相关的某些事件传送到用户空间.
用户空间部分
Device mapper在用户空间相对简单,主要包括device mapper库和dmsetup工具。Device
mapper库就是对ioctl、用户空间创建删除device
mapper逻辑设备所需必要操作的封装,dmsetup是一个提供给用户直接可用的创建删除device
mapper设备的命令行工具。用户空间主要负责如下工作: 1、发现每个mapped device相关的target device;
2、根据配置信息创建映射表; 3、将用户空间构建好的映射表传入内核,让内核构建该mapped device对应的dm_table结构;
4、保存当前的映射信息,以便未来重新构建。
以下我们主要通过实例来说明dmsetup的使用,同时进一步说明device mapper这种映射机制。用户空间中最主要的工作就是构建并保存映射表,下面给出一些映射表的例子:
1) 0 1024 linear /dev/sda 204 1024 512 linear /dev/sdb 766 1536 128 linear /dev/sdc 0
2) 0 2048 striped 2 64 /dev/sda 1024 /dev/sdb 0
3) 0 4711 mirror core 2 64 nosync 2 /dev/sda 2048 /dev/sdb 1024
例子1中将逻辑设备0~1023扇区、1024~1535扇区以及1536~1663三个地址范围分别以线形映射的方式映射到/dev/sda设备第204号扇区、/dev/sdb设备第766号扇区和/dev/sdc设备的第0号扇区开始的区域。
例子2中将逻辑设备从0号扇区开始的,长度为2048个扇区的段以条带的方式映射的到/dev/sda设备的第1024号扇区以及/dev/sdb
设备的第0号扇区开始的区域。同时告诉内核这个条带类型的target
driver存在2个条带设备与逻辑设备做映射,并且条带的大小是64个扇区,使得驱动可以该值来拆分跨设备的IO请求。
例子3中将逻辑设备从0号扇区开始的,长度为4711个扇区的段以镜像的方式映射到/dev/sda设备的第2048个扇区以及/dev/sdb设备的第1024号扇区开始的区域。
映射表确定后,创建、删除逻辑设备的操作就相对简单,通过dmsetup如下命令就可以完成相应的操作。
dmsetup create 设备名 映射表文件 /* 根据指定的映射表创建一个逻辑设备 */
dmsetup reload 设备名 映射表文件 /* 为指定设备从磁盘中读取映射文件,重新构建映射关系 */
dmsetup remove 设备名 /* 删除指定的逻辑设备 */
当用户空间根据映射表下达创建逻辑设备命令后,device mapper在内核中就根据传入的参数和映射关系建立逻辑地址到物理地址的映射关系。
Device
mapper的用户空间部分对开发者要实现自己的存储管理工具来说是可选的,事实上,很多我们常见的逻辑卷管理器,比如LVM2、dmraid等工具都利
用device mapper的提供的device
mapper用户空间库,根据自己的管理需求建立独立的一套管理工具,而并没有使用它提供的dmsetup工具,甚至IBM的开源项目企业级的逻辑卷管理
系统-EVMS,在实现中都没有采用device mapper的用户空间库,完全根据内核中的ioctl定义实现了一套自己的函数库。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/92327/showart_2075478.html |
|