0

0

Linux虚拟化环境部署_LinuxKVM与QEMU搭建实操

看不見的法師

看不見的法師

发布时间:2025-07-18 08:16:02

|

706人浏览过

|

来源于php中文网

原创

kvm提供硬件加速虚拟化支持,qemu负责模拟完整虚拟硬件环境。1. kvm作为linux内核模块,利用cpu硬件虚拟化功能(intel vt-x/amd-v)直接映射虚拟机cpu和内存操作到物理硬件,显著减少性能损耗;2. qemu作为用户空间组件,在kvm基础上模拟虚拟机所需的各类硬件设备如硬盘控制器、网卡等,构建完整的虚拟硬件平台;3. 两者通过libvirt统一管理接口协作,实现高效稳定的虚拟化方案,广泛应用于服务器和云计算领域。

Linux虚拟化环境部署_LinuxKVM与QEMU搭建实操

Linux虚拟化环境的搭建,核心在于利用KVM(Kernel-based Virtual Machine)作为硬件辅助虚拟化接口,并结合QEMU(Quick Emulator)来模拟硬件,共同构建高效的虚拟机运行平台。这套组合不仅成熟稳定,而且性能出色,是许多服务器虚拟化和云计算环境的基石。

Linux虚拟化环境部署_LinuxKVM与QEMU搭建实操

解决方案: 部署KVM/QEMU环境,通常需要以下步骤:

  1. 检查硬件虚拟化支持 在开始之前,确认你的CPU支持虚拟化技术(Intel VT-x 或 AMD-V),并且已在BIOS/UEFI中启用。

    Linux虚拟化环境部署_LinuxKVM与QEMU搭建实操
    # 检查CPU是否支持虚拟化
    egrep -c '(vmx|svm)' /proc/cpuinfo
    # 如果输出大于0,则支持。
    # 进一步检查KVM模块是否加载
    lsmod | grep kvm

    如果kvm_intelkvm_amd模块未加载,通常在安装相关软件包后会自动加载。

  2. 安装必要的软件包 对于基于Debian/Ubuntu的系统:

    Linux虚拟化环境部署_LinuxKVM与QEMU搭建实操
    sudo apt update
    sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

    对于基于RHEL/CentOS/Fedora的系统:

    sudo dnf install @virtualization
    # 或者对于旧版CentOS/RHEL 7
    sudo yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install

    virt-manager提供了一个图形界面,方便管理虚拟机;bridge-utils用于网络桥接。

  3. 启动并启用Libvirt服务 Libvirt是管理KVM/QEMU虚拟机的工具集。

    sudo systemctl enable --now libvirtd
    sudo systemctl status libvirtd
  4. 将当前用户添加到libvirt组 为了无需sudo就能管理虚拟机,将你的用户添加到libvirt组。

    sudo adduser $USER libvirt
    # 退出当前会话并重新登录,或使用 newgrp libvirt 使更改生效
  5. 配置网络桥接(可选但推荐) 为了让虚拟机能像物理机一样访问外部网络,通常需要配置一个网络桥接。这里以创建一个名为br0的桥接为例,将物理网卡(如enp0s3)加入其中。 编辑/etc/netplan/01-netcfg.yaml (Ubuntu 18.04+) 或 /etc/network/interfaces (旧版Ubuntu/Debian) 或 /etc/sysconfig/network-scripts/ifcfg-enp0s3 (CentOS/RHEL)。 以Netplan为例:

    network:
      ethernets:
        enp0s3:
          dhcp4: no
      bridges:
        br0:
          interfaces: [enp0s3]
          dhcp4: yes
          # 或者配置静态IP
          # addresses: [192.168.1.10/24]
          # gateway4: 192.168.1.1
          # nameservers:
          #   addresses: [8.8.8.8, 8.8.4.4]
      version: 2

    应用网络配置:sudo netplan apply

  6. 创建和管理虚拟机 你可以使用virt-manager图形界面,或者更灵活的virt-install命令行工具。 使用virt-install创建虚拟机示例: 假设你有一个Ubuntu 22.04的ISO镜像在/var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso

    sudo virt-install \
    --name my-ubuntu-vm \
    --memory 4096 \
    --vcpus 2 \
    --disk path=/var/lib/libvirt/images/my-ubuntu-vm.qcow2,size=50,format=qcow2 \
    --network bridge=br0,model=virtio \
    --location /var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso \
    --os-variant ubuntu22.04 \
    --graphics spice,listen=0.0.0.0 \
    --console pty,target_type=serial \
    --noautoconsole

    这条命令会创建一个名为my-ubuntu-vm的虚拟机,分配4GB内存、2个CPU核心,50GB的QCOW2格式虚拟磁盘,连接到br0桥接网络并使用virtio网卡驱动,从ISO镜像启动安装。安装完成后,可以通过virt-managervirsh console my-ubuntu-vm连接。

    常用virsh命令:

    • virsh list --all: 列出所有虚拟机(包括关机的)。
    • virsh start my-ubuntu-vm: 启动虚拟机。
    • virsh shutdown my-ubuntu-vm: 正常关机虚拟机。
    • virsh destroy my-ubuntu-vm: 强制关闭虚拟机。
    • virsh define my-ubuntu-vm.xml: 从XML文件定义虚拟机。
    • virsh undefine my-ubuntu-vm: 删除虚拟机的定义(不删除磁盘文件)。

KVM和QEMU在Linux虚拟化中扮演了什么角色?

要说KVM和QEMU在Linux虚拟化里的角色,这俩就像一对配合默契的搭档,缺一不可。KVM,全称Kernel-based Virtual Machine,它实际上是Linux内核的一个模块。它的主要职责是利用现代CPU提供的硬件虚拟化功能(Intel VT-x或AMD-V),直接将虚拟机的CPU指令传递给物理CPU执行。简单来说,KVM就是那个让虚拟机跑得飞快的“加速器”,它把虚拟机的CPU和内存操作直接映射到物理硬件上,大大减少了软件模拟带来的性能损耗。没有KVM,虚拟化就得靠纯软件模拟,那速度可就差远了。

QEMU呢,它是一个通用的开源机器模拟器和虚拟器。在KVM出现之前,QEMU可以完全通过软件模拟一个完整的计算机系统,包括CPU、内存、硬盘、网卡等等,让各种操作系统能在上面运行。但纯软件模拟嘛,性能自然是瓶颈。当KVM被引入Linux内核后,QEMU就被“改造”了。它现在可以作为KVM的用户空间组件,负责模拟虚拟机的各种硬件设备(比如虚拟硬盘控制器、网卡、USB设备等),而CPU和内存的虚拟化则交给KVM来处理。这样一来,QEMU就不需要自己去模拟CPU指令了,它把最耗性能的部分甩给了KVM,自己则专注于提供一个完整的虚拟硬件环境。

所以,KVM是提供硬件加速的核心,是幕后的“大力士”;QEMU则是前端的“硬件提供商”,负责构建虚拟机的外壳和各种设备。它们俩通过Libvirt这个管理层紧密协作,Libvirt提供了一套统一的API和工具,让我们能够方便地创建、启动、停止和管理虚拟机,而不用直接和KVM或QEMU的底层命令打交道。这种分工协作,使得Linux上的虚拟化既强大又高效,也是为什么KVM/QEMU能够成为数据中心和云计算平台首选虚拟化技术的原因。我个人觉得,理解了这种分工,你才能真正体会到这套方案的精妙之处。

部署KVM/QEMU环境时常见的问题与排查思路有哪些?

部署KVM/QEMU环境,听起来挺直接,但实际操作中总会遇到些让人头疼的小问题。我遇到的情况,最常见的就是硬件虚拟化没开,或者网络配置出了岔子。

ImgGood
ImgGood

免费在线AI照片编辑器

下载

一个经典问题是:“虚拟机根本起不来,或者性能奇差。” 这往往指向了硬件虚拟化支持没启用。CPU支持虚拟化是一回事,BIOS/UEFI里有没有打开又是另一回事。很多人装完系统就直接干,忘了去BIOS里把Intel VT-x或AMD-V选项打开。排查起来很简单,egrep -c '(vmx|svm)' /proc/cpuinfo如果返回0,那基本就是这个原因了。得重启进BIOS,找找“Virtualization Technology”或者“SVM Mode”之类的选项,把它设为Enabled。

“虚拟机能启动,但没网络。” 这是我个人觉得最容易犯错的地方。网络桥接配置是KVM虚拟机联网的关键。很多人直接把物理网卡配置给虚拟机,结果发现物理机自己没网了,或者虚拟机根本获取不到IP。正确做法是创建一个网络桥接(比如br0),把物理网卡加到这个桥接里,然后让虚拟机连接到br0。排查时,可以用brctl show看看桥接是否建立,ip a检查桥接和物理网卡的IP配置是否正确。防火墙规则也可能是个坑,比如firewalldufw默认可能会阻止桥接流量,需要放行。journalctl -u libvirtddmesg命令也能提供不少线索,看看Libvirt服务有没有报错,或者内核有没有关于网络接口的异常信息。

还有就是权限问题。如果不是以root用户运行virsh命令,会遇到权限不足的错误。这通常是因为当前用户没有加入libvirt组。sudo adduser $USER libvirt然后重新登录一下就能解决。

偶尔还会遇到存储路径或权限问题。虚拟机磁盘文件(.qcow2.img)存放的目录,Libvirt服务需要有读写权限。如果把磁盘文件放在非默认路径,比如/mnt/data/vms,记得检查这个目录的权限,以及SELinux(如果你在RHEL/CentOS上)是否阻止了Libvirt访问。restorecon -Rv /var/lib/libvirt/images/或者调整SELinux策略是常见的处理方式。

总的来说,排查思路就是从硬件到软件,从底层到上层,一步步检查:硬件虚拟化 -> KVM模块加载 -> Libvirt服务状态 -> 用户权限 -> 网络配置 -> 存储路径/权限。大部分问题都逃不出这几个范畴。

如何优化KVM虚拟机的性能以达到接近物理机的体验?

让KVM虚拟机跑得像物理机一样流畅,这其实是个持续优化的过程,涉及到CPU、内存、存储和网络等多个层面。目标是尽可能减少虚拟化带来的开销,让虚拟机直接利用物理硬件的性能。

首先,CPU优化是重中之重。最直接的方式是使用host-passthroughhost-model的CPU模式。host-passthrough会让虚拟机直接暴露宿主机的CPU特性,最大限度地利用CPU指令集,比如AVX、SSE等,这对于需要高性能计算的应用尤其重要。但要注意,如果宿主机CPU型号不同,迁移虚拟机可能会有问题。host-model则提供了一个兼容性更好的折衷方案。另外,CPU pinning(CPU绑定)也很有用,它可以将虚拟机的vCPU固定到宿主机的特定物理CPU核心上,避免vCPU在不同物理核心之间频繁切换,减少上下文切换开销,提升性能稳定性。对于NUMA架构的服务器,合理配置NUMA节点能避免跨节点内存访问带来的延迟。

其次是内存优化。启用Hugepages(大页内存)能显著提升内存访问效率。传统的小页内存(4KB)会导致TLB(Translation Lookaside Buffer)缓存失效频繁,而大页内存(如2MB或1GB)可以减少TLB的压力,提高内存访问速度。当然,这需要在宿主机上预留一部分大页内存。虽然不是直接提升性能,但了解内存气球(Memory Ballooning)也重要,它允许Libvirt动态调整虚拟机内存大小,实现内存的超额分配,但这更多是关于资源利用率,而不是性能极致化。

存储性能是另一个关键瓶颈。使用Virtio-blk或Virtio-scsi驱动是标配,它们是专门为虚拟化设计的块设备驱动,性能远超模拟的IDE或SATA接口。虚拟磁盘的格式选择也很重要,qcow2虽然功能强大(如快照、稀疏分配),但性能略低于raw格式。如果对性能有极致要求,可以直接使用raw格式,或者将虚拟磁盘放在SSD上。PCI Passthrough(PCI设备直通)是终极武器,它允许你将宿主机上的某个物理PCI设备(如高性能SSD控制器、独立显卡、万兆网卡)直接分配给虚拟机使用。这样虚拟机就能独占这个设备,性能几乎和物理机无异。这在需要高性能I/O或图形处理的场景下非常有用。

网络方面,同样推荐使用Virtio-net驱动。它通过共享内存和队列的方式,减少了数据在宿主机和虚拟机之间复制的次数,大大提高了网络吞吐量和降低了延迟。如果硬件支持,SR-IOV(Single Root I/O Virtualization)是更高级的方案,它允许一个物理网卡虚拟出多个独立的虚拟功能(VF),每个VF可以被直通给一个虚拟机,实现接近物理网卡的性能,并且绕过了宿主机的软件交换层。

最后,确保虚拟机内部也安装了Virtio驱动。无论是Linux还是Windows虚拟机,安装这些驱动是发挥KVM性能的关键。没有这些驱动,虚拟机就只能使用模拟的通用设备,性能会大打折扣。总而言之,KVM的性能优化,很大程度上在于尽可能地使用virtio系列驱动,并在硬件层面进行直通,这样才能真正体验到接近物理机的流畅感。

相关专题

更多
typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

335

2023.10.11

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1878

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2085

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

998

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

63

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

405

2025.12.29

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.2万人学习

Git 教程
Git 教程

共21课时 | 2.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号