Linux系统内核中的Device Mapper机制 (1)(3)
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请求从逻辑设备mapped device转发相应的target device上。Device mapper处理所有从内核中块一级IO子系统的generic_make_request和submit_bio接口,定向到mapped device的所有块读写IO请求。IO请求在device mapper的设备树中通过请求转发从上到下地进行处理。当一个bio请求在设备树中的mapped deivce向下层转发时,一个或者多个bio的克隆被创建并发送给下层target device。然后相同的过程在设备树的每一个层次上重复,只要设备树足够大理论上这种转发过程可以无限进行下去。在设备树上某个层次中,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上对应的target driver上进行处理,根据target driver中定义的IO处理规则进行IO请求的过滤等处理,然后再提交给target device完成。上述过程在dm.c文件中的dm_request函数中完成。Target driver可以对这些bio做如下处理:
1、 将这些bio在本驱动内部排队等待以后进行处理;
2、 将bio重新定向到一个或多个target device上或者每个target device上的不同扇区;
3、 向device mapper返回error 状态。
IO请求就按照上文中描述的过程在图2中所示的设备树中逐层进行处理,直到IO请求结束。
小结
Device mapper在内核中向外提供了一个从逻辑设备到物理设备的映射架构,只要用户在用户空间制定好映射策略,按照自己的需要编写处理具体IO请求的target driver插件,就可以很方便的实现一个类似LVM的逻辑卷管理器。Device mapper以ioctl的方式向外提供接口,用户通过用户空间的device mapper库,向device mapper的字符设备发送ioctl命令,完成向内的通信。它还通过ioctl提供向往的事件通知机制,允许target driver将IO相关的某些事件传送到用户空间。
以上就是Linux系统内核中的Device Mapper机制 (1)(3)的内容,更多相关内容请关注PHP中文网(www.php.cn)!
推荐阅读
-
详解Linux系统中的内核抢占机制
-
Linux系统中的知名内核线程(1)ksoftirqd和events
-
详解Linux系统中的内核抢占机制
-
Linux系统内核中的Device Mapper机制 (1)(5)
-
Linux系统内核中的Device Mapper机制 (1)(4)
-
Linux系统内核中的Device Mapper机制 (1)(3)
-
Linux系统内核中的Device Mapper机制 (1)(2)
-
Linux系统内核中的Device Mapper机制 (1)(3)
-
Linux系统内核中的Device Mapper机制 (1)(2)
-
Linux系统内核中的Device Mapper机制 (1)(4)