1. libvirt与virsh命令概述
libvirt作为开源的虚拟化管理工具包,已经成为Linux环境下管理KVM/Xen等虚拟化方案的事实标准。而virsh则是libvirt项目提供的命令行管理工具,它通过调用libvirt API实现对虚拟机的全生命周期管理。不同于图形化工具virt-manager,virsh特别适合在服务器环境或自动化脚本中使用。
初次接触virsh时,你会注意到它支持两种运行模式:
- 交互模式:直接输入
virsh进入命令提示符,可连续执行多个操作 - 单命令模式:使用
virsh <command>格式直接执行特定命令
提示:几乎所有virsh命令都支持
--help参数获取详细用法说明,这是快速查阅命令的捷径。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础管理命令详解
2.1 虚拟机状态管理
虚拟机状态管理是日常最常用的命令集合,以下命令都需要指定虚拟机名称或ID作为参数:
bash复制# 启动虚拟机(相当于按下电源键)
virsh start <domain>
# 正常关闭虚拟机(相当于选择系统关机)
virsh shutdown <domain>
# 强制关闭虚拟机(相当于直接拔电源)
virsh destroy <domain>
# 暂停虚拟机运行(保持内存状态)
virsh suspend <domain>
# 恢复暂停的虚拟机
virsh resume <domain>
# 列出所有虚拟机状态
virsh list --all
虚拟机可能存在的7种状态:
running:正常运行状态idle:空闲状态(未运行)paused:暂停状态(内存保持)shutdown:关机状态crashed:崩溃状态dying:正在关闭但未完全终止pmsuspended:电源管理挂起
2.2 虚拟机信息查询
获取虚拟机详细信息有助于故障排查和性能分析:
bash复制# 查看虚拟机基本信息
virsh dominfo <domain>
# 获取内存使用统计
virsh dommemstat <domain>
# 查看vCPU配置信息
virsh vcpuinfo <domain>
# 显示VNC连接信息
virsh vncdisplay <domain>
# 查看当前XML配置
virsh dumpxml <domain>
经验分享:
dumpxml输出的配置可以重定向到文件作为备份,修改后可用于重建虚拟机。
3. 高级功能操作指南
3.1 快照管理
快照是虚拟机管理的利器,但需要注意不同存储格式的兼容性:
bash复制# 创建快照(自动生成XML时可省略xmlfile)
virsh snapshot-create <domain> [xmlfile]
# 查看当前快照
virsh snapshot-current <domain>
# 列出所有快照
virsh snapshot-list <domain>
# 恢复到指定快照
virsh snapshot-revert <domain> <snapshot>
# 删除快照(--children表示连带删除子快照)
virsh snapshot-delete <domain> <snapshot> [--children]
注意事项:
- qcow2格式对快照支持最好,raw格式需要额外配置
- 频繁创建快照会影响磁盘性能
- 删除快照时注意依赖关系,避免破坏快照链
3.2 远程管理配置
libvirt支持多种协议的远程连接,生产环境推荐使用SSH隧道:
bash复制# 本地系统级连接
virsh -c qemu:///system
# 本地用户级连接
virsh -c qemu:///session
# 通过SSH连接远程主机(需提前配置SSH免密登录)
virsh -c qemu+ssh://user@hostname/system
常用连接URI格式:
qemu:///system:本地系统实例qemu+unix:///system:本地Unix socket连接qemu+tcp://host/system:TCP连接(需配置SASL认证)qemu+ssh://user@host/system:SSH隧道连接
4. 虚拟机创建全流程
4.1 准备阶段
- 创建虚拟磁盘镜像:
bash复制qemu-img create -f qcow2 /var/lib/libvirt/images/ubuntu.qcow2 20G
- 准备安装ISO文件:
bash复制cp ubuntu-22.04.iso /var/lib/libvirt/images/
4.2 编写XML定义文件
以下是一个典型的KVM虚拟机定义模板(ubuntu.xml):
xml复制<domain type='kvm'>
<name>ubuntu-vm</name>
<memory unit='GiB'>4</memory>
<vcpu>2</vcpu>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
</features>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/ubuntu.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/var/lib/libvirt/images/ubuntu-22.04.iso'/>
<target dev='sda' bus='sata'/>
</disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
<graphics type='vnc' port='-1' autoport='yes'/>
</devices>
</domain>
4.3 创建并启动虚拟机
bash复制# 定义虚拟机
virsh define ubuntu.xml
# 启动虚拟机
virsh start ubuntu-vm
# 获取VNC端口
virsh vncdisplay ubuntu-vm
5. 常见问题排查手册
5.1 连接问题
问题现象:failed to connect to the hypervisor
解决方案:
- 检查libvirtd服务状态:
bash复制systemctl status libvirtd
- 确认用户权限(需要加入libvirt组):
bash复制usermod -aG libvirt $(whoami)
- 检查SELinux状态(临时禁用测试):
bash复制setenforce 0
5.2 虚拟机启动失败
问题现象:Cannot access storage file: Permission denied
解决方案:
- 检查存储路径权限:
bash复制ls -l /var/lib/libvirt/images/
- 修正SELinux上下文:
bash复制restorecon -Rv /var/lib/libvirt/images/
- 检查apparmor配置:
bash复制journalctl -xe | grep apparmor
5.3 性能优化技巧
- 使用virtio驱动:
xml复制<interface type='network'>
<model type='virtio'/>
</interface>
- 启用KSM内存共享:
bash复制echo 1 > /sys/kernel/mm/ksm/run
- CPU模式优化:
xml复制<cpu mode='host-passthrough'/>
6. 实用命令扩展集
6.1 资源调整命令
bash复制# 动态调整内存(单位KB)
virsh setmem <domain> 2097152 --live
# 修改vCPU数量
virsh setvcpus <domain> 4 --live
# 附加磁盘
virsh attach-disk <domain> /path/to/disk.img vdb --persistent
6.2 网络管理命令
bash复制# 列出虚拟网络
virsh net-list --all
# 查看网络详情
virsh net-info default
# 创建新网络
virsh net-define network.xml
6.3 批量操作技巧
结合grep和xargs实现批量管理:
bash复制# 批量关闭所有运行中的虚拟机
virsh list --name | grep -v "^$" | xargs -I{} virsh shutdown {}
# 批量删除所有关闭的虚拟机
virsh list --name --inactive | grep -v "^$" | xargs -I{} virsh undefine {}
在实际生产环境中,建议将常用virsh命令封装成脚本,配合cron实现自动化管理。例如定期快照脚本可以这样实现:
bash复制#!/bin/bash
DATE=$(date +%Y%m%d)
for vm in $(virsh list --name); do
virsh snapshot-create-as $vm auto-$DATE \
--description "Daily snapshot $(date)" \
--disk-only --atomic
done
