目录
本章提供了常见问题的解答。为了改善您使用 Oracle VM VirtualBox 的体验,建议阅读本节以了解常见陷阱并获取有关如何使用产品的建议。
通常,虚拟化客户机的行为与物理系统相似。物理机可能遇到的任何问题,虚拟机也会遇到。例如,如果由于外部问题导致互联网连接丢失,虚拟机将像物理机一样受到影响。
如果遇到真正的 Oracle VM VirtualBox 问题,首先对问题进行分类和隔离会有所帮助。以下是在报告问题之前应回答的一些问题:
问题是否特定于某个客户机操作系统?或者特定于某个客户机操作系统的特定版本?特别是对于与 Linux 客户机相关的问题,问题可能特定于 Linux 的某个发行版和版本。
问题是否特定于某个主机操作系统?问题通常不是特定于主机操作系统的,因为大多数 Oracle VM VirtualBox 代码库在所有受支持的平台之间共享,但在网络和 USB 支持领域,主机平台之间存在显著差异。一些 GUI 相关问题也是特定于主机的。
问题是否特定于某些主机硬件?这类问题通常与主机 CPU 相关。由于 VT-x 和 AMD-V 之间存在显著差异,问题可能特定于其中一种技术。确切的 CPU 型号也可能有所不同,因为不同的 CPU 支持不同的功能,这可能会影响客户机 CPU 操作的某些方面。
问题是否特定于客户机 SMP?也就是说,它是否与客户机中的虚拟 CPU (VCPU) 数量有关?使用多个 CPU 通常会显著影响客户机操作系统的内部运行。
问题是否特定于增强功能?在某些情况下,这是显而易见的,例如共享文件夹问题。在其他情况下,例如显示问题,可能不那么明显。如果问题特定于增强功能,它是否也特定于某个版本的增强功能?
问题是否特定于某个环境?有些问题与虚拟机外部的特定环境有关。这通常涉及网络设置。外部服务器(如 DHCP 或 PXE)的某些配置可能会暴露在其他类似服务器上不会出现的问题。
问题是否是回归问题?知道某个问题是回归问题通常会使其解决方案更容易找到。在这种情况下,了解哪个版本受到影响以及哪个版本不受影响至关重要。
为了确定问题,通常收集可供 Oracle VM VirtualBox 支持人员分析的调试信息非常重要。本节包含有关可以获取哪些类型的信息的信息。
每次 Oracle VM VirtualBox 启动虚拟机时,都会创建一个所谓的发布日志文件,其中包含大量有关虚拟机配置和运行时事件的信息。该日志文件名为 VBox.log
,默认位于虚拟机日志文件文件夹中,即 $HOME/VirtualBox VMs/
。VM-name
/Logs
启动虚拟机时,上次运行的配置文件将重命名为 .1
,最多到 .3
。有时出现问题时,查看日志很有用。此外,请求 Oracle VM VirtualBox 支持时,提供相应的日志文件是强制性的。
为方便起见,对于每个虚拟机,VirtualBox 管理器可以在一个窗口中显示这些日志。从左侧的机器列表中选择一个虚拟机,然后单击机器工具菜单中的日志。
发布日志文件 VBox.log
包含大量诊断信息,例如主机操作系统类型和版本、Oracle VM VirtualBox 版本和构建。它还包括客户机配置 (CFGM) 的完整转储、有关主机 CPU 类型和支持功能的详细信息、硬件虚拟化是否启用、VT-x/AMD-V 设置信息、状态转换(例如创建、运行、暂停、停止)、客户机 BIOS 消息、增强功能消息、设备特定日志条目以及执行结束时的最终客户机状态和精简统计信息。
在崩溃情况下,收集崩溃转储非常重要。这对于主机和客户机崩溃都适用。有关在 Linux、Oracle Solaris 和 macOS 系统上启用核心转储的信息,请参阅 Oracle VM VirtualBox 网站上的以下核心转储文章:
https://virtualbox.ac.cn/wiki/Core_dump.
您还可以使用 VBoxManage debugvm 创建完整虚拟机的转储。请参见第 8.45 节 “VBoxManage debugvm”。
对于网络相关问题,捕获网络流量的跟踪通常很有帮助。如果流量通过主机上的适配器路由,则可以使用 Wireshark 或类似工具捕获那里的流量。然而,这通常也包括大量与虚拟机无关的流量。
Oracle VM VirtualBox 提供了仅在特定虚拟机的网络适配器上捕获网络流量的功能。有关启用此捕获的信息,请参阅 Oracle VM VirtualBox 网站上的以下网络跟踪文章:
https://virtualbox.ac.cn/wiki/Network_tips.
Oracle VM VirtualBox 创建的跟踪文件采用 .pcap
格式,可以使用 Wireshark 轻松分析。
VBoxBugReport 命令用于自动收集 Oracle VM VirtualBox 安装的调试信息。当您需要收集信息以发送给 Oracle Support 时,此命令会很有用。
以下示例展示了如何使用 VBoxBugReport。
默认情况下,该命令收集 Oracle VM VirtualBox 主机的 VBoxSVC 进程日志、设备设置和全局配置数据。
$ 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 VM VirtualBox 包含一个内置的虚拟机调试器,高级用户可能会觉得它很有用。此调试器使您能够检查并在一定程度上控制虚拟机状态。
使用虚拟机调试器需要自行承担风险。不支持此功能,以下文档仅供对 x86/AMD64 机器指令集非常熟悉以及对 PC 架构有详细了解的高级用户使用。对相关客户机操作系统的内部机制有一定程度的了解也可能非常有帮助。
虚拟机调试器在所有常规生产版本的 Oracle VM VirtualBox 中都可用,但默认情况下它是禁用的,因为普通用户很少使用它。有两种方法可以访问调试器:
使用与虚拟机同时显示的调试器控制台窗口。
使用端口 5000 上的 telnet 协议。
可以通过以下方式启用调试器:
使用 VirtualBoxVM --startvm 直接启动虚拟机,并附加 --dbg
、--debug
或 --debug-command-line
参数。有关详细信息,请参阅 VirtualBoxVM --help 命令用法帮助。
在启动 Oracle VM VirtualBox 进程之前,将 VBOX_GUI_DBG_ENABLED
或 VBOX_GUI_DBG_AUTO_SHOW
环境变量设置为 true
。设置这些变量(只检查它们的存在)即使第一个 Oracle VM VirtualBox 进程是虚拟机选择器窗口也有效。随后从选择器启动的虚拟机将启用调试器。
在启动虚拟机之前,将 GUI/Dbg/Enabled
额外数据项设置为 true
。这可以全局设置,也可以按虚拟机单独设置。
新的调试菜单项已添加到 Oracle VM VirtualBox 应用程序中。此菜单使用户能够打开调试器控制台。
虚拟机调试器命令语法大致模仿了 DOS、OS/2 和 Windows 上使用的 Microsoft 和 IBM 调试器。熟悉 symdeb、CodeView 或 OS/2 内核调试器的用户会发现 Oracle VM VirtualBox 虚拟机调试器很熟悉。
最重要的命令是 help。这将打印所有调试器命令的简要使用帮助。虚拟机调试器支持的命令集经常变化,help 命令始终是最新的。
常用命令的简要总结如下:
stop: 停止虚拟机执行并启用单步执行。
g: 继续虚拟机执行。
t: 单步执行指令。
rg、rh 和 r: 打印客户机、hypervisor 和当前寄存器。
kg、kh 和 k: 打印客户机、hypervisor 和当前调用堆栈。
da、db、dw、dd、dq: 将内存内容打印为 ASCII、字节、字、双字和四字。
u: 反汇编内存。
dg: 打印客户机的 GDT。
di: 打印客户机的 IDT。
dl: 打印客户机的 LDT。
dt: 打印客户机的 TSS。
dp*: 打印客户机的页表结构。
bp 和 br: 设置普通断点和重编译器断点。
bl: 列出断点。
bc: 清除断点。
writecore: 将虚拟机核心文件写入磁盘。请参见第 12.1.5 节 “虚拟机核心转储格式”。
有关其他可用命令,请参见内置的 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 VM VirtualBox VMM 内部机制有深入了解。但是,如果使用得当,所提供的信息可能非常宝贵。
Oracle VM VirtualBox 对其由 VBoxManage debugvm 创建的虚拟机核心文件使用 64 位 ELF 格式,请参见第 8.45 节 “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 VM 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 setextradataVM-name
"VBoxInternal/Devices/piix3ide/0/LUN#[x
]/Config/FlushInterval" [b
]
对于 SATA 磁盘,使用以下命令:
VBoxManage setextradataVM-name
"VBoxInternal/Devices/ahci/0/LUN#[x
]/Config/FlushInterval" [b
]
[
指定磁盘。对于 IDE,x
]0
表示主通道上的设备 0,1
表示主通道上的设备 1,2
表示辅助通道上的设备 0,3
表示辅助通道上的设备 1。对于 SATA,使用介于 0
和 29
之间的值。此配置选项仅适用于磁盘。请勿将此选项用于 CD 或 DVD 驱动器。
间隔的单位 ([
) 是自上次刷新以来写入的字节数。必须选择其值,以便不会发生偶尔的长时间写入延迟。由于适当的刷新间隔取决于主机和主机文件系统的性能,因此找到解决问题的最佳值需要一些实验。1000000 到 10000000(1 到 10 兆字节)之间的值是一个很好的起点。减小间隔会降低问题发生的概率并降低客户机的写入性能。不必要地将值设置得过低会牺牲性能而没有任何好处。间隔设置为 1 将导致每次写入操作都进行刷新,并且在任何情况下都应解决问题,但会带来严重的写入性能损失。b
]
为 [
提供 b
]0
值将被视为无限刷新间隔,从而有效地禁用此解决方法。通过不为 [
指定值来删除额外数据键具有相同的效果。b
]
如果需要,当客户机发出 IDE FLUSH CACHE 命令时,虚拟磁盘镜像可以被刷新。通常这些请求为了提高性能而被忽略。以下参数仅适用于磁盘驱动器。它们不能为 DVD 驱动器设置。
要为 IDE 磁盘启用刷新,请发出以下命令:
$ VBoxManage setextradataVM-name
"VBoxInternal/Devices/piix3ide/0/LUN#[x
]/Config/IgnoreFlush" 0
[
指定磁盘。为主通道上的设备 0 输入 x
]0
,为主通道上的设备 1 输入 1
,为辅助通道上的设备 0 输入 2
,或为辅助通道上的设备 1 输入 3
。
要为 SATA 磁盘启用刷新,请发出以下命令:
$ VBoxManage setextradata VM-name
"VBoxInternal/Devices/ahci/0/LUN#[x]/Config/IgnoreFlush" 0
选择磁盘的值 [x] 可以是 0 到 29 之间的值。
请注意,这不会影响根据第 12.2.1 节 “客户机在慢速主机文件系统上显示基于文件的镜像的 IDE/SATA 错误”中描述的配置执行的刷新。通过将值设置为 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 的磁盘镜像复制到设置与原始机器不同的新创建虚拟机,则可能会发生这种情况。
这尤其适用于以下设置:
ACPI 和 I/O APIC 设置在安装 Windows 后绝不能更改。根据这些硬件功能的存在,Windows 安装程序会选择特殊的内核和设备驱动程序版本,如果这些硬件功能被移除,则将无法启动。为未安装这些功能的 Windows 虚拟机启用它们不会造成任何损害。但是,在这种情况下,Windows 将不会使用这些功能。
更改存储控制器硬件也会导致启动失败。如果您将磁盘镜像从旧版本的 Oracle VM VirtualBox 复制到新的虚拟机,这也可能适用于您。Oracle VM 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 VM VirtualBox 提供了一种在客户机想要执行重置时暂停客户机的方法。为了启用此功能,请使用以下命令:
$ VBoxManage setextradata VM-name
"VBoxInternal/PDM/HaltOnReset" 1
在 Windows Vista 中,Microsoft 放弃了对 AMD PCNet 网卡的支持,而旧版 Oracle VM VirtualBox 曾将其作为默认虚拟网卡提供。对于 Windows Vista 客户机,Oracle VM VirtualBox 现在默认使用 Intel E1000 网卡。
如果出于某种原因,您仍然想使用 AMD 网卡,则需要从 AMD 网站下载 PCNet 驱动程序。此驱动程序仅适用于 32 位 Windows。您可以使用共享文件夹将其传输到虚拟机中。请参见第 4.3 节 “共享文件夹”。
Windows 客户机的几个后台应用程序,尤其是病毒扫描程序,即使客户机看起来处于空闲状态,也已知会显著增加 CPU 负载。我们建议如果可能,在虚拟化客户机中禁用病毒扫描程序。
由于在解析 Oracle VM VirtualBox 共享文件夹名称服务期间出现延迟,从 Windows 客户机访问共享文件夹的性能可能会下降。要解决这些延迟,请将以下条目添加到 Windows 客户机的 \windows\system32\drivers\etc\lmhosts
文件中:
255.255.255.255 VBOXSVR #PRE 255.255.255.255 VBOXSRV #PRE
进行此更改后,需要重新启动客户机。
如果 Windows 98 虚拟机配置为使用模拟 USB 平板电脑(绝对定位设备),则坐标转换可能不正确,并且指针被限制在客户机屏幕的左上角四分之一区域。
Windows 98 中的 USB HID(人机接口设备)驱动程序非常老旧,并且不像现代操作系统那样处理平板电脑。为了解决此问题,请使用以下命令:
$ VBoxManage setextradata VM-name
"VBoxInternal/USB/HidMouse/0/Config/CoordShift" 0
要恢复默认行为,请删除该键或将其值设置为 1。
如果 Windows 客户机是 Active Directory 域的成员,并且使用了 Oracle VM VirtualBox 的快照功能,则在您恢复旧快照后,它可能会从 Active Directory 域中移除。
这是由 Windows 出于安全目的定期执行的自动机器密码更改引起的。您可以按照 Microsoft 的以下文章所示禁用此功能:http://support.microsoft.com/kb/154501。
Windows 3.x 客户机通常被限制为 64 MB 内存,即使虚拟机分配了更多内存。虽然 Windows 3.1 理论上能够使用高达 512 MB 内存,但它只使用通过 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 内核,以及 CentOS 和 Oracle Linux 等相关 Linux 发行版的内核,支持内核参数divider=N。因此,此类内核支持较低的定时器频率而无需重新编译。我们建议您添加内核参数divider=10以选择 100Hz 的客户机内核定时器频率。
Linux 内核中的以下错误阻止它们在 Oracle VM VirtualBox 中正确执行,导致虚拟机引导崩溃:
Linux 内核版本 2.6.18 和某些 2.6.17 版本引入了一个竞争条件,可能导致 Oracle VM 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
如果您看到此消息,请按照第 3.5 节 “系统设置”中的说明禁用硬件虚拟化或 I/O APIC,或者将客户机升级到较新的内核。
有关内核修复的详细信息,请参见 http://www.mail-archive.com/git-commits-head@vger.kernel.org/msg30813.html。
在运行 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 VM VirtualBox 虚拟机进程以比另一个想要通过拖放(或系统剪贴板)与虚拟机进程交互的进程更高的特权级别运行时,Windows 会出于安全原因默认阻止此操作。这导致 Oracle VM VirtualBox 无法接收任何用于拖放的 Windows 消息。要使其工作,Oracle VM VirtualBox 虚拟机进程必须以与通过拖放交互的进程相同的(或更低)特权级别运行。不建议禁用 UAC 和/或 UIPI。
Oracle VM VirtualBox 利用 Microsoft 组件对象模型 (COM) 进行进程间和进程内通信。这使得 Oracle VM VirtualBox 能够在不同的虚拟机进程之间共享公共配置,并基于通用架构提供多个用户界面选项。所有全局状态信息和配置都由进程 VBoxSVC.exe
维护,该进程是一个进程外 COM 服务器。每当启动 Oracle VM VirtualBox 进程时,它都会请求访问 COM 服务器,并且 Windows 会自动启动该进程。请注意,用户不应手动启动它。
当最后一个进程与 COM 服务器断开连接时,它将在几秒钟后自行终止。Oracle VM 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 VM 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 目标时,可能会发生死锁。这是由 Windows 缓存管理器组件中的缺陷引起的,会导致主机系统响应迟钝几分钟,然后系统托盘或单独的消息窗口中显示“延迟写入失败”错误消息。客户机在此期间被阻塞,并可能显示错误消息或变得不稳定。
将 VBOX_DISABLE_HOST_DISK_CACHE
环境变量设置为 1
可以解决此问题,直到 Microsoft 解决该问题。例如,打开命令提示符窗口并像这样启动 Oracle VM 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 VM VirtualBox。
INF 缓存已损坏。在这种情况下,%windir%\inf\setupapi.dev.log
中的安装日志通常会提到未能找到适用于 sun_VBoxNetFlt 或 sun_VBoxNetFltmp 组件的合适驱动程序包。解决方案是卸载 Oracle VM VirtualBox,删除 INF 缓存(%windir%\inf\INFCACHE.1
),重新启动并尝试重新安装 Oracle VM VirtualBox。
如果 Oracle VM 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 VM VirtualBox 使用 udev 来定位硬件,例如 CD/DVD 驱动器和软盘驱动器。
如果启用了实验性 CD 或 DVD 写入器支持,但主机或客户机配置不正确,则任何访问 CD 或 DVD 写入器的尝试都可能失败,并简单地导致 Linux 客户机的内核错误消息或 Windows 客户机的应用程序错误消息。Oracle VM VirtualBox 在虚拟机启动时执行常见的一致性检查。特别是,如果 CD 或 DVD 写入器的设备不可由启动虚拟机的用户写入,它将中止并显示错误消息。但 Oracle VM VirtualBox 无法检测所有错误配置。必要的主机和客户机操作系统配置并非 Oracle VM VirtualBox 特有,但此处列出了一些与 Oracle VM 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 写入器。只要内核支持此功能且未加载 ide-scsi 模块,Oracle VM VirtualBox 就支持使用 IDE 设备文件,例如 /dev/hdc
。
除了在客户机中 CD 或 DVD 写入器始终是 IDE 设备之外,类似的规则也适用于客户机配置。由于此设置非常常见,因此客户机的默认配置很可能按预期工作。
在 Linux 上,Oracle VM VirtualBox 使用 Mozilla XPCOM(跨平台组件对象模型)的自定义版本进行进程间和进程内通信 (IPC)。进程 VBoxSVC 用作不同 Oracle VM VirtualBox 进程之间的通信中心并维护全局配置,例如 XML 数据库。启动 Oracle VM VirtualBox 组件时,进程 VBoxSVC 和 VBoxXPCOMIPCD 会自动启动。它们只能从它们运行的用户帐户访问。VBoxSVC 拥有 Oracle VM VirtualBox 配置数据库,该数据库通常位于 ~/.config/VirtualBox
或您的操作系统的相应配置目录中。在它运行时,配置文件被锁定。Oracle VM VirtualBox 各组件与 VBoxSVC 之间的通信通过位于 /tmp/.vbox-
的本地域套接字进行。如果存在通信问题,例如 Oracle VM VirtualBox 应用程序无法与 VBoxSVC 通信,请终止守护进程并删除本地域套接字目录。username
-ipc
如果 USB 在您的 Linux 主机上不工作,请确保当前用户是 vboxusers
组的成员。请记住,组成员身份不会立即生效,而是在下次登录时生效。如果可用,newgrp 命令可以避免注销和登录的需要。
包含 grsec 补丁的 Linux 内核(参见 http://www.grsecurity.net/)及其派生版本必须禁用 VBox 二进制文件的 PAX_MPROTECT 才能启动虚拟机。原因是 Oracle VM VirtualBox 必须在匿名内存上创建可执行代码。
在 Linux 系统上运行大量具有大量内存的虚拟机时,例如 20 个虚拟机,每个虚拟机 1 GB 内存,额外的虚拟机可能无法启动,并出现内核错误,称 vmalloc 池已耗尽,应该扩展。错误消息还会告诉您在内核参数列表中指定 vmalloc=256MB
。如果将此参数添加到 GRUB 或 LILO 配置中导致内核无法启动,并出现类似 failed to mount the root partition
的错误消息,那么您可能遇到了内核和初始 RAM 磁盘的内存冲突。这可以通过将以下参数添加到 GRUB 配置来解决:
uppermem 524288