9.2. 创建虚拟机模板
要创建可正常工作的多个虚拟机(VM)克隆,您可以对删除源虚拟机的唯一信息和配置,如 SSH 密钥或持久性网络 MAC 配置。这将创建一个虚拟机 模板,您可以使用它来轻松且安全地创建虚拟机克隆。
您可以使用 virt-sysprep
工具 创建虚拟机模板,或者根据您的要求 手动创建它们。
9.2.1. 使用 virt-sysprep 创建虚拟机模板
要从现有虚拟机(VM)创建克隆模板,您可以使用 virt-sysprep
工具。这会删除可能导致克隆正常工作的某些配置,如特定网络设置或系统注册元数据。因此,virt-sysprep
提高了虚拟机的克隆,并确保克隆更可靠。
先决条件
libguestfs-tools-c
软件包(其包含virt-sysprep
工具)已安装在您的主机上:# yum install libguestfs-tools-c
- 作为模板的源虚拟机将被关闭。
您知道源虚拟机的磁盘镜像所处的位置,并且您是虚拟机磁盘镜像文件的所有者。
请注意,在 libvirt 系统连接 中创建的虚拟机的磁盘镜像位于
/var/lib/libvirt/images
目录中,默认由 root 用户拥有:# ls -la /var/lib/libvirt/images -rw-------. 1 root root 9665380352 Jul 23 14:50 a-really-important-vm.qcow2 -rw-------. 1 root root 8591507456 Jul 26 2017 an-actual-vm-that-i-use.qcow2 -rw-------. 1 root root 8591507456 Jul 26 2017 totally-not-a-fake-vm.qcow2 -rw-------. 1 root root 10739318784 Sep 20 17:57 another-vm-example.qcow2
- 可选:源虚拟机磁盘上的任何重要数据都已备份。如果要保留源虚拟机,请首先克隆它,并将克隆转换为模板。???
流程
确保您已作为虚拟机磁盘镜像的所有者登录:
# whoami root
可选:复制虚拟机的磁盘镜像。
# cp /var/lib/libvirt/images/a-really-important-vm.qcow2 /var/lib/libvirt/images/a-really-important-vm-original.qcow2
这用于验证虚拟机是否已成功转换为模板。
使用以下命令,将 /var/lib/libvirt/images/a-really-important-vm.qcow2 替换为源虚拟机磁盘镜像的路径。
# virt-sysprep -a /var/lib/libvirt/images/a-really-important-vm.qcow2 [ 0.0] Examining the guest ... [ 7.3] Performing "abrt-data" ... [ 7.3] Performing "backup-files" ... [ 9.6] Performing "bash-history" ... [ 9.6] Performing "blkid-tab" ... [...]
验证
要确认进程成功,请将修改的磁盘镜像与原始镜像进行比较。以下示例显示了成功创建模板:
# virt-diff -a /var/lib/libvirt/images/a-really-important-vm-orig.qcow2 -A /var/lib/libvirt/images/a-really-important-vm.qcow2 - - 0644 1001 /etc/group- - - 0000 797 /etc/gshadow- = - 0444 33 /etc/machine-id [...] - - 0600 409 /home/username/.bash_history - d 0700 6 /home/username/.ssh - - 0600 868 /root/.bash_history [...]
其它资源
-
virt-sysprep
手册页中的 OPERATIONS 部分 - 使用命令行界面克隆虚拟机
9.2.2. 手动创建虚拟机模板
要从现有虚拟机(VM)创建模板,您可以手动重置或取消配置客户虚拟机来为克隆做好准备。
先决条件
确保您知道源虚拟机的磁盘镜像的位置,并且是虚拟机磁盘镜像文件的所有者。
请注意,在 libvirt 的 系统连接 中创建的虚拟机的磁盘镜像默认位于
/var/lib/libvirt/images
目录中,并由 root 用户拥有:# ls -la /var/lib/libvirt/images -rw-------. 1 root root 9665380352 Jul 23 14:50 a-really-important-vm.qcow2 -rw-------. 1 root root 8591507456 Jul 26 2017 an-actual-vm-that-i-use.qcow2 -rw-------. 1 root root 8591507456 Jul 26 2017 totally-not-a-fake-vm.qcow2 -rw-------. 1 root root 10739318784 Sep 20 17:57 another-vm-example.qcow2
- 确保虚拟机已关闭。
- 可选:虚拟机磁盘上的任何重要数据都已备份。如果要保留源虚拟机,请首先 克隆它,并编辑克隆以创建模板。
流程
配置虚拟机以进行克隆:
- 在克隆上安装任何所需的软件。
- 为操作系统配置任何非唯一的设置。
- 配置任何非唯一的应用设置。
删除网络配置:
使用以下命令删除任何持久性 udev 规则:
# rm -f /etc/udev/rules.d/70-persistent-net.rules
注意如果没有删除 udev 规则,第一个 NIC 的名称可能是
eth1
而不是eth0。
通过编辑
/etc/sysconfig/network-scripts/ifcfg-eth[x]
来从 ifcfg 脚本中删除唯一的网络详情,如下所示:删除 HWADDR 和 Static 行:
注意如果 HWADDR 与新客户机的 MAC 地址不匹配,则
ifcfg
将被忽略。DEVICE=eth[x] BOOTPROTO=none ONBOOT=yes #NETWORK=192.0.2.0 <- REMOVE #NETMASK=255.255.255.0 <- REMOVE #IPADDR=192.0.2.1 <- REMOVE #HWADDR=xx:xx:xx:xx:xx <- REMOVE #USERCTL=no <- REMOVE # Remove any other *unique or non-desired settings, such as UUID.*
配置 DHCP,但不包含 HWADDR 或任何其他唯一信息:
DEVICE=eth[x] BOOTPROTO=dhcp ONBOOT=yes
如果系统中存在以下文件,请确保这些文件也包含同样的内容:
-
/etc/sysconfig/networking/devices/ifcfg-eth[x]
/etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
注意如果您已使用
NetworkManager
或虚拟机的任何特殊设置,请确保从ifcfg
脚本中删除任何其他唯一的信息。
-
删除注册详情:
对于在 Red Hat Network (RHN)上注册的虚拟机:
# rm /etc/sysconfig/rhn/systemid
对于使用 Red Hat Subscription Manager (RHSM)注册的虚拟机:
如果您不打算使用原始虚拟机:
# subscription-manager unsubscribe --all # subscription-manager unregister # subscription-manager clean
如果您打算使用原始虚拟机:
# subscription-manager clean
注意原始 RHSM 配置文件保留您 ID 代码的门户中。克隆后,使用以下命令重新激活虚拟机上的 RHSM 注册:
# subscription-manager register --consumerid=71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
删除其他唯一的详情:
删除 SSH 公钥和私钥对:
# rm -rf /etc/ssh/ssh_host_example
删除 LVM 设备的配置:
# rm /etc/lvm/devices/system.devices
- 如果在多台计算机上运行,删除任何其他特定于应用程序的标识符或配置可能会导致冲突。
删除
gnome-initial-setup-done
文件,将虚拟机配置为在下次引导时运行配置向导:# rm ~/.config/gnome-initial-setup-done
注意在下次引导时运行的向导依赖于已从虚拟机中删除的配置。另外,在克隆的第一次引导时,会建议您更改主机名。