virsh
是一个强大的命令行工具,用于管理基于 libvirt 的虚拟化环境。它支持创建、删除、启动、停止虚拟机(VM)、管理网络、存储以及进行快照操作等多种功能。本文将全面介绍 virsh
的常用命令、详细操作步骤、实例演示以及常见错误的处理方法,帮助您高效管理虚拟化环境。
目录
前言
virsh
是 libvirt 提供的命令行工具,适用于管理 KVM、QEMU、Xen 等多种虚拟化技术。通过 virsh
,管理员可以在无需图形界面的情况下,全面控制和管理虚拟化资源。
安装与配置
1. 安装 libvirt
和 virsh
在 CentOS/RHEL 上安装:
sudo yum install -y libvirt libvirt-python libguestfs-tools virt-install
在 Ubuntu/Debian 上安装:
sudo apt-get update sudo apt-get install -y libvirt-bin qemu-kvm virtinst virt-manager
2. 启动并启用 libvirtd
服务
启动服务:
sudo systemctl start libvirtd
设置开机自启:
sudo systemctl enable libvirtd
3. 验证安装
virsh list --all
如果返回虚拟机列表或空列表,表示 virsh
已成功安装并连接到 libvirt 守护进程。
基本命令
3.1 虚拟机管理
3.1.1 查看所有虚拟机
运行中的虚拟机:
virsh list
所有虚拟机(包括未运行的):
virsh list --all
3.1.2 启动虚拟机
virsh start <虚拟机名称或ID>
示例:
virsh start test-vm
3.1.3 停止虚拟机
正常关机:
virsh shutdown <虚拟机名称或ID>
强制关机(类似于拔掉电源):
virsh destroy <虚拟机名称或ID>
示例:
virsh shutdown test-vm
3.1.4 创建虚拟机
使用 XML 文件创建虚拟机:
virsh define <配置文件.xml>
示例:
virsh define /path/to/vm-config.xml
3.1.5 删除虚拟机
从管理中删除(不删除磁盘):
virsh undefine <虚拟机名称或ID>
删除虚拟机及其磁盘(谨慎操作):
virsh undefine <虚拟机名称或ID> --remove-all-storage
示例:
virsh undefine test-vm
3.1.6 重启虚拟机
virsh reboot <虚拟机名称或ID>
示例:
virsh reboot test-vm
3.1.7 挂起与恢复虚拟机
挂起虚拟机:
virsh suspend <虚拟机名称或ID>
恢复虚拟机:
virsh resume <虚拟机名称或ID>
示例:
virsh suspend test-vm
virsh resume test-vm
3.2 网络管理
3.2.1 列出所有网络
virsh net-list --all
3.2.2 启动网络
virsh net-start <网络名称>
示例:
virsh net-start default
3.2.3 停止网络
virsh net-destroy <网络名称>
示例:
virsh net-destroy default
3.2.4 定义网络
使用 XML 文件定义新的网络:
virsh net-define <网络配置.xml>
示例:
virsh net-define /path/to/network-config.xml
3.2.5 删除网络
virsh net-undefine <网络名称>
示例:
virsh net-undefine default
3.3 存储管理
3.3.1 列出所有存储池
virsh pool-list --all
3.3.2 启动存储池
virsh pool-start <存储池名称>
示例:
virsh pool-start default
3.3.3 停止存储池
virsh pool-destroy <存储池名称>
示例:
virsh pool-destroy default
3.3.4 定义存储池
使用 XML 文件定义新的存储池:
virsh pool-define <存储池配置.xml>
示例:
virsh pool-define /path/to/storage-pool.xml
3.3.5 删除存储池
virsh pool-undefine <存储池名称>
示例:
virsh pool-undefine default
3.4 快照管理
3.4.1 列出虚拟机快照
virsh snapshot-list <虚拟机名称或ID>
示例:
virsh snapshot-list test-vm
3.4.2 创建快照
virsh snapshot-create-as <虚拟机名称或ID> <快照名称> --description "<描述>"
示例:
virsh snapshot-create-as test-vm snapshot1 --description "Before update"
3.4.3 恢复快照
virsh snapshot-revert <虚拟机名称或ID> <快照名称>
示例:
virsh snapshot-revert test-vm snapshot1
3.4.4 删除快照
virsh snapshot-delete <虚拟机名称或ID> <快照名称>
示例:
virsh snapshot-delete test-vm snapshot1
3.5 迁移管理
3.5.1 列出可用的迁移选项
virsh migrate-validate <虚拟机名称或ID> <目标主机URI>
示例:
virsh migrate-validate test-vm qemu+ssh://remote-host/system
3.5.2 进行虚拟机迁移
virsh migrate --live <虚拟机名称或ID> <目标主机URI>
示例:
virsh migrate --live test-vm qemu+ssh://remote-host/system
高级命令与操作
4.1 自动启动与停止
4.1.1 设置虚拟机开机自启
virsh autostart <虚拟机名称或ID>
示例:
virsh autostart test-vm
4.1.2 取消虚拟机开机自启
virsh autostart --disable <虚拟机名称或ID>
示例:
virsh autostart --disable test-vm
4.2 虚拟机备份与恢复
4.2.1 备份虚拟机配置
virsh dumpxml <虚拟机名称或ID> > /path/to/backup/<vm-name>.xml
示例:
virsh dumpxml test-vm > /backup/test-vm.xml
4.2.2 恢复虚拟机配置
virsh define /path/to/backup/<vm-name>.xml
示例:
virsh define /backup/test-vm.xml
4.2.3 备份虚拟机磁盘
假设磁盘位于 /var/lib/libvirt/images/test-vm.qcow2
:
sudo cp /var/lib/libvirt/images/test-vm.qcow2 /backup/test-vm.qcow2
4.2.4 恢复虚拟机磁盘
sudo cp /backup/test-vm.qcow2 /var/lib/libvirt/images/test-vm.qcow2
4.3 配置与编辑
4.3.1 编辑虚拟机配置
virsh edit <虚拟机名称或ID>
示例:
virsh edit test-vm
此命令将在默认编辑器中打开虚拟机的 XML 配置文件,允许您进行手动编辑。
4.3.2 检查配置文件语法
virsh domxml-from-native <native-format> <file>
示例:
将 JSON 格式转换为 XML 并检查:
virsh domxml-from-native json /path/to/config.json
常见错误与解决办法
5.1 libvirtd
服务未运行
错误信息:
error: Failed to connect to the hypervisor
解决办法:
检查
libvirtd
服务状态:sudo systemctl status libvirtd
启动服务:
sudo systemctl start libvirtd
设置开机自启:
sudo systemctl enable libvirtd
5.2 权限不足
错误信息:
error: Failed to connect to the hypervisor: error : Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
解决办法:
确保当前用户属于
libvirt
组:sudo usermod -aG libvirt $(whoami)
重新登录以应用组更改。
检查 socket 权限:
ls -l /var/run/libvirt/libvirt-sock
5.3 虚拟机启动失败
错误信息:
error: Failed to start domain <vm-name>
解决办法:
查看虚拟机日志:
sudo journalctl -xe | grep libvirt
检查虚拟机配置文件是否正确,尤其是存储路径和网络配置。
确保所需的存储池和网络已启动。
5.4 网络配置错误
错误信息:
error: Failed to set up networking
解决办法:
确认网络配置文件正确无误。
检查相关网络是否已定义并启动:
virsh net-list --all
查看网络日志:
sudo journalctl -u libvirtd
5.5 存储池错误
错误信息:
error: Storage pool not found: default
解决办法:
确认存储池是否已定义:
virsh pool-list --all
启动存储池:
virsh pool-start <存储池名称>
定义存储池:
virsh pool-define /path/to/pool-config.xml virsh pool-build <存储池名称> virsh pool-start <存储池名称> virsh pool-autostart <存储池名称>
综合实例
6.1 创建桥接并添加端口
6.1.1 创建桥接 br0
sudo virsh net-define /etc/libvirt/qemu/networks/br0.xml
sudo virsh net-start br0
sudo virsh net-autostart br0
示例 br0.xml
配置:
<network>
<name>br0</name>
<forward mode='bridge'/>
<bridge name='br0' stp='on' delay='0'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
</network>
6.1.2 将物理网卡 eth1
添加到 br0
sudo virsh attach-interface --domain default --type bridge --source br0 --model virtio --config --live
6.2 配置 VLAN
6.2.1 创建 VLAN 接口
sudo virsh attach-interface --domain test-vm --type vlan --source br0 --model virtio --config --live --target vlan100 --mac 52:54:00:6b:3c:58 --vlan id=100
说明:
--target vlan100
:设置接口名称为vlan100
。--vlan id=100
:指定 VLAN ID 为 100。
6.3 配置 GRE 隧道
6.3.1 在本地主机上创建 GRE 隧道接口
sudo virsh attach-interface --domain test-vm --type bridge --source br0 --model virtio --config --live --target gre0 --type gre --options remote_ip=192.168.1.2
说明:
--target gre0
:设置接口名称为gre0
。--options remote_ip=192.168.1.2
:指定远程 GRE 隧道的 IP 地址。
6.3.2 在远程主机上创建对应的 GRE 隧道接口
在远程主机上执行类似命令,指定本地主机的 IP 地址作为 remote_ip
。
6.4 流量控制与 QoS
6.4.1 限制端口 eth1
的带宽为 10Mbps
virsh qemu-monitor-command test-vm --hmp "set_link_rate eth1 10000"
说明:
- 使用 QEMU 监控命令设置网络接口带宽。
10000
表示带宽限制为 10,000 Kbps(即 10 Mbps)。
6.5 配置 OpenFlow 流表
6.5.1 实现简单的 L2 转发
sudo virsh qemu-monitor-command test-vm --hmp "netdev_add type=tap,ifname=tap0,id=tap0"
sudo virsh qemu-monitor-command test-vm --hmp "interface_add br0 tap0"
说明:
- 使用 QEMU 监控命令添加 TAP 网络设备并连接到桥接
br0
。
附录:常用 virsh
命令速查表
命令 | 说明 |
---|---|
virsh list |
列出当前运行中的虚拟机 |
virsh list --all |
列出所有虚拟机,包括未运行的 |
virsh start <vm> |
启动指定的虚拟机 |
virsh shutdown <vm> |
正常关闭指定的虚拟机 |
virsh destroy <vm> |
强制关闭指定的虚拟机 |
virsh reboot <vm> |
重启指定的虚拟机 |
virsh suspend <vm> |
挂起指定的虚拟机 |
virsh resume <vm> |
恢复挂起的虚拟机 |
virsh define <xml> |
使用 XML 配置文件定义虚拟机 |
virsh undefine <vm> [--remove-all-storage] |
从管理中删除虚拟机,--remove-all-storage 同时删除磁盘 |
virsh edit <vm> |
编辑虚拟机的 XML 配置文件 |
virsh dumpxml <vm> > <file.xml> |
导出虚拟机的 XML 配置文件 |
virsh snapshot-create-as <vm> <snap-name> --description "<desc>" |
创建虚拟机快照 |
virsh snapshot-revert <vm> <snap-name> |
恢复虚拟机到指定快照 |
virsh snapshot-delete <vm> <snap-name> |
删除指定的虚拟机快照 |
virsh net-list --all |
列出所有网络 |
virsh net-start <net> |
启动指定的网络 |
virsh net-destroy <net> |
停止指定的网络 |
virsh net-define <xml> |
使用 XML 配置文件定义网络 |
virsh net-undefine <net> |
删除指定的网络 |
virsh pool-list --all |
列出所有存储池 |
virsh pool-start <pool> |
启动指定的存储池 |
virsh pool-destroy <pool> |
停止指定的存储池 |
virsh pool-define <xml> |
使用 XML 配置文件定义存储池 |
virsh pool-undefine <pool> |
删除指定的存储池 |
virsh migrate --live <vm> <URI> |
实时迁移虚拟机到指定的目标主机 |
virsh autostart <vm> |
设置虚拟机开机自启 |
virsh autostart --disable <vm> |
取消虚拟机开机自启 |
virsh qemu-monitor-command <vm> --hmp "<cmd>" |
发送 QEMU 监控命令到虚拟机 |
总结
virsh
是管理 libvirt 虚拟化环境的核心工具,提供了丰富的命令和选项,能够满足各种虚拟机管理需求。通过本文的详细介绍,您应能够掌握 virsh
的基本与高级用法,进行虚拟机的创建、管理、网络配置、存储管理、快照操作及迁移等任务。同时,了解常见错误及其解决办法,有助于在实际操作中快速排除问题,确保虚拟化环境的稳定运行。
关键要点:
- 全面掌握命令:了解并熟练使用
virsh
的各种命令,提升虚拟机管理效率。 - 配置与编辑:善用 XML 配置文件进行灵活的虚拟机和网络配置。
- 自动化与脚本:结合
cron
等工具,实现虚拟机管理的自动化。 - 错误处理:及时识别和解决常见错误,保障虚拟化环境的稳定性。