虚拟化环境配置与KVM虚拟机管理

3311 字
17 分钟
虚拟化环境配置与KVM虚拟机管理

虚拟化环境配置 && KVM 虚拟机管理#

[TOC]


🧱 知识点总结#

虚拟化核心概念#

==虚拟化== 就是在一台物理机上,用软件模拟出多台”假”的机器,每台假机器都能跑独立的操作系统

  • Hypervisor (VMM):虚拟化的核心管理层,负责把物理 CPU/内存/磁盘”切”给虚拟机用
  • KVM (Kernel-based Virtual Machine)Linux 内核自带的虚拟化模块,把 Linux 变成一个 Hypervisor
  • QEMU:模拟硬件设备(网卡、磁盘、显卡等),和 KVM 搭配使用
  • libvirt:一套管理虚拟化的 API/守护进程,提供了统一的命令行和编程接口

📌 一句话KVM 负责”算”,QEMU 负责”装”,libvirt 负责”管”

环境准备检查清单#

检查项命令预期结果
CPU 是否支持虚拟化`cat /proc/cpuinfogrep -E ‘vmx
虚拟化包是否安装rpm -q qemu-kvm libvirt显示版本号
服务是否启动systemctl status libvirtdactive (running)

💡 小技巧:虚拟化引擎需要在 VMware/虚拟机设置中勾选”==虚拟化 Intel VT-x/EPT 或 AMD-V/RVI==“,否则 KVM 无法使用硬件加速

image-20260528184412580
image-20260528184412580

Terminal window
1)支持虚拟化
[root@R199 ~]# cat /proc/cpuinfo | egrep 'vmx|svm'
flags : fpu xxx svm xxx ✅️
2)安装虚拟化包
[root@R199 ~]# dnf -y install qemu-kvm libvirt
[root@R199 ~]# rpm -q qemu-kvm libvirt
qemu-kvm-10.0.0-14.el10_1.5.x86_64
libvirt-11.5.0-4.8.el10_1.x86_64
==================================
virt-viewer 是一个轻量级的图形控制台查看器
# 用来在你的桌面上显示虚拟机的图形界面
安装阶段:✅️ virt-viewer 看安装向导
装完之后(假设装了桌面版):✅️ virt-viewer GNOME 桌面
'只要有图形界面要显示,它就负责弹窗给你看'
📌 我的需求是 --> 在安装阶段 --> 有图形化显示
3)必要管理工具
[root@R199 ~]# dnf -y install virt-install
'下面有介绍管理工具'
✅️ 我们选择用命令行去管理
# 不推荐用virt-manager --> 这个不如自带的cockpit(Web控制台)
  • 三大管理工具对比
特性virt-managervirt-installcockpit
类型GUI 桌面应用命令行Web 控制台
适合场景本地图形化操作脚本/自动化远程 Web 管理
学习曲线⭐ 简单⭐⭐⭐ 中等⭐⭐ 较低
批量部署❌ 不方便✅ 适合❌ 不方便
Terminal window
4)启动服务(开启自启)
[root@R199 ~]# systemctl is-active libvirtd
inactive ⚠️ '多了个d'
[root@R199 ~]# systemctl enable --now libvirtd
[root@R199 ~]# systemctl is-active libvirtd
active

虚拟网络架构#

KVM 默认创建 virbr0 网桥,相当于一个 ==NAT 虚拟交换机==,虚拟机通过它上网

Terminal window
[root@R199 ~]# ip add show virbr0
3: virbr0: xxx
link/ether 52:54:00:74:59:5b brd ff:ff:ff:ff:ff:ff
inet '192.168.122.1/24' brd 192.168.122.255 scope global virbr0
✅️ 这张网卡默认IP地址为 192.168.122.1/24 📌

🧱 虚拟机是怎么 ping 通外网的?

virbr0 做了一个”地址翻译” —> ==NAT==

  • 虚拟机用假 IP 出门,宿主机帮它换成真 IP,回包来了再换回去
    • 虚拟机完全无感

🧱 类比对照:KVM 的 virbr0 ≈ VMware 的 VMnet8

💡 你完全可以这么理解

  • KVM 里的 virbr0 就是你 VMware 里的 VMnet8 网卡
  • 它们在架构中的角色完全一样——都是一台 ==NAT 虚拟交换机==
  • 虚拟机想上网,先走虚拟交换机,再经过 NAT 转发到物理网卡,最后出公网
  • 唯一的区别:VMware 叫 VMnet8,KVM 叫 virbr0,本质是同一个东西
  • 防火墙区域virbr0 属于 libvirt 区域,有独立的防火墙规则
  • 关键点:宿主机提供的 HTTP/FTP 服务,需要同时在==默认区域==和 ==libvirt== 区域放行
    • 因为虚拟机通过 virbr0 进来,走的是 libvirt 区域规则

✅ 编辑默认网络配置#

Terminal window
'我这里是Ubuntu系统'
# 编辑之前可以先查看一下都有那些网络🛜
jiuzhao@Ubuntu 桌面$ virsh net-list --all
Name State Autostart Persistent
--------------------------------------------
default active yes yes
# 只有这个默认的网络
1)编辑默认网络配置
jiuzhao@Ubuntu 桌面$ sudo virsh net-edit default
Select an editor. To change later, run 'select-editor'.
# 选择编辑器
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 2 ✅
Network default XML configuration edited.
<network>
<name>default</name>
<uuid>8a858bbb-913f-4ae7-b5ea-4bfb39563c3d</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:50:7c:87'/>
<!-- 修改这里 -->
<ip address=📌'10.0.0.1'📌 netmask='255.255.255.0'>
<dhcp>
<!-- DHCP范围也要同步修改 -->
<range start=📌'10.0.0.2'📌 end=📌'10.0.0.254'📌/>
</dhcp>
</ip>
</network>
2)重启默认网络使配置生效
jiuzhao@Ubuntu 桌面$ sudo virsh net-destroy default
Network default destroyed
jiuzhao@Ubuntu 桌面$ sudo virsh net-start default
Network default started
3)验证生效
jiuzhao@Ubuntu 桌面$ ip add sho virbr0
8: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:50:7c:87 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 ✅brd 10.0.0.255 scope global virbr0
valid_lft forever preferred_lft forever

📝 完成指南#

练习要求

  1. 使用 vsftpd 服务共享网络源
  2. 使用 virt-install 基于 vsftpd 共享的网络源安装最小化的 Rocky 10
  3. 使用 Cockpit 在浏览器中验证系统可用性,确认无误后关机删除(连硬盘一起删)

① 搭建 vsftpd 网络安装源#

Terminal window
1)安装 vsftpd
[root@R199 ~]# dnf -y install vsftpd
✅️ vsftpd FTP 服务,用来共享 Rocky10 ISO 内容给虚拟机
2)关闭 SELinux 和 firewalld
[root@R199 ~]# getenforce
Disabled
[root@R199 ~]# systemctl is-active firewalld.service
inactive
3)上传 Rocky 10镜像
[root@R199 ~]# mkdir /images
[root@R199 ~]# ls /images/ | wc -l
0
'把镜像放在这里面'
[root@R199 ~]# ls -lh /images/
total 8.7G
-rw-r--r-- 1 root root 8.7G May 28 19:38 Rocky-10.1-x86_64-dvd1.iso
4)创建 FTP 共享目录并挂载 ISO
[root@R199 ~]# mkdir -p /var/ftp/rocky10
[root@R199 ~]# ls /var/ftp/rocky10/ | wc -l
0
[root@R199 ~]# mount /images/Rocky-10.1-x86_64-dvd1.iso /var/ftp/rocky10/
✅️ /var/ftp 就是 vsftpd 服务的默认根目录'(FTP 站点的根)'
mount: /var/ftp/rocky10: WARNING: source write-protected, mounted read-only.
'ISO 是只读的,正常现象'
[root@R199 ~]# ls /var/ftp/rocky10/
AppStream boot BaseOS images media.repo
5)启动 vsftpd
# 开机自启
[root@R199 ~]# systemctl enable --now vsftpd
# 如果防火墙是开启状态 --> 放行防火墙
[root@R199 ~]# firewall-cmd --add-service=ftp
success
[root@R199 ~]# firewall-cmd --add-service=ftp --permanent
success
'👆 默认区域放行 & 永久生效'
6)在 libvirt 区域也放行 FTP(虚拟机通过 virbr0 访问)
[root@R199 ~]# firewall-cmd --add-service=ftp --zone=libvirt
success
[root@R199 ~]# firewall-cmd --add-service=ftp --zone=libvirt --permanent
success
7)验证 FTP 源可访问(在宿主机上自测)
[root@R199 ~]# ip add show virbr0 | grep net
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
[root@R199 ~]# curl ftp://192.168.122.1/rocky10/
curl: (67) Access denied: 530
⚠️ 这个 530 Access denied vsftpd 默认禁止匿名登录导致的
[root@R199 ~]# grep '^anonymous_enable' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO ❌️ 默认禁止匿名登录
[root@R199 ~]# sed -n '/^anonymous_enable/s#NO#YES#gp' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES ✅️ 把选项打开
[root@R199 ~]# sed -i '/^anonymous_enable/s#NO#YES#g' /etc/vsftpd/vsftpd.conf
'这个 -i 才是真正修改选项'
[root@R199 ~]# systemctl restart vsftpd
[root@R199 ~]# curl ftp://192.168.122.1/rocky10/
'FTP 站点的根目录 --> /var/ftp'
drwxr-xr-x 1 0 0 2048 Nov 14 2025 AppStream
drwxr-xr-x 1 0 0 2048 Nov 14 2025 BaseOS
................
'能看到目录文件列表就说明 OK'

💡 为什么选 192.168.122.1

这是 virbr0 网桥的 IP,虚拟机在 NAT 网络里只能通过这个地址访问宿主机

② 使用 virt-install 安装最小化系统#

Terminal window
[root@R199 ~]# virt-install \
--name rocky10-minimal \
--memory 2048 \
--vcpus 2 \
--disk size=20 \
--osinfo rocky10 \
--location ftp://192.168.122.1/rocky10/ \
--graphics none \
--console pty,target_type=serial \
--extra-args "console=ttyS0,115200n8"
==========================================
参数解读:
--name # 虚拟机名称
--memory # 内存大小 (MB)
--vcpus # CPU 核数
--disk size # 磁盘大小 (GB)
--osinfo # 操作系统类型
--location # FTP 安装源地址
==========================================
--graphics none # 不使用图形界面,纯文本安装
--console # 串口控制台(这样就能在当前终端操作安装过程了)
--extra-args # 传给 Linux 内核的启动参数
Tip

💡 关于 kickstart:还有一种全自动装法

  • 提前写一份 ks.cfg 配置文件,把语言/时区/分区/软件包全部预设好

  • 然后通过 --extra-args "inst.ks=ftp://..." 传给 virt-install,安装过程就完全不用人盯着了

但需要额外学 kickstart 语法、准备 ks.cfg 文件

装一台的话反而更麻烦,==批量部署几十台的时候才是它的主场==

✅️ 生产环境:kickstart 是标配,写一次配置文件,后面装 100 台全自动跑完

删除虚拟机流程#

Terminal window
1)查看虚拟机状态
root@R199:~# virsh list --all
Id Name State
---------------------------------
1 rocky10-minimal running ✅️
2)停止虚拟机
[root@R199 ~]# virsh shutdown rocky10-minimal
[root@R199 ~]# virsh list --all
Id Name State
----------------------------------
- rocky10-minimal shut off
3)等待停止后,删除虚拟机定义'(但保留磁盘文件)'
[root@R199 ~]# virsh undefine rocky10-minimal
Domain 'rocky10-minimal' has been undefined
# 如果也需要删除磁盘文件,则需要手动删除
4)找到磁盘文件位置
[root@R199 ~]# virsh domblklist rocky10-minimal
Target Source
-------------------------------------------------------
vda /var/lib/libvirt/images/rocky10-minimal.qcow2
# 然后手动删除相关文件
[root@R199 ~]# rm -f /var/lib/libvirt/images/rocky10-minimal.qcow2
[root@R199 ~]# ls /var/lib/libvirt/images/ | wc -l
0 ✅️ 完全删除干净了

⚠️ 注意--disk size=20 创建的磁盘文件在 /var/lib/libvirt/images/rocky10-minimal.qcow2

  • 不指定路径默认就在这里

虚拟机状态管理命令#

Terminal window
1)查看虚拟机状态
virsh list # 只显示运行中的虚拟机
virsh list --all # 显示所有虚拟机(包括关闭的)
2)控制虚拟机状态
virsh start <vm-name> # 启动虚拟机
virsh shutdown <vm-name> # 正常关机
virsh destroy <vm-name> # 强制关机(相当于断电)
virsh reboot <vm-name> # 重启虚拟机
3)如果虚拟机处于关闭状态,你可以使用以下命令来启动它
# 启动已关闭的虚拟机
virsh start rocky10-minimal
# 然后连接到控制台
virsh console rocky10-minimal

完整安装流程#

Terminal window
Text mode provides a limited set of installation options.
# 文本安装会有一些限制,是否继续选择文本安装
'Anaconda 安装程序检测到了图形模式和文本模式的选择'
1) Use graphical mode via Remote Desktop Protocol
-----------# 这个是远程桌面的方式
# 需要创建一个专门用于 RDP 远程桌面的用户名和密码
📌 不如图形化安装向导
2) Use text mode
Please make a selection from the above
✅️ 按键盘输入 2 然后回车,继续使用文本模式安装
==============================================================
Installation
1) [x] Language settings 2) [x] Time settings
(Simplified Chinese (China)) (Asia/Shanghai timezone)
3) [!] Installation source 4) [!] Software selection
(Setting up installation (Processing...)
source...)
5) [!] Installation Destination 6) [x] Kdump
(Processing...) (Kdump is enabled)
7) [x] Network configuration 8) [!] Root password
(Connected: enp1s0) (Root account is disabled)
9) [!] User creation
(No user will be created)
==============================================================
Software selection
Base environment
1) [ ] Server with GUI 4) [ ] Workstation
2) [ ] Server 5) [ ] Custom Operating System
3) [x] Minimal Install 6) [ ] Virtualization Host
✅️ 选择 "Minimal Install"(最小化安装)
==============================================================
Root password
Please select new root password. You will have to type it twice.
✅️ 设置 root 密码
Password:
Password (confirm):
==============================================================
Please make a selection from the above ['b' to begin installation
✅️ '按 b 键开始安装'
==============================================================
Installation complete. Press ENTER to quit:

重启进入系统#

Terminal window
Rocky Linux 10.1 (Red Quartz)
Kernel 6.12.0-124.8.1.el10_1.x86_64 on x86_64
jiuzhao login: root
密码:
[root@jiuzhao ~]# hostname -I
192.168.122.191
[root@jiuzhao ~]# ping -W2 -c2 www.baidu.com
PING www.a.shifen.com (39.156.70.46) 56(84) 字节的数据。
64 字节,来自 39.156.70.46: icmp_seq=1 ttl=127 时间=18.8 毫秒
64 字节,来自 39.156.70.46: icmp_seq=2 ttl=127 时间=11.7 毫秒
--- www.a.shifen.com ping 统计 ---
已发送 2 个包, 已接收 2 个包, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 11.681/15.247/18.814/3.566 ms

③ 使用 Cockpit 验证 & 清理#

Terminal window
1)确认 cockpit 已安装并运行
[root@R199 ~]# dnf -y install cockpit cockpit-machines
[root@R199 ~]# systemctl enable --now cockpit.socket
2)检查监听端口
[root@R199 ~]# ss -anptul | grep 9090
tcp LISTEN 0 4096 *:9090 *:* users:(("cockpit-tls",...))
✅️ '9090 端口在监听'
3)允许root登录
[root@R199 ~]# cat /etc/cockpit/disallowed-users
# List of users which are not allowed to login to Cockpit
root
[root@R199 ~]# sed -i 's@root@#root@g' /etc/cockpit/disallowed-users
[root@R199 ~]# systemctl restart cockpit
4)浏览器访问
https://10.0.0.199:9090/
# 用 root 账号登录

image-20260528213624889
image-20260528213624889

在 Cockpit 中验证以下内容

验证项操作路径
✅️ 虚拟机运行状态左侧 “虚拟机” → 查看 rocky10-minimal 是否为 “Running”
✅️ CPU/内存使用点击虚拟机 → “概览” 查看资源占用
✅️ 网络连通性”虚拟机” → 点击进入 → “控制台” → 登录后 ping -c2 www.baidu.com
✅️ 磁盘 I/O”概览” → 查看磁盘读写曲线

image-20260528213734377
image-20260528213734377

image-20260528214420788
image-20260528214420788

image-20260528214052029
image-20260528214052029

Terminal window
5)验证无误后,关机
[root@R199 ~]# virsh shutdown rocky10-minimal
'或者直接在 Cockpit 网页里点关机按钮'
6)确认已关机
[root@R199 ~]# virsh list --all | grep rocky10-minimal
- rocky10-minimal shut off
'shut off 状态才对'
7)删除虚拟机及磁盘
[root@R199 ~]# virsh undefine rocky10-minimal --remove-all-storage
Domain 'rocky10-minimal' has been undefined
Volume 'vda'(/var/lib/libvirt/images/rocky10-minimal.qcow2) removed.
--remove-all-storage # 删除虚拟机的同时删除磁盘文件
# 不加这个参数只删定义,磁盘还留在 /var/lib/libvirt/images/ 里
7)二次确认磁盘已删除
[root@R199 ~]# ls /var/lib/libvirt/images/rocky10-minimal.qcow2
ls: cannot access '...': No such file or directory
'文件没了,干净利落'

📌 virsh undefine 参数对比

命令效果
virsh undefine vm名只删定义,不删磁盘
virsh undefine vm名 --remove-all-storage删定义 + 删所有磁盘 ✅️
virsh destroy vm名 && virsh undefine ...先强制关机再删(关机失败时用)

图形化安装向导#

上面演示的是纯文本安装, 其实挺难用的!!!

我么可以让 virt-install 启动图形安装界面并使用 virt-viewer 连接

  • 移除 --graphics none--console pty,target_type=serial(这两个是强制纯文本模式的)

  • 移除 --extra-args "console=ttyS0,115200n8"(这会把内核输出重定向到串口,导致图形界面无法显示)

Terminal window
1)软件包准备
[root@Vir-01 ~]# rpm -qa virt-viewer
virt-viewer-11.0-10.el10.x86_64
✅️ 仅安装 --> 这个轻量级的图形控制台查看器
# 配合 virt-install 管理工具使用即可
2)命令安装
[root@Vir-01 ~]# virt-install \
--name rocky10-test \
--memory 2048 \
--vcpus 2 \
--disk size=20 \
--osinfo rocky10 \
--location ftp://192.168.122.1/rocky10/ \
--graphics vnc,listen=0.0.0.0 \
--wait -1
==============================
添加 `--graphics vnc` 来启用图形控制台
添加 `--wait -1` `virt-install` 保持前台运行并自动弹出 `virt-viewer`

image-20260530124436036
image-20260530124436036

image-20260530124631327
image-20260530124631327

image-20260530130503408
image-20260530130503408

⚠️ 常见坑点#

问题原因解决
curl ftp://192.168.122.1/ 不通firewall 没在 libvirt 区域放行 ftp 服务firewall-cmd --add-service=ftp --zone=libvirt
virt-install 报 “Could not find an installable distribution”FTP 路径指错了,没找到 repodata确认 URL 指向 repodata 所在的目录
SELinux 拦截 FTP 访问SELinux 默认禁止 FTP 读取用户目录外的内容setenforce 0 或配置 ftpd_full_access 布尔值
Cockpit 登录后看不到虚拟机没装 cockpit-machinesdnf -y install cockpit-machines && systemctl restart cockpit
ISO 挂载后重启丢失mount 是临时的,重启就没了写入 /etc/fstab 或每次手动 mount

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

虚拟化环境配置与KVM虚拟机管理
https://www.kpyun.fun/posts/services/virt/virt01/
作者
久棹
发布于
2026-04-12
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录