一、远端主机需具备KVM与QEMU环境
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,优先数据安全。