第 15 章 使用 virsh 管理客户端

virsh 是用来管理客户端及其管理程序的命令行界面工具。

virsh 工具是构建在 libvirt 管理 API 上,可作为 xm 命令和图形客户端管理程序(virt-manager)的替代工具使用。非特权用户只能以只读模式使用 virsh。您可使用 virsh 为客户端机器执行脚本。

virsh 命令快速参考

下表提供所有 virsh 命令行选项的快速参考。

命令Description
help打印基本帮助信息。
list列出所有客户端。
dumpxml输出客户端 XML 配置文件。
create从 XML 配置文件生成客户端并启动新客户端。
start启动未激活的客户端。
destroy强制客户端停止。
define为客户端输出 XML 配置文件。
domid显示客户端 ID。
domuuid显示客户端 UUID。
dominfo显示客户端信息。
domname显示客户端名称。
domstate显示客户端状态。
quit退出这个互动终端。
reboot重新启动客户端。
restore恢复以前保存在文件中的客户端。
resume恢复暂停的客户端。
save将客户端当前状态保存到某个文件中。
shutdown关闭某个域。
suspend暂停客户端。
undefine删除与客户端关联的所有文件。
migrate将客户端迁移到另一台主机中。
表 15.1. 客户端管理命令

使用以下 virsh 命令管理客户端及管理程序资源:

命令Description
setmem为客户端设定分配的内存。
setmaxmem为管理程序设定内存上限。
setvcpus修改为客户端分配的虚拟 CPU 数目。
vcpuinfo显示客户端的虚拟 CPU 信息。
vcpupin控制客户端的虚拟 CPU 亲和性。
domblkstat显示正在运行的客户端的块设备统计。
domifstat显示正在运行的客户端的网络接口统计。
attach-device使用 XML 文件中的设备定义在客户端中添加设备。
attach-disk在客户端中附加新磁盘设备。
attach-interface在客户端中附加新网络接口。
detach-device从客户端中分离设备,使用同样的 XML 描述作为命令 attach-device
detach-disk从客户端中分离磁盘设备。
detach-interface从客户端中分离网络接口。
表 15.2. 资源管理选项

这些是其它 virsh 选项:

命令Description
version显示 virsh 版本
nodeinfo有关管理程序的输出信息
表 15.3. 其它选项
连接至管理程序

使用 virsh 连接到管理程序会话:

  1. # virsh connect {hostname OR URL}

Where <name> is the machine name of the hypervisor. To initiate a read-only connection, append the above command with -readonly.

创建虚拟机 XML 转储(配置文件)

使用 virsh 输出客户端 XML 配置文件:

  1. # virsh dumpxml {domain-id, domain-name or domain-uuid}

This command outputs the guest’s XML configuration file to standard out (stdout). You can save the data by piping the output to a file. An example of piping the output to a file called guest.xml:

  1. # virsh dumpxml GuestID > guest.xml

This file guest.xml can recreate the guest (refer to 编辑客户端配置文件. You can edit this XML configuration file to configure additional devices or to deploy additional guests. Refer to 第 18.1 节 “使用带 virsh 的 XML 配置文件” for more information on modifying files created with virsh dumpxml.

virsh dumpxml 输出示例:

  1. # virsh dumpxml r5b2-mySQL01
  2. <domain type='xen' id='13'>
  3. <name>r5b2-mySQL01</name>
  4. <uuid>4a4c59a7ee3fc78196e4288f2862f011</uuid>
  5. <bootloader>/usr/bin/pygrub</bootloader>
  6. <os>
  7. <type>linux</type>
  8. <kernel>/var/lib/libvirt/vmlinuz.2dgnU_</kernel>
  9. <initrd>/var/lib/libvirt/initrd.UQafMw</initrd>
  10. <cmdline>ro root=/dev/VolGroup00/LogVol00 rhgb quiet</cmdline>
  11. </os>
  12. <memory>512000</memory>
  13. <vcpu>1</vcpu>
  14. <on_poweroff>destroy</on_poweroff>
  15. <on_reboot>restart</on_reboot>
  16. <on_crash>restart</on_crash>
  17. <devices>
  18. <interface type='bridge'>
  19. <source bridge='xenbr0'/>
  20. <mac address='00:16:3e:49:1d:11'/>
  21. <script path='vif-bridge'/>
  22. </interface>
  23. <graphics type='vnc' port='5900'/>
  24. <console tty='/dev/pts/4'/>
  25. </devices>
  26. </domain>
使用配置文件创建客户端

Guests can be created from XML configuration files. You can copy existing XML from previously created guests or use the dumpxml option (refer to 创建虚拟机 XML 转储(配置文件)). To create a guest with virsh from an XML file:

  1. # virsh create configuration_file.xml
编辑客户端配置文件

Instead of using the dumpxml option (refer to 创建虚拟机 XML 转储(配置文件)) guests can be edited either while they run or while they are offline. The virsh edit command provides this functionality. For example, to edit the guest named softwaretesting:

  1. # virsh edit softwaretesting

这样可打开文本编辑器。默认文本编辑器为 $EDITOR shell 参数(默认将其设定为 vi)。

挂起客户端

使用 virsh 挂起客户端:

  1. # virsh suspend {domain-id, domain-name or domain-uuid}

When a guest is in a suspended state, it consumes system RAM but not processor resources. Disk and network I/O does not occur while the guest is suspended. This operation is immediate and the guest can be restarted with the resume (恢复客户端) option.

恢复客户端

使用 virshresume 选项恢复客户端:

  1. # virsh resume {domain-id, domain-name or domain-uuid}

这个操作是立即生效的,客户端状态将处于 suspendresume 的循环中。

保存客户端

使用 virsh 命令将客户端的当前状态保存到文件中:

  1. # virsh save {domain-name, domain-id or domain-uuid} filename

This stops the guest you specify and saves the data to a file, which may take some time given the amount of memory in use by your guest. You can restore the state of the guest with the restore (恢复客户端) option. Save is similar to pause, instead of just pausing a guest the present state of the guest is saved.

恢复客户端

Restore a guest previously saved with the virsh save command (保存客户端) using virsh:

  1. # virsh restore filename

这个命令重新启动了保存的客户端,这会需要一段时间。客户端名称和 UUID 都会被保留,但会分配一个新的 id。

关闭客户端

使用 virsh 命令关闭客户端:

  1. # virsh shutdown {domain-id, domain-name or domain-uuid}

修改客户端配置文件中的 on_shutdown 参数可控制重启客户端的行为。

重新启动客户端

使用 virsh 重启客户端:

  1. #virsh reboot {domain-id, domain-name or domain-uuid}

修改客户端配置文件中的 on_reboot 参数控制重启客户端的行为。

强制客户端停止

使用 virsh 强制客户端停止:

  1. # virsh destroy {domain-id, domain-name or domain-uuid}

This command does an immediate ungraceful shutdown and stops the specified guest. Using virsh destroy can corrupt guest file systems . Use the destroy option only when the guest is unresponsive. For para-virtualized guests, use the shutdown option(关闭客户端) instead.

获得客户端域 ID

要获得客户端域 ID:

  1. # virsh domid {domain-name or domain-uuid}
获得客户端域名称

要获得客户端域名称:

  1. # virsh domname {domain-id or domain-uuid}
获得客户端 UUID

要获得客户端全局唯一识别符号(UUID):

  1. # virsh domuuid {domain-id or domain-name}

virsh domuuid 命令输出示例:

  1. # virsh domuuid r5b2-mySQL01
  2. 4a4c59a7-ee3f-c781-96e4-288f2862f011
显示客户端信息

使用带客户端域 ID、域名或者 UUID 的 virsh 命令可显示指定客户端的信息:

  1. # virsh dominfo {domain-id, domain-name or domain-uuid}

以下是 virsh dominfo 命令的输出示例:

  1. # virsh dominfo r5b2-mySQL01
  2. id: 13
  3. name: r5b2-mysql01
  4. uuid: 4a4c59a7-ee3f-c781-96e4-288f2862f011
  5. os type: linux
  6. state: blocked
  7. cpu(s): 1
  8. cpu time: 11.0s
  9. max memory: 512000 kb
  10. used memory: 512000 kb
显示主机信息

要显示主机信息:

  1. # virsh nodeinfo

virsh nodeinfo 命令输出示例:

  1. # virsh nodeinfo
  2. CPU model x86_64
  3. CPU (s) 8
  4. CPU frequency 2895 Mhz
  5. CPU socket(s) 2
  6. Core(s) per socket 2
  7. Threads per core: 2
  8. Numa cell(s) 1
  9. Memory size: 1046528 kb

这显示了节点信息和支持虚拟化进程的机器。

显示客户端

使用 virsh 显示客户端列表以及当前状态:

  1. # virsh list

其它可用选项包括:

--inactive 选项列出不活动的域(已经被定义但目前不活动的域),以及

--all 选项列出所有客户端。例如:

  1. # virsh list --all
  2. Id Name State
  3. ----------------------------------
  4. 0 Domain-0 running
  5. 1 Domain202 paused
  6. 2 Domain010 inactive
  7. 3 Domain9600 crashed

virsh list 输出结果分类成以下 6 个状态之一(如下)。

  • running 状态是指目前在 CPU 中活跃的客户端。

  • 列为 blocked 的客户端是被阻断的,且目前没有运行或者无法运行。这是由于客户端正在等待 I/O(传统的等待状态)或者客户端处于睡眠模式。

  • paused 状态列出暂停的域。如果管理员在 virt-managerxm pause 或者 virsh suspend 中使用 pause 标记就会出现这种状态。当客户端处于暂停状态时,它仍会消耗内存和其它资源,但无法从管理程序中调度 CPU 资源。

  • shutdown 状态是用于处于关闭过程中的客户端。向该客户端发送关闭信号并使其温和地停止操作。这可能不适用于所有客户端操作系统,有些操作系统对这些信号没有响应。

  • 处于 dying 状态的域是处于濒死状态,即该域还没有完全关闭或者崩溃。

  • 处于 crashed 状态的客户端是在运行时失败且无法再运行。这个状态只在将客户端配置为崩溃时不重启时出现。

显示虚拟 CPU 信息

使用 virsh 显示客户端中虚拟 CPU 的信息:

  1. # virsh vcpuinfo {domain-id, domain-name or domain-uuid}

virsh vcpuinfo 命令输出示例:

  1. # virsh vcpuinfo r5b2-mySQL01
  2. VCPU: 0
  3. CPU: 0
  4. State: blocked
  5. CPU time: 0.0s
  6. CPU Affinity: yy
配置虚拟 CPU 亲和性

使用物理 CPU 配置虚拟 CPU 的亲和性:

  1. # virsh vcpupin {domain-id, domain-name or domain-uuid} vcpu, cpulist

其中 vcpu 是虚拟 VCPU 号而 cpulist 列出了 CPU 的物理序号。

配置虚拟 CPU 计数

使用 virsh 修改分配给客户端的 CPU 数:

  1. # virsh setvcpus {domain-name, domain-id or domain-uuid} count

count 值不能超过创建客户端时指定的数目。

配置内存分配

使用 virsh 修改客户端内存分配:

  1. # virsh setmem {domain-id or domain-name} count

您必须以 KB 为单位指定 count。新 count 值不能超过您创建客户端时指定的数值。大多数客户端操作系统需要不低于 64MB 的值。较高的最大内存值不会影响活跃的客户端,除非新值较小,这会降低可用内存量。

显示客户端块设备信息

使用 virsh domblkstat 显示运行的客户端的块设备统计。

  1. # virsh domblkstat GuestName block-device
显示客户端网络设备信息

virsh domifstat 为运行的客户端显示网络接口统计。

  1. # virsh domifstat GuestName interface-device
使用 virsh 迁移客户端

可使用 virsh 将某个客户端迁移到另一台主机中。将域迁移到另一台主机中。添加 —live 进行实时迁移。migrate 命令接受以下格式的参数:

  1. # virsh migrate --live GuestName DestinationURL

--live 参数是可选的。实时迁移需要添加 --live 参数。

The GuestName parameter represents the name of the guest which you want to migrate.

The DestinationURL parameter is the URL or hostname of the destination system. The destination system must run the same version of Fedora, be using the same hypervisor and have libvirt running.

Once the command is entered you will be prompted for the root password of the destination system.

管理虚拟网络

这部分包括使用 virsh 管理虚拟网络。要列出虚拟网络:

  1. # virsh net-list

这个命令产生的输出类似如下:

  1. # virsh net-list
  2. Name State Autostart
  3. -----------------------------------------
  4. default active yes
  5. vnet1 active yes
  6. vnet2 active yes

要查看某一特定虚拟网络的信息:

  1. # virsh net-dumpxml NetworkName

这以 XML 格式显示指定虚拟网络的信息:

  1. # virsh net-dumpxml vnet1
  2. <network>
  3. <name>vnet1</name>
  4. <uuid>98361b46-1581-acb7-1643-85a412626e70</uuid>
  5. <forward dev='eth0'/>
  6. <bridge name='vnet0' stp='on' forwardDelay='0' />
  7. <ip address='192.168.100.1' netmask='255.255.255.0'>
  8. <dhcp>
  9. <range start='192.168.100.128' end='192.168.100.254' />
  10. </dhcp>
  11. </ip>
  12. </network>

其它用来管理虚拟网络的 virsh 命令:

  • virsh net-autostart *`network-name`* — 自动启动指定为 network-name 的网络。

  • virsh net-create *`XMLfile`* — 使用现有 XML 文件创建并启动新网络。

  • virsh net-define *`XMLfile`* — 使用现有 XML 文件创建新网络设备但不启动。

  • virsh net-destroy *`network-name`* — 销毁指定为 network-name 的网络。

  • virsh net-name *`networkUUID`* — 将指定的 networkUUID 转换为网络名称。

  • virsh net-uuid *`network-name`* — 将指定的 network-name 转换为网络 UUID。

  • virsh net-start *`nameOfInactiveNetwork`* — 启动不活跃的网络。

  • virsh net-undefine *`nameOfInactiveNetwork`* — 删除不活跃网络的定义。