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,可以永久禁用它:
- 创建禁用配置文件:
sudo nano /etc/modprobe.d/disable-kvm.conf
- 在文件中添加以下内容:
# 禁用KVM以让VirtualBox正常工作
blacklist kvm
blacklist kvm_amd
# 如果是Intel CPU,使用下面这行代替上一行
# blacklist kvm_intel
- 保存文件并重启系统。
这样设置后,KVM就不会在系统启动时自动加载,VirtualBox就能正常使用AMD-V功能了。
方案三:使用启动管理器(GUI方式)
如果你喜欢图形界面操作:
- 安装Boot-up Manager:
sudo apt-get install bum
- 运行bum,在系统服务列表中找到KVM相关服务(可能叫"kvm"或"Full virtualization on i386 and amd64 hardware - kvm")
- 取消它的开机自启动选项
- 重启电脑
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 相比于旧的 insmod 和 rmmod 命令,最大的优点是它能自动处理模块之间的依赖关系。
- 例如,
kvm_amd模块依赖于kvm模块。 - 当你执行
sudo modprobe kvm_amd时,modprobe会:- 检查依赖关系。
- 发现需要先加载
kvm模块。 - 自动先加载
kvm模块。 - 然后再加载
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 命令!