内容


在 IBM PureApplication System 模式工作负载中使用块存储

Comments

简介

IBM® PureApplication® System 2.0 中引入了块存储,该功能将存储与工作负载的生命周期分开了,并且多个虚拟机可共享该存储。块存储增件允许您在模式工作负载中充分利用块存储,但需要使用 REST API 才能利用共享的块存储。本教程介绍了块存储特性并明确展示了如何在您的模式工作负载中使用该特性。

块和共享的块存储卷

块存储卷是原始的存储卷,没有进行格式化或分区。在 PureApplication System Intel® 机架上,块存储使用 VMWare® Physical Mode Raw Device Mapping (pRDM) 来绕过虚拟机文件系统 (VMFS) 并将存储逻辑单元号 (LUN) 直接映射到虚拟机 (VM)。在 pRDM 中,会将来自 VM 的所有 SCSI 命令直接传递到 LUN 并且存储容量可高于 2TB。在 PureApplication System Power 机架上,会像对待 RAW 存储一样来处理块存储卷。而在 PureApplication System Intel 以及 Power 机架上,存储卷最高达 8TB。

您可使用 PureApplication System 存储基础架构(内部块存储)来创建块存储,或者使用现有的外部存储基础架构(外部块存储)来创建。您可将块存储附加到模式工作负载,也可以解除二者的附加关系。还可以在各个机架之间复制内部块存储。在 PureApplication System Intel 机架上,可以将块存储附加到多个 VM 上,这种可共享的块存储称为共享的块存储。

在 PureApplication System 中使用块存储和共享的块存储时,优势在于存储的生命周期与使用存储的模式工作负载分开了。您可独立于工作负载来创建块存储或共享的块存储,并在部署工作负载期间或部署之后将这些存储附加到该工作负载。还可以在工作负载运行期间将工作负载与存储分离开。工作负载完成后的存储持久性被删除了,即使已删除了工作负载,但同时存储仍被附加到该工作负载时也是如此。

下面是块存储的一些典型用例:

  • 重用存储中的数据,方法是在现有的工作负载已下线并且不可恢复时,激活一个新的工作负载
  • 在不同的工作负载上重用存储中的数据
  • 同时在多个工作负载间共享存储(共享的块存储)中的数据

在模式工作负载中使用块存储

PureApplication System 2.0 为 AIX® 和 Linux® 工作负载提供了名为 Default attach block disk 的块存储增件,为 Microsoft® Windows® 工作负载提供了名为 Default windows attach block disk 的块存储增件。您可使用这些增件在部署期间将现有的块存储附加到某个工作负载,或在部署期间创建一个新的块存储并将其附加到工作负载。除了附加存储或解除附加关系,增件还能发现(清理)设备,格式化存储并将其挂载到某个输入挂载点或者卸载该存储。完成部署工作后,可将已附加的块存储解除附加关系,然后重新附加一个不同的新块存储或现有的块存储。该增件不支持共享的块存储,因此必须使用下面讨论的块存储 REST API 才能使用共享的块存储。

图 1. Default attach block disk 增件
Default attach block disk 增件
Default attach block disk 增件

图 1 显示了位于增件目录中的 Default attach block disk 增件。该增件有以下输入字段(添加到工作负载中后,已将环境变量转换为输入字段):

VOLUME_ID
现有块存储的 UUID。在块存储 REST API 中称为 runtimeid。附加现有的磁盘时必须设置此选项。
MOUNT
挂载块存储的挂载点。可选 -- 如果不设置它,则不会挂载该存储。
FILESYSTEM_TYPE
文件系统格式(ext3、ext4、jfs2、NTFS、xfs、NONE)。可选 -- 如果设置了此选项且存储尚未进行格式化,则会格式化存储。 如果提供了文件系统格式,则必须提供挂载点,反之亦然。
VOLUME_NAME
新块存储的惟一名称。附加一个新的块存储时,必须设置此选项。如果设置了此选项,则会创建一个新的块存储并将其附加到工作负载。
DESCRIPTION
可选 -- 新块存储的描述内容。
DISK_SIZE
新块存储的磁盘大小,单位 GB。附加一个新的块存储时,必须设置此选项。
VOLUME_GROUP_ID
可选 -- 现有的卷组,新的块存储与此组相关联。创建新的块存储时可使用此选项。

将现有的块存储附加到某个工作负载时,必须使用 VOLUME_ID、MOUNT 和 FILESYSTEM_TYPE。创建新的块存储并将其附加到某个工作负载时,必须使用除 VOLUME_ID 以外的其他字段。如果想使用 “创建新卷并附加” 选项,则不要提供 VOLUME_ID 值。如果提供了 VOLUME_ID 值,则会忽略为 “创建新卷并附加” 选项所提供的值。

您可将块存储增件添加到 Virtual System Pattern (VSP) 工作负载和 Virtual System Pattern Classic (VSP Classic) 工作负载。使用 Virtual Application Pattern (VAP) 时,必须使用下面讨论的块存储 REST API 来附加块存储和解除附加关系。块存储增件对 VSP 工作负载的支持要比对 VSP classic 的支持更好。以下各节介绍在每种模式工作负载中的增件支持情况。

在 VSP 工作负载中使用块存储增件

可使用 Pattern Builder 将块存储增件添加到 VSP 中。图 2 显示了 VSP 与块存储增件:

图 2. VSP 工作负载与 default attach block disk 增件
VSP 工作负载与 default attach block disk 增件
VSP 工作负载与 default attach block disk 增件

在 Pattern Builder 中将块存储增件添加到 VSP 时,您可输入挂载点和文件系统类型的值。其他的增件值将在部署工作的分发阶段中输入,因为这些值取决于工作负载的放置位置。图 3 显示了该流程。在部署期间,您可创建和附加一个新的块存储,或者附加一个现有的块存储:

图 3. VSP 工作负载块存储增件的输入
VSP 工作负载块存储增件的输入
VSP 工作负载块存储增件的输入

在部署期间,如果提供了挂载点的值,那么增件会对存储进行格式化(如果存储尚未格式化),然后将存储挂载到 VM 中的相应挂载点。对于图 3 中部署的 VSP,增件会将存储格式化为 ext3 格式并将存储挂载到目录 /data,如图 4 所示。如果挂载点的值为空,那么会将存储附加到 VM 节点,但不会发现该存储并将其挂载到该节点 -- 您必须连接到该 VM 并手动挂载该存储。

图 4. VSP 工作负载 VM 与已挂载的块存储
VSP 工作负载 VM 与已挂载的块存储
VSP 工作负载 VM 与已挂载的块存储

部署工作完成后,可在 VSP 实例页中查看已附加的块存储:进入 VSP 实例页,选择已部署的实例,展开 VM 透视图,然后展开块存储已附加到的 VM 节点。在这个实例页中,可解除块存储的附加关系,然后重新附加不同的块存储。同样,此时也可以创建一个新的块存储并附加它。图 5 显示为图 3 中所部署的 VSP 执行部署后的存储操作。使用部署后附加或创建和附加操作,可以只重新附加存储并将其挂载到在模式部署时使用块存储增件所定义的挂载点上。您不能在已部署实例的页面上创建一个临时挂载点,然后将存储附加和挂载到这个临时挂载点上。

图 5. VSP 部署后块存储操作
 VSP 部署后块存储操作
VSP 部署后块存储操作

在 VSP Classic 工作负载中使用块存储增件

与 VSP 一样,也可使用 VSP Classic Pattern Editor 将块存储增件添加到 VSP Classic 工作负载中。与 VSP 还相同的是,您可在 Pattern Editor 中输入挂载点和文件格式的值。部署 VSP Classic 工作负载的同时还必须输入其他字段的值。在部署时,您可选择一个现有的块存储,或者新建一个块存储并附加它。VSP 与 VSP Classic 之间的一个重要差别是:在 VSP Classic 中,没有关于块存储的部署后操作。部署块存储后,不能解除附加关系或重新附加该块存储。使用 VSP Classic 时,一旦完成了部署,块存储的行为就和 RAW 存储一样。图 6 显示了使用块存储增件来创建和部署 VSP Classic 工作负载。

图 6. VSP Classic 工作负载与 Default attach block disk 增件
VSP Classic 工作负载与 Default attach block disk 增件
VSP Classic 工作负载与 Default attach block disk 增件

在 VAP 工作负载中使用块存储

如前所属,要想在 VAP 工作负载中利用块存储,必须使用块存储 REST API,下节将介绍此内容。我们使用脚本包来解释 REST API 的使用。您可在 VAP 生命周期 python 脚本中使用相同的技术,在 VAP 工作负载部署期间附加块存储,也可在操作 python 脚本中使用该技术,通过 VAP 工作负载实例控制台来解除附加关系以及重新附加块存储。

重要: 在 IBM PureApplication Software 中,您不能在 VSP 和 VSP Classic 中使用创建和附加选项。IBM PureApplication Software 是 PureApplication System 的内部部署版本,于 2015 年 2 月发布。

块存储 REST API

块存储 REST API 可支持:

  • List PureApplication System 块存储和共享的块存储
  • 附加块存储和共享的块存储以及解除附加关系
  • 监视附加和解除附加操作的状态
  • 列出已附加到工作负载节点的存储

如前所述,块存储 REST API 的典型用例是将块存储附加到 VAP 工作负载或解除附加关系,或者将共享的块存储附加到 VAP 或 VSP 工作负载或解除附加关系。下面是使用块存储 REST 调用时的一些要求和限制:

  • 执行 REST API 的代码必须能访问 maestro python 模块。
  • 发送到服务器的 REST 请求必须拥有相应的安全标头,可使用 maestro 模块 API 构建该标头。清单 1 显示了如何使用 maestro 模块 API 和必需的标头来构建并执行 cURL 调用。
  • 您只能在执行 REST 调用的部署工作中将卷附加到工作负载或者解除卷与工作负载的附加关系。

有关 maestro python 模块的更多信息,参见 PureApplication System 知识中心内的 插件开发工具包插件开发指南

清单 1. 使用 maestro 模块执行 REST 调用
import maestro
...
#Get user token
user_token=None
try:
if maestro.operation:
	user_token=maestro.operation.get('user_token')
except:
	logger.debug('executeREST no user_token')
#Get security header
securityHeader=None
if(user_token != None):
	securityHeader = maestro.get_authn_header(user_token)
else:        
	securityHeader = maestro.get_authn_header()
#Get the pem file from SSL options
sslOpts = os.environ.get("CURL_SSL_OPTION")
garb, sslOpts = sslOpts.split()
#Output file to save the response.
outputFile = '/tmp/resp_file'
cmd = ["-X", str(method), "-H", '%s' %securityHeader,
	"-H", "Content-Type:application/json",
	"-v", "-o", outputFile, "--url", str(url), "--cacert", sslOpts]
#Execute cURL command using maestro API
rc = maestro.pcurl.main(cmd)

下面的表 1 总结了您可调用的 REST 资源,使用这些资源可列出所有 PureApplication System 块存储、附加 PureApplication System 块存储、解除 PureApplication System 块存储的附加关系、监视附加或解除附加操作的状态,以及检索 VM 工作负载节点所使用的存储。有关这些资源的详细描述,请参见 PureApplication System 知识中心内的 块存储 REST API

表 1. 块存储 REST 资源
资源描述
GET operation on /services/resources/sharedDisks列出 PureApplication System 块存储。
PUT operation on /services/resources/sharedDisks将存储附加到当前部署中的 VM 工作负载节点/解除此类附加关系。
GET operation on /services/resources/tasks/{taskId}
/deployments/{depUUID}/virtualMachines/{vmNodeId}
/sharedDisks/{ sharedDiskId }
监视块存储附加/解除附加关系的操作状态。
GET operation on /services/resources/virtualMachines/{vmNodeId}/
deployments/{depUUID}/sharedDisks
列出已附加到 VM 工作负载节点的块存储。

在工作负载中使用共享的块存储

本节展示如何利用表 1 中所列的 REST API 将共享的块存储附加到模式工作负载(以及解除附加关系)。相同的流程也可用于块存储。下面的图 7 展示了附加和解除附加块存储的 REST API 流:

图 7. 附加或解除附加一个共享的块存储的流程图
附加或解除附加一个共享的块存储的流程图
附加或解除附加一个共享的块存储的流程图

将存储附加到工作负载节点流

如图 7 所示,附加流包含以下操作步骤:

  1. 获得要附加到工作负载节点的存储的名称。
  2. 检查该存储是否存在(在 services/resources/sharedDisks 上执行 GET 操作)。
  3. 将存储附加到工作负载节点(在 services/resources/sharedDisks 上执行 PUT 操作)。
  4. 监视附加操作的状态(在 /services/resources/tasks/{taskId}/deployments/{depUUID}/virtualMachines/ {vmNodeId}/sharedDisks/{ sharedDiskId } 上执行 GET 操作)。

这种附加流以 “第 3 步 -- 将 PureApplication System 块存储附加到工作负载节点” 为中心。必须为该请求(在 services/resources/sharedDisks 上执行 PUT 操作)提供的输入是:

runtimeid
该存储的惟一标识符。检索该值的方法是:在 services/resources/sharedDisks 上执行 GET 方法,检索所有的存储,然后根据输入存储名对结果进行过滤。
deploymentId
当前部署标识符。可使用清单 2 中的 maestro 模块 API 获取该信息。
vmId
当前工作负载 VM 节点标识符。同样可使用清单 2 中的 maestro 模块 API 获取该信息。
opType
附加的操作类型值。
清单 2. 检索当前部署 ID 和 VM 节点 ID 的代码
#Get current deployment identifier
deployment_id=maestro.node['deployment.id']
#Get current VM node identifier
vmId = maestro.node['id']

清单 3 显示附加 REST 请求的示例输入:

清单 3. 附加 REST 请求的输入
{
 "deploymentId":"d-b3daf24c-5f08-45a1-aa97-5a3536ec55c3",
 "vmIds":["OS_Node_1.11426549311727"],
 "runtimeid":"0b21e087-0d4e-4494-a5c2-be07e8ddf7b8",
 "opType":"attach"
}

对附加 REST 请求的响应 JSON 中包含了附加操作的惟一标识符 (taskId),以及存储的惟一标识符 (sharedDiskId)。清单 4 显示了对附加 REST 请求的响应示例:

清单 4. 对附加操作的响应
{
   "taskId": 4650,
   "sharedDiskId": 49,
   "diskId": 141,
   "vmIds":["storehouseupload2.11402609366120"],
   "deploymentId":"d-ad1459a9-82d4-4121-84f8-a2715aa2ab8f"
}

附加操作是一种异步操作,所以必须定期监视其状态,以确定该操作成功与否。您可使用监视附加操作状态的 REST 调用所返回的响应来监视附加操作的状态,如下所示:

GET operation on /services/resources/tasks/{taskId}/deployments/{depUUID}/virtualMachines/ 
{vmNodeId}/sharedDisks/{sharedDiskId}

您可使用清单 2 中显示的代码来获得部署标识符的值 (depUUID ) 和工作负载 VM 节点标识符 (vmNodeId)。可通过对附加 REST 调用的响应来获得 taskId 和 sharedDiskId 的值(清单 4)。监视附加操作状态调用可返回以下状态之一:ATTACHING、ATTACHED 或 ATTACH_FAILED。如果状态为 ATTACHED,则还会返回存储卷的 LUN 标识符。如果计划在附加操作后立即将设备挂载到工作负载节点,就可使用该 LUN 标识符来确定 SCSI 驱动器 (/dev/sd*) 并将设备挂载到工作负载节点上的挂载点。清单 5 显示了监视附加操作状态的响应示例:

清单 5. 对监视附加操作状态请求的响应
{
	"currentstatus": "ATTACHED",
	"lunId": "60050768028503D3080000000000018B"
}

解除存储与工作负载节点的附加关系

如图 7 所示,解除附加关系包括以下步骤:

  1. 获得要与工作负载节点解除附加关系的存储的名称。
  2. 检查存储是否已附加到该工作负载(在 /services/resources/ virtualMachines/{vmNodeId}/deployments/{depUUID}/sharedDisks?runtimeid={runtimeid} 上执行 GET 操作)。
  3. 解除存储与工作负载节点的附加关系(在 services/resources/sharedDisks 上执行 PUT 操作)。
  4. 监视解除附加操作的状态(在 /services/resources/tasks/{taskId}/deployments/{depUUID}/virtualMachines/ {vmNodeId}/sharedDisks/{ sharedDiskId } 上执行 GET 操作)。

解除附加关系流中的第 3 步和第 4 步与附加流中的步骤类似。第 3 步中的差别是,解除附加关系操作的 opType 请求值是 detach,而不是 attach。在第 4 步中,差别是监视解除附加关系操作状态调用的响应值是 DETACHING、DETACHED 或 DETACH_FAILED。附加流与解除附加流之间的关键区别是:在解除附加流中,您必须先验证存储是否已附加到工作负载节点,然后才能解除其附加关系,使用以下 REST 调用可验证该内容:

GET operation on /services/resources/ virtualMachines/{vmNodeId}/deployments/{depUUID}/ 
    sharedDisks?runtimeid={runtimeid}

您可使用清单 2 中显示的代码来获得部署标识符的值 (depUUID ) 和工作负载 VM 节点标识符 (vmNodeId)。检索 runtimeid 值的方法是:在 services/resources/sharedDisks 上执行 GET 方法,检索所有的存储,然后根据输入存储名对结果进行过滤。如果存储已附加到工作负载节点,那么通过调用来确认存储是否已附加到工作负载节点时,所返回的响应中会包含存储的详细信息并且 currentstatus 属性被设为 ATTACHED。清单 6 显示了此调用的一个响应示例:

清单 6. 对已附加到工作负载节点的存储进行检索请求的响应
[
   {
      "shared": "T",
      "virtualmachineid": 488,
      "lunId": "60050768028503D30800000000000124",
      "runtimeid": "e60a2db9-f5ae-4b86-b0bc-9351d3272562",
      "type": "ext4",
      "currentstatus": "ATTACHED",
      "size": "1024",
      "id": 110,
      "mount": "/test",
      "updated": 1402080762629,
      "created": 1402080728268,
      "name": "NewDisk",
      "diskid": "30"
   }
]

使用示例

您可 在本教程底部的内容中下载示例代码。其中有三个 脚本包:一个将 PureApplication System 块存储附加到节点 (BlockStorageAttach-1.0.0.0.zip),一个解除 PureApplication System 块存储与节点的附加关系 (BlockStorageDetach-1.0.0.0.zip),第三个列出了已附加到节点的存储 (BlockStorageList-1.0.0.0.zip)。每个脚本包都包含一个定义脚本包的 cbscript.json 文件,一个 python 文件(BlockStorageAttach-1.0.0.0.zip 中是 attach.py,BlockStorageDetach-1.0.0.0.zip 中是 detach.py,BlockStorageList-1.0.0.0.zip 中是 list.py),用于驱动块存储 REST API 调用。要将这些示例导入 PureApplication System,可选择 Catalog => Script Packages => Create New。完成导入后,可将它们添加到 VSP Pattern 节点中,如图 8 所示:

图 8. VSP Pattern,包含已导入的示例脚本包
VSP Pattern,包含已导入的示例脚本包
VSP Pattern,包含已导入的示例脚本包

我们已配置了脚本包,可使用 VM 节点脚本名称旁边显示的 Execute 链接手动开始执行该脚本包,所以您可保留脚本包输入的默认值不变并部署该模式。已部署的模式 VM 工作负载节点都会列出这三个脚本,如图 9 所示。我们在 remote_std_out.log 中捕获了脚本包的执行输出。

图 9. 已部署的 VSP Pattern 与示例脚本包
已部署的 VSP Pattern 与示例脚本包
已部署的 VSP Pattern 与示例脚本包

测试示例脚本包

要想测试该示例脚本包,单击脚本包名称旁边的 Execute。执行 BlockStorageAttach 脚本包时,应该看到如图 10 所示的输入对话框。BlockStorageAttach 脚本包使用以下输入:

Block Storage Name
要附加到该节点的块存储的名称。attach.py 中的代码会检索附加 REST 调用中使用的相应存储标识符 (runtimeid)。
File System Type
块存储的文件系统格式类型。如果提供了该值,附加完成后可使用该信息对存储进行格式化。
Mount Point
如果提供了该值,可使用该信息将存储挂载到节点上的挂载点。
Type of storage
值可以是 Block 或 Shared Block。可使用该信息来过滤已检索到的块存储列表,从而获得存储标识符 (runtimeid)。
Attach if the shared block storage is already used
如果希望附加一个当前已附加到其他节点的磁盘,则为 True,否则为 false。只有存储类型为 Shared Block 时才会考虑该值。
图 10. BlockStorageAttach 脚本包的输入
BlockStorageAttach 脚本包的输入
BlockStorageAttach 脚本包的输入

图 10 显示的输入信息用于将一个共享的块存储 BM03 附加到当前的工作负载节点,即使该存储已附加到其他工作负载节点也是如此。为脚本包提供的输入信息存储在环境变量中。脚本 attach.py 使用代码让 BlockStorageAttach 脚本包从环境变量中检索输入值,如清单 7 所示:

清单 7. 用 python 脚本检索脚本包的输入
def getInput():
    input = {}
    env_data = dict(os.environ)    
    for key in ("VOLUME_NAME","FILESYSTEM_TYPE","MOUNT_POINT", "TYPE", "INUSE"):
        if key in env_data:
            input[key] = env_data[key]       
    return input

由于需要将输入存储名称转换为标识符 (runtimeid),所以脚本首先在 /services/resources/sharedDisks?type=< Type of storage > 上执行 GET 操作来检索该存储。然后根据输入名称进一步过滤所返回的响应。之后脚本构建清单 3 中所示的附加操作的 JSON 输入,并使用清单 1 中所示的代码执行 REST 调用。脚本会监视附加操作的状态,直到附加操作的状态为 ATTACHED 或 ATTACH_FAILED。系统将附加操作的状态记录到 remote_std_out.log 中,如图 11 所示,其中还显示了附加操作的 REST 调用栈:

图 11. BlockStorageAttach 脚本包执行日志
BlockStorageAttach 脚本包执行日志
BlockStorageAttach 脚本包执行日志

示例代码中没有提供脚本 id,因此没有将存储格式化为输入字段 file system type 中所指定的类型,也没有将存储挂载到输入 mount point。但是您可使用以下方法,编写一个标准的 shell 脚本来执行这些操作:

  • 刷新系统中的设备。
  • 使用监视附加状态操作调用(清单 5)所返回的 LUN ID,获得要附加的存储的 SCSI 驱动器 (/dev/sd*)。
  • 检查是否已格式化了设备,如果没有,格式化该设备。
  • 将设备挂载到挂载点。

要列出已附加到某个节点的存储,可执行 BlockStorageList 脚本包。该列表会出现在 remote_std_out.log 中,如图 12 所示:

图 12. BlockStorageList 脚本包执行日志
BlockStorageList 脚本包执行日志
BlockStorageList 脚本包执行日志

执行 BlockStorageDetach 脚本包时,应该看到如图 13 所示的输入对话框。BlockStorageDetach 脚本包使用以下输入内容:

Block Storage Name
要与此节点解除附加关系的块存储的名称。detach.py 脚本中的代码会检索解除附加 REST 调用中要使用的相应存储标识符 (runtimeid),
Type of storage
该值可以是 Block 或 Shared Block。该信息用于过滤已检索到的块存储列表,以得到存储标识符 (runtimeid)。

图 13 显示的输入用于解除名为 BM03 的共享块存储的附加关系:

图 13. BlockStorageDetach 脚本包的输入
BlockStorageDetach 脚本包的输入
BlockStorageDetach 脚本包的输入

与附加脚本类似,解除附加脚本会从环境变量中检索输入信息并将存储名称转换为 runtimeid。然后脚本会检查该存储是否已附加到节点,方法是通过列出已附加到工作负载节点的块存储调用。如果该存储已附加到节点,则脚本会为清单 3 中类似的解除附加操作构建 JSON 输入,并使用清单 1 中所示的代码执行 REST 调用。该脚本监视解除附加操作的状态,直到解除附加操作的状态为 DETACHED 或 DETACH_FAILED。解除附加操作的状态被记录到 remote_std_out.log 中,如图 14 所示,其中还显示了解除附加操作的 REST 调用栈:

图 14. BlockStorageDetach 脚本包的执行日志
BlockStorageDetach 脚本包的执行日志
BlockStorageDetach 脚本包的执行日志

结束语

在本教程中,您了解了 PureApplication System 2.0 中的块存储支持,如何以及何时在 VSP 和 VSP Classic 工作负载中使用块存储增件。您还了解了如何使用块存储 REST API 在 VSP 工作负载中利用共享的块存储,在 VAP 工作负载中利用块存储和共享的块存储。利用本文提供的示例代码,您应该能够为您的 VAP 工作负载提供共享的块存储支持,并且能够在 VSP 工作负载生命周期中重用代码和操作脚本,在 VAP 工作负载中支持块存储和共享的块存储。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing, WebSphere
ArticleID=1004520
ArticleTitle=在 IBM PureApplication System 模式工作负载中使用块存储
publish-date=04292015