前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[linux][storage]Linux存储栈

[linux][storage]Linux存储栈

作者头像
皮振伟
发布2018-04-09 11:29:16
5.2K0
发布2018-04-09 11:29:16
举报
文章被收录于专栏:皮振伟的专栏皮振伟的专栏

前言: 随着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,也不会真正影响到宿主机的运行,以及宿主机上的业务至少还是没有崩溃的。宿主机上迅速重新启动虚拟机,就可以快速恢复相关的服务。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AlwaysGeek 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档