当前位置: 首页 > news >正文

libvirt 新手指南:从零开始掌握虚拟化管理

引言

在云计算、大数据和边缘计算的时代,虚拟化技术已成为 IT 基础设施的核心支柱。它允许我们在单一物理服务器上运行多个虚拟机(Virtual Machine,简称 VM),从而实现资源的高效利用、快速部署和灵活扩展。对于新手来说,虚拟化可能听起来复杂,但实际上,它就像在电脑上运行多个“虚拟电脑”,每个虚拟机可以独立运行不同的操作系统和应用。

然而,虚拟化并非一蹴而就。底层有各种 hypervisor(如 KVM、QEMU、Xen、VirtualBox 等),每个都有自己的命令和配置方式。这就带来了管理难题:如何统一操作这些不同的工具?这就是 libvirt 的价值所在。libvirt 是一个开源的虚拟化管理库和工具集,它提供了一个统一的 API(Application Programming Interface,应用程序接口),让开发者、管理者和用户能够轻松管理多种虚拟化技术,而无需深入每个 hypervisor 的细节。

libvirt 由 Red Hat 等公司主导开发,已成为 Linux 虚拟化的事实标准。它支持 KVM(Kernel-based Virtual Machine,内核虚拟机)、QEMU(Quick Emulator,快速仿真器)、Xen、LXC(Linux Containers,轻量容器)等多种后端。简单来说,libvirt 就像一个“虚拟化管家”,负责协调资源分配、监控状态和执行操作。对于新手,libvirt 的优势在于其简单易用:通过命令行工具 virsh 或图形界面 virt-manager,你就能快速上手创建和管理虚拟机。

本文将从基础概念入手,逐步引导你了解 libvirt 的历史、架构、安装、使用和高级功能。预计阅读后,你能独立搭建一个 libvirt 环境,并运行第一个虚拟机。让我们开始吧!


libvirt 的历史与发展

libvirt 的故事要从 2006 年说起。那时,虚拟化技术正处于爆发前夜。Xen 和 VMware 等商业解决方案主导市场,但开源社区需要一个统一的工具来管理新兴的 KVM 和 QEMU。Red Hat 的工程师 Daniel Veillard 和其他贡献者启动了 libvirt 项目,旨在创建一个跨平台的 C 语言 API,用于抽象虚拟化操作。

最初,libvirt 仅支持 Xen,但很快扩展到 KVM/QEMU,这得益于 Linux 内核的快速演进。2007 年,libvirt 1.0 版本发布,引入了 libvirtd 守护进程(daemon),这是一个服务器端组件,负责处理客户端请求。2010 年,随着云时代的到来,libvirt 开始支持网络和存储管理功能,如虚拟网络桥接(bridging)和存储池(storage pools)。

如今,libvirt 已发展到 10.x 版本(截至 2025 年),支持 Windows、macOS 和多种 Linux 发行版。它被广泛集成到 OpenStack、Proxmox 和 oVirt 等云平台中。根据官方文档,libvirt 的社区活跃,定期发布更新,修复安全漏洞并添加新功能。例如,2024 年的更新加强了对 ARM 架构的支持,适应了边缘计算需求。

为什么 libvirt 如此持久?因为它遵循“一次编写,到处运行”的原则。开发者可以用 Python、Java 或 C++ 绑定(bindings)来扩展它,而管理员则受益于其稳定性。相比直接使用 QEMU 的复杂命令,libvirt 简化了 80% 的工作量。对于新手,了解历史有助于欣赏其演化:从单纯的 VM 管理,到全面的资源编排。

libvirt 的核心组件与架构概述

libvirt 的架构设计精巧,采用客户端-服务器模型,确保安全性和可扩展性。核心是 libvirtd 守护进程,它运行在主机上,监听本地或远程连接(如 TCP 或 UNIX 套接字)。客户端通过 API 调用 libvirtd 来执行操作,避免直接访问底层 hypervisor,提高了安全性。

主要组件

  1. API 层:libvirt 的心脏,提供 C 语言接口,支持枚举资源(如 CPU、内存)、创建/销毁域(domains,即 VMs)、管理网络和存储。API 是 hypervisor 独立的,你可以用它编写脚本自动化任务。例如,virDomainCreateXML() 函数可以从 XML 配置启动一个 VM。

  2. 守护进程 (libvirtd):服务器端,处理 API 请求。它加载驱动(drivers)来与具体 hypervisor 交互,如 KVM 驱动使用 /dev/kvm 设备。libvirtd 支持模块化设计,你可以启用/禁用特定驱动。

  3. 工具集

    • virsh:命令行工具,类似于“虚拟机 shell”。新手常用它来交互式管理 VM。
    • virt-manager:图形界面,基于 Python 的 GTK 应用,适合可视化操作。
    • virt-install:用于从命令行快速安装 VM,支持 ISO 镜像导入。
    • virt-viewer:远程查看 VM 控制台。
  4. 驱动与后端:libvirt 支持多种 hypervisor:

    • KVM/QEMU:最流行,用于全虚拟化。
    • Xen:支持 paravirtualization(半虚拟化)。
    • LXC:容器管理。
    • 其他:VMware、Hyper-V(通过远程驱动)。

架构流程

当你运行 virsh list 时,客户端发送请求到 libvirtd,后者查询 KVM 驱动,获取 VM 列表,然后返回结果。XML 配置是关键:每个 VM、网络或存储都用 XML 描述,便于版本控制和迁移。

对于新手,记住:libvirt 不直接运行 VM,而是“指挥” hypervisor。架构的优点是可移植性强,例如,你可以用相同的 virsh 命令管理本地 KVM 或远程 Xen 主机。

安全方面,libvirt 使用 AppArmor/SELinux 沙箱隔离操作,防止 VM 逃逸(escape)。远程访问需配置 SASL 或 TLS 认证。

libvirt 的安装指南

安装 libvirt 是新手的第一步。我们以 Ubuntu 24.04 LTS 为例(其他发行版类似),假设你有 root 权限。整个过程只需几分钟。

准备工作

确保系统支持虚拟化:

  • 检查 CPU:运行 egrep -c '(vmx|svm)' /proc/cpuinfo,如果 >0,则支持。
  • 启用 KVM 模块:sudo modprobe kvm(Intel 用 kvm_intel,AMD 用 kvm_amd)。
  • 安装依赖:sudo apt update && sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst virt-manager

这些包包括:

  • qemu-kvm:hypervisor。
  • libvirt-clients/daemons:核心库。
  • bridge-utils:网络桥接。
  • virtinst:安装工具。
  • virt-manager:GUI。

对于 Red Hat/CentOS:sudo yum install libvirt qemu-kvm virt-manager 或使用 dnf。

Windows 用户:从 https://libvirt.org/windows.html 下载 MSI 安装包,但功能有限,主要用于开发。

macOS:通过 Homebrew brew install libvirt,但需额外配置 QEMU。

安装后,启动服务:

sudo systemctl start libvirtd
sudo systemctl enable libvirtd
sudo systemctl status libvirtd

如果出错,检查日志:journalctl -u libvirtd

添加用户到 libvirt 组:sudo usermod -aG libvirt $USER,然后注销重登录,避免 sudo。

验证安装

运行 virsh version,输出类似:

Compiled against library: libvirt 10.0.0
Using library: libvirt 10.0.0
Using API: QEMU 10.0.0
Running hypervisor: QEMU 8.2.0

恭喜!你已准备好。

对于 Fedora/openSUSE,过程相似,但包管理器不同。记住,安装后配置防火墙:sudo ufw allow from 192.168.122.0/24(默认 NAT 网络)。

基本配置与 libvirtd 管理

安装后,需要基本配置。libvirtd 的配置文件在 /etc/libvirt/libvirtd.conf。

关键配置项

  • URI(Uniform Resource Identifier):指定连接方式。默认是 qemu:///system(系统级,root 权限)。用户级是 qemu:///session(无特权)。
    编辑:sudo nano /etc/libvirt/libvirtd.conf,设置 listen_tcp = 1 启用远程(需重启)。

  • 网络:默认启用 NAT 网络(virbr0 接口,192.168.122.0/24)。运行 virsh net-list --all 查看。
    启动默认网络:virsh net-start defaultvirsh net-autostart default

  • 存储:默认池 /var/lib/libvirt/images。创建新池:virsh pool-define-as mypool dir --target /path/to/storage

  • 安全:启用 TLS:生成证书,或用 SASL。初学者可忽略,但生产环境必备。

重启 libvirtd:sudo systemctl restart libvirtd

常见问题:如果 “Permission denied”,检查用户组或 URI。日志在 /var/log/libvirt/qemu/。

配置好后,你的环境已就绪。接下来,学习如何管理 VM。

使用 virsh 管理虚拟机:从创建到运行

virsh 是 libvirt 的瑞士军刀。新手从交互模式开始:virsh 进入 shell,quit 退出。所有命令也可非交互式运行。

基本概念

  • 域(Domain):VM 的抽象,包括 QEMU 进程。状态:shut off(关机)、running(运行)、paused(暂停)。
  • 列表命令virsh list --all 显示所有域。
  • 信息查询virsh dominfo <domain> 查看 CPU、内存等。

创建虚拟机

方式一:用 virt-install(推荐新手)。

virt-install \--name myvm \--ram 2048 \--vcpus 2 \--disk path=/var/lib/libvirt/images/myvm.qcow2,size=20 \--os-variant ubuntu24.04 \--network network=default \--graphics vnc,port=5900 \--location http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/

这会启动安装过程。–os-variant 来自 osinfo-query os 列表。

方式二:XML 配置。
创建 XML 文件 myvm.xml:

<domain type='kvm'><name>myvm</name><memory unit='KiB'>2097152</memory><vcpu>2</vcpu><os><type arch='x86_64' machine='pc'>hvm</type><boot dev='hd'/></os><devices><disk type='file' device='disk'><source file='/var/lib/libvirt/images/myvm.qcow2'/><target dev='vda' bus='virtio'/></disk><interface type='network'><source network='default'/></interface><graphics type='vnc' port='5900'/></devices>
</domain>

然后:virsh define myvm.xml 定义,virsh start myvm 启动。

管理命令

  • 启动/停止:virsh start myvmvirsh shutdown myvm(优雅关机)、virsh destroy myvm(强制)。
  • 重启:virsh reboot myvm
  • 暂停/恢复:virsh suspend myvmvirsh resume myvm
  • 控制台:virsh console myvm(文本控制台,Ctrl+] 退出)。
  • 编辑:virsh edit myvm 修改 XML。
  • 删除:virsh undefine myvmvirsh destroy myvm

连接 VNC:用 vncviewer 192.168.122.1:5900(主机 IP)。

示例:创建一个最小 VM 并运行 Ubuntu。

  1. 下载 ISO:wget https://releases.ubuntu.com/24.04/ubuntu-24.04-live-server-amd64.iso
  2. 用 virt-install 安装。
  3. 运行 virsh list,看到 running 状态。
  4. 用 virt-viewer myvm 查看图形界面。

新手提示:总是用 --dry-run 测试命令。监控资源:virsh domstats myvm

网络与存储管理

虚拟化离不开网络和存储。libvirt 提供抽象层简化配置。

网络管理

libvirt 支持 NAT、桥接、路由等模式。

  • 默认 NAT:VM 通过主机 NAT 访问外网。编辑 /etc/libvirt/qemu.conf 调整。
  • 桥接网络:VM 直接连物理网。创建桥接 XML:
    <network><name>br0</name><forward mode='bridge'/><bridge name='br0'/>
    </network>
    
    virsh net-define br0.xmlvirsh net-start br0
    在 VM XML 中:。

命令:virsh net-listvirsh net-dumpxml defaultvirsh net-destroy default

高级:VLAN 或 SR-IOV 通过 XML 配置。

存储管理

存储池是逻辑分组,如目录、LVM、iSCSI。

  • 默认池:/var/lib/libvirt/images,格式 qcow2(可变大小)。
  • 创建池:virsh pool-create-as mypool dir /mnt/storage
  • 卷(volume):virsh vol-create-as mypool mydisk.qcow2 10G
  • 列表:virsh pool-list --allvirsh vol-list mypool

克隆卷:virsh vol-clone source target。快照:virsh snapshot-create-as myvm snap1

对于新手,qcow2 是首选:支持快照和压缩。备份:virsh vol-backup mypool mydisk.qcow2

常见问题:权限错误,用 chown libvirt-qemu /path。

GUI 工具:virt-manager 的使用

命令行强大,但新手更爱图形界面。virt-manager 是 libvirt 的“可视化仪表盘”。

安装后运行 virt-manager(需 X11 或 Wayland)。

界面概述

  • 左侧:连接列表(QEMU/KVM),主机和 VM。
  • 主机视图:CPU、内存使用。
  • VM 创建:点击“创建新 VM”,选择本地安装、ISO 或导入。
    步骤:分配 CPU/内存、选择存储、配置网络、启动安装。

日常操作

  • 控制 VM:启动、暂停、关机、克隆。
  • 控制台:集成 VNC/SPICE,实时查看。
  • 编辑硬件:添加 USB、网卡、GPU 直通(PCI passthrough)。
  • 快照管理:创建/回滚状态。

例如,创建 VM:

  1. 选择“本地安装媒体 (ISO)”。
  2. 选 ISO 文件,设置 RAM 2GB、CPU 2 核。
  3. 存储:20GB qcow2。
  4. 网络:默认。
  5. 完成,启动安装。

virt-manager 适合实验,支持截图和日志查看。远程连接:文件 > 添加连接 > QEMU/KVM > 远程主机。

高级主题:快照、迁移与监控

掌握基础后,探索高级功能。

快照

快照保存 VM 状态,便于测试。内部快照(qcow2):virsh snapshot-create-as myvm snap1 --disk-only。外部:用 vol-snapshot-create。

列表:virsh snapshot-list myvm。回滚:virsh snapshot-revert myvm snap1

迁移

libvirt 支持热迁移(live migration):VM 无中断移动到另一主机。
前提:共享存储、相同网络。
命令:virsh migrate --live myvm qemu+ssh://remote-host/system

监控与自动化

  • 事件:virsh event --all --loop 监听变化。
  • 钩子(hooks):/etc/libvirt/hooks/ 脚本,在 VM 启动时运行。
  • 绑定:用 Python libvirt 库编写脚本,例如:
    import libvirt
    conn = libvirt.open('qemu:///system')
    doms = conn.listAllDomains()
    for dom in doms:print(dom.name(), dom.isActive())
    conn.close()
    

集成 Prometheus 监控 VM 指标。


结论

libvirt 已从一个简单 API 成长为虚拟化生态的基石。它简化了复杂性,让新手也能高效管理资源。在容器时代(Docker/Kubernetes),libvirt 仍不可或缺,尤其在混合云环境中。

下一步:实践!搭建一个测试环境,创建多个 VM,实验网络隔离。阅读官方文档 https://libvirt.org/docs.html,加入社区贡献。

通过这篇指南,你已掌握 libvirt 精髓。虚拟化之旅才刚开始,享受探索吧!


文章转载自:

http://88qN5y8S.jypsm.cn
http://8ulmaUvI.jypsm.cn
http://cZiX0Kgm.jypsm.cn
http://zbUdQ6Hn.jypsm.cn
http://e2fFad8x.jypsm.cn
http://hVN43eAg.jypsm.cn
http://Ml9wLbRW.jypsm.cn
http://FyRZsBEA.jypsm.cn
http://HMFJTppG.jypsm.cn
http://CRMrYchK.jypsm.cn
http://PpJSttkZ.jypsm.cn
http://7VcAekKp.jypsm.cn
http://wpGjjtsT.jypsm.cn
http://OuPSSESp.jypsm.cn
http://tBE4lKjO.jypsm.cn
http://TyFANJ9s.jypsm.cn
http://I1cFlqME.jypsm.cn
http://6pfQLndj.jypsm.cn
http://52jKfcXm.jypsm.cn
http://yhJaY6Pe.jypsm.cn
http://26O19cCe.jypsm.cn
http://ZuViUsV8.jypsm.cn
http://BITikFxW.jypsm.cn
http://x1zYraXK.jypsm.cn
http://ZFIp7hlT.jypsm.cn
http://YqzgTE1l.jypsm.cn
http://j8GM5AIQ.jypsm.cn
http://kpf8kj0U.jypsm.cn
http://R8EltdmY.jypsm.cn
http://iMtMWseA.jypsm.cn
http://www.dtcms.com/a/375791.html

相关文章:

  • Oracle打补丁笔记
  • 【JavaEE】(24) Linux 基础使用和程序部署
  • TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接
  • Spring MVC 的常用注解
  • 肺炎检测系统
  • ctfshow-web-SSTI模版注入
  • RHEL 10 更新 rescue kernel
  • Vue3 + Vite + Element Plus web转为 Electron 应用,解决无法登录、隐藏自定义导航栏
  • 记SpringBoot3.x + SpringSecurity6.x之session管理
  • Pinia 两种写法全攻略:Options 写法 vs Setup 写法
  • 项目管理系统高保真原型案例:剖析设计思路与技巧
  • 第2节-过滤表中的行-DELETE
  • 基于AI的未佩戴安全帽检测算法
  • webpack打包方式
  • 第2节-过滤表中的行-WHERE
  • linux内核 - 内核是一个分层的系统
  • 基于Multi-Transformer的信息融合模型设计与实现
  • C# 14 新特性详解
  • Java实战项目演示代码及流的使用
  • BFS在路径搜索中的应用
  • Shell 脚本基础完全指南:语法、调试、运行与实战详解
  • Claude-Flow AI协同开发:钩子系统与 GitHub 集成
  • 食品饮料生产工艺优化中 CC-Link IE FB 转 DeviceNet 协议下西门子 S7-1500 与倍加福流量传感器的应用
  • 清源 SCA 社区版更新(V4.2.0)|漏洞前置感知、精准修复、合规清晰,筑牢软件供应链安全防线!
  • Seaborn库
  • 2031 年达 13.9 亿美元!工业温度控制器市场 CAGR4.2%:技术路径、应用场景与未来机遇全解析
  • sklearn 加州房价数据集 fetch_california_housing 出错 403: Forbidden 修复方案
  • mybatis plus 如何更新参数为空, mybatis plus update方法如何更新参数为null, update()如何设置参数=null
  • Spring Boot 项目新增 Module 完整指南
  • TruckSim与Matlab-Simulink联合仿真(一)