以下是针对你服务器(Xeon Silver 4214 双路、192GB、openEuler 22.03 LTS-SP3)的完整 KVM + libvirt + Cockpit 部署方案,按操作顺序排列。 *** ## 第一步:环境预检 ```bash # 确认 CPU 支持 VT-x 虚拟化 egrep -c '(vmx|svm)' /proc/cpuinfo # 结果应 > 0 # 确认 KVM 模块已加载(openEuler 内核已内置) ls /dev/kvm && ls /sys/module/kvm # 两个路径均存在即正常 # 查看 NUMA 拓扑(双路服务器,涉及后续内存优化) numactl --hardware ``` *** ## 第二步:磁盘格式化与挂载 你的 sda 已是系统盘不动,仅操作 sdb 和 sdc。 ### sdb(NVMe 2.6T → VM 系统盘) ```bash # 建立 GPT 分区表,整盘一个分区 parted /dev/sdb mklabel gpt parted /dev/sdb mkpart primary xfs 0% 100% parted /dev/sdb print # 确认分区为 /dev/sdb1 # 格式化为 XFS(大文件、并发读写性能最佳) mkfs.xfs -f -L vm-sys /dev/sdb1 # 创建挂载点并挂载 mkdir -p /vm/sys mount /dev/sdb1 /vm/sys # 写入 fstab(用 UUID,防设备名变更) UUID_SDB=$(blkid -s UUID -o value /dev/sdb1) echo "UUID=${UUID_SDB} /vm/sys xfs defaults,noatime,nodiratime 0 2" >> /etc/fstab ``` ### sdc(SATA 138.3T → VM 数据存储盘) ```bash # 同样 GPT + 整盘分区 parted /dev/sdc mklabel gpt parted /dev/sdc mkpart primary xfs 0% 100% # XFS 格式化(大容量盘推荐加 -i size=512 增大 inode 密度) mkfs.xfs -f -L vm-data -i size=512 /dev/sdc1 mkdir -p /vm/data mount /dev/sdc1 /vm/data UUID_SDC=$(blkid -s UUID -o value /dev/sdc1) echo "UUID=${UUID_SDC} /vm/data xfs defaults,noatime,nodiratime 0 2" >> /etc/fstab # 验证挂载 mount -a && df -hT /vm/sys /vm/data ``` *** ## 第三步:安装 KVM 虚拟化组件 ```bash # 安装核心组件 + Cockpit dnf install -y qemu libvirt libvirt-client virt-install \ cockpit cockpit-machines # 修改 QEMU 配置,以 root 权限运行(避免权限问题) sed -i 's/#user = "root"/user = "root"/' /etc/libvirt/qemu.conf sed -i 's/#group = "root"/group = "root"/' /etc/libvirt/qemu.conf # 启动并设置开机自启 systemctl enable --now libvirtd systemctl enable --now cockpit.socket # 验证 virt-host-validate # 关键项全部 PASS ``` 访问 Cockpit:浏览器打开 `https://192.168.11.14:9090`,用 root 账号登录,**Virtual Machines** 标签即为虚拟机管理界面。 [docs.openeuler](https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Virtualization/%E5%AE%89%E8%A3%85%E8%99%9A%E6%8B%9F%E5%8C%96%E7%BB%84%E4%BB%B6.html) *** ## 第四步:网络配置(Bond → Bridge) > ⚠️ **高风险操作**,修改网络可能中断 SSH。务必先执行保底命令,再执行网络变更。 ### 保底恢复方案(必须先执行) ```bash # 安装 at 包 dnf install -y at # 启动 atd 守护进程 systemctl enable --now atd # 验证 which at && systemctl is-active atd # 60秒后自动恢复 bond0 IP(防止配置错误断网) at now + 2 minutes << 'EOF' nmcli con down br0 2>/dev/null ip addr add 192.168.11.14/24 dev bond0 ip route add default via 192.168.11.1 dev bond0 EOF ``` ### 创建 br0 桥接(桥接到 bond0) ```bash # 1. 创建 bridge br0 nmcli con add type bridge ifname br0 con-name br0 \ ipv4.addresses 192.168.11.14/24 \ ipv4.gateway 192.168.11.1 \ ipv4.dns "114.114.114.114 8.8.8.8" \ ipv4.method manual \ bridge.stp no \ connection.autoconnect yes # 2. 将 bond0 作为 br0 的从属(slave) nmcli con add type bridge-slave \ ifname bond0 master br0 \ con-name br0-slave-bond0 # 3. 先启动新配置(此时会短暂断连) nmcli con up br0 # 4. 验证(重连后执行) ip addr show br0 # 应显示 192.168.11.14/24 dnf install -y bridge-utils brctl show br0 # 应显示 bond0 为成员 ``` 如果连通后取消保底恢复任务: ```bash atrm $(atq | awk '{print $1}') ``` ### 虚拟机内部网络建议 ```bash # 使用 virsh 定义 bridge 类型网络(替代默认 NAT 网络) cat > /tmp/bridge-net.xml << 'EOF' bridge-net EOF virsh net-define /tmp/bridge-net.xml virsh net-autostart bridge-net virsh net-start bridge-net ``` *** ## 第五步:内核参数优化 这是宿主机调优的核心,写入持久化配置文件。 [blog.csdn](https://blog.csdn.net/weixin_34378969/article/details/92925024) ```bash cat > /etc/sysctl.d/99-kvm-host.conf << 'EOF' # ── 内存管理 ────────────────────────────────────────────────── # 宿主机上降低 swap 使用倾向(KVM 宿主机关键配置) vm.swappiness = 10 # 脏页回写优化(减少 IO 抖动) vm.dirty_ratio = 20 vm.dirty_background_ratio = 5 vm.dirty_writeback_centisecs = 1500 # 透明大页:启用(内核自动为 VM 分配,提升 TLB 命中率) # 注:通过 /sys 控制,sysctl 不直接设置 # 最大内存映射数量(VM 密集场景需增大) vm.max_map_count = 524288 # ── 网络优化 ────────────────────────────────────────────────── net.core.netdev_max_backlog = 250000 net.core.rmem_max = 134217728 net.core.wmem_max = 134217728 net.ipv4.tcp_rmem = 4096 87380 134217728 net.ipv4.tcp_wmem = 4096 65536 134217728 net.ipv4.tcp_mtu_probing = 1 # 允许 IP 转发(虚拟机流量需要) net.ipv4.ip_forward = 1 # ── 内核调度 ────────────────────────────────────────────────── # NUMA 自动均衡(双路服务器开启,减少跨节点内存访问) kernel.numa_balancing = 1 # 增大 PID 上限(多 VM 场景进程数多) kernel.pid_max = 4194304 EOF # 立即生效 sysctl --system ``` ### 透明大页(THP)配置 ```bash # 将 THP 设置为 madvise 模式(应用主动申请才分配,更可控) echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo defer+madvise > /sys/kernel/mm/transparent_hugepage/defrag # 持久化(写入 rc.local 或 systemd 服务) cat > /etc/rc.d/rc.local << 'EOF' #!/bin/bash echo madvise > /sys/kernel/mm/transparent_hugepage/enabled echo defer+madvise > /sys/kernel/mm/transparent_hugepage/defrag EOF chmod +x /etc/rc.d/rc.local systemctl enable rc-local ``` ### GRUB 内核启动参数(重启生效) ```bash # 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 末尾添加: # intel_iommu=on iommu=pt(启用 IOMMU,支持 PCIe 直通) # default_hugepagesz=2M hugepagesz=2M(预留 2MB 大页) # nohz=on(减少不必要的时钟中断) sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 intel_iommu=on iommu=pt nohz=on"/' \ /etc/default/grub grub2-mkconfig -o /boot/grub2/grub.cfg ``` *** ## 第六步:Swap 虚拟内存策略 你的 sda3 上已有 16G swap(来自 LVM),以下是建议策略: [ask.vmlib](https://ask.vmlib.com/how-to-configure-memory-locking-in-kvm-virtual-machines/lock-memory-kvm) | 场景 | 建议 | 理由 | |---|---|---| | 当前(192GB 内存充足) | **保留但降低优先级**(`vm.swappiness=10`) | KVM 宿主机内存被 swap 换出后 VM 会卡顿,但完全关闭在内存耗尽时会触发 OOM kill | | VM 内存超分配(开多 VM) | **保留 swap,监控使用率** | 超分场景 swap 是最后防线 | | 生产高性能数据库 VM | 可关闭:`swapoff -a` + 注释 fstab | 数据库对 swap 延迟极度敏感 | 当前配置只需确保 `vm.swappiness=10` 已生效即可: ```bash sysctl vm.swappiness # 确认输出为 10 free -h # 查看 swap 使用状态 ``` *** ## 第七步:libvirt 存储池配置 ```bash # 定义 sdb 存储池(VM 系统盘) virsh pool-define-as vm-sys dir --target /vm/sys virsh pool-autostart vm-sys virsh pool-start vm-sys # 定义 sdc 存储池(VM 数据盘) virsh pool-define-as vm-data dir --target /vm/data virsh pool-autostart vm-data virsh pool-start vm-data # 验证 virsh pool-list --all ``` *** ## 第八步:创建第一台虚拟机示例 ```bash # 在 sdb 池中创建 100G 系统盘镜像 virsh vol-create-as vm-sys centos8.qcow2 100G --format qcow2 # 用 virt-install 创建 VM(以 ISO 安装为例) virt-install \ --name vm01 \ --memory 16384 \ --vcpus 8,sockets=1,cores=8,threads=1 \ --cpu host-model \ --disk vol=vm-sys/centos8.qcow2,bus=virtio,cache=writeback \ --network bridge=br0,model=virtio \ --graphics vnc,listen=0.0.0.0,port=5901 \ --video virtio \ --os-variant centos8 \ --cdrom /vm/data/iso/CentOS-8.iso \ --noautoconsole # 连接 VNC 查看安装过程(本地端口转发后用 VNC 客户端连接) # ssh -L 5901:127.0.0.1:5901 root@192.168.11.14 ``` *** ## 部署完成检查清单 ```bash # 全面验证宿主机状态 echo "=== KVM ===" && ls /dev/kvm echo "=== libvirtd ===" && systemctl is-active libvirtd echo "=== Cockpit ===" && systemctl is-active cockpit.socket echo "=== 存储池 ===" && virsh pool-list --all echo "=== 网络 ===" && virsh net-list --all echo "=== 桥接 ===" && brctl show echo "=== 磁盘挂载 ===" && df -hT /vm/sys /vm/data echo "=== THP ===" && cat /sys/kernel/mm/transparent_hugepage/enabled echo "=== swappiness ===" && sysctl vm.swappiness ``` 所有输出正常后,通过浏览器 `https://192.168.11.14:9090` 的 Cockpit 控制台即可进行日常虚拟机管理,无需命令行。 [cloud.tencent](https://cloud.tencent.com/developer/article/2417991)