第 7 章 模板
模板就是一个被预先配置好的虚拟机备份,它可以被用来简化重复创建相似虚拟机的过程。模板包括了所基于的虚拟机上安装的软件,以及虚拟机的软件和硬件配置。这个模板所基于的虚拟机被称为源虚拟机。
当通过虚拟机创建一个模板时,一个虚拟机磁盘的只读备份会被创建。这个只读磁盘备份会被作为新模板的基本磁盘镜像,并可以被用来创建其它虚拟机。当有基于这个模板创建的虚拟机存在于环境中时,这个模板不能被删除。
基于模板所创建的虚拟机会使用和模板的源虚拟机相同的 NIC 类型和驱动,但是会被分配一个不同的 MAC 地址。
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 虚拟机
- 登录到虚拟机。
- 把这个系统标识为重新配置:
# touch /.unconfigured
- 移除 SSH 主机密钥:
# rm -rf /etc/ssh/ssh_host_*
- 将主机名称更改为
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
- 删除
/etc/udev/rules.d/70-*
:# rm -rf /etc/udev/rules.d/70-*
- 从
/etc/sysconfig/network-scripts/ifcfg-eth*
中删除HWADDR
行和UUID
行。 - 另外,从
/var/log
中删除所有日志,从/root
中删除 build 日志。 - 关闭虚拟机:
# poweroff
虚拟机现在已被封装,并可以被用来创建模板。您可以使用这个模板部署 Linux 虚拟机,不会有与配置文件相关的冲突。
这里所介绍的步骤是封装一个 Red Hat Enterprise Linux 虚拟机器作为模板所需的最少步骤。除此之外,可能还需要一些与主机和特定环境相关的额外步骤。
7.1.1.2. 使用 sys-unconfig 封装一个 Linux 虚拟机
在基于虚拟机创建一个模板前,您必须“封装”这个虚拟机。
过程 7.2. 使用 sys-unconfig 封装一个 Linux 虚拟机
- 登录到虚拟机。
- 移除 SSH 主机密钥:
# rm -rf /etc/ssh/ssh_host_*
- 将主机名称更改为
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
- 从
/etc/sysconfig/network-scripts/ifcfg-eth*
中删除HWADDR
行和UUID
行。 - 另外,从
/var/log
中删除所有日志,从/root
中删除 build 日志。 - 请运行以下命令:
# 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.value
和sysprepPath.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 模板
- 通过
C:\Windows\System32\sysprep\sysprep.exe
运行 Sysprep。 - 在 Sysprep 中输入以下信息:
- 在 System Cleanup Action 下,选择 Enter System Out-of-Box-Experience (OOBE)。
- 如需修改系统的 ID(SID),选择 Generalize。
- 在 Shutdown Options 下,选择 Shutdown。
- 点完成封装的过程,在封装完成后,虚拟机会被自动关闭。
Windows 7、Windows 2008 或 Windows 2012 模板已被封装,并可以用来部署虚拟机。