管理虚拟机

虚拟机生命周期

总体介绍

概述

为了更好地利用硬件资源,降低成本,用户需要合理地管理虚拟机。本节介绍虚拟机生命周期过程中的基本操作,包括虚拟机创建、使用、删除等,指导用户更好地管理虚拟机。

虚拟机状态

虚拟机主要有如下几种状态:

  • 未定义(undefined):虚拟机未定义或未创建,即libvirt认为该虚拟机不存在。
  • 关闭状态(shut off):虚拟机已经被定义但未运行,或者虚拟机被终止。
  • 运行中(running):虚拟机处于运行状态。
  • 暂停(paused):虚拟机运行被挂起,其运行状态被临时保存在内存中,可以恢复到运行状态。
  • 保存(saved):与暂停(paused)状态类似,其运行状态被保存在持久性存储介质中,可以恢复到运行状态。
  • 崩溃(crashed):通常是由于内部错误导致虚拟机崩溃,不可恢复到运行状态。

状态转换

虚拟机不同状态之间可以相关转换,但必须满足一定规则。虚拟机不同状态之间的转换常用规则如图1所示。

图 1 状态转换图
管理虚拟机 - 图1

虚拟机标识

在libvirt中,完成创建的虚拟机实例称做一个“domain”,其描述了虚拟机的CPU、内存、网络设备、存储设备等各种资源的配置信息。在同一个主机上,每个domain具有唯一标识,通过虚拟机名称Name、UUID、Id表示,对应含义请参见表1。在虚拟机生命周期期间,可以通过虚拟机标识对特定虚拟机进行操作。

表 1 domain标识说明

标识

含义

Name

虚拟机名称

UUID

通用唯一识别码

Id

虚拟机运行标识

说明:

关闭状态的虚拟机无此标识。

管理虚拟机 - 图2 说明:
可通过virsh命令查询虚拟机Id和UUID,操作方法请参见查询虚拟机信息章节内容。

管理命令

概述

用户可以使用virsh命令工具管理虚拟机生命周期。本节介绍生命周期相关的命令以指导用户使用。

前提条件

  • 执行虚拟机生命周期操作之前,需要查询虚拟机状态以确定可以执行对应操作。状态之间的基本转换关系请参见”总体介绍”中的”状态转换”的内容。
  • 具备管理员权限。
  • 准备好虚拟机XML配置文件。

命令使用说明

用户可以使用virsh命令管理虚拟机生命周期,命令格式为:

  1. virsh <operate> <obj> <options>

各参数含义如下:

  • operate:管理虚拟机生命周期对应操作,例如创建、销毁、启动等。
  • obj:命令操作对象,如指定需要操作的虚拟机。
  • options:命令选项,该参数可选。

虚拟机生命周期管理各命令如表1所示。其中VMInstanse为虚拟机名称、虚拟机ID或者虚拟机UUID,XMLFile是虚拟机XML配置文件,DumpFile为转储文件,请根据实际情况修改。

表 1 虚拟机生命周期管理命令

命令

含义

virsh define <XMLFile>

定义持久化虚拟机,定义完成后虚拟机处于关闭状态,虚拟机被看作为一个domian实例

virsh create <XMLFile>

创建一个临时性虚拟机,创建完成后虚拟机处于运行状态

virsh start <VMInstanse>

启动虚拟机

virsh shutdown <VMInstanse>

关闭虚拟机。启动虚拟机关机流程,若关机失败可使用强制关闭

virsh destroy <VMInstanse>

强制关闭虚拟机

virsh reboot <VMInstanse>

重启虚拟机

virsh save <VMInstanse> <DumpFile>

将虚拟机的运行状态转储到文件中

virsh restore <DumpFile>

从虚拟机状态转储文件恢复虚拟机

virsh suspend <VMInstanse>

暂停虚拟机的运行,使虚拟机处于pasued状态

virsh resume <VMInstanse>

唤醒虚拟机,将处于paused状态的虚拟机恢复到运行状态

virsh undefine <VMInstanse>

销毁持久性虚拟机,虚拟机生命周期完结,不能继续对该虚拟机继续操作

示例

本节给出虚拟机生命周期管理相关命令的示例。

  • 创建虚拟机

    虚拟机XML配置文件为openEulerVM.xml,命令和回显如下:

    1. # virsh define openEulerVM.xml
    2. Domain openEulerVM defined from openEulerVM.xml
  • 启动虚拟机

    启动名称为openEulerVM的虚拟机,命令和回显如下:

    1. # virsh start openEulerVM
    2. Domain openEulerVM started
  • 重启虚拟机

    重启名称为openEulerVM的虚拟机,命令和回显如下:

    1. # virsh reboot openEulerVM
    2. Domain openEulerVM is being rebooted
  • 关闭虚拟机

    关闭名称为openEulerVM的虚拟机,命令和回显如下:

    1. # virsh shutdown openEulerVM
    2. Domain openEulerVM is being shutdown
  • 销毁虚拟机

    • 若虚拟机启动时未使用nvram文件,销毁虚拟机命令如下:

      1. # virsh undefine <VMInstanse>
    • 若虚拟机启动时使用了nvram文件,销毁该虚拟机需要指定nvram的处理策略,命令如下:

      1. # virsh undefine <VMInstanse> <strategy>

      其中为销毁虚拟机的策略,可取值:

      nvram:销毁虚拟机的同时删除其对应的nvram文件。

      keep-nvram:销毁虚拟机,但保留其对应的nvram文件。

      例如,删除虚拟机openEulerVM及其nvram文件,命令和回显如下:

      1. # virsh undefine openEulerVM --nvram
      2. Domain openEulerVM has been undefined

在线修改虚拟机配置

概述

虚拟机创建之后用户可以修改虚拟机的配置信息,称为在线修改虚拟机配置。在线修改配置以后,新的虚拟机配置文件会被持久化,并在虚拟机关闭、重新启动后生效。

修改虚拟机配置命令格式如下:

  1. virsh edit <VMInstance>

virsh edit命令通过编辑“domain”对应的XML配置文件,完成对虚拟机配置的更新。virsh edit使用vi程序作为默认的编辑器,可以通过修改环境变量“EDITOR”或“VISUAL”指定编辑器类型。virsh edit默认优先使用“VISUAL”环境变量指定的文本编辑器。

操作步骤

  1. (可选)设置virsh edit命令的编辑器为vim。

    1. # export VISUAL=vim
  2. 使用virsh edit打开虚拟机名称为openEulerVM对应的XML配置文件。

    1. # virsh edit openEulerVM
  3. 修改虚拟机配置文件。

  4. 保存虚拟机配置文件并退出。
  5. 重启虚拟机使配置修改生效。

    1. # virsh reboot openEulerVM

查询虚拟机信息

概述

管理员在管理虚拟机的过程中经常需要知道一些虚拟机信息,libvirt提供了一套命令行工具用于查询虚拟机的相关信息。本章介绍相关命令的使用方法,便于管理员来获取虚拟机的各种信息。

前提条件

查询虚拟机信息需要:

  • libvirtd服务处于运行状态。

  • 命令行操作需要拥有管理员权限。

查询主机上的虚拟机信息

  • 查询主机上处于运行和暂停状态的虚拟机列表。

    1. # virsh list

    例如,下述回显说明当前主机上存在3台虚拟机,其中openEulerVM01、openEulerVM02处于运行状态,openEulerVM03处于暂停状态。

    1. Id Name State
    2. ----------------------------------------------------
    3. 39 openEulerVM01 running
    4. 40 openEulerVM02 running
    5. 69 openEulerVM03 paused
  • 查询主机上已经定义的所有虚拟机信息列表。

    1. # virsh list --all

    例如,下述回显说明当前主机上定义了4台虚拟机,其中虚拟机openEulerVM01处于运行状态,openEulerVM02处于暂停状态,openEulerVM03和openEulerVM04处于关机状态。

    1. Id Name State
    2. ----------------------------------------------------
    3. 39 openEulerVM01 running
    4. 69 openEulerVM02 paused
    5. - openEulerVM03 shut off
    6. - openEulerVM04 shut off

查询虚拟机基本信息

Libvirt组件提供了一组查询虚拟机状态信息的命令,包括虚拟机运行状态、设备信息或者调度属性等,使用方法请参见表1

表 1 查询虚拟机基本信息

查询的信息内容

命令行

说明

基本信息

virsh dominfo <VMInstance>

包括虚拟机ID、UUID,虚拟机规格等信息。

当前状态

virsh domstate <VMInstance>

可以使用—reason选项查询虚拟机变为当前状态的原因。

调度信息

virsh schedinfo <VMInstance>

包括vCPU份额信息。

vCPU数目

virsh vcpucount <VMInstance>

查询虚拟机vCPU的个数。

虚拟块设备状态

virsh domblkstat <VMInstance>

查询块设备名称可以使用virsh domblklist命令。

虚拟网卡状态

virsh domifstat <VMInstance>

查询网卡名称可以使用virsh domiflist命令。

I/O线程

virsh iothreadinfo <VMInstance>

查询虚拟机I/O线程及其CPU亲和性信息

示例

  • 使用virsh dominfo查询一个创建好的虚拟机的基本信息,从查询结果可知,虚拟机ID为5,UUID为ab472210-db8c-4018-9b3e-fc5319a769f7,内存大小为8GiB,vCPU数目为4个等。

    1. # virsh dominfo openEulerVM
    2. Id: 5
    3. Name: openEulerVM
    4. UUID: ab472210-db8c-4018-9b3e-fc5319a769f7
    5. OS Type: hvm
    6. State: running
    7. CPU(s): 4
    8. CPU time: 6.8s
    9. Max memory: 8388608 KiB
    10. Used memory: 8388608 KiB
    11. Persistent: no
    12. Autostart: disable
    13. Managed save: no
    14. Security model: none
    15. Security DOI: 0
  • 使用virsh domstate查询虚拟机的当前状态,从查询结果可知,虚拟机openEulerVM当前处于运行状态。

    1. # virsh domstate openEulerVM
    2. running
  • 使用virsh schedinfo查询虚拟机的调度信息,从查询结果可知,虚拟机CPU预留份额为1024。

    1. # virsh schedinfo openEulerVM
    2. Scheduler : posix
    3. cpu_shares : 1024
    4. vcpu_period : 100000
    5. vcpu_quota : -1
    6. emulator_period: 100000
    7. emulator_quota : -1
    8. global_period : 100000
    9. global_quota : -1
    10. iothread_period: 100000
    11. iothread_quota : -1
  • 使用virsh vcpucount查询虚拟机的vCPU数目,从查询结构可知,虚拟机有4个CPU。

    1. # virsh vcpucount openEulerVM
    2. maximum live 4
    3. current live 4
  • 使用virsh domblklist查询虚拟机磁盘设备信息,从查询结构可知,虚拟机有2个磁盘,sda是qcow2格式的虚拟磁盘,sdb是一个cdrom设备。

    1. # virsh domblklist openEulerVM
    2. Target Source
    3. ---------------------------------------------------------------------
    4. sda /home/openeuler/vm/openEuler_aarch64.qcow2
    5. sdb /home/openeuler/vm/openEuler-20.03-LTS-aarch64-dvd.iso
  • 使用virsh domiflist查询虚拟机网卡信息,从查询结果可知,虚拟机有1张网卡,对应的后端是vnet0在主机br0网桥上,MAC地址为00:05:fe:d4:f1:cc。

    1. # virsh domiflist openEulerVM
    2. Interface Type Source Model MAC
    3. -------------------------------------------------------
    4. vnet0 bridge br0 virtio 00:05:fe:d4:f1:cc
  • 使用virsh iothreadinfo查询虚拟机I/O线程信息,从查询结果可知虚拟机有5个I/O线程,在物理CPU7-10上进行调度。

    1. # virsh iothreadinfo openEulerVM
    2. IOThread ID CPU Affinity
    3. ---------------------------------------------------
    4. 3 7-10
    5. 4 7-10
    6. 5 7-10
    7. 1 7-10
    8. 2 7-10

登录虚拟机

本章介绍使用VNC登录虚拟机的方法。

使用VNC密码登录

概述

当虚拟机操作系统安装部署完成之后,用户可以通过VNC协议远程登录虚拟机,从而对虚拟机进行管理操作。

前提条件

使用RealVNC、TightVNC等客户端登录虚拟机,在登录虚拟机之前需要获取如下信息:

  • 虚拟机所在主机的IP地址。
  • 确保客户端所在的环境可以访问到主机的网络。
  • 虚拟机的VNC侦听端口,该端口一般在客户机启动时自动分配,一般为5900 + x(x为正整数,按照虚拟机启动的顺序递增,且5900对用户不可见)。
  • 如果VNC设置了密码,还需要获取虚拟机的VNC密码。

    管理虚拟机 - 图3 说明:
    为虚拟机VNC配置密码,需要编辑虚拟机XML配置文件,即为graphics元素新增一个passwd属性,属性的值为要配置的密码。例如,将虚拟机的VNC密码配置为n8VfjbFK的XML配置参考如下:

    1. <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us' passwd='n8VfjbFK'>
    2. <listen type='address' address='0.0.0.0'/>
    3. </graphics>

操作步骤

  1. 查询虚拟机使用的VNC端口号。例如名称为openEulerVM的虚拟机,命令如下:

    1. # virsh vncdisplay openEulerVM
    2. :3

    管理虚拟机 - 图4 说明:
    登录 VNC 需要配置防火墙规则,允许 VNC 端口的连接。参考命令如下,其中X为数值“5900 + 端口号” ,例如本例中为5903。

    1. firewall-cmd --zone=public --add-port=X/tcp
  2. 打开VncViewer软件,输入主机IP和端口号。格式为“主机IP:端口号”,例如:“10.133.205.53:3”。

  3. 单击“确定”输入VNC密码(可选),登录到虚拟机VNC进行操作。

配置VNC-TLS登录.md”>配置VNC TLS登录

概述

VNC服务端和客户端默认采用明文方式进行数据传输,因此通信内容可能被第三方截获。为了提升安全性,openEuler支持VNC服务端配置TLS模式进行加密认证。TLS(Tansport Layer Security)即传输层安全,可以实现VNC服务端和客户端之间加密通信,从而防止通信内容被第三方截获。

管理虚拟机 - 图5 说明:

  • 使用TLS加密认证模式需要VNC客户端支持TLS模式(例如TigerVNC),否则无法连接到VNC客户端。
  • TLS加密认证模式配置粒度为主机服务器级别,开启该特性后,主机上正在运行的所有虚拟机对应的VNC客户端都将开启TLS加密认证模式。

操作步骤

VNC开启TLS加密认证模式的操作步骤如下:

  1. 登录VNC服务端所在主机登录VNC服务端所在主机,开启或修改服务端配置文件/etc/libvirt/qemu.conf中对应的配置项。相关配置内容如下所示:

    1. vnc_listen = "x.x.x.x" # "x.x.x.x"为VNC的侦听地址,请用户根据实际配置,VNC服务端只允许该地址或地址段范围内的客户端连接请求
    2. vnc_tls = 1 # 配置为1,表示开启VNC TLS支持
    3. vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc" #指定证书存放的路径为/etc/pki/libvirt-vnc
    4. vnc_tls_x509_verify = 1 #配置为1,表示TLS认证使用X509证书
  2. 为VNC创建证书和私钥文件。此处以GNU TLS为例进行说明。

    管理虚拟机 - 图6 说明:
    使用GNU TLS,请提前安装好gnu-utils软件包。

    1. 制作证书颁发机构CA(Certificate Authority)的证书文件。

      1. # certtool --generate-privkey > ca-key.pem
    2. 制作自签名的CA证书公私钥。其中Your organization name为机构名,由用户指定。

      1. # cat > ca.info<<EOF
      2. cn = Your organization name
      3. ca
      4. cert_signing_key
      5. EOF
      1. # certtool --generate-self-signed \
      2. --load-privkey ca-key.pem \
      3. --template ca.info \
      4. --outfile ca-cert.pem

      上述生成文件,ca-cert.pem是生成的CA公钥,ca-key.pem是生成的CA私钥,需要由CA妥善保管防止泄露。

    3. 为VNC服务端颁发证书。其中Client Organization Name为实际的服务名称,例如cleint.foo.com,需要用户根据实际指定。

      1. # cat > server.info<<EOF
      2. cn = Server Organization Name
      3. tls_www_server
      4. encryption_key
      5. signing_key
      6. EOF
      1. # certtool --generate-privkey > server-key.pem
      2. # certtool --generate-certificate \
      3. --load-ca-certificate ca-cert.pem \
      4. --load-ca-privkey ca-key.pem \
      5. --load-privkey server-key.pem \
      6. --template server.info \
      7. --outfile server-cert.pem

      上述生成文件,server-key.pem是VNC服务端的私钥,server-cert.pem是VNC服务端的公钥。

    4. 为VNC客户端颁发证书。

      1. # cat > client.info<<EOF
      2. cn = Client Organization Name
      3. tls_www_client
      4. encryption_key
      5. signing_key
      6. EOF
      1. # certtool --generate-privkey > client-key.pem
      2. # certtool --generate-certificate \
      3. --load-ca-certificate ca-cert.pem \
      4. --load-ca-privkey ca-key.pem \
      5. --load-privkey client-key.pem \
      6. --template client.info \
      7. --outfile client-cert.pem

      上述生成文件,client-key.pem是VNC客户端的私钥,client-cert.pem是VNC客户端的公钥,生成的公私钥对需要拷贝到VNC客户端。

  3. 关闭需要被登录的虚拟机,重启VNC服务端所在主机的libvirtd服务。

    1. # systemctl restart libvirtd
  4. 将生成的服务端证书放置到VNC服务端指定目录并将证书的权限改为只允许当前用户读写。

    1. # sudo mkdir -m 750 /etc/pki/libvirt-vnc
    2. # cp ca-cert.pem /etc/pki/libvirt-vnc/ca-cert.pem
    3. # cp server-cert.pem /etc/pki/libvirt-vnc/server-cert.pem
    4. # cp server-key.pem /etc/pki/libvirt-vnc/server-key.pem
    5. # chmod 0600 /etc/pki/libvirt-vnc/*
  5. 将生成的客户端证书ca-cert.pem,client-cert.pem和client-key.pem拷贝到VNC客户端。配置VNC客户端的TLS证书后即可使用VNC TLS登录。

    管理虚拟机 - 图7 说明:

    • VNC客户端证书的配置请参见各客户端对应的使用说明,由用户自行配置。
    • 登录虚拟机的方式请参见“使用VNC密码登录”。