本章提供常见问题的解答。为了改善您使用 Oracle VirtualBox 的用户体验,建议阅读本节以了解更多常见陷阱并获取有关如何使用该产品的建议。
通常情况下,虚拟化客户机表现得像一个物理系统。物理机可能遇到的任何问题,虚拟机也会遇到。例如,如果因外部问题导致互联网连接丢失,虚拟机将像物理机一样受到影响。
如果遇到真正的 Oracle VirtualBox 问题,首先将其分类并隔离会很有帮助。在报告问题之前,应回答以下一些问题
问题是否特定于某个客户机操作系统?或者特定于某个客户机操作系统的特定版本?特别是对于与 Linux 客户机相关的问题,问题可能特定于 Linux 的某个发行版和版本。
问题是否特定于某个宿主机操作系统?问题通常不特定于宿主机操作系统,因为 Oracle VirtualBox 的大部分代码库在所有受支持的平台之间共享,但特别是在网络和 USB 支持方面,宿主平台之间存在显著差异。一些 GUI 相关问题也特定于宿主机。
问题是否特定于某些宿主机硬件?这类问题通常与宿主机 CPU 有关。由于 VT-x 和 AMD-V 之间存在显著差异,问题可能特定于其中一种技术。确切的 CPU 型号也可能有所不同,因为不同的 CPU 支持不同的功能,这可能会影响客户机 CPU 操作的某些方面。
问题是否特定于客户机 SMP?也就是说,它是否与客户机中的虚拟 CPU (VCPU) 数量有关?使用多个 CPU 通常会显著影响客户机操作系统的内部运行。
问题是否特定于增强功能?在某些情况下,这很明显,例如共享文件夹问题。在其他情况下,例如显示问题,可能不那么明显。如果问题特定于增强功能,它是否也特定于某个版本的增强功能?
问题是否特定于某个环境?某些问题与虚拟机外部的特定环境有关。这通常涉及网络设置。某些外部服务器(如 DHCP 或 PXE)的配置可能会暴露出与其他类似服务器不会出现的问题。
问题是否是回归问题?知道某个问题是回归问题通常会使其解决方案更容易找到。在这种情况下,了解哪个版本受到影响以及哪个版本不受影响至关重要。
为了进行问题排查,收集可供 Oracle VirtualBox 支持分析的调试信息通常很重要。本节包含有关可以获取何种类型的信息的信息。
每次 Oracle VirtualBox 启动虚拟机时,都会创建一个所谓的 发布日志文件,其中包含大量有关虚拟机配置和运行时事件的信息。该日志文件名为 VBox.log,默认位于虚拟机日志文件文件夹中,即 $HOME/VirtualBox VMs/VM-name/Logs。
启动虚拟机时,上次运行的配置文件将被重命名为 .1,最多到 .3。有时,当出现问题时,查看日志会很有用。此外,在请求 Oracle VirtualBox 支持时,提供相应的日志文件是强制性的。
为了方便起见,对于每个虚拟机,VirtualBox 管理器 都可以在一个窗口中显示这些日志。从左侧的机器列表中选择一个虚拟机,然后单击机器工具菜单中的日志。
发布日志文件 VBox.log 包含大量诊断信息,例如宿主机操作系统类型和版本、Oracle VirtualBox 版本和构建。它还包括客户机配置 (CFGM) 的完整转储、有关宿主机 CPU 类型和支持功能的详细信息、硬件虚拟化是否已启用、有关 VT-x/AMD-V 设置的信息、状态转换(如创建、运行、暂停、停止)、客户机 BIOS 消息、增强功能消息、设备特定日志条目以及执行结束时的最终客户机状态和精简统计信息。
在发生崩溃的情况下,收集崩溃转储文件非常重要。无论是宿主机崩溃还是客户机崩溃,此情况都适用。有关在 Linux、Oracle Solaris 和 macOS 系统上启用核心转储的信息,请参阅 Oracle VirtualBox 网站上的以下核心转储文章
https://virtualbox.ac.cn/wiki/Core_dump.
您还可以使用 VBoxManage debugvm 创建完整虚拟机的转储。请参见 VBoxManage debugvm。
对于网络相关问题,捕获网络流量的跟踪通常很有帮助。如果流量通过宿主机上的适配器路由,则可以使用 Wireshark 或类似工具捕获该处的流量。然而,这通常也包括大量与虚拟机无关的流量。
Oracle VirtualBox 提供仅在特定虚拟机的网络适配器上捕获网络流量的功能。有关如何启用此捕获的信息,请参阅 Oracle VirtualBox 网站上的以下网络跟踪文章
https://virtualbox.ac.cn/wiki/Network_tips.
Oracle VirtualBox 创建的跟踪文件采用 .pcap 格式,可以使用 Wireshark 轻松分析。
VBoxBugReport 命令用于自动收集 Oracle VirtualBox 安装的调试信息。当您需要收集信息以发送给 Oracle 支持时,此命令会很有用。
以下示例展示了如何使用 VBoxBugReport。
默认情况下,该命令会收集 VBoxSVC 进程日志、设备设置和 Oracle VirtualBox 宿主机的全局配置数据。
$ VBoxBugReport ... 0% - collecting VBoxSVC.log.10... 7% - collecting VBoxSVC.log.9... ... 64% - collecting VBoxSVC.log.1... 71% - collecting VBoxSVC.log... 78% - collecting VirtualBox.xml... 85% - collecting HostUsbDevices... 92% - collecting HostUsbFilters... 100% - compressing... Report was written to '2019-03-26-13-32-02-bugreport.tgz'
结果以压缩的 tar 文件存档形式保存在运行该命令的同一目录中。
指定不同的输出文件位置:
$ VBoxBugReport --output ~/debug/bug004.tgz
将所有调试信息输出到单个文本文件,而不是 tgz 文件
$ VBoxBugReport --text
收集名为 Windows_10
的特定虚拟机的信息
$ VBoxBugReport Windows_10
此命令收集指定虚拟机的机器设置、客户机属性和日志文件。还包括主机的全局配置信息。
收集名为 Windows_7
、Windows_8
和 Windows_10
的多个虚拟机的信息
$ VBoxBugReport Windows_7 Windows_8 Windows_10
收集所有虚拟机的信息:
$ VBoxBugReport --all
要显示可用命令选项的完整列表,请运行 VBoxBugReport --help。
Oracle VirtualBox 包含一个内置的虚拟机调试器,高级用户可能会觉得它很有用。此调试器使您能够检查并在一定程度上控制虚拟机状态。
使用虚拟机调试器需要自行承担风险。它没有提供支持,以下文档仅供对 x86/AMD64 机器指令集非常熟悉以及对 PC 架构有详细了解的高级用户使用。对相关客户机操作系统内部结构有一定程度的熟悉也可能会非常有帮助。
虚拟机调试器在所有常规生产版本的 Oracle VirtualBox 中都可用,但默认情况下是禁用的,因为普通用户很少使用它。有两种方法可以访问调试器
使用与虚拟机同时显示的调试器控制台窗口。
使用 telnet 协议通过端口 5000
可以通过以下方式启用调试器:
使用 VirtualBoxVM --startvm 直接启动虚拟机,并带上附加参数 --dbg
、--debug
或 --debug-command-line
。有关详细信息,请参阅 VirtualBoxVM --help
在启动 Oracle VirtualBox 进程之前,将 VBOX_GUI_DBG_ENABLED
或 VBOX_GUI_DBG_AUTO_SHOW
环境变量设置为 true
。设置这些变量时,仅检查它们是否存在,即使第一个 Oracle VirtualBox 进程是虚拟机选择器窗口,它们也有效。随后从选择器启动的虚拟机将启用调试器。
在启动虚拟机之前,将 GUI/Dbg/Enabled
额外数据项设置为 true
。这可以全局设置,也可以按虚拟机单独设置。
Oracle VirtualBox 应用程序中会添加一个新的调试菜单项。此菜单使用户能够打开调试器控制台。
虚拟机调试器命令语法大致模仿了 DOS、OS/2 和 Windows 上使用的 Microsoft 和 IBM 调试器。熟悉 symdeb、CodeView 或 OS/2 内核调试器的用户会发现 Oracle VirtualBox 虚拟机调试器很熟悉。
最重要的命令是 help。它将打印所有调试器命令的简要使用帮助。help 命令支持的命令集经常更改,help 命令始终是最新的。
常用命令的简要总结如下:
stop:停止虚拟机执行并启用单步执行
g:继续虚拟机执行
t:单步执行一条指令
rg、rh 和 r:打印客户机、管理程序和当前寄存器
kg、kh 和 k:打印客户机、管理程序和当前调用堆栈
da、db、dw、dd、dq:以 ASCII、字节、字、双字和四字打印内存内容
u:反汇编内存
dg:打印客户机的 GDT
di:打印客户机的 IDT
dl:打印客户机的 LDT
dt:打印客户机的 TSS
dp*:打印客户机的页表结构
bp 和 br:设置普通断点和重编译器断点
bl:列出断点
bc:清除断点
writecore:将虚拟机核心文件写入磁盘。请参见 VM Core Format
有关其他可用命令,请参见内置的 help。
虚拟机调试器支持符号调试,尽管客户机代码的符号通常不可用。对于 Oracle Solaris 客户机,detect 命令会自动确定客户机操作系统版本并在客户机内存中定位内核符号。然后即可进行符号调试。对于 Linux 客户机,detect 命令也会确定客户机操作系统版本,但客户机内存中没有符号。内核符号位于 Linux 客户机上的 /proc/kallsyms 文件中。此文件必须复制到宿主机,例如使用 scp。可以使用 loadmap 调试器命令使符号信息可用于虚拟机调试器。请注意,kallsyms 文件包含当前加载模块的符号。如果客户机配置发生变化,符号也会随之变化,并且必须进行更新。
对于所有客户机,验证是否加载了正确符号的简单方法是使用 k 命令。客户机通常处于空闲状态,并且从符号信息中可以清楚地看出客户机操作系统的空闲循环正在执行。
另一组调试器命令是 info 命令集。运行 info help 提供完整的使用信息。信息命令提供与各种模拟设备和虚拟机管理程序 (VMM) 方面相关的临时数据。info 命令没有通用的使用指南,要使用的正确命令完全取决于正在调查的问题。以下是一些 info 命令
cfgm:打印配置树的一个分支
cpuid:显示客户机 CPUID 叶子
ioport:打印注册的 I/O 端口范围
mmio:打印注册的 MMIO 范围
mode:打印当前分页模式
pit:打印 i8254 PIT 状态
pic:打印 i8259A PIC 状态
ohci、ehci 和 xhci:打印 OHCI、EHCI 和 xHCI USB 控制器状态的子集
pcnet0:打印 PCnet 状态
vgatext:以标准文本模式格式打印 VGA 帧缓冲器内容
timers:打印所有虚拟机计时器
info 命令的输出通常需要对模拟设备或 Oracle VirtualBox VMM 内部结构有深入的了解。然而,如果使用得当,所提供的信息可能非常宝贵。
Oracle VirtualBox 使用 64 位 ELF 格式创建由 VBoxManage debugvm 生成的虚拟机核心文件,请参见 VBoxManage debugvm。虚拟机核心文件包含虚拟机的内存和 CPU 转储,可用于调试您的客户机操作系统。64 位 ELF 对象格式规范可在以下网址获取
http://downloads.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf.
虚拟机核心转储的整体布局如下:
[ ELF 64 Header] [ Program Header, type PT_NOTE ] → offset to COREDESCRIPTOR [ Program Header, type PT_LOAD ] - one for each contiguous physical memory range → Memory offset of range → File offset [ Note Header, type NT_VBOXCORE ] [ COREDESCRIPTOR ] → Magic → VM core file version → VBox version → Number of vCPUs etc. [ Note Header, type NT_VBOXCPU ] - one for each vCPU [ vCPU 1 Note Header ] [ DBGFCORECPU - vCPU 1 dump ] [ Additional Notes + Data ] - currently unused [ Memory dump ]
内存描述符包含相对于客户机的物理地址,而不是虚拟地址。核心文件不包含 MMIO 区域等内存区域。
相关数据结构和定义可在 Oracle VirtualBox 源代码的以下头文件中找到:include/VBox/dbgfcorefmt.h、include/iprt/x86.h 和 src/VBox/Runtime/include/internal/ldrELFCommon.h。
可以使用 elfdump 和 GNU readelf 或其他类似实用程序检查虚拟机核心文件。
有时,某些宿主机文件系统提供非常差的写入性能,因此导致客户机对 IDE/SATA 命令超时。这是正常行为,通常不会造成实际问题,因为客户机应重复已超时的命令。然而,某些 Linux 版本等客户机在向镜像文件写入超过大约 15 秒时会出现严重问题。但是,如果宿主机缓存包含大量需要写入的数据,某些文件系统可能需要一分钟以上才能完成单次写入。
此问题的症状是,在大量写入或复制操作期间,客户机无法再访问其文件,通常导致客户机立即挂起。
为了解决此问题,真正的解决方法是使用速度更快且不会出现这种不可接受写入性能的文件系统,但可以在写入一定量数据后刷新镜像文件。此间隔通常是无限的,但可以为虚拟机的每个磁盘单独配置。
对于 IDE 磁盘,使用以下命令:
VBoxManage setextradata VM-name "VBoxInternal/Devices/piix3ide/0/LUN#[x]/Config/FlushInterval" [b]
对于 SATA 磁盘,使用以下命令:
VBoxManage setextradata VM-name "VBoxInternal/Devices/ahci/0/LUN#[x]/Config/FlushInterval" [b]
[x]
指定磁盘。对于 IDE,0
表示主通道上的设备 0,1
表示主通道上的设备 1,2
表示辅助通道上的设备 0,3
表示辅助通道上的设备 1。对于 SATA,请使用 0
到 29
之间的值。此配置选项仅适用于磁盘。请勿将此选项用于 CD 或 DVD 驱动器。
间隔 ([b]
) 的单位是自上次刷新以来写入的字节数。必须选择合适的值,以避免偶尔出现长时间写入延迟。由于适当的刷新间隔取决于宿主机和宿主机文件系统的性能,因此找到解决问题的最佳值需要一些实验。1000000 到 10000000(1 到 10 兆字节)之间的值是一个很好的起点。减小间隔既可以降低出现问题的可能性,又可以降低客户机的写入性能。不必要地将值设置得过低会牺牲性能而没有任何好处。将间隔设置为 1 将导致每次写入操作都进行刷新,无论如何都应解决问题,但这会严重影响写入性能。
为 [b]
提供 0
值被视为无限刷新间隔,从而有效地禁用了此解决方法。通过不指定 [b]
的值来删除额外数据键具有相同的效果。
如果需要,当客户机发出 IDE FLUSH CACHE 命令时,可以刷新虚拟磁盘镜像。通常为了提高性能,这些请求会被忽略。以下参数仅适用于磁盘驱动器。它们不得为 DVD 驱动器设置。
要为 IDE 磁盘启用刷新,请发出以下命令:
$ VBoxManage setextradata VM-name "VBoxInternal/Devices/piix3ide/0/LUN#[x]/Config/IgnoreFlush" 0
[x]
指定磁盘。输入 0
表示主通道上的设备 0,1
表示主通道上的设备 1,2
表示辅助通道上的设备 0,或 3
表示辅助通道上的设备 1。
要为 SATA 磁盘启用刷新,请发出以下命令:
$ VBoxManage setextradata VM-name "VBoxInternal/Devices/ahci/0/LUN#[x]/Config/IgnoreFlush" 0
选择磁盘的值 [x] 可以是 0 到 29 之间的值。
请注意,这不会影响根据 Guest Shows IDE/SATA Errors for File-Based Images on Slow Host File System 中所述的配置执行的刷新。通过将值设置为 1 或删除键,可以恢复忽略刷新命令的默认设置。
许多多核处理器支持某种形式的频率提升,这意味着如果只使用一个核心,它可能比额定 CPU 频率快 50% 甚至更多。这导致测量的性能会随着瞬时整体系统负载的变化而有所不同。确切的行为在很大程度上取决于特定的处理器型号。
因此,在利用频率提升的系统上进行基准测试可能会产生不稳定且不可重复的结果。如果基准测试运行时间短,例如数秒,则尤其如此。为了获得稳定的结果,基准测试必须在较长的时间内进行,并且除了被测试的虚拟机外,系统负载必须保持不变。
在某些硬件平台和操作系统上,CPU 频率缩放可能导致 CPU 使用率报告高度误导。这发生在主机 CPU 负载显著但不重的情况,例如最大值的 15% 到 30% 之间。
大多数操作系统根据花费的时间确定 CPU 使用率,例如测量系统或进程在一秒内活跃了多少纳秒。然而,为了节省能源,当系统未完全加载时,系统可以显著降低 CPU 速度。例如,当 CPU 以其最大速度的一半运行时,相同数量的指令执行所需的时间大约是全速运行时的两倍。
根据具体的硬件和宿主机操作系统,这种效应可能会严重扭曲操作系统报告的 CPU 使用率。报告的 CPU 使用率可能比 CPU 以全速运行时高出数倍。这种效应可以在宿主机操作系统和客户机操作系统中观察到。
Windows 自带的 CPU 使用率报告工具,如任务管理器或资源监视器,不会将处理硬件中断所花费的时间计算在内。如果中断负载很大,每秒有数千个中断,则 CPU 使用率可能会被严重低估。
此问题影响作为主机和客户机操作系统的 Windows。Sysinternals 工具(例如 Process Explorer)没有此问题。
在某些硬件平台和操作系统上,主机 CPU 电源管理会对虚拟化性能产生负面影响。症状可能是客户机中出现断断续续的音频或客户机时钟行为异常。
一些问题可能是由固件或宿主机操作系统错误引起的。因此,建议更新固件并应用操作系统修补程序。
为了获得最佳虚拟化性能,如果系统 BIOS 中有此设置,应禁用 C1E 电源状态支持。并非所有系统都支持 C1E 电源状态。在 Intel 系统上,应禁用 Intel C State
设置。禁用其他电源管理设置也可能提高性能。但是,始终必须权衡性能和功耗。
如果将 Windows 7 或 Windows Server 2008 R2 客户机配置为支持 USB 3.0 (xHCI),则客户机操作系统将完全不支持 USB。发生这种情况是因为 Windows 7 早于 USB 3.0,因此不附带任何 xHCI 驱动程序。Microsoft 也不通过 Windows Update 提供任何供应商提供的 xHCI 驱动程序。
为了解决此问题,需要在客户机中下载并安装 Intel xHCI 驱动程序。Intel 提供的驱动程序是用于 Intel 7 系列/C216 芯片组的 USB 3.0 可扩展主机控制器 (xHCI) 驱动程序。
请注意,该驱动程序仅支持 Windows 7 和 Windows Server 2008 R2。驱动程序包包括对 32 位和 64 位操作系统变体的支持。
更改某些虚拟机设置可能会导致 Windows 客户机在启动时出现蓝屏错误。如果您在安装 Windows 后更改虚拟机设置,或者将已安装 Windows 的磁盘镜像复制到设置与原始机器不同的新创建虚拟机,则可能会发生这种情况。
这尤其适用于以下设置:
安装 Windows 后,绝不应更改 ACPI 和 I/O APIC 设置。根据这些硬件功能的存在与否,Windows 安装程序会选择特殊的内核和设备驱动程序版本,如果移除这些硬件功能,将导致启动失败。为未安装这些功能的 Windows 虚拟机启用它们不会造成任何损害。但是,在这种情况下,Windows 将不会使用这些功能。
更改存储控制器硬件也会导致启动失败。如果您将磁盘镜像从旧版本的 Oracle VirtualBox 复制到新的虚拟机,也可能出现此问题。Oracle VirtualBox 使用的 IDE 控制器硬件的默认子类型是 PIIX4。请确保存储控制器设置相同。
如果虚拟机配置为具有多个处理器(对称多处理,SMP),某些配置的 Windows 客户机将以 0x101 错误消息崩溃,指示处理器间中断 (IPI) 超时。这些中断在处理器之间同步内存管理。
根据 Microsoft 的说法,这是由于 Windows 中的竞争条件。Microsoft 提供了热修复程序。
如果这不起作用,请将虚拟处理器数量减少到 1。
安装 Windows 2000 客户机时,您可能会遇到以下问题之一:
安装重新启动,通常在组件注册期间。
安装将整个硬盘填满空日志文件。
安装抱怨 msgina.dll 安装失败。
这些问题都是由 Windows 2000 硬盘驱动程序中的一个错误引起的。在发出硬盘请求后,Windows 驱动程序代码中存在一个竞态条件,如果操作完成得太快,就会导致损坏。例如,IDE 控制器的硬件中断来得太早。对于物理硬件,大多数系统都有一个保证的延迟,因此问题通常在那里被隐藏。然而,在物理硬件上也可以重现它。在虚拟环境中,操作可能立即完成,特别是在具有多个 CPU 的非常快的系统上,并且中断信号比在物理系统上更早。解决方案是在传递此类中断之前引入人工延迟。可以使用以下命令为虚拟机配置此延迟
$ VBoxManage setextradata VM-name "VBoxInternal/Devices/piix3ide/0/Config/IRQDelay" 1
这会将延迟设置为一毫秒。如果这不起作用,请将其增加到 1 到 5 毫秒之间的值。请注意,这会降低磁盘性能。安装后,您应该能够删除该键,或将其设置为 0。
当 Windows 客户机发生内核崩溃时,它们会显示蓝屏错误。根据 Windows 的配置方式,信息将保留在屏幕上直到机器重新启动,或者会自动重新启动。在安装期间,Windows 通常配置为自动重新启动。自动重新启动时,没有机会记录蓝屏信息,这对于问题排查可能很重要。
Oracle VirtualBox 提供了一种在客户机想要执行重置时暂停客户机的方法。要启用此功能,请使用以下命令
$ VBoxManage setextradata VM-name "VBoxInternal/PDM/HaltOnReset" 1
从 Windows Vista 开始,Microsoft 放弃了对 Oracle VirtualBox 传统版本用作默认虚拟网卡的 AMD PCNet 卡的支持。对于 Windows Vista 客户机,Oracle VirtualBox 现在默认使用 Intel E1000 卡。
如果出于某种原因,您仍然希望使用 AMD 网卡,则需要从 AMD 网站下载 PCNet 驱动程序。此驱动程序仅适用于 32 位 Windows。您可以使用共享文件夹将其传输到虚拟机中。请参见 共享文件夹。
已知 Windows 客户机中的某些后台应用程序,特别是病毒扫描程序,即使客户机看起来处于空闲状态,也会显著增加 CPU 负载。在虚拟机中停用病毒扫描程序(如果可能)可以减少此问题。
Windows 更新,特别是在 Windows 10 和 Windows 11 客户机上,也可能导致客户机 CPU 使用率和存储活动暂时增加。现代 Windows 版本在后台进行大量更新以部署新功能和安全修复。
如果 Windows 98 虚拟机配置为使用模拟 USB 平板电脑(绝对定位设备),则坐标转换可能不正确,并且指针被限制在客户机屏幕的左上角四分之一区域。
Windows 98 中的 USB HID(人机接口设备)驱动程序非常老旧,并且不像现代操作系统那样处理平板电脑。为了解决此问题,请使用以下命令:
$ VBoxManage setextradata VM-name "VBoxInternal/USB/HidMouse/0/Config/CoordShift" 0
要恢复默认行为,请删除该键或将其值设置为 1。
如果 Windows 客户机是 Active Directory 域的成员,并且使用了 Oracle VirtualBox 的快照功能,则在恢复较旧的快照后,它可能会从 Active Directory 域中移除。
这是由于 Windows 出于安全目的定期执行的自动机器密码更改引起的。您可以按照此Microsoft 文章中所示禁用此功能。
Windows 3.x 客户机通常限制为 64 MB RAM,即使虚拟机分配了更多的内存。虽然 Windows 3.1 理论上能够使用高达 512 MB 的 RAM,但它只使用通过 XMS 接口可用的内存。MS-DOS 和 Microsoft Windows 3.x 附带的 HIMEM.SYS(Microsoft XMS 管理器)版本在标准 PC 上只能使用高达 64 MB。
这是一个已知的 HIMEM.SYS 限制。Microsoft 知识库文章 KB 84388 详细描述了 Windows 3.1 内存限制。
如果使用不同的 XMS 提供程序,Windows 3.x 客户机可以使用超过 64 MB 的内存。这可以是较新的 HIMEM.SYS 版本(例如 Windows 98 随附的版本),或功能更强大的第三方内存管理器(例如 QEMM)。
某些 Linux 客户机即使系统看起来处于空闲状态,也可能导致较高的 CPU 负载。这可能是由客户机内核的高计时器频率引起的。例如,某些 Linux 发行版(如 Fedora)提供的 Linux 内核配置为 1000Hz 的计时器频率。我们建议重新编译客户机内核并选择 100Hz 的计时器频率。
Red Hat Enterprise Linux 附带的 Linux 内核,以及相关 Linux 发行版(如 CentOS 和 Oracle Linux)的内核,都支持内核参数 divider=N。因此,此类内核支持较低的计时器频率而无需重新编译。我们建议您添加内核参数 divider=10 来选择 100Hz 的客户机内核计时器频率。
Linux 内核中的以下错误阻止它们在 Oracle VirtualBox 中正确执行,导致虚拟机启动崩溃
Linux 内核版本 2.6.18 和某些 2.6.17 版本引入了一个竞态条件,可能导致 Oracle VirtualBox 启动失败。请使用内核版本 2.6.19 或更高版本。
启用硬件虚拟化和 I/O APIC 后,2.6.24-rc6 之前的内核在引导时可能会出现以下消息而崩溃:
Kernel panic - not syncing: IO-APIC + timer doesn't work! Boot with apic=debug and send a report. Then try booting with the 'noapic' option
如果您看到此消息,请按照 系统设置 中所述禁用硬件虚拟化或 I/O APIC,或将客户机升级到较新的内核。
有关内核修复的详细信息,请参见此消息。
在运行 X11 窗口系统(如 Oracle Solaris 和 Linux)的客户机中,客户机桌面服务由名为 VBoxClient 的客户机服务提供,该服务在启动桌面会话的用户 ID 下运行,并且如果您使用 Gnome 或 KDE 等常见桌面环境,则在 X11 用户会话启动时会自动使用以下命令行启动。
$ VBoxClient --clipboard $ VBoxClient --display $ VBoxClient --seamless
如果某个特定的桌面服务无法正常工作,则值得检查提供该服务的进程是否正在运行。
VBoxClient 进程在运行时会在用户主目录中创建名为 .vboxclient-*.pid 的文件,以防止给定服务被启动两次。由于配置错误,这些文件可能由 root 拥有且在服务停止时未被删除,这将阻止它们在将来的会话中启动。如果服务无法启动,您可能需要检查这些文件是否存在。
当使用多个 CPU 时,Oracle Solaris 10 10/08 和 Oracle Solaris 10 5/09 可能需要很长时间才能启动,并且可能会在系统控制台上打印有关无法从磁盘读取的警告。这是 Oracle Solaris 10 中的一个错误,会影响特定的物理和虚拟配置。它是由在磁盘中断重新分配给尚未完全初始化的辅助 CPU 时尝试从启动磁盘读取微代码更新引起的。磁盘读取将超时并失败,从而触发大约 45 秒的延迟和警告。
建议的解决方案是升级到至少包含此问题修复的 Oracle Solaris 10 10/09。替代解决方案包括将虚拟 CPU 数量限制为一个或可能使用不同的存储控制器。
Solaris 10 1/06 之前的 Solaris 版本,包括 Solaris 9、Solaris 10 1/05 (GA) 和 Solaris 10 3/05 (HW2),无法通过 Intel E1000 网卡进行通信。Solaris e1000g 驱动程序未启用网络适配器的 PCI 总线主控功能,因此无法发送和接收数据。此问题似乎特定于 e1000g 驱动程序,并不反映 Solaris 驱动程序的通用行为。
可以使用 AMD PCnet 仿真(使用 Solaris pcn 驱动程序)代替 Intel E1000。Solaris 10 1/06 (U1) 及更高版本没有此问题,并且可以与模拟的 E1000 以太网控制器配合使用。
Microsoft Windows 使用 UAC(用户帐户控制)和 UIPI(用户界面特权隔离)等技术来防止和缓解安全问题。默认情况下,UAC 和 UIPI 处于启用状态。
当 Oracle VirtualBox 虚拟机进程以比另一个希望通过拖放(或系统剪贴板)与虚拟机进程交互的进程更高的特权级别运行时,Windows 会出于安全原因默认阻止此操作。这导致 Oracle VirtualBox 无法接收任何用于拖放的 Windows 消息。为了使其正常工作,Oracle VirtualBox 虚拟机进程必须以与通过拖放进行交互的进程相同的(或更低的)特权级别运行。
不建议禁用 UAC 或 UIPI。
Oracle VirtualBox 利用 Microsoft 组件对象模型 (COM) 进行进程间和进程内通信。这使得 Oracle VirtualBox 能够在不同的虚拟机进程之间共享通用配置,并提供基于通用架构的多个用户界面选项。所有全局状态信息和配置都由进程 VBoxSVC.exe 维护,它是一个进程外 COM 服务器。每当 Oracle VirtualBox 进程启动时,它都会请求访问 COM 服务器,Windows 会自动启动该进程。请注意,最终用户绝不应启动它。
当最后一个进程与 COM 服务器断开连接时,它会在几秒钟后自行终止。Oracle VirtualBox 配置 XML 文件由 COM 服务器维护和拥有,并且在服务器运行时文件会被锁定。
在某些情况下,例如虚拟机意外终止时,COM 服务器不会注意到客户端已断开连接,并会保持活动状态较长时间(大约 10 分钟),从而保持配置文件锁定。在其他罕见情况下,COM 服务器可能会遇到内部错误,随后其他进程无法对其进行初始化。在这些情况下,建议使用 Windows 任务管理器终止 VBoxSVC.exe 进程。
如果您已将物理 CD 或 DVD 驱动器分配给客户机,并且客户机在介质更改时未注意到,请确保 Windows 介质更改通知 (MCN) 功能未关闭。这由 Windows 注册表中的以下键表示
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Cdrom\Autorun
某些应用程序可能会违反 Microsoft 的建议禁用此键。如果它设置为 0,请将其更改为 1 并重新启动系统。Oracle VirtualBox 依赖 Windows 通知其介质更改。
如果使用 Microsoft RDP 客户端(称为远程桌面连接)连接到虚拟机,则输入(例如将鼠标移到菜单上)和输出之间可能会有很大的延迟。这是因为此 RDP 客户端会在将输入发送到 RDP 服务器之前收集输入一段时间。
可以通过将 Windows 注册表项设置为小于默认值 100 的值来减少间隔。该键最初不存在,并且必须是 DWORD 类型。其值的单位是毫秒。20 左右的值适用于 RDP 客户端和服务器之间的低带宽连接。4 左右的值可用于千兆以太网连接。通常,小于 10 的值可以实现与运行虚拟机的宿主机上的本地输入设备和屏幕非常接近的性能。
根据是为单个用户还是为系统更改设置,设置以下任一选项。
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Min Send Interval
HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal Server Client\Min Send Interval
在 Windows 宿主机上,当尝试使用 iSCSI 启动器(例如 Microsoft iSCSI 启动器)访问在客户机虚拟机中运行的 iSCSI 目标时,可能会发生死锁,该 iSCSI 启动器正在宿主机上运行。这是由 Windows 缓存管理器组件中的缺陷引起的,会导致宿主机系统响应迟缓数分钟,然后系统托盘中或单独的消息窗口中显示“延迟写入失败”错误消息。客户机在此期间被阻塞,可能会显示错误消息或变得不稳定。
将 VBOX_DISABLE_HOST_DISK_CACHE
环境变量设置为 1
可以解决此问题,直到 Microsoft 解决该问题。例如,打开命令提示符窗口并像这样启动 Oracle VirtualBox
set VBOX_DISABLE_HOST_DISK_CACHE=1 VirtualBox
虽然这会降低客户机磁盘性能,尤其是写入性能,但它不会影响在主机上运行的其他应用程序的性能。
如果在虚拟机设置的网络部分中没有显示桥接适配器,这通常意味着桥接网络驱动程序未在您的宿主机上正确安装。这可能是由于以下原因
宿主机上达到了最大允许过滤器计数。在这种情况下,MSI 日志会提到在 NetFlt 网络组件安装时返回的 0x8004a029
错误代码,如下所示
VBoxNetCfgWinInstallComponent: Install failed, hr (0x8004a029)
您可以尝试使用以下注册表项增加 Windows 注册表中的最大过滤器计数:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Network\MaxNumFilters
最大允许数量为 14。重新启动后,尝试重新安装 Oracle VirtualBox。
INF 缓存已损坏。在这种情况下,位于 %windir%\inf\setupapi.dev.log 的安装日志通常会提到未能找到适用于 sun_VBoxNetFlt 或 sun_VBoxNetFltmp 组件的合适驱动程序包。解决方案是卸载 Oracle VirtualBox,删除 INF 缓存 (%windir%\inf\INFCACHE.1),重新启动并尝试重新安装 Oracle VirtualBox。
如果无法创建仅宿主机适配器,无论是使用 VirtualBox 管理器 还是 VBoxManage 命令,则 INF 缓存可能已损坏。在这种情况下,位于 %windir%\inf\setupapi.dev.log 的安装日志通常会提到未能找到适用于 sun_VBoxNetAdp 组件的合适驱动程序包。同样,与上述桥接网络问题一样,解决方案是卸载 Oracle VirtualBox,删除 INF 缓存 (%windir%\inf\INFCACHE.1),重新启动并尝试重新安装 Oracle VirtualBox。
如果 Oracle VirtualBox 内核模块 vboxdrv 拒绝加载,您可能会看到 Error inserting vboxdrv: Invalid argument
消息。以 root 身份检查 dmesg 命令的输出,找出加载失败的原因。最可能是内核与用于编译模块的 gcc 版本不一致。请确保您使用与构建内核相同的编译器。
如果您已将虚拟机配置为使用宿主机的 CD 或 DVD 驱动器或软盘驱动器,但似乎无法正常工作,请确保当前用户有权访问相应的 Linux 设备文件。例如,对于 CD 或 DVD 驱动器,这可能是 /dev/hdc、/dev/scd0、/dev/cdrom 或类似的文件。在大多数发行版上,用户必须添加到相应的组中,通常称为 cdrom 或 cdrw 或 floppy。
在受支持的 Linux 发行版上,Oracle VirtualBox 使用 udev 来定位硬件,例如 CD/DVD 驱动器和软盘驱动器。
如果实验性 CD 或 DVD 写入器支持在宿主机或客户机配置不正确的情况下启用,则任何访问 CD 或 DVD 写入器的尝试都可能失败,并简单地导致 Linux 客户机出现内核错误消息或 Windows 客户机出现应用程序错误消息。Oracle VirtualBox 在虚拟机启动时执行常见的一致性检查。特别是,如果 CD 或 DVD 写入器设备对启动虚拟机的用户不可写入,它会中止并显示错误消息。但 Oracle VirtualBox 无法检测所有配置错误。所需的宿主机和客户机操作系统配置并非 Oracle VirtualBox 特有,但此处列出了一些与 Oracle VirtualBox 相关联的常见问题。
必须特别注意使用正确的设备。配置的宿主机 CD 或 DVD 设备文件名(在大多数情况下是 /dev/cdrom)必须指向允许写入 CD 或 DVD 设备的设备。对于连接到 SCSI 控制器或连接到 Linux SCSI 子系统的 IDE 控制器(某些 SATA 控制器常见)的 CD 或 DVD 写入器设备,这必须指 SCSI 设备节点,例如 /dev/scd0。即使对于 IDE CD 或 DVD 写入器设备,如果加载了 ide-scsi 内核模块,这也必须指相应的 SCSI CD-ROM 设备节点,例如 /dev/scd0。对于某些早期的 2.6 内核,CD 或 DVD 写入器支持需要此模块。许多 Linux 发行版只要在系统中检测到 CD 或 DVD 写入器就会加载此模块,即使内核在没有该模块的情况下也支持 CD 或 DVD 写入器。Oracle VirtualBox 支持使用 IDE 设备文件,例如 /dev/hdc,前提是内核支持此功能且未加载 ide-scsi 模块。
除了在客户机中 CD 或 DVD 写入器始终是 IDE 设备之外,类似的规则也适用于客户机配置。由于此设置非常常见,因此客户机的默认配置很可能按预期工作。
在 Linux 上,Oracle VirtualBox 使用定制版本的 Mozilla XPCOM(跨平台组件对象模型)进行进程间和进程内通信 (IPC)。VBoxSVC 进程充当不同 Oracle VirtualBox 进程之间的通信中心,并维护全局配置,例如 XML 数据库。启动 Oracle VirtualBox 组件时,VBoxSVC 和 VBoxXPCOMIPCD 进程会自动启动。它们只能从其运行的用户帐户访问。VBoxSVC 拥有 Oracle VirtualBox 配置数据库,该数据库通常位于 ~/.config/VirtualBox 或适用于您的操作系统的相应配置目录中。在运行时,配置文件会被锁定。各种 Oracle VirtualBox 组件与 VBoxSVC 之间的通信通过位于 /tmp/.vbox-username-ipc 的本地域套接字进行。如果存在通信问题,例如 Oracle VirtualBox 应用程序无法与 VBoxSVC 通信,请终止守护进程并删除本地域套接字目录。
如果 USB 在您的 Linux 宿主机上无法正常工作,请确保当前用户是 vboxusers
组的成员。请记住,组成员身份不会立即生效,而是在下次登录时生效。如果可用,newgrp 命令可以避免注销和重新登录的需要。
包含 grsec 补丁(参见 http://www.grsecurity.net/)的 Linux 内核及其衍生版本必须禁用 VBox 二进制文件的 PAX_MPROTECT 才能启动虚拟机。原因是 Oracle VirtualBox 必须在匿名内存上创建可执行代码。
在 Linux 系统上运行大量内存较大的虚拟机时(例如,20 个虚拟机,每个 1 GB RAM),额外的虚拟机可能无法启动并出现内核错误,提示 vmalloc 池已耗尽,应进行扩展。错误消息还会告诉您在内核参数列表中指定 vmalloc=256MB
。如果将此参数添加到 GRUB 或 LILO 配置中导致内核无法启动,并出现诸如 failed to mount the root partition
之类的错误消息,那么您可能遇到了内核和初始 RAM 磁盘的内存冲突。这可以通过将以下参数添加到您的 GRUB 配置中来解决
uppermem 524288
已知 ZFS 文件系统在不更改默认系统设置的情况下会使用几乎所有可用 RAM 作为缓存。这可能导致宿主机内存严重碎片化,从而阻止 Oracle VirtualBox 虚拟机启动。我们建议通过将以下行添加到 /etc/system 来限制 ZFS 缓存,其中 xxxx 字节是 ZFS 缓存可用的内存量。
set zfs:zfs_arc_max = xxxx