当前位置:首页 > 文章列表 > 文章 > linux > KVM与QEMU虚拟化部署实操教程

KVM与QEMU虚拟化部署实操教程

2025-07-22 22:42:28 0浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《Linux虚拟化部署:KVM与QEMU实操指南》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

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

一个经典问题是:“虚拟机根本起不来,或者性能奇差。” 这往往指向了硬件虚拟化支持没启用。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系列驱动,并在硬件层面进行直通,这样才能真正体验到接近物理机的流畅感。

本篇关于《KVM与QEMU虚拟化部署实操教程》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

豆包AI修复代码错误方法详解豆包AI修复代码错误方法详解
上一篇
豆包AI修复代码错误方法详解
Golang建造者模式更安全?对比Java链式调用
下一篇
Golang建造者模式更安全?对比Java链式调用
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI歌曲生成器:免费在线创作,一键生成原创音乐
    AI歌曲生成器
    AI歌曲生成器,免费在线创作,简单模式快速生成,自定义模式精细控制,多种音乐风格可选,免版税商用,让您轻松创作专属音乐。
    20次使用
  • MeloHunt:免费AI音乐生成器,零基础创作高品质音乐
    MeloHunt
    MeloHunt是一款强大的免费在线AI音乐生成平台,让您轻松创作原创、高质量的音乐作品。无需专业知识,满足内容创作、影视制作、游戏开发等多种需求。
    20次使用
  • 满分语法:免费在线英语语法检查器 | 论文作文邮件一键纠错润色
    满分语法
    满分语法是一款免费在线英语语法检查器,助您一键纠正所有英语语法、拼写、标点错误及病句。支持论文、作文、翻译、邮件语法检查与文本润色,并提供详细语法讲解,是英语学习与使用者必备工具。
    32次使用
  • 易销AI:跨境电商AI营销专家 | 高效文案生成,敏感词规避,多语言覆盖
    易销AI-专为跨境
    易销AI是专为跨境电商打造的AI营销神器,提供多语言广告/产品文案高效生成、精准敏感词规避,并配备定制AI角色,助力卖家提升全球市场广告投放效果与回报率。
    32次使用
  • WisFile:免费AI本地文件批量重命名与智能归档工具
    WisFile-批量改名
    WisFile是一款免费AI本地工具,专为解决文件命名混乱、归类无序难题。智能识别关键词,AI批量重命名,100%隐私保护,让您的文件井井有条,触手可及。
    32次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码