KVM 权限问题 /dev/kvm 不存在 / 拒绝访问
错误现象
启动 QEMU 时看到:
qemu-system-x86_64: warning: KVM acceleration can't be used
qemu-system-x86_64: -accel kvm: failed to initialize KVM: Permission denied
或者直接:
ls -la /dev/kvm
# ls: cannot access '/dev/kvm': No such file or directory
四步排查
第一步:/dev/kvm 是否存在
ls -la /dev/kvm
文件不存在 → 原因:BIOS 没开 VT-x/AMD-V,或内核没加载 kvm 模块。跳第二步。
文件存在 → 继续第二步检查权限。
第二步:CPU 是否支持硬件虚拟化
grep -E 'vmx|svm' /proc/cpuinfo
- 有
vmx→ Intel CPU,支持 VT-x - 有
svm→ AMD CPU,支持 AMD-V - 都没有 → 你的 CPU 太老,或虚拟化被 BIOS 屏蔽。进 BIOS 开启 VT-x/AMD-V。
第三步:内核模块是否加载
# 查看 KVM 模块
lsmod | grep kvm
# 手动加载
sudo modprobe kvm
sudo modprobe kvm_intel # Intel CPU
sudo modprobe kvm_amd # AMD CPU
加载后再看 /dev/kvm 应该出现了。如果加载时报错:
modprobe: ERROR: could not insert 'kvm_intel': Operation not supported
说明 BIOS 里 VT-x 没开,或 Hyper-V 占用了(Windows + WSL2 场景)。
第四步:权限和组
ls -la /dev/kvm
# crw-rw---- 1 root kvm 10, 232 Jun 15 10:23 /dev/kvm
- 权限应该是
crw-rw----(即 0660) - 属主 root:kvm
- 当前用户必须在 kvm 组里
# 检查当前用户组
groups | grep -o 'kvm'
# 不在 kvm 组就加
sudo usermod -aG kvm $USER
# 重要:注销并重新登录让组生效
newgrp kvm # 或这个临时生效
一键诊断脚本
#!/bin/bash
echo "=== KVM 诊断 ==="
# CPU
echo -n "CPU 虚拟化支持: "
grep -qE 'vmx|svm' /proc/cpuinfo && echo "✅ $(grep -c vmx /proc/cpuinfo || grep -c svm /proc/cpuinfo) 核心" || echo "❌ 不支持"
# /dev/kvm
echo -n "/dev/kvm 文件: "
[ -e /dev/kvm ] && echo "✅ 存在 ($(ls -la /dev/kvm))" || echo "❌ 不存在"
# 模块
echo -n "KVM 模块: "
lsmod | grep -q kvm && echo "✅ 已加载" || echo "❌ 未加载"
# 用户组
echo -n "当前用户在 kvm 组: "
groups | grep -q kvm && echo "✅ 是" || echo "❌ 否"
# 综合结论
kvm-ok 2>&1
Windows 上的 WHPX 替代
Windows 上没有 KVM,对应功能是 WHPX(Windows Hypervisor Platform)。启用方式:
- 控制面板 → 启用 Windows 功能 → 勾选「虚拟机平台」和「Windows Hypervisor Platform」
- 重启
- QEMU 命令改用
-accel whpx
macOS 上的 HVF
macOS 上不需要 KVM——HVF 内置于系统。直接用 -accel hvf。Apple Silicon Mac 上 HVF 是 ARM64→ARM64 加速;模拟 x86 时只能用 TCG。
容器内 KVM
Docker 容器里默认没有 KVM 权限。需要:
docker run --device=/dev/kvm -it my-qemu-image
或 Kubernetes 里用 device plugin 暴露 KVM 设备。
虚拟化嵌套
虚拟机里再跑虚拟机,需要嵌套虚拟化(Nested Virtualization)。配置:
# KVM 模式下开启嵌套
modprobe kvm_intel nested=1
# 检查是否启用
cat /sys/module/kvm_intel/parameters/nested
# Y = 已启用
然后 Guest 里就能用 -accel kvm 了。
下一步
KVM 搞定了?去 光标不可见 / 黑屏 看看显示相关的问题。