二、预习

在我们进去device mapper的dm dedup学习之前,我们先要预习一下,什么是device mapper,和为什么device mapper能够做块重删。

1、device mapper
照旧,我们先看一下维基百科对它的介绍。
The device mapper is a framework provided by the Linux kernel for mapping physical block devices onto higher-level virtual block devices. It forms the foundation of the logical volume manager (LVM), software RAIDs and dm-crypt disk encryption, and offers additional features such as file system snapshots.
注1:这一段的意思就是说device mapper是我们linux系统中非常重要的LVM和软RAID还有加密、快照等特性的实现。

Device mapper works by passing data from a virtual block device, which is provided by the device mapper itself, to another block device. Data can be also modified in transition, which is performed, for example, in the case of device mapper providing disk encryption or simulation of unreliable hardware behavior.
注2:这一段的意思是说device mapper使用虚拟设备(dm-n)来提供与其他虚拟或者真实的块设备的数据传送,当然数据能够在其中改变(比如raid会增加冗余信息),也可以不改变(比如linear就是透传),或者就是更厉害的功能,加密等吧,可见这个device mapper一定可以是个常青树,什么和存储有关系的都可以用它实现。

我们大致了解的device mapper,我们还需要了解一下device mapper在linux I/O stack中的位置吧;
还是那个老图,我们尽量看看,顺便把其他的模块也讲解一下;

鉴于篇幅有限,我们就从上往下讲,因为本人从事linux I/O stack的研究已经有5年的时间,大概每个位置都是玩过的,但并非每个module都是专家,并且kernel I/O stack里面的存储的知识都非常的深,所以要入坑存储的同行的请三思啊。
ok,废话不多说,我们从最上层开始讲,这里只是概要性的分析,不涉及特别深。

我把图截成上下两半,以block layer为分层。上面应该就是大概非常熟悉的三大块,LIO、虚拟块设备、VFS虚拟文件系统。
1、LIO(linux io target)
做传统SAN存储和分布式块存储的同学应该对LIO比较熟悉吧,至少都是听过的,早些年我们做iscsi或者fc存储的时候,那时候我们大多数用IET和SCST,后来随着linux kernel对LIO的逐步完善,目前LIO可以支持非常多种类的fabric和backcore。
fabric:tcm_fc(我觉得可能是用于emulex的光纤卡),iscsi_target_mod(是对接linux kernel网络协议栈)、tcm_qla2xxx(对接qlogic的光纤卡)、sbp_target(IEEE 1394),tcm_usb_target(做usb移动硬盘可以用上)等等吧,其中iscsi_target_mod可以被赋予infiniband的支持,会成为一个新的target为iser。
backcore:backcore简单来讲就是虚拟scsi lun的mod,它能够解析和仿真几乎常见的所有标准SCSI命令,让它看起来和SCSI DISK内的LUN一样。LIO能够提供几种backcore,core_file(通常是文件系统的某个文件,或者直接是将块设备作为文件导出),core_iblock(能够将linux块设备导出),pscsi(能够直接导出,比如直接导出/dev/sdb等)。
2、vfs(虚拟文件系统)
微微一笑,这里我不太懂,属于瞎写。
文件系统在linux中占有举足轻重的作用,他可能是用户和开发者最便捷能够访问资源的方式。
linux为用户开发了很多可操作的文件系统。大致有以下几种:
block-based fs:这类文件系统通常后端设备是一个或多个块设备,它们的实体是一个能够组织数据的表结构,通过查表(metadata)来实现文件描述符到块的映射访问,这能非常有效的进行我们日常所有的大部分工作和生活需求。我们比较常用的是ext2/3/4,xfs和btrfs等等。
Network fs:网络文件系统,他们的诞生是要去解决,block-based文件不能够有效共享文件而产生的。他们从本质上讲都是分布式的,因为文件可能被多个client使用,这种文件系统通常需要非常复杂的分布式协议作为支持,如我们最开始接触的NFS,从windows兼容的smb2fs,还有目前非常流行的ceph,目前来看ceph并非和它的前辈一样只能够作为NAS的导出协议,它能够提供新兴的存储接口对象存储和高效的块存储。
psedudo fs:伪文件系统。大家应该都会对/dev/sda这种块设备直接进行过dd等操作,从vfs来看,/dev/sda这种bdev也是一种伪文件系统,包括我们更加数据的/proc、/sys、/configfs等开发者经常用来变成使用的接口,他们的注册和使用都非常简单,能够高效的帮助我们完成各种系统功能的配置和查看。
special psedudo fs:这类特别伪文件系统,是非常重要的,我们经常会把/tmp和/var挂载为tmpfs,用来加速不需要持久化的信息,来提供运行速度。

大致说完了上面的两个LIO和vfs后,我们就需要来讲讲top block device,也就是可能被导出的block decive,在linux中,被LIO和VFS使用,等价于被mount,即使独占模式,保护块设备的访问安全。
top block device:也就是虚拟块设备,这个在linux 里主要就是咱们经常用的LVM drbd md-raid bcache和device mapper,它们就是在/drivers/md/下面,他们就是真正承上启下的块虚拟化模块,每个模块都是比较有意思。这些内容会在后续的文章中一一讲解。

【本文由51cto博客作者 “底层存储技术” https://blog.51cto.com/12580077 个人创作,公众号:存储之谷】,如需转载,请于本人联系,谢谢。

转载于:https://blog.51cto.com/12580077/2310233

linux I/O 栈 预习(上)相关推荐

  1. Linux内核--网络栈实现分析(三)--驱动程序层+链路层(上)

    本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址 ...

  2. 显示驱动包含在Linux内核层,驱动程序层(上) - Linux内核--网络栈实现分析_Linux编程_Linux公社-Linux系统门户网站...

    经过前面两篇博文的分析,已经对Linux的内核网络栈的结构有了一个模糊的认识,这里我们开始从底层开始详细分析Linux内核网络栈的实现.由于这是早期版本,代码的层次隔离做的还不是很好,这里说是从底层分 ...

  3. Linux内存技术分析(上)

    Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...

  4. Linux内核--网络栈实现分析(二)--数据包的传递过程--转

    转载地址http://blog.csdn.net/yming0221/article/details/7492423 作者:闫明 本文分析基于Linux Kernel 1.2.13 注:标题中的&qu ...

  5. Linux内核网络栈1.2.13-route.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> route路由表概述 在IP协议的实现中,只要发送数据包都要查询路由表,选择合适的路由选项,确定下一站的地址,并构造MAC ...

  6. Linux内核网络栈1.2.13-icmp.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> icmp协议 在实现的过程中, ICMP协议工作再IP协议之上,但又不与TCP协议工作再一级,而是在下一级,在一般ICMP ...

  7. Linux内核网络栈1.2.13-tcp.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> af_inet.c文件中调用函数在协议层的实现 本文主要根据在af_inet.c文件中根据初始化不同的协议,来调用不同的协 ...

  8. Linux内核网络栈1.2.13-af_inet.c概述

    参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数继续调用分析 根据socket提供的常用库函数,socket.read和write等函数,继续往下一层 ...

  9. Linux内核网络栈1.2.13-socket.c函数概述

    参考资料 <<linux内核网络栈源代码情景分析>> socket常用函数概述 根据socket提供的常用的库函数,socket,read,write等函数, 执行的过程 in ...

最新文章

  1. proxmox 宕机转义_Proxmox+Ceph的HCI环境搭建
  2. ES6标准学习: 4、数组的扩展
  3. C#中FileStream的对比以及使用方法
  4. tensorflow随笔-读取图像文件数据(1)
  5. 从头开始学JavaScript (七)——函数
  6. 使用Java Stream API将List按自定义分组规则转换成Map的一个例子
  7. promise的三种状态_一.Promise中核心逻辑的实现
  8. struts2整合spring3整合成功但是spring无法注入
  9. 使用回溯算法结合递归树+备忘录解决01背包问题
  10. 七十三、分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect传递参数...
  11. 小米游戏本8代加装固态硬盘系统迁移
  12. python画喜羊羊代码_python学习笔记7-字典
  13. Object.entries()
  14. 行人车辆检测与计数系统(Python+YOLOv5深度学习模型+清新界面)
  15. CentOS6.5安装部署***服务器
  16. CDQZ多校集训题目--盛夏
  17. docker 开机自启动容器docker运行自启动
  18. Android指纹解锁
  19. 李希贵:教育改革最大的阻力来自我们内心
  20. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170315

热门文章

  1. C语言 文件读写 fputc 函数 - C语言零基础入门教程
  2. C语言 函数指针 - C语言零基础入门教程
  3. 设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍
  4. matlab 计算汉明距_matlab实现滑动平均滤波
  5. 七七计算机论文网,qepipnu
  6. h3c交换机配置远程管理_H3C S3100交换机配置VLAN和远程管理
  7. java hive查询,hive查询报错
  8. oracle查询ora03114,求教:ora-03114错误从哪里排查?
  9. 高并发编程_高并发编程系列:全面剖析Java并发编程之AQS的核心实现
  10. php excelreader 中文,如何解决php excel reader导出excel中文乱码?