KVM虚拟化与企业应用实践------创建KVM虚拟机实践教程
https://coffeemilk.blog.csdn.net/article/details/161932482
一、准备网络引导介质与ks自动应答环境
基于Cobbler的系统自动化安装部署------原理
https://blog.csdn.net/xiaochenxihua/article/details/159200419
若不想安装部署如上两个链接提供完整的PXE网络引导环境,只是需要提供此次KVM所需的自动安装系统网络环境,则可简化为【安装nginx并开启目录浏览功能】即可,详细操作如下:
实现给Nginx的指定站点开启目录浏览功能
https://blog.csdn.net/xiaochenxihua/article/details/140509316
bash
#1-在红帽系系统(如:Almalinux9.3)安装nginx并开启目录浏览
#1.1-在线安装nginx
yum -y install nginx
#1.2-开启nginx的目录浏览配置
cd /etc/nginx/
vi nginx.conf
#【vi nginx.conf】文件中的【server】段内新增如下内容
# 指定一个不存在的默认首页(避免开启全局浏览的目录下含有index.html就直接显示这个页面内容了)
index non-exist.html;
# 指定全局的目录浏览的根路径
root /usr/share/nginx/html;
# 设置字符集,避免中文显示乱码
charset utf-8,gbk;
# 开启目录浏览功能
autoindex on;
# 显示文件的修改时间
autoindex_localtime on;
# 显示的格式,可选项为(html、xml、json、jsonp)
autoindex_format html;
# 显示文件大小的时候带上方便人类阅读的文件单位(如:KB、MB、TB)
autoindex_exact_size off;
#1.3-nginx的配置文件修改完成后让配置文件生效,且nginx网站持续运行
nginx -t && nginx -s reload
systemctl enable nginx.service
#2-配置需要自动安装的系统(如:openeuler24.03-LTS-SP3)
#2.1-下载所需的系统镜像
mkdir -p /data/os/iso
wget https://repo.openeuler.openatom.cn/openEuler-24.03-LTS-SP3/ISO/x86_64/openEuler-24.03-LTS-SP3-x86_64-dvd.iso -c -P /data/os/iso
#2.2-将系统镜像临时挂载到指定目录下
mkdir -p /data/tmpos
mount -o loop,rw /data/os/iso/openEuler-24.03-LTS-SP3-x86_64-dvd.iso /data/tmpos
#2.3-将临时文件挂载的系统镜像复制一份到nginx浏览目录下
mkdir -p /usr/share/nginx/html/openeuler2403ltssp3x86-64/
cp -rp /data/tmpos/* /usr/share/nginx/html/openeuler2403ltssp3x86-64/
#若想复制时实时显示复制进度可使用如下命令
rsync -a --progress --ignore-existing /data/tmpos/* /usr/share/nginx/html/openeuler2403ltssp3x86-64/
ll -a /usr/share/nginx/html/openeuler2403ltssp3x86-64/
umount /data/tmpos
#3-在浏览器访问nginx所在服务器IP即可看到共享的目录内容
ip a
#4-编写红帽系的自动应答文件(Kickstart)
vi /usr/share/nginx/html/openeuler2403ltssp3x86-64/ks.cfg
#4.1-纯BIOS兼容的 ks.cfg
#【ks.cfg】文件的完整内容如下
eula --agreed
url --url=http://192.168.1.137/openeuler2403ltssp3x86-64/
# 安装界面、首次启动、防火墙、SELinux
graphical
firstboot --disable
firewall --disabled
selinux --disabled
reboot
# 语言、键盘、时区
keyboard --xlayouts='cn'
lang zh_CN.UTF-8
timezone Asia/Shanghai
# 网络
network --bootproto=dhcp --hostname=openeuler2403sp3 --activate
# 服务
services --disabled="chronyd"
# root 加密密码(可用SHA-512 哈希算法【openssl passwd -6 你需要设置的root密码】生成;如下明文密码是qwer1234)
rootpw --iscrypted $6$Oue/iG4Xd7hc6ENV$x7iwQGW9MvpwyD1Po24R1pjQUvOsnEwg6E5PGn6oY57Uw3HQYnnzDg4u4w8E4T4l.y0Nu/9oKELh9pqt.7iVU/
# 引导:BIOS + MBR(修正磁盘名为vda)
bootloader --location=mbr --driveorder=vda --append="crashkernel=auto"
# 清空磁盘、分区表(修正磁盘名为vda)
ignoredisk --only-use=vda
zerombr
clearpart --all --initlabel --drives=vda
# 自定义标准分区方案(3个主分区+扩展分区+逻辑分区)
part biosboot --fstype="biosboot" --size=1 --ondisk=vda
part /boot --fstype=ext4 --size=1024 --ondisk=vda
part swap --fstype=swap --size=4096 --ondisk=vda
part / --fstype=xfs --size=20480 --ondisk=vda
part extended --grow --ondisk=vda
#part /data --fstype=xfs --grow --ondisk=vda
part /data --fstype=xfs --size=1024 --grow --ondisk=vda
# 软件包
%packages
@core
@development
gcc
gdb
make
%end
# 后置脚本
%post --interpreter=/bin/bash
touch /root/test.tt1
%end
#4.2-纯UEFI的 ks.cfg
#【ks.cfg】文件的完整内容如下【root的默认账号密码生成MD5命令:openssl passwd -1 -salt `openssl rand -hex 4`'qwer1234'】
eula --agreed
url --url=http://192.168.1.137/openeuler2403ltssp3x86-64/
graphical
firstboot --disable
firewall --disabled
selinux --disabled
reboot
# 语言、键盘、时区
keyboard cn
lang zh_CN.UTF-8
timezone Asia/Shanghai
# 网络
network --bootproto=dhcp --hostname=openeuler2403sp3 --activate
# root 加密密码(可用SHA-512 哈希算法【openssl passwd -6 你需要设置的root密码】生成;如下明文密码是qwer1234)
rootpw --iscrypted $6$Oue/iG4Xd7hc6ENV$x7iwQGW9MvpwyD1Po24R1pjQUvOsnEwg6E5PGn6oY57Uw3HQYnnzDg4u4w8E4T4l.y0Nu/9oKELh9pqt.7iVU/
# 禁用 chronyd 时间服务
services --disabled="chronyd"
# ========== UEFI + GPT 引导配置 ==========
bootloader --boot-drive=vda
# 清空全盘 + 初始化分区表为 GPT
clearpart --all --initlabel --drives=vda
# UEFI 必需 ESP 分区
part /boot/efi --fstype=efi --ondisk=vda --size=1024 --fsoptions="umask=0077"
# /boot 分区 ext4
part /boot --fstype=ext4 --size=1024 --ondisk=vda
# swap
part swap --fstype=swap --size=4096 --ondisk=vda
# 根分区
part / --fstype=xfs --size=20480 --ondisk=vda
# 数据分区占用剩余空间
part /data --fstype=xfs --grow --ondisk=vda
%packages
@core
@development
gcc
gdb
make
%end
%post --interpreter=/bin/bash
touch /root/test.tt1
# UEFI环境兜底重装EFI GRUB,防止Anaconda自动安装遗漏
if [ -d /boot/efi ];then
grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=openEuler
grub2-mkconfig -o /boot/grub2/grub.cfg
fi
%end





二、通过网络介质配合ks自动应答文件实现自动安装KVM虚拟机
bash
#通过网络介质配合ks自动应答文件实现自动安装KVM虚拟机
#1-前置检查
#1.1-安装 UEFI 启动必需OVMF 固件(重中之重)
dnf install -y edk2-ovmf
#1.2-检查 KVM 虚拟化是否开启(输出大于 0 表示已开启 VT-x/AMD-V)
virt-host-validate
egrep -c '(vmx|svm)' /proc/cpuinfo
#1.3-检查目录是否存在
mkdir -p /data/vmdisk
#1.4-检查网桥 br0 状态
nmcli d status
brctl show
#1.5-测试 ks 文件与安装源可访问
curl -I http://192.168.1.137/openeuler2403ltssp3x86-64/ks.cfg
#1.6-防火墙放行 VNC 5904 端口
firewall-cmd --permanent --add-port=5904/tcp
firewall-cmd --reload
firewall-cmd --list-ports
#1.7-确认 Libvirt 服务正常运行(显示active (running)才表示正在运行)
systemctl status libvirtd
# 未启动则执行
systemctl start libvirtd
systemctl enable libvirtd
#2-通过网络介质配合ks自动应答文件自动安装KVM虚拟机【有两种方式:BIOS模式、UEFI模式】
#2.1-使用virt-install命令创建虚拟机后【自动】安装配置【BIOS模式】
virt-install \
--virt-type=kvm \
--os-variant=rhel9.3 \
--name=openeuler2403sp3 \
--description="开发使用的OpenEuler24.03-LTS-SP3服务器" \
--vcpus=2 \
--cpu host-model \
--memory 4096 \
--disk path=/data/vmdisk/openeuler2403sp3.qcow2,bus=virtio,cache=none,size=40 \
--location http://192.168.1.137/openeuler2403ltssp3x86-64/,kernel=images/pxeboot/vmlinuz,initrd=images/pxeboot/initrd.img \
--extra-args="inst.ks=http://192.168.1.137/openeuler2403ltssp3x86-64/ks.cfg rng_core.default_quality=0 random.trust_cpu=on" \
--network bridge=br0,model=virtio \
--noautoconsole \
--graphics vnc,port=5904,listen=0.0.0.0,password=qwer1234 \
--rng /dev/urandom,model=virtio
#2.2-使用virt-install命令创建虚拟机后【自动】安装配置【UEFI模式】
cp /usr/share/edk2/ovmf/OVMF_VARS.fd /data/vmdisk/openeuler2403sp3_VARS.fd
virt-install \
--virt-type=kvm \
--os-variant=rhel9.3 \
--name=openeuler2403sp3 \
--description="开发使用的OpenEuler24.03-LTS-SP3服务器" \
--vcpus=2 \
--cpu host-model \
--memory 4096 \
--disk path=/data/vmdisk/openeuler2403sp3.qcow2,bus=virtio,cache=none,size=40 \
--location http://192.168.1.137/openeuler2403ltssp3x86-64/,kernel=images/pxeboot/vmlinuz,initrd=images/pxeboot/initrd.img \
--extra-args="inst.ks=http://192.168.1.137/openeuler2403ltssp3x86-64/ks.cfg rng_core.default_quality=0 random.trust_cpu=on" \
--network bridge=br0,model=virtio \
--noautoconsole \
--graphics vnc,port=5904,listen=0.0.0.0,password=qwer1234 \
--rng /dev/urandom,model=virtio \
--boot uefi,firmware=/usr/share/edk2/ovmf/OVMF_CODE.fd,nvram=/data/vmdisk/openeuler2403sp3_VARS.fd
#3-执行完成virt-install命令后,会有提示:【域仍在运行。安装可能正在进行中。可以重新连接到控制台以完成安装过程。】
#此时,可通过vnc viewer连接此安装进程开启的vnc连接端口5904
#4-若在生产环境使用了vnc,建议在防火墙添加规则限制
# 仅允许 192.168.1.0/24 网段访问 5904 端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="5904" accept'
firewall-cmd --reload
#6-注意:若是安装时有问题,则可以关闭后清除干净修改后重试
#6.1强制关闭正在运行的虚拟机(如果存在)
virsh destroy openeuler2403sp3 2>/dev/null
#6.2-彻底注销虚拟机、删除UEFI固件变量、删除关联存储卷
virsh undefine openeuler2403sp3 --nvram --remove-all-storage 2>/dev/null
#6.3-删除之前创建的空虚拟磁盘,避免残留
rm -f /data/vmdisk/openeuler2403sp3.qcow2
#6.4-检查虚拟机列表(正常结果:无任何输出,代表虚拟机配置已彻底删除)
virsh list --all | grep openeuler2403sp3
#6.5-兜底检查残留文件(UEFI + XML + 磁盘【如下三条命令全都没有输出,才算 100% 清理干净】)
#检查虚拟机XML配置文件
ls /etc/libvirt/qemu/ | grep openeuler2403sp3
#检查UEFI的NVRAM变量文件
ls /var/lib/libvirt/qemu/nvram/ | grep openeuler2403sp3
#再次确认虚拟磁盘
ls /data/vmdisk/ | grep openeuler2403sp3
rm -f /data/vmdisk/openeuler2403sp3.qcow2 /data/vmdisk/openeuler2403sp3_VARS.fd



执行完成virt-install命令后,此时,可通过vnc viewer连接到192.168.1.29的5904端口,查看引导界面,进行系统安装。

等待进入这个图形化的安装界面后就会自动配置安装系统了,如下图所示:




耐心等待自动安装完成即可,安装完成后需要使用【virsh start openeuler2403sp3 】命令启动,然后通过vnc viewer连接到192.168.1.29的5904打开虚拟机界面,输入账号【root】密码【qwer1234】登录到系统中:

【UEFI】的操作图如下:



若在安装虚拟机时一直卡在OpenSSH ecda Server key Generation... OpenSSH ed25519 Server key Generation...界面不动,如下图所示,这是由于虚拟机的熵源不足导致的如下图所示:
bash
#解决KVM虚拟机的熵源不足,导致虚拟机一直卡在【一直卡在OpenSSH ecda Server key Generation... OpenSSH ed25519 Server key Generation...界面不动】
#1-在【--extra-args】后面添加【rng_core.default_quality=0 random.trust_cpu=on】
--extra-args="inst.ks=http://192.168.1.137/openeuler2403ltssp3x86-64/ks.cfg rng_core.default_quality=0 random.trust_cpu=on" \
#2-配置宿主机向虚拟机投喂源源不断的熵流
--rng /dev/urandom,model=virtio \

| 参数 | 生效对象 | 核心用途 |
|---|---|---|
rng_core.default_quality=0 |
本机(宿主机 / 虚拟机)内核 | 放宽熵质量校验,减少随机读取阻塞 |
random.trust_cpu=on |
本机(宿主机 / 虚拟机)内核 | 启用 CPU 硬件随机指令补充熵 |
--rng virtio |
虚拟机(客户机) | 宿主机向虚拟机投喂源源不断的熵流 |
-
rng_core.default_quality=0 random.trust_cpu=on:宿主机内核优化,保证宿主机自身有充足随机熵; -
--rng /dev/urandom,model=virtio:打通宿主机→虚拟机的熵通道,给虚拟机持续供给随机数;三者配套使用,彻底解决 Linux 虚拟机熵枯竭、加密程序卡顿问题。
| 解决熵源不足参数 | 归属 | 说明 | 适用场景 |
|---|---|---|---|
rng_core.default_quality=0(内核启动参数 /grub cmdline) |
Linux 内核 rng_core 子系统全局配置 |
quality 含义:衡量随机源熵值可信度,范围 0~1000 * 硬件 RNG(TPM/virtio-rng)默认 1000,可信度最高 * CPU 随机指令(rdrand)默认接近 1000 * 纯软件熵池默认偏低 =0 效果:降低系统对随机源质量要求 |
虚拟机无硬件 RNG、熵源不足,允许内核更快从 /dev/urandom 读取随机数,避免阻塞应用。 |
random.trust_cpu=on(内核启动参数) |
Linux random 子系统 |
作用:信任 CPU 硬件随机指令集(Intel RDRAND/RDSEED、AMD equivalent) * on:内核直接采信 CPU 生成的硬件随机熵,补充系统熵池 * off:忽略 CPU 硬件随机,仅采集键盘、磁盘、网络等外部事件凑熵 |
搭配虚拟机场景:虚拟机 CPU 指令可能被宿主机虚拟化拦截,此时即使开 trust_cpu 效果有限,建议配合 virtio-rng。 |
--rng /dev/urandom,model=virtio(QEMU/KVM 虚拟机启动参数) |
QEMU 虚拟机硬件设备参数,给 客户机(虚拟机)提供 virtio 随机设备 | * model=virtio:虚拟设备类型为 virtio-rng(半虚拟化高速随机设备) * /dev/urandom:宿主机侧熵源 ,宿主机读取自身 /dev/urandom,通过 virtio 通道投喂给虚拟机 工作流程: 宿主机内核 → /dev/urandom 取随机数据 → virtio 总线 → 虚拟机内核 → 虚拟机 /dev/random//dev/urandom 填充熵池 |
三、virt-install中的一些细节
3.0、查看KVM虚拟化工具支持的操作系统信息
bash
#列出 KVM/virt-install 等虚拟化工具支持的操作系统信息,方便在创建虚拟机时为 --os-variant 参数选择正确值,从而优化虚拟机性能。
osinfo-query os

3.1、--disk的子项bus类型对比
| 总线类型 | 代表设备名 | 性能 | 兼容性 | 功能支持 | 适用场景 |
|---|---|---|---|---|---|
ide |
/dev/hda |
低 | 极高(所有系统都支持) | 老旧协议,无热插拔 | 老旧系统、安装时兼容启动 |
sata |
/dev/sda |
中 | 高 | 支持热插拔、NCQ | 兼容 + 性能平衡场景 |
scsi |
/dev/sda |
中 | 中 | 支持多设备、SCSI 命令 | 传统服务器系统 |
virtio(virtio-blk) |
/dev/vda |
高 | 需安装 VirtIO 驱动 | 高性能、低开销 | 现代 Linux 虚拟机 |
virtio-scsi |
/dev/sda |
极高 | 需安装 VirtIO 驱动 | 多队列、热插拔、TRIM、多设备 | 企业级 / 高性能虚拟机 |
nvme |
/dev/nvme0n1 |
极高 | 需新内核 / 驱动 | 模拟 NVMe 设备,低延迟 | 现代系统、SSD 场景 |
3.2、--disk的重点子项bus详解
| --disk的子项bus名称 | 原理 | 特点 | 典型场景 |
|---|---|---|---|
ide(IDE 总线) |
模拟传统 IDE 控制器,是最古老的磁盘接口。 | * 兼容性极强,几乎所有操作系统(包括无驱动的老系统)都能识别。 * 性能差,单线程瓶颈明显,最大只能挂 4 个设备。 | * 安装老旧系统(如 Windows XP、CentOS 5)。 * 作为安装时的兼容引导设备,安装完成后建议更换。 |
sata(SATA 总线) |
模拟 SATA 控制器,是 IDE 的升级版。 | * 性能比 IDE 高,最多支持 6 个设备。 * 兼容性好,现代 Linux/Windows 都自带驱动。 | * 不想折腾 VirtIO 驱动,但又需要比 IDE 更好的性能。 * 部分系统默认使用 SATA 作为光盘 / 磁盘控制器。 |
virtio(virtio-blk,VirtIO 块设备) |
基于 VirtIO 半虚拟化标准的专用磁盘驱动,是 KVM 的经典高性能方案。 | * 性能高,开销低,是大多数 Linux 虚拟机的默认选择。 * 设备名以 vdX 开头(如 /dev/vda),你前面 lsblk 看到的 vda 就是这个。 * 需要虚拟机系统内安装 VirtIO 驱动(现代 Linux 内核默认自带)。 |
* 大多数 Linux 虚拟机(如 openEuler、CentOS、Ubuntu)。 * 对性能有要求的通用场景。 |
virtio-scsi(VirtIO SCSI 控制器) |
用 VirtIO 封装标准 SCSI 协议,是 virtio-blk 的升级版。 |
* 功能最全:支持多队列(提升并发性能)、热插拔、TRIM、SCSI 高级命令。 * 扩展性强:单个控制器可挂载数十个设备,适合多盘场景。 * 设备名以 sdX 开头(和物理 SCSI/SATA 设备一致),管理更方便。 |
* 企业级云主机、高并发业务。 * 需要挂载多块磁盘、动态扩容的场景。 |
nvme(NVMe 总线) |
* 模拟 NVMe 设备,直接走 PCIe 通道。 | * 延迟极低,性能接近物理 NVMe 盘。 * 需要新内核 / 驱动支持(Linux 3.10+、Windows 10+)。 | * 对 IO 延迟敏感的业务(如数据库)。 * 现代 SSD 直通 / 模拟场景。 |
3.3、OVMF 四类 fd 文件完整详解
QEMU 使用 UEFI 固件时,必须分开两块 pflash 存储,不能混用、不能错配容量:
| OVMF 双分区架构 | 说明 |
|---|---|
| CODE 固件(只读模板) | 存放完整 UEFI 执行代码、驱动、设置界面、安全启动证书库。 系统全局公用,所有虚拟机共用同一个 CODE 文件,必须加 readonly=on。 |
| VARS 变量盘(可读写私有盘) | 存放单台虚拟机专属 UEFI 持久化数据:启动顺序、BIOS 设置、TPM 状态、安全启动密钥、硬件配置记录。 每台虚拟机独立一份,可读写,复制 / 克隆虚拟机必须连带复制对应 VARS 文件。 |
| 后缀区分 | * 无 _4m:2MB 固件镜像(传统小容量) * _4m:4MB 扩容固件镜像(现代系统推荐) |
| OVMF文件详解 | 核心属性 | 能力 | 适用场景与约束 |
|---|---|---|---|
| /usr/share/edk2/ovmf/OVMF_CODE.fd | * 类型:2MB 标准 UEFI CODE 固件模板 * 来源:系统包(edk2-ovmf)自带公共只读固件 * 大小:2MiB | 能力限制: * 固件存储空间小,安全启动证书分区容量不足,Win11 /openEuler 2403 SP3 开启 SecureBoot 容易异常; * 内置驱动精简,部分新型网卡、GPU、TPM2 兼容性差; * UEFI 设置界面功能阉割。 | 适用场景 老旧轻量虚拟机、32 位系统、无安全启动需求、极低内存宿主机。 使用约束 只能搭配 2MB VARS 文件 ,混用 4M VARS 直接报 flash size mismatch 启动崩溃。 |
| /usr/share/edk2/ovmf/OVMF_CODE_4m.fd | * 类型:4MB 完整版 UEFI CODE 固件模板 * 来源:系统 edk2 包公共固件,只读共享 * 大小:4MiB | 优势(openEuler 2403 SP3 首选) 1. 更大 Flash 分区,内置完整微软 / 红帽 /openEuler 安全启动证书,原生支持 SecureBoot; 2. 内置完整 TPM2、virtio、vga、vfio 设备初始化驱动; 3. 支持多语言 UEFI 设置、自定义启动项、硬件高级配置; 4. 完美兼容 x86_64 openEuler 2403 SP3、Windows 10/11。 | 使用约束 必须搭配 4M 规格 VARS 变量盘。 |
| /data/vmdisk/openeuler2403sp3_VARS.fd | * 类型:单虚拟机私有 2MB UEFI 变量存储盘 * 生成方式:从系统模板 /usr/share/edk2/ovmf/OVMF_VARS.fd 复制而来 * 作用:专属存储这台 openEuler 2403 SP3 虚拟机的 UEFI 持久变量 |
配套关系 仅能和 OVMF_CODE.fd(2M CODE) 成对使用。 |
风险点 1. 单独删除此文件:虚拟机 UEFI 设置、启动顺序全部重置,每次开机进 UEFI 安装界面; 2. 拷贝虚拟机时不带此文件:新虚拟机丢失原有启动项,无法自动进系统; 3. 开启安全启动极易出现证书空间不足、引导失败。 |
| /data/vmdisk/openeuler2403sp3_VARS_4m.fd | * 类型:单虚拟机私有 4MB UEFI 变量存储盘 * 生成方式:复制系统模板 /usr/share/edk2/ovmf/OVMF_VARS_4m.fd 自定义重命名 * 作用:4M 固件配套大容量变量存储,给 openEuler 2403 SP3 持久保存 UEFI 配置、安全启动密钥、TPM 凭证 |
配套关系 仅能和 OVMF_CODE_4m.fd(4M CODE) 成对使用。 |
适配优势 1. 充足空间存放多套安全启动签名证书; 2. 多硬盘、多系统多启动项可完整保存; 3. TPM2 加密状态、虚拟机 BIOS 自定义参数长期留存,不会丢失。 |
bash
#QEMU参数示例【2MB 老旧组合】
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/ovmf/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/data/vmdisk/openeuler2403sp3_VARS.fd
#QEMU参数示例【4MB 推荐组合】
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/ovmf/OVMF_CODE_4m.fd \
-drive if=pflash,format=raw,file=/data/vmdisk/openeuler2403sp3_VARS_4m.fd