Red Hat Training

A Red Hat training course is available for Red Hat Virtualization

第 7 章 模板

模板就是一个被预先配置好的虚拟机备份,它可以被用来简化重复创建相似虚拟机的过程。模板包括了所基于的虚拟机上安装的软件,以及虚拟机的软件和硬件配置。这个模板所基于的虚拟机被称为源虚拟机。
当通过虚拟机创建一个模板时,一个虚拟机磁盘的只读备份会被创建。这个只读磁盘备份会被作为新模板的基本磁盘镜像,并可以被用来创建其它虚拟机。当有基于这个模板创建的虚拟机存在于环境中时,这个模板不能被删除。
基于模板所创建的虚拟机会使用和模板的源虚拟机相同的 NIC 类型和驱动,但是会被分配一个不同的 MAC 地址。
您可以直接通过模板标签页或虚拟机标签页创建一个虚拟机。在模板标签页中,在相关模板上点鼠标右键,选创建虚拟机。如需了解与创建新虚拟机相关的信息,请参阅 第 A.1.1 节 “虚拟机常规设置介绍”

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

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

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

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

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

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

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

  1. 登录到虚拟机。
  2. 把这个系统标识为重新配置:
    # touch /.unconfigured
  3. 移除 SSH 主机密钥:
    # rm -rf /etc/ssh/ssh_host_*
  4. 将主机名称更改为 localhost.localdomain
    • 对于 Red Hat Enterprise Linux 6,编辑 /etc/sysconfig/network 中的HOSTNAME 值:
      HOSTNAME=localhost.localdomain
    • 对于 Red Hat Enterprise Linux 7,使用 hostnamectl 命令:
      # hostnamectl set-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 虚拟机,不会有与配置文件相关的冲突。
这里所介绍的步骤是封装一个 Red Hat Enterprise Linux 虚拟机器作为模板所需的最少步骤。除此之外,可能还需要一些与主机和特定环境相关的额外步骤。

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

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

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

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

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

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

重要

在进行这个操作的过程中不要重新启动虚拟机。
在运行 Sysprep 前,请确保以下设置已经被配置:
  • Windows Sysprep 参数已经被正确定义。
    如果还没有定义,点编辑并在操作系统项中输入相应的信息。
  • 正确的产品密钥在 Manager 的一个覆盖文件中指定。
    这个覆盖文件需要在 /etc/ovirt-engine/osinfo.conf.d/ 中创建,它的文件名需要在 /etc/ovirt-engine/osinfo.conf.d/00-defaults.properties 文件之后,并需要以 .properties 结束。例如,/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.1.2.1. 封装 Windows 7、Windows 2008 或 Windows 2012 模板

在使用模板部署虚拟机前,需要封装一个 Windows 7、Windows 2008 或 Windows 2012 模板。

过程 7.3. 封装 Windows 7、Windows 2008 或 Windows 2012 模板

  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 或 Windows 2012 模板已被封装,并可以用来部署虚拟机。