Files
ProjectAGiPrompt/20-物理服务器虚拟机/4-2026年4月13日-操作.md
2026-04-29 09:46:36 +08:00

9.4 KiB
Raw Blame History

以下是针对你服务器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。

sdbNVMe 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

sdcSATA 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