装 KVM 有两条路:一条在装系统时顺手勾一个软件组,一条是最小化装完再补本地源装包。选错路的结果很具体------
virsh命令不存在、软件组列表里找不到 Virtualization、libvirtd起不来、客户机一开机就报 KVM 不可用。这篇把两条路各走一遍,重点是方式二那套把安装光盘变成 yum 源的配置,它既是离线机房的刚需,也是后面所有实验的地基。文中命令名均标注英文全称(如virsh= v irtual shell),完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 在 CentOS Stream 8 上用两种方式装出 KVM 宿主环境,并用同一组命令验收 |
| 所属类别 | Linux 系统管理 → 虚拟化 → KVM 宿主环境搭建 |
| 知识关键字 | Virtualization Host · libvirtd · dvd.repo · /dev/sr0 · yum group install · virsh version · firewalld · SELinux · default 网络 |
主线是这样走的:先认清 KVM / libvirt / QEMU 三层各管什么;再建一台练习机,走「安装时选组」的快路;然后走「最小化 + 本地源」这条能复制到离线机房的路;最后用同一组命令验收,给出两条路的选型对照与常见报错速查。
一、先认清三层关系:KVM、QEMU、libvirt 各管什么
新手最容易把这三者混成一个东西。它们其实是三层的:内核里的模块、用户态的模拟器、管理层的工具集。
| 层 | 组件 | 一句话职责 | 没有它会怎样 |
|---|---|---|---|
| 内核层 | kvm.ko |
提供硬件虚拟化入口,让客户机指令跑在 CPU 的 VMX 模式里 | 只能全模拟,性能差一个数量级 |
| 用户态 | qemu-kvm |
真正「跑」这台虚拟机的进程,负责设备模拟与 I/O | 没有进程承载客户机 |
| 管理层 | libvirt + virsh |
统一 API、XML 配置、生命周期管理、网络与存储池 | 只能手写几十个 QEMU 参数 |
virsh 只是 libvirt 的命令行客户端,它下发指令给 libvirtd,libvirtd 再去组织 QEMU 的启动参数。
这也是为什么装完要看 virsh version:它同时报出 libvirt 库版本和 QEMU 版本,一条命令验了两层。
⚠️ 注意 :
virsh version里Compiled against library是编译时链接的库版本,Running hypervisor才是真正在跑的 QEMU。两个不一致是正常的,别拿它当故障。
二、先准备一台实验用虚拟机
KVM 宿主本身就是一台普通 Linux 主机。先在 VMware 里建一台 CentOS Stream 8,全程只有一步是硬性要求。
| 步骤 | 设置项 | 取值 |
|---|---|---|
| 1 | 安装类型 | 自定义(高级) |
| 2 | 客户机操作系统 | Linux / CentOS 8 64 位 |
| 3 | 虚拟机名称 | KVM1 |
| 4 | 处理器 | 数量按物理核数给,别超过宿主机逻辑核 |
| 5 | 内存 | 至少 4G;要跑 Windows 客户机建议 8G 起 |
| 6 | 网络类型 | NAT |
| 7 | I/O 控制器与磁盘类型 | 都选推荐值 |
| 8 | 磁盘 | 新建虚拟磁盘,100G,拆成多个文件 |
| 9 | 自定义硬件 → 处理器 | 勾选「虚拟化 Intel VT-x/EPT 或 AMD-V/RVI」 |
| 10 | 自定义硬件 → 新 CD/DVD | 使用 ISO 映像,挂 CentOS-Stream-8 光盘 |
第 9 步决定客户机能不能再跑客户机,其余都是常规选项。
text
VMware → 虚拟机设置 → 处理器 → 虚拟化引擎
[✓] 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI
[ ] 虚拟化 IOMMU(IO 内存管理单元)
⚠️ 注意 :处理器设置里不勾「虚拟化 Intel VT-x」,系统照装、KVM 组件照装,但一开客户机就报
KVM: not enabled in BIOS或cannot set up guest memory 'pc.ram'。宿主机物理 CPU 也要在 BIOS 里开着 VT-x,两层都要开,缺一层都不行。
启动后选 Install CentOS Stream 8,进入图形安装界面。
三、方式一:安装时勾选 Virtualization Host
系统安装自带一个「软件选择」页,把它改成 Virtualization Host,KVM 就顺带装好了。
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 安装目的地 → Done | 默认分区即可,会启用 LVM |
| 2 | 时间和日期 → 上海 → Done | 时区错了日志时间会全偏 |
| 3 | 网络和主机名 → 打开开关 → Done | 自动获取地址 |
| 4 | Root 密码 → 设置后 Done | 实验环境可勾「允许 root 使用密码远程登录」 |
| 5 | 软件选择 → Virtualization Host | 关键一步 |
| 6 | 开始安装 → 完成后重启 | --- |
这个组一次把下面这些装齐:
| 组件 | 作用 |
|---|---|
qemu-kvm |
QEMU 的 KVM 加速版,真正的虚拟化进程 |
libvirt / libvirt-client |
管理库与 virsh 命令行 |
virt-install |
命令行建机工具 |
virt-manager |
图形化管理器(VMM) |
libguestfs-tools |
离线查看、修改客户机磁盘 |
libvirt-daemon-config-network |
自带的 default NAT 网络定义 |
同时 libvirtd 会被设为开机自启,virbr0 网桥会被创建。装完直接跳到第五章验收。
四、方式二:最小化安装后补本地镜像源
这条路适合离线机房,也适合「系统早装好了、当时忘了勾虚拟化组」的补救。核心思路是把安装光盘当成本地 yum 源。
4.1 五步做完
| 步骤 | 做什么 | 命令 |
|---|---|---|
| 1 | 挂载光盘 | mount /dev/sr0 /mnt |
| 2 | 挪走自带源 | mv /etc/yum.repos.d /etc/yum.repos.d.bak |
| 3 | 重建源目录并写本地源 | mkdir /etc/yum.repos.d + vim dvd.repo |
| 4 | 刷新缓存 | yum clean all + yum makecache |
| 5 | 装虚拟化组件 | yum group install "Virtualization*" -y |

bash
# 1 确认光驱设备名,最小化系统里一般是 sr0
[root@KVM1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 12.8G 0 rom
# 2 挂载光盘;只读挂载,出现 write-protected 提示是正常的
[root@KVM1 ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
# 3 把官方源整体挪走,比直接 rm 安全,随时能挪回来
[root@KVM1 ~]# mv /etc/yum.repos.d /etc/yum.repos.d.bak
[root@KVM1 ~]# mkdir /etc/yum.repos.d
写本地源文件。CentOS Stream 8 把软件包拆在 AppStream 与 BaseOS 两个目录,两个都要写:
bash
[root@KVM1 ~]# vim /etc/yum.repos.d/dvd.repo
[AppStream]
name=AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
刷新缓存并安装:
bash
# 4 先清缓存再重建,避免读到旧元数据
[root@KVM1 ~]# yum clean all
[root@KVM1 ~]# yum makecache
Last metadata expiration check: 0:00:12 ago.
# 5 装虚拟化组,组名带通配符可以一次匹配多个
[root@KVM1 ~]# yum group install "Virtualization*" -y
4.2 repo 文件字段速查表
| 字段 | 含义 | 英文原意 |
|---|---|---|
[AppStream] |
仓库 ID,必须唯一,方括号内不能有空格 | identifier |
name |
仓库显示名,yum repolist 里看到的就是它 |
name |
baseurl |
仓库根地址,file:// 表示本地目录 |
base URL |
enabled |
1 启用,0 停用 |
enabled |
gpgcheck |
1 校验包签名,0 跳过;本地光盘可设 0 |
G nuP G check |
gpgkey |
公钥文件路径,gpgcheck=1 时必须给 |
G nuP G key |
cost |
多仓库时的优先级,数值越小越优先 | cost |
file:// 后面是三个斜杠:前两个是协议分隔,第三个是根路径的斜杠。写成 file://mnt 会报找不到仓库。
⚠️ 注意 :
AppStream与BaseOS两个仓库缺一不可。只写 BaseOS 时yum group install "Virtualization*"会报「没有可用软件包组」,因为qemu-kvm这类核心包在 AppStream 里。
4.3 组名通配符与查询
不确定组名时先查,别硬猜:
bash
# 列出全部软件组;带 (installed) 的是已装的
[root@KVM1 ~]# yum grouplist
# 只看组名,过滤掉环境组
[root@KVM1 ~]# yum group list ids
# 看某个组里到底有哪些包
[root@KVM1 ~]# yum group info "Virtualization Host"
Virtualization* 会同时匹配 Virtualization Host、Virtualization Client、Virtualization Platform、Virtualization Tools 等多个组,这正是它有用的地方------不用逐个记名字。
4.4 mount 参数速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
mount |
把设备挂到目录上 | to mount a filesystem |
/dev/sr0 |
第一个光盘设备 | s csi r ead-only,编号 0 |
/mnt |
挂载点,目录必须已存在 | m ount point |
-t iso9660 |
指定文件系统类型,光盘默认能识别 | type |
-o ro |
只读挂载 | o ption,r ead-only |
-o loop |
把普通 ISO 文件当块设备挂 | loop device |
4.5 yum 参数速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
yum |
RPM 包管理器 | Y ellowdog U pdater Modified |
clean all |
清空元数据与包缓存 | clean |
makecache |
下载并缓存仓库元数据 | make cache |
group install |
按软件组安装,组名支持通配符 | group |
grouplist |
列出全部软件组 | group list |
-y |
所有交互提问自动回 yes | yes |
--nogpgcheck |
跳过签名校验,自建源常用 | no G nuPG check |
repolist |
列出已启用的仓库 | repository list |
五、装完验证:四条命令
两条路走完,验收命令完全一样。
bash
# 1 版本线:库版本与真正在跑的 QEMU 版本
[root@KVM1 ~]# virsh version
Compiled against library: libvirt 8.0.0
Using library: libvirt 8.0.0
Using API: QEMU 8.0.0
Running hypervisor: QEMU 6.2.0
# 2 守护进程是否在跑
[root@KVM1 ~]# systemctl is-active libvirtd
active
# 3 --all 连未激活的网络一起列,KVM 自带一条叫 default 的 NAT 网络
[root@KVM1 ~]# virsh net-list --all
Name State Autostart Persistent
--------------------------------------------
default active yes yes
# 4 -c 只输出命中行数,大于 0 才算 CPU 虚拟化真开了
[root@KVM1 ~]# egrep -c '(vmx|svm)' /proc/cpuinfo
8
# 5 确认 KVM 设备节点在位,这是 QEMU 走硬件加速的门票
[root@KVM1 ~]# ls -l /dev/kvm
crw-rw-rw-. 1 root kvm 10, 232 Oct 21 17:20 /dev/kvm
五条里前四条是必须,第五条是加分项:/dev/kvm 存在且权限对,说明 kvm 模块已加载、当前用户组能访问。
| 参数 | 含义 | 英文原意 |
|---|---|---|
-all |
全部(含未激活、未持久化的对象) | all |
-c |
只输出匹配行数 | count |
-l |
长格式,含权限与属主 | long format |
| `(vmx | svm)` | Intel / AMD 两种虚拟化标志,正则择一 |
virsh net-list 单独用只列激活网络,--all 才能看到定义过但没启动的,排查网络问题时这个参数很关键。
⚠️ 注意 :
systemctl is-active libvirtd返回inactive不等于没装。RHEL 9 之后 libvirt 拆成了virtqemud、virtnetworkd、virtstoraged等模块化守护进程,要查virtqemud。RHEL 8 系仍是单一的libvirtd。
六、客户机磁盘放哪:默认目录与自定义目录
装完就该知道镜像往哪放,否则后面建机会到处乱丢。
bash
# 默认存储池的路径
[root@KVM1 ~]# virsh pool-list --all
Name State Autostart
-------------------------------
default active yes
[root@KVM1 ~]# virsh pool-dumpxml default | grep -A2 "<target>"
<path>/var/lib/libvirt/images</path>
[root@KVM1 ~]# ls -lh /var/lib/libvirt/images/
自建目录放镜像时,要注意 SELinux 标签与目录权限两件事:
bash
# 建自定义目录
[root@KVM1 ~]# mkdir /disk
# 把标签重打成虚拟化镜像类型,-R 递归 -v 显示改动
[root@KVM1 ~]# semanage fcontext -a -t virt_image_t "/disk(/.*)?"
[root@KVM1 ~]# restorecon -Rv /disk
# 确认标签
[root@KVM1 ~]# ls -Z /disk
| 参数 | 含义 | 英文原意 |
|---|---|---|
pool-list |
列出存储池 | pool |
pool-dumpxml |
以 XML 显示存储池定义 | dump XML |
semanage fcontext |
管理 SELinux 文件上下文规则 | f ile context |
-a |
新增一条规则 | add |
-t |
指定目标类型 | type |
-R |
递归处理子目录 | recursive |
-v |
显示被改动过的文件 | verbose |
-Z |
显示 SELinux 上下文 | Z (context) |
⚠️ 注意 :
/disk、/iso这类自定义目录不在 libvirt 默认镜像路径里。SELinux 开着时标签不对,客户机会起不来并报Could not open '/disk/xxx.qcow2': Permission denied。用ls -Z看一眼,标签不是virt_image_t就是这个问题。
七、两条路怎么选

| 维度 | 方式一:Virtualization Host | 方式二:最小化 + 本地源 |
|---|---|---|
| 耗时 | 装系统时顺带完成,零额外步骤 | 装完系统后多花约 5 分钟 |
| 需要联网 | 不需要 | 不需要 |
| 装上什么 | 全套组件,含 virt-manager 图形界面 | Virtualization* 组,同样含图形界面 |
| 磁盘占用 | 较大,附带图形栈与文档 | 较小,按需增装 |
| 适合场景 | 一次装好、懒得折腾 | 离线机房、批量部署、系统已装好 |
| 风险点 | 软件选择页勾错组 | repo 写错或缺 AppStream |
系统装完才发现没勾虚拟化组,直接走方式二补,不用重装。反过来,如果方式二把源配坏了,把挪走的目录还回来即可:
bash
# 卸载虚拟化组并还原官方源
[root@KVM1 ~]# yum group remove "Virtualization*" -y
[root@KVM1 ~]# rm -rf /etc/yum.repos.d
[root@KVM1 ~]# mv /etc/yum.repos.d.bak /etc/yum.repos.d
[root@KVM1 ~]# yum clean all
八、装完顺手处理两个前置
这两步不做,后面建客户机会撞上两类很典型的报错。完整排查过程见姊妹篇《KVM 装完连不上:VNC、光驱、快照三类坑的排错实录》。
bash
# 火墙放行 VNC 端口;实验环境也可以直接 systemctl stop firewalld
[root@KVM1 ~]# firewall-cmd --permanent --add-port=5903/tcp
[root@KVM1 ~]# firewall-cmd --reload
# 顺带确认 libvirtd 开机自启,否则重启后 virsh 会连不上
[root@KVM1 ~]# systemctl enable --now libvirtd
| 参数 | 含义 | 英文原意 |
|---|---|---|
--permanent |
写入持久配置,重启不丢 | permanent |
--add-port |
放行指定端口与协议 | add port |
--reload |
重载规则,让持久配置立刻生效 | reload |
--now |
同时启动服务,等价于 start + enable | now |
enable |
设为开机自启 | enable |
firewall-cmd --permanent 只写配置不生效,必须跟一条 --reload;不加 --permanent 则只改运行时、重启就丢。
九、常见报错速查
装的过程中最容易撞这几条,对照着看。
| 报错原文 | 中文含义 | 根因与处置 |
|---|---|---|
There are no enabled repositories |
没有已启用的仓库 | repo 文件没写或 enabled=0,查 yum repolist |
No available software group |
没有可用软件包组 | 组名拼错,或缺 AppStream 仓库 |
Could not resolve host |
无法解析主机名 | 清空了官方源但还没配本地源,临时断网属预期 |
KVM: not enabled in BIOS |
BIOS 里没开 KVM | VMware 处理器没勾虚拟化引擎,或物理 BIOS 没开 VT-x |
cannot set up guest memory 'pc.ram' |
无法为客户机分配内存 | 同上报错,本质是拿不到硬件虚拟化 |
Failed to connect socket to '/var/run/libvirt/libvirt-sock' |
连不上 libvirt 套接字 | libvirtd 没起,systemctl start libvirtd |
Could not open '/disk/x.qcow2': Permission denied |
打不开磁盘文件 | SELinux 标签不对,restorecon -Rv /disk |
device write-protected |
设备写保护 | 只读挂载光盘的提示,不是错误 |
参考资料(官方文档 · 中英双语)
其余手册在宿主机上直接查:
bash
man 8 libvirtd # 虚拟化守护进程
man 1 virsh # 管理命令行
man 5 libvirtd.conf # 守护进程配置文件
man 5 virtinst # virt-install 的配置与参数
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
virsh |
v irtual shell | libvirt 管理命令行 |
yum |
Yellowdog Updater Modified | RPM 包管理器 |
lsblk |
l is t bl ock devices | 列出块设备与挂载点 |
mount |
mount a filesystem | 挂载文件系统 |
firewall-cmd |
firewall c om mand | firewalld 的命令行工具 |
restorecon |
restore context | 按策略恢复 SELinux 标签 |
semanage |
s elinux manage | SELinux 策略管理工具 |
systemctl |
system c ont rol | systemd 服务管理 |
KVM |
K ernel-based V irtual Machine | 内核级虚拟化模块 |
libvirt |
libvirtualization | 虚拟化管理库与工具集 |
QEMU |
Q uick Emulator | 处理器模拟器 |
VNC |
V irtual N etwork Computing | 远程屏幕共享协议 |
NAT |
N etwork A ddress Translation | 网络地址转换 |
SELinux |
S ecurity-E nhanced Linux | 强制访问控制机制 |
RPM |
RPM Package Manager | 红帽系软件包格式 |
总结 :装 KVM 只有两条路------装系统时勾
Virtualization Host,或最小化装完挂光盘补成本地源。两条路都用virsh version加三条辅助命令验收,装完顺手处理火墙、SELinux 标签与libvirtd自启。姊妹篇《KVM 虚拟机管理:virt-manager 与 virsh 命令速查手册》讲建机与日常操作,《KVM 装完连不上:VNC、光驱、快照三类坑的排错实录》讲踩坑排查。
