一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种存储设备的控制方法、装置及介质与流程

2022-09-07 16:17:58 来源:中国专利 TAG:


1.本技术涉及光纤传输领域,特别是涉及一种存储设备的控制方法、装置及介质。


背景技术:

2.随着人工智能(artificial intelligence,ai)、大数据以及云平台的快速发展,存储需求越来越大,越来越多的用户采用大量的存储作为核心数据储存介质。如何高效的管理多台存储设备,已成为用户建立大数据中心的前提。目前,管理存储设备需要搭建以太网环境,通过安全外壳协议(secure shell,ssh)连接存储设备的ip地址进行管理操作。但很多前端业务平台为了业务的高效运行,基本都是通过光纤交换机组成光纤网络以提供更高的带宽。
3.当前在光纤网络下无法直接管理存储设备,需要额外增加网络交换机,搭建一套用于管理存储设备的以太网环境。这种拓扑增加了网络的复杂性,并且由于一般以太网拓扑下都是带内管理,业务流和管理流复用同一个通道,因此,会存在网络延迟或丢包导致系统不稳定的问题。
4.由此可见,如何使用光纤网络直接管理存储设备是本领域技术人员亟待解决的问题。


技术实现要素:

5.本技术的目的是提供一种存储设备的控制方法、装置及介质,用于实现在光纤网络拓扑下直接管理存储设备。
6.为解决上述技术问题,本技术提供一种存储设备的控制方法,包括:
7.接收用户输入的第一rest请求;
8.将第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备;
9.接收用户输入的第二rest请求,并判断第二rest请求是否为get请求;
10.若是,则接收存储设备反馈的cli数据;
11.若否,则接收存储设备反馈的操作结果。
12.优选地,将第一rest请求转换为scsi指令包括:
13.根据第一rest请求拼装cli命令;
14.将cli命令封装为scsi指令。
15.优选地,在将第一rest请求转换为scsi指令之前,还包括:
16.校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token。
17.优选地,在将第一rest请求转换为scsi指令之前,且在校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token之后,还包括:
18.通过token校验用户的操作权限;
19.若用户具备操作权限,则进入将第一rest请求转换为scsi指令的步骤;
20.若用户不具备操作权限,则进入接收用户输入的第一rest请求的步骤。
21.优选地,根据第一rest请求拼装cli命令包括:
22.解析第一rest请求得到请求参数;
23.拼装请求参数得到cli命令。
24.优选地,在接收存储设备反馈的cli数据之后,还包括:
25.将cli数据封装为rest数据,并展示rest数据。
26.优选地,通过fc链路将scsi指令发送至存储设备包括:
27.根据第一rest请求选择目标fc链路;
28.通过目标fc链路将scsi指令发送至存储设备。
29.为解决上述技术问题,本技术还提供一种存储设备的控制装置,包括:
30.第一接收模块,用于接收用户输入的第一rest请求;
31.转换模块,用于将第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备;
32.判断模块,用于接收用户输入的第二rest请求,并判断第二rest请求是否为get请求;若是,则触发第二接收模块;若否,则触发第三接收模块;
33.第二接收模块,用于接收存储设备反馈的cli数据;
34.第三接收模块,用于接收存储设备反馈的操作结果。
35.为解决上述技术问题,本技术还提供一种存储设备的控制装置,包括:
36.存储器,用于存储计算机程序;
37.处理器,用于执行计算机程序时实现上述存储设备的控制方法的步骤。
38.为解决上述技术问题,本技术还提供一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现上述存储设备的控制方法的步骤。
39.本技术提供一种存储设备的控制方法,该方法接收用户输入的第一rest请求;将第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备;接收用户输入的第二rest请求,并判断第二rest请求是否为get请求;若是,则接收存储设备反馈的cli数据;若否,则接收存储设备反馈的操作结果。可见,该方法将用户输入的第一rest请求转换为scsi指令,通过fc链路将scsi指令发送至存储设备实现在光纤网络拓扑下直接管理存储设备,不需要额外搭建单独的以太网管理网络,简化了组网拓扑,减少了网络的维护成本。
40.此外,本技术所提供的存储设备的控制装置及介质具有与存储设备的控制方法相同的有益效果。
附图说明
41.为了更清楚地说明本技术实施例,下面将对实施例中所需要使用的附图做简单的介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
42.图1为本技术提供的一种存储设备的控制方法的流程图;
43.图2为本技术提供的一种存储设备的控制装置的结构图;
44.图3为本技术提供的另一种存储设备的控制装置的结构图。
具体实施方式
45.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本技术保护范围。
46.本技术的核心是提供一种存储设备的控制方法、装置及介质,用于实现在光纤网络拓扑下直接管理存储设备。
47.为了便于理解,下面对本技术的技术方案所适用的应用场景进行介绍。
48.本技术的存储设备的控制系统包括主机和带外管理模块。
49.主机为本技术的执行主体,其可以通过自身安装的带外管理模块,为用户提供输入表述性状态转移(representational state transfer,rest)请求的信息输入接口,并将接收到的第一rest请求和第二rest请求通过带外管理模块发送至存储设备。
50.在本技术中,带外管理模块包括业务接口模块、协议交互模块和带外通信模块,其中,业务接口模块包括小服务程序(servlet)层和业务逻辑层。servlet层由汤姆猫(tomcat)实现,为用户提供输入第一rest请求和第二rest请求的信息输入接口,负责接收用户输入的第一rest请求和第二rest请求以及返回存储设备反馈的rest响应。业务逻辑层是业务接口模块的核心层,由过滤器模块、路由控制模块和请求处理模块组成,为第一rest请求和第二rest请求开辟处理线程,负责校验、路由以及处理来自servlet层的第一rest请求和第二rest请求,并将存储设备处理第一rest请求的结果返回至servlet层。具体地,过滤器模块负责公共校验,包括校验协议类型、端口号、请求统一资源标识符(uniform resource identifier,uri)、rest分组名和token等;路由控制模块用于根据请求uri和rest分组名将第一rest请求路由至请求处理模块中对应的处理单元进行处理;请求处理模块由多个处理单元组成,每个rest接口分别对应一个处理单元,rest接口接收到第一rest请求后会将其分发至对应的处理单元进行处理,在具体实施中,处理单元通过调用命令行界面(command-line interface,cli)适配器接口处理第一rest请求,将第一rest请求拼装为存储设备的管理命令即cli命令。协议交互模块包括存储管理命令发送单元和管理命令执行结果查询单元,其中,存储管理命令发送单元负责接收来自业务逻辑层的cli命令,并将其封装为数据传输协议指令即小型计算机系统接口(small computer system interface,scsi)指令,由存储设备通过光纤通道(fibre channel,fc)链路映射至主机的scsi设备将scsi指令发送至存储设备;管理命令执行结果查询单元负责将存储设备反馈的cli命令的执行结果返回至业务逻辑层,在具体实施中,存储设备执行完cli命令后,命令执行结果查询单元会将cli命令的执行状态和执行结果存储至消息队列(message queue)中,具体表现为触发带外管理的回调流程之前,message queue会暂存cli命令的执行状态和执行结果,并在带外管理的回调流程触发时将其反馈至业务接口模块。带外通信模块负责遍历存储设备光纤卡的所有端口,根据用户需求选择一条或多条fc链路发送或查询cli命令。
51.为了使本技术领域的人员更好地理解本技术方案,下面结合附图和具体实施方式对本技术作进一步的详细说明。
52.需要说明的是,本技术提供的存储设备的控制方法适用于多种存储设备,例如磁盘、基本输入输出系统(basic input output system,bios)固件等,在此不作限定。
53.图1为本技术提供的一种存储设备的控制方法的流程图,如图1所示,该方法包括:
54.s1:接收用户输入的第一rest请求。
55.s2:将第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备。
56.scsi是一套完整的数据传输协议,其主要功能是在主机和存储设备之间传送命令、状态和块数据。在本实施例中,由于无法直接通过fc链路将第一rest请求传输至存储设备,因此,需要对接收到的第一rest请求进行处理,将其转换为scsi指令,通过fc链路可将scsi指令发送至存储设备以实现通过带外管理的方式使用现有的光纤网络直接管理存储设备。
57.s3:接收用户输入的第二rest请求,并判断第二rest请求是否为get请求;若是,则进入s4;若否,则进入s5。
58.在具体实施中,rest请求包括get请求、post请求、delete请求等多种类型。若第二rest请求为get请求,即说明由第二rest请求转换的scsi指令为查询指令,具体表现为查询存储设备执行解析scsi指令后得到的管理命令所得到的cli数据,因此,在接收到get请求后会进入步骤s4,接收存储设备反馈的cli数据;若第二rest请求不为get请求,而是post请求或delete请求等操作请求,即说明由第二rest请求转换的scsi指令为操作指令而不是查询指令,此时进入步骤s5,接收存储设备执行该操作指令的操作结果。
59.在具体实施中,存储设备接收到scsi指令后,首先会对scsi指令的合法性进行检查,包括检查带外管理操作码(operation code,opcode)是否匹配以及检查数据库容器(container database,cdb)格式是否合法,具体地,可通过检查带外管理opcode的编号判断带外管理opcode是否匹配,另外,可根据预先设计的cli命令表单将scsi指令解析成对应的cli命令,通过检查cli命令的命令名、参数列表及长度判断cdb格式是否合法,例如,若带外管理opcode的编号正确,则说明带外管理opcode匹配,若cli命令的命令名、参数列表及长度均符合cli命令的格式要求,则说明cdb格式合法。若检查得出带外管理opcode不匹配或cdb格式不合法,则存储设备会向带外管理模块返回定义的命令非法的操作结果;若检查得出带外管理opcode匹配且cdb格式合法,则存储设备会进一步检查cli命令的执行状态与执行结果。具体地,若正在执行cli命令,则在接收到get请求时,存储设备会返回cli命令的执行状态为busy状态,即说明此时正在执行cli命令;若cli命令执行错误,则在接收到get请求时,存储设备会封装执行cli命令的错误状态和错误结果,并将其发送至带外管理模块;若cli命令成功执行结束,则在接收到get请求时,存储设备会封装执行cli命令的成功状态和执行结果,并将其发送至带外管理模块。
60.s4:接收存储设备反馈的cli数据。
61.s5:接收存储设备反馈的操作结果。
62.本实施例提供一种存储设备的控制方法,该方法接收用户输入的第一rest请求;将第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备;接收用户输入的第二rest请求,并判断第二rest请求是否为get请求;若是,则接收存储设备反馈的cli数据;若否,则接收存储设备反馈的操作结果。可见,该方法将用户输入的第一rest请求转换为scsi指令,通过fc链路将scsi指令发送至存储设备实现在光纤网络拓扑下直接管理存储设备,不需要额外搭建单独的以太网管理网络,简化了组网拓扑,减少了网络的维护成本。
63.在上述实施例的基础上,为将用户输入的第一rest请求通过fc链路发送至存储设备,需要将第一rest请求转换为scsi指令,本实施例对将第一rest请求转换为scsi指令的步骤进行补充说明。该步骤包括:
64.根据第一rest请求拼装cli命令;
65.将cli命令封装为scsi指令。
66.表1为cli命令的参数定义列表,如表1所示,表1分为header(byte 0-byte5)和data(byte 6-byte n)两部分。下面对表1中的各项参数进行说明。
67.format字段指定parameter data的格式,取固定值0x2即美国信息交换标准代码(american standard code for information interchange,ascii)格式。
68.parameter data length字段指定除参数header部分的长度,即n-5。
69.parameter data为具体的存储设备命令行参数值,不对内容做进一步格式化分类,而是统一填充成一个字段。该字段格式为ascii码格式的参数数据,并以“\0”结尾,最大支持4092个字节。
70.msb为最高有效位,指的是二进制中最高值的bit;lsb为最低有效位,指的是二进制中最低值的bit。
71.表1cli命令的参数定义列表
[0072][0073]
表2为scsi指令的cdb结构表,如表2所示,scsi指令的cdb采用byte-12长度的cdb结构,下面对表2中的各项参数进行说明。
[0074]
operation code字段表示scsi指令的id,根据存储系统实际情况可定义为0xef。
[0075]
cli command type字段表示cli命令类型,当前支持查询类(0x01)和管理类(0x02)。
[0076]
service action字段表示控制指令行为,即区分管理命令发送指令(0x01)和命令执行结果查询指令(0x02),存储设备通过该字段决定执行管理动作或查询动作。
[0077]
host identifier字段为主机身份的标识符,与sequence number配合使用,查询命令执行结果(service action为0x02)时,存储设备会结合该二字段进行查找,host identifier值由主机维护。
[0078]
sequence number字段为命令序列号标记,与host identifier配合用于查找对应命令执行结果,即命令发送指令(service action为0x01)设置后存储设备进行保存,执行结果查询指令(service action为0x02)使用相同sequence number值查询该命令的结果,具体维护策略由主机决定。
[0079]
cli command code字段为存储系统命令编号,根据实际存储系统指定,如创建池为0x01,创建卷为0x02,删除池0x03,删除卷0x04等。
[0080]
parameter list length字段用于指定命令执行请求(service action为0x01)时,指定在data-out buffer中的参数列表长度。当没有参数通过data-out buffer传输时,该字段取值为0000h;当有参数传输时,该字段取值范围为0004h-1000h。
[0081]
allocation length字段用于指定命令结果查询请求(service action为0x02)时,指定host端申请的最大data-in buffer字节数,即输出命令执行结果时传输的最大长度。
[0082]
表2scsi指令的cdb结构表
[0083][0084][0085]
在具体实施中,可根据表1将第一rest请求拼装为cli命令,根据表2将cli命令封装为scsi指令,并由存储设备通过fc链路映射至主机的scsi设备将scsi指令发送至存储设备。对应地,存储设备在接收到scsi指令之后,可根据表1和表2将scsi指令解析成cli命令,并执行该cli命令得到cli命令的执行结果,由存储设备执行cli命令从而实现管理存储设备。
[0086]
本实施例对第一rest请求转换为scsi指令的步骤进行详细说明,先将第一rest请求拼装为cli命令,再将cli命令封装为scsi指令,使得通过fc链路可将存储设备的管理命令发送至存储设备,从而实现在光纤网络下直接管理存储设备。
[0087]
在上述实施例的基础上,为从用户输入的第一rest请求中准确得到用于控制存储设备的第一rest请求,在将第一rest请求转换为scsi指令之前,还需要对所接收到的第一rest请求进行过滤。该步骤包括:校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token。
[0088]
在具体实施中,可校验协议类型是否为fc协议、端口号是否为存储设备的端口号,并校验请求uri、rest分组名和令牌(token)是否正确;若协议类型为fc协议、端口号为存储
设备的端口号且请求uri、rest分组名和token均正确,则说明所接收到的第一rest请求为控制存储设备的请求,此时可将第一rest请求转换为scsi指令,并将scsi指令发送至存储设备以实现使用光纤网络直接管理存储设备,否则说明所接收到的第一rest请求不是用于控制存储设备的请求,因此,不需要将第一rest请求转换为scsi指令并发送至存储设备,而是进入步骤s1,重新获取用户输入的第一rest请求。
[0089]
本实施例在将第一rest请求转换为scsi指令之前,校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token,通过公共校验以过滤得到用于控制存储设备的第一rest请求。
[0090]
在上述实施例的基础上,为提高存储设备的安全性,在校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token之后,还需要检验用户的操作权限。该步骤包括:
[0091]
通过token校验用户的操作权限;
[0092]
若用户具备操作权限,则进入将第一rest请求转换为scsi指令的步骤;
[0093]
若用户不具备操作权限,则进入接收用户输入的第一rest请求的步骤。
[0094]
在具体实施中,可通过token判断用户名与密码是否正确以校验用户的操作权限。具体地,若用户名与密码正确,则说明当前操作的用户具备操作权限,此时可将用户输入的第一rest请求转换为scsi指令,并通过fc链路将scsi指令发送至存储设备实现管理存储设备;而若用户名与密码错误,则说明当前操作的用户不具备操作权限,即可认为用户输入的第一rest请求无效,此时会重新接收用户输入的第一rest请求,直至校验得出用户具备操作权限。可以理解的是,在接收到第二rest请求后,应先校验第二rest请求对应的协议类型、端口号、请求uri、分组名和token,并通过第二rest请求对应的token校验用户的操作权限,以提高安全性。
[0095]
需要说明的是,若校验得出用户不具备操作权限,则会发出提示以提醒用户重新输入rest请求,而若多次校验得出用户不具备操作权限,则会停止接收用户输入的rest请求,并进行告警,以防止攻击者恶意操作攻击存储设备。
[0096]
本实施例在校验第一rest请求对应的协议类型、端口号、请求uri、分组名和token之后,通过token校验用户的操作权限,以防止攻击者恶意操作攻击存储设备,有效提高了存储设备的安全性。
[0097]
在上述实施例的基础上,为准确得到存储设备的管理命令即cli命令,本实施例对拼装cli命令的步骤进行补充说明。该步骤包括:
[0098]
解析第一rest请求得到请求参数;
[0099]
拼装请求参数得到cli命令。
[0100]
在具体实施中,可通过解析用户输入的第一rest请求以得到该第一rest请求对应的请求参数,再根据表1将解析第一rest请求所得到的请求参数拼装为cli命令,进而可将cli命令封装为scsi指令。
[0101]
本实施例在接收到用户输入的第一rest请求之后,解析第一rest请求得到对应的请求参数,通过拼装请求参数可得到存储设备的管理命令即cli命令,以便于后续存储设备执行cli命令,实现管理存储设备。
[0102]
在上述实施例的基础上,由于业务接口模块中的servlet层只能返回rest响应,因
此,在接收存储设备反馈的cli数据之后,还需要对cli数据进行处理。该步骤包括:
[0103]
将cli数据封装为rest数据,并展示rest数据。
[0104]
表3为执行结果查询指令的定义表,下面对表3中的各项参数进行说明。
[0105]
表3执行结果查询指令的定义表
[0106][0107]
service action字段表示控制指令行为,当该字段值为0x3时,控制目标端执行登陆登出处理,取值范围及错误设计同表2。
[0108]
host identifier字段为主机身份的标识符,取值范围及错误设计同表2。
[0109]
login type为登陆操作类型,包括login(01h)和logout(02h)即登入和登出。
[0110]
parameter list length字段用于指定在data-out buffer中的参数列表长度。buffer中paramter header和paramter entry header长度共12字节,规定:user name data长度范围为0-256字节,password data长度范围为0-256字节,故parameter list length取值范围为000ch-020ch。
[0111]
在具体实施中,若第二rest请求为get请求,则可将第二rest请求解析为第二rest请求对应的请求参数,根据表3将第二rest请求对应的请求参数转换为执行结果查询指令;存储设备执行完cli命令之后,若接收到执行结果查询指令,则会将执行结果即cli数据反馈至协议交互模块;协议交互模块接收到cli数据后,会将其封装为rest数据,由业务接口模块中的servlet层返回rest数据至主机中的上层应用,并由上层应用展示rest数据。
[0112]
本实施例通过将cli数据反向封装为rest数据,使得在用户输入的第二rest请求为get请求时,带外管理模块能够将cli命令的执行结果即cli数据返回至上层应用,并由上层应用展示rest数据以使得用户获悉cli命令的执行结果。
[0113]
在上述实施例的基础上,由于存储设备有多个端口,且各端口对应一条fc链路,因此,在将scsi指令发送至存储设备之前,需要选取目标fc链路以通过目标fc链路将scsi指令发送至存储设备。该步骤包括:
[0114]
根据第一rest请求选择目标fc链路;
[0115]
通过目标fc链路将scsi指令发送至存储设备。
[0116]
需要说明的是,当选定目标fc链路后,目标fc链路只用于承载用户的管理控制信息即scsi指令,而不负责承载用户网络的业务信息,以保证能够将scsi指令精准发送至存
processing unit,cpu);协处理器是用于对在待机状态下的数据进行处理的低功耗处理器。在一些实施例中,处理器21可以集成有图像处理器(graphics processing unit,gpu),gpu用于负责显示屏所需要显示的内容的渲染和绘制。一些实施例中,处理器21还可以包括ai处理器,该ai处理器用于处理有关机器学习的计算操作。
[0132]
存储器20可以包括一个或多个计算机可读存储介质,该计算机可读存储介质可以是非暂态的。存储器20还可包括高速随机存取存储器,以及非易失性存储器,比如一个或多个磁盘存储设备、闪存存储设备。本实施例中,存储器20至少用于存储以下计算机程序201,其中,该计算机程序被处理器21加载并执行之后,能够实现前述任一实施例公开的存储设备的控制方法的相关步骤。另外,存储器20所存储的资源还可以包括操作系统202和数据203等,存储方式可以是短暂存储或者永久存储。其中,操作系统202可以包括windows、unix、linux等。数据203可以包括但不限于cli数据等。
[0133]
在一些实施例中,存储设备的控制装置还可包括有显示屏22、输入输出接口23、通信接口24、电源25以及通信总线26。
[0134]
本领域技术人员可以理解,图3中示出的结构并不构成对存储设备的控制装置的限定,可以包括比图示更多或更少的组件。
[0135]
本实施例提供的存储设备的控制装置,包括存储器和处理器,处理器在执行存储器存储的程序时,能够实现上述存储设备的控制方法,效果同上。
[0136]
最后,本技术还提供一种计算机可读存储介质对应的实施例。计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现如上述方法实施例中记载的存储设备的控制方法的步骤。
[0137]
可以理解的是,如果上述实施例中的方法以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本技术的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,执行本技术各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
[0138]
本实施例所提供的计算机可读存储介质包括上述提到的存储设备的控制方法,效果同上。
[0139]
以上对本技术所提供的存储设备的控制方法、装置及介质进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术原理的前提下,还可以对本技术进行若干改进和修饰,这些改进和修饰也落入本技术权利要求的保护范围内。
[0140]
还需要说明的是,在本说明书中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那
些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献