KVM 环境搭建:系统自带组与本地 yum 源,两条路一次走通

装 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、光驱、快照三类坑的排错实录》讲踩坑排查。

相关推荐
程序员大阳4 天前
副队长大数据教程(6)--四节点分布式集群搭建
大数据·分布式·集群·搭建·四节点
螺蛳粉 螺蛳粉9 天前
第五篇:KVM网络配置-NAT与桥接
网络配置·kvm·bridge·nat·linux运维·虚拟网络·桥接
螺蛳粉 螺蛳粉9 天前
第六篇:KVM性能优化与调优指南
性能优化·虚拟化·kvm·virtio·io优化·大页内存·cpu绑定
小北的AI科技分享16 天前
ai搭建服务商怎么选?从技术栈到交付质量拆解
模型·搭建·交付
小北的AI科技分享19 天前
门店小程序商城搭建怎么选择合适的方案
商城·搭建·门店
java_logo23 天前
Docker 部署 dockurr/windows:轻松搭建浏览器可控 Windows 虚拟机
运维·windows·docker·容器·虚拟机·kvm·轩辕镜像
.冰块.1 个月前
VM 实战:从两种方式安装到热迁移,一篇打通
虚拟化·kvm·热迁移
东鹏特饮1 个月前
redhat9 配置yum 阿里云
linux·运维·redhat·yum
AI技术呱1 个月前
Amazon卖家转型独立站:主流AI工具横向测评(附实战参数)
搭建·库存·卖家