用于虚拟化环境的通信协议的实现方法和装置的制造方法

文档序号:9616232阅读:404来源:国知局
用于虚拟化环境的通信协议的实现方法和装置的制造方法
【技术领域】
[0001] 本发明涉及计算机领域,具体来说,涉及一种用于虚拟化环境的通信协议的实现 方法和装置。
【背景技术】
[0002] 在服务器虚拟化环境(服务器虚拟化技术是指能够在一台物理服务器(宿主机) 上运行多台虚拟服务器(客户机)的技术,不仅可提高服务器资源的利用率,而且还能增强 系统安全性和可靠性)下,一台宿主机上通常会运行多台客户机,出于安全的考虑,对宿主 机和虚拟机的资源进行了隔离。但是在实际使用过程中,往往又有两者通信的需求,在这种 情况下,现有技术中普遍包括以下两种方式,一种为在客户机中配置虚拟网卡,并进行相关 的网络设置,然后使用套接字(socket)技术编写相关应用或者使用现有的应用实现所需 要的功能,其中,应用程序通常通过socket向网络发出请求或者应答网络请求;另一种解 决方案则是:使用完全模拟的串口设备来作为宿主机与客户机通信的管道,使用读或写方 法来收发数据。
[0003] 但是,对于上述配置虚拟网卡的方法,在一些使用场景条件下,由于某些原因客户 机可能没有配置虚拟网卡,或者由于某些防火墙策略,宿主机或者客户机无法接受外部请 求,那么,此时通过网络方式宿主机与客户机则无法进行通信。
[0004] 而当使用完全模拟的串口进行通信时,由于串口通信带宽很低,无法完成较大数 据量的通信,同时由于对串口的操作主要通过读或写方法来完成,此时需要对现有的很多 网络程序进行修改,将通用的socket过程改成文件打开/读/写模式,这种修改不够灵活, 同时在很多场景中都会带来较大的工作量。
[0005] 针对相关技术中的上述问题,目前尚未提出有效的解决方案。

【发明内容】

[0006] 针对相关技术中的上述问题,本发明提出一种用于虚拟化环境的通信协议的实现 方法和装置,能够实现宿主机和客户机之间的无网络的通信,并避免了对程序的较大修改。
[0007] 本发明的技术方案是这样实现的:
[0008] 根据本发明的一个方面,提供了一种用于虚拟化环境的通信协议的实现方法。
[0009] 该实现方法包括:
[0010] 对客户机添加virtio-serial设备;
[0011] 对客户机添加内核模块,内核模块用于实现通信协议;
[0012] 根据内核模块对客户机的调用函数进行修改,以实现客户机和宿主机之间的数据 发送与接收。
[0013] 其中,在对客户机添加virtio-serial设备时,可通过由宿主机启动客户机,并添 加命令行参数来实现。
[0014] 其中,内核模块包括:
[0015] 通信协议的类型和socket的地址类型的结构体定义;
[0016]socket的类型的结构体定义;
[0017] 传输层操作集的结构体定义;
[0018] 协议族socket的操作方法的结构体定义;
[0019] 协议族管理类型的结构体定义。
[0020] 此外,该实现方法进一步包括:
[0021] 内核模块调用注册协议,以将内核模块注册到协议族管理器。
[0022] 另外,该实现方法进一步包括:
[0023] 在向virtio-serial设备进行数据的写入操作时,将待发送数据的数据长度与发 送缓冲区长度作比较;
[0024] 在数据长度大于发送缓存区长度的情况下,从待发送数据的数据头截取发送缓存 区长度的数据段写入至virtio-serial设备;
[0025] 修改待发送数据的数据长度;
[0026] 对修改后的该待发数据继续进行写入操作。
[0027] 另外,该实现方法进一步包括:
[0028] 在从virtio-serial设备进行数据的读取操作时,按照接收缓冲区长度对数据进 行数据段的读取;
[0029] 在返回参数的数值大于零且小于接收缓存区长度的情况下,确定数据读取完成, 其中,返回参数表示当前读取的数据段的数据长度。
[0030] 可选的,该实现方法进一步包括:
[0031] 在从virtio-serial设备进行数据的读取操作时,设置定时器,在定时器超时的 情况下,未完成数据的读取则表示读取失败。
[0032] 根据本发明的另一方面,提供了一种用于虚拟化环境的通信协议的实现装置。
[0033] 该实现装置包括:
[0034] 第一添加模块,用于对客户机添加virtio-serial设备;
[0035] 第二添加模块,用于对客户机添加内核模块,内核模块用于实现通信协议;
[0036] 修改模块,用于根据内核模块对客户机的调用函数进行修改,以实现客户机和宿 主机之间的数据发送与接收。
[0037] 其中,第一添加模块包括:
[0038] 第一添加子模块,用于启动客户机,并添加命令行参数。
[0039] 此外,内核模块包括:
[0040] 通信协议的类型和socket的地址类型的结构体定义;
[0041]socket的类型的结构体定义;
[0042] 传输层操作集的结构体定义;
[0043] 协议族socket的操作方法的结构体定义;
[0044] 协议族管理类型的结构体定义。
[0045] 本发明通过在客户机中添加内核模块,和virtio-serial设备,S卩实现了宿主机 和客户机之间的无网络的通信又避免了对程序的较大修改。
【附图说明】
[0046] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所 需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施 例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获 得其他的附图。
[0047] 图1是根据本发明实施例的用于虚拟化环境的通信协议的实现方法的流程图;
[0048] 图2是根据本发明实施例的数据写入方法的流程图;
[0049] 图3是根据本发明实施例的数据读取方法的流程图;
[0050] 图4是根据本发明实施例的用于虚拟化环境的通信协议的数据发送方法的流程 图;
[0051] 图5是根据本发明实施例的用于虚拟化环境的通信协议的数据接收方法的流程 图;
[0052] 图6是根据本发明实施例的用于虚拟化环境的通信协议的实现装置的框图。
【具体实施方式】
[0053] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完 整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于 本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的 范围。
[0054] 根据本发明的实施例,提供了一种用于虚拟化环境的通信协议的实现方法。
[0055] 如图1所示,根据本发明实施例的实现方法包括:
[0056] 步骤S101,对客户机添加virtio-serial设备;
[0057] 步骤S103,对客户机添加内核模块,内核模块用于实现通信协议;
[0058] 步骤S105,根据内核模块对客户机的调用函数进行修改,以实现客户机和宿主机 之间的数据发送与接收。
[0059] 为了更好的理解本发明的上述技术方案,下面结合一具体实施例来对本发明的上 述技术方案进行详细阐述,本发明实现了一种基于virtio-serial的非网络方式的宿主机 与客户机通信的协议,该协议将作为底层socket通信协议的一种,并与当前socket中的 AF_INET(IPv4网络协议的套接字类型)使用方式兼容。
[0060] 具体的实施分为如下步骤:
[0061] 1)宿主机启动客户机时添加命令行参数,来给客户机添加virtio-serial设备。 此时在宿主机端即可对相关文件(socket/pipe)进行相应的操作,例如select,recv,send 等等。其中,virtio是KVM虚拟化环境下针对1/0虚拟化的最主要的一个通用框架,virtio 提供了一套有效、易维护、易开发、易扩展的中间层API,virtio-serial是基于API实现的 一个半虚拟串口设备。
[0062] 2)对于Linux系统来说,对客户机添加一个内核模块,实现该通信协议。其中,内 核模块可包括:通信协议的类型和socket的地址类型的结构体定义;socket的类型的结构 体定义;传输层操作集的结构体定义;协议族socket的操作方法的结构体定义;协议族管 理类型的结构体定义。
[0063] 具体的:
[0064] (1)定义协议类型以及地址类型,地址结构体中主要定义了virtio-serial设备 的名称,该名称在宿主机启动客户机时将会指定;
[0065]
[0066] (2)定义socket类型,该结构体中主要包含传输层的sock类型以及将会使用的 virtio-serial设备文件句柄fl以及设备全路径信息dev_path;
[0067]
[0068] (3)定义structproto结构,该结构主要定义传输层协议操作集,本发明协议中 只设置了3个字段;
[0069]
[0070] (4)定义structproto_ops结构,该结构体定义了协议族套接字的主要操作方 法,在本发明中主要实现了release,bind,connect,shutdown,sendmsg,recvmsg等方法:
[0071]
[0072] 在vs_bind以及vs_connect方法中主要完成设备文件的打开操作,而在vs_ sendmsg中主要通过vfs_write向设备中写入数据完成发送数据的功能,vs_recvmsg的实 现主要通过对设备文件调用vfs_read读取数据完成,同时在vs_sendmsg以及vs_recvmsg 中需要对数据的长度进行相应的处理,对于长数据,需要分多次操作完成,具体的函数流程 如下:
[0073]vs_sendmsg函数流程图如图2所示:
[0074] 步骤1,在向virtio-serial设备进行数据的写入操作时,调用数据发送方法 (sendmsg方法),对数据进行发送;
[0075] 步骤2,然后,将待发送数据的数据长度(即data_len)与发送缓冲区长度(即 snd_win_buf_len)作比较;
[0076] 步骤3a在数据长度小于发送缓存区长度的情况下,则调用写入方法(write)写入 data_len长度的数据至发送缓存区,然后发送至virtio-serial设备;
[0077] 步骤4a,若发送失败,则返回-1 ;
[0078] 步骤5a,若发送成功,则返回写入的数据的数据长度;
[0079] 步骤3b,在数据长度大于发送缓存区长度的情况下,则调用写入方法(write)从 待发送数据的数据头截取发送缓存区长度的数据段写入至virtio-serial设备;
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1