IBM® SmartCloud Enterprise 2.0 引入了一个映像导入特性,能够将 Linux 操作系统映像移动到云中,但是,这种映像导入特性只支持 Linux 操作系统,不支持 Windows® 和 UNIX 操作系统。根据 SmartCloud Enterprise 撰写的 Customizing Images and Software Bundles 指南,该系统只支持 Red Hat 或 SuSE,但只要符合本文所述的条件,就可以导入其他 Linux 操作系统映像。
导入过程的大多数步骤必须使用命令行和 API 来完成。您需要对 SmartCloud API 有一定的了解,并且具备最基础的 Linux OS 安装和定制技能。
SmartCloud 用户可用的 Customizing Images and Software Bundles 指南和 REST API reference 2.0 为您提供了很好的信息,但我认为光有这些知识还无法有效地导入 Linux OS。本文会介绍一些补充知识。
图 1 提供了将映像导入 SmartCloud Enterprise 的概述。
图 1. 将映像导入 IBM SmartCloud Enterprise 的概述
我们将会把执行该任务所需的重要补充知识分成四个一般性主题。然后分别深入讲解,并提供一些小技巧。
将 Linux OS 导入 SmartCloud Enterprise 的四个关键点是:
- 准备好 Linux OS 映像和元数据。需要一个虚拟化管理程序来准备好 Linux OS 映像。而元数据需要手工准备,但可以将 SmartCloud 上可用的任意公共映像的元数据作为模板重用。
- 将映像和元数据保存在永久性存储上。您可以通过创建一个附加存储的实例来写入映像和元数据。您可以通过网络上传映像和元数据,或者在实例上创建。
- 从私有映像的存储中导入映像,作为私有映像。我们将会解释
POST {baseURI}/offerings/image API命令,从而为此任务提供支持。 - 从映像中创建实例。成功导入的映像会出现在映像列表中,您可以从它来创建实例,就和对其他私有映像的操作一样。
建议您在开始之前阅读以下参考,并使用以下组件:
- Customizing Images and Software Bundles 指南和 REST API Reference 2.0 参考指南,或者是您所使用的命令行工具的参考指南(前两个可以在 SmartCloud 门户网站的 Support 选项卡文档库中找到)。
- QEMU,虚拟化管理程序和映像操作工具。
- 目标 Linux OS 的 ISO 映像。
- RealVNC VNC viewer。
现在,我们仔细看看这 4 个步骤。每个小节中都介绍了一些小技巧。
这一小节包含了以下步骤:
- 准备好元数据模板。
- 准备好工作台实例。
- 安装 QEMU。
- 设置 VNC 服务器。
- 准备好 OS 映像。
- 使用 QEMU 安装 OS。
- 对 OS 映像进行最基本设置。
设置需要导入映像所需元数据的最简单方法是重用公共映像的元数据。如果是导入 SuSE 或它的克隆版,那么可以重用公共 SuSE 映像的元数据。如果目标是 Red Hat 或它的克隆版,如 CentOS,那么可以利用公共 Red Hat 映像的元数据。
- 由于公共映像具有防复制保护,因此需要从所需重用的公共映像中创建一个实例。确保创建一个与处理器架构相同的实例(例如,32 或 64 位映像)作为您的目标 OS。
-
创建好公共映像实例后,保存实例的私有映像。现在可以在来自 SmartCloud 门户网站的资产目录屏幕中的私有映像上设置
CopyAllowed = Y。 - 在 SmartCloud 门户网站的 Control panel 选项卡头部有资产目录的链接。单击链接,并打开 My Dashboard 选项卡。您会看到现有的私有映像列表。
- 单击刚刚保存的映像的铅笔图标,单击 continue... 链接。屏幕底部会出现 Copy Allowed 标志。
- 将它改成 Y 并单击 Update 按钮。
- 创建 ext3 格式的永久存储。60GB 就足够了。
- 使用
PUT {baseURI}/storage/{storage id} API将私有映像复制到永久存储中。
图 2 描述了如何准备好工作台实例。
图 2. 准备好 SmartCloud 上的工作台实例的 OS 映像和元数据
复制完成后,创建另一个附加存储的实例。这就是您自己的工作台实例。推荐使用 64 位 Red Hat 6.0,但使用任何 Linux OS 都可以。假设/数据是以下描述中存储的加载点。
您将会看到一组如下所示的映像和元数据文件:
$ ls -l /data/image total 3459192 -rw-rw-r--.1 idcuser idcuser 451 Jan 3 03:14 BSS.zip -rw-r--r--.1 idcuser idcuser 64424509440 Jan 3 00:04 K7BqB_W2SOG3K@rUrln1EA.img -rw-rw-r--.1 idcuser idcuser 196 Jan 3 03:23 K7BqB_W2SOG3K@rUrln1EA.mf -rwxr-xr-x.1 idcuser idcuser 2013 Jan 3 00:04 K7BqB_W2SOG3K@rUrln1EA.ovf -rwxr-xr-x.1 idcuser idcuser 57830 Jan 3 00:04 RAM.zip -rwxr-xr-x.1 idcuser idcuser 20648 Jan 3 00:04 Terms.zip |
每个映像的 .img、.mf 和 .ovf 文件的基名称 (base name) 都不同。您可以重用 AM.zip、Terms.zip 和 ovf 文件,也可以删除其他文件。
从 QEMU 网站下载 QEMU 源打包工具,然后进行配置安装:
wget http://wiki.qemu.org/download/qemu-1.0.tar.gz tar -xzf qemu-1.0.tar.gz cd qemu-1.0 ./configure --target-list=x86_64-softmmu,i386-softmmu make & install |
可能需要将 /usr/local/bin 添加到 PATH 环境变量中,因为之前的指令在该目录下安装了一组 QEMU 工具。
QEMU 会在自身的 VNC 服务器上打开一个虚拟控制端口。您需要在 PC 上使用 VNC 客户端打开 VNC 并连接到实例的 XWindow,并且再打开 XWindow 上的一个 VNC 客户端连接到 QEMU 的 VNC 端口。
OS 映像是包含已安装的 Linux OS 的 HDD 映像的二进制文件。这也称为虚拟盘,因为它可以由虚拟化管理程序作为 HDD 来驱动。创建 OS 映像最简单的方法就是使用虚拟化管理程序和 OS 安装 CD/DVD 的 ISO 文件在虚拟盘上安装 OS。
可以在 VNC 会话中完成这一步,因为需要在 XWindows 上启动 VNC 客户端,以打开 QEMU 控制台,如前所述。可以使用 RealVNC Viewer 从 PC 上连接到 XWindows。
- 以原始格式创建空映像文件:
qemu-img create -f raw hdd.img 60G
- 使用映像文件和 ISO 文件启动管理程序:
qemu-system-i386 -m 1G -hda hdd.img -cdrom installer_image.iso -boot d
-
如果安装的是 64 位 OS,则运行
qemu-system-x86_64。如果要增加虚拟内存,可修改-m标志后的值。 -
您可以使用工作台实例的 XWindow 上的 VNC 客户端来查看 QEMU 控制台。可以在 RHEL6 中使用 TigarVNC viewer,它在 Applications > Internet 子菜单中。运行 TigarVNC viewer 并将 >localhost 指定为 VNC 服务器,以连接到 QEMU 控制台。
图 3. 通过 SmartCloud 实例上的 VNC 查看客户 OS 安装
- 在 QEMU 上运行 OS 安装程序可能非常慢,因为在 SmartCloud 实例上没有 KVM 加速器。您可以在本地 PC 上执行这一步骤,但每次修改映像时,都要通过 Internet 传输 10GB 的文件,直到任务完成。
安装程序启动后,按照目标 OS 的指令进行,但要保证满足以下条件:
- 不能使用 LVM;最新的 Linux OS 安装程序会默认使用 LVM。选择自定义安装,以避免使用 LVM。
- 只允许使用 /boot 和 / 分区。这两个只能在主分区中,而且必须按照 ext3 格式。而且,必须在自定义安装菜单中显式指定 这些参数。
- 不需要交换分区。当安装程序因为内存不够而挂起时,您可能想增加虚拟内存。您可以使用文本安装程序,而不是减少安装程序所需的内存需求,但有些文本安装程序不提供满足以上两个条件的自定义安装菜单。
映像文件的目标 OS 安装成功后,重启并登录以检查该环境是否支持 virtio 作为 root 用户。使用以下两个命令检查 /lib/modules 是否具有 virtio 内核模块和初始的 RAM DISK 映像:
modprobe -l | grep virtio gzip -dc /boot/initr*.img | cpio -t | grep virtio |
如果在之前代码的运行结果中没有 virtio_pci 或 virtio_blk,那么就需要安装 virtio 内核模块和/或创建 RAM DISK 映像。否则可以导入映像,但它无法启动。
以下是 OS 映像导入之前最基本的设置。
- 创建
idcuser。groupadd -g 501 idcuser useradd -u 500 -g 501 idcuser passwd idcuser mkdir /home/idcuser/.ssh chown -R idcuser.idcuser /home/idcuser chmod 600 /home/idcuser/.ssh
- 启用
idcuser sudo(/etc/sudoers)。idcuser ALL=(ALL) NOPASSWD:ALL
- 配置 sshd (/etc/ssh/sshd_config)。
我建议您推迟执行最后一步,直到您能作为 idcuser 使用 RSA 键访问实例,如下所示:
PermitRootLogin no PasswordAuthentication no UsePAM no |
请注意:如果您导入的是 Linux OS 而非 Red Hat 或 SuSE 克隆版,比如 Ubuntu,那么需要转换网络接口配置。我建议创建一个保留 IP,并且立刻在映像上设置 IP 地址。它能确保连接到实例。您可以在 SmartCloud 启动映像后自定义映像。
这一小节包含了以下步骤:
- 元数据准备和结构。
- 断开存储连接。
以下图片显示了 SmartCloud 上映像的元数据结构。强制文件有 .ovf、.img、BSS.zip、RAM.zip 和 .mf。
图 4.元数据结构
按照之前所述重用 SmartCloud 公共映像的 RAM.zip,如果您非常确定的话,可以查看并修改这些文件。
不需要修改 .ovf 文件,只要保留强制文件的名称就行。换句话说,如果要对 .img 和 .ovf 文件使用您自己的名字,就要重写 .ovf 文件。
-
在执行元数据准备任务的最后阶段运行 FileValidation.sh 工具来生成 .mf 文件。由于 .mf 文件包含了每个文件的校验和,因此如果要在创建 .mf 文件后进行修改,需要返回到该工具重新生成 .mf 文件。
以下是 BSS.zip 中的 BSS.xml 文件的一个示例。参考 Customizing Images and Software Bundles 指南,以了解该文件的详细信息。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:serviceoffering offeringtype="IMAGE" id="" xmlns:ns2="http://www.ibm.com/cloud/storage/xml"> <shortdesc>CentOS 6.1 32bit test</shortdesc> <longdesc>CentOS 6.1 32bit test</longdesc> <offeringfamilyid>1003</offeringfamilyid> <platformVersion>1.2</platformVersion> <attributes> <os>CentOS 6.1 32bit test/6.1</os> <allowedsize.32>COP32,BRZ32,SLV32,GLD32</allowedsize.32> </attributes> </ns2:serviceoffering>
-
这里提供的技巧是
<os>标签。您可以在 OS 名称后指定 OS 版本号,并使用 "/" 隔开它。 -
确认
<offeringfamilyid>的值是 1003。否则您将按不同的价格表支付实例。当导入 64 位 OS 映像时,<allowedsize.32>标签的值会有所不同。 -
创建一个 BSS.zip 文件来包含 BSS.xml 并将它保存到 /data/image 中:
zip /data/image/BSS.zip BSS.xml
- 将 OS 映像传输到 /data/image 并将它重名为 xxxx.img,其中 xxxx 是与 xxxx.ovf 一样的基名称。
- 转到 /data/image 目录并运行 FileValidation.sh;选择 menu 2 来重新创建清单文件。
您需要删除工作台实例,从而断开存储连接,以后也许会出现能动态断开连接的特性。我强烈建议您在删除实例之前先保存一个私有映像,因为如果导入或配置过程失败,还要返回这一步修改映像或元数据。永远不要过于乐观:第一次尝试可能由于各种原因而失败。确保在删除实例前能够从私有映像创建实例。
使用 POST
{baseURI}/offerings/image API 将映像从存储导入 SmartCloud 上的私有映像。注意包含在请求响应中的映像 ID。当过程失败需要经检查请求状态或删除映像条目时就需要它了。有时它不出现在云门户网站的私有映像列表上,但它却是存在并占用您的映像数目。
第一次尝试很有可能失败。不要问我原因,您也不必担心。深呼吸,伸个懒腰,别先想着放弃。
遇到失败先回到元数据准备阶段;元数据中可能出错了。
最后一节讨论配置来自映像的实例,并包含一些 Ubuntu 支持问题。
您可以从门户网站配置来自映像的实例。如果无法创建实例,那么返回映像创建步骤,确认符合所有条件。这一阶段出现的错误往往是由于映像文件格式错误造成的。
映像变活动后,以 idcuser 身份进行访问。如果 SSH 客户端超时,那么实例不会启动或无法配置网络接口。返回映像创建步骤,并检查 virtio 配置。
您可能想要查出实例内部发生了什么。可以从实例中获取一个私有映像,将它复制到存储中,使用 QEMU 来运行映像,并仔细查看。
启动之后,会在 syslog 文件中找到一些记录。
如果您的 SSH 客户端接收到身份验证错误消息,可能是 RSA 键设置错误。可以作为 root 用户登录。检查 /home/idcuser 下的文件许可。
如果最后使用 RSA 键以 idcuser 身份登录进去,请保持连接,并配置 sshd_config 文件,不允许 root 访问、使用密码或使用 PAM,然后重启 sshd。确保还能够从其他会话中使用 RSA 键以 idcuser 登录。
如果一切正常,取得第一个生成实例的私有映像,再用不同的 IP 地址和 RSA 键从映像中创建第二个生成实例。
Ubuntu OS 的网络配置文件与 Red Hat 非常不同。SmartCloud 的配置引擎将会设置一个 Red Hat 风格的配置文件,但 Ubuntu 不支持该文件。需要实现以下的 initd 脚本,运行第 3 级到 5 级,从而将 Red Hat 风格配置文件转换成 Ubuntu 风格的文件。
#!/usr/bin/perl
$INTERFACE="/etc/network/interfaces";
$NETCONFDIR="/etc/sysconfig/network-scripts/";
if ( (stat($INTERFACE))[9] > (stat($NETCONFDIR."ifcfg-eth0"))[9] ){
exit 0;
}
system("/bin/sed -n s/HOSTNAME=//p /etc/sysconfig/network > /etc/hostname");
system("/bin/hostname `cat /etc/hostname`");
open(OUT,">$INTERFACE");
print OUT << "EOF";
# This file describes the network interfaces available on your system
# and how to activate them.For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
EOF
open(TT,"ls ".$NETCONFDIR."ifcfg-eth?|");
while (<TT>){
chop;
$t=$n=$_;
$n=~s/^.*\/ifcfg-//;
open(IF,$t);
while (<IF>){
chop;
if (/^IPADDR=(.*)$/){
$addr=$1;
} elsif (/^NETMASK=(.*)$/){
$mask=$1;
} elsif (/^GATEWAY=(.*)$/){
$gw=$1;
}
}
close(IF);
@a=split(/\./,$addr);
@m=split(/\./,$mask);
for ($c=0; $c<4; $c++){
$a=$a[$c]*1;
$m=$m[$c]*1;
$b[$c]=($a & $m) + (255 & ~ $m);
}
$bcast=sprintf("%d.%d.%d.%d",$b[0],$b[1],$b[2],$b[3]);
print(OUT "iface $n inet static\n");
print(OUT " address $addr\n");
print(OUT " netmask $mask\n");
print(OUT " gateway $gw\n");
print(OUT " broadcast $bcast\n");
print(OUT "\n");
}
close(TT);
close(OUT);
system("/etc/init.d/networking restart");
exit(0);
|
IBM SmartCloud Enterprise 2.0 的映像导入功能非常有用。除了 Red Hat 和 SuSE 以外,它还支持 Linux 操作系统映像,您甚至可以在 SmartCloud 上使用工作台来创建您自己的映像。但有一些关于映像格式的条件和限制,使得导入这些 OS 映像变得有些困难;本文中提供的建议应该能够帮助您解决大部分难题。
学习
-
了解本文中所讨论技术的更多信息:QEMU | RealVNC | Virtio。
-
关于如何在 IBM Cloud 中执行任务的更多信息,访问以下资源:
- Up and download files from a Windows instance
- Install IIS web server on Windows 2008 R2
- Create an IBM Cloud instance with the Linux command line
- Create an IBM Cloud instance with the Windows command line
- 使用 IBM Cloud 扩展您的公司网络
- IBM Cloud 中的高可用性应用程序
- 动态自定义云映像实例的参数
- Windows-targeted approaches to IBM Cloud provisioning
- IBM SmartCloud Enterprise 技巧:使用快速部署服务部署产品
- Integrate your authentication policy using a proxy
- IBM SmartCloud Enterprise 技巧:配置 Linux Logical Volume Manager
- IBM SmartCloud Enterprise 技巧:部署复杂的拓扑结构
- Provision and configure an instance that spans a public and private VLAN
- IBM SmartCloud Enterprise 技巧:从 Android 设备实现安全访问
- 在 IBM SmartCloud Enterprise 中恢复数据
- Secure virtual machine instances in the cloud
-
在 developerWorks 云开发人员资源 中,可以发现和共享应用程序和开发人员有关构建云部署项目的知识和经验。
-
了解如何 访问 IBM SmartCloud Enterprise。
- 加入云计算讨论组,了解和讨论云计算的最新技术、解决方案、趋势等内容。
获得产品和技术
-
查看在 IBM SmartCloud Enterprise 上可用的 产品镜像。
讨论
-
阅读 developerWorks 上所有精彩的云博客。
- 加入 developerWorks 中文社区。查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
