什么是 KVM?

基于内核的虚拟机(KVM)是一种软件功能,您可以将其安装在物理 Linux 机器上以创建虚拟机。虚拟机是一种软件应用程序,可作为另一台实体计算机中的独立计算机使用。虚拟机与实体计算机共享 CPU 周期、网络带宽和内存等资源。KVM 是 Linux 操作系统组件,它为 Linux 上的虚拟机提供原生支持。自 2007 年以来,它已在 Linux 发行版中推出。

KVM 为什么重要?

基于内核的虚拟机(KVM)可以将任何 Linux 设备转变为裸机虚拟机监控器。它允许开发人员为不同的操作系统扩展计算基础设施,而不用投资新的硬件。KVM 将服务器管理员从手动预置虚拟化基础设施的工作当中解放出来,并且实现了在云环境中轻松地部署大量虚拟机。

公司因为以下优点而选择使用 KVM。

高性能

KVM 被设计用于无缝管理高要求应用程序。所有客户机操作系统都继承了主机操作系统 – Linux 的高性能。KVM 虚拟机监控器还允许在尽可能接近于服务器硬件的位置执行虚拟化,从而进一步缩短进程延迟。

安全性

在 KVM 上运行的虚拟机具有 Linux 操作系统的原生安全功能,包括安全增强型 Linux(SELinux)。这确保了所有虚拟环境都严格遵守其对应的安全边界,从而强化数据隐私和治理。

稳定性

KVM 被广泛用于业务应用程序的历史已超过十年。它拥有来自蓬勃发展的开源社区的杰出支持。支持 KVM 的源代码十分成熟,为企业应用程序提供稳定的基础。

成本效益

KVM 是免费开源的,这意味着公司不必支付额外的许可费用即可托管虚拟机。

灵活性

KVM 在安装时为公司提供很多选项,因为它能兼容各种硬件设置。服务器管理员可以利用 KVM,高效地将额外 CPU、存储或内存分配给虚拟机。KVM 还支持精简预置,也就是只在需要时为虚拟机提供资源。

KVM 如何运作?

基于内核的虚拟机(KVM)要求在计算机上安装 Linux 内核,而该计算机要搭载支持虚拟化扩展的 CPU。具体来说,KVM 支持全部 x86 CPU,亦即能处理 Intel x86 指令语言的计算机芯片系列。

Linux 内核

Linux 内核是开源操作系统的核心。内核是与计算机硬件进行交互的低级别程序。它还确保在操作系统上运行的软件应用程序能获得所需的计算资源。Linux 发行版,如 Red Hat Enterprise Linux、Fedora 和 Ubuntu 等,都在用户友好的商用操作系统中打包了 Linux 内核和其他程序。

如何启用 KVM

在安装 Linux 内核以后,您需要在 Linux 设备上安装以下额外的软件组件:

  • 主机内核模块

  • 特定于处理器的模块

  • 仿真器

  • 一系列用于扩展 KVM 功能和性能的其他 Linux 程序包

一旦加载,服务器管理员会通过命令行工具或图形用户界面创建虚拟机。然后,KVM 启动虚拟机作为独立的 Linux 进程。虚拟机监控器会为每台虚拟机分配虚拟内存、存储、网络、CPU 和资源。

环境准备

- 官方主机要求:
	- 1 core
	- 2 GB memory
	- 6 GB disk

- 我们学习使用中,建议配置高一点:
	- 如上图1所示,我给了虚拟机8core,16G,200GB磁盘且CPU一定要勾选支持虚拟化功能;
		如果你的配置较低,也可以考虑使用4core,8GB,100GB。
	- 生产环境中,对于KVM的使用建议大家直接在Linux主机安装KVM,此处我们在学习环境中使用虚拟机来演示;
	- 如上图2所示,安装KVM虚拟机时建议选择图形化安装以减少错误率;
	- 如上图3所示,关闭KDUMP工具;
	
- Linux运行KVM虚拟机需求:(具体效果如下图所示)
lscpu  | grep Virtualization:
egrep 'svm|vmx'  /proc/cpuinfo  # 有几颗CPU就会显示几次vmx指令哟,我这里是16core。

先确认系统是否支持 KVM(必备前提)

egrep -c '(vmx|svm)' /proc/cpuinfo

完整的安装命令

# 更新软件源(可选,但建议执行)
sudo apt update

# 安装KVM核心依赖包
sudo apt -y install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager qemu-utils

# 启动并开机自启libvirtd服务
sudo systemctl enable --now libvirtd

# 将当前用户加入libvirt和kvm组(避免每次操作都用sudo)
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

# 检查libvirtd服务状态
sudo systemctl status libvirtd

# 检查KVM模块是否加载
lsmod | grep kvm

# 验证KVM环境
[root@ceph141 ~]# virsh list --all
 Id   Name   State
--------------------

# 查看虚拟网络
[root@ceph141 ~]# virsh net-list 
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes

启动虚拟机

  0.将镜像上传到目录
# 先创建存放镜像和磁盘文件的目录(避免目录不存在报错)
sudo mkdir -p /opt
# 在win上执行
scp D:\app\虚拟机\虚拟机镜像\CentOS-7-x86_64-DVD-2009.iso root@10.0.0.141:/opt/
# 确保CentOS 7镜像文件已上传到/opt目录

  1.启动虚拟机
#旧版本:部分命令说已弃用
sudo virt-install --virt-type kvm \
    --os-type=linux \
    --os-variant centos7 \
    --name fanxuxu-kvm01 \
    --memory 2048 \
    --vcpus 2 \
    --disk /opt/fanxuxu-kvm01.raw,format=raw,size=10 \
    --cdrom /opt/CentOS-7-x86_64-DVD-2009.iso \
    --network network=default \
    --graphics vnc,listen=0.0.0.0 \
    --noautoconsole
    	
    	
    2.使用vnc连接虚拟机
systemctl disable --now firewalld
netstat -untalp | grep 5900  # 注意,VNC服务端监听的默认端口为"5900",连接测试。


	3.KVM虚拟机的日常使用指南
推荐阅读:
    https://www.cnblogs.com/yinzhengjie/tag/KVM/


温馨提示:
	- 每次启动虚拟机都会监听一个端口,默认监听的端口是从5900开始,依次递增;
		该端口可以直接通过vnc客户端工具进行连接即可。
		
	- 每次启动虚拟机都会启动一个qemu-kvm进程。
		ps -ef  | grep qemu-kvm

参数

作用

--virt-type kvm

指定虚拟化类型为 KVM(硬件加速,性能最好)

--os-type=linux

声明虚拟机操作系统类型为 Linux

--os-variant rhel7

适配 RHEL7/CentOS7 的内核和硬件配置,自动优化

--name yinzhengjie-kvm01

虚拟机名称(唯一标识,后续管理用)

--memory 2048

分配 2048MB(2G)内存给虚拟机

--vcpus 2

分配 2 个虚拟 CPU 核心

--disk ...

定义磁盘:路径 /opt/yinzhengjie-kvm01.raw,格式 raw,大小 10GB

--cdrom ...

指定安装介质(CentOS7 ISO 镜像路径)

--network ...

网络配置:使用 default 虚拟网桥,允许虚拟机联网

--graphics vnc,listen=0.0.0.0

启用 VNC 图形界面,监听所有网卡(方便远程连接)

--boot cdrom,hd

启动顺序:先从光盘(安装系统),后从硬盘

--noautoconsole

不自动打开本地控制台(适合远程操作)

安装系统后重启

# 查看所有KVM虚拟机状态
[root@ceph141 /opt]# sudo virsh list --all
 Id   Name            State
--------------------------------
 -    fanxuxu-kvm01   shut off

[root@ceph141 /opt]# sudo virsh start fanxuxu-kvm01
Domain 'fanxuxu-kvm01' started

[root@ceph141 /opt]# sudo virsh list --all
 Id   Name            State
-------------------------------
 2    fanxuxu-kvm01   running

[root@ceph141 /opt]# ssh root@192.168.122.185
root@192.168.122.185's password: 
Permission denied, please try again.
root@192.168.122.185's password: 
Last failed login: Sun Feb 15 11:48:56 CST 2026 from ceph141 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sun Feb 15 11:43:35 2026 from ceph141
[root@kvm01 ~]# ll
total 4
-rw-------. 1 root root 1445 Feb 15 11:35 anaconda-ks.cfg

# 设置虚拟机开机自启(宿主机开机,虚拟机自动启动)
sudo virsh autostart fanxuxu-kvm01

# 关机:sudo virsh shutdown fanxuxu-kvm01
[root@ceph141 /opt]# sudo virsh shutdown fanxuxu-kvm01
Domain 'fanxuxu-kvm01' is being shutdown

[root@ceph141 /opt]# sudo virsh list --all
 Id   Name            State
--------------------------------
 -    fanxuxu-kvm01   shut off