一种Linux块设备的Windows远程映射方法

文档序号:6639693阅读:284来源:国知局
一种Linux块设备的Windows远程映射方法
【专利摘要】本发明涉及一种Linux块设备的Windows远程映射方法。该方法在Linux系统中创建虚拟块设备文件,将Windows系统下的存储设备作为Linux系统中虚拟块设备文件所对应的实际物理设备;根据接入Windows系统的存储设备找到Windows内核中对应的设备对象指针,并创建Windows系统到Linux系统的TCP连接;Linux系统的虚拟块设备和Windows系统的USB存储设备采用TCP协议传输消息,根据TCP消息中的操作类型进行读操作或写操作。本发明通过扩展网络块设备到Windows系统平台的方式,简化了文件传输的操作过程,并且提高了数据传输效率。
【专利说明】一种L i nux块设备的W i ndows远程映射方法

【技术领域】
[0001]本发明涉及Linux网络块设备领域,特别是涉及一种基于网络的将Windows存储设备映射为远程Linux平台块设备的方法。

【背景技术】
[0002]在Linux操作系统中,I/O设备主要分为字符设备和块设备,块设备将数据存储在固定大小的块中,每块都有可用于访问的地址。因此,块设备常用于大容量存储设备,如磁盘。块设备以特殊文件方式存在于Linux系统中,块设备能够尚效稳定的完成每一次读写操作。在Linux内核2.6版本以后加入了网络块设备功能(即NBD,Network BlockDevice),Linux系统之间能够将各自的存储设备以网络块设备方式共享给其他系统使用。但在Windows系统中没有相对应的实现方式。基于网络的共享方法很多,NFS、FTP以及Linux SCP等等,但这些方法都是操作系统上层应用的共享方式,其传输效率比处于内核态基于设备的网络块设备方式要低。
[0003]随着计算机与互联网的快速发展,数据中心或机房中的服务器绝大多数都采用Linux操作系统,但个人电脑上则是Windows系统,在平时的使用过程中不可避免会遇到文件传输等操作,对于USB存储设备而言,通常的操作方式是将其中数据拷贝到个人桌面电脑之后再通过文件共享方法拷贝到服务器,或者反之。很明显,传输效率很低,而且费时费力。


【发明内容】

[0004]本发明针对上述问题,提供一种Windows存储设备(尤其适用于Windows USB存储设备)到Linux块设备的远程映射方法,通过扩展网络块设备到Windows系统平台的方式,简化文件传输的操作过程,并且提高数据传输效率。
[0005]为实现上述目的,本发明采用如下技术方案:
[0006]一种Windows存储设备到Linux块设备的远程映射方法,其步骤包括:
[0007]I)在Linux系统中创建虚拟块设备文件,并指定请求处理函数、设备号,然后绑定请求处理队列,创建TCP监听进程,将Windows系统的存储设备作为Linux系统中虚拟块设备文件所对应的实际物理设备;
[0008]2)根据接入Windows系统的存储设备找到Windows内核中对应的设备对象指针,并创建Windows系统到Linux系统的TCP连接;
[0009]3) Linux系统的虚拟块设备和Windows系统的存储设备采用TCP协议传输消息,根据TCP消息中的操作类型进行读操作或写操作。
[0010]进一步地,所述Windows系统的存储设备优选为USB存储设备,除支持WindowsUSB存储设备之外,仅通过修改设备对象查找条件,即可支持其他Windows存储设备(如硬盘)。
[0011]进一步地,所述TCP消息包括三类网络传输消息:A类消息、B类消息和C类消息,其中A类消息和C类消息传输操作指令以及操作结果状态信息,为定长格式,B类消息传输实际数据,为不定长格式。
[0012]进一步地,所述A类消息包含的字段为类型、编号、操作类型、数据长度和数据起始地址;编号是为了区分相同类型消息以及重复消息;操作类型包含两种,即读操作和写操作;数据长度和起始地址分别指明本次过程需要操作的存储设备中的地址和数据块数;所述B类消息包含类型、编号、数据长度和数据四个字段,当A类消息指明当前操作为读操作,则B类消息从Windows端发送到Linux端;当A类消息指明当前操作为写操作,则B类消息从Linux端发送到Windows端;所述C类消息包含类型、编号和状态编号三个字段,用于表示一个操作成功或者失败状态。
[0013]一种采用上述方法的Windows系统到Linux系统的远程映射系统,其特征在于,包括Linux系统的虚拟块设备和Windows系统的存储设备,两部分米用TCP协议传输消息,根据TCP消息中的操作类型进行读操作或写操作。
[0014]与现有技术相比,本发明的创新之处在于:以网络共享为基础,设计块设备跨平台映射方法,使USB存储设备能够以更方便、更有效的方式使用和管理。具体体现在:
[0015]1.本发明将Windows下的存储设备作为Linux服务器块设备文件的实际物理设备,这种方式尤其适合在PC和数据中心或机房服务器之间传输数据,用户可以将USB存储设备直接连接在当前正在使用的PC上,通过本方法会在指定服务器中自动创建块设备文件,然后在服务器挂载该虚拟块设备到相应目录即可访问;
[0016]2.相比NFS、FTP等文件共享方式,本发明的运行环境为操作系统内核态,能够以更高的速度在PC和服务器之间传输数据;
[0017]3.本发明是在文件系统底层实现,因此所使用的上层文件系统是Linux VFS文件系统,虽然物理设备是在Windows平台下进行读写操作,但能够支持所有Linux文件系统支持的类型,即使Windows文件系统不支持也不会受到影响。

【专利附图】

【附图说明】
[0018]图1是本发明方案的总体结构示意图。
[0019]图2是虚拟块设备请求处理逻辑流程图。
[0020]图3是Windows物理USB存储设备处理流程图。
[0021]图4是传输消息格式示意图。
[0022]图5是消息传输顺序示例图。

【具体实施方式】
[0023]为使本发明的上述目的、特征和优点能够更加明显易懂,下面通过具体实例和附图,对本发明做进一步说明。
[0024]本发明以扩展块设备使用平台、提高块设备使用简易性和传输效率为目标,解决Windows系统平台下的存储设备作为Linux系统平台下网络块设备使用的问题。具体包括:
[0025]1.Linux平台下块设备的虚拟;
[0026]2.Linux平台下虚拟块设备操作指令和数据的截获与转发;
[0027]3.Windows平台下存储设备的操作指令接收与反馈;
[0028]4.Windows平台下存储设备的操作指令执行和数据的管理。
[0029]如图1所示,本实施例由Linux虚拟块设备和Windows物理USB存储设备两部分组成,两部分采用TCP协议传输消息(如图4所示,A、B和C类消息)实现通信。其它实施例中,通过修改设备对象查找条件,即可支持其他Windows存储设备(如硬盘)。
[0030]一、Linux虚拟块设备
[0031]在Linux系统中创建虚拟块设备文件,指定请求处理函数、设备号(包含主设备号和次设备号,主设备号用来表示一个特定的驱动程序,次设备号用来表示使用该驱动程序的各设备),绑定请求处理队列,创建TCP监听进程,并获取用户对此虚拟设备所有操作的请求消息即request消息。在Linux内核中request消息被定义为request结构体,其中以下三个属性在内核与驱动之间的交互过程中有着重要作用:
[0032]struct request {
[0033]...
[0034]sector_t sector ;
[0035]unsigned long nr_sectors ;
[0036]unsigned int current_nr_sectors ;
[0037]...
[0038]};
[0039]虚拟块设备驱动从request消息中根据这些属性提取出相应操作的操作类型(读数据还是写数据)、数据起始地址和数据长度,实际数据的传输由于操作类型不同,传输方向也不同。
[0040]如图2所示,Linux服务器主要操作过程如下所示:
[0041]1.创建网络监听进程;
[0042]2.注册块设备,并配置相关参数;
[0043]3.绑定消息请求处理函数;
[0044]4.添加块设备到内核;
[0045]5.等待TCP客户端连接;
[0046]6.等待用户操作;
[0047]a)读操作:
[0048]1.从request消息中分析数据读取的地址和长度;
[0049]i1.将操作类型、待读取数据起始地址和长度组装为A类消息;
[0050]ii1.发送给TCP对端(Windows系统)节点;
[0051]iv.等待接收来自对端包含待读取数据的B类消息;
[0052]v.从接收到的B类消息中获取待读取数据内容,拷贝到request消息中指定的内存空间。
[0053]v1.发送C类消息给TCP对端节点,确认操作成功或失败;
[0054]b)写操作:
[0055]1.从request消息中分析出待写数据的起始地址和数据长度;
[0056]i1.将操作类型、待写数据起始地址以及数据长度组装为A类消息;
[0057]ii1.发送给TCP对端节点;
[0058]iv.从request消息中分析出待写数据的内容,组装为B类消息;
[0059]V.发送给TCP对端节点;
[0060]v1.等待接收来自TCP对端节点的C类消息,确认操作成功或失败。
[0061 ]二、Windows物理USB存储设备
[0062]在Windows系统中,根据接入系统的USB存储设备找到Windows内核中对应的设备对象指针,以便对物理设备进行读写操作。创建TCP监听进程,接收Linux端发送的A类消息和B类消息。根据消息中包含的操作类型,进入不同的处理流程(如图3所示)。
[0063]Windows客户端操作过程:
[0064]1.当系统检测到USB存储设备的插入之后;
[0065]2.查找USB存储设备对应的内核设备对象;
[0066]3.创建到Linux服务器的TCP连接,并等待消息;
[0067]4.根据服务器端的操作指令将消息分为两类:读操作和写操作;
[0068]a)针对读操作,
[0069]1.从接收到的A类消息中分析待读取数据的起始地址和长度;
[0070]i1.创建并配置IRP请求;
[0071]ii1.将IRP发送给设备对象;
[0072]iv.等待并处理操作结果;
[0073]V.从指定系统内存空间读取数据并创建B类消息;
[0074]v1.发送给TCP对端节点(Linux系统);
[0075]vi1.等待C类消息,确认本次操作成功或者失败;
[0076]b)针对写操作,
[0077]1.从接收到的A类消息中分析待读取数据的起始地址和长度;
[0078]i 1.等待此消息对应的B类消息;
[0079]ii1.创建并配置IRP请求;
[0080]iv.将IRP请求发送给设备对象;
[0081]V.根据处理结果,创建C类消息;
[0082]v1.发送给TCP对端节点;
[0083]其中找到USB存储设备对应内核设备对象是通过枚举内核设备栈实现。根据USB存储设备驱动程序名称“\\Driver\\USBSTOR”查找设备栈,满足条件:
[0084]pAttrDeviceObj->Devi ceType == FILE—DEVICE—DI SK&&
[0085](pAttrDeviceObj->Flags&DO—DEVICE—HAS—NAME) &&
[0086](pAttrDeviceOb j->Characteri st ics&FILE—REMOVABLE—MEDIA)
[0087]则查找成功。
[0088]三、消息类型
[0089]如图4所示,本发明中设计三类网络传输消息,其中A类和C类消息传输操作指令以及操作结果状态信息,为定长格式。B类消息传输实际数据,为不定长格式。
[0090]A类消息包含如下字段,即类型(即表示A类消息)、编号、操作类型、数据长度和数据起始地址。编号是为了区分相同类型消息以及重复消息。操作类型包含两种,即读操作和写操作。数据长度和起始地址分别指明本次过程需要操作的USB存储设备中的地址和数据块数。
[0091]B类消息包含类型(即表示B类消息)、编号、数据长度和数据四个字段,当A类型消息指明当前操作为读操作,那么B类消息从Windows端发送到Linux端;当A类型消息指明当前操作为写操作,那么B类消息从Linux端发送到Windows端。
[0092]C类消息包含类型(即表示C类消息)、编号和状态编号三个字段。C类消息主要用于表示一个操作成功或者失败状态,如果失败,则表示失败的原因编号。如图5所示,C类消息主要存在于写操作完成之后,Windows端发送给Linux端的结果反馈。
[0093]本发明方案不限于上述实施方式,例如上述三类消息可以进行合并,如将A类消息和B类消息组合在一起,即一条消息中既包含数据起始地址和长度信息,又包含实际数据内容等;或者将消息顺序进行调整以及采用缓存方式预存储消息和数据等方式。
[0094]本发明通过网络实现Windows系统平台下的存储设备作为Linux服务器块设备文件所对应的实际物理设备,从而实现块设备跨平台共享方法。相比NFS等文件共享方式,本发明能够以更高的速率传输数据、更为方便的方式使用USB存储设备或其他存储设备。如图1所示,本发明尤其适合在PC和数据中心(或机房)服务器之间传输数据,用户可以将USB存储设备直接连接在当前正在使用的PC上,通过本方法会在指定服务器中自动创建块设备文件,然后在服务器挂载该虚拟块设备到相应目录即可访问。同时本发明能够支持所有Linux文件系统支持的类型,包括Windows系统不能识别的文件系统类型。
[0095]以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
【权利要求】
1.一种Windows存储设备到Linux块设备的远程映射方法,其步骤包括: 1)在Linux系统中创建虚拟块设备文件,并指定请求处理函数和设备号,然后绑定请求处理队列,创建TCP监听进程,将Windows系统的存储设备作为Linux系统中虚拟块设备文件所对应的实际物理设备; 2)根据接入Windows系统的存储设备找到Windows内核中对应的设备对象指针,并创建Windows系统到Linux系统的TCP连接; 3)Linux系统的虚拟块设备和Windows系统的存储设备采用TCP协议传输消息,根据TCP消息中的操作类型进行读操作或写操作。
2.如权利要求1所述的方法,其特征在于:所述Windows系统的存储设备为USB存储设备,或者为硬盘。
3.如权利要求1或2所述的方法,其特征在于:所述TCP消息包括三类网络传输消息:A类消息、B类消息和C类消息,其中A类消息和C类消息传输操作指令以及操作结果状态信息,为定长格式,B类消息传输实际数据,为不定长格式。
4.如权利要求3所述的方法,其特征在于:所述A类消息包含的字段为类型、编号、操作类型、数据长度和数据起始地址;编号是为了区分相同类型消息以及重复消息;操作类型包含两种,即读操作和写操作;数据长度和起始地址分别指明本次过程需要操作的存储设备中的地址和数据块数;所述B类消息包含类型、编号、数据长度和数据四个字段,当A类消息指明当前操作为读操作,则B类消息从Windows端发送到Linux端;当A类消息指明当前操作为写操作,则B类消息从Linux端发送到Windows端;所述C类消息包含类型、编号和状态编号三个字段,用于表示一个操作成功或者失败状态。
5.如权利要求4所述的方法,其特征在于,Linux系统的虚拟块设备的操作流程是: a)读操作: 1.从request消息中分析数据读取的地址和长度; ?.将操作类型、待读取数据起始地址和长度组装为A类消息; ii1.发送给TCP对端节点; iv.等待接收来自对端包含待读取数据的B类消息; V.从接收到的B类消息中获取待读取数据内容,拷贝到request消息中指定的内存空间; v1.发送C类消息给TCP对端节点,确认操作成功或失败; b)写操作: 1.从request消息中分析出待写数据的起始地址和数据长度; ?.将操作类型、待写数据起始地址以及数据长度组装为A类消息; ii1.发送给TCP对端节点; iv.从request消息中分析出待写数据的内容,组装为B类消息; V.发送给TCP对端节点; v1.等待接收来自TCP对端节点的C类消息,确认操作成功或失败。
6.如权利要求5所述的方法,其特征在于,Windows系统的存储设备的操作流程是: a)针对读操作, 1.从接收到的A类消息中分析待读取数据的起始地址和长度; i1.创建并配置IRP请求; ii1.将IRP发送给设备对象; iv.等待并处理操作结果; V.从指定系统内存空间读取数据并创建B类消息; v1.发送给TCP对端节点; vi1.等待C类消息,确认本次操作成功或者失败; b)针对写操作, 1.从接收到的A类消息中分析待读取数据的起始地址和长度; ?.等待此消息对应的B类消息; ii1.创建并配置IRP请求; iv.将IRP请求发送给设备对象; V.根据处理结果,创建C类消息; v1.发送给TCP对端节点。
7.如权利要求1所述的方法,其特征在于:通过枚举内核设备栈找到Windows系统的存储设备对应的内核设备对象。
8.一种采用权利要求1所述方法的Windows系统到Linux系统的远程映射系统,其特征在于,包括Linux系统的虚拟块设备和Windows系统的存储设备,两部分采用TCP协议传输消息,根据TCP消息中的操作类型进行读操作或写操作。
9.如权利要求8所述的系统,其特征在于:所述Windows系统的存储设备为USB存储设备,或者为硬盘。
10.如权利要求8所述的系统,其特征在于:所述TCP消息包括三类网络传输消息:A类消息、B类消息和C类消息,其中A类消息和C类消息传输操作指令以及操作结果状态信息,为定长格式,B类消息传输实际数据,为不定长格式;所述A类消息包含的字段为类型、编号、操作类型、数据长度和数据起始地址;编号是为了区分相同类型消息以及重复消息;操作类型包含两种,即读操作和写操作;数据长度和起始地址分别指明本次过程需要操作的存储设备中的地址和数据块数;所述B类消息包含类型、编号、数据长度和数据四个字段,当A类消息指明当前操作为读操作,则B类消息从Windows端发送到Linux端;当A类消息指明当前操作为写操作,则B类消息从Linux端发送到Windows端;所述C类消息包含类型、编号和状态编号三个字段,用于表示一个操作成功或者失败状态。
【文档编号】G06F3/06GK104516687SQ201410806282
【公开日】2015年4月15日 申请日期:2014年12月22日 优先权日:2014年12月22日
【发明者】云晓春, 郝志宇, 孙振喜, 张永铮, 李伦, 费海强, 丁振全 申请人:中国科学院信息工程研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1