多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Rocky Linux 9.6 KVM虚拟化部署全攻略:从硬件检查到虚拟机创建

Rocky Linux 9.6 KVM虚拟化部署全攻略:从硬件检查到虚拟机创建 KVM虚拟化平台在Linux生态里几乎是绕不开的一站Rocky Linux 9.6又正好是很多服务器运维团队用来接替CentOS的主力发行版。这篇把从硬件检查到虚拟机创建、从网络桥接到故障排查的完整路径走一遍适合刚接手服务器、想在内网自己搭虚拟化环境或者被老板一句把测试环境虚拟化一下怼得没头绪的同学参考。我尽量按实际动手的顺序来讲每一步怎么操作、为什么这么操作、踩过什么坑都直接说清楚能帮你少走一半弯路。1. 装机之前先把硬件和系统环境确认清楚1.1 芯片的虚拟化扩展最容易被忽略的前提条件KVM 之所以快、之所以稳核心是它直接吃 CPU 的硬件虚拟化扩展。如果你要跑 KVM 的机器CPU 根本不支持 VT-xIntel或 SVM/AMD-VAMD那后面所有步骤都是白折腾——系统会报 /dev/kvm 找不到或者虚拟机创建出来性能奇差无比。怎么检查两种命令都可以lscpu | grep -i virtualization grep -E (vmx|svm) /proc/cpuinfoIntel 的机器在 lscpu 输出里会看到Intel(R) Virtualization TechnologyAMD 会看到AMD-V。grep /proc/cpuinfo 如果出现 vmxIntel或 svmAMDflag说明系统层面已经能看到虚拟化能力。但注意/proc/cpuinfo 有 flag 只是第一步还得确认 BIOS 里没关。品牌机的 BIOS 设置里Intel 通常叫 VT-x 或 Virtualization TechnologyAMD 叫 SVM Mode 或 Secure Virtual Machine。开完记得保存重启再回系统看 flag。我几年前在一台戴尔老服务器上踩过这个坑BIOS 里默认关闭 SVMKVM 装了三次都起不来一直找不到 /dev/kvm最后排查到是 BIOS 设置的问题。所以这一步我每次都会强调装之前先花两分钟确认硬件虚拟化真的开了。如果这台机器本身就是虚拟机那还得看宿主机有没有开嵌套虚拟化nested virt。宿主机没开子机里永远看不到 vmx/svm别在子机里瞎调参数。这个排查思路适用于各种此平台不支持虚拟化AMD-V 不可用的报错先往宿主机的嵌套虚拟化方向想。1.2 系统安装方式与软件源准备Rocky Linux 9.6 推荐用 Minimal ISO 安装不要贪全。原因很简单KVM 本身是一套可以后装的服务图形桌面和一堆办公组件不仅浪费磁盘还会带来不必要的安全面和复杂度。服务器场景下Minimal 加后装虚拟化组是最干净的组合。装完系统第一件事是把软件源缓存和系统补丁更新到最新避免因为版本过旧导致 libvirt 兼容性报错dnf update -yRocky 9.6 的 AppStream 仓库里已经带了完整 KVM 相关包不需要额外加第三方源。如果你公司内部有本地镜像源建议在 /etc/yum.repos.d 里替换成内网源一方面速度快另一方面版本受控。没内网源就直接用默认的官方源也完全可行。还要顺手确认两个基础资源别等建虚拟机的时候才发现磁盘不够free -h df -h /var/lib/libvirt建议内存至少 8GB 起步/var/lib/libvirt 所在分区按每台虚拟机 20~50GB 预留。存储如果放系统盘就要想着后续扩容的事最好一开始就把 libvirt 默认存储池指到数据盘。这个习惯我放在文末单独讲因为很多人栽在这上面。2. KVM核心组件安装一个命令搞定大部分工作2.1 用组件组安装还是手动选包Rocky 9.6 提供了现成的虚拟化组件组一条命令就装齐 qemu-kvm、libvirt、virt-top 等一堆东西省心dnf group install -y Virtualization Host如果你只想按需装也可以手动选。给一个常用清单qemu-kvm用户态模拟器虚拟机真正运行在这上面、libvirt统一管理 APIvirsh 和 virt-manager 都靠它、virt-install命令行装机工具、virt-manager图形管理界面、qemu-img磁盘镜像工具。对应的完整命令是dnf install -y qemu-kvm qemu-img libvirt virt-install virt-manager组件组的好处是会自动处理包之间的版本依赖新手不容易漏包缺点是装多了点。对企业环境来说我建议直接装组件组版本一致性比省那几百 MB 磁盘更重要。这里顺带把 QEMU 和 KVM 的关系说清楚。KVM 是内核里的虚拟化模块负责提供 CPU 虚拟化和内存虚拟化的底层能力QEMU 是用户态的模拟器负责模拟设备、处理 I/O、提供 BIOS 或固件支持。两者合起来才是你最终看到的完整虚拟机。搜资料时经常看到 qemu-kvm 这个组合叫法指的就是这套分工模式。如果提示找不到 Virtualization Host 这个组名不要慌先执行dnf group list --hidden | grep -i virt看一下系统里实际的组名再装不同小版本可能有命名差异。2.2 启动 libvirtd 并把当前用户加进 libvirt 组装完第一件事不是急着建虚拟机而是启动 libvirtd 服务并设为开机自启systemctl enable --now libvirtd systemctl status libvirtd --no-pager -l启动后用非 root 用户去管理虚拟机通常更规范也避免所有操作都顶着 root 跑。把当前用户加到 libvirt 组usermod -aG libvirt $USER newgrp libvirtnewgrp 是让当前会话立刻生效的临时手段重新登录之后默认的组关系就固定了。如果没加这个组后面 virsh 和 virt-manager 连接 qemu:///system 大概率会碰到权限拒绝报错信息还特别像服务挂了很误导人。验证服务状态和最基本的虚拟化模块ls -l /dev/kvm lsmod | grep kvm正常情况下你会看到 /dev/kvm 存在lsmod 里出现 kvm_intel 或 kvm_amd。如果 /dev/kvm 不存在先别往下走直接跳到第五节排查。2.3 初步确认libvirt能正常工作libvirt 起来之后先用两个简单命令确认管理栈和默认网络都正常virsh list --all virsh net-list --all第一条如果打印出 Id、Name、State 三个表头说明 libvirtd 服务通了net-list 如果能看到 default 网络说明 libvirt 自动创建的 NAT 桥 virbr0 也正常。这时候别急着装系统先想清楚网络方案。3. 网络模式怎么选NAT还是Bridge3.1 默认的virbr0 NAT网络适合什么场景libvirt 装好后默认会创建一个叫 virbr0 的网桥对应 192.168.122.0/24 网段虚拟机接到这个网桥就自动获得一个 192.168.122.x 的地址外部访问通过宿主机做 NAT 转发。NAT 模式的优点是零配置开箱即用非常适合作开发和测试。你只是想快速起一台虚拟机验证脚本、跑个中间件、搭个临时环境NAT 完全够用。缺点也很明显外界要主动访问虚拟机里的服务比较麻烦需要给宿主机做端口转发写防火墙规则维护成本就上来了。所以我的经验是NAT 只用来调试真正要对外提供服务的虚拟机用桥接模式直接进局域网。3.2 用nmcli配置Linux Bridge让虚拟机以独立IP接入局域网Rocky 9.6 的默认网络管理是 NetworkManager所以网桥配置走 nmcli 最合适。别去手改 /etc/sysconfig/network-scriptsRHEL 9 系列已经把这套传统配置方式逐步废弃了改完还可能和 NetworkManager 冲突。先看一下物理网卡叫什么以及现在哪个连接是活动的nmcli device status假设物理网卡叫 eth0当前连接也叫 eth0。配置一个叫 br0 的桥接并绑定物理网卡nmcli connection add type bridge ifname br0 con-name br0 nmcli connection modify br0 ipv4.method manual \ ipv4.addresses 192.168.1.27/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns 192.168.1.1 nmcli connection add type bridge-slave ifname eth0 master br0这几步分别做了三件事建立桥接接口 br0给 br0 配置静态 IP、网关、DNS把 eth0 变成 br0 的从端口。注意把 eth0 加进桥之后eth0 本身不能再保留原来的 IP 配置否则会冲突。然后停掉原来的 eth0 连接把 br0 拉起来nmcli connection down eth0 nmcli connection up br0最后用ip addr show br0确认 br0 拿到了 192.168.1.27再拿别的主机 ping 一下通了就说明桥接成功。这里有个细节桥接模式下虚拟机如果配置同网段的静态 IP数据包走的是二层交换。但为了保险并且以后你很可能还会在宿主机上跑其他转发服务建议顺手开启内核转发echo net.ipv4.ip_forward 1 /etc/sysctl.d/100-ip-forward.conf sysctl -p /etc/sysctl.d/100-ip-forward.conf如果桥起来之后虚拟机还是上不了网多半是 firewalld 的默认区域问题第五节单独展开。3.3 macvtap 方案为什么我不建议优先用除了 bridgelibvirt 还支持 macvtap直接让虚拟机通过物理网卡收发数据不需要桥接。比 bridge 更轻量配置更快但有一个硬伤宿主机和虚拟机在 macvtap 模式下互相无法通信。原因在于 macvtap 在设计上不允许回环流量从同一物理接口返回。这个特性导致很多初学者一头雾水明明虚拟机网络正常、外网也通宿主机 ping 虚拟机就是不通然后在网上翻半天帖子。所以除非你明确知道自己在做什么生产网络老老实实用 bridge 就好。4. 创建虚拟机图形界面和命令行两种姿势都要会4.1 使用virt-manager图形化创建如果你的机器装了图形桌面或者你习惯在本地用 virt-manager 连接远程宿主机图形界面是最直观的。前面安装命令已经带了 virt-manager启动virt-manager连接 QEMU/KVM点左上角创建新虚拟机选择本地 ISO 或网络安装源按提示分配内存、CPU、磁盘大小就完事。整个交互非常简单图形界面里还能直接看到虚拟机开机画面适合新手理解一台虚拟机的生命周期。但服务器环境多数没有图形桌面生产维护也不可能天天开图形界面。所以命令行创建虚拟机是必须掌握的技能下面重点讲。4.2 使用virt-install命令行创建Linux虚拟机我常用的最小示例长这样virt-install \ --name rocky9-test \ --memory 4096 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/rocky9-test.qcow2,size30,formatqcow2 \ --os-variant rhel9.0 \ --network networkdefault,modelvirtio \ --location /mnt/iso/Rocky-9.6-x86_64-minimal.iso \ --graphics none \ --extra-args consolettyS0,115200n8参数拆开看--memory 4096内存大小单位 MiB4096 就是 4GB。别抠门也要看宿主机剩余内存算清楚再给。--vcpus 2CPU 核数不是所有场景都追求多核物理机核数有限按业务需求给。--disk path...,size30,formatqcow2指定磁盘位置和大小。qcow2 格式支持稀疏文件和快照是首选raw 性能略高但不支持快照占用空间是按全部容量走的不建议默认用。--os-variant rhel9.0告诉安装工具这台机器的 OS 类型影响 virtio 驱动和 CPU 型号优化。不填也能装但填了省事。Rocky 9.6 一般直接写 rhel9.0 可用不确定就用osinfo-query os查支持的系统列表。--network networkdefault,modelvirtio连到默认 NAT 网络网卡模型用 virtio性能好。如果是桥接就改成--network bridgebr0,modelvirtio。--location指定安装介质路径virt-install 会从 ISO 里提取安装内核和 initrd 引导。--graphics none加--extra-args consolettyS0,115200n8纯命令行串口控制台安装方式适合无图形环境的服务器。如果要 VNC 远程图形安装就把这两项换成--graphics vnc,listen0.0.0.0 --noautoconsole然后用 VNC 客户端连过去看界面。执行完命令virt-install 会打印推荐的控制台连接命令一般是virsh console rocky9-test。在串口控制台里完成 Rocky 的安装向导重启后虚拟机就进入正常状态了。如果遇到--location检测介质失败先把 ISO 复制到本地目录或者用ls -l /mnt/iso/确认镜像是否完整。这个报错多半是 ISO 不完整或镜像本身不支持后段安装引导重新下完整 ISO 就好。4.3 虚拟机生命周期管理基础命令建好虚拟机之后日常管理全是 virsh 的事。列几个高频命令够日常使用 90% 的场景virsh list --all # 列出所有虚拟机 virsh start rocky9-test # 启动 virsh shutdown rocky9-test # 优雅关机 virsh destroy rocky9-test # 强制关机模拟断电 virsh reboot rocky9-test # 重启 virsh autostart rocky9-test # 设为开机自启 virsh vcpuinfo rocky9-test # 查看 vCPU 状态快照是 qcow2 格式的杀手锏升级前打个快照出问题秒级回滚virsh snapshot-create-as rocky9-test upgrade-before system upgrade backup virsh snapshot-list rocky9-test virsh snapshot-revert rocky9-test upgrade-before记住一个原则destroy是硬断电生产环境慎用。真要搞系统级操作先shutdown再等它自己关比强行 kill 安全得多。模板化扩容也很常见虚拟机装好基础系统后拷一份 qcow2 镜像再用virsh dumpxml导出配置、改 name 和 uuid、重新 define就能秒级复制出一台新虚拟机。比重新装一遍系统节省大量时间。5. 踩坑实录常见问题排查速查表5.1 /dev/kvm 不存在往往是BIOS或嵌套虚拟化的锅最典型的安装后报错是 libvirt 提示找不到 /dev/kvm。按优先级排查先看 CPU 是否有 vmx/svm flag没有就进 BIOS 开虚拟化开关Intel VT-x / AMD SVM开了才考虑模块加载问题。模块正常情况应该自动加载。如果没加载手动执行modprobe kvm_intel # Intel modprobe kvm_amd # AMD如果你运行的是虚机要确认宿主机的虚拟化设置里开了嵌套虚拟化否则子机永远看不到硬件虚拟化 flag报错形式五花八门什么此平台不支持虚拟化AMD-V 显示不可用都可能出现。这个前提不满足在子机内怎么调内核参数都没用。5.2 权限问题连不上 libvirtd 或 virsh 报拒绝访问普通用户执行virsh list --all报Permission denied十有八九是当前用户不在 libvirt 组。重新执行usermod -aG libvirt $USER然后退出重新登录。这里有个小细节别只记着 usermod 却忘了重新登录组权限在旧会话里不会自动刷新很多人卡在这一步以为命令没用。如果提示Failed to connect socket to /var/run/libvirt/libvirt-sock先确认 libvirtd 起来没systemctl status libvirtd --no-pager -l再不行看看自己有没有连到错误的 URI。virt-manager 默认连 qemu:///system如果误连到 qemu:///session看到的是完全不同的虚拟机组感觉就像虚拟机丢了。5.3 桥接配置完成后虚拟机无法上网桥接配置完虚拟机分配了同网段 IP 却连不出去很多人的第一反应是改配置其实多数问题是宿主机防火墙的转发策略挡住了。先检查iptables -L FORWARD -n如果 FORWARD 链默认 DROP你需要让桥接口的流量通过。firewalld 环境下最简单的做法是把 br0 接口放到 trusted 区域firewall-cmd --permanent --zonetrusted --change-interfacebr0 firewall-cmd --reload然后确认 ip_forward 是 1。如果你用的是 NAT 模式libvirt 自己会维护 nftables/iptables 规则一般不用你手动碰反而是自定义 bridge 最容易在这翻车因为 libvirt 的规则不会自动覆盖你手建的桥。另外检查物理网卡的旧连接是否残留。用 nmcli 配置桥后如果原 eth0 连接还处于 active就会出现双 IP 或者链路状态跳来跳去的问题。务必把旧连接 down 掉并把新的 bridge 设成自动连接nmcli connection modify br0 connection.autoconnect yes nmcli connection up br05.4 提示CPU架构或型号不支持创建虚拟机时如果提示 CPU 架构不支持先确认镜像架构和宿主机架构一致。x86_64 的宿主机装 arm64 镜像除非你开了跨架构模拟否则直接报错。可以用virsh capabilities看宿主机真正支持的架构列表。还有一类问题是 CPU 型号透传。默认 libvirt 用 host-model 适配宿主 CPU但如果你后续把虚拟机迁移到另一台不同 CPU 的宿主机可能就没法启动了。这时可以考虑--cpu host-model或--cpu host-passthrough。日常用 host-model 够稳极端性能需求再用 host-passthrough但要知道它牺牲了迁移兼容性。5.5 磁盘格式选错导致容量虚增最后提醒一个小坑如果创建虚拟机时选择 raw 格式磁盘文件直接占满 size 参数对应的空间1TB 的 raw 文件就是真 1TB不是稀疏文件。qcow2 格式按需增长创建时只占很小一部分。所以批量创建虚拟机前先规划好磁盘格式和存储池容量别让系统盘被打爆。6. 存储池规划我每次部署前必做的一件事从实际维护的角度讲我最想让你养成的习惯是先把存储池规划好而不是把所有虚拟机镜像都堆在默认的 /var/lib/libvirt/images 里。默认路径能跑但时间一长你就会发现备份、迁移、按项目隔离全都变得很痛苦。我通常会在数据盘下建一个独立的 KVM 目录并注册成 libvirt 存储池mkdir -p /data/kvm/images virsh pool-define-as data dir - - - - /data/kvm/images virsh pool-start data virsh pool-autostart data这样一来以后创建虚拟机时--disk pooldata,size30,formatqcow2就能直接复用不用每次手写完整路径。备份的时候也只要针对 /data/kvm 这一个目录做策略就好目录结构清晰不会和系统盘混在一起。多台虚拟机共用宿主机时我还会按业务线建子目录比如 /data/kvm/images/web、/data/kvm/images/db配合云服务器快照或者 rsync 做增量备份。KVM 这套东西学习曲线不算陡真正麻烦的往往不是安装本身而是网络、权限、存储这三个基础项的规划。把这几个点想清楚了Rocky Linux 9.6 上的 KVM 基本就能安安稳稳跑了。
返回列表