virsh管理虚拟机

创建KVM虚拟机 之后,我们可以通过 virsh 管理虚拟机的生命周期:

备注

本文案例以虚拟机 z-b-data-1 为案例

启动虚拟机

  • 最简单的启动虚拟机命令只需要虚拟机名字,例如启动 z-b-data-1

    virsh start z-b-data-1
    

在上述 start 命令之后,可以添加一些有用参数:

  • --console 启动虚拟机之后,连接到虚拟机的控制台

  • --paused 启动虚拟机进入暂停状态

  • -autodestroy 当virsh断开连接后自动销毁虚拟机

  • --bypass-cache 这个参数结合 managedsave 使用

  • --force-boot 放弃任何 managedsave 选项并导致全新启动

console 连接虚拟机

  • 连接到运行中的虚拟机:

    virsh console z-k8s-m-0
    

注意,如果之前有连接终端会话没有结束,则会出现报错:

error: operation failed: Active console session exists for this domain
  • 在终端连接会话中断开连接: 按下 ctrl+shift+]

配置虚拟机自动启动

  • virsh 提供了 autostart 命令设置虚拟机自动启动属性,也就是在操作系统启动时自动虚拟机。例如 私有云架构z-b-data-1 / z-b-data-2 / z-b-data-3 是部署所有虚拟机镜像存储的 Ceph Atlas 分布式存储,需要首先在物理服务器启动时自动启动,以便提供其他虚拟机启动时加载镜像:

    virsh autostart z-b-data-1
    

如果要关闭自动启动,则添加一个 --disable 参数:

virsh autostart --disable z-b-data-1

重启虚拟机

  • virsh 重启虚拟机命令 reboot ,并且提供了 --mode modename 参数:

    virsh reboot z-b-data-1
    

保存虚拟机运行状态

virsh save 命令可以将一个运行的虚拟机的虚拟内存当前状态保存到一个指定文件,之后就可以通过 virsh restore 恢复运行。这个命令有些类似 virsh suspend 命令,区别在于 suspend 是暂停在物理主机的内存中,所以如果服务器重启就不能恢复虚拟机的当前状态;而 save 是把虚拟机内存状态保存到磁盘文件,所以即使物理主机重启,也可以通过对应的 restore 命令从磁盘文件恢复。

备注

virsh save 是保存虚拟机的快照( snapshot )

  • virsh save 保存虚拟机状态:

    virsh save [--bypass-cache] domain file [--xml string] [--running] [--paused] [--verbose]
    

举例:

virsh save --bypass-cache z-dev z-dev.save

提示信息:

Domain z-dev saved to z-dev.save

一旦保存了虚拟机内存状态到磁盘文件,则虚拟机立即关闭

  • 对应我们可以恢复保存的虚拟机:

    virsh restore z-dev.save
    

提示信息:

Domain restored from z-dev.save

备注

保存 IOMMU 方式pass-through PCI设备的 z-b-data-1 虚拟机是报错的:

virsh save z-b-data-1 z-b-data-1.save

提示错误:

error: Failed to save domain z-b-data-1 to z-b-data-1.save
error: Requested operation is not valid: domain has assigned non-USB host devices

原因是 libvirt 冻结虚拟机时,虚拟机内部是不知道这个冻结操作,也就无法处理GPU设备的内存内容。解决的方法是采用 virsh dompmsuspend 挂起运行虚拟机 结合 QEMU虚拟机Agent 实现vram内存处理才能保存PCIe设备直通的虚拟机状态保存。

suspend 和 resume 虚拟机

virsh suspendvirsh resume 命令可用来挂起和解冻指定的虚拟机:

virsh suspend z-dev
virsh resume z-dev

重命名虚拟机

virsh domrename 可以重命名虚拟机,例如我改变虚拟机用途,用于构建第二个 Kubernetes Atlas 集群 Kubernetes集群(y-k8s)

virsh domrename z-k8s-n-6 y-k8s-m-1

参考