kvm的虚拟机安装完毕后仅仅是万里长征的第一步,后面还有许多的事情要处理,比如,kvm镜像的定制--根据需求添加用户,更改root用户密码(为什么要说更改root用户密码?很多同学会有疑问,kvm镜像启动进系统passwd命令就搞定的事情,还需要说嘛?其实是官方的kvm镜像root密码是需要更改的,有的时候连初始密码都没有的哦),添加新的磁盘到kvm镜像内,或者出于安全考虑给kvm镜像做快照,如果有多个快照,如何管理这些快照也是一个问题。当然,如果有N个kvm镜像,这些镜像需不需要随系统启动而启动,如果停止了如何让它启动,等等都是需要做的管理工作。
kvm镜像的压缩
kvm镜像压缩目前知道的有两种方法,第一是使用qemu-img 直接操作kvm镜像压缩,第二是使用管理工具libguestfs-tools 里的工具virt-syprep和virt-sparsify压缩。
(1)qemu-img直接操作kvm镜像压缩
比如,我有一个自制的linux镜像 linux.img 这个文件,压缩成new.linux.img 这个文件,压缩命令为:
qemu-img convert -c -O qcow2 linux.img new.linux.img
那么,我们可以对比一下压缩前后镜像的大小,可以看到压缩效果比较明显,从1.3G缩小到了621M,并且新镜像也是可以用的哦:
[root@centos1 opt]# ls -alh total 2.0G drwxr-xr-x. 4 root root 162 May 14 22:39 . dr-xr-xr-x. 17 root root 244 May 14 19:19 .. drwxr-xr-x 3 root root 16K May 14 19:23 kvm-1.5.3 -rw-r--r-- 1 root root 110M May 14 19:28 kvm-1.5.3.tar.gz drwxr-xr-x 3 root root 4.0K May 9 20:26 libguestfs-tools -rw-r--r-- 1 root root 11M May 14 19:21 libguestfs-tools.tar.gz -rw-r--r-- 1 root root 1.3G May 15 09:40 linux.img -rw-r--r-- 1 root root 3.8K May 14 22:00 linux_mini.xml -rw-r--r-- 1 root root 621M May 14 22:41 new.linux.img
(2)
先通过virt-sysprep -d kvm镜像名称 清理机器信息,然后通过virt-sparsify --compress 原有镜像文件 压缩的镜像文件
这里需要注意一下,通过xml文件方式启动的kvm镜像,需要先define定义,然后在清理,说人话就是,虚拟机必须是关机状态,必须将xml文件先定义。否则虚拟机关闭后,virsh list 将不会看到虚拟机的domain也就是域。
执行清理命令前,需要export LIBGUESTFS_BACKEND=direct,一般报错提示会给这个的哦。
virt-sysprep -d kvm镜像名称 这里是virsh list --all 里面查到的那个名字,virt-sparsify --compress 原有镜像文件 指的是 img文件。
[root@centos1 opt]# virsh define linux_mini.xml Domain linux_mini defined from linux_mini.xml [root@centos1 opt]# virsh list --all Id Name State ---------------------------------------------------- - linux_mini shut off [root@centos1 opt]# virt-sysprep -d linux_mini [ 0.0] Examining the guest ... virt-sysprep: error: libguestfs error: could not create appliance through libvirt. Try running qemu directly without libvirt using this environment variable: export LIBGUESTFS_BACKEND=direct Original error from libvirt: unsupported configuration: shared access for disk 'sdb' requires use of supported storage format [code=67 int1=-1] If reporting bugs, run virt-sysprep with debugging enabled and include the complete output: virt-sysprep -v -x [...] [root@centos1 opt]# export LIBGUESTFS_BACKEND=direct [root@centos1 opt]# virt-sysprep -d linux_mini [ 0.0] Examining the guest ... [ 4.7] Performing "abrt-data" ... [ 4.7] Performing "backup-files" ... [ 6.1] Performing "bash-history" ... [ 6.1] Performing "blkid-tab" ... [ 6.1] Performing "crash-data" ... [ 6.1] Performing "cron-spool" ... [ 6.1] Performing "dhcp-client-state" ... [ 6.1] Performing "dhcp-server-state" ... [ 6.1] Performing "dovecot-data" ... [ 6.1] Performing "logfiles" ... [ 6.3] Performing "machine-id" ... [ 6.3] Performing "mail-spool" ... [ 6.3] Performing "net-hostname" ... [ 6.3] Performing "net-hwaddr" ... [ 6.3] Performing "pacct-log" ... [ 6.3] Performing "package-manager-cache" ... [ 6.3] Performing "pam-data" ... [ 6.3] Performing "passwd-backups" ... [ 6.3] Performing "puppet-data-log" ... [ 6.3] Performing "rh-subscription-manager" ... [ 6.3] Performing "rhn-systemid" ... [ 6.3] Performing "rpm-db" ... [ 6.3] Performing "samba-db-log" ... [ 6.3] Performing "script" ... [ 6.3] Performing "smolt-uuid" ... [ 6.3] Performing "ssh-hostkeys" ... [ 6.3] Performing "ssh-userdir" ... [ 6.3] Performing "sssd-db-log" ... [ 6.3] Performing "tmp-files" ... [ 6.3] Performing "udev-persistent-net" ... [ 6.3] Performing "utmp" ... [ 6.3] Performing "yum-uuid" ... [ 6.3] Performing "customize" ... [ 6.3] Setting a random seed [ 6.4] Performing "lvm-uuids" ... [root@centos1 opt]# virt-sparsify --compress linux.img newer.linux.img [ 0.0] Create overlay file in /tmp to protect source disk [ 0.1] Examine source disk [ 3.4] Clearing Linux swap on /dev/centos/swap ◓ 34% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒═════════════════════════ 略略略 ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00 [ 159.0] Copy to destination and make sparse [ 336.8] Sparsify operation completed with no errors. virt-sparsify: Before deleting the old disk, carefully check that the target disk boots and works correctly
可以看到,第二种方式压缩出来的文件更小了,达到了490M,比原来的1.3G小很多了。
[root@centos1 opt]# ls -alh total 2.5G drwxr-xr-x. 4 root root 185 May 15 10:01 . dr-xr-xr-x. 17 root root 244 May 14 19:19 .. drwxr-xr-x 3 root root 16K May 14 19:23 kvm-1.5.3 -rw-r--r-- 1 root root 110M May 14 19:28 kvm-1.5.3.tar.gz drwxr-xr-x 3 root root 4.0K May 9 20:26 libguestfs-tools -rw-r--r-- 1 root root 11M May 14 19:21 libguestfs-tools.tar.gz -rw-r--r-- 1 root root 1.3G May 15 09:57 linux.img -rw-r--r-- 1 root root 3.8K May 14 22:00 linux_mini.xml -rw-r--r-- 1 root root 490M May 15 10:04 newer.linux.img -rw-r--r-- 1 root root 621M May 14 22:41 new.linux.img
kvm镜像的用户密码重设问题
用户密码重设通常使用libguestfs-tools 工具集内的virt-customize命令重设。
例如我的kvm磁盘镜像文件存放在/opt目录下:
[root@centos1 opt]# ls -alh linux.img -rw-r--r-- 1 root root 1.3G May 15 09:57 linux.img
如果有报错,需要执行环境变量的设置:
export LIBGUESTFS_BACKEND=direct
重置密码前需要确保该kvm镜像文件没有被任何domain使用。
[root@centos1 opt]# virt-customize -a /opt/linux.img --root-password password:123456 [ 0.0] Examining the guest ... [ 6.4] Setting a random seed [ 6.4] Setting passwords [ 8.8] Finishing off
此时,再次启用这个kvm镜像,就可以使用密码123456登录啦。 root密码都有了,登录上去,也就别的任意密码都有了。
kvm镜像的快照建立和管理的问题
虚拟机快照按虚拟机的状态,分为两种,冷备和热备,冷备指的是kvm虚拟机是关机状态,热备指的是kvm虚拟机是开机状态,kvm的快照和vm的快照是基本一样的。
虚拟机的快照安装建立快照的方式分为三种,第一种是磁盘快照,对应的命令是 virsh snapshot第二种是内存状态快照,对应的命令是 virsh save
(1)
磁盘快照---类似vm里的快照功能,是一个独立的快照系统。
可以看到,通过virsh snapshot-create-as 命令打出来的快照时间,快照实际上做的是虚拟机的XML配置文件,默认快照XML文件在/var/lib/libvirt/qemu/snapshot/
,因此,kvm的快照速度是很快的,并且基本没有什么空间占用的问题,也因此,如果需要对快照进行管理,其实我们只需要将上述文件夹内的xml管理好就可以了。
[root@centos1 opt]# virsh list --all Id Name State ---------------------------------------------------- - linux_mini shut off [root@centos1 opt]# virsh snapshot-create-as linux_mini linux_min-snap Domain snapshot linux_min-snap created [root@centos1 opt]# virsh list --all Id Name State ---------------------------------------------------- - linux_mini shut off [root@centos1 opt]# virsh info newer.linux.img error: unknown command: 'info' [root@centos1 opt]# qemu-img info newer.linux.img image: newer.linux.img file format: qcow2 virtual size: 15G (16106127360 bytes) disk size: 496M cluster_size: 65536 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 linux_min-snap 0 2022-05-15 10:42:23 00:00:00.000 Format specific information: compat: 1.1 lazy refcounts: false
快照的恢复分为两个步骤:第一,查询某个虚拟机的现有快照名称,第二,根据快照名称,使用snapshot-revert参数恢复快照。
建立一个快照,名称为new-snapshot,此时kvm虚拟机是开启的时候建立的快照
[root@centos1 linux_mini]# virsh snapshot-create-as linux_mini new-snapshot Domain snapshot new-snapshot created
查询到了这个快照名称
[root@centos1 linux_mini]# virsh snapshot-list linux_mini Name Creation Time State ------------------------------------------------------------ linux_min-snap 2022-05-15 10:42:23 +0800 shutoff new-snapshot 2022-05-15 14:34:29 +0800 running
使用刚才建立的这个new快照,恢复,可以看到虚拟机状态从关机变为开机状态
[root@centos1 linux_mini]# virsh snapshot-revert linux_mini new-snapshot [root@centos1 linux_mini]# virsh list --all Id Name State ---------------------------------------------------- 9 linux_mini running
通过 virsh snapshot-current 虚拟机名称 可以看到,两个快照中的new快照有在运行。
[root@centos1 linux_mini]# virsh snapshot-current linux_mini <domainsnapshot> <name>new-snapshot</name> <state>running</state> <parent> <name>linux_min-snap</name> </parent> <creationTime>1652596469</creationTime>
观察宿主机的磁盘使用率可以发现,每生成一个快照(开机状态下的kvm虚拟机),会增加一个kvm虚拟机的大小使用,而关机状态下的kvm虚拟机打快照基本没有什么占用。
/dev/mapper/centos-root 50G 4.1G 46G 9% / /dev/mapper/centos-root 50G 4.6G 46G 10% /
因此,虚拟机快照应该是在关机状态下建立的哦,否则会多出很多磁盘空间占用。
多说一句,有建立快照的kvm镜像是不允许undefine的哦,如果想要undfine,需要将快照全部删除的哦:
[root@centos1 opt]# virsh undefine linux_mini error: Failed to undefine domain linux_mini error: Requested operation is not valid: cannot delete inactive domain with 4 snapshots
删除快照:
[root@centos1 opt]# virsh snapshot-list linux_mini Name Creation Time State ------------------------------------------------------------ linux_min-snap 2022-05-15 10:42:23 +0800 shutoff new-snapshot 2022-05-15 14:34:29 +0800 running newer-snapshot 2022-05-15 14:50:31 +0800 running newset-snapshot 2022-05-15 14:54:49 +0800 shutoff [root@centos1 opt]# virsh snapshot-delete linux_mini linux_min-snap Domain snapshot linux_min-snap deleted [root@centos1 opt]# virsh snapshot-delete linux_mini new-snapshot Domain snapshot new-snapshot deleted [root@centos1 opt]# virsh snapshot-delete linux_mini newer-snapshot Domain snapshot newer-snapshot deleted [root@centos1 opt]# virsh snapshot-delete linux_mini newset-snapshot Domain snapshot newset-snapshot deleted [root@centos1 opt]# virsh undefine linux_mini Domain linux_mini has been undefined
逐个删除快照后,就可以undefine啦。
(2)内存快照---比较类似vm的克隆,但和克隆又不是一回事,一个独立的另一个快照系统。
[root@centos1 images]# virsh list --all Id Name State ---------------------------------------------------- 10 linux_mini running [root@centos1 images]# virsh save linux_mini /opt/linux_mini_save --bypass-cache --running Domain linux_mini saved to /opt/linux_mini_save [root@centos1 images]# virsh list --all Id Name State ---------------------------------------------------- - linux_mini shut off
此时可以看到,内存快照生成指定在了/opt目录下名字为linux_mini_save ,原来的虚拟机格式为qcow2格式,现在快照为raw格式,大小从621M变为了239M:
[root@centos1 opt]# qemu-img info linux_mini_save image: linux_mini_save file format: raw virtual size: 239M (250549248 bytes) disk size: 239M
恢复快照就比较简单了,直接restore 快照文件就可以啦,当然了,save的快照文件不是通过libvrit服务管理的,因此,virsh snapshot-list 命令是看不到的哦:
[root@centos1 opt]# virsh shutdown linux_mini Domain linux_mini is being shutdown [root@centos1 opt]# virsh restore linux_mini_save Domain restored from linux_mini_save [root@centos1 opt]# virsh list --all Id Name State ---------------------------------------------------- 12 linux_mini running