[linux][storage]Linux存储栈

前言: 随着Linux的版本升高,存储栈的复杂度也随着增加。作者在这里简单介绍目前Linux存储栈。 分析: 1,storage stack

在用户态,可以看到的磁盘主要有几种类型: a,/dev/vdx类设备。虚拟化场景下的virtio-blk设备。 b,/dev/sdx类设备。通常所说的scsi类型的磁盘,但是目前,包括sata,sas,ide,甚至usb磁盘,都会接入到scsi层,用户态看到的就是/dev/sdx设备。 c,/dev/sgx设备,sg是scsi generic的缩写。 d,文件系统,并且后端设备在本地。例如上图的/mnt/xfs是使用xfs来mount的。 e,网络文件系统,包括nfs,cifs。后端是在远端,用网络文件系统实现的。 f,远端块设备。上图中使用iscsi协议挂载在本地的块设备。 2,vfs vfs的主要作用就是抽象,各种各样的文件系统都有各自的实现,但是用户态的读写始终就是read,write,readv,writev,pread,pwrite等等几个API。 另外就是缓存的管理。page cache,buffer,以及文件映射等高级功能,都是vfs实现的。 无论是读写文件,读写设备,ioctl等,都是由vfs提供的通用的API,实现 了强大的“一切皆文件”。 如上图,尽管后端、驱动、层次各不相同,但是经过vfs的抽象,都成了“文件”。 3,virtio-blk 第一条蓝色的路径。在图中示例,使用裸数据的方式访问,没有经过文件系统,直接到了块层。块层把io请求分发给virtio-blk驱动。注意,这里virtio驱动最后会把数据写入到内存中(也就是vring buf,并不是写入到具体的设备中),然后还要访问PCI设备,因为virtio-blk本身就是一个虚拟的PCI设备,guest写入数据后,需要通知host来处理(也就是kick host)。 4,block raw io 如图的第二条绿色路径。物理上,是一块SATA盘。用户使用裸数据的方式访问,经过vfs,并不需要具体的文件系统处理,vfs把请求转到通用块层,块层继续把请求转成scsi请求,scsi generic layer继续向下请求,最后通过PCI协议出来请求数据。 物理上,HBA卡,RAID卡,或者其他的scsi控制器,通过PCI / PCI-e接口连接到主板上。接到PCI请求之后,解释数据,最后把scsi cmd发送给磁盘控制器 。 图中没有画出来virtio-scsi,virtio-scsi也是一种虚拟的scsi控制器。也是接入到通过的scsi generic layer中。 5,sg io 如上图,第三条紫色的路径。用户直接使用scsi cmd来访问设备。 注意,因为没有经过vfs的管理,就没有了cache。绕开了通用块层,io合并等高级特性也没有。 一般是宿主机使用scsi passthrough的方式,把物理磁盘透传给虚拟机的时候使用。 6, 文件系统 例如上图的第四条红色的路径,/mnt/xfs是使用xfs来mount的。 有xfs来支持,可以做文件映射,有page cache,有truncate,seek data&seek hole,日志恢复等等。对于一般用户来说,这种方式是使用最多的。 xfs(或者ext4)具体做的事情,就是把磁盘的裸数据,用自己的方式组织起来,更加容易操作,甚至断电的数据恢复等等。 7,网络文件系统 例如上图的第五条深绿色的路径,/mnt/nfs是使用nfs来mount的。 用户请求经过vfs,vfs并不会把请求交给通用块层,而是转发到socket。 数据在socket中经过ipv4的网络协议栈,最终net-device执行xmit,网卡驱动把数据转化成PCI请求。 物理上,网卡是一个PCI设备。PCI主桥通过PCI的地址BUS,DEVICE,FUNCTION的组合找到了设备,把请求发送给网卡,网卡解析数据后,发送的链路层。 8,iscsi iscsi的实现上,虚拟出来hba,iscsi的LUN就成为挂载到hba上block 设备。挂载成功后,lsscsi命令可以看到对应的块设备。 虚拟hba,把后端数据通过socket收发。 使用方式上,一种是直接使用libiscsi,直接操作。一种是挂载iscsi到本地的sdx设备,裸数据访问,或者格式化文件系统后再使用。 9,loop设备 loop设备是虚拟块设备。 loop设备中,设置了真正后端的file(这个file可以是真正的文件),和对应的file operation。 向loop设备中读写,loop设备经过转化操作,转到真正的后端的file operation中读写。 10,LVM Logical Volume Manager技术,这里简单说一下它的原理: a,内核已经有了虚拟块设备的能力。(例如上文的iscsi块设备,就不是真正的块设备) b,那么是可以虚拟出来本地的一个新的块设备 c,块设备的后端,是使用hash算法实现的,它的数据可以分散到真正的几块物理盘上 除此之外,LVM有更多的逻辑概念:PV(physical volume),VG(volume group),LV(logical volume),PE(physical extent)等。 理解LVM的逻辑的核心在于上文的图中:理解清楚存储栈的层次关系,虚拟块设备到物理块设备之间的映射。 11,uninterruptable sleep 使用Linux的人,或多或少可能都遇到过进程的D状态,也就是uninterruptable sleep。例如用iptables在nfs的服务端挡住2049端口,或者服务端的网卡直接down,那么在客户端访问nfs上文件的时候就会卡住,而且不能被杀掉。(原因是处于uninterruptable sleep状态的task不能被信号唤醒) 网络波动同样也会影响到iscsi块设备。 12,其他问题 scsi已经是 很成熟的框架了,但是在Linux4.14上,作者还是看到了scsi引起的kernel die。作者在前文《[linux][kernel]list_del引起的kernle die分析 》中分析了那次kernel die的原因和分析方法,就是遇到了这个bug。 13,解决方法 随着虚拟化技术的成熟,性能不断提高。尝试把存储栈迁移到虚拟机中,也许是一个不错的选择。哪怕虚拟机真的出现了kernel die,也不会真正影响到宿主机的运行,以及宿主机上的业务至少还是没有崩溃的。宿主机上迅速重新启动虚拟机,就可以快速恢复相关的服务。

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2018-01-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件工程师成长笔记

单点登录SSO的实现原理

单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所...

4553
来自专栏何俊林

移动App 网络优化细节探讨

2896
来自专栏网站漏洞修补

微信里的网站网址被提示已停止访问该网页该如何解决

今天早晨发现我们公司网站只要在微信和qq中打开,分别被微信提示:已停止访问该网页,该网站链接以及在qq上被提示危险网站,千万别访问,首先先看下微信中打开网址被微...

5933
来自专栏BeJavaGod

Shiro系列(1) - 权限管理的介绍与原理

1. 什么是权限管理 一般来说,只要有用户参与,那么该系统都会需要权限管理,权限管理实现了对用户访问系统 指定功能的限制,按照管理员定义的安全...

3655
来自专栏云计算教程系列

如何在Ubuntu上搭建MQTT服务器

MQTT(消息队列遥测传输)是ISO 标准下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设...

7630
来自专栏云计算

虚拟机备份和恢复的六大最佳实践

虚拟机( virtual machine,简称 VM)的体系结构与传统的本地环境存在较大差异,因此需要不同的数据备份技术。基于此,本文将对虚拟机备份的一些最佳实...

3747
来自专栏程序员叨叨叨

Spring in Action笔记(更新至2.2)

Web应用程序 : 是一种结构化的软件,它提供了该领域中常见的任务的自动化实现,同时作为一个内置的架构解决方案可以被在其上实现的应用程序轻松地继承。

664
来自专栏云计算教程系列

物联网入门:搭建MQTT服务器

MQTT(消息队列遥测传输)是ISO 标准下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设...

2.2K9
来自专栏后端技术探索

后端Api设计的一些注意项

App所有数据都来源于服务器,App和服务器交互普遍是采用http请求接口的方式,那么在搭建和维护一个后端Api项目时候需要注意哪些问题呢?

1393
来自专栏七夜安全博客

新版知乎登录之post请求

3032

扫码关注云+社区

领取腾讯云代金券