第九章. 高级主题

目录

9.1. 自动来宾登录
9.1.1. 自动 Windows 来宾登录
9.1.2. 自动 Linux 和 UNIX 来宾登录
9.2. Windows 来宾的高级配置
9.2.1. 自动 Windows 系统准备
9.3. Linux 和 Oracle Solaris 来宾的高级配置
9.3.1. Linux 上选定来宾服务的手动设置
9.3.2. 来宾图形和鼠标驱动程序深入设置
9.4. CPU 热插拔
9.5. 摄像头直通
9.5.1. 在来宾中使用主机摄像头
9.5.2. Windows 主机
9.5.3. macOS 主机
9.5.4. Linux 和 Oracle Solaris 主机
9.6. 高级显示配置
9.6.1. 自定义 VESA 分辨率
9.6.2. 使用图形前端时配置来宾机的最大分辨率
9.7. 高级存储配置
9.7.1. 从来宾机使用裸主机硬盘
9.7.2. 配置硬盘厂商产品数据 (VPD)
9.7.3. 使用内部网络访问 iSCSI 目标
9.8. 精细调整 Oracle VM VirtualBox NAT 引擎
9.8.1. 配置 NAT 网络接口的地址
9.8.2. 配置 NAT 网络接口的引导服务器 (下一个服务器)
9.8.3. 调整 NAT 的 TCP/IP 缓冲区
9.8.4. 将 NAT 套接字绑定到特定接口
9.8.5. 在 NAT 模式下启用 DNS 代理
9.8.6. 在 NAT 模式下使用主机的解析器作为 DNS 代理
9.8.7. 配置 NAT 引擎的别名
9.9. 配置 BIOS DMI 信息
9.10. 配置自定义 ACPI 表
9.11. 精细调整定时器和时间同步
9.11.1. 配置来宾时间戳计数器 (TSC) 以反映来宾执行
9.11.2. 加速或减慢来宾时钟
9.11.3. 调整增强功能时间同步参数
9.11.4. 禁用增强功能时间同步
9.12. 在 Oracle Solaris 11 主机上安装备用桥接网络驱动程序
9.13. 适用于 Oracle Solaris 11 主机上 VLAN 的 Oracle VM VirtualBox VNIC 模板
9.14. 在 Oracle Solaris 主机上配置多个仅主机网络接口
9.15. 在 Oracle Solaris 主机上配置 Oracle VM VirtualBox CoreDumper
9.16. Oracle VM VirtualBox 和 Oracle Solaris 内核区域
9.17. 锁定 VirtualBox 管理器
9.17.1. 自定义 VirtualBox 管理器
9.17.2. 虚拟机选择器自定义
9.17.3. 配置虚拟机选择器菜单项
9.17.4. 配置虚拟机窗口菜单项
9.17.5. 配置虚拟机窗口状态栏项
9.17.6. 配置虚拟机窗口视觉模式
9.17.7. 主机键自定义
9.17.8. 终止虚拟机时的操作
9.17.9. 终止虚拟机的默认操作
9.17.10. 处理 Guru Meditation 的操作
9.17.11. 配置自动鼠标捕获
9.17.12. 请求传统全屏模式
9.17.13. 从 GUI 中移除某些网络模式
9.18. 自动启动 Oracle VM VirtualBox Web 服务
9.18.1. Linux: 使用 init 启动 Web 服务
9.18.2. Oracle Solaris: 使用 SMF 启动 Web 服务
9.18.3. macOS: 使用 launchd 启动 Web 服务
9.19. Oracle VM VirtualBox 看门狗
9.19.1. 内存气球控制
9.19.2. 主机隔离检测
9.19.3. 更多信息
9.19.4. Linux: 使用 init 启动看门狗服务
9.19.5. Oracle Solaris: 使用 SMF 启动看门狗服务
9.20. 其他扩展包
9.21. 系统启动时启动虚拟机
9.21.1. Linux: 使用 init 启动自动启动服务
9.21.2. Oracle Solaris: 使用 SMF 启动自动启动服务
9.21.3. macOS: 使用 launchd 启动自动启动服务
9.21.4. Windows: 启动自动启动服务
9.22. 虚拟机加密
9.22.1. 虚拟机加密的限制
9.22.2. 加密虚拟机
9.22.3. 打开加密的虚拟机
9.22.4. 解密加密的虚拟机
9.23. Oracle VM VirtualBox 专家存储管理
9.24. 主机电源管理事件处理
9.25. 直通 SSE4.1/SSE4.2 指令
9.26. 支持键盘指示器同步
9.27. 捕获选定设备的 USB 流量
9.28. 配置心跳服务
9.29. 磁盘映像加密
9.29.1. 磁盘加密的限制
9.29.2. 加密磁盘映像
9.29.3. 启动带有加密映像的虚拟机
9.29.4. 解密加密映像
9.30. 半虚拟化调试
9.30.1. Hyper-V 调试选项
9.31. PC 扬声器直通
9.32. 通过 USB/IP 访问通过网络公开的 USB 设备
9.32.1. 在 Linux 系统上设置 USB/IP 支持
9.32.2. 安全注意事项
9.33. 将 Hyper-V 与 Oracle VM VirtualBox 配合使用
9.34. 嵌套虚拟化
9.35. VBoxSVC 在 Windows Session 0 中运行
9.35.1. 已知问题
9.36. VISO 文件格式 / RTIsoMaker

9.1. 自动来宾登录

Oracle VM VirtualBox 为 Windows、Linux 和 Oracle Solaris 提供增强功能模块,以实现在来宾机上自动登录。

当来宾操作系统在虚拟机中运行时,可能需要使用从主机传递的凭据进行协调和自动登录。凭据包括用户名、密码和域名,其中每个值都可以为空。

9.1.1. 自动 Windows 来宾登录

Windows 提供了一个模块化系统登录子系统,称为 Winlogon,可以通过 GINA(图形识别和认证)模块进行自定义和扩展。在 Windows Vista 及更高版本中,GINA 模块被一种称为凭据提供程序的新机制取代。Oracle VM VirtualBox 针对 Windows 的增强功能附带了 GINA 和凭据提供程序模块,因此可以使任何 Windows 来宾机执行自动登录。

要激活 Oracle VM VirtualBox GINA 或凭据提供程序模块,请使用命令行开关 /with_autologon 安装增强功能。安装这些模块所需的所有后续手动步骤都将由安装程序完成。

要手动安装 Oracle VM VirtualBox GINA 模块,请按照第 4.2.1.4 节,“手动文件提取”所示提取增强功能,并将 VBoxGINA.dll 文件复制到 Windows SYSTEM32 目录。在注册表中,创建以下键,其值为 VBoxGINA.dll

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\GinaDLL

注意

Oracle VM VirtualBox GINA 模块是作为 MSGINA.DLL 标准 Windows GINA 模块的包装器实现的。因此,它可能无法与第三方 GINA 模块正确配合使用。

要手动安装 Oracle VM VirtualBox 凭据提供程序模块,请按照第 4.2.1.4 节,“手动文件提取”所示提取增强功能,并将 VBoxCredProv.dll 文件复制到 Windows SYSTEM32 目录。在注册表中,创建以下键

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\
Authentication\Credential Providers\{275D3BCC-22BB-4948-A7F6-3A3054EBA92B}

HKEY_CLASSES_ROOT\CLSID\{275D3BCC-22BB-4948-A7F6-3A3054EBA92B}

HKEY_CLASSES_ROOT\CLSID\{275D3BCC-22BB-4948-A7F6-3A3054EBA92B}\InprocServer32

所有默认值(名为 Default 的键)必须设置为 VBoxCredProv

创建以下字符串并为其分配值 Apartment

HKEY_CLASSES_ROOT\CLSID\{275D3BCC-22BB-4948-A7F6-3A3054EBA92B}\InprocServer32\ThreadingModel

要设置凭据,请在正在运行的虚拟机上使用以下命令

$ VBoxManage controlvm "Windows XP" setcredentials "John Doe" "secretpassword" "DOMTEST"

当虚拟机运行时,Oracle VM VirtualBox 登录模块(GINA 或凭据提供程序)可以使用 Oracle VM VirtualBox 增强功能设备驱动程序查询凭据。当 Windows 处于注销模式时,登录模块将不断轮询凭据,如果凭据存在,将尝试登录。检索凭据后,登录模块将清除它们,因此对于后续登录,必须重复上述命令。

出于安全原因,凭据不会以任何持久方式存储,并且在虚拟机重置时会丢失。此外,凭据是只写的。无法从主机端检索凭据。凭据可以通过设置空值从主机端重置。

根据 Windows 客户机版本,适用以下限制

  • 对于Windows XP 来宾机。登录子系统需要配置为使用经典登录对话框,因为 Oracle VM VirtualBox GINA 模块不支持 Windows XP 风格的欢迎对话框。

  • Windows Vista、Windows 7、Windows 8 和 Windows 10 来宾机。登录子系统不支持所谓的安全注意序列 Ctrl+Alt+Del。因此,需要更改来宾机的组策略设置以不使用安全注意序列。此外,给定的用户名仅与真实用户名进行比较,而不是与用户友好名称进行比较。这意味着当您重命名用户时,仍然必须提供原始用户名,因为 Windows 从不在内部重命名用户帐户。

  • 默认情况下,内置的Windows 远程桌面服务(以前称为终端服务)的自动登录处理已禁用。要启用它,请创建以下注册表键,其 DWORD 值为 1

    HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions\AutoLogon

以下命令强制 Oracle VM VirtualBox 在凭据被来宾机读取后以及虚拟机重置时保留凭据

$ VBoxManage setextradata "Windows XP" VBoxInternal/Devices/VMMDev/0/Config/KeepCredentials 1

请注意,这存在潜在的安全风险,因为在客户机上运行的恶意应用程序可能会使用适当的接口请求此信息。

9.1.2. 自动 Linux 和 UNIX 来宾登录

Oracle VM VirtualBox 提供了一个自定义 PAM 模块(可插入认证模块),可用于在支持此框架的平台上执行自动来宾登录。几乎所有现代 Linux 和 UNIX 发行版都依赖 PAM。

有关使用 LightDM 作为显示管理器的 Ubuntu 或 Ubuntu 派生发行版上的自动登录,请参阅第 9.1.2.1 节,“适用于 Ubuntu/LightDM 的 Oracle VM VirtualBox 问候模块”

pam_vbox.so 模块本身不会对传递给来宾操作系统的凭据进行实际验证。相反,它依赖于 PAM 堆栈中的其他模块(例如 pam_unix.sopam_unix2.so)来使用 pam_vbox.so 检索到的凭据进行实际验证。因此,pam_vbox.so 必须位于认证 PAM 服务列表的顶部。

注意

pam_vbox.so 模块仅支持 auth 原语。不支持 accountsessionpassword 等其他原语。

pam_vbox.so 模块作为增强功能的一部分提供,但默认情况下不会在来宾操作系统上安装和/或激活。要安装它,必须将其从 /opt/VBoxGuestAdditions-version/other/ 复制到安全模块目录。这通常是 32 位 Linux 来宾机上的 /lib/security/ 或 64 位 Linux 来宾机上的 /lib64/security/。有关正确的 PAM 模块目录,请参阅您的来宾操作系统文档。

例如,要将 pam_vbox.so 与 Ubuntu Linux 来宾操作系统和 GNOME 桌面管理器 (GDM) 配合使用,以使用主机传递的凭据自动登录用户,请按如下配置来宾操作系统

  1. pam_vbox.so 模块复制到安全模块目录。在本例中为 /lib/security

  2. 编辑 GDM 的 PAM 配置文件,该文件位于 /etc/pam.d/gdm。在顶部添加行 auth requisite pam_vbox.so。此外,在大多数 Linux 发行版中,有一个名为 /etc/pam.d/common-auth 的文件。此文件包含在许多其他服务中,例如上面提到的 GDM 文件。您还需要在此处添加行 auth requisite pam_vbox.so

  3. 如果需要使用 pam_unix.sopam_unix2.so 对影子数据库进行身份验证,则需要为 pam_unix.so 提供参数 try_first_pass 或为 pam_unix2.so 提供参数 use_first_pass,以便将凭据从 Oracle VM VirtualBox 模块传递到影子数据库身份验证模块。对于 Ubuntu,这需要添加到 /etc/pam.d/common-auth 中,位于引用 pam_unix.so 的行的末尾。此参数告诉 PAM 模块使用堆栈中已存在的凭据,例如 Oracle VM VirtualBox PAM 模块提供的凭据。

警告

配置不正确的 PAM 堆栈可能会有效地阻止您登录到客户机系统。

为了简化部署,您可以在 pam_vbox.so 语句之后立即传递参数 debug。然后调试日志输出将使用 syslog 记录。

注意

默认情况下,pam_vbox 不会等待凭据从主机到达。当显示登录提示时(例如,由 GDM/KDM 或文本控制台显示),如果pam_vbox 尚未获得凭据,它不会等到它们到达。相反,PAM 堆栈中的下一个模块,根据 PAM 配置,将有机会进行身份验证。

pam_vbox 支持位于 /VirtualBox/GuestAdd/PAM/ 中的各种来宾属性参数。这些参数允许pam_vbox 等待主机提供凭据,并且可以选择在等待期间显示消息。可以设置以下来宾属性

  • CredsWait: 设置为 1 表示pam_vbox 应开始等待,直到凭据从主机到达。在此之前,其他身份验证方法(如手动登录)将不可用。如果此属性为空或被删除,则不会执行凭据等待,并且pam_vbox 将像以前一样运行。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • CredsWaitAbort: 当设置为任何值时,中止等待凭据。可以从主机和来宾机设置。

  • CredsWaitTimeout: pam_vbox 等待凭据到达的超时时间(以秒为单位)。如果在此超时时间内没有凭据到达,则pam_vbox 的身份验证将设置为失败,并且将询问链中的下一个 PAM 模块。如果未指定此属性,或将其设置为 0 或无效值,则将使用无限超时。此属性必须设置为来宾只读 (RDONLYGUEST)。

为了进一步自定义pam_vbox,还有以下来宾属性

  • CredsMsgWaiting: 当 pam_vbox 等待来自主机的凭据时显示的自定义消息。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • CredsMsgWaitTimeout: 当pam_vbox 等待凭据超时时显示的自定义消息。例如,它们未在规定时间内到达。此属性必须设置为来宾只读 (RDONLYGUEST)。

注意

如果 pam_vbox 来宾属性未设置正确的标志 (RDONLYGUEST),则该属性将被忽略,并且根据属性,将使用默认值。这可能导致 pam_vbox 不等待凭据。有关更多信息,请查阅相应的 syslog 文件并使用 debug 选项。

9.1.2.1. 适用于 Ubuntu/LightDM 的 Oracle VM VirtualBox 问候模块

Oracle VM VirtualBox 附带一个名为vbox-greeter 的问候模块,可与 LightDM 配合使用。LightDM 是 Ubuntu Linux 的默认显示管理器,因此也可用于自动来宾登录。

vbox-greeter 不需要第 9.1.2 节,“自动 Linux 和 UNIX 来宾登录”中描述的pam_vbox 模块即可运行。它自带 LightDM 提供的身份验证机制。但是,为了提供最大的灵活性,这两个模块可以一起在同一个来宾机上使用。

pam_vbox 模块一样,vbox-greeter 作为增强功能的一部分提供,但默认情况下不会在来宾操作系统上安装或激活。要在安装增强功能时自动安装vbox-greeter,请在启动VBoxLinuxAdditions.run 文件时使用 --with-autologon 选项

# ./VBoxLinuxAdditions.run -- --with-autologon

对于手动或推迟安装,请将 vbox-greeter.desktop 文件从 /opt/VBoxGuestAdditions-<version>/other/ 复制到 xgreeters 目录,该目录通常是 /usr/share/xgreeters/。有关正确的 LightDM 问候目录的名称,请参阅您的来宾操作系统文档。

vbox-greeter 模块由 Oracle VM VirtualBox 增强功能安装程序安装,位于 /usr/sbin/。要将vbox-greeter 启用为标准问候模块,请按如下编辑文件 /etc/lightdm/lightdm.conf

[SeatDefaults]
greeter-session=vbox-greeter

注意

  • LightDM 服务器必须完全重启才能将vbox-greeter 用作默认问候模块。作为 Ubuntu 上的 root 用户,运行service lightdm --full-restart 或重启来宾机。

  • vbox-greeter 独立于您选择的图形会话,例如 Gnome、KDE 或 Unity。但是,vbox-greeter 确实需要 FLTK 1.3 或更高版本来实现其自己的用户界面。

有许多来宾属性可用于进一步自定义登录体验。对于自动登录用户,适用的来宾属性与pam_vbox 相同。请参阅第 9.1.2 节,“自动 Linux 和 UNIX 来宾登录”

除了前面提到的来宾属性,vbox-greeter 还允许您进一步自定义其用户界面。以下来宾属性位于 /VirtualBox/GuestAdd/Greeter/ 目录中

  • HideRestart: 设置为 1 表示vbox-greeter 应该隐藏重启来宾机的按钮。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • HideShutdown: 设置为 1 表示vbox-greeter 应该隐藏关闭来宾机的按钮。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • BannerPath: .PNG 文件的路径,用作问候模块顶部的横幅图像。图像大小必须为 460 x 90 像素,任何位深度。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • UseTheming: 设置为 1 以启用以下主题选项。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • Theme/BackgroundColor: 背景的十六进制 RRGGBB 颜色。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • Theme/LogonDialog/HeaderColor: 标题文本的十六进制 RRGGBB 前景色。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • Theme/LogonDialog/BackgroundColor: 登录对话框背景的十六进制 RRGGBB 颜色。此属性必须设置为来宾只读 (RDONLYGUEST)。

  • Theme/LogonDialog/ButtonColor: 登录对话框按钮的十六进制 RRGGBB 背景颜色。此属性必须设置为来宾只读 (RDONLYGUEST)。

注意

上述来宾属性的限制与 pam_vbox 部分中指定的限制相同。

9.2. Windows 来宾的高级配置

9.2.1. 自动 Windows 系统准备

Microsoft 提供了一个名为 Sysprep 的系统准备工具,用于准备 Windows 系统以进行部署或重新分发。某些 Windows 版本在安装介质中包含 Sysprep,但该工具也可从 Microsoft 网站下载。在大多数 Windows 版本的标准安装中,Sysprep 都包含在内。Sysprep 主要由一个名为sysprep.exe 的可执行文件组成,用户调用它以将 Windows 安装置于准备模式。

增强功能提供了一种在来宾操作系统上以自动化方式启动系统准备的方法,该方法由主机系统控制。有关如何使用此功能的详细信息,请参阅第 4.9 节,“应用程序的来宾控制”,其中将特殊标识符 sysprep 作为要执行的程序,以及用户名 sysprep 和密码 sysprep 作为凭据。然后以所需的系统权限启动 Sysprep。

注意

无法指定sysprep.exe 的位置。而是根据 Windows 版本使用以下路径

  • Windows XP 及更早版本为 C:\sysprep\sysprep.exe

  • Windows Vista 及更高版本为 %WINDIR%\System32\sysprep\sysprep.exe

Guest Additions 将自动使用适当的路径执行系统准备工具。

9.3. Linux 和 Oracle Solaris 来宾的高级配置

9.3.1. Linux 上选定来宾服务的手动设置

Oracle VM VirtualBox 增强功能包含几种不同的驱动程序。如果您不想配置所有这些驱动程序,请使用以下命令安装增强功能

$ sh ./VBoxLinuxAdditions.run no_setup

运行此脚本后,以 root 用户身份运行rcvboxadd setup 命令以编译内核模块。

在某些 64 位来宾机上,您必须将 lib 替换为 lib64。在不运行udev 服务的老旧来宾机上,您必须将vboxadd 服务添加到默认运行级别,以确保模块已加载。

要设置时间同步服务,请将vboxadd-service 服务添加到默认运行级别。要设置增强功能的 X11 和 OpenGL 部分,请运行rcvboxadd-x11 setup 命令。请注意,您不需要启用额外的服务。

使用rcvboxadd setup 重新编译来宾内核模块。

编译后,重新启动客户机以确保加载新模块。

9.3.2. 来宾图形和鼠标驱动程序深入设置

本节假定您熟悉使用 xorg.conf 配置 X.Org 服务器,以及可选地使用 hal 或 udev 和 xorg.conf.d 的较新机制。如果不熟悉,您可以通过学习 X.Org 附带的文档来了解它们。

Oracle VM VirtualBox 增强功能包含 X.Org 的驱动程序。默认情况下,这些驱动程序位于以下目录中

/opt/VBoxGuestAdditions-version/other/

X 服务器的正确版本将符号链接到 X.Org 驱动程序目录中。

为了使图形集成正常工作,X 服务器必须加载 vboxvideo 驱动程序。许多最新版本的 X 服务器在检测到它们在 Oracle VM VirtualBox 中运行时会自动查找它。为了获得最佳用户体验,必须加载来宾内核驱动程序,并且增强功能工具VBoxClient 必须作为客户端在 X 会话中运行。

为了使鼠标集成正常工作,必须加载来宾内核驱动程序。此外,对于传统 X 服务器,必须加载正确的 vboxmouse 驱动程序并将其与 /dev/mouse/dev/psaux 相关联。对于大多数来宾机,必须加载 PS/2 鼠标的驱动程序,并且正确的 vboxmouse 驱动程序必须与 /dev/vboxguest 相关联。

Oracle VM VirtualBox 来宾图形驱动程序可以使用任何图形配置,只要虚拟分辨率适合分配给虚拟机的虚拟显存(减去来宾驱动程序使用的少量内存),如第 3.6 节,“显示设置”所述。驱动程序将为所有活动的来宾显示器提供一系列标准模式,至少达到默认来宾分辨率。默认模式可以通过将输出属性 VBOX_MODE 设置为“<宽度>x<高度>”来更改,适用于任何来宾显示器。当 VBoxClient 和内核驱动程序处于活动状态时,这会在主机请求模式更改时自动完成。旧版本的驱动程序只能通过定期查询主机请求来接收新模式。

对于 1.3 版本之前的传统 X 服务器,您还可以将自己的模式添加到 X 服务器配置文件中。将它们添加到“Screen”部分的“Display”子节中的“Modes”列表。例如,以下部分添加了一个自定义的 2048x800 分辨率模式

Section "Screen"
        Identifier    "Default Screen"
        Device        "VirtualBox graphics card"
        Monitor       "Generic Monitor"
        DefaultDepth  24
        SubSection "Display"
                Depth         24
                Modes         "2048x800" "800x600" "640x480"
        EndSubSection
EndSection

9.4. CPU 热插拔

对于运行现代服务器操作系统的虚拟机,Oracle VM VirtualBox 支持 CPU 热插拔。

在物理计算机上,CPU 热插拔意味着可以在机器运行时添加或移除 CPU。Oracle VM VirtualBox 支持在虚拟机运行时添加和移除虚拟 CPU。

CPU 热插拔仅适用于支持此功能的来宾操作系统。目前这仅适用于 Linux 和 Windows Server。Windows 仅支持热添加,而 Linux 支持热添加和热移除。要将此功能与超过 8 个 CPU 配合使用,需要 64 位 Linux 来宾机。

CPU 热插拔使用VBoxManage 命令行界面完成。首先,需要为虚拟机启用热插拔

$ VBoxManage modifyvm VM-name --cpu-hotplug on

--cpus 选项用于指定虚拟机可以拥有的最大 CPU 数量

$ VBoxManage modifyvm VM-name --cpus 8

当虚拟机关闭时,您可以使用VBoxManage modifyvm --plug-cpuVBoxManage modifyvm --unplug-cpu 命令添加和移除虚拟 CPU,这些命令将虚拟 CPU 的编号作为参数,如下所示

$ VBoxManage modifyvm VM-name --plug-cpu 3
$ VBoxManage modifyvm VM-name --unplug-cpu 3

请注意,CPU 0 永远无法移除。

当虚拟机运行时,可以使用VBoxManage controlvm plugcpuVBoxManage controlvm unplugcpu 命令添加和移除 CPU,如下所示

$ VBoxManage controlvm VM-name plugcpu 3
$ VBoxManage controlvm VM-name unplugcpu 3

有关详细信息,请参阅第 8.10 节,“VBoxManage modifyvm”第 8.20 节,“VBoxManage controlvm”

对于 Linux 客户机,适用以下情况

为防止 CPU 在仍在使用时被弹出,必须先从来宾机内部将其弹出。Linux 增强功能包含一个接收热移除事件并弹出 CPU 的服务。此外,将 CPU 添加到虚拟机后,Linux 不会自动使用它。如果安装了 Linux 增强功能服务,它将处理此事。否则,可以使用以下命令启动 CPU

$ echo 1 > /sys/devices/system/cpu/cpu<id>/online

9.5. 摄像头直通

9.5.1. 在来宾中使用主机摄像头

Oracle VM VirtualBox 包含一个名为摄像头直通的功能,它使来宾机能够使用主机摄像头。这补充了通用 USB 直通支持,这是在旧版本中使用主机摄像头的典型方式。摄像头直通支持理论上可以处理非 USB 视频源,但这完全未经测试。

注意

摄像头直通模块作为 Oracle VM VirtualBox 扩展包的一部分提供,必须单独安装。请参阅第 1.5 节,“安装 Oracle VM VirtualBox 和扩展包”

主机摄像头可以使用虚拟机菜单栏中的设备菜单连接到虚拟机。摄像头菜单包含主机上可用视频输入设备的列表。单击摄像头名称将连接或分离相应的主机设备。

可以使用VBoxManage 命令行工具启用摄像头直通。请参阅下面的主机特定部分以获取更多详细信息。以下命令可用

  • 获取主机网络摄像头或其他视频输入设备的列表

    $ VBoxManage list webcams

    输出格式如下

    alias "user friendly name"
    host path or identifier

    别名可以在其他命令中用作快捷方式。别名“.0”表示主机上的默认视频输入设备。别名“.1”、“.2”表示第一个、第二个视频输入设备,依此类推。设备顺序是主机特定的。

  • 将网络摄像头连接到正在运行的 VM,如下所示

    VBoxManage controlvm VM name webcam attach [host_path|alias [settings]]

    这将 USB 网络摄像头设备连接到客户机。

    settings 参数是一个字符串 Setting1=Value1;Setting2=Value2,它使您能够配置模拟摄像头设备。支持以下设置

    • MaxFramerate: 视频帧发送到来宾机的最高速率。更高的帧速率需要更多的 CPU 功率。因此,有时设置较低的限制很有用。默认情况下没有限制,并允许来宾机使用主机摄像头支持的所有帧速率。

    • MaxPayloadTransferSize: 模拟摄像头一次可以向来宾机发送多少字节。默认值为 3060 字节,一些摄像头使用此值。如果来宾机能够使用更大的缓冲区,更高的值可以稍微降低 CPU 负载。但是,某些来宾机可能不支持较高的 MaxPayloadTransferSize

  • 从正在运行的 VM 中分离网络摄像头,如下所示

    VBoxManage controlvm VM-name webcam detach [host_path|alias]
  • 列出连接到正在运行的 VM 的网络摄像头,如下所示

    VBoxManage controlvm VM-name webcam list

    输出包含用于每个连接摄像头的webcam attach 命令中使用的路径或别名。

9.5.2. Windows 主机

当网络摄像头设备从主机分离时,模拟的网络摄像头设备会自动从客户机分离。

9.5.3. macOS 主机

当摄像头设备从主机分离时,模拟摄像头设备保持连接到来宾机,必须使用VBoxManage controlvm VM-name webcam detach 命令手动分离。

9.5.4. Linux 和 Oracle Solaris 主机

当摄像头从主机分离时,模拟摄像头设备仅当摄像头正在流式传输视频时才会自动从来宾机分离。如果模拟摄像头不活动,则应使用VBoxManage controlvm VM-name webcam detach 命令手动分离。

别名 .0.1 映射到 /dev/video0,别名 .2 映射到 /dev/video1,依此类推。

9.6. 高级显示配置

9.6.1. 自定义 VESA 分辨率

除了标准 VESA 分辨率外,Oracle VM VirtualBox VESA BIOS 允许您添加最多 16 个自定义视频模式,这些模式将报告给来宾操作系统。当使用带有 Oracle VM VirtualBox 增强功能的 Windows 来宾机时,将使用自定义图形驱动程序而不是后备 VESA 解决方案,因此此信息不适用。

可以使用额外数据功能为每个虚拟机配置额外的视频模式。额外数据键名为 CustomVideoModex,其中 x 是 1 到 16 的数字。请注意,模式将从 1 开始读取,直到下一个数字未定义或达到 16。以下示例添加了一个与许多笔记本电脑的本机显示分辨率相对应的视频模式

$ VBoxManage setextradata VM-name "CustomVideoMode1" "1400x1050x16"

自定义视频模式的 VESA 模式 ID 从 0x160 开始。为了使用上述定义的自定义视频模式,必须向 Linux 提供以下命令行

vga = 0x200 | 0x160
vga = 864

对于带有 Oracle VM VirtualBox 增强功能的来宾操作系统,可以使用视频模式提示功能设置自定义视频模式。

9.6.2. 使用图形前端时配置来宾机的最大分辨率

当使用图形前端(即普通 Oracle VM VirtualBox 应用程序)启动安装了增强功能的来宾系统时,将不允许它们使用大于主机屏幕尺寸的屏幕分辨率,除非用户通过拖动窗口、切换到全屏或无缝模式或使用VBoxManage 发送视频模式提示来手动调整其大小。这种行为是大多数用户所希望的,但如果您有不同的需求,可以通过从命令行发出以下命令之一来更改它

  • 移除客户机分辨率的所有限制。

    VBoxManage setextradata global GUI/MaxGuestResolution any
  • 手动指定最大分辨率。

    VBoxManage setextradata global GUI/MaxGuestResolution widthxheight
  • 将所有客户机 VM 恢复到默认设置。

    VBoxManage setextradata global GUI/MaxGuestResolution auto

9.7. 高级存储配置

9.7.1. 从来宾机使用裸主机硬盘

作为第 5 章,虚拟存储中所述使用虚拟磁盘映像的替代方案,Oracle VM VirtualBox 还可以将整个物理硬盘或选定分区作为虚拟磁盘呈现给虚拟机。

在 Oracle VM VirtualBox 中,这种访问类型称为裸硬盘访问。它使来宾操作系统能够访问其虚拟硬盘而无需通过主机操作系统文件系统。映像文件与裸磁盘的实际性能差异很大,具体取决于主机文件系统的开销、是否使用动态增长映像以及主机操作系统缓存策略。缓存间接影响其他方面,例如故障行为。例如,在主机操作系统崩溃之前,虚拟磁盘是否包含所有写入的数据。有关此事的详细信息,请查阅您的主机操作系统文档。

警告

裸硬盘访问仅供专家用户使用。不正确的使用或使用过时的配置可能导致物理磁盘上的数据完全丢失。最重要的是,不要尝试在来宾机中启动当前正在运行主机操作系统的分区。这将导致严重的数据损坏。

裸硬盘访问,包括整个磁盘和单个分区,都作为 VMDK 映像格式支持的一部分实现。因此,您需要创建一个特殊的 VMDK 映像文件来定义数据存储位置。创建这样一个特殊的 VMDK 映像后,您可以像使用常规虚拟磁盘映像一样使用它。例如,您可以使用虚拟介质管理器(参见第 5.3 节,“虚拟介质管理器”)或VBoxManage 将映像分配给虚拟机。

9.7.1.1. 访问整个物理硬盘

虽然此变体设置最简单,但您必须注意,这将使来宾操作系统能够直接和完全访问整个物理磁盘。如果您的主机操作系统也从该磁盘启动,请特别注意不要从来宾机访问该分区。积极的一面是,物理磁盘可以以任意方式重新分区,而无需重新创建访问裸磁盘的映像文件。

在 Linux 主机上,要创建一个表示整个物理硬盘的映像(该映像不会包含任何实际数据,因为所有数据都将存储在物理磁盘上),请使用以下命令

$ VBoxManage createmedium disk --filename path-to-file.vmdk --format=VMDK
 --variant RawDisk --property RawDrive=/dev/sda

这将创建 path-to-file.vmdk 文件映像,该映像必须是绝对路径。所有数据都从 /dev/sda 读取和写入。

在 Windows 主机上,而不是上述设备规范,例如使用 \\.\PhysicalDrive0。在 macOS 主机上,而不是上述设备规范,例如使用 /dev/rdisk1。请注意,在 Mac OS X 上,只有在没有从其挂载卷的情况下才能访问整个磁盘。

创建映像需要对给定设备的读/写访问权限。将来从虚拟机使用映像时也需要读/写访问权限。在某些主机平台(例如 Windows)上,原始磁盘访问可能会受到限制,并且在某些情况下主机操作系统不允许。

就像常规磁盘映像一样,这不会自动将新创建的映像附加到虚拟机。这可以按如下方式完成

$ VBoxManage storageattach WindowsXP --storagectl "IDE Controller" \
 --port 0 --device 0 --type hdd --medium path-to-file.vmdk

完成此操作后,选定的虚拟机将从指定的物理磁盘启动。

9.7.1.2. 访问单个物理硬盘分区

裸分区支持与上面描述的完整硬盘访问非常相似。但是,在这种情况下,任何分区信息都将存储在 VMDK 映像中。这意味着您可以在虚拟硬盘中安装不同的引导加载程序,而不会影响主机的分区信息。将来宾机能够看到物理磁盘上存在的所有分区时,访问将进行过滤,即从不允许访问的分区读取将只返回零,并且对它们的写入将被忽略。

要创建一个用于裸分区支持的特殊映像,该映像将包含少量数据,在 Linux 主机上,使用命令

$ VBoxManage createmedium disk --filename path-to-file.vmdk --format=VMDK
--variant RawDisk --property RawDrive=/dev/sda --property Partitions=1,5

该命令与完整硬盘访问的命令相同,只是增加了 --property Partitions=1,5 参数。此示例将创建映像 path-to-file.vmdk,该映像必须是绝对路径,并且 /dev/sda 的分区 1 和 5 将可供来宾机访问。

Oracle VM VirtualBox 使用与您的 Linux 主机相同的分区编号。因此,上述示例中给出的数字分别指第一个主分区和扩展分区中的第一个逻辑驱动器。

在 Windows 主机上,而不是上述设备规范,例如使用 \\.\PhysicalDrive0。在 macOS 主机上,而不是上述设备规范,例如使用 /dev/rdisk1。请注意,在 OS X 上,您只能使用未挂载的分区。首先使用diskutil unmountDisk /dev/diskX 卸载相应的磁盘。Linux、Windows 和 macOS 主机上的分区编号相同。

分区列表的编号可以从以下命令的输出中获取

$ VBoxManage list hostdrives

输出列出了可用驱动器及其分区,并带有分区类型和大小,以便用户能够识别客户机所需的分区。

提供对单个分区访问的映像特定于特定的主机磁盘设置。您无法将这些映像传输到另一个主机。此外,每当主机分区更改时,映像必须重新创建

创建映像需要对给定设备的读/写访问权限。将来从虚拟机使用映像时也需要读/写访问权限。如果这不可行,则有一种特殊类型的裸分区访问(目前仅在 Linux 主机上可用),它避免了必须向当前用户授予对整个磁盘的访问权限。要设置此类映像,请使用

$ VBoxManage createmedium disk --filename path-to-file.vmdk --format=VMDK
--variant RawDisk --property RawDrive=/dev/sda --property Partitions=1,5
--property Relative=1

从虚拟机使用时,映像将不再引用整个磁盘,而仅引用单个分区。在此示例中为 /dev/sda1/dev/sda5。因此,仅对受影响的分区需要读/写访问权限,而不需要对整个磁盘。但是,在创建期间,需要对整个磁盘进行只读访问以获取分区信息。

在某些配置中,可能需要更改所创建映像的 MBR 代码。例如,用另一个引导加载程序替换主机上使用的 Linux 引导加载程序。这使得来宾机可以直接引导到 Windows,而主机从“同一”磁盘引导 Linux。为此,提供了 --property-file BootSector=path-to-file-with-boot-sector 参数。它指定了一个文件名为获取 MBR 代码的文件。分区表完全不修改,因此可以使用来自具有完全不同分区的系统的 MBR 文件。一个示例如下

$ VBoxManage createmedium disk --filename path-to-file.vmdk --format=VMDK
--variant RawDisk --property RawDrive=/dev/sda --property Partitions=1,5
--property-file BootSector=winxp.mbr

修改后的 MBR 将存储在映像内部,而不是主机磁盘上。

创建的映像可以像往常一样附加到 VM 配置中的存储控制器。

9.7.2. 配置硬盘厂商产品数据 (VPD)

Oracle VM VirtualBox 报告其虚拟硬盘的厂商产品数据,包括硬盘序列号、固件版本和型号。可以使用以下命令更改这些数据

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/SerialNumber" "serial"
$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/FirmwareRevision" "firmware"
$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/ModelNumber" "model"

序列号是 20 字节的字母数字字符串,固件版本是 8 字节的字母数字字符串,型号是 40 字节的字母数字字符串。请指定所需的 SATA 硬盘端口,而不是 Port0(指第一个端口)。

上述命令适用于带有 AHCI (SATA) 控制器的虚拟机。带有 IDE 控制器的虚拟机的命令是

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/piix3ide/0/Config/PrimaryMaster/SerialNumber" "serial"
$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/piix3ide/0/Config/PrimaryMaster/FirmwareRevision" "firmware"
$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/piix3ide/0/Config/PrimaryMaster/ModelNumber" "model"

对于硬盘,您可以使用以下命令将驱动器标记为具有非旋转介质

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/NonRotational" "1"

CD/DVD 驱动器需要另外三个参数来报告供应商产品数据

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/ATAPIVendorId" "vendor"
VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/ATAPIProductId" "product"
VBoxManage setextradata VM-name \
"VBoxInternal/Devices/ahci/0/Config/Port0/ATAPIRevision" "revision"

厂商 ID 是一个 8 字节的字母数字字符串,产品 ID 是一个 16 字节的字母数字字符串,版本号是一个 4 字节的字母数字字符串。请指定所需的 SATA 硬盘端口,而不是 Port0(指第一个端口)。

9.7.3. 使用内部网络访问 iSCSI 目标

作为一项实验性功能,Oracle VM VirtualBox 允许访问在配置为使用内部网络模式的虚拟机中运行的 iSCSI 目标。请参阅第 5.10 节,“iSCSI 服务器”第 6.6 节,“内部网络”第 8.26 节,“VBoxManage storageattach”

访问内部网络的 IP 堆栈必须在访问 iSCSI 目标的虚拟机中进行配置。必须选择一个未被其他虚拟机使用的空闲静态 IP 和 MAC 地址。在下面的示例中,请根据您的需要调整虚拟机的名称、MAC 地址、IP 配置和内部网络名称 (MyIntNet)。必须首先发出以下八个命令

$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/Trusted 1
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/Config/MAC 08:00:27:01:02:0f
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/Config/IP 10.0.9.1
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/Config/Netmask 255.255.255.0
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/LUN#0/Driver IntNet
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/LUN#0/Config/Network MyIntNet
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/LUN#0/Config/TrunkType 2
$ VBoxManage setextradata VM-name \
VBoxInternal/Devices/IntNetIP/0/LUN#0/Config/IsService 1

最后,必须使用 --intnet 选项连接 iSCSI 磁盘,以告知 iSCSI 启动器使用内部网络,如下所示

$ VBoxManage storageattach ... --medium iscsi --server 10.0.9.30 \
--target iqn.2008-12.com.sun:sampletarget --intnet

与常规 iSCSI 设置相比,目标的 IP 地址必须指定为数字 IP 地址,因为内部网络没有 DNS 解析器。

带有 iSCSI 目标的虚拟机应在使用它的虚拟机开机之前启动。如果在使用 iSCSI 磁盘的虚拟机启动时 iSCSI 目标未开机,则可能需要长达 200 秒才能检测到此情况。虚拟机将无法启动。

9.8. 精细调整 Oracle VM VirtualBox NAT 引擎

9.8.1. 配置 NAT 网络接口的地址

在 NAT 模式下,来宾网络接口默认分配到 IPv4 范围 10.0.x.0/24,其中 x 对应于 NAT 接口实例 +2。因此,当只有一个 NAT 实例处于活动状态时,x 为 2。在这种情况下,来宾机被分配到地址 10.0.2.15,网关设置为 10.0.2.2,并且名称服务器位于 10.0.2.3

如果需要更改 NAT 网络,请使用以下命令

$ VBoxManage modifyvm VM-name \
--natnet1 "192.168/16"

此命令将为VM-name 的第一个 NAT 网络实例保留从 192.168.0.0192.168.254.254 的网络地址。来宾 IP 将分配到 192.168.0.15,并且默认网关将位于 192.168.0.2

9.8.2. 配置 NAT 网络接口的引导服务器 (下一个服务器)

在 NAT 模式下进行网络引导时,Oracle VM VirtualBox 默认使用 IP 地址为 10.0.2.4 的内置 TFTP 服务器。此默认行为对于典型的远程引导场景应该运行良好。但是,可以通过以下命令更改引导服务器 IP 和引导映像的位置

$ VBoxManage modifyvm VM-name \
--nattftpserver1 10.0.2.2
$ VBoxManage modifyvm VM-name \
--nattftpfile1 /srv/tftp/boot/MyPXEBoot.pxe

9.8.3. 调整 NAT 的 TCP/IP 缓冲区

Oracle VM VirtualBox NAT 堆栈性能通常由其与主机 TCP/IP 堆栈的交互以及几个缓冲区(SO_RCVBUFSO_SNDBUF)的大小决定。对于某些设置,用户可能希望调整缓冲区大小以获得更好的性能。这可以通过以下命令实现,其中值以千字节为单位,范围从 8 到 1024

$ VBoxManage modifyvm VM-name \
--natsettings1 16000,128,128,0,0

此示例说明了如何调整 NAT 设置。第一个参数是 MTU,然后是套接字发送缓冲区的大小和套接字接收缓冲区的大小,TCP 发送窗口的初始大小,最后是 TCP 接收窗口的初始大小。请注意,指定零表示回退到默认值。

每个缓冲区的默认大小为 64KB,默认 MTU 为 1500。

9.8.4. 将 NAT 套接字绑定到特定接口

默认情况下,Oracle VM VirtualBox 的 NAT 引擎将通过主机 TCP/IP 堆栈分配的默认接口路由 TCP/IP 数据包。这样做的技术原因是 NAT 引擎使用套接字进行通信。如果您想更改此行为,可以告诉 NAT 引擎绑定到特定 IP 地址。例如,使用以下命令

$ VBoxManage modifyvm VM-name \
--natbindip1 "10.45.0.2"

在此之后,所有出站流量将通过 IP 地址为 10.45.0.2 的接口发送。在更改 NAT 绑定地址之前,请确保此接口已启动并正在运行。

9.8.5. 在 NAT 模式下启用 DNS 代理

NAT 引擎默认向来宾机提供与主机上配置相同的 DNS 服务器。在某些情况下,可能希望向来宾机隐藏 DNS 服务器 IP,例如当此信息可能由于 DHCP 租约过期而在主机上更改时。在这种情况下,您可以使用以下命令指示 NAT 引擎充当 DNS 代理

$ VBoxManage modifyvm VM-name --natdnsproxy1 on

9.8.6. 在 NAT 模式下使用主机的解析器作为 DNS 代理

为了解析网络名称,NAT 引擎的 DHCP 服务器提供了主机已注册的 DNS 服务器列表。如果由于某种原因您需要隐藏此 DNS 服务器列表并使用主机的解析器设置,从而强制 Oracle VM VirtualBox NAT 引擎拦截 DNS 请求并将其转发到主机的解析器,请使用以下命令

$ VBoxManage modifyvm VM-name --natdnshostresolver1 on

请注意,此设置类似于 DNS 代理模式,但代理模式仅将 DNS 请求转发到相应的服务器,而解析器模式将解释 DNS 请求并使用主机的 DNS API 查询信息并将其返回给来宾机。

9.8.6.1. 用户定义的主机名解析

在某些情况下,拦截名称解析机制,在特定的 DNS 请求上提供用户定义的 IP 地址可能很有用。拦截机制使用户不仅可以映射单个主机,还可以映射域,甚至在需要时映射更复杂的命名约定。

以下命令设置了一个将名称映射到指定 IP 的规则

VBoxManage setextradata VM-name \
"VBoxInternal/Devices/{pcnet,e1000}/0/LUN#0/AttachedDriver/Config/HostResolverMappings/ \
unique-rule-name-of-interception-rule/HostIP" IPv4

VBoxManage setextradata VM-name \
"VBoxInternal/Devices/{pcnet,e1000}/0/LUN#0/AttachedDriver/Config/HostResolverMappings/ \
unique-rule-name/HostName" hostname

以下命令设置一个将模式名称映射到指定 IP 的规则

VBoxManage setextradata VM-name \
"VBoxInternal/Devices/{pcnet,e1000}/0/LUN#0/AttachedDriver/Config/HostResolverMappings/ \
unique-rule-name/HostIP" IPv4

VBoxManage setextradata VM-name \
"VBoxInternal/Devices/{pcnet,e1000}/0/LUN#0/AttachedDriver/Config/HostResolverMappings/ \
unique-rule-name/HostNamePattern" hostpattern

主机名模式可以包含以下通配符:管道 (|)、问号 (?) 和星号 (*)。

此示例演示如何指示主机解析器机制将 www.blocked-site.info 网站的所有域和可能的一些镜像解析为 IP 127.0.0.1

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/e1000/0/LUN#0/AttachedDriver/Config/HostResolverMappings/all_blocked_site/HostIP" 127.0.0.1
$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/e1000/0/LUN#0/AttachedDriver/Config/HostResolverMappings/all_blocked_site/HostNamePattern" "*.blocked-site.*|*.fb.org"

主机解析器机制应启用用户定义映射规则,否则它们将不起作用。

9.8.7. 配置 NAT 引擎的别名

默认情况下,NAT 核心使用别名,并在为连接生成别名时使用随机端口。这对于大多数协议(如 SSH、FTP 等)都运行良好。但是,某些协议可能需要更透明的行为,或者可能依赖于发送数据包的实际端口号。您可以使用以下命令更改 NAT 模式

$ VBoxManage modifyvm VM-name \
--nataliasmode1 proxyonly
$ VBoxManage modifyvm "Linux Guest" --nataliasmode1 sameports

第一个示例禁用别名并切换 NAT 到透明模式,第二个示例强制保留端口值。这些模式可以在必要时组合使用。

9.9. 配置 BIOS DMI 信息

Oracle VM VirtualBox 提供给来宾机的 DMI 数据可以针对特定的虚拟机进行更改。使用以下命令配置 DMI BIOS 信息。如果您的虚拟机配置为使用 EFI 固件,则需要在键中将 pcbios 替换为 efi

  • DMI BIOS 信息(类型 0)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVendor"        "BIOS Vendor"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSVersion"       "BIOS Version"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSReleaseDate"   "BIOS Release Date"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSReleaseMajor"  1
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSReleaseMinor"  2
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSFirmwareMajor" 3
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBIOSFirmwareMinor" 4
  • DMI 系统信息(类型 1)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor"      "System Vendor"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemProduct"     "System Product"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVersion"     "System Version"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemSerial"      "System Serial"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemSKU"         "System SKU"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemFamily"      "System Family"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiSystemUuid" \
    "9852bf98-b83c-49db-a8de-182c42c7226b"
  • DMI 主板信息(类型 2)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardVendor"       "Board Vendor"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardProduct"      "Board Product"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardVersion"      "Board Version"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardSerial"       "Board Serial"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardAssetTag"     "Board Tag"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardLocInChass"   "Board Location"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiBoardBoardType"    10
  • DMI 系统机箱或外壳(类型 3)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiChassisVendor"     "Chassis Vendor"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiChassisType"       3
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiChassisVersion"    "Chassis Version"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiChassisSerial"     "Chassis Serial"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiChassisAssetTag"   "Chassis Tag"
  • DMI 处理器信息(类型 4)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiProcManufacturer"  "GenuineIntel"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiProcVersion"       "Pentium(R) III"
  • DMI OEM 字符串(类型 11)

    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiOEMVBoxVer"        "vboxVer_1.2.3"
    $ VBoxManage setextradata VM-name \
    "VBoxInternal/Devices/pcbios/0/Config/DmiOEMVBoxRev"        "vboxRev_12345"

如果未设置 DMI 字符串,则使用 Oracle VM VirtualBox 的默认值。要设置空字符串,请使用 "<EMPTY>"

请注意,在上述列表中,所有带引号的参数(DmiBIOSVendor、DmiBIOSVersion 但不包括 DmiBIOSReleaseMajor)都被认为是字符串。如果此类字符串是有效数字,则参数将被视为数字,并且虚拟机很可能因 VERR_CFGM_NOT_STRING 错误而拒绝启动。在这种情况下,请使用 "string:value"。例如

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/pcbios/0/Config/DmiSystemSerial"      "string:1234"

更改此信息可能需要将主机的 DMI 信息提供给客户机,以防止 Windows 要求新的产品密钥。在 Linux 主机上,DMI BIOS 信息可以通过以下命令获取

$ dmidecode -t0

DMI 系统信息可以通过以下方式获取

$ dmidecode -t1

9.10. 配置自定义 ACPI 表

您可以配置 Oracle VM VirtualBox,最多向来宾机提供四个自定义 ACPI 表。使用以下命令配置自定义 ACPI 表。请注意,除了 CustomTable0 之外,还提供 CustomTable1CustomTable2CustomTable3

$ VBoxManage setextradata VM-name \
"VBoxInternal/Devices/acpi/0/Config/CustomTable0" "/path-to-table.bin"

配置自定义 ACPI 表可以例如避免在 Windows Vista、Windows 7、Windows 8 及更高版本来宾机上请求新产品密钥的需要。在 Linux 主机上,可以从 /sys/firmware/acpi/tables/ 读取系统的 ACPI 表之一。

9.11. 精细调整定时器和时间同步

9.11.1. 配置来宾时间戳计数器 (TSC) 以反映来宾执行

默认情况下,Oracle VM VirtualBox 将所有对来宾机可见的时间源同步到一个时间源,即单调主机时间。这反映了许多来宾操作系统的假设,它们期望所有时间源都反映“挂钟”时间。然而,在特殊情况下,将来宾机中的时间戳计数器 (TSC) 反映实际执行来宾机所花费的时间可能很有用。

这种特殊的 TSC 处理模式可以按 VM 启用,为获得最佳结果,必须仅与硬件虚拟化结合使用。要启用此模式,请使用以下命令

$ VBoxManage setextradata VM-name "VBoxInternal/TM/TSCTiedToExecution" 1

要恢复到默认的 TSC 处理模式,请使用

$ VBoxManage setextradata VM-name "VBoxInternal/TM/TSCTiedToExecution"

请注意,如果您使用特殊的 TSC 处理模式,而您的来宾操作系统对时间源的一致性非常严格,您可能会收到关于时间不一致的警告或错误消息。根据某些来宾操作系统使用 TSC 的方式,这也可能导致时钟变得不可靠。

9.11.2. 加速或减慢来宾时钟

出于某些目的,加快或减慢虚拟客户机时钟可能很有用。这可以通过以下方式实现

$ VBoxManage setextradata VM-name "VBoxInternal/TM/WarpDrivePercentage" 200

以上示例将使客户机时钟速度加倍,而

$ VBoxManage setextradata VM-name "VBoxInternal/TM/WarpDrivePercentage" 50

会将来宾时钟的速度减半。请注意,更改虚拟时钟的速率可能会使来宾机混淆,甚至可能导致异常来宾行为。例如,更高的时钟速率意味着虚拟设备的超时时间更短,导致由于主机负载增加而导致的虚拟设备响应时间略有增加可能会导致来宾故障。此外,请注意,任何时间同步机制都将频繁尝试将来宾时钟与参考时钟(如果 Oracle VM VirtualBox 增强功能处于活动状态,则是主机时钟)重新同步。因此,如果按上述方式更改来宾时钟的速率,则应禁用任何时间同步。请参阅第 9.11.3 节,“调整增强功能时间同步参数”

9.11.3. 调整增强功能时间同步参数

Oracle VM VirtualBox 增强功能可确保来宾系统的系统时间与主机时间同步。有几个参数可以调整。可以使用以下命令为特定虚拟机设置参数

$ VBoxManage guestproperty set VM-name "/VirtualBox/GuestAdd/VBoxService/property" value

property 是以下之一

--timesync-interval

指定与主机同步时间的时间间隔。默认值为 10000 毫秒(10 秒)。

--timesync-min-adjust

进行调整的最小绝对漂移值(以毫秒为单位)。OS/2 上的默认值为 1000 毫秒,其他地方为 100 毫秒。

--timesync-latency-factor

将时间查询延迟乘以的因子,以计算动态最小调整时间。默认值为 8 倍,这意味着如下所示

测量确定主机时间所需的时间,来宾机必须联系虚拟机主机服务,这可能需要一些时间。将此值乘以 8,并且仅当主机和来宾机之间的时间差大于此值时才进行调整。否则不进行任何时间调整。

--timesync-max-latency

可接受的最大主机计时器查询延迟。默认值为 250 毫秒。

--timesync-set-threshold

绝对漂移阈值,以毫秒为单位,表示何时开始设置时间而不是尝试平滑调整。默认值为 20 分钟。

--timesync-set-start

启动时间同步服务时设置时间。

--timesync-set-on-restore 0|1

当参数为 1 时,从保存状态恢复 VM 后设置时间。这是默认值。通过传递 0 禁用。在后一种情况下,时间将平滑调整,这可能需要很长时间。

所有这些参数也可以作为命令行参数提供给 VBoxService。

9.11.4. 禁用增强功能时间同步

一旦安装并启动,Oracle VM VirtualBox 增强功能将尝试将来宾机时间与主机时间同步。这可以通过禁止来宾服务读取主机时钟来防止

$ VBoxManage setextradata VM-name "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled" 1

9.12. 在 Oracle Solaris 11 主机上安装备用桥接网络驱动程序

Oracle VM VirtualBox 包含一个利用 Oracle Solaris 11 的 Crossbow 功能的网络过滤器驱动程序。默认情况下,此新驱动程序会安装到支持它的 Oracle Solaris 11 主机上。

要强制安装基于旧 STREAMS 的网络过滤器驱动程序,请在安装 Oracle VM VirtualBox 软件包之前以 root 身份执行以下命令

$ touch /etc/vboxinst_vboxflt

要强制安装基于 Crossbow 的网络过滤器驱动程序,请在安装 Oracle VM VirtualBox 软件包之前以 root 身份执行以下命令

$ touch /etc/vboxinst_vboxbow

要检查 Oracle VM VirtualBox 当前正在使用哪个驱动程序,请执行

$ modinfo | grep vbox

如果输出包含“vboxbow”,则表示 Oracle VM VirtualBox 正在使用 Crossbow 网络过滤器驱动程序,而名称“vboxflt”则表示使用旧的 STREAMS 网络过滤器。

9.13. 适用于 Oracle Solaris 11 主机上 VLAN 的 Oracle VM VirtualBox VNIC 模板

Oracle VM VirtualBox 支持虚拟网络接口 (VNIC) 模板,用于通过 VLAN 配置虚拟机。Oracle VM VirtualBox VNIC 模板是一个 VNIC,其名称以 vboxvnic_template 开头。该字符串区分大小写。

在 Oracle Solaris 11 主机上,当使用基于 Crossbow 的桥接网络时,VNIC 模板可用于指定在通过网络链接进行桥接时要使用的 VLAN ID。

以下是使用 VNIC 模板通过 VLAN 配置虚拟机的示例。以 root 身份执行以下命令创建 Oracle VM VirtualBox VNIC 模板

# dladm create-vnic -t -l nge0 -v 23 vboxvnic_template0

这将在接口nge0 上创建一个 VLAN ID 为 23 的临时 VNIC 模板。要创建在主机重启后仍然存在的 VNIC 模板,请跳过上述命令中的 -t 参数。您可以使用以下命令检查链接的当前状态

$ dladm show-link
LINK        CLASS     MTU    STATE    BRIDGE     OVER
nge0        phys      1500   up       --         --
nge1        phys      1500   down     --         --
vboxvnic_template0 vnic 1500 up       --         nge0

$ dladm show-vnic
LINK         OVER         SPEED  MACADDRESS        MACADDRTYPE         VID
vboxvnic_template0 nge0   1000   2:8:20:25:12:75   random              23

创建 VNIC 模板后,任何需要在接口nge0 上通过 VLAN 23 运行的虚拟机都可以配置为使用此 VNIC 模板进行桥接。

VNIC 模板使 VLAN 上的虚拟机管理更简单高效。VLAN 详细信息不作为每个虚拟机配置的一部分存储,而是在启动虚拟机时从 VNIC 模板继承。VNIC 模板本身可以随时使用dladm 命令进行修改。

VNIC 模板可以创建额外的属性,例如带宽限制和 CPU 扇出。有关详细信息,请参阅您的 Oracle Solaris 网络文档。这些附加属性也适用于使用 VNIC 模板进行桥接的 VM。

9.14. 在 Oracle Solaris 主机上配置多个仅主机网络接口

默认情况下,Oracle VM VirtualBox 为您提供一个仅主机网络接口。在 Oracle Solaris 主机上添加更多仅主机网络接口需要手动配置。以下是添加另一个仅主机网络接口的方法。

首先停止所有正在运行的 VM。然后,以 root 身份执行以下命令,卸载现有的“vboxnet0”接口

# ifconfig vboxnet0 unplumb

如果您有多个 vboxnet 接口,则需要全部卸载它们。一旦所有 vboxnet 接口都已卸载,请以 root 身份执行以下命令来移除驱动程序

# rem_drv vboxnet

编辑文件 /platform/i86pc/kernel/drv/vboxnet.conf 并为我们想要添加的新接口添加一行,如下所示

name="vboxnet" parent="pseudo" instance=1;
name="vboxnet" parent="pseudo" instance=2;

根据需要添加任意多行,每行都具有唯一的实例号。

接下来,以 root 身份执行以下命令重新加载 vboxnet 驱动程序

# add_drv vboxnet

在 Oracle Solaris 11.1 及更新版本的主机上,您可能需要重命名默认的虚名接口名称。要检查已分配的名称,请执行

$ dladm show-phys
LINK              MEDIA                STATE      SPEED  DUPLEX    DEVICE
net0              Ethernet             up         100    full      e1000g0
net2              Ethernet             up         1000   full      vboxnet1
net1              Ethernet             up         1000   full      vboxnet0

在上面的示例中,在继续安装接口之前,我们可以将“net2”重命名为“vboxnet1”。这可以通过以 root 身份执行以下命令来完成

# dladm rename-link net2 vboxnet1

现在使用ifconfig vboxnetX plumb 对所有接口进行 plumb 操作,其中 X 在本例中为 1。一旦接口被 plumb,就可以像配置任何其他网络接口一样配置它。有关更多详细信息,请参阅ifconfig 文档。

为了使新添加的接口的设置在重启后仍然存在,您需要编辑文件 /etc/inet/netmasks,如果您正在使用 NWAM,还需要编辑 /etc/nwam/llp 并添加相应的条目以设置每个接口的子网掩码和静态 IP。Oracle VM VirtualBox 安装程序仅更新它默认创建的一个“vboxnet0”接口的这些配置文件。

9.15. 在 Oracle Solaris 主机上配置 Oracle VM VirtualBox CoreDumper

Oracle VM VirtualBox 能够在出现问题时生成自己的核心文件以进行广泛调试。目前这仅在 Oracle Solaris 主机上可用。

可以使用以下命令启用 Oracle VM VirtualBox CoreDumper

$ VBoxManage setextradata VM-name VBoxInternal2/CoreDumpEnabled 1

您可以使用此命令指定用于核心转储的目录,如下所示

$ VBoxManage setextradata VM-name VBoxInternal2/CoreDumpDir path-to-directory

确保您指定的目录具有足够的可用空间,并且 Oracle VM VirtualBox 进程具有足够的权限向该目录写入文件。如果您跳过此命令并且未指定任何核心转储目录,则将使用 Oracle VM VirtualBox 可执行文件的当前目录。这很可能在写入核心时失败,因为它们受到 root 权限的保护。建议您明确设置核心转储目录。

您必须指定何时触发 Oracle VM VirtualBox CoreDumper。这可以通过以下命令完成

$ VBoxManage setextradata VM-name VBoxInternal2/CoreDumpReplaceSystemDump 1
$ VBoxManage setextradata VM-name VBoxInternal2/CoreDumpLive 1

如果您已启用 Oracle VM VirtualBox CoreDumper,则必须提供上述两个命令中的至少一个。

设置 CoreDumpReplaceSystemDump 会将虚拟机设置为覆盖主机的核心转储机制,并且在发生任何崩溃时,只有 Oracle VM VirtualBox CoreDumper 会生成核心文件。

设置 CoreDumpLive 会将虚拟机设置为在虚拟机进程收到 SIGUSR2 信号时生成核心。生成核心文件后,虚拟机不会终止并将继续运行。因此,您可以使用以下命令获取虚拟机进程的核心

$ kill -s SIGUSR2 VM-process-id

Oracle VM VirtualBox CoreDumper 以 core.vb.process-name.process-ID 的形式创建核心文件,例如 core.vb.VBoxHeadless.11321

9.16. Oracle VM VirtualBox 和 Oracle Solaris 内核区域

x86 系统上的 Oracle Solaris 内核区域利用硬件辅助虚拟化功能,就像 Oracle VM VirtualBox 一样。但是,为了让内核区域和 Oracle VM VirtualBox 共享此硬件资源,它们需要协作。

默认情况下,出于性能原因,Oracle VM VirtualBox 在主机上全局获取硬件辅助虚拟化资源 (VT-x/AMD-V),并一直使用它,直到最后一个需要它的 Oracle VM VirtualBox 虚拟机关闭。这会阻止其他软件在 Oracle VM VirtualBox 控制期间使用 VT-x/AMD-V。

可以指示 Oracle VM VirtualBox 在不执行来宾代码时放弃使用硬件辅助虚拟化功能,从而允许内核区域使用它们。为此,请关闭所有 Oracle VM VirtualBox 虚拟机并执行以下命令

$ VBoxManage setproperty hwvirtexclusive off

此命令只需执行一次,因为该设置作为全局 Oracle VM VirtualBox 设置的一部分存储,该设置将在主机重启和 Oracle VM VirtualBox 升级后继续存在。

9.17. 锁定 VirtualBox 管理器

9.17.1. 自定义 VirtualBox 管理器

有几个高级自定义设置用于锁定 VirtualBox 管理器。锁定意味着删除用户不应看到的一些功能。

VBoxManage setextradata global GUI/Customizations property[,property ...]

property 是以下属性之一

noSelector

不允许用户启动 VirtualBox 管理器。尝试这样做将显示一个包含适当错误消息的窗口。

noMenuBar

VM 窗口将不包含菜单栏。

noStatusBar

VM 窗口将不包含状态栏。

要禁用 VirtualBox 管理器的任何这些自定义设置,请使用以下命令

$ VBoxManage setextradata global GUI/Customizations

9.17.2. 虚拟机选择器自定义

以下每机器 VM 额外数据设置可用于更改 VM 选择器窗口对某些 VM 的行为

$ VBoxManage setextradata VM-name property true

property 可以是以下任何一项

GUI/HideDetails

不显示某个 VM 的 VM 配置。如果选择此 VM,详细信息窗口将保持为空。

GUI/PreventReconfiguration

不允许用户打开特定虚拟机的设置对话框。

GUI/PreventSnapshotOperations

从 GUI 阻止 VM 的快照操作,无论是在运行时还是在 VM 关闭时。

GUI/HideFromManager

在 VM 选择器窗口中隐藏某个 VM。

GUI/PreventApplicationUpdate

禁用自动更新检查并隐藏相应的菜单项。

请注意,这些设置不会阻止用户使用VBoxManage modifyvm 命令重新配置虚拟机。

9.17.3. 配置虚拟机选择器菜单项

您可以禁用 VM 选择器全局设置页面中的某些条目

$ VBoxManage setextradata global GUI/RestrictedGlobalSettingsPages property[,property...]

property 是以下之一

概述

不显示常规设置面板。

Input

不显示输入设置面板。

Update

不显示更新设置面板。

语言

不显示语言设置面板。

显示

不显示显示设置面板。

网络

不显示网络设置面板。

Extensions

不显示扩展设置面板。

Proxy

不显示代理设置面板。

这是一个全局设置。您可以指定任何属性组合。要恢复默认行为,请使用以下命令

$ VBoxManage setextradata global GUI/RestrictedGlobalSettingsPages

9.17.4. 配置虚拟机窗口菜单项

您可以禁用 VM 窗口中的某些菜单操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeMenus OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

All

不在 VM 窗口中显示任何菜单。

Application

不显示虚拟机窗口中的应用程序/文件菜单。

Machine

不显示虚拟机窗口中的控制菜单。

View

不显示虚拟机窗口中的视图菜单。

Input

不显示虚拟机窗口中的输入菜单。

设备

不显示虚拟机窗口中的设备菜单。

Help

不显示虚拟机窗口中的帮助菜单。

Debug

不显示虚拟机窗口中的调试菜单。调试菜单仅当 GUI 是使用特殊命令行参数或环境变量设置启动时才可见。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用以下命令

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeMenus

您还可以禁用某些菜单的某些菜单操作。使用以下命令禁用应用程序菜单的某些操作。这仅在 macOS 主机上可用。

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeApplicationMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

All

不在此菜单中显示任何菜单项。

About

不显示此菜单中的关于菜单项。

Preferences

不显示此菜单中的首选项菜单项。

NetworkAccessManager

不显示此菜单中的网络操作管理器菜单项。

ResetWarnings

不显示此菜单中的重置所有警告菜单项。

Close

不显示此菜单中的关闭菜单项。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用以下命令

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeMenus

使用以下命令禁用控制菜单的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeMachineMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

All

不在此菜单中显示任何菜单项。

SettingsDialog

不显示此菜单中的设置菜单项。

TakeSnapshot

不显示此菜单中的拍摄快照...菜单项。

InformationDialog

不显示此菜单中的会话信息...菜单项。

FileManagerDialog

不显示此菜单中的文件管理器...菜单项。

Pause

不显示此菜单中的暂停菜单项。

Reset

不显示此菜单中的重置菜单项。

Shutdown

不显示此菜单中的ACPI 关机菜单项。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeMachineMenuActions

使用以下命令禁用视图菜单的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeViewMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

All

不在此菜单中显示任何菜单项。

Fullscreen

不显示此菜单中的全屏模式菜单项。

Seamless

不显示此菜单中的无缝模式菜单项。

Scale

不显示此菜单中的缩放模式菜单项。

GuestAutoresize

不显示此菜单中的自动调整来宾显示菜单项。

AdjustWindow

不显示此菜单中的调整窗口大小菜单项。

TakeScreenshot

不显示此菜单中的截取屏幕截图...菜单项。

录制

不显示此菜单中的录制菜单项。

VRDEServer

不显示此菜单中的远程显示菜单项。

MenuBar

不显示此菜单中的菜单栏菜单项。

MenuBarSettings

不显示此菜单中的菜单栏设置...菜单项。

StatusBar

不显示此菜单中的状态栏菜单项。

StatusbarSettings

不显示此菜单中的状态栏设置...菜单项。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeViewMenuActions

使用以下命令禁用输入菜单的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeInputMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

All

不在此菜单中显示任何菜单项。

Keyboard

不显示此菜单中的键盘菜单项。

KeyboardSettings

不显示此菜单中的键盘设置...菜单项。

SoftKeyboard

不显示此菜单中的软键盘...菜单项。

TypeCAD

不显示此菜单中的插入 Ctrl-Alt-Del 菜单项。

TypeCABS

不显示此菜单中的插入 Ctrl-Alt-Backspace 菜单项。

TypeCtrlBreak

不显示此菜单中的插入 Ctrl-Break 菜单项。

TypeInsert

不显示此菜单中的插入 Insert 菜单项。

TypePrintScreen

不显示此菜单中的插入打印屏幕菜单项。

TypeAltPrintScreen

不显示此菜单中的插入 Alt 打印屏幕菜单项。

TypeHostKeyCombo

不显示此菜单中的插入主机组合键菜单项。

MouseIntegration

不显示此菜单中的鼠标集成菜单项。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeInputMenuActions

使用以下命令禁用设备菜单中的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeDevicesMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一,用于禁用设备菜单中的操作

All

不在此菜单中显示任何菜单项。

HardDrives

不显示此菜单中的硬盘菜单项。

OpticalDevices

不显示此菜单中的光驱菜单项。

FloppyDevices

不显示此菜单中的软盘驱动器菜单项。

音频

不显示此菜单中的音频菜单项。

网络

不显示此菜单中的网络菜单项。

NetworkSettings

不显示此菜单中的网络设置菜单项。

USBDevices

不显示此菜单中的USB 菜单项。

WebCams

不显示此菜单中的网络摄像头 菜单项。

SharedFolders

不显示此菜单中的共享文件夹菜单项。

SharedFoldersSettings

不显示此菜单中的共享文件夹设置...菜单项。

SharedClipboard

不显示此菜单中的共享剪贴板菜单项。

DragAndDrop

不显示此菜单中的拖放菜单项。

InstallGuestTools

不显示此菜单中的插入增强功能CD镜像...菜单项。

这是一个按虚拟机或全局设置。允许上述任意组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeDevicesMenuActions

使用以下命令禁用调试菜单中的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeDebuggerMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一,用于禁用调试菜单中的操作,该菜单通常完全禁用

All

不在此菜单中显示任何菜单项。

统计

不显示此菜单中的统计信息...菜单项。

命令行

不显示此菜单中的命令行...菜单项。

日志记录

不显示此菜单中的日志记录...菜单项。

日志对话框

不显示此菜单中的显示日志...菜单项。

客户机控制台

不显示此菜单中的客户机控制终端...菜单项。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeDebuggerMenuActions

使用以下命令禁用视图菜单的某些操作

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeHelpMenuActions OPTION[,OPTION...]

其中 OPTION 是以下关键字之一,用于禁用帮助菜单中的操作,该菜单通常完全禁用

All

不在此菜单中显示任何菜单项。

目录

不显示此菜单中的内容...菜单项。

网站

不显示此菜单中的VirtualBox 网站...菜单项。

Bug跟踪器

不显示此菜单中的VirtualBox 错误跟踪器...菜单项。

论坛

不显示此菜单中的VirtualBox 论坛...菜单项。

Oracle

不显示此菜单中的Oracle 网站...菜单项。

About

不显示此菜单中的关于 VirtualBox...菜单项。仅适用于非 macOS 主机。

这是每个 VM 或全局设置。允许任何组合。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedRuntimeHelpMenuActions

9.17.5. 配置虚拟机窗口状态栏条目

您可以禁用某些状态栏项

VBoxManage setextradata "VM name"|global GUI/RestrictedStatusBarIndicators OPTION[,OPTION...]

其中 OPTION 是以下关键字之一

硬盘

不在虚拟机窗口状态栏中显示硬盘图标。默认情况下,仅当虚拟机配置包含一个或多个硬盘时,才会显示硬盘图标。

光盘

不在虚拟机窗口状态栏中显示CD图标。默认情况下,仅当虚拟机配置包含一个或多个CD驱动器时,才会显示CD图标。

软盘

不在虚拟机窗口状态栏中显示软盘图标。默认情况下,仅当虚拟机配置包含一个或多个软盘驱动器时,才会显示软盘图标。

网络

不在虚拟机窗口状态栏中显示网络图标。默认情况下,仅当虚拟机配置包含一个或多个活动网络适配器时,才会显示网络图标。

USB

不在状态栏中显示USB图标。

SharedFolders

不在状态栏中显示共享文件夹图标。

捕获

不在状态栏中显示捕获图标。

功能

不在状态栏中显示CPU功能图标。

鼠标

不在状态栏中显示鼠标图标。

Keyboard

不在状态栏中显示键盘图标。

这是一个按虚拟机或全局设置。允许上述任意组合。如果指定了所有选项,则虚拟机窗口的状态栏中不会显示任何图标。要恢复默认行为,请使用

VBoxManage setextradata "VM name"|global GUI/RestrictedStatusBarIndicators

9.17.6. 配置虚拟机窗口视觉模式

您可以禁用某些虚拟机视觉模式

$ VBoxManage setextradata VM-name GUI/RestrictedVisualStates property[,property...]

property 是以下之一

Fullscreen

不允许将虚拟机切换到全屏模式。

Seamless

不允许将虚拟机切换到无缝模式。

Scale

不允许将虚拟机切换到缩放模式。

这是一个按虚拟机设置。您可以指定属性的任意组合。要恢复默认行为,请使用以下命令

$ VBoxManage setextradata VM-name GUI/RestrictedVisualStates

9.17.7. 主机组合键自定义

要禁用所有主机组合键,请打开首选项并将主机组合键更改为“无”。这在使用 Oracle VM VirtualBox 的自助服务终端模式时可能有用。

要重新定义或禁用某些主机键操作,请使用以下命令

$ VBoxManage setextradata global GUI/Input/MachineShortcuts "FullscreenMode=F,...."

下表显示了可能的主机键操作及其默认主机键快捷方式。将操作设置为“无”将禁用该主机键操作。

表 9.1. 主机组合键自定义

操作

默认键

操作

TakeSnapshot

T

拍摄快照

TakeScreenshot

E

截屏

MouseIntegration

I

切换鼠标集成

TypeCAD

Del

注入 Ctrl+Alt+Del

TypeCABS

Backspace

注入 Ctrl+Alt+Backspace

Pause

P

暂停虚拟机

Reset

R

硬重置客户机

保存状态

保存虚拟机状态并终止虚拟机

Shutdown

H

按下虚拟ACPI电源按钮

断电

不保存状态地关闭虚拟机电源

Close

Q

显示关闭虚拟机对话框

全屏模式

F

将虚拟机切换到全屏模式

无缝模式

L

将虚拟机切换到无缝模式

缩放模式

C

将虚拟机切换到缩放模式

客户机自动调整大小

G

自动调整客户机窗口大小

窗口调整

A

立即调整客户机窗口大小

弹出菜单

首页

在全屏模式和无缝模式下显示弹出菜单

SettingsDialog

S

打开虚拟机设置对话框

InformationDialog

N

显示虚拟机会话信息窗口

网络适配器对话框

显示虚拟机网络适配器对话框

共享文件夹对话框

显示虚拟机共享文件夹对话框

安装增强功能

D

挂载包含增强功能的ISO

要禁用全屏模式和无缝模式,请使用以下命令

$ VBoxManage setextradata global GUI/Input/MachineShortcuts "FullscreenMode=None,SeamlessMode=None"

9.17.8. 终止虚拟机时的操作

您可以禁止在终止虚拟机时执行某些操作。要禁止特定操作,请使用以下命令

$ VBoxManage setextradata VM-name GUI/RestrictedCloseActions property[,property...]

property 是以下之一

保存状态

不允许用户在终止虚拟机时保存虚拟机状态。

Shutdown

不允许用户通过向客户机发送ACPI关机事件来关闭虚拟机。

断电

不允许用户关闭虚拟机电源。

关机恢复快照

不允许用户在关闭虚拟机电源时返回到上次快照。

分离

如果虚拟机以分离模式启动,则不允许用户从虚拟机进程中分离。

这是一个按虚拟机设置。您可以指定属性的任意组合。如果指定了所有属性,则无法关闭虚拟机。

9.17.9. 终止虚拟机时的默认操作

您可以为终止虚拟机定义一个特定操作。与上一节中描述的设置不同,此设置允许用户在终止虚拟机时只执行一个操作。不会显示退出菜单。使用以下命令

$ VBoxManage setextradata VM-name GUI/DefaultCloseAction action

action 是以下选项之一

保存状态

在终止虚拟机进程之前保存虚拟机状态。

Shutdown

通过向客户机发送ACPI关机事件来关闭虚拟机。

断电

虚拟机已断电。

关机恢复快照

虚拟机已断电,保存的状态恢复到上次快照。

分离

终止前端但保持虚拟机进程运行。

这是一个按虚拟机设置。您可以指定属性的任意组合。如果指定了所有属性,则无法关闭虚拟机。

9.17.10. 处理“大师冥想”时的操作

如果出现无法通过终止进程以外的方式修复的问题,虚拟机将陷入“大师级冥想”(Guru Meditation)状态。默认是显示一个消息窗口,指示用户打开错误报告。

此行为可以配置如下

$ VBoxManage setextradata VM-name GUI/GuruMeditationHandler mode

mode 是以下选项之一

默认

显示一个消息窗口。用户确认后,虚拟机终止。

断电

虚拟机立即断电,不显示任何消息窗口。虚拟机日志文件将显示发生事件的信息。

忽略

虚拟机处于停滞模式。执行已停止,但未显示消息窗口。必须手动关闭虚拟机电源。

这是一个按虚拟机设置。

9.17.11. 配置自动鼠标捕获

默认情况下,如果用户点击客户机窗口,并且客户机此时期望相对鼠标坐标,则会捕获鼠标。如果指向设备配置为 PS/2 鼠标,并且客户机尚未启动 Oracle VM VirtualBox 增强功能,则会发生这种情况。例如,如果客户机正在启动或未安装增强功能,或者指向设备配置为 USB 平板但客户机尚未加载 USB 驱动程序,则会发生这种情况。一旦增强功能激活或 USB 客户机驱动程序启动,鼠标捕获将自动释放。

默认行为有时不尽如人意。因此可以按如下方式配置

VBoxManage setextradata VM-name GUI/MouseCapturePolicy mode

mode 是以下选项之一

默认

如上所述的默认行为。

仅限主机组合键

仅当切换主机键时才捕获鼠标。

禁用

鼠标永远不会被捕获,即使通过切换主机键也不会

这是一个按虚拟机设置。

9.17.12. 请求旧版全屏模式

Oracle VM VirtualBox 使用特殊的窗口管理器功能,可在多显示器主机系统上将多屏幕机器切换到全屏。然而,并非所有窗口管理器都能正确提供这些功能。Oracle VM VirtualBox 可以配置为使用旧版方法切换到全屏模式,方法是使用以下命令

VBoxManage setextradata global GUI/Fullscreen/LegacyMode true

您可以使用以下命令回到默认方法

VBoxManage setextradata global GUI/Fullscreen/LegacyMode

这是一个全局设置。

9.17.13. 从 GUI 中移除某些网络模式

可以从 Oracle VM VirtualBox GUI 中移除网络模式。为此,请使用以下命令

VBoxManage setextradata global GUI/RestrictedNetworkAttachmentTypes property[,property...]

property 是以下之一

NAT

从 GUI 中移除NAT选项。

NAT网络

从 GUI 中移除NAT 网络选项。

桥接适配器

从 GUI 中移除桥接网络选项。

内部网络

从 GUI 中移除内部网络选项。

仅主机适配器

从 GUI 中移除仅主机网络选项。

通用驱动程序

从 GUI 中移除通用网络选项。

这是一个全局设置。您可以指定任何属性组合。要恢复默认行为,请使用以下命令

VBoxManage setextradata global GUI/RestrictedNetworkAttachmentTypes

9.18. 自动启动 Oracle VM VirtualBox Web 服务

Oracle VM VirtualBox Web 服务(vboxwebsrv)用于远程控制 Oracle VM VirtualBox。它在 Oracle VM VirtualBox 软件开发工具包 (SDK) 中有详细说明。参见第 11 章,Oracle VM VirtualBox 编程接口。Web 服务启动脚本适用于受支持的主机操作系统。以下各节描述了如何使用这些脚本。Oracle VM VirtualBox Web 服务在标准安装后绝不会自动启动。

9.18.1. Linux:使用 init 启动 Web 服务

在 Linux 上,可以通过向 /etc/default/virtualbox 文件添加适当的参数,在主机启动期间自动启动 Web 服务。有一个强制参数 VBOXWEB_USER,必须将其设置为以后将启动虚拟机的用户。下表中的所有参数都以 VBOXWEB_ 前缀字符串开头。例如:VBOXWEB_HOSTVBOXWEB_PORT

表 9.2. Web 服务配置参数

参数

描述

默认

用户

Web服务运行的用户

主机

Web服务绑定的主机

localhost

端口

Web服务绑定的端口

18083

SSL_KEYFILE

PEM格式的服务器密钥和证书文件

SSL_PASSWORDFILE

服务器密钥密码的文件名

SSL_CACERT

PEM格式的CA证书文件

SSL_CAPATH

CA证书路径

SSL_DHFILE

DH文件名或DH密钥长度(比特)

SSL_RANDFILE

包含随机数生成器种子的文件

TIMEOUT

会话超时(秒),0表示禁用超时

300

CHECK_INTERVAL

超时检查频率(秒)

5

THREADS

并行运行的最大工作线程数

100

KEEPALIVE

套接字关闭前的最大请求数

100

ROTATE

日志文件数量,0表示禁用日志轮转

10

LOGSIZE

触发轮转的最大日志文件大小(字节)

1MB

LOGINTERVAL

触发日志轮转的最大时间间隔(秒)

1天

设置参数 SSL_KEYFILE 可启用 SSL/TLS 支持。强烈建议使用加密,否则所有内容(包括密码)都将以明文形式传输。

9.18.2. Oracle Solaris:使用 SMF 启动 Web 服务

在 Oracle Solaris 主机上,Oracle VM VirtualBox Web 服务守护程序已集成到 SMF 框架中。您可以更改参数,但如果以下默认值已经符合您的需求,则无需更改

svccfg -s svc:/application/virtualbox/webservice:default setprop config/host=localhost
svccfg -s svc:/application/virtualbox/webservice:default setprop config/port=18083
svccfg -s svc:/application/virtualbox/webservice:default setprop config/user=root

第 9.18.1 节,“Linux:使用 init 启动 Web 服务”中显示参数名称和默认值的表格也适用于 Oracle Solaris。参数名称必须更改为小写,并添加 config/ 前缀。例如:config/userconfig/ssl_keyfile。如果您进行了任何更改,请不要忘记运行以下命令以立即生效

svcadm refresh svc:/application/virtualbox/webservice:default

如果您忘记了上述命令,则在启用服务时将使用之前的设置。按如下方式检查当前属性设置

svcprop -p config svc:/application/virtualbox/webservice:default

当一切配置正确后,您可以使用以下命令启动 Oracle VM VirtualBox Web 服务

svcadm enable svc:/application/virtualbox/webservice:default

有关SMF的更多信息,请参阅Oracle Solaris文档。

9.18.3. macOS:使用 launchd 启动 Web 服务

在 macOS 上,launchd 用于启动 Oracle VM VirtualBox Web 服务。示例配置文件位于 $HOME/Library/LaunchAgents/org.virtualbox.vboxwebsrv.plist。可以通过将 Disabled 键从 true 更改为 false 来启用它。要手动启动服务,请使用以下命令

launchctl load ~/Library/LaunchAgents/org.virtualbox.vboxwebsrv.plist

有关如何配置launchd服务的更多信息,请参见

https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html.

9.19. Oracle VM VirtualBox 看门狗

内存气球服务(以前称为VBoxBalloonCtrl)已更名为 VBoxWatchdog。此服务现在包含以下旨在在服务器环境中运行的主机服务

  • 内存气球控制。此服务自动处理虚拟机的配置内存气球。参见第 4.10.1 节,“内存气球”。此服务对于虚拟机在运行时可能动态需要更多或更少内存的服务器环境非常有用。

    该服务定期检查虚拟机的当前内存气球及其空闲客户机 RAM,并相应地自动膨胀或收缩当前内存气球。此处理仅适用于安装了最新增强功能的正在运行的虚拟机。

  • 主机隔离检测。此服务提供了一种检测主机是否无法再访问特定 Oracle VM VirtualBox 服务器实例并采取适当操作(例如关闭、保存当前状态甚至关闭某些虚拟机)的方法。

所有配置值都可以通过命令行或全局额外数据指定,其中命令行值在设置时总是具有更高的优先级。一些配置值也可以按虚拟机指定。因此,总体的查找顺序是:命令行、按虚拟机额外数据(如果可用)、全局额外数据。

9.19.1. 内存气球控制

内存气球控制根据虚拟机的空闲内存和所需的最大气球大小来膨胀和收缩虚拟机的内存气球。

要设置内存气球控制,需要设置虚拟机可以达到的最大气球大小。这可以通过命令行指定,如下所示

--balloon-max <Size in MB>

使用按虚拟机额外数据值,如下所示

VBoxManage setextradata <VM-Name> VBoxInternal2/Watchdog/BalloonCtrl/BalloonSizeMax <Size in MB>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/BalloonCtrl/BalloonSizeMax <Size in MB>

注意

如果上述任何参数未指定最大气球大小,则根本不会执行气球操作。

气球增量(MB)可以通过命令行设置,如下所示

--balloon-inc <Size in MB>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/BalloonCtrl/BalloonIncrementMB <Size in MB>

如果未指定,默认的气球增量为256 MB。

同样适用于气球减量。使用命令行,如下所示

--balloon-dec <Size in MB>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/BalloonCtrl/BalloonDecrementMB <Size in MB>

如果未指定,默认的气球减量为128 MB。

气球的下限(MB)可以通过命令行定义,如下所示

--balloon-lower-limit <Size in MB>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/BalloonCtrl/BalloonLowerLimitMB <Size in MB>

如果未指定,默认下限为128 MB。

9.19.2. 主机隔离检测

为了检测主机是否被隔离,即主机无法再访问 Oracle VM VirtualBox 服务器实例,主机需要在一段时间内将交替值设置为全局额外数据值。如果在此时间段内未设置此值,则会发生超时,并将执行所谓的主机隔离响应到所处理的虚拟机。可以通过定义虚拟机组并将虚拟机分配给这些组来控制处理哪些虚拟机。默认情况下未设置任何组,这意味着当在 30 秒内未收到主机响应时,服务器上的所有虚拟机都将得到处理。

使用以下命令行设置主机隔离检测处理的组

--apimon-groups=<string[,stringN]>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/APIMonitor/Groups <string[,stringN]>

使用以下命令行设置主机隔离超时

--apimon-isln-timeout=<ms>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/APIMonitor/IsolationTimeoutMS <ms>

使用以下命令行设置实际主机隔离响应

--apimon-isln-response=<cmd>

使用全局额外数据值,如下所示

VBoxManage setextradata global VBoxInternal2/Watchdog/APIMonitor/IsolationResponse <cmd>

以下响应命令可用

  • none。这没有效果。

  • pause。暂停虚拟机的执行。

  • poweroff。通过按下虚拟电源按钮关闭虚拟机。虚拟机将没有机会保存任何数据或否决关机过程。

  • save。保存当前机器状态,然后关闭虚拟机。如果保存机器状态失败,虚拟机将暂停。

  • shutdown。通过向虚拟机的操作系统发送 ACPI 关机事件,以温和的方式关闭虚拟机。操作系统随后有机会执行干净关机。

9.19.3. 更多信息

有关更高级的选项和参数(例如详细日志记录),请查看可通过 --help 访问的内置命令行帮助。

9.19.4. Linux:使用 init 启动看门狗服务

在 Linux 上,可以通过向 /etc/default/virtualbox 文件添加适当的参数,在主机启动期间自动启动看门狗服务。有一个强制参数 VBOXWATCHDOG_USER,必须将其设置为以后将启动虚拟机的用户。为了向后兼容,您还可以指定 VBOXBALLOONCTRL_USER

下表中的所有参数都以 VBOXWATCHDOG_ 前缀字符串开头。例如:VBOXWATCHDOG_BALLOON_INTERVALVBOXWATCHDOG_LOGSIZE。仍然可以使用诸如 VBOXBALLOONCTRL_INTERVAL 之类的旧参数。

表 9.3. Oracle VM VirtualBox 看门狗配置参数

参数

描述

默认

用户

看门狗服务运行的用户

ROTATE

日志文件数量,0表示禁用日志轮转

10

LOGSIZE

触发轮转的最大日志文件大小(字节)

1MB

LOGINTERVAL

触发日志轮转的最大时间间隔(秒)

1天

BALLOON_INTERVAL

检查气球大小的间隔(毫秒)

30000

BALLOON_INCREMENT

气球大小增量(兆字节)

256

BALLOON_DECREMENT

气球大小减量(兆字节)

128

BALLOON_LOWERLIMIT

气球大小下限(兆字节)

64

BALLOON_SAFETYMARGIN

减小气球大小所需的空闲内存(兆字节)

1024

9.19.5. Oracle Solaris:使用 SMF 启动看门狗服务

在 Oracle Solaris 主机上,Oracle VM VirtualBox 看门狗服务守护程序已集成到 SMF 框架中。您可以更改参数,但如果默认值已经符合您的需求,则无需更改

svccfg -s svc:/application/virtualbox/balloonctrl:default setprop \
  config/balloon_interval=10000
svccfg -s svc:/application/virtualbox/balloonctrl:default setprop \
config/balloon_safetymargin=134217728

表 9.3,“Oracle VM VirtualBox 看门狗配置参数”也适用于 Oracle Solaris。参数名称必须更改为小写,并添加 config/ 前缀。例如:config/userconfig/balloon_safetymargin。如果您进行了任何更改,请不要忘记运行以下命令以立即生效

svcadm refresh svc:/application/virtualbox/balloonctrl:default

如果您忘记了上述命令,则在启用服务时将使用之前的设置。使用以下命令检查当前属性设置

svcprop -p config svc:/application/virtualbox/balloonctrl:default

当一切配置正确后,您可以使用以下命令启动 Oracle VM VirtualBox 看门狗服务

svcadm enable svc:/application/virtualbox/balloonctrl:default

有关SMF的更多信息,请参阅Oracle Solaris文档。

9.20. 其他扩展包

另一个名为 VNC 的扩展包可用。此扩展包是开源的,并取代了以前的 VNC 远程访问协议集成。这是实验性代码,最初仅在 Oracle VM VirtualBox 源代码包中提供。它在很大程度上是用户贡献的代码,并且不受 Oracle 的任何支持。

键盘处理受到严重限制,并且只有美国键盘布局可用。其他键盘布局至少会产生一些错误的按键结果,通常会带来令人惊讶的效果,对于与美国键盘布局存在显著差异的布局,它很可能无法使用。

可以同时安装 Oracle VM VirtualBox 扩展包和 VNC,但任何时候只能有一个 VRDE 模块处于活动状态。以下命令将切换到 VNC 中的 VNC VRDE 模块

VBoxManage setproperty vrdeextpack VNC

配置远程访问与 VRDP 非常相似,参见第 7.1 节,“远程显示 (VRDP 支持)”,但有一些限制。VNC 不支持指定多个端口号,并且身份验证方式不同。VNC 只能处理密码身份验证,并且没有使用密码哈希的选项。这意味着只能在虚拟机配置中使用明文密码,可以通过以下命令进行设置

VBoxManage modifyvm VM-name --vrde-property VNCPassword=secret

用户有责任对此密码保密,并且在出于任何目的将虚拟机配置传递给其他人时应将其删除。一些 VNC 服务器声称配置中包含加密密码。这不是真正的加密,它只是隐藏密码,其安全性与使用明文密码相同。

以下命令切换回VRDP(如果已安装)

VBoxManage setproperty vrdeextpack "Oracle VM VirtualBox Extension Pack"

9.21. 在系统启动期间启动虚拟机

您可以在Linux、Oracle Solaris和macOS平台上为所有用户在系统启动时自动启动虚拟机。

9.21.1. Linux:使用 init 启动自动启动服务

在 Linux 上,通过在 /etc/default/virtualbox 中设置两个变量来激活自动启动服务。第一个变量是 VBOXAUTOSTART_DB,它包含自动启动数据库目录的绝对路径。该目录应具有每个应能自动启动虚拟机的用户的写入权限。此外,该目录应设置粘滞位。第二个变量是 VBOXAUTOSTART_CONFIG,它将服务指向自动启动配置文件,该文件在启动期间用于确定是否允许单个用户自动启动虚拟机并配置启动延迟。配置文件可以放在 /etc/vbox 中,并包含几个选项。其中一个是 default_policy,它控制自动启动服务是否允许或拒绝为不在例外列表中的用户启动虚拟机。例外列表以 exception_list 开头,并包含一个逗号分隔的用户名列表。此外,可以为每个用户配置单独的启动延迟,以避免主机过载。示例如下

# Default policy is to deny starting a VM, the other option is "allow".
default_policy = deny

# Bob is allowed to start virtual machines but starting them
# will be delayed for 10 seconds
bob = {
    allow = true
    startup_delay = 10
}

# Alice is not allowed to start virtual machines, useful to exclude certain users
# if the default policy is set to allow.
alice = {
    allow = false
}

任何希望为单个机器启用自动启动的用户都必须使用以下命令设置自动启动数据库目录的路径

VBoxManage setproperty autostartdbpath autostart-directory

9.21.2. Oracle Solaris:使用 SMF 启动自动启动服务

在 Oracle Solaris 主机上,Oracle VM VirtualBox 自动启动守护程序已集成到 SMF 框架中。要启用它,您必须将服务指向一个现有配置文件,该文件的格式与 Linux 上的相同,参见第 9.21.1 节,“Linux:使用 init 启动自动启动服务”。例如

# svccfg -s svc:/application/virtualbox/autostart:default setprop \
  config/config=/etc/vbox/autostart.cfg

当一切配置正确后,您可以使用以下命令启动 Oracle VM VirtualBox 自动启动服务

# svcadm enable svc:/application/virtualbox/autostart:default

有关SMF的更多信息,请参阅Oracle Solaris文档。

9.21.3. macOS:使用 launchd 启动自动启动服务

在 macOS 上,launchd 用于启动 Oracle VM VirtualBox 自动启动服务。示例配置文件位于 /Applications/VirtualBox.app/Contents/MacOS/org.virtualbox.vboxautostart.plist。要启用此服务,请将文件复制到 /Library/LaunchDaemons 并将 Disabled 键从 true 更改为 false。此外,将第二个参数替换为与 Linux 格式相同的现有配置文件,参见第 9.21.1 节,“Linux:使用 init 启动自动启动服务”

要手动启动服务,请使用以下命令

# launchctl load /Library/LaunchDaemons/org.virtualbox.vboxautostart.plist

有关如何配置launchd服务的其他信息,请参见

http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPSystemStartup/BPSystemStartup.html.

9.21.4. Windows:启动自动启动服务

在 Windows 上,自动启动功能由两个组件组成。第一个组件是一个配置文件,管理员可以在其中为虚拟机设置延迟启动,并暂时禁用特定用户的自动启动。配置文件应位于所有所需用户可访问的文件夹中,但其权限应允许除管理员之外的所有人只读。配置文件包含几个选项。default_policy 控制自动启动服务是否允许或拒绝为不在例外列表中的用户启动虚拟机。例外列表以 exception_list 开头,并包含一个逗号分隔的用户名列表。此外,可以为每个用户配置单独的启动延迟,以避免主机过载。示例如下

    # Default policy is to deny starting a VM, the other option is "allow".
    default_policy = deny

    # Bob is allowed to start virtual machines but starting them
    # will be delayed for 10 seconds
    bob = {
        allow = true
        startup_delay = 10
    }

    # Alice is not allowed to start virtual machines, useful to exclude certain users
    # if the default policy is set to allow.
    alice = {
        allow = false
    }

用户名可以使用以下形式指定:“user”、“domain\user”、“.\user”和“user@domain”。管理员必须将 VBOXAUTOSTART_CONFIG 环境变量添加到系统变量中,其中包含上述配置文件的路径。环境变量告知自动启动服务使用哪个配置文件。

自动启动功能的第二个组件是Windows服务。此服务的每个实例都代表特定用户使用其凭据工作。

要为特定用户启用自动启动,管理员组的成员必须运行以下命令

VBoxAutostartSvc install --user=user [--password-file=password_file]

密码文件应包含密码,后跟一个换行符。文件的其余部分将被忽略。如果未指定密码文件,将要求用户输入密码。

要禁用特定用户的自动启动,管理员组的成员必须运行以下命令

VBoxAutostartSvc delete --user=user

如果用户更改了密码,则管理员组的成员必须重新安装服务或使用 Windows 服务管理器更改服务凭据。由于 Windows 安全策略,无法为密码为空的用户安装自动启动服务。

最后,用户应定义在启动时应启动哪些虚拟机。用户应为他们希望在启动时启动的每个虚拟机运行以下命令

VBoxManage modifyvm VM name or UUID --autostart-enabled on

用户可以通过运行以下命令从启动时启动的虚拟机中删除特定虚拟机

VBoxManage modifyvm VM name or UUID --autostart-enabled off

注意

在 Windows 主机上,通过自动启动服务启动虚拟机可能会导致一些问题,因为虚拟机与 VBoxSVC 在同一会话中启动。有关更多信息,请参见第 9.35 节,“VBoxSVC 在 Windows Session 0 中运行”

9.22. 虚拟机加密

Oracle VM VirtualBox 允许您透明地加密存储在配置文件、保存状态和客户机 EFI 启动数据中的虚拟机数据。

Oracle VM VirtualBox 在各种模式下使用 AES 算法。所选模式取决于虚拟机的加密组件。Oracle VM VirtualBox 支持 128 位或 256 位数据加密密钥 (DEK)。DEK 以加密形式存储在虚拟机配置文件中,并在虚拟机启动期间解密。

由于 DEK 作为虚拟机配置文件的一部分存储,因此确保文件安全至关重要。丢失 DEK 意味着存储在虚拟机中的数据将无法恢复地丢失。用户有责任对与虚拟机相关的所有数据进行完整和最新的备份。

虚拟机,即使已加密,也可能包含使用不同密码加密的媒体。为此,虚拟机的密码具有一个密码标识符,与媒体密码的方式相同。密码 ID 是一个任意字符串,用于唯一标识虚拟机及其媒体中的密码。您可以为虚拟机及其媒体使用相同的密码和 ID。

9.22.1. 虚拟机加密的限制

使用此功能时,用户需要注意一些限制

  • 导出包含加密虚拟机的设备是不可能的,因为OVF规范不支持此功能。因此,虚拟机在导出期间会被解密。

  • DEK在虚拟机运行时保持在内存中,以便能够加密和解密虚拟机数据。虽然这应该很明显,但用户需要注意这一点,因为攻击者可能能够从受感染的主机中提取密钥并解密数据。

  • 在加密或解密虚拟机时,密码通过 Oracle VM VirtualBox API 以明文形式传递。这需要牢记,尤其是在使用利用 Web 服务的第三方 API 客户端时,密码可能会通过网络传输。在这种情况下,强制使用 HTTPS。

9.22.2. 加密虚拟机

可以使用 VirtualBox 管理器或VBoxManage来加密虚拟机。要使用VBoxManage加密未加密的虚拟机,请使用

VBoxManage encryptvm uuid|vmname setencryption --new-password filename|- \
--cipher cipher-ID --new-password-id ID

要提供加密密码,请将VBoxManage指向存储密码的文件,或指定 -VBoxManage在命令行上提示输入密码。

密码参数指定用于加密的密码,可以是 AES-128AES-256。适当的操作模式(例如 GCM、CTR 或 XTS)将由虚拟机根据加密组件选择。指定的密码标识符可以由用户自由选择,并用于在为虚拟机提供多个密码时进行正确识别。

9.22.3. 打开加密的虚拟机

当 Oracle VM VirtualBox 刚启动时,加密的虚拟机无法打开并保持不可访问。此外,如果加密的虚拟机是刚注册但没有密码或密码不正确,则它也会保持不可访问。用户需要使用 VirtualBox 管理器或以下VBoxManage命令提供密码

VBoxManage encryptvm uuid|vmname addpassword --password filename|- --password-id ID

要提供加密密码,请将VBoxManage指向存储密码的文件,或指定 -VBoxManage在命令行上提示输入密码。

如果 ID 与加密虚拟机时提供的密码标识符相同,它将更新可访问性状态。

要从虚拟机内存中删除输入的密码,请按如下方式使用VBoxManage

VBoxManage encryptvm uuid|vmname removepassword ID

如果 ID 与加密虚拟机时提供的密码标识符相同,它将更新可访问性状态。

注意

如果机器变得不可访问,所有密码都将被清除。您必须使用VBoxManage encryptvm vmname addpassword命令再次添加所需的密码。参见第 9.22.3 节,“打开加密的虚拟机”

9.22.4. 解密加密的虚拟机

在某些情况下,可能需要解密以前加密的虚拟机。这可以在 VirtualBox 管理器中完成,或者使用VBoxManage和以下命令来完成

VBoxManage encryptvm uuid|vmname setencryption --old-password file|-

唯一必需的参数是用于加密虚拟机的密码。选项与加密虚拟机相同。

9.23. Oracle VM VirtualBox 专家存储管理

如果 Oracle VM VirtualBox 的快照模型不足,可以启用一种特殊模式,该模式允许在虚拟机暂停时重新配置存储附件。用户必须确保磁盘数据与客户机保持一致,因为与热插拔不同,客户机不会收到有关分离或新连接媒体的通知。

可以通过执行以下命令在每个虚拟机上启用专家存储管理模式

$ VBoxManage setextradata VM-name "VBoxInternal2/SilentReconfigureWhilePaused" 1

您可以在虚拟机暂停后使用VBoxManage storageattach命令重新配置存储附件。

9.24. 主机电源管理事件的处理

某些主机电源管理事件由 Oracle VM VirtualBox 处理。实际行为取决于平台

  • 主机挂起。当主机即将挂起时(即主机将状态保存到某个非易失性存储并断电时)生成此事件。

    此事件目前仅在 Windows 主机和 Mac OS X 主机上处理。生成此事件时,Oracle VM VirtualBox 将暂停所有正在运行的虚拟机。

  • 主机恢复。当主机从挂起状态唤醒时生成此事件。

    此事件目前仅在 Windows 主机和 Mac OS X 主机上处理。生成此事件时,Oracle VM VirtualBox 将恢复所有之前暂停的虚拟机。

  • 电池电量低。电池电量达到临界水平,通常低于 5% 电量。

    此事件目前仅在 Windows 主机和 Mac OS X 主机上处理。生成此事件时,Oracle VM VirtualBox 将保存状态并终止所有虚拟机,以准备可能的主机断电。

    行为可以配置。通过执行以下命令,不会保存任何虚拟机

    $ VBoxManage setextradata global "VBoxInternal2/SavestateOnBatteryLow" 0

    这是一个全局设置,也是一个按虚拟机设置。按虚拟机的值优先于全局值。以下命令将保存所有虚拟机的状态,但不保存虚拟机“foo”的状态

    $ VBoxManage setextradata global "VBoxInternal2/SavestateOnBatteryLow" 1
    $ VBoxManage setextradata "foo" "VBoxInternal2/SavestateOnBatteryLow" 0

    第一行实际上不是必需的,因为默认情况下会执行保存状态操作。

9.25. 传递 SSE4.1/SSE4.2 指令

为了向客户机提供SSE 4.1/SSE 4.2支持,主机CPU必须实现这些指令集。这些指令集默认暴露给客户机,但可以通过使用以下命令为某些客户机禁用这些指令

$ VBoxManage setextradata VM-name \
VBoxInternal/CPUM/IsaExts/SSE4.1 0
$ VBoxManage setextradata VM-name \
VBoxInternal/CPUM/IsaExts/SSE4.2 0

这些是按虚拟机设置,默认情况下已启用。

9.26. 键盘指示灯同步支持

当机器窗口处于活动状态时,此功能使主机键盘指示灯(LED)与虚拟机模拟键盘的指示灯匹配。目前已为 macOS 和 Windows 主机实现此功能。在受支持的主机操作系统上,此功能默认启用。您可以通过运行以下命令禁用此功能

$ VBoxManage setextradata VM-name GUI/HidLedsSync 0

这是一个按虚拟机设置,默认启用。

9.27. 捕获选定设备的 USB 流量

您可以捕获单个 USB 设备或根集线器级别的 USB 流量,后者会捕获连接到根集线器的所有 USB 设备的流量。Oracle VM VirtualBox 以与 Wireshark 兼容的格式存储流量。要捕获特定 USB 设备的流量,必须使用以下命令通过VBoxManage将其连接到虚拟机

VBoxManage controlvm VM-name usbattach device uuid|address --capturefile filename

要在虚拟机未运行时在根集线器上启用捕获,请使用以下命令

VBoxManage setextradata VM-name \
VBoxInternal/Devices/usb-ehci/0/LUN#0/Config/CaptureFilename filename

上述命令在连接到 EHCI 控制器的根集线器上启用捕获。要为 OHCI 或 XHCI 控制器启用它,请分别将 usb-ehci 替换为 usb-ohciusb-xhci

9.28. 配置心跳服务

Oracle VM VirtualBox 附带一个简单的心跳服务。一旦增强功能激活,客户机就会向主机发送频繁的心跳包。如果客户机在未正确终止服务的情况下停止发送心跳包,虚拟机进程将把此事件记录到 VBox.log 文件中。将来可能会配置专用操作,但目前日志文件中只有一个警告。

有两个参数需要配置。心跳间隔 定义了两个心跳包之间的时间。默认值为 2 秒,即 Oracle VM VirtualBox 增强功能的心跳服务每两秒发送一次心跳包。纳秒值可以像这样配置

VBoxManage setextradata VM-name \
VBoxInternal/Devices/VMMDev/0/Config/HeartbeatInterval 2000000000

心跳超时 定义了主机从上次心跳包开始等待的时间,在此时间之后它将客户机定义为无响应。默认值是心跳间隔的 2 倍(4 秒),并且可以按如下方式(以纳秒为单位)配置

VBoxManage setextradata VM-name \
VBoxInternal/Devices/VMMDev/0/Config/HeartbeatTimeout 4000000000

如果心跳超时,将出现一条日志消息,例如 VMMDev: HeartBeatCheckTimer: Guest seems to be unresponsive. Last heartbeat received 5 seconds ago.。如果在此警告之后又收到心跳包,将出现一条日志消息,例如 VMMDev: GuestHeartBeat: Guest is alive.

9.29. 磁盘映像加密

Oracle VM VirtualBox 允许您透明地加密存储在客户机硬盘映像中的数据。它不依赖于特定的映像格式。具有加密数据的映像在 Oracle VM VirtualBox 和其他虚拟化软件之间不可移植。

Oracle VM VirtualBox 使用 AES 算法的 XTS 模式,并支持 128 位或 256 位数据加密密钥 (DEK)。DEK 以加密形式存储在介质属性中,并在虚拟机启动期间通过输入映像加密时选择的密码来解密。

由于 DEK 作为虚拟机配置文件的一部分存储,因此确保其安全至关重要。丢失 DEK 意味着存储在磁盘映像中的数据将无法恢复地丢失。用户有责任对与虚拟机相关的所有数据进行完整和最新的备份。

9.29.1. 磁盘加密的限制

使用此功能时,用户需要注意一些限制

  • 此功能是 Oracle VM VirtualBox 扩展包的一部分,需要安装。否则磁盘加密将不可用。

  • 由于加密仅对存储的用户数据有效,因此目前无法检查磁盘映像的元数据完整性。攻击者可能会通过删除或更改映像中的数据块或更改元数据项(例如磁盘大小)来破坏数据。

  • 导出包含加密磁盘映像的设备是不可能的,因为OVF规范不支持此功能。因此,所有映像在导出期间都会被解密。

  • DEK 在虚拟机运行时保留在内存中,以便能够解密读取的数据和加密客户机写入的数据。尽管这应该很明显,但用户需要意识到这一点,因为攻击者可能能够在受感染的主机上提取密钥并解密数据。

  • 在加密或解密映像时,密码通过 Oracle VM VirtualBox API 以明文形式传递。这需要牢记,尤其是在使用利用 Web 服务的第三方 API 客户端时,密码可能会通过网络传输。在这种情况下,强制使用 HTTPS。

  • 仅当没有快照或线性快照链时,才能加密包含差异映像的映像。此限制可能会在未来的 Oracle VM VirtualBox 版本中解决。

  • 磁盘加密功能只能保护为虚拟机配置的磁盘内容。它不涵盖与虚拟机相关的任何其他数据,包括保存状态或配置文件本身。

9.29.2. 加密磁盘映像

可以使用 VirtualBox 管理器或VBoxManage来加密磁盘映像。尽管 VirtualBox 管理器更易于使用,但它按虚拟机工作,并加密连接到特定虚拟机的所有磁盘映像。使用VBoxManage可以加密单个映像,包括所有差异映像。要使用VBoxManage加密未加密的介质,请使用

VBoxManage encryptmedium uuid|filename \
--newpassword filename|- --cipher cipher-ID --newpasswordid "ID

要提供加密密码,请将VBoxManage指向存储密码的文件,或指定 - 让 VBoxManage 在命令行上提示您输入密码。

密码参数指定用于加密的密码,可以是 AES-XTS128-PLAIN64AES-XTS256-PLAIN64。指定的密码标识符可以由用户自由选择,并用于在虚拟机启动期间提供多个密码时进行正确识别。

如果用户在加密多个映像时使用相同的密码,并且使用相同的密码标识符,则用户在虚拟机启动期间只需提供一次密码。

9.29.3. 使用加密映像启动虚拟机

当使用 VirtualBox 管理器启动虚拟机时,将打开一个对话框,用户需要在其中输入连接到虚拟机的所有加密映像的所有密码。如果使用另一个前端(如 VBoxHeadless),一旦客户机尝试访问加密磁盘,虚拟机将立即暂停。用户需要通过VBoxManage使用以下命令提供密码

VBoxManage controlvm uuid|vmname addencpassword ID password [--removeonsuspend yes|no]

ID 必须与加密映像时提供的密码标识符相同。password 是加密映像时使用的密码。(可选)您可以指定 --removeonsuspend yes|no 来指定在虚拟机挂起时是否从虚拟机内存中删除密码。在虚拟机可以恢复之前,用户需要再次提供密码。当虚拟机因主机挂起事件而挂起,并且用户不希望密码保留在内存中时,这很有用。

9.29.4. 解密加密的映像

在某些情况下,可能需要解密以前加密的映像。这可以在 VirtualBox 管理器中针对完整的虚拟机完成,或者使用VBoxManage和以下命令来完成

VBoxManage encryptmedium uuid|filename --oldpassword file|-

唯一必需的参数是用于加密映像的密码。选项与加密映像相同。

9.30. 半虚拟化调试

本节介绍如何使用准虚拟化提供程序支持的接口调试客户机操作系统。

注意

准虚拟化调试会显著改变客户机操作系统的行为,应仅供专家用户用于调试和诊断。

这些调试选项以逗号分隔的键值对字符串形式指定。空字符串会禁用准虚拟化调试。

9.30.1. Hyper-V 调试选项

下面列出的所有选项都是可选的,因此当未指定相应的键值对时,将使用指定的默认值。

  • 键:enabled

    值:01

    默认值:0

    指定 1 以启用 Hyper-V 调试接口。如果未指定此键值对或值不为 1,则无论是否存在其他键值对,Hyper-V 调试接口都将被禁用。

  • 键:address

    值:IPv4地址

    默认值:127.0.0.1

    指定远程调试器连接的IPv4地址。

  • 键:port

    值:UDP端口号

    默认值:50000

    指定远程调试器连接的UDP端口号。

  • 键:vendor

    值:CPUID报告给客户机的Hyper-V供应商签名

    默认值:当调试启用时:Microsoft Hv,否则:VBoxVBoxVBox

    指定通过CPUID暴露给客户机的Hyper-V供应商签名。对于调试Microsoft Windows客户机,要求虚拟机管理程序报告Microsoft供应商。

  • 键:hypercallinterface

    值:01

    默认值:0

    指定当客户机请求时,是否应建议使用超调用而不是MSR来启动主机和客户机之间的调试数据传输。

  • 键:vsinterface

    值:01

    默认值:当调试启用时,1,否则 0

    指定是否向客户机公开VS#1虚拟化服务接口。此接口是调试Microsoft Windows 10 32位客户机所必需的,但对于其他Windows版本是可选的。

9.30.1.1. 为使用 Hyper-V 半虚拟化提供程序进行调试设置 Windows 客户机

Windows支持通过串行电缆、USB、IEEE 1394 Firewire和以太网进行调试。USB和IEEE 1394不适用于虚拟机,以太网需要Windows 8或更高版本。虽然串行连接通用可用,但速度慢。

使用 Hyper-V 调试传输(在 Windows Vista 及更高版本上受支持)进行调试具有显著优势。它由于直接的主机到客户机传输而提供了出色的性能,易于设置,并且对 hypervisor 的支持要求极低。它可以与在虚拟机同一主机上运行的调试器一起使用,也可以与通过网络连接在不同机器上的调试器和虚拟机一起使用。

先决条件

  • 配置为 Hyper-V 半虚拟化并运行 Windows Vista 或更新 Windows 客户机的虚拟机。您可以通过以下VBoxManage命令的输出来检查虚拟机的有效半虚拟化提供程序

    $ VBoxManage showvminfo VM-name
  • 足以调试虚拟机中Windows版本的最新版Microsoft WinDbg调试器。

  • 虽然 Windows 8 和更新的 Windows 客户机附带 Hyper-V 调试支持,但 Windows 7 和 Vista 不支持。要在 Windows 7 或 Vista 客户机上使用 Hyper-V 调试,请从 Windows 8.0 安装中复制文件 kdvm.dll。此文件通常位于 C:\Windows\System32。将其复制到 Windows 7/Vista 客户机中的相同位置。确保复制与您的客户机操作系统匹配的 32 位或 64 位 DLL 版本。

    注意

    只有 Windows 8.0 附带 kdvm.dll。Windows 8.1 及更新的 Windows 版本不附带。

虚拟机和客户机配置

  1. 关闭虚拟机。

  2. 使用以下VBoxManage命令启用调试选项

    $ VBoxManage modifyvm VM-name --paravirt-debug "enabled=1"

    上述命令假定您的调试器将连接到您主机上的UDP端口50000。但是,如果您需要在远程机器上运行调试器,则可以在此处指定远程地址和端口。例如

    $ VBoxManage modifyvm VM-name \
    --paravirt-debug "enabled=1,address=192.168.32.1,port=55000"

    有关完整的选项集,请参见第 9.30.1 节,“Hyper-V 调试选项”

  3. 启动虚拟机。

  4. 在客户机中,启动一个提升的命令提示符并执行以下命令

    • 对于Windows 8或更高版本的Windows客户机

      bcdedit /dbgsettings net hostip:5.5.5.5 port:50000 key:1.2.3.4
    • 对于Windows 7或Vista客户机

      bcdedit /set loadoptions host_ip=5.5.5.5,host_port=50000,encryption_key=1.2.3.4
      bcdedit /set dbgtransport kdvm.dll

      使用 Hyper-V 调试传输时,bcdedit命令中的 IP 地址和端口将被忽略。可以输入任何有效的 IP 和大于 49151 且小于 65536 的端口号。

      bcdedit命令中的加密密钥是相关的且必须有效。上述示例中使用的密钥“1.2.3.4”是有效的,如果安全性不是问题,则可以使用。如果您不指定任何加密密钥,bcdedit将为您生成一个,您需要复制此密钥以便稍后在远程端的 Microsoft WinDbg 中输入。此加密密钥用于加密 Windows 和调试器之间交换的调试数据。

    • 运行以下一个或多个命令以启用Windows客户机相应阶段或组件的调试

      bcdedit /set debug on
      bcdedit /set bootdebug on
      bcdedit /set {bootmgr} bootdebug on

      请注意,当使用 Hyper-V 调试传输时,bootdebug选项仅在 Windows 8 或更新版本上有效。有关bcdedit选项的详细说明,请参阅 Microsoft Windows 文档。

  5. 在您的主机或远程主机上启动Microsoft WinDbg。

    文件菜单中,选择内核调试。在网络选项卡上,指定您在 paravirtdebug 选项中使用的 UDP 端口号。如果您未指定任何端口,请将其保留为 50000。确保 UDP 端口未被防火墙或其他安全软件阻止。

    密钥字段中,输入 1.2.3.4 或您的 Windows 客户机中bcdedit命令的加密密钥。

    单击确定开始侦听连接。Microsoft WinDbg 在此阶段通常会显示“等待重新连接”消息。

    或者,要直接启动调试会话,请从命令行运行 WinDbg,如下所示

    windbg.exe -k net:port=50000,key=1.2.3.4

    有关完整的命令行语法,请参阅WinDbg文档。

  6. 重新启动您的Windows客户机,然后它应该作为调试对象连接到Microsoft WinDbg。

9.31. PC 扬声器直通

作为一项实验性功能,主要是由于仅限于 Linux 主机且 Linux 发行版覆盖范围未知,Oracle VM VirtualBox 支持将 PC 扬声器直通到主机。PC 扬声器(有时称为系统扬声器)是一种无需常规音频和声卡支持即可产生可听反馈(例如蜂鸣声)的方式。

Oracle VM VirtualBox 中的 PC 扬声器直通功能仅处理蜂鸣声。虚拟机对 PC 扬声器的高级使用(例如 PCM 音频)将无法工作,导致主机行为未定义。

在 Linux 上产生蜂鸣声是一个非常复杂的话题。Oracle VM VirtualBox 提供了一系列选项,旨在使其在尽可能多的 Linux 发行版和系统配置上确定性且可靠地工作。这些总结在下表中。

表 9.4. PC 扬声器配置选项

代码

设备

备注

1

/dev/input/by-path/platform-pcspkr-event-spkr

直接使用主机PC扬声器。

2

/dev/tty

使用虚拟机进程的终端关联。虚拟机需要在虚拟控制台上启动。

3

/dev/tty0/dev/vc/0

只能由 root 用户或具有 cap_sys_tty_config 能力的用户使用。

9

用户指定的控制台或evdev设备路径。

与代码1到3相同,但使用自定义设备路径。

70

/dev/tty

仅标准蜂鸣声。丢失频率和长度。参见代码2。

79

用户指定的终端设备路径。

与代码70相同,但使用自定义设备路径。

100

以上所有。

尝试所有可用代码。

要启用PC扬声器直通,请使用以下命令

VBoxManage setextradata VM-name "VBoxInternal/Devices/i8254/0/Config/PassthroughSpeaker" N

N 替换为您要使用的用例代码。更改此设置将在您下次启动虚拟机时生效。在所有主机操作系统上启用 PC 扬声器直通是安全的。它仅在 Linux 上生效。

虚拟机日志文件 VBox.log 包含带有前缀 PIT: speaker: 的行,显示 PC 扬声器直通设置活动。它提供了有关它选择了哪个设备或为什么失败的提示。

为虚拟机启用 PC 扬声器直通通常是简单的一部分。真正的困难在于确保 Oracle VM VirtualBox 可以访问必要的设备,因为在典型的 Linux 安装中,大多数设备只能由 root 用户访问。您应该遵循推荐的方式来持久更改此设置,例如参考您的发行版文档。由于 Linux 发行版变体无数,我们只能给出一般性提示,即通常有一种方法可以授予 X11 会话用户访问附加设备的权限,或者您需要使用 udev 配置文件找到一个可行的解决方案。如果一切都失败了,您可以尝试使用在主机系统启动中运行足够晚的脚本来设置权限。

有时内核会应用额外的规则来限制访问。例如,虚拟机进程必须与配置用于蜂鸣的设备具有相同的控制终端,这对于 Oracle VM VirtualBox 等 GUI 应用程序来说通常非常难以实现。上表包含一些提示,但通常请参阅 Linux 文档。

如果即使设备权限已设置并且 VBox.log 确认它使用 evdev 或控制台进行 PC 扬声器控制,您仍然无法听到任何蜂鸣声,请检查您的系统是否具有 PC 扬声器。某些系统没有。其他复杂情况可能源于 Linux 将 PC 扬声器输出重定向到声卡。如果您将扬声器连接到声卡,请检查蜂鸣声是否可听见。如今几乎所有系统都拥有一个。最后,检查音频混音器控制是否有一个名为“beep”的通道(可能隐藏在混音器设置中),并且它未被静音。

9.32. 使用 USB/IP 访问通过网络公开的 USB 设备

Oracle VM VirtualBox 支持通过 USB over IP 协议将通过网络公开的 USB 设备直通,而无需配置由内核和 usbip 工具提供的客户端。此外,此功能适用于在任何受支持的主机上运行的 Oracle VM VirtualBox,而不仅仅是单独的 Linux,就像官方客户端一样。

要启用对USB/IP设备直通的支持,请使用以下命令添加导出设备的设备服务器

VBoxManage usbdevsource add unique-name --backend USBIP --address device-server[:port]

设备服务器上导出的 USB 设备随后可以通过 VirtualBox 管理器或VBoxManage访问,就像任何本地连接的 USB 设备一样。这可以多次使用以访问不同的设备服务器。

要删除设备服务器,可以使用以下命令

$ VBoxManage usbdevsource remove unique-name

9.32.1. 在 Linux 系统上设置 USB/IP 支持

本节简要概述了如何设置基于 Linux 的系统以充当 USB 设备服务器。服务器上的系统要求 usbip-core.kousbip-host.ko 内核驱动程序可用,并且安装了 USB/IP 工具包。所需工具的特定安装方法取决于所使用的发行版。例如,对于基于 Debian 的系统,请使用以下命令安装所需的工具

$ apt-get install usbip-utils

要检查是否已安装必要的工具,请使用以下命令

$ usbip list -l
      

这将产生类似于下面示例中所示的输出

 - busid 4-2 (0bda:0301)
   Realtek Semiconductor Corp. : multicard reader (0bda:0301)

 - busid 5-1 (046d:c52b)
   Logitech, Inc. : Unifying Receiver (046d:c52b)
      

如果一切都已安装,则需要使用以下命令以 root 身份启动 USB/IP 服务器

# usbipd -D

请参阅已安装发行版的文档,以确定如何在系统启动时启动服务。

默认情况下,服务器上不导出任何设备。必须手动为每个设备执行此操作。要导出设备,请使用以下命令

# usbip bind -b "bus identifier"

要导出上一个示例中的多卡读卡器

# usbip bind -b 4-2

9.32.2. 安全注意事项

服务器和客户端之间的通信未加密,并且访问导出设备无需授权。攻击者可能会嗅探敏感数据或获得对设备的控制权。为了降低此风险,设备应通过只有受信任客户端才能访问的本地网络公开。要通过公共网络远程访问设备,应使用 VPN 解决方案以提供所需级别的安全保护。

9.33. 将 Hyper-V 与 Oracle VM VirtualBox 结合使用

Oracle VM VirtualBox 可以在运行 Hyper-V 的 Windows 主机上使用。这是实验性功能。

无需配置。Oracle VM VirtualBox 会自动检测 Hyper-V,并使用 Hyper-V 作为主机系统的虚拟化引擎。虚拟机窗口状态栏中的 CPU 图标表示正在使用 Hyper-V。

注意

使用此功能时,某些主机系统可能会遇到 Oracle VM VirtualBox 性能显著下降的情况。

9.34. 嵌套虚拟化

Oracle VM VirtualBox 支持嵌套虚拟化。此功能支持将硬件虚拟化功能直通到客户虚拟机。这意味着您可以在 Oracle VM VirtualBox 客户机上安装一个 hypervisor,例如 Oracle VM VirtualBox、Oracle VM Server 或 KVM。然后您可以在客户虚拟机中创建并运行虚拟机。

主机CPU上不存在的硬件虚拟化功能将不会暴露给客户机。此外,某些功能(如嵌套分页)尚未支持直通到客户机。

您可以通过以下方式之一启用嵌套虚拟化功能

  • 在 VirtualBox 管理器中,在处理器选项卡上选中启用嵌套 VT-x/AMD-V复选框。要禁用此功能,请取消选中该复选框。

  • 使用VBoxManage modifyvm命令的 --nested-hw-virt 选项来启用或禁用嵌套虚拟化。参见第 8.10 节,“VBoxManage modifyvm”

9.35. VBoxSVC 在 Windows 会话 0 中运行

Oracle VM VirtualBox 支持在 Windows 会话 0 中执行 VBoxSVC。这使得 VBoxSVC 可以像常规 Windows 服务一样运行,从而使无头虚拟机即使在用户注销后也能继续运行。

注意

这目前是一项实验性功能。

此功能默认禁用,可以通过在 Windows 注册表的 HKEY_LOCAL_MACHINE\Software\Oracle\VirtualBox\VBoxSDS 键中创建 REG_DWORD 值 ServerSession0 来启用。将该值的数据指定为 1 以启用此功能,或指定 0 以禁用此功能。需要重新启动主机才能使更改生效。

9.35.1. 已知问题

  • 由于不同的 Windows 会话拥有各自的资源集,当至少一个 Oracle VM VirtualBox 进程在会话 0 中运行时,访问在交互式用户会话中创建的网络共享可能会出现一些问题。

    要在会话0中访问网络共享,一种可能的解决方法是建立对共享的永久访问,然后重新启动主机。

9.36. VISO 文件格式 / RTIsoMaker

ISO 映像创建工具。

概要

RTIsoMaker [options] [@commands.rsp] <filespec...>

描述

构造虚拟ISO 9660 / Joliet / UDF / HFS混合镜像,并将其写入文件 (RTIsoMaker) 或作为虚拟镜像 (VISO) 提供服务。

VISO 文件格式

VISO文件是一个虚拟ISO镜像,即从主机上的一堆文件在内存中构建。VISO只是描述如何使用与mkisofs和genisoimage大致相似的语法进行操作的“食谱”。

一个要求是 VISO 文件必须以 --iprt-iso-maker-file-marker 选项之一开头。您使用的选项将决定读取文件时使用的引用和转义规则。该选项将映像 UUID 作为参数。

VISO文件被视为UTF-8,且不得包含任何字节顺序标记 (BOM)。目前无法在VISO文件中注释掉行。

文件规范和 --name-setup

所有不以“@”开头的非选项都被视为指示应添加到ISO映像的文件、目录或类似内容。目录会递归添加,内容受筛选选项的约束。

由于 ISO 上最多可以有六个不同的命名空间,因此能够控制每个命名空间中使用的名称并能够从一个或多个命名空间中排除对象非常方便。--name-setup 选项指定立即使用的文件规范格式。

默认设置为

--name-setup iso+joliet+udf+hfs

这意味着您为所有命名空间指定一个ISO上的名称,后跟“=”和源文件系统名称。仅指定源文件系统会将文件/目录/其他添加到ISO映像的根目录。

让我们看看以下两个例子

/docs/readme.txt=/home/user/Documents/product-x-readme.txt

/home/user/Documents/product-x-readme.txt

在第一种情况下,文件 '/home/user/Documents/product-x-readme.txt' 在所有启用的命名空间中作为 '/docs/readme.txt' 添加到 ISO 映像中。在主 ISO 9660 命名空间中,文件名默认将转换为大写,因为这是规范所要求的。

在第二种情况下,该文件以 'product-x-readme.txt' 的名称添加到所有命名空间的根目录中。不过,在主 ISO 9660 命名空间中,该名称将根据当前 ISO 级别进行转换,可能大写,也可能被截断。

给定 --name-setup iso,joliet,udf,您可以根据需要为这三个命名空间中的每一个单独指定名称。如果您省略任何名称,它们将使用给定的最后一个名称。任何留空 (==) 的名称将被视为省略。

每个命名空间中使用不同的名称

/ISO.TXT=/Joliet.TxT=/UDF.txt=/tmp/iso/real.txt

在 ISO 9660 命名空间中使用特定名称,其余命名空间使用相同名称

/ISO.TXT=/OtherNamespaces.TxT=/tmp/iso/real.txt

从 ISO 9660 命名空间中省略文件

=/OtherNamespaces.TxT=/tmp/iso/real.txt

从 joliet 命名空间中省略文件

/ISO.TXT==/UDF.TxT=/tmp/iso/real.txt

在所有地方使用与源文件相同的名称

/tmp/iso/real.txt

例如,使用 --name-setup udf,您可以将文件/目录/任何内容添加到选定的命名空间,而无需使用上面更复杂的空名称语法。

添加目录时,您只能控制目录本身的命名和省略,而不能控制其下任何递归添加的文件和目录。

选项

常规

-o output-file , --output=output-file

输出文件名。VISO 模式不支持此选项。

--name-setup=spec

配置活动命名空间以及如何解释文件规范。规范是逗号分隔的列表。列表中的每个元素都是一个子列表,由空格、'+''|' 分隔,给出元素控制的命名空间。命名空间分为主要和次要两种,您不能在次要命名空间所属的主要命名空间之前指定次要命名空间。

主要命名空间和括号中的别名

  • iso (primary, iso9660, iso-9660, primary-iso, iso-primary)

  • joliet

  • udf

  • hfs (hfs-plus)

次要命名空间

  • rock: 之前主要命名空间上的 rock ridge (iso / joliet)

  • iso-rock: 主 ISO 9660 命名空间上的 rock ridge 扩展

  • joliet-rock: joliet 命名空间上的 rock ridge (只是为了好玩)

  • trans-tbl: 之前主要命名空间上的翻译表文件

  • iso-trans-tbl

  • joliet-trans-tbl

  • udf-trans-tbl

  • hfs-trans-tbl

--name-setup-from-import

这用于在一个或多个 --import-iso 操作之后使用,并将尽可能选择与导入内容匹配的配置。如果导入的 ISO 只有 iso9660 命名空间,则 joliet、udf 和 hfs 命名空间将被删除。这在向 ISO 添加附加文件时很有用,并且可以防止客户机在挂载时选择没有导入的 ISO 内容的命名空间。

--push-iso=iso-file , --push-iso-no-joliet=iso-file , --push-iso-no-rock-iso-file , --push-iso-no-rock-no-joliet=iso-file

打开指定的 ISO 文件并将其用作源文件系统,直到遇到相应的 --pop 选项。这些变体用于选择 ISO 上要(不)访问的命名空间。这些选项对于从 ISO 复制文件/目录/内容很方便,无需先提取它们或使用 :iprtvfs: 语法。

--pop

弹出源文件系统堆栈中的 --push-iso

--import-iso=iso-file

导入给定 ISO 文件中的所有内容,包括启动配置和系统区域(前 16 个扇区)内容。您可以使用 --name-setup 来省略命名空间。

命名空间

--iso-level=0|1|2|3

设置 ISO 级别

  • 0: 禁用主 ISO 命名空间。

  • 1: ISO 级别 1: 文件名为 8.3 格式,且限制为 4GB - 1。

  • 2: ISO 级别 2: 31 个字符的名称,且限制为 4GB - 1。

  • 3: ISO 级别 3: 31 个字符的名称,并支持大于等于 4GB 的文件。(默认)

  • 4: 其他工具使用的虚构级别。尚未实现。

--rock-ridge , --limited-rock-ridge , --no-rock-ridge

为主 ISO 9660 命名空间启用或禁用 Rock Ridge 支持。--limited-rock-ridge 选项省略了根目录中的几个位,这会使 Linux 选择 Rock Ridge 而不是 Joliet。

默认值:--limited-rock-ridge

-J , --joliet , --no-joliet

启用或禁用 joliet 命名空间。此选项必须位于任何文件规范之前。

默认值:--joliet

--joliet-ucs-level=1|2|3 , --ucs-level=1|2|3

设置 Joliet UCS 支持级别。目前这仅在映像中标记,但不在实际路径名上强制执行。

默认级别:3

文件属性

--rational-attribs

启用合理的文件属性处理(默认)

  • 所有者 ID 设置为零

  • 组 ID 设置为零

  • 对于不可执行文件,模式设置为 0444。

  • 对于可执行文件,模式设置为 0555。

  • 对于目录,模式设置为 0555,保留粘滞位。

--strict-attribs

抵消 --rational-attribs,并使属性完全按照它们在源中显示的方式记录。

--file-mode=mode , --no-file-mode

控制 rock ridge、UDF 和 HFS 的强制文件模式掩码。

--dir-mode=mode , --no-dir-mode

控制 rock ridge、UDF 和 HFS 的强制目录模式掩码。

--new-dir-mode=mode

控制隐式创建目录的默认模式掩码(Rock Ridge、UDF、HFS)。--dir-mode 选项会覆盖此设置。

--chmod=mode:on-iso-file

显式设置已添加到 ISO 的文件/目录/任何内容的 Rock Ridge、UDF 和 HFS 文件模式。模式可以是八进制、ra+xa+ra+rx。(对更复杂模式规范的支持可能会在以后实现。)

请注意,只有当前 --name-setup 中的命名空间会受到影响。

--chown=owner-id:on-iso-file

显式设置已添加到 ISO 的文件/目录/任何内容的 rock ridge、UDF 和 HFS 文件所有者 ID(数字)。

请注意,只有当前 --name-setup 中的命名空间会受到影响。

--chgrp=group-id:on-iso-file

显式设置已添加到 ISO 的文件/目录/任何内容的 rock ridge、UDF 和 HFS 文件组 ID(数字)。

请注意,只有当前 --name-setup 中的命名空间会受到影响。

启动

--eltorito-new-entry , --eltorito-alt-boot

开始一个新的 El Torito 引导条目。

--eltorito-add-image=filespec

文件规范,指定应添加到映像并用作当前引导条目的 El Torito 引导映像的文件。

-b on-iso-file , --eltorito-boot=on-iso-file

指定 ISO 上的文件作为当前引导条目的 El Torito 引导映像。

--eltorito-floppy-12 , --eltorito-floppy-144 , --eltorito-floppy-288 , --no-emulation-boot , --hard-disk-boot

设置当前 El Torito 引导条目的引导映像仿真类型。

--boot-load-seg=seg

为当前 El Torito 引导条目指定映像加载段。

默认:0x7c0

--boot-load-size=sectors

为当前 El Torito 引导条目指定以仿真扇区为单位的映像加载大小。

默认:4(512 字节的扇区)

--no-boot

指示当前 El Torito 引导条目不可引导。(据称 BIOS 将配置仿真,但不会尝试引导。)

--boot-info-table

将 isolinux/syslinux 引导信息表写入当前 El Torito 引导条目的引导映像中。

--eltorito-platform-id=id

根据使用时间,设置当前条目、验证条目的新条目的 El Torito 平台 ID。ID 必须是以下之一:x86PPCMacefi

-c namespec , --boot-catalog=namespec

将 El Torito 启动目录作为文件输入到命名空间中。namespec 使用与“filespec”相同的格式,但省略了最终的源文件系统名称组件。

-G file , --generic-boot=file

指定一个应在 ISO 映像中偏移量 0 处加载的文件。文件大小不得超过 32KB。创建混合映像时,此文件的某些部分可能会被分区表等重新生成。

字符串属性(仅适用于活动命名空间)

--abstract=file-id

根目录中抽象文件的名称。

-A text|_file-id , --application-id=text|_file-id

应用程序 ID 字符串或根文件名。后者必须以 "_"(下划线) 为前缀。

--biblio=file-id

根目录中参考书目文件的名称。

--copyright=file-id

根目录中版权文件的名称。

-P text|_file-id , --publisher=text|_file-id

发布者 ID 字符串或根文件名。后者必须以 "_"(下划线) 为前缀。

-p text|_file-id , --preparer=text|_file-id

数据准备者 ID 字符串或根文件名。后者必须以 "_"(下划线) 为前缀。

--sysid=text

系统 ID 字符串。

--volid=text , --volume-id=text

卷 ID 字符串(标签)。(可以通过在 --volume-id 出现之间使用 --name-setup 选项更改活动命名空间,为主要 ISO 9660、Joliet、UDF 和 HFS 设置不同的标签。)

--volset=text

卷集 ID 字符串。

兼容性

--graft-points

--name-setup iso+joliet+udf+hfs 的别名。

-l , --long-names

允许 31 个字符的文件名。在此处只需确保 ISO 级别大于等于 2。

-R , --rock

--rock-ridge--strict-attribs 相同。

-r , --rational-rock

--rock-ridge--rational-attribs 相同。

VISO 特定选项

--iprt-iso-maker-file-marker=UUID , --iprt-iso-maker-file-marker-bourne=UUID , --iprt-iso-maker-file-marker-bourne-sh=UUID

在 VISO 文件中用作第一个选项,用于指定文件 UUID,并指示其使用 bourne-shell 参数引用和转义样式进行格式化。

--iprt-iso-maker-file-marker-ms=UUID , --iprt-iso-maker-file-marker-ms-sh=UUID

在 VISO 文件中用作第一个选项,用于指定文件 UUID,并指示其使用 microsoft CRT 参数引用和转义样式进行格式化。

测试(不适用于 VISO)

--output-buffer-size=bytes

选择特定的输出缓冲区大小以测试虚拟映像读取。

--random-output-buffer-size

为每个虚拟映像读取启用随机缓冲区大小,使用当前输出缓冲区大小 (--output-buffer-size) 作为最大值。

--random-order-verification=size

启用映像的验证通过,该验证将虚拟映像和输出映像中给定大小的块以随机顺序进行比较。