linux I/O 栈 预习(上)

二、预习

在我们进去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/下面,他们就是真正承上启下的块虚拟化模块,每个模块都是比较有意思。这些内容会在后续的文章中一一讲解。

原文地址:http://blog.51cto.com/12580077/2310233

时间: 2024-10-02 20:22:01

linux I/O 栈 预习(上)的相关文章

linux I/O栈 预习(下)

二.预习下 由于我们在上一篇文章中,描述了比较高层的I/O stack的结构,接下来我们来讲讲底层的结构. 这一节,可能绝大多数的人在实际的工作中,并不是涉及到开发,但也是linux I/O中非常重要的.那我们就一一列举,来讲讲它们都是什么.1.Block Layer,在很多年前,我在看SCSI子系统的时候,我那时候就不是太确立Block Layer到底是什么,因为这其中要理解block device.BIO和一系列的request_fn.所以理解block layer应该不是什么简单的事情,因

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

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7497260 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 经过前面两篇博文的分析,已经对L

Linux进程的栈和进程中函数的栈帧

主要理解了Linux进程的栈和函数的栈帧的区别和联系 上图中刻画的是一个Linux进程的结构图,其中本文想要关注的栈如上图所示是栈底在0xc0000000地址递减的一块进程内存区域 Linux系统中为每个进程分配的实际大小未做深究 Linux进程的栈的整体认知就是这么多,即 1)栈底在0xc0000000(并不需要栈底指针,函数的栈帧才需要栈底指针) 2)栈的增长方向,地址递减方向 3)栈顶指针esp 4)大小未知(不是本文关注的重点) 5)里面存放的内容是什么呢? 另一个概念是上文中提到的函数

Linux内核--网络栈实现分析(一)--网络栈初始化

本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 以后的系列博文将深入分析Linux内核的网络栈实现原理,这里看到曹桂平博士的分析后,也决定选择Linux内核1.2.13版本进行分析. 原因如下: 1.功能和网络栈层次

Linux内核--网络栈实现分析(七)--数据包的传递过程(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7545855 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux 下函数栈帧分析

1.关于栈 对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写 数据段:保存初始化的全局变量和静态变量,可读可写不可执行 BSS:未初始化的全局变量和静态变量 堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行 栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,非常非常重要,可读可写可执行.如下图所示: 首先必须明确一点也是非常重要的一点,栈是向下

Linux内核--网络栈实现分析(十一)--驱动程序层(下)

本文分析基于Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7555870 更多请查看专栏,地址http://blog.csdn.net/column/details/linux-kernel-net.html 作者:闫明 注:标题中的”(上)“,”(下)“表示分析过程基于数据包的传递方向:”(上)“表示分析是从底层向上分析.”(下)“表示分析是从上向下分析. 在博文Linux内核--网络栈

Linux 指令篇:文件上传和下载 lrzsz

[ "lrzsz"一般用于SecureCRT ssh中使用 ] 简介:rz,sz是早期Linux/Unix同Windows进行ZModem文件传输的命令行工具.rz ,sz 是非常古老的zmodem协议使用的上传下载命令,早就被抛弃了的东西,目前的发行版基本都不再预装. 优点:比ftp命令方便,而且服务器不用打开FTP服务. 命令sz:将选定的文件发送(send)到本地机器 命令rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器. lrzsz安装方法: [[e

(转载)linux那点事儿(上)

原文地址:http://www.cnblogs.com/fnng/archive/2012/03/19/2407162.html 本文只是转载供自己学习之用 本文算是学linux的学习笔记吧!其实linux与window差别还是有挺大的,在学linux时进量清空自己的windows思维,不然容易钻牛角尖.记是学过C之后,去学JAVA,老是用C的思维去看JAVA,所以,就是难入门.因为一个是面向过程的,一个是面向对象的.如果你抛开windows的思想,从零来学linux,其实,它没想象的那么难.每