Administrator
Administrator
发布于 2024-12-03 / 12 阅读
0
0

virsh 命令详解:详细操作、命令与错误处理

virsh 是一个强大的命令行工具,用于管理基于 libvirt 的虚拟化环境。它支持创建、删除、启动、停止虚拟机(VM)、管理网络、存储以及进行快照操作等多种功能。本文将全面介绍 virsh 的常用命令、详细操作步骤、实例演示以及常见错误的处理方法,帮助您高效管理虚拟化环境。


目录

  1. 前言
  2. 安装与配置
  3. 基本命令
  4. 高级命令与操作
  5. 常见错误与解决办法
  6. 综合实例
  7. 附录:常用 virsh 命令速查表
  8. 总结

前言

virsh 是 libvirt 提供的命令行工具,适用于管理 KVM、QEMU、Xen 等多种虚拟化技术。通过 virsh,管理员可以在无需图形界面的情况下,全面控制和管理虚拟化资源。

安装与配置

1. 安装 libvirtvirsh

  • 在 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 等工具,实现虚拟机管理的自动化。
  • 错误处理:及时识别和解决常见错误,保障虚拟化环境的稳定性。


评论