SDB:KIWI Cookbook Own Cloud

跳转到:导航搜索


在镜像中使用第三方软件
Icon-checked.png
此过程至少在 Kiwi 版本 3.25 ( kiwi --version ) 上进行了测试 - 较旧的版本不支持所有显示的功能 版本


创建您自己的云

本示例将指导您完成基于 Eucalyptus 创建您自己的云基础设施的步骤。该示例引导您构建 3 个独立的镜像,一个主节点镜像、一个云节点镜像和一个客户镜像。创建镜像后,设置您自己的云大约需要 10 分钟,并且在新节点上的部署可以在 5 分钟内完成。

截至 Kiwi 4.25 版本,kiwi-doc 包在 /usr/share/doc/packages/kiwi/examples 目录下的 suse-11.1 和 suse-11.2 目录中包含 suse-euca-cloud 示例。

创建云镜像

准备时间

  • 60 分钟

烹饪时间

  • 40 分钟

配料

  • 正在运行的 openSUSE 11.1 或 11.2 系统
  • openSUSE 11.1 或 11.2 仓库
  • 已安装最新版本的 KIWI 工具集(至少版本 4.25)
  • 已安装 kiwi-doc 包
  • 下载 Eucalyptus tarball 和 Euca2ools tarball
  • 大约 1 GB 的可用磁盘空间


如果您正在基于 openSUSE 11.1 构建您的基础设施,您需要使用 Eucalyptus 版本 1.6.1。对于基于 openSUSE 11.2 或更高版本的 инфраструктура,您可以使用 Eucalyptus 1.6.1 或 Eucalyptus 1.6.2。

创建主节点

创建主节点配置

让我们首先将 kiw-doc 包提供的示例复制到工作目录。在本示例中,工作目录将为 /tmp/cloud-setup

cp -r /usr/share/doc/packages/kiwi/examples/suse-11.2/suse-euca-cloud/ /tmp/cloud-setup

如果您尚未 下载 Eucalyptus 和 Euca2ools tarball,请立即下载并将它们放在 /tmp/cloud-setup 中。

接下来,切换到我们的工作目录并解压缩 Eucalyptus 包。

cd /tmp/cloud-setup
tar -xzvf euca2ools-1.2-opensuse-x86_64.tar.gz
tar -xzvf eucalyptus-1.6.2-opensuse-x86_64.tar.gz
如果您正在构建基于 32 位的基础设施或使用不同版本的 Eucalyptus,请在 tar 命令中替换适当的 tarball 名称。

通过以下步骤,我们将把从 tarball 提取创建的包目录添加到 Kiwi 配置中作为仓库。编辑 cloud-head-node 目录中的 config.xml 文件。将条目 PATH_TO_EUCALYPTUS_RPMS 替换为 Eucalyptus rpm 的路径,在本例中,路径为 /tmp/cloud-setup/eucalyptus-1.6.2-opensuse-x86_64。然后复制仓库声明并将 eucalyptus-1.6.2-rpm-deps-x86_64 添加到路径的末尾。再次复制仓库声明并指向 euca2ools-1.2-opensuse-x86_64 目录。完成操作后,您应该在 config.xml 中具有以下仓库配置。

    <repository type="rpm-dir">
        <source path="tmp/cloud-setup/eucalyptus-1.6.2-opensuse-x86_64"/>
	</repository>
    <repository type="rpm-dir">
        <source path="tmp/cloud-setup/eucalyptus-1.6.2-opensuse-x86_64/eucalyptus-1.6.2-rpm-deps-x86_64"/>
    </repository>
    <repository type="rpm-dir">
        <source path="tmp/cloud-setup/euca2ools-1.2-opensuse-x86_64"/>
    </repository>
如果您不想通过互联网拉取 openSUSE 包,请不要忘记将仓库更改为一些本地仓库,可能为 openSUSE ISO 镜像的挂载点。

如果您想包含最新的 openSUSE 包,请将 Updates 仓库添加到 config.xml 文件中。添加 Updates 仓库的语法如下

    <repository type="rpm-md">
	<source path="http://download.opensuse.org/update/11.2/"/>
    </repository>

这完成了对 config.xml 的更改。

如果您正在构建 64 位镜像,则需要对 config.sh 文件进行一些更改。64 位的 euca2ools 包将所需的 Python 文件放在 32 位树中,而不是 64 位树中。因此,需要一个链接。这已报告,预计将在 euca2ools 包的后续版本中修复。在 suseConfig 命令之后,在 config.sh 中添加以下条目。

#====================================== 
# Workaround for broken euca2ools package 
#-------------------------------------- 
ln -s /usr/lib/python2.6/site-packages/boto /usr/lib64/python.6/site-packages
ln -s /usr/lib/python2.6/site-packages/euca2ools /usr/lib64/python.6/site-packages

这完成了对示例配置所需的更改。

配置设置为创建 ISO 格式的 OEM 镜像,即可以刻录到 CD 上的自安装 ISO 镜像。从 CD 启动后,主节点镜像将在您启动的机器上自行安装。在 VM 中运行主节点也是有意义的,您可以根据需要更改配置中的镜像类型。接下来,让我们构建主节点镜像。

构建主节点镜像

kiwi --prepare ./cloud-head-node --root /tmp/cloud-setup/cloud-head-unpacked

准备步骤之后,创建镜像。

kiwi --create ./cloud-head-unpacked -d /tmp/cloud-setup/cloud-head-image

您可以在虚拟环境中测试镜像。使用 qemu 在 64 位系统上,操作如下

创建虚拟磁盘

qemu-img create -f qcow2 /tmp/cloud_head_test.img 10G

启动创建的 ISO

qemu-kvm /tmp/cloud_head_test.img -cdrom /tmp/cloud-setup/cloud-head-image/Eucalyptus-Head-Node.x86_64-0.9.2.iso -boot d

这完成了主节点创建,您可以将镜像安装到合适的硬件上。

创建云节点

创建云节点配置

使用您喜欢的编辑器编辑 cloud-cloud-node 目录中的 config.xml 文件。与之前的主节点配置一样,设置您的仓库(您可以从主节点配置文件中复制配置的仓库元素)。

值得注意的是,云节点配置设置为 Xen 超visor,即 dom0 镜像。这是通过 <xenconfig> 元素以及 <type> 元素的 bootprofilebootkernel 属性来实现的。

    <type image="oem" filesystem="ext4" boot="oemboot/suse-11.2" format="iso" bootprofile="xen" bootkernel="xenk">
        .......
        <xenconfig domain="dom0"/>
    </type>
如果您正在调整配置文件以适用于 Kiwi 4.20 之前的版本,则必须将 bootkernel 属性的值从 xenk 更改为 nex

云节点的配置还生成 ISO 格式的 OEM 镜像。如果您更愿意创建一个可以从 USB 驱动器自安装的镜像,只需将 <type> 元素的 format 属性的值从 iso 更改为 usb。结果将是一个 .raw.install.raw 文件。使用 dd 命令将此镜像转储到 USB 驱动器(不要忘记使用 bs=32 参数)。

构建云节点镜像

现在您可以构建您的云节点镜像。

kiwi --prepare ./cloud-cloud-node --root /tmp/cloud-setup/cloud-cloud-unpacked
kiwi --create ./cloud-cloud-unpacked -d /tmp/cloud-setup/cloud-cloud-image


云基础设施设置

完成主节点和云节点镜像后,您可以将镜像安装到合适的硬件上。请按照 管理员指南 中的说明配置云基础设施。

在云节点上,您需要创建一个网络桥接器,以允许客户镜像连接到网络。您可以使用命令行或使用 YaST 进行漂亮的 GUI 驱动配置。

由于没有客户镜像的云基础设施毫无用处,接下来的步骤解释了如何创建客户镜像以及如何将客户镜像注册到 Eucalyptus


创建云镜像

云节点的配置设置为与 Xen 协同工作。因此,我们的云虚拟机需要构建为 Xen 客户 (domU) 镜像。为了演示目的,此处使用了 kiwi-doc 包提供的 xen-guest 示例。

您可以使用 xen-guest 示例而无需修改。在这种情况下,示例被复制到工作目录 /tmp/clous-setup 以修改仓库声明,以使用本地 ISO 镜像。未修改的 xen-guest 示例通过互联网拉取包。
cp -r /usr/share/doc/packages/kiwi/examples/suse-11.2/suse-xen-guest .
kiwi --prepare ./suse-xen-guest --root /tmp/cloud-setup/cloud-guest-unpacked
kiwi --create ./cloud-guest-unpacked -d /tmp/cloud-setup/cloud-guest-image

xen-guest 示例生成一个“未打包”的 Xen 镜像,这使得将其集成到 Eucalyptus 中变得简单明了,如下所述。

云客户镜像也可以使用 SUSE Studio 创建。使用 studio,结果是一个打包的 Xen 客户镜像,将其集成到云基础设施中需要更多的工作。这些步骤也如下所述。

集成客户镜像

准备客户镜像以进行集成

Kiwi 镜像
  • 创建结果目录的 tar 归档文件,即我们的示例中的 /tmp/cloud-setup/cloud-guest-image
  • 将 tarball 复制/移动到您的 Eucalyptus 主节点上的您选择的目录
  • 解压缩 tarball。
SUSE Studio 镜像
  • 从 SUSE Studio 下载 tarball
  • 将 tarball 复制/移动到您的 Eucalyptus 主节点上的您选择的目录
  • 解压缩 tarball
    • tarball 包含
      • 以 .xenconfig 结尾的配置文件
      • 以 .raw 结尾的磁盘镜像文件
  • 按照以下方式从磁盘镜像中提取内核和 initrd
losetup /dev/loop1 FILENAME.raw
假设 loop1 尚未使用,请使用 mount 命令和 grep loop1 确认这一点,然后再发出 losetup 命令。
kpartx -a /dev/loop1
mount -t ext3 /dev/mapper/loop1p1 /mnt
确保您的文件系统类型与用于构建客户镜像的文件系统匹配。
 mkdir SOMEWHERE/my_xen_guest
将 SOMEWHERE 替换为您选择的路径。名称 my_xen_guest 仅用作示例,是任意的。
 cp /mnt/boot/initrd.vmx SOMEWHERE/my_xen_guest
 cp /mnt/boot/vmlinuz-KERNEL_VERSION-xen SOMEWHERE/my_xen_guest
最后两个步骤将 initrd 和内核从磁盘镜像中复制出来。如果您不确定名称,请查看 /mnt/boot/grub/menu.lst 以确定 initrd 和内核的名称,并复制适当的文件。
  • 现在您可以撤消 .raw 文件的设置
umount /mnt
kpartx -d /dev/loop1
losetup -d /dev/loop1

打包和上传

每个 Eucalyptus 机器镜像由三个文件组成

  1. 文件系统
  2. 初始 Ramdisk (initrd)
  3. 内核

这三个镜像文件中的每一个都需要打包、上传并注册到 Eucalyptus 基础设施。打包、上传和注册通过以下三个命令完成

  1. euca-bundle-image
  2. euca-upload-bundle
  3. euca-register

有关此过程和命令的详细信息,请参阅 Eucalyptus 镜像管理 部分的 管理员指南

在开始打包之前,从 Web 界面下载您的凭据并解压缩 zip 文件。source eucarc 文件。这将设置必要的环境变量(如果您正在运行 bash 或 sh)。对于其他 shell,您需要进行适当的调整。

打包和上传初始 Ramdisk
使用 Kiwi 创建的客户镜像

通过检查结果目录(即我们的示例中的 cloud-guest-image/suse-11.2-xen-guest.x86_64-1.1.2.xenconfig)中的 .xenconfig 文件来识别初始 Ramdisk (initrd) 的文件名。

使用 SUSE Studio 创建的客户镜像

使用您之前复制到您选择的目录的 initrd.vmx 文件。


  • 通过打包 initrd 文件创建清单文件
 euca-bundle-image --ramdisk true -i <initrd file>
  • 上传捆绑包,指定一个 bucket 名称和在上一步骤中创建的清单。bucket 名称是您选择的字符串。
 euca-upload-bundle -b <bucket name> -m /tmp/<filename of manifest>
  • 使用 Eucalyptus 云管理框架注册此镜像
 euca-register <bucket name>/<filename of manifest>
  • 请注意 Eucalyptus ramdisk 标识符 (eri-xxxxxx) 的输出。
打包和上传 Linux 内核
使用 Kiwi 创建的客户镜像

通过检查结果目录中的 .xenconfig 文件来识别内核文件名,例如,在我们的示例中,cloud-guest-image/suse-11.2-xen-guest.x86_64-1.1.2.xenconfig。

使用 SUSE Studio 创建的客户镜像

使用您之前复制到您选择的目录中的内核文件。


  • 通过捆绑内核来创建清单文件
 euca-bundle-image --kernel true -i <kernel file>
  • 上传捆绑包,指定与之前用于 initrd 的相同存储桶名称,并指定清单文件
 euca-upload-bundle -b <bucket name> -m /tmp/<filename of manifest>
  • 使用 Eucalyptus 云管理框架注册此镜像
 euca-register <bucket name>/<filename of manifest>
  • 记下产生的 Eucalyptus 内核标识符 (eki-xxxxxx)。
捆绑并上传根文件系统
使用 Kiwi 创建的客户镜像

通过检查结果目录中的 .xenconfig 文件来识别文件系统镜像的文件名,例如,在我们的示例中,cloud-guest-image/suse-11.2-xen-guest.x86_64-1.1.2.xenconfig。

使用 SUSE Studio 创建的客户镜像

使用您之前复制到您选择的目录中的 .raw 文件。

* Create a manifest file by bundling the filesystem, this requires the previously noted identifiers eri-xxxxxx and eki-xxxxxx
 euca-bundle-image --ramdisk <eri-xxxxxx> --kernel <eki-xxxxxx> -i <path to root filesystem>
  • 上传捆绑包,指定与之前用于 initrd 和内核的相同存储桶名称,并指定清单文件
 euca-upload-bundle -b <bucket name> -m /tmp/<filename of manifest>
  • 使用 Eucalyptus 云管理框架注册此镜像
 euca-register <bucket name>/<filename of manifest>
  • 记下 Eucalyptus 机器镜像 (EMI) 标识符 (emi-xxxxxx)

这完成了捆绑、上传和注册过程,新创建的镜像现在可以使用 EMI 标识符启动。

使用云

  • 启动一个客户镜像
 euca-run-instances -k <ssh key id> emi-xxxxxx
  • 显示正在运行的实例
euca-describe-instances
  • 显示可用的镜像、ramdisk 和内核
euca-describe-images
  • 终止实例
    • 从初始 run-instances 命令或 euca-describe-instances 中找到其实例 ID (i-xxxxxx)
 euca-terminate-instances <i-xxxxxx>