使用Virsh程序管理KVM虚拟机

时间:2020-03-21 11:46:15  来源:igfitidea点击:

Virsh是Virtual Shell的缩写,是用于管理虚拟客户机的命令行用户界面。
Virsh允许我们创建,列出,编辑,启动,重新启动,停止,挂起,恢复,关闭和删除VM。
它目前支持KVM,LXC,Xen,QEMU,OpenVZ,VirtualBox和VMware ESX。
在本教程中,我们将讨论如何在Linux中使用Virsh管理用户界面来管理KVM虚拟机。

确保已在Linux计算机上安装了KVM和Virsh实用程序。

使用Virsh命令管理KVM虚拟机

获得帮助

如果我们不熟悉Virsh交互式终端或者不知道如何使用它,请输入以下命令以查看可用命令列表以及简要说明。

$virsh help

我们将看到大量可用的virsh命令,用于从命令行管理KVM虚拟机。

我们不必记住所有内容。
只需阅读要运行和使用的命令的说明。

这些命令分为以下几节:

  • 域管理
  • 域监控,
  • 主机和管理程序,
  • 检查站,
  • 界面,
  • 网络过滤器
  • 联网,
  • 节点设备,
  • 秘密,
  • 快照
  • 备份,
  • 储存池
  • 储存量
  • Virsh本身。

每个部分都包含与执行特定任务集相关的命令。
我们可以查看组的帮助部分,例如“网络”,如下所示:

$virsh help Networking

我们将看到与执行联网任务相关的命令:

Networking (help keyword 'network'):
    net-autostart                  autostart a network
    net-create                     create a network from an XML file
    net-define                     define an inactive persistent virtual network or modify an existing persistent one from an XML file
    net-destroy                    destroy (stop) a network
    net-dhcp-leases                print lease info for a given network
    net-dumpxml                    network information in XML
    net-edit                       edit XML configuration for a network
    net-event                      Network Events
    net-info                       network information
    net-list                       list networks
    net-name                       convert a network UUID to network name
    net-start                      start a (previously defined) inactive network
    net-undefine                   undefine a persistent network
    net-update                     update parts of an existing network's configuration
    net-uuid                       convert a network name to network UUID
    net-port-list                  list network ports
    net-port-create                create a network port from an XML file
    net-port-dumpxml               network port information in XML
    net-port-delete                delete the specified network port

我们还可以进一步显示特定命令的帮助部分。
例如,我将显示“ net-name”命令的帮助部分:

$virsh help net-name
  NAME
    net-name - convert a network UUID to network name
  SYNOPSIS
    net-name <network>
  OPTIONS
    [--network] <string>  network uuid

列出虚拟机

要以运行或者挂起模式查看来宾虚拟机的列表,请执行以下命令:

$virsh list
Id Name State
-------------------

如我们所见,没有来宾处于运行或者暂停模式。

我们可以使用--inactive选项列出不活动的来宾。

要查看所有来宾计算机,请运行:

$virsh list --all
 Id   Name            State
-------------------------------
 -    centos8-uefi    shut off
 -    nginx_centos8   shut off

如我们在上面的输出中看到的,我有两个虚拟机,分别是“ centos8-uefi”和“ nginx_centos8”。
两者均已关闭电源。

启动虚拟机

要启动虚拟机,例如“ centos8-uefi”,请运行:

$virsh start centos8-uefi

我们将看到类似以下的输出:

Domain centos8-uefi started

要验证虚拟机是否正在运行,请使用“列表”命令:

$virsh list
 Id   Name           State
-----------------------------
 1    centos8-uefi   running

保存虚拟机

要保存正在运行的VM的当前状态,请运行:

$virsh save centos8-uefi centos8-save
Domain centos8-uefi saved to centos8-save

该命令停止名为“ centos8-uefi”的guest虚拟机,并将数据保存到名为“ centos8-save”的文件中。
这将需要一些时间,具体取决于客户机所使用的内存量。

还原虚拟机

要恢复虚拟机以前保存的状态,只需指定文件名,如下所示:

$virsh restore centos8-save 
Domain restored from centos8-save

使用“ list”命令验证虚拟机是否已还原:

$virsh list
 Id   Name           State
-----------------------------
 4    centos8-uefi   running

重新启动虚拟机

要重新启动正在运行的VM,请运行:

$virsh reboot centos8-uefi
Domain centos8-uefi is being rebooted

挂起/暂停虚拟机

要挂起正在运行的VM,请执行以下操作:

$virsh suspend centos8-uefi 
Domain centos8-uefi suspended

使用“列表”命令验证它:

$virsh list
 Id   Name           State
----------------------------
 1    centos8-uefi   paused

恢复虚拟机

要恢复已暂停的VM,请运行:

$virsh resume centos8-uefi 
Domain centos8-uefi resumed

停止活动的虚拟机

要强制停止活动的VM,并使其保持非活动状态,请运行:

$virsh destroy centos8-uefi
Domain centos8-uefi destroyed

我们也可以正常停止VM,而不必像下面这样强制它:

$virsh destroy centos8-uefi --graceful
Domain centos8-uefi destroyed

关闭虚拟机

要关闭正在运行的VM,请执行以下操作:

$virsh shutdown centos8-uefi
Domain centos8-uefi is being shutdown

检索虚拟机XML转储

要在标准输出中显示VM的XML配置文件,请运行:

$virsh dumpxml centos8-uefi

此命令将显示虚拟机的完整配置详细信息(软件和硬件):

我们还可以将XML转储导出到文件中,而不仅仅是在标准输出中显示它,如下所示:

$virsh dumpxml centos8-uefi > centos8.xml

此命令会将“ centos8-uefi” XML文件转储到名为“ centos8.xml”的文件中,并将其保存在当前工作目录中。

使用XML转储创建虚拟机

我们可以使用以前创建的来宾中的现有XML创建新的虚拟来宾计算机。
首先,如上所述创建一个XML转储,然后使用如下所示的XML文件创建一个新的VM:

$virsh create centos8.xml 
Domain centos8-uefi created from centos8.xml

此命令将创建一个新的VM并立即启动它。
我们可以使用以下命令验证它:

编辑虚拟机XML配置文件

如果要在来宾计算机中进行任何更改,则可以简单地编辑其配置文件并根据需要进行更改。
来宾可以在其运行时或者脱机时进行编辑。

$virsh edit centos8-uefi

此命令将在我们使用$EDITOR变量设置的默认编辑器中打开文件。

启用虚拟机的控制台访问

创建KVM来宾计算机后,我们可以通过SSH,VNC客户端,Virt-viewer,Virt-manager和Cockpit Web控制台等访问它们。
但是,我们不能使用“ virsh console”命令来访问它们。
console命令用于连接来宾的虚拟串行控制台。
要使用“ virsh console”命令访问KVM guest虚拟机,我们需要在guest虚拟机中启用串行控制台访问。
请参考以下教程以启用virsh控制台访问:

  • 如何为KVM guest虚拟机启用Virsh控制台访问

重命名虚拟机

如果我们想重命名虚拟机,请参考以下教程。

  • 如何重命名KVM来宾虚拟机

显示虚拟机的域ID

要查找正在运行的来宾虚拟机的域ID,请运行:

$virsh domid centos8-uefi
2

请注意,来宾应该正在运行以获取其域ID。

显示虚拟机的域名

要获取正在运行的VM的域名,请运行:

$virsh domname <domain-id or domain-uuid>

例子:

$virsh domname 2
centos8-uefi

其中2是域ID。

显示虚拟机的UUID

要查找来宾计算机UUID,请运行:

$virsh domuuid <domain-name or domain-id>

例子:

$virsh domuuid centos8-uefi

或者,

$ virsh domuuid 2

输出示例:

de4100c4-632e-4c09-8dcf-bbde29170268

显示虚拟机详细信息

要显示来宾计算机的信息,请使用域名,域ID或者域uuid,如下所示:

$virsh dominfo centos8-uefi

或者,

$virsh dominfo 2

或者,

$virsh dominfo de4100c4-632e-4c09-8dcf-bbde29170268

输出示例:

Id:             
Name:           centos8-uefi
UUID:           de4100c4-632e-4c09-8dcf-bbde29170268
OS Type:        hvm
State:          shut off
CPU(s):         2
Max memory:     2097152 KiB
Used memory:    2097152 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0

显示主机信息

要获取主机系统的信息,请运行:

$virsh nodeinfo

输出示例:

CPU model:           x86_64
CPU(s):              4
CPU frequency:       1167 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         8058840 KiB

显示虚拟CPU信息

要显示虚拟CPU信息,请运行:

$virsh vcpuinfo <domain-id or domain-name or domain-uuid>

例子:

$virsh vcpuinfo centos8-uefi
VCPU: 0
CPU: 3
State: running
CPU time: 5.6s
CPU Affinity: yyyy
VCPU: 1
CPU: 1
State: running
CPU time: 0.0s
CPU Affinity: yyyy

查找虚拟机的IP地址

查找虚拟机的IP地址并不重要。
如果我们具有控制台访问虚拟机的权限,则可以使用“ ip”命令轻松找到其IP地址。
但是,也可以无需访问其控制台即可识别KVM VM的IP地址。
以下教程说明了如何查找KVM虚拟机的IP地址。

  • 如何查找KVM虚拟机的IP地址

删除虚拟机

如果我们不再需要虚拟机,只需将其删除,如下所示:

$virsh destroy centos8-uefi
$virsh undefine centos8-uefi

如果虚拟机已经在运行,则第一个命令将强制停止该虚拟机。
第二个命令将取消定义并完全删除它。

我们还可以进一步使用以下选项删除存储卷和快照。

--managed-save remove domain managed state file
--storage remove associated storage volumes (comma separated list of targets or source paths) (see domblklist)
--remove-all-storage remove all associated storage volumes (use with caution)
--delete-storage-volume-snapshots delete snapshots associated with volume(s)
--wipe-storage wipe data on the removed volumes
--snapshots-metadata remove all domain snapshot metadata (vm must be inactive)

管理虚拟网络

列出虚拟网络

要列出可用的虚拟网络,请运行:

$virsh net-list 
 Name      State    Autostart   Persistent
-------------------------------------------
 default   active   yes         yes

如我们所见,我只有一个虚拟网络,这是默认网络。

显示虚拟网络详细信息

要查看虚拟网络的详细信息,请运行:

$virsh net-dumpxml default

在上述命令中,用网络名称替换“默认”。

输出示例:

<network connections='1'>
  <name>default</name>
  <uuid>ce25d978-e455-47a6-b545-51d01bcb9e6f</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'
  <mac address='52:54:00:ee:35:49'
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'
    </dhcp>
  </ip>
</network>

启动虚拟网络

要启动不活动的网络,请运行:

$virsh net-start <Name-Of-Inactive-Network>

自动启动网络:

$virsh net-autostart <network-name>

创建虚拟网络XML转储

要创建现有虚拟网络的XML配置文件,请运行:

$virsh net-dumpxml default > default.xml

上面的命令将创建“默认”网络的XML配置,并将其保存在当前目录中名为“ default.xml”的文件中。

我们可以使用cat命令查看XML文件:

$cat default.xml 
<network connections='1'>
  <name>default</name>
  <uuid>ce25d978-e455-47a6-b545-51d01bcb9e6f</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'
  <mac address='52:54:00:ee:35:49'
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'
    </dhcp>
  </ip>
</network>

从XML文件创建新的虚拟网络

要使用现有的XML文件创建新的虚拟网络并立即启动,请运行:

$virsh net-create <Name-of-XMLfile>

如果要从XML文件创建网络但不想自动启动它,请运行:

$virsh net-define <Name-of-XMLfile>

停用虚拟网络

要停用活动网络,请运行:

$virsh net-destroy <network-name>

删除虚拟网络

要删除虚拟网络,请首先禁用它,如上所示,然后运行:

$virsh net-undefine <Name-Of-Inactive-Network>

Virsh有很多命令和选项。
完全学习使用Virsh命令行足以在Linux中设置完整的虚拟环境。
我们实际上并不需要GUI应用程序。

有关更多详细信息,请参见virsh手册页。

$man virsh

以图形方式管理KVM来宾

记住所有virsh命令几乎是不可能的,也是不必要的。
如果发现很难从命令行执行所有Kvm管理任务,则可以尝试使用图形KVM管理工具,例如Virt-manager和Cockpit。

  • 使用Cockpit Web控制台管理KVM虚拟机
  • 如何使用Virt-Manager管理KVM虚拟机