如何在Linux上使用virt-sysprep重置KVM克隆虚拟机

时间:2020-01-09 10:43:14  来源:igfitidea点击:

我知道如何克隆KVM VM。
克隆后,如何重置克隆的VM。
如何重置,取消配置或者自定义虚拟机,以便进行克隆?
如何在基于Linux服务器的虚拟机管理程序上使用virt-sysprep命令重置KVM克隆虚拟机?

说明:您需要使用virt-sysprep命令来重置虚拟机。
您可以删除ssh密钥,主机名,网络mac配置,用户帐户等。
您可以启用或者禁用特定功能。
本教程显示如何一起使用virt-clone和virt-sysprep命令在基于Linux的服务器上克隆KVM VM。

使用virt-sysprep命令重置KVM克隆虚拟机的语法

语法为:

virt-sysprep -d kvmDomain

virt-sysprep -d kvmDomainHere options

在KVM VM上执行以重置它的sysprep操作列表

abrt-data删除ABRT生成的崩溃数据
backup-files从来宾中删除编辑器备份文件
bash-history删除来宾中的bash历史记录
blkid-tab移除访客中的blkid标签
ca-certificates移除来宾中的CA证书
crash-data除去kexec-tools生成的崩溃数据
cron-spool删除用户在职和cron-jobs
customize自定义访客
dhcp-client-state除去DHCP客户端租约
dhcp-server-state除去DHCP服务器租用
dovecot-data删除Dovecot(邮件服务器)数据
firewall-rules删除防火墙规则
flag-reconfiguration标记系统以进行重新配置
fs-uuids更改文件系统UUID
kerberos-data除去来宾中的Kerberos数据
logfiles从访客中删除许多日志文件
lvm-uuids更改LVM2 PV和VG UUID
machine-id删除本地计算机ID
mail-spool从本地邮件假脱机目录中删除电子邮件
net-hostname除去网络接口配置中的HOSTNAME和DHCP_HOSTNAME
net-hwaddr除去HWADDR(硬编码的MAC地址)配置
pacct-log删除进程记帐日志文件
package-manager-cache删除软件包管理器缓存
pam-data删除来宾中的PAM数据
passwd-backups除去/etc/passwd-和类似的备份文件
puppet-data-log删除puppet的数据和日志文件
rh-subscription-manager删除RH订阅管理器文件
rhn-systemid除去RHN系统ID
rpm-db除去主机特定的RPM数据库文件
samba-db-log除去Samba的数据库和日志文件
script对访客运行任意脚本
smolt-uuid除去Smolt硬件UUID
ssh-hostkeys除去来宾中的SSH主机密钥
ssh-userdir除去来宾中的.ssh目录
sssd-db-log除去sssd的数据库和日志文件
tmp-files删除临时文件
udev-persistent-net删除udev持久网络规则
user-account删除来宾中的用户帐户
utmp删除utmp文件
yum-uuid删除yum UUID

您可以选择要执行的sysprep操作。
给出一个逗号分隔的操作列表,例如:

virt-sysprep -d {vmDomainHere} --enable ssh-hostkeys,udev-persistent-net

步骤1.克隆您的VM并在KVM中产生新实例

首先使用virsh list命令获取所有正在运行的VM域/来宾的列表:

virsh list

输出示例:

1     openbsd62                      running
2     freebsd11-theitroad             running
3     fedora28-theitroad              running
4     rhel7                          running
5     centos7-theitroad               running
6     sles12sp3                      running
16    bionic                         running

首先挂起KVM,运行:

virsh suspend bionic

Domain bionic suspended

要使用virt-clone命令将名为bionic的虚拟机克隆为testvm,请运行:

virt-clone --original bionic --name testvm --auto-clone

您可以指定磁盘文件而不是--auto-clone选项:

# virt-clone --original bionicVM --name testVM02 --file /var/lib/libvirt/images/testvm02-disk01.qcow2

您可以恢复仿生虚拟机,运行:

virsh resume bionic

Domain bionic resumed

第2步。使用virt-sysprep命令

只需运行以下命令即可重置所有内容:

virt-sysprep -d testvm

您可以设置来宾的主机名,并强制将名为Hyman的用户帐户保留在来宾中:

virt-sysprep -d testvm --hostname testvm --enable user-account --keep-user-accounts Hyman

您可以创建一个名为tom的新Linux用户帐户,并在首次登录时强制更改密码,如下所示:

virt-sysprep -d testvm  --firstboot-command 'useradd -s /bin/bash -m -G sudo tom; chage -d 0 tom'

您也可以设置root用户帐户密码:

virt-sysprep -d testvm  --root-password password:MySuperSecureRootPasswordHere

或者合并所有这些:

virt-sysprep -d testvm --hostname testvm --keep-user-accounts Hyman --root-password password:MySuperSecureRootPasswordHere

如何跳过某些来宾VM重置功能

您可以使用--enable启用特定的操作。
例如,启用除重置fs-uuids(更改文件系统UUID),lvm-uuids(更改LVM2 PV和VG UUIDs)和ssh-userdir(在来宾中删除.ssh目录)以外的所有选项:

w=$(virt-sysprep --list-operations | egrep -v 'fs-uuids|lvm-uuids|ssh-userdir' | awk '{ printf "%s,", }' | sed 's/,$//')
echo "$w"

现在,如下运行:

virt-sysprep -d testvm --hostname testvm --keep-user-accounts Hyman --enable $w

另一个例子:

virt-sysprep -d testvm --hostname testvm --keep-user-accounts Hyman --enable $w --firstboot-command 'dpkg-reconfigure openssh-server'

virt-sysprep命令列表选项

-a, --add <file>                    Add disk image file
  --append-line <FILE:LINE>           Append line(s) to the file
  -c, --connect <uri>                 Set libvirt URI
  --chmod <PERMISSIONS:FILE>          Change the permissions of a file
  --color, --colors, --colour, --colours
                                      Use ANSI colour sequences even if not tty
  --commands-from-file <FILENAME>     Read customize commands from file
  --copy <SOURCE:DEST>                Copy files in disk image
  --copy-in <LOCALPATH:REMOTEDIR>     Copy local files or directories into image
  -d, --domain <domain>               Set libvirt guest name
  --delete <PATH>                     Delete a file or directory
  -n, --dryrun, --dry-run             Perform a dry run
  --echo-keys                         Don't turn off echo for passphrases
  --edit <FILE:EXPR>                  Edit file using Perl expression
  --enable <operations>               Enable specific operations
  --firstboot <SCRIPT>                Run script at first guest boot
  --firstboot-command <'CMD+ARGS'>    Run command at first guest boot
  --firstboot-install <PKG,PKG..>     Add package(s) to install at first boot
  --format <format>                   Set format (default: auto)
  --help                              Display brief help
  --hostname <HOSTNAME>               Set the hostname
  --install <PKG,PKG..>               Add package(s) to install
  --keep-user-accounts <users>        Users to keep
  --keys-from-stdin                   Read passphrases from stdin
  --link <TARGET:LINK[:LINK..]>       Create symbolic links
  --list-operations                   List supported operations
  --mkdir <DIR>                       Create a directory
  --mount-options <opts>              Set mount options (eg /:noatime;/var:rw,noatime)
  --move <SOURCE:DEST>                Move files in disk image
  --network                           Enable appliance network
  --no-logfile                        Scrub build log file
  --no-network                        Disable appliance network (default)
  --no-selinux-relabel                Compatibility option, does nothing
  --operation, --operations <operations>
                                      Enable/disable specific operations
  --password <USER:SELECTOR>          Set user password
  --password-crypto <md5|sha256|sha512>
                                      Set password crypto
  -q, --quiet                         Don't print progress messages
  --remove-user-accounts <users>      Users to remove
  --root-password <SELECTOR>          Set root password
  --run <SCRIPT>                      Run script in disk image
  --run-command <'CMD+ARGS'>          Run command in disk image
  --script <script>                   Script or program to run on guest
  --scriptdir <dir>                   Mount point on host
  --scrub <FILE>                      Scrub a file
  --selinux-relabel                   Relabel files with correct SELinux labels
  --sm-attach <SELECTOR>              Attach to a subscription-manager pool
  --sm-credentials <SELECTOR>         Credentials for subscription-manager
  --sm-register                       Register using subscription-manager
  --sm-remove                         Remove all the subscriptions
  --sm-unregister                     Unregister using subscription-manager
  --ssh-inject <USER[:SELECTOR]>      Inject a public key into the guest
  --timezone <TIMEZONE>               Set the default timezone
  --touch <FILE>                      Run touch on a file
  --truncate <FILE>                   Truncate a file to zero size
  --truncate-recursive <PATH>         Recursively truncate all files in directory
  --uninstall <PKG,PKG..>             Uninstall package(s)
  --update                            Update packages
  --upload <FILE:DEST>                Upload local file to destination
  -V, --version                       Display version and exit
  -v, --verbose                       Enable libguestfs debugging messages
  --write <FILE:CONTENT>              Write file
  -x                                  Enable tracing of libguestfs calls

步骤3.启动VM

virsh start testvm

Domain testvm started

使用以下virsh命令验证它:

virsh list

步骤4.登录到VM

使用以下命令以及grep命令查找/获取testvm的DHCP IP地址:

virsh net-dhcp-leases default

virsh net-dhcp-leases default | grep testvm

virsh net-dhcp-leases default | grep testvm | awk '{ print }'

输出示例:

192.168.122.174/24

使用ssh命令:

ssh [email protected]