7.4. 为准备创建模板封装虚拟机

本节介绍了封装(seal) Linux 虚拟机和 Windows 虚拟机的方法。封装就是在基于虚拟机创建模板前,把只对特定虚拟机有效的信息删除的过程。这可以防止在通过同一个模板创建多个虚拟机时,相同的信息出现在不同的虚拟机上(这些信息在不同的虚拟机上需要有所不同)。同时,封装也可以保证相关功能的确定性,例如保证 vNIC 的顺序是可以预测的。

7.4.1. 封装 Linux 虚拟机来为创建模板做准备

有两种方法封装一个 Linux 虚拟机:手工封装或使用 sys-unconfig 命令。当手工封装一个 Linux 虚拟机时,您需要在虚拟机上创建一个文件。这个文件作为一个标记,指示了在虚拟机下一次启动时需要进行的多个配置任务。sys-unconfig 命令会自动化这个过程。但是,无论使用这两个方法中的哪一个,您都需要在虚拟机上手工删除那些只适用于特定虚拟机的文件。使用这两个方法封装 Linux 虚拟机的结果是相同的。

7.4.1.1. 手动封装 Linux 虚拟机来为创建模板做准备

在基于虚拟机创建一个模板前,您必须“封装”这个虚拟机。

过程 7.9. 封闭一个 Linux 虚拟机

  1. 登录到虚拟机。
  2. 把这个系统标识为重新配置:
    # touch /.unconfigured
  3. 删除 ssh 主机密钥:
    # rm -rf /etc/ssh/ssh_host_*
  4. /etc/sysconfig/network 中设置 HOSTNAME=localhost.localdomain
  5. 删除 /etc/udev/rules.d/70-*
    # rm -rf /etc/udev/rules.d/70-*
  6. /etc/sysconfig/network-scripts/ifcfg-eth* 中删除 HWADDR 行和 UUID 行。
  7. 另外,从 /var/log 中删除所有日志,从 /root 中删除 build 日志。
  8. 关闭虚拟机:
    # poweroff
虚拟机现在已被封装,并可以被用来创建模板。您可以使用这个模板部署 Linux 虚拟机,不会有与配置文件相关的冲突。

7.4.1.2. 使用 sys-unconfig 封装一个 Linux 虚拟机

在基于虚拟机创建一个模板前,您必须“封装”这个虚拟机。

过程 7.10. 使用 sys-unconfig 封装一个 Linux 虚拟机

  1. 登录到虚拟机。
  2. 删除 ssh 主机密钥:
    # rm -rf /etc/ssh/ssh_host_*
  3. /etc/sysconfig/network 中设置 HOSTNAME=localhost.localdomain
  4. /etc/sysconfig/network-scripts/ifcfg-eth* 中删除 HWADDR 行和 UUID 行。
  5. 另外,从 /var/log 中删除所有日志,从 /root 中删除 build 日志。
  6. 请运行以下命令:
    # sys-unconfig
虚拟机被关机。它已被封装,并可用来创建模板。您可以使用这个模板部署 Linux 虚拟机,不会有与配置文件相关的冲突。

7.4.2. 封装 Windows 虚拟机来为创建模板做准备

为 Windows 虚拟机所创建的模板在被用来部署虚拟机前需要被封装,这会确保那些针对于特定机器的设置不会出现在模板中。
Sysprep 是一个用来封装 Windows 模板的工具。

重要

在进行这个操作的过程中不要重新启动虚拟机。
在运行 Sysprep 前,请确保以下设置已经被配置:
  • Windows Sysprep 参数已经被正确定义。
    如果还没有定义,点编辑并在操作系统项中输入相应的信息。
  • 正确的产品密钥已在 Manager 的 /etc/ovirt-engine/osinfo.conf.d/10-productkeys.properties 中指定。
    如果还没有设置,请把您的 Windows 操作系统的默认值从 /etc/ovirt-engine/osinfo.conf.d/00-defaults.properties 复制到覆盖文件中,并在 productKey.valuesysprepPath.value 项中输入正确的值。

    例 7.1. Windows 7 默认配置值

    # Windows7(11, OsType.Windows, false),false
    os.windows_7.id.value = 11
    os.windows_7.name.value = Windows 7
    os.windows_7.derivedFrom.value = windows_xp
    os.windows_7.sysprepPath.value = ${ENGINE_USR}/conf/sysprep/sysprep.w7
    os.windows_7.productKey.value =
    os.windows_7.devices.audio.value = ich6
    os.windows_7.devices.diskInterfaces.value.3.3 = IDE, VirtIO_SCSI, VirtIO
    os.windows_7.devices.diskInterfaces.value.3.4 = IDE, VirtIO_SCSI, VirtIO
    os.windows_7.devices.diskInterfaces.value.3.5 = IDE, VirtIO_SCSI, VirtIO
    os.windows_7.isTimezoneTypeInteger.value = false

7.4.2.1. 封装一个 Windows 7 或 Windows 2008 模板

在使用 Windows 7 或 Windows 2008 模板创建虚拟机前,需要封装它。

过程 7.11. 封装一个 Windows 7 或 Windows 2008 模板

  1. 通过 C:\Windows\System32\sysprep\sysprep.exe 运行 Sysprep
  2. Sysprep 中输入以下信息:
    • System Cleanup Action 下,选择 Enter System Out-of-Box-Experience (OOBE)
    • 如需修改系统的 ID(SID),选择 Generalize
    • Shutdown Options 下,选择 Shutdown
  3. OK 完成封装的过程,在封装完成后,虚拟机会被自动关闭。
Windows 7 或 Windows 2008 模板被封装,并可以被用来创建虚拟机。

7.4.3. 使用 Cloud-Init 自动配置虚拟机

Cloud-Init 是一个用来自动配置虚拟机的初始设置(如主机名,网卡和密钥)的工具。它可以在使用模板部署虚拟机时使用,从而达到避免网络冲突的目的。
在使用这个工具前,cloud-init 软件包必须在虚拟机上安装。安装后,Cloud-Init 服务会在系统启动时搜索如何配置系统的信息。您可以使用只运行一次窗口来提供只需要配置一次的设置信息;或在 新建虚拟机编辑虚拟机编辑模板窗口中输入虚拟机每次启动都需要的配置信息。

7.4.3.1. Cloud-Init 使用实例

Cloud-Init 可以在不同的环境中被用来自动化虚拟机的配置过程。以下介绍了一些常见的实例:
基于模板创建的虚拟机
当您使用一个模板创建虚拟机时,可以在只运行一次窗口中的初始运行项中使用 Cloud-Init 选择。它会在虚拟机第一次运行时对虚拟机进行自定义配置。
虚拟机模板
新建模板编辑模板窗口中的初始运行页中选择使用 Cloud-Init/Sysprep 选项,来定制基于模板所创建的虚拟机。
虚拟机池
您可以使用新建池窗口中的初始运行中的使用 Cloud-Init/Sysprep 选项来为基于虚拟机池的虚拟机自定义配置。这允许您设定一组标准的设置,每一次一台虚拟机池中的虚拟机被使用时,这组配置都会应用到那个虚拟机上。您可以继承或覆盖虚拟机所基于的模板中的设置;或为虚拟机池本身指定设置。

7.4.3.2. 安装 Cloud-Init

以下介绍了如何在虚拟机上安装 Cloud-Init。当 Cloud-Init 被安装后,您就可以基于这个虚拟机创建模板。使用这个模板创建的虚拟机可以使用 Cloud-Init 的功能,如在系统引导时配置主机名、时区、root 密码、验证密钥、网络接口、DNS 服务等。

过程 7.12. 安装 Cloud-Init

  1. 登录到虚拟机。
  2. 启用所需的仓库:
    • Red Hat Enterprise Linux 6:
      # subscription-manager repos --enable=rhel-6-server-rpms
      # subscription-manager repos --enable=rhel-6-server-rh-common-rpms
    • Red Hat Enterprise Linux 7:
      # subscription-manager repos --enable=rhel-7-server-rpms
      # subscription-manager repos --enable=rhel-7-server-rh-common-rpms
  3. 安装 cloud-init 软件包:
    # yum install cloud-init

7.4.3.3. 使用 Cloud-Init 准备一个模板

如果在 Linux 虚拟机上安装了 cloud-init 软件包,就可以使用这个虚拟机创建启用了cloud-init 的模板。可以在模板中包括以下介绍的标准设置,或跳过 Cloud-Init 设置这一步,并在创建基于这个模板的虚拟机时配置它们。

注意

以下介绍了在准备模板时如何使用 Cloud-Init 的方法。其中的设置也出现在新建虚拟机编辑模板只运行一次窗口中。

过程 7.13. 使用 Cloud-Init 准备一个模板

  1. 虚拟机标签页并选择一个虚拟机。
  2. 编辑
  3. 初始运行标签页,选择使用 Cloud-Init/Sysprep 选项。
  4. 虚拟机主机名项中输入主机名。
  5. 配置时区并从时区下拉列表中选择所需的时区。
  6. 展开验证项,您可以选中使用已经配置的密码选项来使用已经存在的密码来进行验证;也可以不选择它而在密码验证密码项中设置一个新的 root 密码。
  7. SSH 授权密钥项中输入 SSH 密钥,这个密钥会被添加到虚拟机的授权主机文件中。
  8. 选中重新产生 SSH 密钥选项来为虚拟机重新产生 SSH 密钥。
  9. 展开网络项,在 DNS 服务器项中输入 DNS 服务器。
  10. DNS 搜索域中输入 DNS 搜索域。
  11. 选中网络,并使用 +- 键来为虚拟机添加网络接口或从虚拟机上删除网络接口。
  12. 展开自定义脚本,在自定义脚本项中输入自定脚本。
  13. 确定
  14. 创建模板并输入所需的项。
  15. 确定
您现在就可以使用这个模板部署新的虚拟机。

7.4.3.4. 使用 Cloud-Init 初始化一台虚拟机

使用 Cloud-Init 可以对 Linux 虚拟机自动进行一些初始配置,如配置虚拟机的主机名、时区、root 密码、验证密钥、网络接口和 DNS 服务。您也可以指定一个自定义脚本( YAML 格式)来在引导时运行。这个自定义脚本可以进行 Cloud-Init 支持的、但是没有出现在 Cloud-Init 项中的设置。如需了解更多相关信息,请参阅 Cloud config examples

过程 7.14. 使用 Cloud-Init 初始化一台虚拟机

这个过程会使用在启动虚拟机时使用一组 Cloud-Init 设置,如果相关的设置包括在虚拟机所基于的模板中,请检查这些设置,并根据需要对它们进行修改。点确定启动虚拟机。
  1. 虚拟机标签页并选择一个虚拟机。
  2. 只运行一次
  3. 展开初始运行项并选择使用 Cloud-Init
  4. 虚拟机主机名项中输入主机名。
  5. 配置时区并从时区下拉菜单中选择所需的时区。
  6. 您可以选中使用已经配置的密码选项来使用已经存在的密码来进行验证;也可以不选择它而在密码验证密码项中输入 root 密码。
  7. SSH 授权密钥项中输入 SSH 密钥,这个密钥会被添加到虚拟机的授权主机文件中。
  8. 选中重新产生 SSH 密钥选项来为虚拟机重新产生 SSH 密钥。
  9. DNS 服务器项中输入 DNS 服务器。
  10. DNS 搜索域中输入 DNS 搜索域。
  11. 网络,并使用 +- 键来为虚拟机添加网络接口或从虚拟机上删除网络接口。
  12. 自定义脚本项中输入自定义脚本。请确定脚本中的值是正确的,否则会导致操作失败。
  13. 确定

注意

要检查一个虚拟机是否安装了 Cloud-Init,选择这个虚拟机,点应用子标签页。它只会在已安装了 guest 代理后才会显示。