虚拟化环境配置与KVM虚拟机管理
虚拟化环境配置 && KVM 虚拟机管理
[TOC]
🧱 知识点总结
虚拟化核心概念
==虚拟化== 就是在一台物理机上,用软件模拟出多台”假”的机器,每台假机器都能跑独立的操作系统
- Hypervisor (VMM):虚拟化的核心管理层,负责把物理 CPU/内存/磁盘”切”给虚拟机用
- KVM (Kernel-based Virtual Machine):Linux 内核自带的虚拟化模块,把 Linux 变成一个 Hypervisor
- QEMU:模拟硬件设备(网卡、磁盘、显卡等),和 KVM 搭配使用
- libvirt:一套管理虚拟化的 API/守护进程,提供了统一的命令行和编程接口
📌 一句话:KVM 负责”算”,QEMU 负责”装”,libvirt 负责”管”
环境准备检查清单
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| CPU 是否支持虚拟化 | `cat /proc/cpuinfo | grep -E ‘vmx |
| 虚拟化包是否安装 | rpm -q qemu-kvm libvirt | 显示版本号 |
| 服务是否启动 | systemctl status libvirtd | active (running) |
💡 小技巧:虚拟化引擎需要在 VMware/虚拟机设置中勾选”==虚拟化 Intel VT-x/EPT 或 AMD-V/RVI==“,否则 KVM 无法使用硬件加速

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 libvirtqemu-kvm-10.0.0-14.el10_1.5.x86_64libvirt-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-manager | virt-install | cockpit |
|---|---|---|---|
| 类型 | GUI 桌面应用 | 命令行 | Web 控制台 |
| 适合场景 | 本地图形化操作 | 脚本/自动化 | 远程 Web 管理 |
| 学习曲线 | ⭐ 简单 | ⭐⭐⭐ 中等 | ⭐⭐ 较低 |
| 批量部署 | ❌ 不方便 | ✅ 适合 | ❌ 不方便 |
4)启动服务(开启自启)[root@R199 ~]# systemctl is-active libvirtdinactive ⚠️ '多了个d'[root@R199 ~]# systemctl enable --now libvirtd[root@R199 ~]# systemctl is-active libvirtdactive虚拟网络架构
KVM 默认创建
virbr0网桥,相当于一个 ==NAT 虚拟交换机==,虚拟机通过它上网
[root@R199 ~]# ip add show virbr03: 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 区域规则
✅ 编辑默认网络配置
'我这里是Ubuntu系统'# 编辑之前可以先查看一下都有那些网络🛜jiuzhao@Ubuntu 桌面$ virsh net-list --all Name State Autostart Persistent-------------------------------------------- default active yes yes# 只有这个默认的网络
1)编辑默认网络配置jiuzhao@Ubuntu 桌面$ sudo virsh net-edit defaultSelect 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 defaultNetwork default destroyedjiuzhao@Ubuntu 桌面$ sudo virsh net-start defaultNetwork default started
3)验证生效jiuzhao@Ubuntu 桌面$ ip add sho virbr08: 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📝 完成指南
练习要求:
- 使用
vsftpd服务共享网络源- 使用
virt-install基于 vsftpd 共享的网络源安装最小化的 Rocky 10- 使用 Cockpit 在浏览器中验证系统可用性,确认无误后关机删除(连硬盘一起删)
① 搭建 vsftpd 网络安装源
1)安装 vsftpd[root@R199 ~]# dnf -y install vsftpd✅️ vsftpd 是 FTP 服务,用来共享 Rocky10 的 ISO 内容给虚拟机
2)关闭 SELinux 和 firewalld[root@R199 ~]# getenforceDisabled[root@R199 ~]# systemctl is-active firewalld.serviceinactive
3)上传 Rocky 10镜像[root@R199 ~]# mkdir /images[root@R199 ~]# ls /images/ | wc -l0'把镜像放在这里面'[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 -l0[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=ftpsuccess[root@R199 ~]# firewall-cmd --add-service=ftp --permanentsuccess'👆 默认区域放行 & 永久生效'
6)在 libvirt 区域也放行 FTP(虚拟机通过 virbr0 访问)[root@R199 ~]# firewall-cmd --add-service=ftp --zone=libvirtsuccess[root@R199 ~]# firewall-cmd --add-service=ftp --zone=libvirt --permanentsuccess
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.confanonymous_enable=NO ❌️ 默认禁止匿名登录[root@R199 ~]# sed -n '/^anonymous_enable/s#NO#YES#gp' /etc/vsftpd/vsftpd.confanonymous_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 AppStreamdrwxr-xr-x 1 0 0 2048 Nov 14 2025 BaseOS................'能看到目录文件列表就说明 OK'💡 为什么选 192.168.122.1?
这是 virbr0 网桥的 IP,虚拟机在 NAT 网络里只能通过这个地址访问宿主机
② 使用 virt-install 安装最小化系统
[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 内核的启动参数💡 关于 kickstart:还有一种全自动装法
-
提前写一份
ks.cfg配置文件,把语言/时区/分区/软件包全部预设好 -
然后通过
--extra-args "inst.ks=ftp://..."传给 virt-install,安装过程就完全不用人盯着了
但需要额外学 kickstart 语法、准备 ks.cfg 文件
装一台的话反而更麻烦,==批量部署几十台的时候才是它的主场==
✅️ 生产环境:kickstart 是标配,写一次配置文件,后面装 100 台全自动跑完
删除虚拟机流程
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-minimalDomain '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 -l0 ✅️ 完全删除干净了⚠️ 注意:--disk size=20 创建的磁盘文件在 /var/lib/libvirt/images/rocky10-minimal.qcow2
- 不指定路径默认就在这里
虚拟机状态管理命令
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完整安装流程
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 然后回车,继续使用文本模式安装
==============================================================Installation1) [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 selectionBase environment
1) [ ] Server with GUI 4) [ ] Workstation2) [ ] Server 5) [ ] Custom Operating System3) [x] Minimal Install 6) [ ] Virtualization Host✅️ 选择 "Minimal Install"(最小化安装)==============================================================Root passwordPlease 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:重启进入系统
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 -I192.168.122.191[root@jiuzhao ~]# ping -W2 -c2 www.baidu.comPING 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 1002msrtt min/avg/max/mdev = 11.681/15.247/18.814/3.566 ms③ 使用 Cockpit 验证 & 清理
1)确认 cockpit 已安装并运行[root@R199 ~]# dnf -y install cockpit cockpit-machines[root@R199 ~]# systemctl enable --now cockpit.socket
2)检查监听端口[root@R199 ~]# ss -anptul | grep 9090tcp 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 Cockpitroot[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 账号登录
在 Cockpit 中验证以下内容:
| 验证项 | 操作路径 |
|---|---|
| ✅️ 虚拟机运行状态 | 左侧 “虚拟机” → 查看 rocky10-minimal 是否为 “Running” |
| ✅️ CPU/内存使用 | 点击虚拟机 → “概览” 查看资源占用 |
| ✅️ 网络连通性 | ”虚拟机” → 点击进入 → “控制台” → 登录后 ping -c2 www.baidu.com |
| ✅️ 磁盘 I/O | ”概览” → 查看磁盘读写曲线 |



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-storageDomain 'rocky10-minimal' has been undefinedVolume '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.qcow2ls: 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"(这会把内核输出重定向到串口,导致图形界面无法显示)
1)软件包准备[root@Vir-01 ~]# rpm -qa virt-viewervirt-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`


⚠️ 常见坑点
| 问题 | 原因 | 解决 |
|---|---|---|
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-machines 包 | dnf -y install cockpit-machines && systemctl restart cockpit |
| ISO 挂载后重启丢失 | mount 是临时的,重启就没了 | 写入 /etc/fstab 或每次手动 mount |
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!




