概述
PowerVM 是 IBM 的一种虚拟化平台。通过 PowerVM 可以最大限度的利用服务器资源,其 CPU 资源可以细化到 0.01(微分区),具有动态内存共享和实时迁移等高级性能。IBM Systems Director VMControl 简化了 PowerVM 环境中的虚拟机(后面简称虚机)部署、映像管理等功能。在虚机部署方面,通过 VMControl,部署一台虚机只需要一个操作;而如果利用传统的 HMC 和 NIM,则需要先在 HMC 上创建一个虚机,为其分配存储和网络,然后再利用 NIM 来实现网络安装操作系统。在映像管理方面,VMControl 提出了“虚拟设备(Virtual Appliance)”的概念,虚拟设备存储在一个映像存储库中,VMControl 可以自动发现映像存储库及其上的所有虚拟设备。虚拟设备可以从多种来源获得,且可以方便的被 VMControl 管理。
有三种方法可以使用 VMControl 来实现虚拟环境的部署:VMControl 的控制台界面,VMControl 的命令行接口以及 REST API 接口。对于应用程序而言,可以调用命令行或 REST API 接口。当前已有的资料对两种接口的描述比较分散,对一些参数的使用解释不太详细,本文根据实践经验说明接口的详细使用,并结合前期的环境准备给出一个完整的虚拟环境搭建过程。
环境准备
PowerVM 环境准备
PowerVM 的基础环境包括:
- 至少一台 Power 主机作为虚机的物理宿主。
- 一个 HMC 服务器用于管理多个 Power 主机,并和 Systems Director 进行通信。
- VIO 服务器用于实现动态分区功能(DLPAR),为虚机提供虚拟的存储和网络资源。
创建虚拟机的 CPU 和内存资源可以直接从主机得到;磁盘存储可以从主机得到,也可以来自于外来存储;网络资源从主机的物理网卡中虚拟出来。VIO 服务器负责存储和网络的虚拟化,下面分别介绍基于 VIO 服务器的存储和网络的环境准备。
- 存储环境初始化
在此介绍一种较为简单的存储虚拟化方式:VIO 服务器通过虚拟的 SCSI 方式将存储映射成逻辑卷分配给不同的虚机。
在 HMC 界面上,进入到主机的配置目录,展开到“虚拟资源”中的“虚拟存储管理”(virtual storage management),点击进去查询 VIO 服务器。在查询得到的界面中,可以创建存储库和虚拟磁盘。创建存储库如图 1 所示。
图 1. 创建存储库
如图 1 所示,我们创建了存储库“lparvg”。此时我们再创建一块虚拟磁盘,如图 2 所示。
图 2. 创建虚拟磁盘
如图 2 所示,我们创建了一块 20G 大小的名为“tempdisk”的磁盘。此块磁盘即可以作为以后创建虚机时所用的磁盘。
- 网络环境初始化
如果要让创建的虚机能够和 VIO 服务器以及其他虚机进行内部通信,则需要在 VIO 服务器上建立至少一个虚拟局域网(VLAN)。如果虚机还需要同外部网络进行通信,则需要在 VIO 服务器上创建共享网络适配器(SEA)。SEA 和 VLAN 的关系图如图 3 所示。
图 3. SEA 和 VLAN
(1)创建 VLAN 可以在 HMC 界面上进行:
打开 VIO 服务器的概要文件(Profile)的虚拟适配器页面,或者定位到 VIO 服务器的“动态逻辑分区”的实际虚拟适配器界面上,选择创建“网络适配器”,则出现以下界面如图 4 所示。
图 4. 创建 VLAN
如图 3 所示,创建 VLAN 时提供 VLAN 的 ID(如果提供的 ID 不是已有的,则会创建一个新的 VLAN),然后选择需要“访问外网”。
(2)创建 SEA 需要在 VIO 服务器上运行命令:
$ mkvdev -sea ent0 -vadapter ent1 -default ent1 -defaultid 1
在运行命令之前,首先需要在 VIO 服务器上创建虚拟以太网适配器 ent1,然后用此命令将 ent1 与物理以太网适配器 ent0 连接起来。
VMControl 环境准备
VMControl 环境准备主要包括将 HMC 所管理的 Power 环境加入到 Systems Director 中,并发现映像存储库和其中的映像。在 IBM Systems Director 和其插件 VMControl 都安装完成后,打开控制台界面,在界面上即可完成这些操作。
- HMC 发现
在 Systems Director 的控制台界面上,定位到“System Discovery”,输入 HMC 的 IP 地址,点击“Discovery Now”,如图 5 所示。
图 5. HMC 发现
当发现完成后,会出现 HMC 和其操作系统。输入 HMC 的访问用户名和密码,则 HMC 所管的所有 Power 主机和虚机都会出现在 Systems Director 的资源库里,并以树形方式显示。
- 映像发现
VMControl 需要映像库储存各种操作系统和应用的映像。我们采取 NIM 作为映像存储库。在部署第一个虚机之前,需要准备至少一个映像用于部署。
发现映像存储器的步骤如下:
- 配置 NIM 主机
- 在 VMControl 界面上安装代理到 NIM 主机所在的机器
- 安装代理成功后,选择发现映像存储器,从而将存储器里面的映像都能显示在虚拟设备列表中。
映像存储器发现之后,如果里面没有任何虚拟设备,需要准备至少一个虚拟设备。可以采取以下方法获取一个虚拟设备:
- 捕获(capture)一个已存在的虚机或者工作负载
- 从 NIM 上导入 mksysb 文件或者 lpp_source 文件
使用命令行接口搭建 PowerVM 虚拟环境
利用 VMControl 可以方便地将虚拟设备部署成运行状态的虚拟环境。有两种方式来部署虚拟环境:
(1)用虚拟设备创建一台新的虚机
(2)将虚拟设备部署到已经存在的虚机上
下面详细介绍如何使用命令行来实现这两种方法。
使用虚拟设备直接创建虚机
使用虚拟设备直接创建一台虚机时,VMControl 提供了命令行接口 deployva 。接口 deployva 的参数中要指定将哪个虚拟设备部署到哪个主机上,同时指定虚机的配置参数。具体步骤如下所示。
步骤一:取得虚拟设备的唯一标识号(OID)
通过 lsva 命令得到所有的虚拟设备,加上 -o 参数可以得到虚拟设备的 OID。
步骤二:取得主机的 OID
#smcli lssys -o -n AUSP5N |
通过 lssys 命令指定主机的名称(AUSP5N),加上 -o 参数来得到主机的 OID。
步骤三:获取可用的存储和网络
#smcli lscustomization -a deploy_new -V 3648 -s 0xd56 |
通过 lscustomization 参数得到可以定制化的参数,尤其是为了得到可用的存储和网络资源。其中 -V 参数指定虚拟设备的 OID,-s 参数指定主机的 OID。 此命令运行结果中,需要注意的有 virtualnetworks 结果和 poolstorages 结果。
可以看到已有的虚拟网络是“Network 1”。
可以看到已有的存储库有 lparvg 和 rootvg。
步骤四:部署虚拟设备创建虚机,示例代码如清单 1 所示。
清单 1. 部署虚拟设备创建虚机
smcli deployva -v -s 0xd56 -V 3648 -a deploy_new -A "poolstorages =lparvg:VIOS VIOS,
CPUshared=1, CPUmode=SHARED, memsize=1024, memmax=2048,
virtualnetworks[Network 1]=hostVnet:ETHERNET0/1,
product.AIX1.com.ibm.ovf.vim.2.system.hostname=client2,
product.AIX1.com.ibm.ovf.vim.2.system.domainname=ibm.com,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.ip=172.16.3.6,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.netmask=255.255.240.0,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.gateway=172.16.0.1,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.dns1.ip=172.16.0.2"
|
此 deployva 命令,指定 -a 参数为 deploy_new 则是创建虚机,-A 参数中指定了所创虚机的配置参数,包括 CPU、内存大小,磁盘所用的存储库,虚拟网络及 IP 相关参数。此命令运行一般需要几十分钟,运行结束后表示虚机部署完成,部署完成后的虚机磁盘大小将和所用的虚拟设备相同。
在已有虚机上部署虚拟设备
可以选择一个已有的虚机,不管虚机是否已经安装操作系统,部署虚拟设备。如果是还未安装操作系统的虚机(空虚机),则部署完成后虚机将有了和虚拟设备一样的操作系统及应用;如果是已经有了操作系统的虚机,则已有的系统会被新的虚拟设备所覆盖。
本节将先介绍如何创建一个空的虚机,然后在空的虚机上部署虚拟设备。
- 创建空虚机
(1)首先运行命令取得创建空虚机可以定制的参数:
smcli lsvrtcap -n AUSP5N -c mkvs -A "IBM Power - AIXLINUX" |
利用 lsvrtcap 命令用 -n 参数指定主机,-A 参数指定虚机类别来得到在创建空虚机时可以定制的参数。
此命令的运行结果中需要注意的是 networks、disks:
可以看到 networks 的 key 值是 1。
可以看到可用的虚拟磁盘包括 tempdisk 和 lp3vd1.
(2)在得到可以定制的参数之后,可以运行 mkvs 命令来创建空虚机,如:
清单 2. 创建空虚机
smcli mkvs -A "name=client3, gos=IBM Power - AIXLINUX, CPUshared=2,CPUmode=SHARED,
memsize=2048, networks=+1, disks=+tempdisk:lparvg:VIOS" AUSP5N
|
命令中指定的 networks 和 disks 即是从上一步骤中得到的可配置参数。创建好的虚机磁盘大小即为指定的虚拟磁盘大小。
(3)运行命令启动空虚机
smcli rpower -n "client3" PowerOn |
- 将虚拟设备部署到空虚机上
在空虚机创建之后,就可以将虚拟设备部署上去。
(1)首先运行命令得到可配置参数
smcli lscustomization -a deploy_existing -V 3648 -s 0x1583 |
运行 lscustomization 指定类别是 deploy_existing,-V 指定虚拟设备的 OID,-s 指定空虚机的 OID,可用上节所述命令得到这些 OID。
(2)部署虚拟设备到空虚机上,示例代码如清单 3 所示。
清单 3. 部署虚拟设备到已有虚机上
#smcli deployva -v -s 0x1583 -V 3648 -a deploy_existing -A '
product.AIX1.com.ibm.ovf.vim.2.system.hostname=client3,
product.AIX1.com.ibm.ovf.vim.2.system.domainname=ibm.com,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.ip=172.16.3.7,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.hostname=client3,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.gateway=172.16.0.1,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.netmask=255.255.240.0,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.dns1.ip=172.16.0.2,
product.AIX1.com.ibm.ovf.vim.2.networkport.6.domainname=ibm.com'
|
可以看到将虚拟设备部署到已有虚机上时,命令中主要指定 IP 相关参数即可,因为虚机已经存在,不需要再指定虚机本身的硬件参数如 CPU、内存和磁盘存储等。此命令运行一般也需要几十分钟,待命令结束,登录已有的虚机,将看到新部署的系统环境而非原来的系统。
小结
使用 VMControl 的命令行接口来搭建虚拟环境,方便快捷。可用于测试 VMControl 和 PowerVM 环境是否准备好;同时在一些脚本后台程序中,调用此命令行接口将会比较方便。
使用 REST API 接口搭建 PowerVM 虚拟环境
除掉命令行接口外,VMControl 还提供了 REST API 接口来搭建 PowerVM 虚拟环境。下面将详细介绍如何使用 Java 实现 REST API 接口来创建一个空的虚机,然后在空虚机上部署虚拟设备,从而得到一个完整的可用的虚机。
创建空虚机
如同使用命令行接口一样,创建空虚机需要首先取得主机的 OID,并得到可以定制的虚机属性
步骤一:取得主机的 OID
发送 GET 请求到 /VMControl/hosts 可以得到所有的主机信息,从中得到所需主机的 OID。
步骤二:取得可以定制的虚机属性参数
发送 GET 请求到 /VMControl/hosts/3461/virtualServers/customization,可以得到在主机(OID 为 3461)上创建一个虚机时所能定制的所有属性参数。
步骤三:创建新虚机
发送 POST 请求到 /VMControl/hosts/hostOID/virtualServers 中(其中 hostOID 是步骤一中得到的主机 OID),示例代码如清单 4 所示。
清单 4. 使用 Java 实现 REST API 创建空虚机
//get SystemsDirectorConnection sdc
String uri =
sdc.getConnectionContextURI() + "/VMControl/hosts/"+hostOID+"/virtualServers";
String requestBody = "{\"virtualServer\":{\"properties\":[" +
"{\"name\":\"gos\", \"value\":\"IBM Power - AIXLINUX\"}," +
"{\"name\":\"name\", \"value\":\""+vmname+"\"}," +
"{\"name\":\"CPUshared\", \"value\":2}," +
"{\"name\":\"CPUmode\", \"value\":\"SHARED\"}," +
"{\"name\":\"memsize\", \"value\":2048}," +
"{\"name\":\"memunitsize\", \"value\":\"MB\"}," +
"{\"name\":\"networks\", \"value\":1}," +
"{\"name\":\"disks\", \"value\":\"tempdisk:lparvg:VIOS\"}" +
"]}}";
HttpsURLConnection dataConnection = sdc.processRequest(uri, "POST", requestBody);
int rc = dataConnection.getResponseCode();
if (rc == 201) { // OK
System.out.println("success!");
}
|
在清单 4 中,hostOID 是主机的 OID,在请求体中传递虚机创建参数:操作系统(gos);CPU 和内存大小;networks 是从步骤二中得到的可选网络的主键;disks 也是从从步骤二中得到的可用的磁盘的主键。向服务器发送此请求后,若返回值是 201,说明请求发送成功,服务器开始按照所传参数创建空虚机。
部署虚拟设备
在虚机创建完成后,将虚拟设备部署到所创建的虚机上。首先取到虚拟设备的 OID 以及所创建虚机的 OID,然后发送 POST 请求到 /VMControl/workloads 来部署虚拟设备。
(1)通过发送 GET 请求到 /VMControl/virtualAppliances 取得所有虚拟设备的信息,从中得到所需虚拟设备的 OID。
(2)通过发送 GET 请求到 /VMControl/hosts/3461/virtualServers 来得到主机(OID 为 3461)上的所有虚机信息,从而得到新创建的虚机的 OID 信息。
(3)部署虚拟设备的示例代码如清单 5 所示。
清单 5. 使用 JAVA 实现 REST API 部署虚拟设备
//get SystemsDirectorConnection sdc
String uri = sdc.getConnectionContextURI() + "/VMControl/workloads";
String response = "";
String requestBody =
"{\"workload\":{\"virtualAppliance\":\""+vaOID+"\",\"target\":\""+vmOID+"\"," + "\"properties\":[" + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.system.hostname\", \"value\":\"client1\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.system.domainname\", \"value\":\"ibm.com\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.ip\", \"value\":\"172.16.3.5\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.hostname\",\"value\":\"client1\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.gateway\", \"value\":\"172.16.0.1\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.netmask\", \"value\":\"255.255.240.0\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.dns1.ip\", \"value\":\"172.16.0.2\"}," + "{\"name\":\"product.AIX1.com.ibm.ovf.vim.2.networkport.6.domainname\", \"value\":\"ibm.com\"}" +
"]}}";
HttpsURLConnection dataConnection = sdc.processRequest(uri, "POST", requestBody);
int rc = dataConnection.getResponseCode();
if (rc == 201) {
System.out.println("success!");
}
|
在清单 5 中,vaOID 是虚拟设备的 OID,vmOID 是新虚机的 OID,在请求体中提供 IP 相关参数,发送请求,即向服务器提交了一个部署虚拟设备的申请。返回值 201 表示申请提交成功,服务器开始部署虚拟设备到请求的虚机上。
小结
使用 REST API 接口来搭建虚拟环境,由于 REST API 的通用性,使得此方法适合于扩展各种已经存在的应用系统。如果你已经有一个相关的应用系统,想使用 VMControl 来管理虚拟环境,那么选用此方法是最合适不过的了。
总结
本文首先介绍了 PowerVM 和 VMControl 的环境准备,然后详细描述了如何使用两种接口——命令行接口和 REST API 接口来实现 PowerVM 虚拟环境的自动化搭建。通过本文可以对 PowerVM 虚拟环境搭建过程有一个整体的了解,同时能了解到 Systems Director VMControl 的两种程序接口的详细调用方法。
作者简介
操牡丹是 IBM 中国软件开发中心工程师,主要从事云服务方案的研究和开发工作。兴趣包括:虚拟化、云服务以及数据分析。
马润生主要从事 ERP 系统的开发工作,非常关注于富客户端解决方案的技术和产品,同时对云计算技术感兴趣。
http://www.ibm.com/developerworks/cn/aix/library/1112_caomd_vmcontrolpowervm/index.html