# Libvirt 命令

## 写在前面

### Libvirt

Libvirt是用于管理虚拟化平台的开源API，后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX、QEMU和其他虚拟化技术。

ibvirt是提供了一个方便的方式来管理虚拟机和其他虚拟化功能的软件的集合，如存储和网络接口管理。这些软件包括一个API库，一个守护进程（Libvirtd），和一个命令行实用程序（virsh）。

本次针对“Libvirt 命令”主要针对libvirt的命令行工具“virsh”进行记录。

### 重要目录

- libvirt.conf： 针对virsh命令主要是关于客户端的配置文件 。 一般默认的就满足要求了。
- libvirtd.conf ：主要是针对服务器端的配置文件 ，它提供了不同的安全选项，请求限制和日志选项。
- qemu.conf： 主要是针对QEMU 设备 的主要配置文件 ，比如VNC服务器地址的配置选项等 。
- 在创建完QEMU/KVM虚拟机后，/etc/libvirtd/qemu目录将会包含虚拟机的配置定义。
- /etc/libvirt/qemu/networks/包含了网络相关的配置文件 。

### 概念

* Node（节点）是一个物理机器，上面可能运行着多个虚拟客户机。Hypervisor和Domain都运行在节点上。
* Hypervisor也称虚拟机监控器（VMM），是虚拟化中的一个底层软件层，它可以虚拟化一个节点让其运行多个虚拟客户机。

* Domain（域）也就是实例、客户机操作系统（Guest OS）、虚拟机（Virtual Machine），它们都是同一个概念。

### Libvirt主要管理功能

* 域的管理：包括对节点上的域的各个生命周期的管理，如启动、停止、暂停、保存、恢复和动态迁移。
* 远程节点的管理：只要物理节点上运行了libvirt这个守护进程，远程的管理程序就可以连接到该节点进行远程管理操作。
* 存储的管理：任何运行了libvirt守护进程的主机，都可以通过libvirt来管理不同类型的存储。
* 网络的管理：任何运行了libvirtd守护进程的主机，都可以通过libvirt来管理物理的和逻辑的网络接口。
* 提供一个稳定、可靠、高效的应用程序接口，以便可以完成前面的4个管理功能。

### virsh

virsh是使用C语言写的一个使用libvirt API的虚拟化管理工具。在使用virsh命令进行虚拟化管理操作时，可以使用两个工作模式：交互模式和非交互模式。

交互模式，是连接到相应的Hypervisor上，然后输入一个命令得到一个返回结果，知道用户使用`quit`命令退出连接。

非交互模式，是直接在命令行中一个建立连接的URI之后添加需要执行的一个或多个命令，执行完成后将命令的输出结果返回到当前终端上，然后自动断开连接。

在某个节点上直接使用`virsh`命令，就默认连接到本节点的Hypervisor。

## virsh常用命令

### 域管理的命令

virsh的最重要的功能之一就是实现对域的管理。

### virsh中域管理相关的常用命令

| 命令                                | 功能描述                                                     |
| ----------------------------------- | ------------------------------------------------------------ |
| list                                | 获取当前节点                                                 |
| domstate \<ID or Name or UUID\>     | 获取一个域的运行状态                                         |
| dominfo \<ID\>                      | 获取一个域的基本信息                                         |
| domid \<Name or UUID\>              | 根据域的名称或UUID返回域的ID值                               |
| domname \<ID or UUID\>              | 根域域的ID或UUID返回域的名称                                 |
| dommemstat \<ID\>                   | 获取一个域的内存使用情况的统计信息                           |
| setmen \<ID\> \<men-size\>          | 设置一个域的内存大小（默认单位为KB）                         |
| vcpuinfo \<ID\>                     | 获取一个域的vCPU的基本信息                                   |
| vcpupin \<ID\> \<vCPU\> \<pCPU\>    | 将一个域的vCPU绑定到某个物理CPU上                            |
| setvcpus \<ID\> \<vCPU-num\>        | 设置一个域的vCPU的个数                                       |
| vncdisplay \<ID\>                   | 获取一个域的VNC连接IP地址和端口                              |
| create \<dom.xml\>                  | 根据域的XML配置文件创建一个域（客户机）                      |
| susped \<ID\>                       | 暂停一个域                                                   |
| resume \<ID\>                       | 唤醒一个域                                                   |
| shutdown \<ID\>                     | 让一个域执行关机操作                                         |
| reboot \<ID\>                       | 让一个域执行重启操作                                         |
| reset \<ID\>                        | 强制重启一个域，相当于在物理机器上按电源“reset”按钮（可能会损坏该域的文件系统） |
| destroy \<ID\>                      | 立即关闭一个域，相当于直接拔掉物理机器的电源线（可能会算坏该域的文件系统） |
| save \<ID\> \<file.img\>            | 保存一个运行中的域的状态到一个文件中                         |
| restore \<file.img\>                | 从一个被保存的文件中恢复一个域的运行                         |
| migrate \<ID\> \<dest_url\>         | 将一个域迁移到另外一个目的的地址                             |
| dumpxml \<ID\>                      | 以XML格式转存出一个域的信息到标准输出中                      |
| attach-device \<ID\> \<device.xml\> | 向一个域添加XML文件中的设备（热插拔）                        |
| detach-device \<ID\> \<device.xml\> | 将XML文件中额设备从一个域中移除                              |
| console \<ID\>                      | 连接到一个域的控制台                                         |

### virsh中宿主机和Hypervisor管理相关的常用命令

| 命令                                         | 功能描述                                                     |
| -------------------------------------------- | ------------------------------------------------------------ |
| version                                      | 显示libvirt和Hypervisor的版本信息                            |
| sysinfo                                      | 以XML格式打印宿主主机系统的信息                              |
| nodeinfo                                     | 显示该节点的基本信息                                         |
| uri                                          | 显示当前连接的URI                                            |
| hostname                                     | 显示当前节点的主机名                                         |
| capabilities                                 | 显示该节点宿主机和客户机的架构和特性                         |
| freecell                                     | 显示当前MUMA单元的可用空闲内存                               |
| nodememstats \<cell\>                        | 显示该节点的内存单元使用情况的统计                           |
| connect \<URL\>                              | 连接到URI指示的Hypervisor                                    |
| nodecpustats \<cpu-num\>                     | 显示该节点的（某个）CPU使用情况的统计                        |
| qemu-attach \<pid\>                          | 根据PID添加一个QEMU进程到libvirt中                           |
| quemu-monitor-command domain [--hmp] command | 向域的QEMUmonitor中发送一个命令，一般需要"--hmp"参数，以便直接传入monitor中的命令而不需要转换 |

### virsh中网络管理相关的常用命令

| 命令                              | 功能描述                                  |
| --------------------------------- | ----------------------------------------- |
| iface-list                        | 显示除物理主机的网络接口列表              |
| iface-mac \<if-name\>             | 根据网络接口名称查询其对应的MAC地址       |
| iface-name \<MAC\>                | 根据MAC地址查询其对应的网络接口名称       |
| iface-deit \<if-name-or-UUID\>    | 编辑一个物理主机的网络接口的XML配置文件   |
| iface-dumpxml \<if-name-or-UUID\> | 以XML格式转存出一个网络接口的状态信息     |
| iface-destory \<if-name-or-UUID\> | 关闭宿主机上的一个物理网络接口            |
| net-list                          | 列出libvirt管理的虚拟网络                 |
| net-info \<net-name-or-UUID\>     | 根据名称查询一个虚拟网络的基本信息        |
| net-uuid \<net-name\>             | 根据名称查询一个虚拟网络的UUID            |
| net-name \<net-UUID\>             | 根据UUID查询一个虚拟网络的名称            |
| net-create \<net.xml\>            | 根据一个网络的XML配置文件创建一个虚拟网络 |
| net-edit \<net-name-or-UUID>      | 编辑一个虚拟网络的XML配置文件             |
| net-dumpxml \<net-name-or-UUID>   | 转存出一个虚拟网络的XML格式化的配置信息   |
| net-destory \<net-name-or-UUID\>  | 销毁一个虚拟网络                          |

### virsh中存储管理相关的常用命令

| 命令                                         | 功能描述                              |
| -------------------------------------------- | ------------------------------------- |
| pool-list                                    | 显示出libvirt管理的存储池             |
| pool-info \<pool-name\>                      | 根据一个存储池名称查询其基本信息      |
| pool-uuid \<pool-name\>                      | 根据存储池名称查询其UUID              |
| pool-create \<pool.xml\>                     | 根据XML配置文件的信息创建一个存储池   |
| pool-edit \<pool-name-or-UUID\>              | 编辑一个存储池的XML配置文件           |
| pool-destroy \<pool-name-or-UUID\>           | 关闭一个存储池（在libvirt可见范围内） |
| pool-delete \<pool-name-or-UUID\>            | 删除一个存储池（不可恢复）            |
| vol-list \<pool-name-or-UUID\>               | 查询一个存储池中的存储卷的列表        |
| vol-name \<vol-key-or-path\>                 | 查询一个存储卷的名称                  |
| vol-path --pool \<pool\> \<vol-name-or-key\> | 查询一个春初卷的路径                  |
| vol-create \<vol.xml\>                       | 根据XML配置文件创建一个存储池         |
| vol-clone \<vol-name-path\> \<name\>         | 克隆一个存储卷                        |
| vol-delete \<vol-name-or-key-or-path\>       | 删除一个存储卷                        |