9.4 KiB
9.4 KiB
以下是针对你服务器(Xeon Silver 4214 双路、192GB、openEuler 22.03 LTS-SP3)的完整 KVM + libvirt + Cockpit 部署方案,按操作顺序排列。
第一步:环境预检
# 确认 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 系统盘)
# 建立 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 数据存储盘)
# 同样 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 虚拟化组件
# 安装核心组件 + 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
第四步:网络配置(Bond → Bridge)
⚠️ 高风险操作,修改网络可能中断 SSH。务必先执行保底命令,再执行网络变更。
保底恢复方案(必须先执行)
# 安装 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)
# 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 为成员
如果连通后取消保底恢复任务:
atrm $(atq | awk '{print $1}')
虚拟机内部网络建议
# 使用 virsh 定义 bridge 类型网络(替代默认 NAT 网络)
cat > /tmp/bridge-net.xml << 'EOF'
<network>
<name>bridge-net</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
EOF
virsh net-define /tmp/bridge-net.xml
virsh net-autostart bridge-net
virsh net-start bridge-net
第五步:内核参数优化
这是宿主机调优的核心,写入持久化配置文件。 blog.csdn
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)配置
# 将 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 内核启动参数(重启生效)
# 编辑 /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
| 场景 | 建议 | 理由 |
|---|---|---|
| 当前(192GB 内存充足) | 保留但降低优先级(vm.swappiness=10) |
KVM 宿主机内存被 swap 换出后 VM 会卡顿,但完全关闭在内存耗尽时会触发 OOM kill |
| VM 内存超分配(开多 VM) | 保留 swap,监控使用率 | 超分场景 swap 是最后防线 |
| 生产高性能数据库 VM | 可关闭:swapoff -a + 注释 fstab |
数据库对 swap 延迟极度敏感 |
当前配置只需确保 vm.swappiness=10 已生效即可:
sysctl vm.swappiness # 确认输出为 10
free -h # 查看 swap 使用状态
第七步:libvirt 存储池配置
# 定义 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
第八步:创建第一台虚拟机示例
# 在 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
部署完成检查清单
# 全面验证宿主机状态
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