KVM虚拟化与Docker基础实践-第一章
前置
本次实验延续延续云计算基础与VMware虚拟化实践,采用CentOS Stream 10系统。本次实验只是用主虚拟机,克隆的那两台暂时不用。
一、KVM虚拟化基础与环境部署
KVM
| 特性 | 具体说明 |
|---|---|
| 高性能 | 性能接近原生物理机,在典型测试中CPU性能损耗仅约3.2%。 |
| 全虚拟化 | 支持多种操作系统无需修改即可运行,兼容性好。 |
| 开源免费 | KVM是Linux内核的一部分,无需额外购买许可,能大幅降低总体拥有成本。 |
| 深度集成 | 与Linux生态无缝融合,可复用内核的调度器、内存管理等机制。 |
| 安全隔离 | 每个虚拟机都是一个Linux进程,依赖SELinux等安全模块实现隔离与保护。 |
| 功能丰富 | 支持实时迁移、快照、内存超分、热插拔等企业级功能。 |
KVM凭借其原生融入Linux的架构,直接利用硬件辅助虚拟化技术(如Intel VT-x/AMD-V),在性能、成本、灵活性上构筑了坚实基础。
| 对比维度 | KVM | VMware ESXi/vSphere |
|---|---|---|
| 核心性质 | 开源虚拟化技术,集成于Linux内核。 | 专有闭源的商业软件。 |
| 许可成本 | 免费。获得商业支持可能需订阅。 | 付费。订阅制,大规模部署成本高。 |
| 性能表现 | 性能极高,尤其在Linux系统上。 | 性能稳定,拥有丰富的性能调优选项。 |
| 管理工具 | virsh, virt-manager, Cockpit等基础工具,部分功能需自行扩展。 |
提供强大的集中管理平台(vCenter),功能全面,界面成熟。 |
| 高可用性 | 可整合Pacemaker等开源方案实现,配置相对复杂。 | 自带成熟套件(vMotion, HA, DRS),开箱即用。 |
| 安全功能 | 依赖内核安全机制(如SELinux),适合有安全加固能力的团队。 | 提供集成安全方案(如vShield),功能丰富,满足严格合规要求。 |
| 适用场景 | 成本敏感、技术实力强、以Linux为主的环境。 | 对稳定性和商业支持要求高、预算充足的大型企业。 |
| 技术趋势 | 主动拥抱云原生(如集成Kata Containers、Firecracker)。 | 随着被博通收购后策略调整,部分企业开始评估替代方案。 |
简而言之,KVM更适合追求高性价比和深度定制的技术驱动型团队;而VMware则以其稳定可靠、功能全面的企业级特性,更适合大型组织。
| 组件 | 位置 | 核心职责 |
|---|---|---|
| KVM内核模块 | 内核空间 | 负责CPU和内存的虚拟化。核心模块是 kvm.ko,提供通用的虚拟化功能。平台相关模块(如 kvm-intel.ko / kvm-amd.ko)则负责启用硬件虚拟化特性。 |
| QEMU | 用户空间 | 负责模拟各类I/O设备(如硬盘、网卡、显卡、USB等)。每个虚拟机在宿主机上都表现为一个独立的QEMU进程。 |
| Libvirt | 用户空间 | 提供统一的管理API和工具(如virsh命令行、virt-manager图形界面),实现对KVM虚拟机的统一管理。 |
核心工作原理
-
进程模型:KVM将每个虚拟机视为一个标准的Linux进程(QEMU进程),虚拟机的每个vCPU(虚拟CPU)则是该进程下的一个线程。这意味着Linux内核调度器可以像调度普通进程一样调度虚拟机。
-
CPU与内存虚拟化:当虚拟机执行非I/O的CPU指令时,KVM内核模块会利用CPU的硬件虚拟化扩展(Intel VT-x/AMD-V),让这些指令直接在物理CPU上运行,无需软件模拟,从而保证了性能接近物理机。对于内存访问,KVM使用硬件辅助的EPT/NPT技术,将虚拟机的物理地址高效地映射到宿主机的物理地址上。
-
I/O设备模拟:当虚拟机需要访问硬件(如读写网卡),请求会触发“虚拟机退出”(VM-Exit),控制权从KVM内核模块交还给用户空间的QEMU进程。QEMU完成设备模拟后,再将结果返回给虚拟机。为减少此处的性能开销,KVM支持VirtIO半虚拟化驱动,让虚拟机直接与后端交互,能大幅提升I/O性能。此外,KVM也支持VT-d等技术将物理设备直接分配给虚拟机使用,达到近乎原生的性能。
KVM支持检查
为避免多次输入密码,开始时su - root,使用root用户进行操作。
在安装前先执行dnf update -y进行一些更新,该过程会持续比较长的时间。


然后关闭虚拟机,打开编辑界面,修改处理器,勾选虚拟化Inter VT-x。

然后输入lamod | grep kvm查看能不能使用KVM

KVM组件安装
因为我的系统是10已经不支持virt-manager,后续的图形化界面使用Cockpit图形化工具,执行sudo dnf -y install qemu-kvm libvirt virt-install virt-viewer cockpit cockpit-machines安装一些插件。


安装完成后执行以下操作看是否成功。
system enable --now libvirtd
system enable --now cockpit.socket
system status libvirtd

确认没有问题后,我们执行一些virsh命令熟悉一下。
virsh list --all
virsh net-list --all
virsh pool-list --all

这些命令能查看安装好的虚拟机,使用的网络,存储池等,目前我们还没有进行任何配置,所以显示空白。
二、KVM网络配置与虚拟机创建
KVM桥连接网络配置
我们回到windows系统,以管理员身份打开记事本,然后打开文件CC.vmx(这里是我的文件名,你用什么命名就是什么,主要是找vmx后缀,找的时候注意下方选择所有文件)

打开后我们在文件的末尾添加以下内容:
ethernet0.promiscuous = "TRUE"
vnet.promiscuous = "TRUE"
vmxnet.promiscuous = "TRUE"
然后保存退出回到虚拟机环境。
继续执行以下命令进行桥连接网络的设置:
创建桥接接口 br0 (此时不配置IP)
nmcli connection add type bridge ifname br0 con-name br0
添加物理网卡 ens33 作为从设备
nmcli connection add type bridge-slave ifname ens33 master br0 con-name bridge-slave-ens33
为 br0 配置静态IP信息 (请根据你的网络环境修改,网关根据VMnet8修改)
nmcli connection modify br0 ipv4.addresses 192.168.11.104/24
nmcli connection modify br0 ipv4.gateway 192.168.11.2
nmcli connection modify br0 ipv4.dns "8.8.8.8"
nmcli connection modify br0 ipv4.method manual
激活 bridge-slave,再激活 br0
nmcli connection up bridge-slave-ens33
nmcli connection down br0
nmcli connection up br0
ip link set ens33 master br0
ip link set ens33 up
ip link set br0 up
然后创建一个文件br0.xml
cat > /tmp/br0.xml << 'EOF'
<network>
<name>br0</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
EOF
都完成之后,reboot重启虚拟机。
virsh net-define /tmp/br0.xml
virsh net-start br0
virsh net-autostart br0
virsh net-list --all
virsh net-dumpxml br0




能ping通网络后,进入firefox输入https://192.168.11.104:9090(这是我的地址,根据自己真实情况来),输入用户名和密码,登录进去

然后点击右上角的感叹号,输入密码接可以使用root用户了。

在左边就可以查看各种操作了,然后我们点到网络,可以看到我们配置的br0在成功运行。

KVM创建虚拟机
因为磁盘大小原因,这里我们安装轻量级的系统。点击虚拟机,进行创建,采用url进行安https://mirrors.aliyun.com/debian/dists/stable/main/installer-amd64/
随便输入一个名称
下面这个直接回车
下面这个也是直接回车
设置root密码123,还要再确认一次密码,这里没截图,到时候看提示再输一次密码就行。
随机输入一个名称创建用户hhh
设置密码123,一样的要再输入确认一次。
直接回车
下面这个执行了后会等待一会才能进行下一步。
直接回车
安装成功。
整个过程会持续很久的时间,耐心。
命令行创建KVM-Test2
在终端执行wget https://mirrors.tuna.tsinghua.edu.cn/alpine/v3.21/releases/x86_64/alpine-virt-3.21.3-x86_64.iso下载镜像iso。

输入root回车
接着setup-alpine进行一些设置
rrr为机名,接下来几个和图中一样的话就直接回车,这样就是NAT连接。

然后输入密码123(自己设置就好),时区输入Asia/Shanghai

接下来回车后输入f继续回车,会自动去给你找合适的镜像。

照着图中的输入和回车就行,然后sda那个是错的,应该是下面的vda,做的时候就不要输sda了,然后我这台KVM-Test2只设置了root用户没有创建新用户,所以直接就是root。

最终可以在界面看到这两台机器。

然后我们互相ping查看是否连通
都执行ping -c 3 8.8.8.8发现都通,证明可以访问外网。
然后ip a show查看地址,我这里分别是192.168.11.145和192.168.122.146,根据截图我们可以看到,NAT可以ping通桥连接,但是反过来却不行,这是对的,不要觉得错了。这正好体现了 NAT 模式的隔离性:内部的虚拟机可以访问外部,但外部无法直接访问内部。


更多推荐
所有评论(0)