KVM虚拟化与企业应用实践——给远端主机创建虚拟机

KVM虚拟化与企业应用实践------通过网络介质配合ks自动应答文件实现自动安装KVM虚拟机文章浏览阅读251次。本文详细介绍了如何通过KVM虚拟化技术实现自动化安装OpenEuler系统的实践教程。主要内容包括:1)使用Nginx搭建简易PXE网络引导环境,配置自动安装源;2)编写Kickstart自动应答文件,支持BIOS和UEFI两种模式;3)通过virt-install命令创建KVM虚拟机并完成系统自动安装;4)解决安装过程中可能遇到的熵源不足问题;5)对比分析不同磁盘总线类型的性能特点。教程提供了完整的命令和配置文件示例,特别针对国产OpenEuler系统进行了适配优化,适合企业级虚拟化环境部署参考。https://blog.csdn.net/xiaochenXIHUA/article/details/161985179

一、远端主机需具备KVM与QEMU环境

KVM虚拟化与企业应用实践------KVM与Qemu虚拟化详解、VNC安装部署https://blog.csdn.net/xiaochenXIHUA/article/details/161854600

KVM虚拟化与企业应用实践------创建KVM虚拟机实践教程https://blog.csdn.net/xiaochenXIHUA/article/details/161932482

若要在远端主机上创建虚拟机,则远端主机需具备KVM与QEMU环境(若不具备则需要在远端主机上开启【CPU的虚拟化】配置【VNC Server】【KVM与QEMU环境】【配置桥接器】)详细操作如下:

若是使用VMware Workstation虚拟机开启CPU虚拟化方法是【选中创建好的虚拟机-->编辑次虚拟机设置-->硬件-->处理器-->虚拟化引擎(勾选虚拟化Intel VT-x/EPT 或AMD-V/RVI(V))】)详细操作如下图所示:

bash 复制代码
#在红帽系(如:almalinux9.3)安装VNC Server
#1-安装vnc server服务
yum -y install tigervnc-server

#2-临时启动VNC(第一次启动vnc时,会要求输入密码【普通密码:可控制桌面、操作鼠标键盘】【只读密码(view-only):只能看画面,无法操作】)
#注意:vncserver :6  #这里的6代表5906端口,如果是1代表5901端口,以此类推。
vncserver :6
 
#3-查看当前运行的 VNC 会话
vncserver -list
 
#4-关闭vnc会话
vncserver -kill :6
bash 复制代码
#本文以红帽系Almalinux9.3为例进行在远端主机上安装KVM内核与QEMU模块与管理工具
 
#1-安装KVM内核与QEMU模块和工具
dnf install  -y epel-release
dnf install -y qemu-kvm.x86_64 qemu-kvm-tools.x86_64
 
#2-安装virt管理工具(为了更好、更快捷的管理KVM虚拟机)
dnf install -y libvirt  bridge-utils qemu-img  novnc virt-*
 
#3-KVM内核模块与virt管理工具安装完成后,重启系统,然后系统启动会自动加载kvm到内核当中
reboot now
 
 
#4-查看kvm模块是否加载到内核(若结果显示:kvm_intel、kvm、irqbypass则表示kvm加载到内核了)
lsmod | grep kvm
 
#4.1-【可选】手动加载kvm内核(若系统重启后还是没有自动加载kvm到内核)
modprobe kvm
modprobe kvm-intel
 
 
#5-对当前设备安装kvm的环境情况进行验证
#若所有 virt-host-validate 检查返回 通过(PASS) 值,则说明系统已准备好创建虚拟机;
#若有任何检查返回 FAIL 值,请按照显示的说明来修复问题都解决后在进行后续操作。
virt-host-validate
 
#6-启动libvirtd服务(libvirtd是KVM管理工具对应的服务)
systemctl start libvirtd
systemctl enable --now libvirtd.socket
systemctl status libvirtd
systemctl enable libvirtd
bash 复制代码
#远端主机上创建桥接器
#0-获取到远端主机当前的网卡IP(如:192.168.1.29)
ip a

#1-创建一个名为br0的网桥设备,且开机自启
nmcli c add type bridge autoconnect yes con-name br0 ifname br0
 
#2-为网桥配置静态 IPv4 地址(关闭 DHCP)【添加完成后可到 /etc/NetworkManager/system-connections/ 目录下查看br0.nmconnection文件】
nmcli c modify br0 ipv4.addresses 192.168.1.29/24 ipv4.method manual
 
#3-配置网桥的网关
nmcli c modify br0 ipv4.gateway 192.168.1.1
 
#4-配置 DNS 服务器(主 + 备)
nmcli c modify br0 ipv4.dns 223.5.5.5 +ipv4.dns 8.8.8.8
 
#5-将物理网卡 ens33 加入网桥(设为桥接从端口)
nmcli c add type bridge-slave autoconnect yes con-name ens33 ifname ens33 master br0
 
#6-备份原有网卡的配置,并激活网桥连接,并重启系统
cd /etc/NetworkManager/system-connections/
mv ens33.nmconnection ens33.nmconnection.bak
nmcli c up br0
reboot now
 
#7-检查网桥成员(确认网卡 ens33 已加入 br0 网桥)【显示的所有内容都有值】
brctl show
#查看网卡 IP(IP 只在 br0 上,ens33 无 IP)
ip a
 
#8-测试网络连通性
# 测试网关
ping 192.168.1.1
# 测试外网/DNS
ping 223.5.5.5
ping www.baidu.com

二、给远端主机使用iso系统镜像创建虚拟机

2.1、远端主机上的操作

bash 复制代码
#在远端主机(如:192.168.1.29)上的操作内容
#1-创建普通用户并设置密码用于操作管理虚拟机
#1.1-创建普通用户并设置密码
useradd -m libvirt-mgr
passwd libvirt-mgr

#1.2-将创建的用户加入到管理虚拟机的组中
# 加入 libvirt 组:管理虚拟机核心权限
usermod -aG libvirt libvirt-mgr
# 加入 kvm 组:访问虚拟化设备、QEMU 权限
usermod -aG kvm libvirt-mgr
# 加入 qemu 组(部分系统必需,读写虚拟机磁盘/镜像)
usermod -aG qemu libvirt-mgr



#2-环境检查
#2.1-UEFI 启动依赖包是否安装
yum install -y edk2-ovmf

#2.2-目录权限配置(虚拟机镜像目录 /data/vmdisk、ISO 目录 /data/AllOS 需保证 libvirt-mgr/qemu 组可读可写)
chmod -R 775 /data/vmdisk /data/AllOS
chown -R qemu:qemu /data/vmdisk

#2.3-防火墙放行端口(如:22、5905)
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=5905/tcp
firewall-cmd --reload
firewall-cmd --list-port



#3-复制一份单虚拟机私有的 2MB UEFI 变量存储盘
cp /usr/share/edk2/ovmf/OVMF_VARS.fd /data/vmdisk/openeuler2403sp2-05_VARS.fd

2.2、操作机上的操作

bash 复制代码
#在操作机【执行 virt-install 的本地机器】执行的命令
#1-配置SSH免密登录远端主机(如:192.168.1.29)【作用是:之后本地执行 ssh libvirt-mgr@192.168.1.29 无需输密码】
#1.1-生成 SSH 密钥(若已有则跳过)
ls/root/.ssh/id_ed25519
#生成SSH密钥【一路回车,不设密钥密码】
ssh-keygen -t ed25519

#1.2-推送公钥到远端主机(如:192.168.1.29)的 libvirt-mgr 用户下
ssh-copy-id libvirt-mgr@192.168.1.29



#2-在操作机上给远端主机(如:192.168.1.29)上创建虚拟机【有两种:UEFI模式、BIOS模式】
#2.0-安装virt-install服务
yum install -y epel-release
dnf install -y virt-install libvirt-client

#2.1-给远端主机创建【UEFI】模式的虚拟机
virt-install \
--connect qemu+ssh://libvirt-mgr@192.168.1.29/system \
--os-variant rhel9.3 \
--name openeuler2403sp2-05 \
--description="开发使用的OpenEuler24.03-LTS-SP2服务器-远端创建UEFI" \
--vcpus 2 \
--cpu host-model \
--memory 4096 \
--disk path=/data/vmdisk/openeuler2403sp2-05.qcow2,bus=virtio,cache=writethrough,size=40,format=qcow2 \
--cdrom /data/AllOS/iso/openEuler-24.03-LTS-SP2-x86_64-dvd.iso \
--network bridge=br0,model=virtio \
--noautoconsole \
--graphics vnc,port=5905,listen=0.0.0.0,password=qwer1234 \
--boot uefi,firmware=/usr/share/edk2/ovmf/OVMF_CODE.fd,nvram=/data/vmdisk/openeuler2403sp2-05_VARS.fd,menu=off \
--noreboot \
--autostart

#2.2-给远端主机创建【BIOS】模式的虚拟机
virt-install \
--connect qemu+ssh://libvirt-mgr@192.168.1.29/system \
--os-variant rhel9.3 \
--name openeuler2403sp2-05 \
--description="开发使用的OpenEuler24.03-LTS-SP2服务器-远端创建BIOS" \
--vcpus 2 \
--cpu host-model \
--memory 4096 \
--disk path=/data/vmdisk/openeuler2403sp2-05.qcow2,bus=virtio,cache=writethrough,size=40,format=qcow2 \
--cdrom /data/AllOS/iso/openEuler-24.03-LTS-SP2-x86_64-dvd.iso \
--network bridge=br0,model=virtio \
--noautoconsole \
--graphics vnc,port=5905,listen=0.0.0.0,password=qwer1234 \
--boot hd,menu=off \
--noreboot \
--autostart



#3-若是安装时有问题,则可以关闭后清除干净修改后重试
ssh libvirt-mgr@192.168.1.29

virsh destroy openeuler2403sp2-05 2>/dev/null
virsh undefine openeuler2403sp2-05 --nvram --remove-all-storage 2>/dev/null
rm -f /data/vmdisk/openeuler2403sp2-05.qcow2 /data/vmdisk/openeuler2403sp2-05_VARS.fd
virsh list --all | grep openeuler2403sp2-05
bash 复制代码
# 查看虚拟机状态
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system list --all

# 启动虚拟机
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system start openeuler2403sp2-05

# 停止虚拟机
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system shutdown openeuler2403sp2-05

# 强制关机(卡死时使用)
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system destroy openeuler2403sp2-05

# 设置开机自启
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system autostart openeuler2403sp2-05 --enable

# 查看指定虚拟机是否已开启自启【输出 域 openeuler2403sp2-05 标记为自动启动 → 已开启自启】
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system autostart openeuler2403sp2-05

# 关闭开机自启
virsh --connect qemu+ssh://libvirt-mgr@192.168.1.29/system autostart openeuler2403sp2-05 --disable

三、cache=writeback 与 cache=none 解析

cache=writeback与cache=none这两个是 Linux 挂载(mount)页缓存(page cache) 的控制参数,核心差异在读写缓存策略、数据落盘时机、性能、数据安全性

Linux 默认会用内存页缓存加速磁盘读写:

  • 写:数据先写到内存缓存,再异步刷到磁盘
  • 读:优先从内存缓存取,减少磁盘 IO

cache= 系列参数用来禁用 / 调整这套缓存机制。

内存页缓存加速磁盘读写类型 含义 特点 风险 适用场景
cache=writeback 启用回写缓存(默认常规缓存模式) * :使用页缓存,读数据会缓存到内存,后续读取更快。 * :数据先写入内存缓存 ,内核延迟、异步刷写到物理磁盘(回写机制)。 * 性能高:大幅减少磁盘随机写,读写速度快。 * 适合普通文件、日志、程序运行等非强一致性场景。 * 断电 / 系统崩溃:内存中未刷盘的数据会丢失,文件可能损坏。 * 无法保证 write() 调用后数据立刻落地磁盘。 普通数据盘、系统盘、下载盘、媒体文件、日常业务。
cache=none 完全禁用页缓存(直写 + 无读缓存) 等价于同时开启:direct I/O + 关闭页缓存 * :不使用内存页缓存,每次读直接访问磁盘。 * :数据绕过页缓存,直接提交到磁盘层,不做延迟回写。 * 数据安全性极高:写入操作完成后,数据基本已落盘。 * 数据一致性强,崩溃丢数据概率极低。 * 不会占用大量内存做文件缓存,内存占用可控。 * 性能差:每次读写都穿透到物理磁盘,IO 压力大、速度慢。 * 重复读取同一文件也无法加速。 * 数据库(MySQL/PostgreSQL 数据盘)、块设备、虚拟机磁盘(qemu/KVM)。 * 交易、计费、账务等要求数据强可靠、不能丢数据的场景。 * 底层应用自己管理缓存,不需要系统页缓存的场景。
特性 cache=writeback cache=none
页缓存 启用 完全禁用
读缓存 有,加速重复读 无,每次直读磁盘
写机制 异步回写(延迟落盘) 直写,绕过缓存
性能
断电丢数据风险 极低
内存占用 较高(缓存文件)
典型用途 普通文件、系统、媒体 数据库、虚拟机磁盘、关键业务
  • sync/async 的区别

    • async/sync:控制元数据(inode、目录) 同步策略;
    • cache=:控制文件数据的页缓存开关,二者独立。
  • 不要混用建议

    • 普通业务:默认 writeback,追求性能。
    • 数据库 / 虚拟机镜像:强制 cache=none,优先数据安全。
相关推荐
java_cj5 小时前
从kubectl学Visitor模式:如何优雅处理多态数据结构的遍历
云原生·golang·k8s·访问者模式
就改了5 小时前
微服务异步场景链路断裂完整解决方案
微服务·云原生·架构
swordbob6 小时前
Nacos vs Eureka
spring cloud·云原生·eureka
万能的知了8 小时前
K8s到底需不需要GPU节点?集群资源分配的底层逻辑
云原生·容器·kubernetes
Moshow郑锴10 小时前
Ubuntu26.04之Docker配置国内镜像加速器
云原生·eureka
Jooolin18 小时前
从 DeepSeek、Qwen 到 GPT:一次企业级 AI 知识库项目的模型选型复盘
人工智能·云原生·ai编程
阿里云云原生1 天前
AI Agent 如何“驾驭”云监控?实测自然语言驱动的全链路可观测运维
云原生
阿里云云原生1 天前
拒绝月底“账单惊魂”:AI 网关如何通过“消费者配额”实现大模型调用成本治理?
云原生
java_cj1 天前
从kubectl源码学pprof:生产环境性能分析的实战指南
运维·云原生·容器·kubernetes