zl程序教程

您现在的位置是:首页 >  其他

当前栏目

kvm虚拟机管理之一(磁盘压缩,用户密码重设,快照建立)

密码密码虚拟机 管理 用户 建立 压缩 磁盘
2023-09-14 09:13:15 时间

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