Virsh-命令基本使用

Libvirt 官网
RedHat virsh 相关教程

介绍

virsh 是一个用于管理 libvirt 的虚拟机和其他虚拟化功能的命令行工具. 而 libvirt 是一个开源的 API, 守护进程和管理工具, 用于管理各种不同的虚拟化能力. 它支持多种不同的虚拟化后端, 包括 QEMU, KVM, Xen 等.

安装

virsh 会随 libvirt 一起安装, 在 Archlinux 上如:

1
sudo pacman -S libvirt

基本使用

查看当前 hypervisor 连接

1
sudo virsh uri

返回如:

1
qemu:///system

连接到一个 hypervisor

Hypervisor, 指虚拟机监视器 (Virtual Machine Monitor), 可以是软件, 固件和硬件, 用于创建并运行虚拟机.

Hypervisor 分两类:

  • Bare-Metal Hypervisor, 指直接安装在物理硬件上, 以提供高性能和高效率, 代表的有 Xen, KVM (Linux 内核的一部分), Microsoft Hyper-V
  • Hosted Hypervisor, 指安装在宿主操作系统上, 像普通应用程序一样使用, 代表有 VMware Workstation, QEMU (通常和 KVM 一起使用)

远程

假如 10.10.0.105 主机上以 root 用于运行 QEMU/KVM hypervisor, 则连接如:

1
sudo virsh -c qemu+ssh://root@10.10.0.105/system
  • -c, --connect, 指定要连接的 hypervisor URI
  • qemu+ssh://root@10.10.0.105/system 中:
    • qemu 是 hypervisor 类型
    • +ssh 指连接方式
    • root 是运行 hypervisor 的用户
    • @10.10.0.105 指定 IP 地址
    • /system 表示连接级别

连接级别一般有:

  • system, 系统级连接, 是默认的连接类型, 通常用于管理全系统的虚拟机, 这种连接类型需要 root 权限或者属于 libvirt 群组的用户权限
  • session, 会话级连接, 单个用户的会话创建的, 不需要 root 权限, 虚拟机的生命周期与用户会话的生命周期相同, 当用户注销时, 所有的虚拟机都会被关闭

注意这里连接后, 会进入交互模式:

若只想运行单个命令, 则加上子命令:

1
sudo virsh -c qemu+ssh://root@10.10.0.105/system list --all

本地

如:

1
virsh -c qemu:///session

或:

1
virsh -c qemu:///system

查看所有虚拟机

1
sudo virsh list --all

输出如:

1
2
3
4
5
6
7
8
9
10
11
 Id   Name            State
--------------------------------
1 pxe running
- fedora38-1 shut off
- fedora38-2 shut off
- openEuler20-1 shut off
- openEuler22-1 shut off
- openEuler22-2 shut off
- rocky8-2 shut off
- win10 shut off
- win11 shut off
  • Id 指 domain id, 其会在虚拟机 “启动” 时自动分配, 在关闭时释放
  • Name 指 domain name (不是网络上的 domain, 这里就是创建时虚拟机的名称)
  • State 指虚拟机状态, 有:
    • running
    • paused
    • inactive
    • crashed
    • shutdown
    • dying

查看已启动的虚拟机

1
sudo virsh list

查看虚拟机的 XML 配置

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

这里的 domain-id 和 domain-name 都可以用 virsh list --all 来查看.

domain-uuid 需要用 virsh domuuid {domain-id, domain-name} 或者 virsh list --all --uuid 来查看.

如:

1
sudo virsh domuuid fedora38-1

输出如:

1
fcb54802-8a61-4bea-8ae7-a35d4f8e48a9

则查看其 XML 配置如:

1
sudo virsh dumpxml fedora38-1

修改一个虚拟机的 XML 配置

1
sudo virsh edit {domain-id, domain-name or domain-uuid}

其会读取 EDITOR 环境变量来选择用于编辑的编辑器 (默认用 vi), 若设置了该变量不起作用, 可选择:

1
2
export EDITOR=vim
sudo -E virsh edit <domain>

或:

1
sudo EDITOR=vim virsh edit <domain>

用一个 XML 配置文件创建一个 guest

1
sudo virsh create configuration_file.xml

挂起一个 guest

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

从挂起中恢复一个 guest

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

save a guest

save, 指保存虚拟机在特定时间点的完整状态, 包括虚拟机的内存状态 (即 RAM 中的内容), CPU 状态, 设备状态和磁盘状态并会停止虚拟机.

savesnapshot (快照) 类似, 但是会停止虚拟机, 用于以后完整恢复虚拟机状态, 常用于长期保存.

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

restore a guest

可以从一个 save 的文件中恢复虚拟机:

1
sudo virsh restore filename

关机 a guest

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

重启 a guest

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

强制关闭 a guest

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

获取某 guest 的基本信息

domain id

1
sudo virsh domid {domain-name or domain-uuid}

domain name

1
sudo virsh domname {domain-id or domain-uuid}

uuid

1
sudo virsh domuuid {domain-id or domain-name}

全部

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

查看宿主机的信息

1
sudo virsh nodeinfo

查看 guest 的 cpu 信息

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

配置 virtual CPU affinity

Virtual CPU Affinity 指虚拟机的 vCPU 与物理 CPU 核心间的关联, 这个过程一般称 “CPU Pinning”.

在默认情况下, 虚拟机的 vCPU 可以在物理 CPU 的任何核心上运行, 由操作系统的调度器决定. 然而, 有时候, 为了优化性能或满足特定的需求, 你可能想要将特定的 vCPU 固定到特定的物理 CPU 核心上. 这就是所谓的 “CPU affinity” 或 “CPU pinning”.

配置 CPU affinity 能够减少 CPU 上下文切换的次数以提高性能.

1
sudo virsh vcpupin domain-id vcpu cpulist

如:

1
virsh vcpupin myvm 0 0,1

固定到多个物理 CPU 核心时, 需要用逗号分隔, 或范围指定:

1
virsh vcpupin myvm 0 0-3,5

配置 virtual CPU 数量

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

配置 guest 的内存大小

1
sudo virsh setmem {domain-id or domain-name} count

最少需要分配 64MB.

显示 guest 块设备信息

1
sudo virsh domblkstat GuestName block-device

如:

1
sudo virsh domblkstat fedora38-1 vda

domblkstat 指 “domain block statistics”.

输出如:

1
2
3
4
5
6
7
8
vda rd_req 0
vda rd_bytes 0
vda wr_req 147
vda wr_bytes 9614848
vda flush_operations 59
vda rd_total_times 0
vda wr_total_times 233585203
vda flush_total_times 277395016

显示 guest 网络接口信息

1
virsh domifstat GuestName interface-device 

可以先用 domiflist 查看一个 guest 有什么网络接口:

1
sudo virsh domiflist fedora38-1

输出如:

1
2
3
 接口    类型      源        型号     MAC
---------------------------------------------------------
vnet3 network default virtio 52:54:00:6b:2c:9f

如:

1
sudo virsh domifstat fedora38-1 vnet3

输出如:

1
2
3
4
5
6
7
8
vnet3 rx_bytes 127934
vnet3 rx_packets 2250
vnet3 rx_errs 0
vnet3 rx_drop 0
vnet3 tx_bytes 30008
vnet3 tx_packets 385
vnet3 tx_errs 0
vnet3 tx_drop 0

迁移 guest 到另一台主机

可以用:

1
sudo virsh migrate --live GuestName DestinationURL

将运行中的虚拟机从一台物理主机迁移到另一台物理主机, 这个过程通常被称为”实时迁移” (live migration), 因为在迁移过程中, 虚拟机会持续运行, 不会出现停机时间.

如:

1
sudo virsh migrate --live openEuler1 qemu+ssh://root@10.10.0.105/system

但如果两个物理主机间没有 shared storage, 则会报错:

1
error: Unsafe migration: Migration without shared storage is unsafe

此时, 需要在 libvirt 中定义一个新的存储池, 指向共享存储:

1
2
3
virsh pool-define-as --name shared --type dir --target /path/to/nfs/share
virsh pool-start shared
virsh pool-autostart shared

同时, 需要虚拟机的磁盘镜像位于这个存储池中, 才能实现迁移.

虚拟网络设备管理

列出所有网络设备

1
sudo virsh net-list

输出如:

1
2
3
4
 Name      State    Autostart   Persistent
--------------------------------------------
br-pxe active yes yes
default active yes yes

查看特定虚拟网络设备的配置信息

1
sudo virsh net-dumpxml NetworkName

如:

1
sudo virsh net-dumpxml default

输出如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<network>
<name>default</name>
<uuid>4ce30863-3c49-4931-91fe-0f7e8e3b614a</uuid>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:37:67:88'/>
<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>

启用一个 virtual network

1
sudo virsh net-start network-name

自动启动一个 virtual network

1
sudo virsh net-autostart network-name

创建并启用一个 virtual network

1
sudo virsh net-create XMLfile

仅创建一个 virtual network

1
sudo virsh net-define XMLfile

移除一个 virtual network

1
sudo virsh net-destroy network-name

移除一个 inactive network 的定义文件

1
sudo virsh net-undefine nameOfInactiveNetwork

终端连接文本交互

1
sudo virsh console {domain-id or domain-name}

注意, 要退出控制台是按 Ctrl+].


Virsh-命令基本使用
http://example.com/2024/05/14/Virsh-命令基本使用/
作者
Jie
发布于
2024年5月14日
许可协议