发明内容
本发明的目的,现有技术在对大规模磁盘阵列进行集中监控的存储管理软件进行测试时,要占用大量资源,且测试效果不佳,为了克服该问题,提供一种基于磁盘阵列虚拟化的网络存储管理软件测试方法。其基本原理是,在测试网络存储管理软件的性能时,无需读写远端真实的磁盘阵列,而是在远程PC机下运行多个虚拟盘阵的服务进程来模拟真实盘阵在接受管理软件的管理命令后执行的读写操作。虚拟盘阵服务进程通过UDP和TCP协议与网络存储管理软件的进行交互,从而完成软件的性能测试。
为实现上述目的,本发明所采用的技术方案如下:
步骤一、搭建测试环境。采用一台计算机A作为运行虚拟盘阵进程的目标机,并在现有操作系统的基础上安装虚拟机软件(比如在Windows XP上安装VMWare)。之后,在虚拟机上安装并运行多个Linux操作系统,通过给网卡设置别名的方法,实现单个网卡绑定多个IP地址。此时,在每个Linux系统的特定目录下部署若干二进制数据文件,这些文件是管理软件在与真实的磁盘阵列交互时,保存下来的网络包,用于给虚拟盘阵进程提供数据。采用另一台计算机B并在其上安装待测试的网络存储管理软件。最后,将计算机A、B通过局域网连接。
步骤二、根据测试要求,确定出需要模拟的磁盘阵列个数,以及管理软件与虚拟盘阵通信的IP地址范围。之后,按照IP地址覆盖的网段个数,在计算机A上有选择地运行若干个Linux系统,虚拟盘阵运行在每个Linux系统上。一个虚拟盘阵由一个UDP Server进程和一个TCP Server进程构成,每个虚拟盘阵被分配一个IP地址,UDP Server进程和TCP Server进程监听同一IP地址上的不同端口。
步骤三、运行计算机B上的网络存储管理软件。根据步骤二中确定的IP网段个数及起止地址范围,管理软件的主程序循环调用UDP Client线程。该线程依次给每个网段内的每个虚拟盘阵的UDP Server进程发送一个UDP包,以探测该盘阵的状态和类型。如果在规定时间内UDP Client没有收到来自该虚拟盘阵的UDPServer进程发出的响应包,则认为该IP地址所在的设备不是瞒足条件的磁盘阵列;如果收到了响应信息,则UDP Client线程就把该虚拟盘阵的IP地址记录在一个公共数组中。之后,主程序时刻监测公共数组的变化,当发现有新的IP地址加入数组就立刻调用TCP Client的线程。该线程会向上述IP地址所属的虚拟盘阵的TCP Server进程发起一个TCP连接,要求对应的虚拟盘阵模拟完成读操作或者写操作。根据存储软件管理盘阵的私有协议,接受连接的虚拟盘阵TCP Server进程会解析TCP信息包中的操作命令,从而模拟执行读/写的操作,读取相应的二进制文件内容,并把结果返回给TCP Client线程。
经过上述步骤,一次基于盘阵虚拟化的网络存储管理软件的测试过程即可结束。由于一个Linux系统的单块网卡可以设置多个IP地址,每个IP地址可以与一个虚拟盘阵绑定,因此一个Linux系统上可虚拟出多个盘阵,如图1所示。
在上述测试过程中,每个虚拟盘阵的UDP Server进程和TCP Server进程分别与主程序中的UDP Client线程和TCP Client线程交互,模拟出真实盘阵在管理软件测试中响应UDP包并根据管理命令要求执行读/写数据的操作。其中,UDPServer进程的运行以IP地址和UID标识作为参数,TCP Server进程仅以IP地址作为参数。下面具体介绍这两个进程的执行过程:
◆UDP Server进程
实现的功能:响应UDP Client发出的查询包,把虚拟盘阵的硬件信息打包返回给UDP Client线程。如图2所示,具体过程如下:
(1)把进程参数IP地址设置为该虚拟盘阵的通信地址,将参数UID作为虚拟盘阵的硬件标识;
(2)创建一个基于UDP协议的网络套接字sockfd;
(3)初始化sockaddr_in结构的变量,并赋值;
(4)设置sockfd的SO_REUSEADDR属性,以允许UDP Server重启之后原来的IP地址可用;
(5)将网络套接字sockfd与该虚拟盘阵的IP地址和端口进行绑定;
(6)进入无限循环的等待状态,直到接收到UDP Client发来的查询包,记录下Client的IP地址,然后填充本虚拟盘阵的硬件信息如IP地址、UID标识和盘阵类型等作为响应包信息返回给UDP Client。
◆TCP Server进程
实现的功能:响应TCP Client发出的管理请求,根据私有协议解析管理命令,模拟完成相应操作。如图3所示,具体过程如下:
(1)接受进程的输入参数IP地址,将其设置为该虚拟盘阵的通信地址;
(2)创建一个基于TCP协议的网络套接字sd;
(3)设置sd的SO_REUSEADDR属性,以允许TCP Server重启之后原来的IP地址可用;
(4)将网络套接字sd与该虚拟盘阵的IP地址和端口绑定;
(5)在sd上监听到来的TCP连接;
(6)进入循环的等待连接状态,检查每一个到来的连接是否可读,如果可读则接受该连接,记录下TCP Client的IP地址并创建新线程执行TCP Client要求的管理命令;
(7)新线程读取该socket的内容到缓冲区,根据网络存储管理软件的私有协议解析命令内容。如果是读操作,则到Linux系统的特定目录下读取以命令名命名的数据文件并把数据内容打包返回给TCP Client线程;如果是写操作,则需要在特定目录下创建以命令名命名的数据文件并写入数据,从而完成虚拟盘阵的一次读写操作。详细过程如图4所示。
有益效果:
采用本发明方法在测试网络存储管理软件的正确性和有效性时,无需读写远端真实的磁盘阵列,而是把另一台PC机上运行的N个UDP Server进程和N个TCP Server进程看作N个虚拟盘阵,模拟真实盘阵在存储管理软件测试中执行的操作。其中UDP Server进程响应管理软件中UDP Client的查询请求,并把该虚拟盘阵的硬件信息返回;TCP Server进程响应管理软件中TCP Client的管理请求,模拟盘阵所执行的管理命令。与现有技术相比,用虚拟盘阵软件代替真实的盘阵硬件完成网络存储管理软件性能的测试,既降低了软件测试的费用又增加了测试的灵活性,具有极大的实用价值和经济效益。
具体实施方式
下面结合实施例对本发明方法作具体细描述。本发明不仅限于以下实例,凡是利用本发明的设计思路都进入本发明的保护范围之内。
实施例
测试实例预计对600个盘阵进行管理。由于在Linux系统下单个网卡最多可以绑定255个IP地址,因此在计算机A的虚拟机软件上运行3个Linux系统。每个系统的单块网卡绑定200个IP地址,地址范围设置成192.168.4.11~192.168.4.210、192.168.5.11~192.168.5.210和192.168.6.11~192.168.6.210,子网掩码为255.255.255.0。为了模拟真实盘阵读取数据的操作,先将与一台真实磁盘阵列交互时的网络数据包dump到二进制文件里,并部署到这3个Linux系统的相应目录下,这些数据文件用预定义的命令名来命名。例如,目录/usr/tmp/data下分别有文件名为00012100FFFF和000122000A00的数据文件。然后依次启动3个Linux系统上的共600个UDPServer进程和600个TCP Server进程,进程的输入参数IP地址如上述范围,UID范围从1048576变化到1049175。
在计算机B上增加192.168.4.10,192.168.5.10和192.168.6.10三个IP地址,运行计算机B上的网络存储管理软件。从上述在三个Linux系统上设置的IP地址范围可知,该地址覆盖了3个网段,因此管理软件的主程序3次调用UDP Client线程分别在每一个网段内向每个IP地址上的虚拟盘阵发送UDP查询包。如果某个UPD Server接收到UDP查询包就会把跟自己绑定的IP地址、UID标识以及盘阵类型等信息返回给计算机B中的UDP Client线程。该线程如果能在规定时间内收到来自某个IP地址的UDP响应包就认为该IP地址上的虚拟盘阵存在,于是把该IP地址记录在一个公共数组中。随后,管理软件的主程序时刻检测公共数组IP地址的变化,当发现有新的IP地址写入数组,比如192.168.5.121,则主程序调用TCP Client线程向IP地址为192.168.5.121的虚拟盘阵发出TCP连接请求,要求该虚拟盘阵执行读命令。
运行在192.168.5.121上的TCP Server进程监听到来自TCP Client的连接,发现该连接可读,于是建立连接,接着创建新线程实现虚拟盘阵读数据的功能。具体过程如下:先检测此TCP连接的socket数据是否可读,如果可读就循环读出socket中的数据直到全部读出为止。然后根据存储管理软件的私有协议解析出socket数据中的读命令,比如是00012100FFFF,最后就到/usr/tmp/data目录下打开文件名为00012100FFFF的数据文件。如果打开操作成功,就读取文件内容并把文件数据打包返回给TCP Client线程;如果操作不成功,会重新组织一个无数据内容的信息包返回给TCP Client线程。这样,虚拟盘阵的一次读操作就结束了。