一种NVMe-oF用户空间直通后端存储的方法及系统与流程

文档序号:18641888发布日期:2019-09-11 23:30阅读:313来源:国知局
一种NVMe-oF用户空间直通后端存储的方法及系统与流程

本发明涉及存储领域,具体而言,涉及nvme-of用户空间直通后端存储的方法及系统。



背景技术:

nvme协议是技术上更先进的协议,替代传统协议emmc/sata/scsi(ufs目前采用的是命令层协议是scsi)将会是大势所趋,在nvmet(nvmetarget)是内核的nvmeoverfabricstarget框架,支持将nvme(non-volatilememoryexpress非易失性内存主机控制器接口规范)块设备、普通块设备或者常规文件导出为nvme块设备。

内核nvmet无法从内核直接访问用户空间存储库,如果将用户空间库编入内核是可以实现访问,但是后期库文件发生变化时就需要重新编译内核模块,使维护成本增加,并且内核在整个系统中属于核心,频繁修改内核也会增加风险。所以随着用户空间存储解决方案,如ceph或glusterfs的兴起,内核的nvmet无法从内核直接访问这些用户空间后端存储成了一个待解决的问题。



技术实现要素:

本发明的目的在于提供一种nvme-of用户空间直通后端存储的方法及系统,通过实现nvmet用户空间处理框架,使内核态nvmet和用户空间后端存储解耦合,用户空间后端存储修改时不需要修改内核的nvmet模块,降低维护成本,降低系统风险。

本发明的实施例是这样实现的:

本发明实施例的第一方面提供一种nvme-of用户空间直通后端存储的方法,主要包括如下步骤:

在内核加载nvmetu模块,在用户空间启动nvmetu-runner模块;

发送所述nvme请求至所述nvmetu模块;

发布所述nvme请求至共享内存中;

读取所述nvme请求并发送给所述用户存储模块librbd处理;

反馈nvme响应至所述nvmetu-runner模块并发布所述nvme响应至所述共享内存中;

读取所述nvme响应并发送至nvmetcore模块,完成nvme-of用户空间直通后端存储的过程。

进一步地,所述nvme请求由nvmetcore模块解析传输层接收的io请求并将其转换成nvme请求。

进一步地,所述共享内存划分为请求管理区域、请求队列区域和数据区域三个区域。

进一步地,所述nvme请求通过uio设备发布至所述共享内存中。

进一步地,所述nvme响应通过uio设备发布至共享内存中。

进一步地,所述nvme响应是由nvmetu-runner模块将用户存储模块librbd206反馈的rbd格式io处理结果信息转换为nvme格式的处理结果信息,又称为nvme响应。

本发明实施例的第二方面提供一种nvme-of用户空间直通后端存储的系统,包括:

nvmetcore模块,接收来自传输层的io请求,并将请求解析后得到的nvme请求发送至nvmetu模块处理;将nvme响应封装成io响应发至传输层;

nvmetu模块,接收来自所述nvmetcore模块的所述nvme请求发布至共享内存中等待nvmetu-runner模块读取处理;从共享内存中读取所述nvme响应并发给所述nvmetcore模块;

nvmetu-runner模块:从所述共享内存中读取所述nvme请求并将所述nvme请求转换成rbd的io请求,调用用户存储模块librbd处理;将所述用户存储模块librbd处理生成的rbd格式io处理结果信息转换成nvme响应发布至共享内存中;

用户存储模块librbd:从所述nvmet-runner模块获取rbd格式的io请求,并发送到ceph集群处理;将所述ceph集群处理结果打包成rbd格式的io处理结果信息反馈至所述nvmet-runner模块;

uio设备,所述nvmetu模块在加载时会通过uio模块注册一个uio设备,所述uio设备会注册一段共享内存用于内核空间和用户空间的交互。

本发明实施例的第三方面提供一种包括计算机可执行指令的计算机程序产品,所述计算机可执行指令用于当程序在计算机上被运行时执行根据本发明实施例第一方面所述的方法。

本发明实施例的第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质包括根据本发明实施例的第三方面提供的计算机可执行指令的计算机程序产品。

本发明实施例的有益效果包括:用户空间后端存储修改时不需要修改内核的nvmet模块,实现用户空间直接访问共享内存,而不需在用户空间和内存之间多次拷贝实现数据读取和写入的过程,降低维护成本,降低系统风险,使内核态nvmet可以高效的访问用户空间后端存储。

附图说明

为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1示出了根据本发明的一个实施例的nvme-of用户空间直通后端存储的方法的流程图;

图2示出了根据本发明的一个实施例的nvme-of用户空间直通后端存储的系统的结构图;

图3示出了共享内存的组织结构图;

图4示出了一个可以用来实施本公开的实施例的电子设备800的示意性框图。

图标:201-nvmetcore模块;202-nvmetu模块;203-uio设备;204-共享内存;205-nvmetu-runner模块;206-用户存储模块librbd;207-ceph集群;301-请求管理区域;302-请求队列区域;303-数据区域;801-cpu;802-rom;803-ram;804-总线;805-i/o;806-输入单元;807-输出单元;808-存储单元;809-通信单元。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。

因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。

此外,术语“水平”、“竖直”等术语并不表示要求部件绝对水平或悬垂,而是可以稍微倾斜。如“水平”仅仅是指其方向相对“竖直”而言更加水平,并不是表示该结构一定要完全水平,而是可以稍微倾斜。

在本发明的描述中,还需要说明的是,除非另有明确的规定和限定,术语“设置”、“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。

第一实施例

在详细阐述本实施例之前对说明书涉及到的相关概念进行解释说明,其目的在于帮助阅读者更加容易理解本发明的内容。

用户空间就是用户进程所在的内存区域,相对的,系统空间就是操作系统占据的内存区域。用户进程和系统进程的所有数据都在内存中。在电脑开机之前,内存就是一块原始的物理内存。系统启动后,就对物理内存进行了划分。当然,这是系统的规定,物理内存条上并没有划分好的地址和空间范围。这些划分都是操作系统在逻辑上的划分。

操作系统的数据都是存放于系统空间的,用户进程的数据是存放于用户空间的。不同的身份,数据放置的位置必然不一样,否则会导致系统的数据和用户的数据混在一起,系统就不能很好的运行了。分开来存放,就让系统的数据和用户的数据互不干扰,保证系统的稳定性。分开存放,管理上很方便,而更重要的是,将用户的数据和系统的数据隔离开,就可以对两部分的数据的访问进行控制。这样就可以确保用户程序不能随便操作系统的数据,这样防止用户程序误操作或者是恶意破坏系统。

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的用户代码中运行。

在步骤101中,如图1和图2所示,在内核中加载nvmetu模块202。nvmetu模块202代码最终会被编译成为一个内核模块,系统通过加载内核模块的方式在内核中建立nvmetu模块202。涉及到的常用命令为“modprobe模块名”和“insmod模块名”,例如nvmetu模块名就是nvmetu,执行“modprobenvmetu”命令系统会加载nvmetu模块202至系统中,然后执行“insmodnvmetu”命令系统会加载nvmetu模块202至内核中。在加载nvmetu模块202时会把相关的nvmetcore模块201、uio模块都加载进内核。nvmetu模块202会通过uio模块注册一个uio设备203,在后续步骤中用于通过uio设备203发布nvme请求。

在用户空间启动nvmetu-runner模块205。nvmetu-runner模块205代码最终会被编译生成一个可执行程序,通过执行可执行程序在用户空间建立nvmetu-runner模块205。通常可执行程序获得执行权限后可以通过文件名直接启动程序,例如nvmetu-runner模块205产生的可执行文件名为nvmetu-runner,通过执行nvmetu-runner来启动用户空间nvmetu-runner模块205。

在步骤102中,发送nvme请求给nvmetu模块202。在nvmet框架中,nvmet的传输层负责通过具体的传输协议(rdma、tcp、光纤)接收请求和发送响应。nvmet的传输层所接受的请求包括两类,分别是管理请求,io请求(即存储数据的读写请求)。nvmetcore模块201负责处理传输层收到的两类请求,如果收到管理请求则调用管理请求处理接口直接处理,如果收到io请求则nvmetcore模块201解析传输层接收的所述io请求并将其转换成nvme请求,nvmetcore模块201调用nvmetu模块202提供的请求处理接口,将nvme请求发送给nvmetu模块202进行下一步处理。

在步骤103中,将所述nvme请求发布在共享内存204中。nvmetu模块202在内核加载时会通过uio模块注册一个uio设备203,然后通过uio设备203发布所述nvme请求。uio设备203会注册一段共享内存204用于内核空间和用户空间的交互,所述nvme请求保存在上述uio设备203的共享内存204中。

图3示出了共享内存204的组织结构图,划分为请求管理区域301、请求队列区域302和数据区域303三个区域。请求管理区域301在uio设备注册的共享内存204的起始位置,包含请求对列的偏移量(rq_off)、请求对列的大小(rq_size)、请求head指针(r_head)和请求tail指针(r_tail)。请求对列的偏移量(rq_off)用于表示请求对列区域302在共享内存204区域的起始位置的偏移量;请求对列的大小(rq_size)用于表示请求对列区域302的大小;请求head指针(r_head)由内核指令修改,表示一个请求已经放到请求对列区域302中;请求tail指针(r_tail)由用户空间修改,表示一个请求已经处理完成。请求对列区域302中放置着每一个请求(r_entry),内核根据请求对列区域302的大小移动请求head指针,并且通过uio_event_notify()通知用户空间。当用户空间处理完io请求后,用户空间更新请求tail指针,并且通过写请求通知内核。当请求head指针等于请求tail指针时,请求对列区域302为空,没有请求需要用户空间处理。数据区域303在请求对列区域302后面,用户空间通过请求的iovec访问指定区域。

在步骤104中,读取所述nvme请求并发送给用户存储模块librbd处理。用户空间nvmetu-runner模块205通过uio设备203的/sys/class/uio/uio0特定区域内容读取目标用户存储空间的详细配置信息,通过所述配置信息确定要访问的具体后端存储设备(如rbd设备)。用户空间的nvmetu-runner模块205访问uio设备203,用户空间nvmetu-runner模块205通过轮询监控uio设备203的共享内存204中是否有未处理的nvme请求,如果发现有未处理的nvme请求,用户空间nvmetu-runner模块205通过对uio设备203的/dev/uio0区域的读请求来获取的共享内存204的nvme请求,然后调用具体后端存储设备的io处理接口将nvme请求转换为具体后端存储设备支持的io请求并交由具体后端存储设备处理。用户空间nvmetu-runner模块205将nvme请求转换成rbd格式的io请求,然后将rbd格式的io请求发送给用户存储模块librbd206处理,用户存储模块librbd206将已经转换为rbd格式的io请求发送到ceph集群207处理完成数据的读取或写入任务并生成rbd格式io处理结果信息,实现用户空间直接访问共享内存204,而不需在用户空间和内存之间多次拷贝实现数据读取和写入的过程。

在步骤105中,反馈nvme响应至nvmetu-runner模块205并发布所述nvme响应至共享内存204中。用户存储模块librbd206将所述rbd格式io处理结果信息反馈至nvmet-runner模块,nvmetu-runner模块205将所述rbd格式io处理结果信息转换为nvme响应,所述nvme响应即nvme格式的处理结果信息。用户空间nvmetu-runner模块205通过对uio设备203的/dev/uio0区域的写请求将所述nvme响应发布至共享内存204中。

在步骤106中,读取共享内存204中的nvme响应并发送至nvmetcore模块201。内核空间nvmetu模块202在内核中会轮询uio设备203的共享内存204监测是否有未处理的nvme响应,如果监测有未处理的nvme响应就通过uio设备203的共享内存204中读取nvme响应并发给nvmetcore模块201,nvmetcore模块201将所述nvme响应封装成传输层io响应发至传输层,从而完成在nvme-of用户空间直通后端存储的过程。

图4示出了一个可以用来实施本公开的实施例的电子设备800的示意性框图。如图所示,电子设备800包括中央处理单元(cpu)801,其可以根据存储在只读存储器(rom)802中的计算机程序指令或者从存储单元808加载到随机访问存储器(ram)803中的计算机程序指令,来执行各种适当的动作和处理。在ram803中,还可存储电子设备800操作所需的各种程序和数据。cpu801、rom802以及ram803通过总线804彼此相连。输入/输出(i/o)接口805也连接至总线804。

电子设备800中的多个部件连接至i/o接口805,包括:输入单元806,例如键盘、鼠标等;输出单元807,例如各种类型的显示器、扬声器等;存储单元808,例如磁盘、光盘等;以及通信单元809,例如网卡、调制解调器、无线通信收发机等。通信单元809允许电子设备800通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。上述系统800还可以作为虚拟机在物理硬件上运行。图2所示系统可以实现为存储在计算系统800的本地存储器802中以供其处理器801执行的编程指令。备选地,图2所示的系统可以存储在存储单元808上或者可以通过通信接口809从另一计算系统访问。

本发明还提出一种包括适配于执行根据本发明的方法的计算机可执行指令的计算机程序产品,该一种包括适配于执行根据本发明的方法的计算机可执行指令的计算机程序产品包括一种nvme-of用户空间直通后端存储的方法,该一种nvme-of用户空间直通后端存储的方法参照上述实施例,由于一种包括适配于执行根据本发明的方法的计算机可执行指令的计算机程序产品采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘述。

本发明还提出一种包括根据本发明的计算机程序的计算机可读存储介质,该一种包括根据本发明的计算机程序的计算机可读存储介质包括一种包括适配于执行根据本发明的方法的计算机可执行指令的计算机程序产品,该一种包括适配于执行根据本发明的方法的计算机可执行指令的计算机程序产品的具体结构参照上述实施例,由于一种包括根据本发明的计算机程序的计算机可读存储介质采用了上述所有实施例的全部技术方案,因此至少具有上述实施例的技术方案所带来的所有有益效果,在此不再一一赘述。

用于实现本发明的方法的计算机程序代码可以用一种或多种编程语言编写。这些计算机程序代码可以提供给通用计算机、专用计算机或其他可编程的数据处理装置的处理器,使得程序代码在被计算机或其他可编程的数据处理装置执行的时候,引起在流程图和/或框图中规定的功能/操作被实施。程序代码可以完全在计算机上、部分在计算机上、作为独立的软件包、部分在计算机上且部分在远程计算机上或完全在远程计算机或服务器上执行。

在本发明的上下文中,机器可读介质可以是包含或存储用于或有关于指令执行系统、装置或设备的程序的任何有形介质。机器可读介质可以是机器可读信号介质或机器可读存储介质。机器可读介质可以包括但不限于电子的、磁的、光学的、电磁的、红外的或半导体系统、装置或设备,或其任意合适的组合。机器可读存储介质的更详细示例包括带有一根或多根导线的电气连接、便携式计算机磁盘、硬盘、随机存储存取器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或闪存)、光存储设备、磁存储设备,或其任意合适的组合。

以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1