AMD-V is being used by another hypervisor (VERR_SVM_IN_USE) (0x80004005)

83 阅读6分钟

AMD-V is being used by another hypervisor (VERR_SVM_IN_USE). NS_ERROR_FAILURE (0x80004005)

看到你遇到的这个VirtualBox错误,别担心,这是一个比较常见的问题,通常是因为你电脑上其他的虚拟化软件(特别是KVM)正在占用AMD-V硬件虚拟化功能,导致VirtualBox无法使用它。

下面我来为你解释原因和提供具体的解决方法。

🔍 错误原因解析

这个错误信息 VERR_SVM_IN_USE 明确表示AMD-V功能正在被其他程序使用。在Linux系统上,最常见的情况是:

  • KVM(基于内核的虚拟机) 已经加载并占用了AMD-V硬件虚拟化功能
  • VirtualBox和KVM都是hypervisor(虚拟机监控程序),它们不能同时使用相同的硬件虚拟化扩展

🛠️ 解决方案

方案一:临时卸载KVM模块(快速解决)

如果只是临时需要使用VirtualBox,可以通过以下命令卸载KVM模块:

# 如果使用的是AMD CPU
sudo modprobe -r kvm_amd

# 如果使用的是Intel CPU  
sudo modprobe -r kvm_intel

# 或者直接卸载所有kvm相关模块
sudo modprobe -r kvm
sudo modprobe -r kvm_amd
sudo modprobe -r kvm_intel
sudo modprobe -r kvm

执行后立即尝试启动你的VirtualBox虚拟机。

但请注意,这个方法只是临时的,系统重启后KVM模块会再次自动加载。

AMD4800H实测: 单执行 sudo modprobe -r kvm 没能解决问题, 执行 sudo modprobe -r kvm_amd 后解决了

方案二:永久禁用KVM(推荐)

如果你主要使用VirtualBox,不需要KVM,可以永久禁用它:

  1. 创建禁用配置文件
sudo nano /etc/modprobe.d/disable-kvm.conf
  1. 在文件中添加以下内容
# 禁用KVM以让VirtualBox正常工作
blacklist kvm
blacklist kvm_amd
# 如果是Intel CPU,使用下面这行代替上一行
# blacklist kvm_intel
  1. 保存文件并重启系统

这样设置后,KVM就不会在系统启动时自动加载,VirtualBox就能正常使用AMD-V功能了。

方案三:使用启动管理器(GUI方式)

如果你喜欢图形界面操作:

  1. 安装Boot-up Manager:
sudo apt-get install bum
  1. 运行bum,在系统服务列表中找到KVM相关服务(可能叫"kvm"或"Full virtualization on i386 and amd64 hardware - kvm")
  2. 取消它的开机自启动选项
  3. 重启电脑































modprobe 命令讲解

modprobe 是 Linux 系统中一个非常重要的内核模块管理命令。它用于动态地向运行中的内核添加或移除模块

下面我将为你详细讲解这个命令。

1. 什么是内核模块?

简单来说,内核模块是一段可以在运行时动态加载到内核或从内核卸载的代码。它扩展了内核的功能,而无需重新编译整个内核或重启系统。

  • 例子:设备驱动程序(如显卡驱动、网卡驱动)、文件系统支持、系统功能等通常都以模块的形式存在。
  • 你遇到的问题就是例子kvm_amd 就是一个内核模块,它让 Linux 内核能够支持在 AMD CPU 上使用 KVM 虚拟化技术。

2. modprobe 基本语法

sudo modprobe [选项] <模块名> [参数=值]

3. 常用命令与场景

modprobe 最核心的两个操作是加载卸载模块。

操作命令说明
加载模块sudo modprobe <模块名>加载指定模块及其依赖。
卸载模块sudo modprobe -r <模块名>卸载指定模块及其依赖。

实例(直接解决你的问题)

# 加载 AMD KVM 模块
sudo modprobe kvm_amd

# 卸载 AMD KVM 模块 (这正好可以解决你遇到的 VirtualBox 错误)
sudo modprobe -r kvm_amd

4. modprobe 的智能之处:处理依赖关系

modprobe 相比于旧的 insmodrmmod 命令,最大的优点是它能自动处理模块之间的依赖关系

  • 例如,kvm_amd 模块依赖于 kvm 模块。
  • 当你执行 sudo modprobe kvm_amd 时,modprobe 会:
    1. 检查依赖关系。
    2. 发现需要先加载 kvm 模块。
    3. 自动先加载 kvm 模块。
    4. 然后再加载 kvm_amd 模块。

同样,当你执行 sudo modprobe -r kvm_amd 时,它也会智能地判断是否可以安全地卸载 kvm 模块。

5. 其他常用选项

选项说明
-c, --show-config显示所有模块的配置信息。
-l, --list列出所有可用模块(在某些新版系统中此选项可能已被弃用,推荐使用 find)。
-n, --dry-run模拟执行,显示将会做什么,但不实际执行。
-v, --verbose显示详细的操作过程。

实用示例

# 详细地查看加载 kvm_amd 模块的过程
sudo modprobe -v kvm_amd

# 模拟卸载 kvm_amd 模块,看会发生什么但不真正执行
sudo modprobe -r -v -n kvm_amd

6. 相关命令

为了更好地理解 modprobe,你还需要知道这几个相关的命令和文件:

命令/文件用途
lsmod列出当前已加载的所有内核模块。这是你最应该第一个使用的命令,用于查看系统现状。
rmmod用于卸载一个模块,但不处理依赖关系。如果一个模块正在被使用或有其他模块依赖它,卸载会失败。比 modprobe -r 更“低级”和“笨拙”。
insmod用于手动加载一个模块,需要指定完整的模块文件路径,并且不处理任何依赖。是最低级的加载命令。
/etc/modprobe.d/ 目录这个目录下的配置文件可以永久性地影响模块的行为。比如你之前用到的 blacklist.conf 文件。在这里配置可以禁止某个模块自动加载,或者给模块传递参数。
/proc/modules一个文件,其内容与 lsmod 命令的输出相同,反映了当前已加载的模块。
modinfo <模块名>显示一个内核模块的详细信息,包括描述、依赖、参数等。

7. 完整工作流示例

假设你遇到了最初的 VirtualBox 错误,并想用命令排查和解决,流程如下:

# 1. 查看 KVM 模块是否已加载
lsmod | grep kvm
# 输出可能类似:kvm_amd              123456  0
#                        kvm                  789012  1 kvm_amd

# 2. 尝试卸载它们(modprobe 会智能地处理依赖,先卸载 kvm_amd,再卸载 kvm)
sudo modprobe -r kvm_amd

# 3. 再次检查确认
lsmod | grep kvm
# 此时应该没有输出,说明模块已卸载

# 4. 现在可以启动你的 VirtualBox 虚拟机了

# 5. 当你需要重新使用 KVM 时,再加载模块
sudo modprobe kvm_amd

# 6. 再次检查
lsmod | grep kvm

总结

  • modprobe智能的内核模块加载/卸载工具,自动处理依赖推荐日常使用
  • insmod/rmmod底层的模块加载/卸载工具,不处理依赖,需要手动按顺序操作,适用于特定调试场景。
  • lsmod查看已加载模块状态的首选工具

希望这个详细的讲解能帮助你彻底理解 modprobe 命令!