跳转至内容

VirtualBox

来自 ArchWiki

VirtualBox 是一个 虚拟机管理程序,用于在现有操作系统之上,在一个称为 虚拟机 的特殊环境中运行操作系统。 VirtualBox 正在不断开发中,新功能不断实现。它配有一个 Qt 图形用户界面,以及用于管理和运行虚拟机的 无头SDL 命令行工具。

为了将主机系统的功能集成到虚拟机中,包括共享文件夹和剪贴板、视频加速以及无缝窗口集成模式,为某些虚拟机操作系统提供了 Guest Additions

有关更多信息,请参阅 官方文档

Arch Linux 主机安装步骤

要在您的 Arch Linux 系统上运行 VirtualBox 虚拟机,请按照以下安装步骤进行。

安装核心软件包

安装 virtualbox 包。您还需要选择一个提供主机模块的包

要编译 virtualbox-host-dkms 提供的 VirtualBox 模块,还需要安装您已安装内核的相应头文件包(例如,对于 linux-rt,需要安装 linux-rt-headers)。 [1] 当 VirtualBox 或内核更新时,由于 DKMS pacman hook,内核模块将自动重新编译。

签名模块

当使用启用了 `CONFIG_MODULE_SIG_FORCE` 选项的自定义内核时,您必须使用内核编译期间生成的密钥来签名您的模块。

您可以通过以 root 身份执行以下命令来签名模块

# find "/lib/modules/$(uname -r)/" '(' -name 'vboxdrv.ko*' -o -name 'vboxnetadp.ko*' -o -name 'vboxnetflt.ko*' ')' -exec /lib/modules/$(uname -r)/build/scripts/sign-file sha256 /lib/modules/$(uname -r)/build/certs/signing_key.pem /lib/modules/$(uname -r)/build/certs/signing_key.x509 {} ';'
注意 散列算法不必与配置的算法匹配,但它必须内置于内核中。

如果您遇到类似以下的错误

At main.c:171:
- SSL error:FFFFFFFF80000002:system library::No such file or directory: crypto/bio/bss_file.c:67
- SSL error:10000080:BIO routines::no such file: crypto/bio/bss_file.c:75
sign-file: certs/signing_key.pem

然后运行命令 `cd /lib/modules/$(uname -r)/build` 导航到您的内核树文件夹,并检查 `certs` 文件夹是否确实包含 `signing_key.pem` 文件。如果不是,请在一个系统上的位置(不一定是内核树文件夹)创建一个名为 `x509.genkey` 的文件,内容如下(基于 [2]

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
CN = Modules

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

然后,在您创建 `x509.genkey` 文件的目录中运行 `openssl req -new -nodes -utf8 -sha512 -days 36500 -batch -x509 -config x509.genkey -outform DER -out signing_key.x509 -keyout signing_key.pem`,并将生成的​​文件移动到内核树文件夹的 `certs` 目录中。然后您应该可以再次运行签名命令而不会出错。

如果这仍然无效,请尝试将内核更新到较新版本,该版本已包含签名文件(大多数内核包应该都包含),或者如果您正在 自行编译,请确保在构建并运行内核后,将 `src/(kernel version)/certs/signing_key.x509` 和 `src/(kernel version)/certs/signing_key.pem` 从构建内核的文件夹复制到 `/lib/modules/$(uname -r)/build/certs` 目录。

加载 VirtualBox 内核模块

virtualbox-host-modules-archvirtualbox-host-dkms 使用 `systemd-modules-load.service` 在启动时自动加载 VirtualBox 模块。安装后加载模块,需要重启或手动加载一次模块;模块列表可以在 `/usr/lib/modules-load.d/virtualbox-host-modules-arch.conf`、`/usr/lib/modules-load.d/virtualbox-host-modules-lts.conf` 或 `/usr/lib/modules-load.d/virtualbox-host-dkms.conf` 中找到。

注意 如果您不希望 VirtualBox 模块在启动时自动加载,您必须通过在 `/etc/modules-load.d/` 中创建一个同名空文件(或指向 `/dev/null` 的符号链接)来屏蔽默认的 `/usr/lib/modules-load.d/virtualbox-host-modules-arch.conf`、`/usr/lib/modules-load.d/virtualbox-host-modules-lts.conf` 或 `/usr/lib/modules-load.d/virtualbox-host-dkms.conf`。

在 VirtualBox 使用的 内核模块 中,有一个名为 `vboxdrv` 的强制模块,它必须在任何虚拟机运行之前加载。

要手动加载模块,请运行

# modprobe vboxdrv

以下模块仅在高级配置中需要

  • `vboxnetadp` 和 `vboxnetflt` 在您打算使用 桥接主机仅网络 功能时都需要。更具体地说,`vboxnetadp` 用于在 VirtualBox 全局首选项中创建主机接口,而 `vboxnetflt` 用于启动使用该网络接口的虚拟机。
注意 如果在更新模块时 VirtualBox 内核模块已加载,您需要手动重新加载它们以使用新更新的版本。为此,请以 root 身份运行 `vboxreload`。

在虚拟机中访问主机 USB 设备

要在虚拟机中使用主机机的 USB 端口,请将希望被授权使用此功能的用户添加到 `vboxusers` 用户组

Guest Additions

也建议在运行 VirtualBox 的主机上安装 virtualbox-guest-iso 包。该包将作为一个磁盘镜像,用于将 Guest Additions 安装到非 Arch Linux 的虚拟机操作系统中。`.iso` 文件将位于 `/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso`,并且可能需要手动挂载到虚拟机内部。挂载后,您可以在虚拟机内部运行 Guest Additions 安装程序。对于 Arch Linux 虚拟机,请参阅 VirtualBox/Install Arch Linux as a guest#Install the Guest Additions

扩展包

Oracle VM VirtualBox Extension Pack 提供了 附加功能,并以非自由许可证发布,仅供个人使用。要安装它,可以使用 virtualbox-ext-oracleAUR 包,也可以在 seblu 仓库中找到预编译版本。

如果您更喜欢传统的手动方式:手动下载扩展包并通过 GUI(文件 > 工具 > 扩展包管理器)或通过 `VBoxManage extpack install <.vbox-extpack>` 进行安装。请确保您拥有像 Polkit 这样的工具包来授予 VirtualBox 特权访问权限。扩展包的安装 需要 root 权限

您也可以通过以下命令在不使用 Polkit 的情况下安装 扩展包

# vboxmanage extpack install path-to-extension-pack

非自由扩展包功能之一是支持远程桌面协议 (RDP)。此功能也可以通过开源的 `VNC Extension Pack` 来实现,方法是安装 virtualbox-ext-vnc 包。

前端

VirtualBox 附带四种前端

  • 如果您想使用带常规 GUI 的 VirtualBox,请使用 `VirtualBox`。
  • 如果您想从命令行启动和管理虚拟机,请使用 `VBoxSDL` 命令,它只提供一个无叠加层的虚拟机纯窗口。
  • 如果您想在不运行任何 GUI 的情况下使用 VirtualBox(例如在服务器上),请使用 `VBoxHeadless` 命令。通过 VRDP 扩展,您仍然可以远程访问虚拟机的显示。
  • 如果您想远程管理虚拟机,VirtualBox Web Service (`vboxwebsrv`) 提供服务器端后端。它可以与 RemoteBox (GUI) 或 phpVirtualBox (WebUI) 一起使用。

请参阅 VirtualBox 手册 以了解如何创建虚拟机。

警告 如果您打算将虚拟磁盘镜像存储在 Btrfs 文件系统上,在创建任何镜像之前,您应该考虑禁用这些镜像目标目录的 写时复制 (Copy-on-Write)

Wayland 中的一项安全功能(即使用 GDM 时)会阻止 VirtualBox 捕获所有键盘输入。这在您想将窗口管理器快捷键传递给虚拟机操作系统时很麻烦。可以通过将 VirtualBox 列入白名单来绕过此限制

$ gsettings get org.gnome.mutter.wayland xwayland-grab-access-rules
$ gsettings set org.gnome.mutter.wayland xwayland-grab-access-rules "['VirtualBox Machine']"

第一个命令将显示是否已将其他应用程序列入白名单。如果是,请将 `VirtualBox Machine` 添加到该列表中,而不是将其作为唯一一项。

Arch Linux 虚拟机安装步骤

请参阅 VirtualBox/Install Arch Linux as a guest

虚拟磁盘管理

另请参阅 #Import/export VirtualBox virtual machines from/to other hypervisors

VirtualBox 支持的格式

VirtualBox 支持以下虚拟磁盘格式

  • VDI: 虚拟磁盘镜像 (Virtual Disk Image) 是 VirtualBox 自有的开放容器,在您使用 VirtualBox 创建虚拟机时默认使用。
  • VMDK: 虚拟机磁盘 (Virtual Machine Disk) 最初由 VMware 为其产品开发。该规范最初是闭源的,但后来已成为一种开放格式,并得到 VirtualBox 的完全支持。此格式可以选择分割成多个 2GB 文件。如果您想将虚拟机存储在不支持非常大文件的机器上,此功能尤其有用。其他格式(排除 Parallels 的 HDD 格式)不提供此类等效功能。
  • VHD: 虚拟硬盘 (Virtual Hard Disk) 是 Microsoft 在 Windows Virtual PC 和 Hyper-V 中使用的格式。如果您打算使用任何这些 Microsoft 产品,您必须选择此格式。
提示 自 Windows 7 起,此格式无需任何附加应用程序即可直接挂载。
  • VHDX (只读): 这是 Microsoft 开发的虚拟硬盘格式的扩展版本,于 2012-09-04 随 Windows Server 2012 附带的 Hyper-V 3.0 发布。此新版本的磁盘格式提供了增强的性能(更好的块对齐)、更大的块大小以及日志支持,带来了断电恢复能力。VirtualBox 应支持此格式,但只能读取
  • HDD (版本 2): HDD 格式由 Parallels Inc 开发,并用于其虚拟化解决方案,如 Parallels Desktop for Mac。此格式的较新版本(即 3 和 4)由于缺乏该专有格式的文档而不被支持。
    注意 目前关于版本 2 格式支持存在争议。尽管官方 VirtualBox 手册 仅报告支持 HDD 文件格式的第二个版本,但 Wikipedia 的贡献者 报告第一个版本也可能有效。如果您可以对 HDD 格式的第一个版本进行测试,我们欢迎您的帮助。
  • QED: QEMU Enhanced Disk 格式是 QEMU(另一个免费开源虚拟机管理程序)的一种旧文件格式。该格式从 2010 年开始设计,旨在提供比 QCOW2 等格式更优越的替代方案。该格式具有完全异步 I/O 路径、强大的数据完整性、后端文件和稀疏文件。QED 格式仅支持与使用旧版本 QEMU 创建的虚拟机兼容。
  • QCOW: QEMU Copy On Write 格式是 QEMU 当前的格式。QCOW 格式支持基于 zlib 的透明压缩和加密(后者存在缺陷,不推荐)。QCOW 有两个版本:QCOW 和 QCOW2。QCOW2 倾向于取代第一个。QCOW 目前得到 VirtualBox 的完全支持。QCOW2 有两个修订版:QCOW2 0.10 和 QCOW2 1.1(使用 QEMU 创建虚拟磁盘时的默认版本)。VirtualBox 不支持 QCOW2。
  • OVF: Open Virtualization Format 是一种开放格式,旨在实现不同虚拟机管理程序之间的互操作性和虚拟机分发。VirtualBox 通过 VBoxManage import/export 功能 支持该格式的所有修订版,但存在 已知限制
  • RAW: 这是虚拟磁盘直接暴露给磁盘而不被包含在特定文件格式容器中的模式。VirtualBox 以多种方式支持此功能:将 RAW 磁盘 转换为特定格式,或通过 克隆磁盘到 RAW,或直接使用指向物理磁盘或简单文件的 VMDK 文件

磁盘镜像格式转换

VBoxManage clonehd 可用于在 VDI、VMDK、VHD 和 RAW 之间进行转换。

$ VBoxManage clonehd inputfile outputfile --format outputformat

例如,将 VDI 转换为 VMDK

$ VBoxManage clonehd source.vdi destination.vmdk --format VMDK

QCOW

VirtualBox 不支持 QEMU 的 QCOW2 磁盘镜像格式。因此,要使用 QCOW2 磁盘镜像,您需要将其转换为 VirtualBox 支持的格式,这可以使用 qemu-img 来完成。`qemu-img` 可以将 QCOW 转换为/来自 VDI、VMDK、VHDX、RAW 和各种其他格式(您可以通过运行 `qemu-img --help` 查看)。

$ qemu-img convert -O output_fmt inputfile outputfile

例如,将 QCOW2 转换为 VDI

$ qemu-img convert -O vdi source.qcow2 destination.vdi
提示 `-p` 参数用于显示转换任务的进度。

QCOW2 有两个修订版:0.10 和 1.1。您可以使用 `-o compat=revision` 指定要使用的修订版。

挂载虚拟磁盘

VDI

挂载 VDI 镜像只能使用固定大小的镜像(也称为静态镜像);动态分配大小的镜像不易挂载。

需要 VDI 内部分区的偏移量,然后将 `offData` 的值添加到 `32256`(例如 69632 + 32256 = 101888)

$ VBoxManage internalcommands dumphdinfo storage.vdi | grep "offData"

现在可以使用以下命令挂载存储

# mount -t ext4 -o rw,noatime,noexec,loop,offset=101888 storage.vdi /mntpoint/

对于具有更多分区的 VDI 磁盘,您还可以使用 `losetup`

# losetup -o $offData -Pf

之后,您应该可以在 `/dev/loop*` 下找到分区(例如 `/dev/loop0p1`)。然后您可以像平常一样挂载它们(例如 `mount mount /dev/loop0p1 /mnt/`)。

您还可以使用 mount.vdi 脚本,该脚本可以像这样使用(将脚本本身安装到 `/usr/bin/`)

# mount -t vdi -o fstype=ext4,rw,noatime,noexec vdi_file_location /mnt/

或者,您可以使用 nbd 内核模块和 qemu-img 中的 `qemu-nbd` [3]

# modprobe nbd max_part=16
# qemu-nbd -c /dev/nbd0 storage.vdi
# mount /dev/nbd0p1 /mnt/dir/

然后卸载

# umount /mnt/dir/
# qemu-nbd -d /dev/nbd0

如果分区节点未传播,请尝试使用 `partprobe /dev/nbd0`;否则,VDI 分区可以直接映射到节点:`qemu-nbd -P 1 -c /dev/nbd0 storage.vdi`。

VHD

与 VDI 类似,VHD 镜像可以使用 QEMU 的 nbd 模块挂载

# modprobe nbd
# qemu-nbd -c /dev/nbd0 storage.vhd
# mount /dev/nbd0p1 /mnt

要卸载

# umount /mnt
# qemu-nbd -d /dev/nbd0

压缩虚拟磁盘

压缩虚拟磁盘仅适用于 `.vdi` 文件,基本步骤如下。

启动您的虚拟机,并手动或使用清理工具(如 bleachbit)移除所有臃肿内容,该工具 也适用于 Windows 系统

可以使用多种工具用零填充空闲空间

  • 如果您之前使用了 Bleachbit,请在 GUI 中勾选“系统 > 空闲磁盘空间”复选框,或在 CLI 中使用 `bleachbit -c system.free_disk_space`;
  • 在类 UNIX 系统上,可以使用 `dd` 或更推荐使用 dcflddAUR(参见 这里 了解区别)
# dcfldd if=/dev/zero of=/fillfile bs=4M
当 `fillfile` 达到分区限制时,您会收到类似 `1280 blocks (5120Mb) written.dcfldd:: No space left on device` 的消息。这意味着分区的用户空间和未保留的所有块都将被填零。以 root 身份使用此命令很重要,以确保所有空闲块都被覆盖。事实上,默认情况下,当使用 ext 文件系统的分区时,一部分文件系统块会为超级用户保留(请参阅 `mkfs.ext4` man 页中的 `-m` 参数或使用 `tune2fs -l` 查看为 root 应用程序保留的空间)。
上述过程完成后,您可以删除您创建的 `fillfile` 文件。
  • 在 Windows 上,有两个可用的工具
    • `sdelete` 来自 Sysinternals Suite,键入 `sdelete -s -z c:`,您需要为虚拟机中的每个驱动器重新执行该命令;
    • 或者,如果您喜欢脚本,有一个 PowerShell 解决方案,但仍然需要为所有驱动器重复执行。
PS> ./Write-ZeroesToFreeSpace.ps1 -Root c:\ -PercentFree 0
注意 此脚本必须在具有管理员权限的 PowerShell 环境中运行。默认情况下,脚本无法运行,请确保执行策略至少设置为 `RemoteSigned` 而不是 `Restricted`。您可以使用 `Get-ExecutionPolicy` 检查,并使用 `Set-ExecutionPolicy RemoteSigned` 设置所需的策略。

空闲磁盘空间被清零后,关闭您的虚拟机。

下次启动虚拟机时,建议进行文件系统检查。

  • 在类 UNIX 系统上,您可以手动使用 `fsck`;
    • 在 GNU/Linux 系统(包括 Arch Linux)上,您可以 通过内核启动参数 在启动时强制进行磁盘检查;
  • 在 Windows 系统上,您可以使用
    • 要么 `chkdsk c: /F`,其中 `c:` 需要替换为您需要扫描和修复错误的每个磁盘;
    • 要么 `FsckDskAll` 从这里下载,它基本上与 `chkdsk` 是相同的软件,但无需为所有驱动器重复命令;

现在,使用 VBoxManage modifyhd 从 `.vdi` 文件中删除零

$ VBoxManage modifyhd your_disk.vdi --compact
  • 如果您的虚拟机有快照,您需要将上述命令应用于您拥有的每个 `.vdi` 文件。
  • 这个写入零并压缩/回收/清理空间的概念只有在虚拟磁盘没有加密时才有效。
    • 在 Windows 上,您可以使用 `manage-bde -status` 命令检查 BitLocker 是否启用,并使用 `manage-bde -off c:` 禁用它,其中 `c:` 指的是加密的驱动器。之后,重复上述步骤。

TRIM

VirtualBox 通过实验性的“discard”附件选项提供 VDI 文件中 TRIM 的模拟。此选项未被记录,可以通过 命令行或 .vbox 文件编辑 访问。启用后,来自访客操作系统的 TRIM 命令会导致 VDI 文件中相应的部分被压缩掉。

警告 在没有主机 I/O 缓存的情况下使用此选项会导致死机。

扩展虚拟磁盘

一般步骤

如果您由于在创建虚拟机时选择的硬盘较小而空间不足,VirtualBox 手册建议的解决方案是使用 VBoxManage modifyhd。但此命令仅适用于 VDI 和 VHD 磁盘,并且仅适用于动态分配的变体。如果您也想调整固定大小的虚拟磁盘的大小,请继续阅读此技巧,该技巧适用于 Windows 或类 Unix 虚拟机。

首先,在您要扩展的磁盘旁边创建一个新的虚拟磁盘

$ VBoxManage createmedium disk -filename new.vdi --size 10000

其中 size 以 MiB 为单位,在本例中 10000MiB ~= 10GiB,new.vdi 是要创建的新硬盘的名称。

注意 默认情况下,此命令使用标准(对应于动态分配)文件格式变体,因此将不使用与源虚拟磁盘相同的文件格式变体。如果您的 old.vdi 是固定大小的,并且您想保留此变体,请添加参数 --variant Fixed

接下来,需要将旧虚拟磁盘克隆到新磁盘,这可能需要一些时间

$ VBoxManage clonemedium disk old.vdi new.vdi --existing

分离旧硬盘并挂载新硬盘,用您自己的内容替换所有强制性的斜体参数

$ VBoxManage storageattach virtual_machine_name --storagectl SATA --port 0 --medium none
$ VBoxManage storageattach virtual_machine_name --storagectl SATA --port 0 --medium new.vdi --type hdd

要获取存储控制器名称和端口号,可以使用命令 VBoxManage showvminfo virtual_machine_name。输出中您将获得类似这样的结果(您要找的是斜体部分)

[...]
Storage Controller Name (0):            IDE
Storage Controller Type (0):            PIIX4
Storage Controller Instance Number (0): 0
Storage Controller Max Port Count (0):  2
Storage Controller Port Count (0):      2
Storage Controller Bootable (0):        on
Storage Controller Name (1):            SATA
Storage Controller Type (1):            IntelAhci
Storage Controller Instance Number (1): 0
Storage Controller Max Port Count (1):  30
Storage Controller Port Count (1):      1
Storage Controller Bootable (1):        on
IDE (1, 0): Empty
SATA (0, 0): /home/wget/IT/Virtual_machines/GNU_Linux_distributions/ArchLinux_x64_EFI/Snapshots/{6bb17af7-e8a2-4bbf-baac-fbba05ebd704}.vdi (UUID: 6bb17af7-e8a2-4bbf-baac-fbba05ebd704)
[...]

下载 GParted 实时镜像并将其挂载为虚拟 CD/DVD 磁盘文件,启动您的虚拟机,调整/移动您的分区,卸载 GParted 实时镜像并重启。

注意 在 GPT 磁盘上,增加磁盘大小将导致备份 GPT 头信息不在设备末尾。GParted 会要求修复此问题,请两次单击“修复”。在 MBR 磁盘上,您不会遇到这种问题,因为此分区表在磁盘末尾没有尾部信息。

最后,从 VirtualBox 中注销虚拟磁盘并删除文件

$ VBoxManage closemedium disk old.vdi
$ rm old.vdi

增加 VDI 磁盘的大小

如果您的磁盘是 VDI 磁盘,请运行

$ VBoxManage modifymedium disk your_virtual_disk.vdi --resize the_new_size

然后跳回到 Gparted 步骤,以增加虚拟磁盘上分区的大小。

手动替换 .vbox 文件中的虚拟磁盘

如果您认为编辑一个简单的 XML 文件比玩弄 GUI 或 VBoxManage 更方便,并且您想将虚拟磁盘替换(或添加)到您的虚拟机中,在您的虚拟机对应的.vbox 配置文件中,只需替换 GUID、文件位置和格式以满足您的需求即可。

ArchLinux_vm.vbox
<HardDisk uuid="{670157e5-8bd4-4f7b-8b96-9ee412a712b5}" location="ArchLinux_vm.vdi" format="VDI" type="Normal"/>

然后,在 <StorageController><AttachedDevice> 子标签中,用新的 GUID 替换 GUID。

ArchLinux_vm.vbox
<AttachedDevice type="HardDisk" port="0" device="0">
  <Image uuid="{670157e5-8bd4-4f7b-8b96-9ee412a712b5}"/>
</AttachedDevice>
注意 如果您不知道要添加的驱动器的 GUID,可以使用 VBoxManage showhdinfo file。如果您之前使用 VBoxManage clonehd 复制/转换了您的虚拟磁盘,此命令应该会在复制/转换完成后立即输出 GUID。使用随机 GUID 不起作用,因为每个 UUID 都存储在每个磁盘映像中

在 Linux 主机和其他操作系统之间传输

有关 harddisks 和快照路径的信息存储在具有 .vbox 扩展名的文件中的 <HardDisks> .... </HardDisks> 标签之间。您可以手动编辑它们,或者使用此脚本,您只需要更改路径或使用默认值,假定 .vbox 文件与虚拟硬盘和快照文件夹在同一目录中。它将新的配置输出到 stdout。

#!/bin/sh
NewPath="${PWD}/"
Snapshots="Snapshots/"
Filename="$1"

 awk -v SetPath="$NewPath" -v SnapPath="$Snapshots" '{if(index($0,"<HardDisk uuid=") != 0){A=$3;split(A,B,"=");
L=B[2];
 gsub(/\"/,"",L);
  sub(/^.*\//,"",L);
  sub(/^.*\\/,"",L);
 if(index($3,"{") != 0){SnapS=SnapPath}else{SnapS=""};
  print $1" "$2" location="\"SetPath SnapS L"\" "$4" "$5}
else print $0}' "$Filename"
  • 如果将虚拟机准备用于 Windows 主机,则在路径名末尾应使用反斜杠 \ 而不是 /
  • 该脚本通过查找文件名中的 { 来检测快照。
  • 要在新主机上运行,您需要先通过单击“Machine > Add...”或使用快捷键 Ctrl+a 将其添加到注册表,然后浏览包含配置的 .vbox 文件,或者使用命令行 VBoxManage registervm filename.vbox

克隆虚拟磁盘并为其分配新的 UUID

VirtualBox 广泛使用 UUID。虚拟机和虚拟机中的每个虚拟磁盘都必须具有不同的 UUID。启动虚拟机时,VirtualBox 会跟踪您的虚拟机实例的所有 UUID。请参阅 VBoxManage list 以列出已向 VirtualBox 注册的项目。

如果您手动复制虚拟磁盘文件来克隆虚拟磁盘,则需要为克隆的虚拟驱动器分配新的 UUID,如果您想在同一虚拟机中甚至在另一个虚拟机中使用该磁盘(如果该虚拟机已通过 VirtualBox 打开并注册)。

您可以使用此命令为虚拟磁盘分配新的 UUID

$ VBoxManage internalcommands sethduuid /path/to/disk.vdi
提示 为避免手动复制虚拟磁盘并为文件分配新 UUID,您可以使用 VBoxManage clonevdi
注意 上面的命令支持 VirtualBox 支持的所有虚拟磁盘格式

技巧与提示

导入/导出 VirtualBox 虚拟机到/从其他虚拟机管理程序

如果您计划在其他虚拟机管理程序上使用您的虚拟机,或者想在 VirtualBox 中导入由其他虚拟机管理程序创建的虚拟机,您可能需要阅读以下步骤。

卸载增强功能

客户机增强功能在大多数虚拟机管理程序解决方案中都可用:VirtualBox 提供 客户机增强功能,VMware 提供 VMware Tools,Parallels 提供 Parallels Tools 等。这些附加组件设计用于在客户机操作系统安装完成后安装到虚拟机中。它们由设备驱动程序和系统应用程序组成,通过提供这些功能来优化客户机操作系统以获得更好的性能和可用性 by providing these features

如果您已将增强功能安装到您的虚拟机中,请先卸载它们。您的客户机,特别是如果它使用的是 Windows 系列的操作系统,可能会出现奇怪的行为、崩溃甚至可能根本无法启动,如果您在其他虚拟机管理程序中仍在使用特定的驱动程序。

使用正确的虚拟磁盘格式

此步骤取决于直接转换虚拟磁盘映像的能力。

自动工具

一些公司提供的工具能够从虚拟机或本地安装的 Windows 或 GNU/Linux 操作系统创建虚拟机。使用此类产品,您无需执行此步骤及后续步骤,并且可以停止阅读。

  • Parallels Transporter,不是免费的,是 Parallels Inc. 的产品。此解决方案基本上由一个名为“agent”的软件组成,该软件将安装在您要导入/转换的客户机中。然后,Parallels Transporter,“它仅在 OS X 上运行”,将从此“agent”创建一个虚拟机,该“agent”通过 USB 或以太网进行通信。
  • VMware vCenter Converter[死链接 2024-07-30—HTTP 404],在 VMware 网站注册后免费,其工作方式与 Parallels Transporter 几乎相同,但用于收集数据以创建虚拟机的软件仅在 Windows 平台运行。
手动转换

首先,熟悉 VirtualBox 支持的格式以及 第三方虚拟机管理程序支持的格式

  • 如果使用 VMDK 或 OVF 磁盘格式,则将虚拟机导入或导出到 VMware 解决方案没有问题,否则,VMDK 到 VDI 和 VDI 到 VMDK 的转换是可能的,并且上述 VMware vCenter Converter 工具可用。
  • 导入或导出到 QEMU 没有问题:VirtualBox 直接支持某些 QEMU 格式,并且如果需要,仍然可以进行 QCOW2 到 VDI 和 VDI 到 QCOW2 的转换
  • 导入或导出到 Parallels 虚拟机管理程序是最困难的方式:Parallels 只支持其自己的 HDD 格式(甚至标准便携式 OVF 格式也不支持!)。
  • 要将您的虚拟机导出到 Parallels,您需要使用上面描述的 Parallels Transporter 工具。
  • 要将您的虚拟机导入到 VirtualBox,您需要使用上面描述的 VMware vCenter Converter 先将虚拟机转换为 VMware 格式。然后,应用从 VMware 迁移的解决方案。

为您的虚拟机管理程序创建虚拟机配置

每个虚拟机管理程序都有自己的虚拟机配置文件:VirtualBox 为 .vbox,VMware 为 .vmx,虚拟机捆绑包(.pvm 文件)中有一个 config.pvs 文件,等等。因此,您将不得不在新的目标虚拟机管理程序中创建一个新虚拟机,并尽可能精确地指定其硬件配置,使其与您的初始虚拟机相似。

请密切注意用于安装客户机操作系统的固件接口(BIOS 或 UEFI)。虽然在 VirtualBox 和 Parallels 解决方案中都有选择这两种接口的选项,但在 VMware 中,您必须手动将以下行添加到您的 .vmx 文件中。

ArchLinux_vm.vmx
firmware = "efi"

最后,要求您的虚拟机管理程序使用您已转换的现有虚拟磁盘并启动虚拟机。

提示

虚拟机启动管理

使用服务启动虚拟机(自动启动)

以下是用于将虚拟机视为服务的 systemd 服务的实现细节。

/etc/systemd/system/vboxvmservice@.service
[Unit]
Description=VBox Virtual Machine %i Service
Requires=systemd-modules-load.service
After=systemd-modules-load.service

[Service]
User=username
Group=vboxusers
ExecStart=/usr/bin/VBoxManage startvm %i --type startmode
ExecStop=/usr/bin/VBoxManage controlvm %i stopmode
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • username 替换为 vboxusers 组的成员用户。确保选择的用户与将创建/导入虚拟机的用户相同,否则用户将看不到虚拟机应用程序。
  • startmode 替换为虚拟机前端类型,通常是 guiheadlessseparate
  • stopmode 替换为所需的停止状态,通常是 savestateacpipowerbutton
  • 如果您有多个由 systemd 管理的虚拟机,并且它们没有正常停止,请尝试在 [Service] 部分的末尾添加 KillMode=noneTimeoutStopSec=40

启用 vboxvmservice@your_virtual_machine_name systemd unit 以在下次启动时启动虚拟机。要直接启动它,只需启动 systemd unit 即可。

VirtualBox 4.2 为类 Unix 系统引入了一种新方法来自动启动虚拟机,而不是使用 systemd 服务。

使用键盘快捷键启动虚拟机

直接使用键盘快捷键启动虚拟机而不是使用 VirtualBox 界面(GUI 或 CLI)可能会很有用。为此,您可以简单地在 .xbindkeysrc 中定义键绑定。有关更多详细信息,请参阅 Xbindkeys

示例,使用笔记本电脑的 Fn 键和一个未使用的电池键(本示例中为计算机上的 F3

"VBoxManage startvm 'Windows 7'"
m:0x0 + c:244
XF86Battery
注意 如果您的虚拟机名称中包含空格,请用单引号将其括起来,如上面的示例所示。

在虚拟机中使用特定设备

使用 USB 网络摄像头/麦克风

注意 在执行以下步骤之前,您需要安装扩展包
  1. 确保虚拟机未运行,并且您的网络摄像头/麦克风未被使用。
  2. 打开 VirtualBox 主窗口,然后进入 Arch 虚拟机的设置。转到 USB 部分。
  3. 确保选择了启用 USB 控制器。同时确保也选择了启用 USB 2.0 (EHCI) 控制器
  4. 单击“从设备添加过滤器”按钮(带有 + 图标的电缆)。
  5. 从列表中选择您的 USB 网络摄像头/麦克风设备。
  6. 现在单击确定并启动您的虚拟机。
注意 如果您的麦克风未显示在“从设备添加过滤器”菜单中,请尝试使用 USB 3.0 和 1.1 选项(在步骤 3 中)。

检测网络摄像头和其他 USB 设备

注意 如果您的虚拟机内部运行的是 Linux/Unix 操作系统,这可能不会有太大作用,因为大多数 Linux/Unix 系统没有自动检测功能。

如果上面部分菜单中未显示您正在寻找的设备,并且您已尝试所有三个 USB 控制器选项,请将虚拟机启动三次。一次使用 USB 1.1 控制器,一次使用 USB 2.0 控制器,依此类推。启动后让虚拟机运行至少 5 分钟。有时 Windows 会自动为您检测到设备。确保过滤掉非键盘或鼠标的设备,以免它们在启动时启动。这可以确保 Windows 在启动时检测到设备。

访问客户机服务器

从主机访问虚拟机中的Apache 服务器,只需在主机上执行以下行:

$ VBoxManage setextradata GuestName "VBoxInternal/Devices/pcnet/0/LUN#0/Config/Apache/HostPort" 8888
$ VBoxManage setextradata GuestName "VBoxInternal/Devices/pcnet/0/LUN#0/Config/Apache/GuestPort" 80
$ VBoxManage setextradata GuestName "VBoxInternal/Devices/pcnet/0/LUN#0/Config/Apache/Protocol" TCP

其中 8888 是主机应监听的端口,80 是虚拟机将发送 Apache 信号的端口。

要在主机上使用低于 1024 的端口,需要更改该主机上的防火墙。通过将“Apache”更改为相应的服务和端口,也可以将其设置为与 SSH 或任何其他服务配合使用。

注意 pcnet 指的是虚拟机的网卡。如果您在虚拟机设置中使用 Intel 网卡,请将 pcnet 更改为 e1000

要通过 SSH 在 VirtualBox 客户机和主机之间进行通信,必须在“设置 > 网络”下转发服务器端口。从客户端/主机连接时,连接到客户端/主机的 IP 地址,而不是另一台计算机的连接。这是因为连接将通过虚拟适配器进行。

Windows 客户机中的 D3D 加速

较新版本的 VirtualBox 支持加速客户机内的 OpenGL。这可以通过在机器设置中一个简单的复选框启用,就在设置视频内存的下方,然后安装 VirtualBox 客户机增强功能。然而,大多数 Windows 游戏使用 Direct3D(DirectX 的一部分),而不是 OpenGL,因此不受此方法帮助。但是,可以通过借用 Wine 的 d3d 库来在 Windows 客户机中获得加速的 Direct3D,该库会将 d3d 调用转换为 OpenGL,然后进行加速。这些库现在是 VirtualBox 客户机增强功能的一部分。

如上所述启用 OpenGL 加速后,重启客户机到安全模式(在 VirtualBox 屏幕消失后、Windows 屏幕出现前按 F8),然后安装 VirtualBox 客户机增强功能,在安装过程中启用“Direct3D 支持”复选框。重启回正常模式,您应该已经获得了加速的 Direct3D。

  • 此技巧对某些游戏是否有效取决于它们进行的硬件检查以及它们使用的 D3D 部分。
  • 这已在 Windows XP、7 和 8.1 上进行了测试。如果此方法在您的 Windows 版本上不起作用,请在此处添加数据。

USB 密钥上的 VirtualBox

当在 USB 密钥上使用 VirtualBox 时,例如使用 ISO 映像启动已安装的机器,您将需要手动从现有驱动器创建 VMDK。但是,一旦新的 VMDK 保存下来,并且您移至另一台机器,您可能会遇到再次启动适当的机器的问题。要摆脱此问题,您可以使用以下脚本启动 VirtualBox。此脚本将清理并注销旧的 VMDK 文件,并为您创建新的、正确的 VMDK。

本文或本节需要在语言、wiki 语法或风格方面进行改进。请参阅 Help:Style 获取参考。

原因: 以下脚本解析 ls 的输出,非常脆弱已知会出错。(在 Talk:VirtualBox 中讨论)
#!/bin/sh
# Erase old VMDK entries
rm ~/.VirtualBox/*.vmdk

# Clean up VBox-Registry
sed -i '/sd/d' ~/.VirtualBox/VirtualBox.xml

# Remove old harddisks from existing machines
find ~/.VirtualBox/Machines -name \*.xml | while read -r file; do
  line=$(grep -e "type\=\"HardDisk\"" -n "$file" | cut -d ':' -f 1)
  if [ -n "$line" ]; then
    sed -i "${line}"d "$file"
    sed -i "${line}"d "$file"
    sed -i "${line}"d "$file"
  fi
  sed -i "/rg/d" "$file"
done

# Delete prev-files created by VirtualBox
find ~/.VirtualBox/Machines -name \*-prev -exec rm '{}' \;

# Recreate VMDKs
ls -l /dev/disk/by-uuid | cut -d ' ' -f 9,11 | while read -r ln; do
  if [ -n "$ln" ]; then
    uuid=$(echo "$ln" | cut -d ' ' -f 1)
    device=$(echo "$ln" | cut -d ' ' -f 2 | cut -d '/' -f 3 | cut -b 1-3)

    # determine whether drive is mounted already
    checkstr1=$(mount | grep "$uuid")
    checkstr2=$(mount | grep "$device")
    checkstr3=$(ls ~/.VirtualBox/*.vmdk | grep "$device")
    if [ -z "$checkstr1" ] && [ -z "$checkstr2" ] && [ -z "$checkstr3" ]; then
      VBoxManage internalcommands createrawvmdk -filename ~/.VirtualBox/"$device".vmdk -rawdisk /dev/"$device" -register
    fi
  fi
done

# Start VirtualBox
VirtualBox

请注意,您的用户必须添加到“disk”组才能从现有驱动器创建 VMDK。

在 VirtualBox 中运行本地 Arch Linux 安装

如果您有一个 Arch Linux 与其他操作系统的双引导系统,当您需要同时在两者之间工作时,来回切换可能会变得很麻烦。您也可能在虚拟机中使用性能或兼容性问题,这会影响您执行某些任务的能力。

本指南将允许您在第二个操作系统运行时,在虚拟机中重新使用您的本地 Arch Linux 安装。这样,您就可以保持运行每个操作系统的本地版本,但可以选择在虚拟机中运行您的 Arch Linux 安装。

确保您有一个持久的命名方案

根据您的硬盘设置,代表您硬盘的设备文件在您原生运行 Arch Linux 安装或在虚拟机中运行时可能会显示不同。例如,在使用 FakeRAID 时会出现此问题。Fake RAID 设备将在您原生运行 GNU/Linux 发行版时映射到 /dev/mapper/,而设备仍然可以单独访问。然而,在您的虚拟机中,它可能显示为没有映射,例如在 /dev/sdaX 中,因为控制您主机操作系统(例如 Windows)中 Fake RAID 的驱动程序会抽象 Fake RAID 设备。

为了绕过这个问题,我们需要使用一个对两个系统都持久的寻址方案。这可以通过使用 UUID 来实现。确保您的 引导加载程序fstab 文件使用 UUID,否则请修复此问题。请阅读 fstab持久块设备命名

警告
  • 确保您的主机分区在您的 Arch Linux 虚拟机中仅以只读方式访问,这可以避免因疏忽写入而损坏主机分区的风险。
  • 您永远不应该允许 VirtualBox 从您的第二个操作系统(回想一下,它是本虚拟机的主机!)的条目启动。因此,要特别小心,特别是如果您的默认引导加载程序/引导管理器条目是您的另一个操作系统。给予更长的超时时间或将其放在首选项顺序的下方。

确保您的 mkinitcpio 映像是正确的

确保您的 mkinitcpio 配置使用 block HOOK

/etc/mkinitcpio.conf
...
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)
...

如果不存在,请添加它并重新生成 initramfs

创建从物理驱动器启动的虚拟机配置

创建原始磁盘 VMDK 映像

现在,我们需要创建一个新的虚拟机,它将使用一个RAW 磁盘作为虚拟驱动器,为此我们将使用一个约 1KiB 的 VMDK 文件,它将被映射到物理磁盘。不幸的是,VirtualBox 在 GUI 中没有此选项,因此我们必须使用控制台并使用 VBoxManage 的内部命令。

启动将使用 Arch Linux 虚拟机的宿主。该命令需要根据您拥有的宿主进行调整。

在 GNU/Linux 主机上

有 3 种方法可以实现此目的:以 root 用户登录,使用 chmod 更改设备的访问权限,将您的用户添加到 disk 组。后一种方法更优雅,让我们以此方式进行。

# gpasswd -a your_user disk

使用以下命令应用新的组设置

$ newgrp

现在,您可以使用命令

$ VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sdb -register

根据您的需求调整上述命令,特别是 VMDK 位置的路径和文件名以及包含您的 Arch Linux 安装的原始磁盘位置。

在 Windows 主机上

打开命令提示符,必须以管理员身份运行。

提示 在 Windows 中,打开开始菜单/开始屏幕,键入 cmd,然后键入 Ctrl+Shift+Enter,这是以管理员权限执行所选程序的快捷方式。

在 Windows 中,由于磁盘文件名约定与 UNIX 不同,请使用此命令确定您的 Windows 系统中有哪些驱动器及其位置。

# wmic diskdrive get name,size,model
Model                               Name                Size
WDC WD40EZRX-00SPEB0 ATA Device     \\.\PHYSICALDRIVE1  4000783933440
KINGSTON SVP100S296G ATA Device     \\.\PHYSICALDRIVE0  96024821760
Hitachi HDT721010SLA360 ATA Device  \\.\PHYSICALDRIVE2  1000202273280
Innostor Ext. HDD USB Device        \\.\PHYSICALDRIVE3  1000202273280

在此示例中,由于 Windows 的约定是 \\.\PhysicalDriveX,其中 X 是从 0 开始的数字,\\.\PHYSICALDRIVE1 可以等同于 Linux 磁盘术语中的 /dev/sdb

要在 Windows 上使用 VBoxManage 命令,您可以先通过 cd C:\Program Files\Oracle\VirtualBox\ 将当前目录更改为您的 VirtualBox 安装文件夹。

# .\VBoxManage.exe internalcommands createrawvmdk -filename C:\file.vmdk -rawdisk \\.\PHYSICALDRIVE1

或者使用绝对路径

# "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands createrawvmdk -filename C:\file.vmdk -rawdisk \\.\PHYSICALDRIVE1
在其他操作系统主机上

在 OS X 等其他操作系统中使用上述命令时存在其他限制,因此请仔细阅读手册页,如果您关心的话。

创建虚拟机配置文件
  • 要在 Windows 上使用 VBoxManage 命令,您首先需要将当前目录更改为您的 VirtualBox 安装文件夹:cd C:\Program Files\Oracle\VirtualBox\
  • Windows 使用反斜杠而不是斜杠,因此在您使用以下命令时,请将所有斜杠 / 的出现替换为反斜杠 \

然后,我们需要创建一个新机器(根据您的方便替换 virtual_machine_name)并将其注册到 VirtualBox。

$ VBoxManage createvm -name virtual_machine_name -register

然后,需要将新创建的原始磁盘附加到机器上。这取决于您的计算机或您的本地 Arch Linux 安装的根目录是在 IDE 还是 SATA 控制器上。

如果您需要 IDE 控制器

$ VBoxManage storagectl virtual_machine_name --name "IDE Controller" --add ide
$ VBoxManage storageattach virtual_machine_name --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /path/to/file.vmdk

否则

$ VBoxManage storagectl virtual_machine_name --name "SATA Controller" --add sata
$ VBoxManage storageattach virtual_machine_name --storagectl "SATA Controller" --port 0 --device 0 --type hdd --medium /path/to/file.vmdk

在继续使用 CLI 的同时,建议使用 VirtualBox GUI 来个性化虚拟机配置。事实上,您必须尽可能精确地指定其硬件配置,使其与您的本地机器相似:启用 3D 加速,增加视频内存,设置网络接口等。

最后,您可能希望无缝地集成您的 Arch Linux 与您的主机操作系统,并允许它们之间复制粘贴。请参阅 VirtualBox/Install Arch Linux as a guest#Install the Guest Additions,因为这个 Arch Linux 虚拟机基本上是一个 Arch Linux 客户机。

警告 为了使 Xorg 在本地和虚拟机中都能工作,因为它们显然会使用不同的驱动程序,最好是不要有 /etc/X11/xorg.conf,这样 Xorg 就会即时拾取它需要的所有内容。然而,如果您确实需要自己的 Xorg 配置,也许值得将您的默认 systemd 目标设置为 multi-user.target,并以 root 用户运行 systemctl isolate graphical.target(有关更多详细信息,请参阅 systemd#Targetssystemd#Change current target)。这样,图形界面将被禁用(即 Xorg 不会启动),在您登录后,您可以手动使用自定义 xorg.conf 运行 startx

从 VirtualBox 安装本地 Arch Linux 系统

在某些情况下,在运行另一个操作系统时安装本地 Arch Linux 系统可能很有用:一种实现方式是通过 VirtualBox 在原始磁盘上执行安装。如果现有操作系统是基于 Linux 的,您可能需要考虑遵循 Install from existing Linux

这种情况与#在 VirtualBox 中运行本地 Arch Linux 安装非常相似,但步骤顺序不同:首先#创建原始磁盘 VMDK 映像,然后#创建虚拟机配置文件

现在,您应该有一个工作的虚拟机配置,其虚拟 VMDK 磁盘绑定到一个真实的磁盘。安装过程与VirtualBox/Install Arch Linux as a guest 中描述的步骤完全相同,但#确保您有一个持久的命名方案#确保您的 mkinitcpio 映像是正确的

警告
  • 对于 BIOS 系统和 MBR 磁盘,请勿在虚拟机内安装引导加载程序,这不起作用,因为 MBR 未与真实机器的 MBR 链接,并且您的虚拟磁盘仅映射到没有 MBR 的真实分区。
  • 对于没有 CSM 和 GPT 磁盘的 UEFI 系统,安装将完全无法进行,因为
    • EFI 系统分区未映射到您的虚拟磁盘,而 Arch Linux 要求在其上放置 Linux 内核才能作为 EFI 应用程序启动(有关详细信息,请参阅 EFI 引导存根);
    • 并且 efivars(如果您正在通过 VirtualBox 的 EFI 模式安装 Arch Linux)不是您真实系统的 efivars:引导管理器条目因此不会被注册。
  • 因此,建议先在原生安装中创建分区,否则分区将不会被考虑在您的 MBR/GPT 分区表中。

安装完成后,使用 GNU/Linux 安装介质(无论是 Arch Linux 还是其他发行版)在原生模式下启动您的计算机,chroot 进入已安装的 Arch Linux 系统,然后安装并配置一个引导加载程序

安装 macOS 虚拟机

在启动虚拟机之前,请在宿主机上运行以下命令 [4]

$ VBoxManage modifyvm "MyMacVM" --cpuid-set 00000001 000106e5 00100800 0098e3fd bfebfbff
$ VBoxManage setextradata "MyMacVM" "VBoxInternal/Devices/efi/0/Config/DmiSystemProduct" "iMac11,3"
$ VBoxManage setextradata "MyMacVM" "VBoxInternal/Devices/efi/0/Config/DmiSystemVersion" "1.0"
$ VBoxManage setextradata "MyMacVM" "VBoxInternal/Devices/efi/0/Config/DmiBoardProduct" "Iloveapple"
$ VBoxManage setextradata "MyMacVM" "VBoxInternal/Devices/smc/0/Config/DeviceKey" "ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
$ VBoxManage setextradata "MyMacVM" "VBoxInternal/Devices/smc/0/Config/GetKeyFromRealSMC" 1
$ VBoxManage setextradata "MyMacVM" VBoxInternal2/EfiGopMode 4

如果您使用的是 AMD 处理器,并且第一次启动卡住,您还需要运行

$ VBoxManage modifyvm "MyMacVM" --cpu-profile "Intel Core i7-6700K"

尝试安装 Mojave 时没有键盘/鼠标输入

如果您正在尝试安装 Mojave,在执行上述步骤后,安装程序将加载,但您可能无法发送键盘或鼠标输入。原因似乎是 Mojave 不再支持 USB 1.1 控制器,为了解决这个问题,您需要模拟 USB 3.0。为此,请先安装扩展包

然后转到“虚拟机 > 设置 > USB”,然后选择“USB 3.0”。从此以后,输入应该就可以正常工作了。

重启后进入 UEFI 交互式 shell

如果安装程序在安装过程中无法正确格式化可启动驱动器,并且您最终进入了 UEFI shell,请执行以下操作

  1. 在 UEFI 提示符下键入 exit
  2. 选择“启动维护管理器”
  3. 选择“从文件启动”

现在您将被带到几个晦涩的 PCI 路径。第一个路径是您刚刚尝试启动但未成功的路径。第二个(或第三个)路径应该是包含 macOS 恢复分区的路径,您需要加载它才能继续安装。单击第二个条目。如果它为空,请按 Esc 返回并选择第三个条目。一旦您找到一个带有文件夹的路径,请逐级进入文件夹。它应该类似于“macOS Install Data > Locked Files > Boot Files > boot.efi”。单击 boot.efi 后,您应该能够启动到 macOS 安装程序并继续安装。请注意,某些子目录可能丢失。请记住,您需要找到一个 boot.efi[5]

将原生 Windows 安装迁移到虚拟机

如果您想将现有的原生 Windows 安装迁移到一个将在 GNU/Linux 上与 VirtualBox 一起使用的虚拟机,那么这一节就是为您准备的。本节仅涵盖使用 MSDOS/Intel 分区方案的原生 Windows 安装。为了成功进行此操作,您的 Windows 安装必须位于第一个 MBR 分区上。其他分区的操作也是可行的,但未经测试(有关详细信息,请参阅#已知限制)。

警告 如果您使用的是 OEM 版 Windows,此过程未经最终用户许可协议授权。因为 OEM 许可通常规定 Windows 安装与硬件绑定。将 Windows 安装转移到虚拟机将打破这种联系。因此,在继续之前,请确保您拥有完整的 Windows 安装或卷许可模式。如果您拥有完整的 Windows 许可证,但后者不是批量许可证,也不是多个 PC 的特殊许可证,这意味着在转移操作完成后,您将不得不删除原生安装。

在您的原生 Windows 安装中需要完成几个任务,然后在您的 GNU/Linux 主机上进行。

在 Windows 上执行的任务

以下前三点来自这个过时的 VirtualBox wiki 页面,但已在此处更新。

  • 移除 IDE/ATA 控制器检查(仅限 Windows XP):Windows 会记住安装它的 IDE/ATA 驱动器控制器,并且如果检测到这些已更改,则不会启动。微软提出的解决方案是重用相同的控制器或使用相同序列号的控制器,这在使用虚拟机时是不可能实现的。MergeIDE,一个基于微软另一解决方案开发的德国工具,可以被使用。该解决方案基本上包括从初始驱动程序存档(位置是硬编码的,或者指定为 .bat 脚本的第一个参数)中提取 Windows XP 支持的所有 IDE/ATA 控制器驱动程序,安装它们并将它们注册到 regedit 数据库中。
  • 使用正确的硬件抽象层类型(旧 32 位 Windows 版本):微软提供 3 种默认版本:Hal.dll(标准 PC)、Halacpi.dll(ACPI HAL)和 Halaacpi.dll(带 IO APIC 的 ACPI HAL)。您的 Windows 安装可能安装了第一个或第二个版本。在这种情况下,请禁用 VirtualBox 的“启用 IO/APIC”扩展功能
  • 禁用任何 AGP 设备驱动程序(仅限过时的 Windows 版本):如果您的 C:\Windows\SYSTEM32\drivers\ 目录下存在 agp440.sysintelppm.sys 文件,请将其删除。由于 VirtualBox 使用 PCI 虚拟显卡,当使用此 AGP 驱动程序时可能会引起问题。
  • 创建 Windows 恢复磁盘:在接下来的步骤中,如果出现问题,您将需要修复您的 Windows 安装。请确保手头有安装介质,或使用 Vista SP1 的“创建恢复磁盘”、Windows 7 的“创建系统修复磁盘”或 Windows 8.x 的“创建恢复驱动器”来创建它。

使用 Disk2vhd 克隆 Windows 分区

启动到 Windows,清理安装(例如使用CCleaner),使用disk2vhd工具创建 VHD 映像。包含保留系统分区(如果存在)和实际的 Windows 分区(通常是 C: 盘)。Disk2vhd 创建的映像大小将是分区上实际文件(已用空间)的总和,而不是整个分区的大小。如果一切顺利,映像可以直接在虚拟机中启动,您将不必像克隆整个分区那样经历 MBR 和 Windows 引导加载程序的麻烦。

在 GNU/Linux 上执行的任务

提示 如果您使用 Disk2vhd 创建了 VHD 映像,请跳过与分区相关的部分。
  • 使用 ntfsresize(可在 ntfs-3g 中找到)将原生 Windows 分区的大小减小到 Windows 实际需要的空间。您指定的大小将与下一步创建的 VDI 大小相同。如果此大小过低,可能会损坏您的 Windows 安装,使其无法启动。
首先使用 --no-action 选项运行测试
# ntfsresize --no-action --size 52Gi /dev/sda1
如果之前的测试成功,请再次执行此命令,但这次不带上述测试标志。
  • 从驱动器的开头到 Windows 安装所在的第一分区的末尾创建 Windows 磁盘映像。从磁盘开头复制是必要的,因为 MBR 空间位于驱动器的开头,并且需要与 Windows 分区一起位于虚拟驱动器上。在本例中,后面的两个分区 sda2sda3 将从分区表中移除,MBR 引导加载程序将更新。
# sectnum=$(( $(cat /sys/block/sda/sda1/start) + $(cat /sys/block/sda/sda1/size) ))
使用 cat /sys/block/sda/sda1/size 将输出磁盘 sda 的第一个分区的总扇区数。必要时进行调整。
# dd if=/dev/sda bs=512 count=$sectnum | VBoxManage convertfromraw stdin windows.vdi $(( $sectnum * 512 ))
我们需要以字节为单位显示大小,$(( $sectnum * 512 )) 将把扇区数转换为字节。
  • 由于您以 root 用户身份创建了磁盘映像,请将正确的权限设置给虚拟磁盘映像
    # chown your_user:your_group windows.vdi
  • 创建您的虚拟机配置文件,并将之前创建的虚拟磁盘用作主虚拟硬盘。
  • 尝试启动您的 Windows 虚拟机,它可能会成功。但首先,请从启动过程中移除和修复磁盘,因为它可能会(并且很可能)干扰安全模式的启动。
  • 尝试在安全模式下启动您的 Windows 虚拟机(在 Windows 徽标出现之前按 F8 键)……如果遇到启动问题,请阅读 #修复 MBR 和 Microsoft 引导加载程序。在安全模式下,驱动程序很可能由 Windows 即插即用检测机制安装查看。此外,通过“设备”>“插入客户机操作系统增强功能 CD 映像...”菜单安装 VirtualBox 客户机操作系统增强功能。如果没有出现新的磁盘对话框,请导航到 CD 驱动器并手动启动安装程序。
  • 您最终应该拥有一个工作的 Windows 虚拟机。不要忘记阅读#已知限制
  • 性能提示:根据 VirtualBox 手册,SATA 控制器的性能优于 IDE。如果您无法立即从虚拟 SATA 控制器启动 Windows,这很可能是由于缺少 SATA 驱动程序。将虚拟磁盘连接到 IDE 控制器,创建一个空的 SATA 控制器并启动虚拟机——Windows 应该会自动安装 SATA 驱动程序。然后,您可以关闭虚拟机,从 IDE 控制器分离虚拟磁盘,并将其连接到 SATA 控制器。

修复 MBR 和 Microsoft 引导加载程序

如果您的 Windows 虚拟机拒绝启动,您可能需要对虚拟机进行以下修改。

  • 在 Windows 启动之前,在虚拟机中启动一个 GNU/Live live 发行版。
  • 从虚拟磁盘 MBR 中删除其他分区条目。确实,由于我们复制了 MBR 和仅 Windows 分区,其他分区的条目仍然存在于 MBR 中,但分区已不再可用。例如,使用 fdisk 来完成此操作。
fdisk ''/dev/sda''
Command (m for help): a
Partition number (''1-3'', default ''3''): ''1''
  • 使用 fdisk 中的 m 命令将更新后的分区表写入磁盘(这将重新创建 MBR)。
  • 使用 testdisk(有关详细信息,请参阅此处)添加一个通用 MBR。
# testdisk > Disk /dev/sda... > [Proceed] > [Intel] Intel/PC partition > [MBR Code] Write TestDisk MBR to first sector > Write a new copy of MBR code to first sector? (Y/n) > Y > Write a new copy of MBR code, confirm? (Y/N) > A new copy of MBR code has been written. You have to reboot for the change to take effect. > [OK]
  • 有了新的 MBR 和更新的分区表,您的 Windows 虚拟机应该能够启动。如果您仍然遇到问题,请从前面的步骤中启动您的 Windows 恢复磁盘,并在 Windows RE 环境中执行此处描述的命令

已知限制

  • 您的虚拟机有时可能会挂起并耗尽您的 RAM,这可能是由 Windows 虚拟机中仍然安装的冲突驱动程序引起的。祝您找到它们!
  • 依赖于特定驱动程序的其他软件可能没有被禁用/卸载,或者需要先卸载,因为驱动程序不再可用。
  • 您的 Windows 安装必须位于第一个分区上,以上过程才能正常工作。如果未满足此要求,该过程也可能完成,但未经测试。这将需要复制 MBR 并进行十六进制编辑,请参阅VirtualBox:启动克隆磁盘,或者需要手动修复分区表,或者通过在先前步骤中创建的恢复磁盘修复 Windows。让我们考虑我们的 Windows 安装在第二个分区上;我们将复制 MBR,然后复制第二个分区到磁盘映像。VBoxManage convertfromraw 需要写入的总字节数:根据 MBR 的大小(第一个分区的开始)加上第二个(Windows)分区的大小计算。{ dd if=/dev/sda bs=512 count=$(cat /sys/block/sda/sda1/start) ; dd if=/dev/sda2 bs=512 count=$(cat /sys/block/sda/sda2/size) ; } | VBoxManage convertfromraw stdin windows.vdi $(( ($(cat /sys/block/sda/sda1/start) + $(cat /sys/block/sda/sda2/size)) * 512 ))

在 VirtualBox 中运行原生 Windows 安装

注意 本节概述的技术仅适用于UEFI系统。

在某些情况下,能够与 Windows 双启动 *并* 在虚拟机中访问分区可能很有用。此过程在几个方面与#将原生 Windows 安装迁移到虚拟机有很大不同

  • Windows 分区未复制到虚拟磁盘映像。而是创建了一个原始 VMDK 文件;
  • 虚拟机中的更改将反映在分区中,反之亦然;
  • OEM 许可证应仍能满足,因为 Windows 分区仍直接在硬件上启动。
警告 使用此处的一些命令可能会损坏 Windows 分区、Arch Linux 分区或两者。在执行命令时要格外小心,并仔细检查它们是否在正确的 shell 中运行。在开始此过程之前,最好备份整个驱动器。
注意 在继续之前,请确保您有权访问 Windows 安装介质(例如 Windows 11 ISO)。

创建虚拟机

必须手动创建 VirtualBox 虚拟机。目前不要向虚拟机添加任何存储设备或磁盘,将在稍后手动进行。

使用以下设置配置虚拟机(通过单击主工具栏中的“设置”按钮可以打开设置面板)

  • 视图:系统
    • 选项卡:主板
      • 勾选“启用 I/O APIC”;
      • 勾选“启用 EFI”;
      • 如果适用,勾选“硬件时钟使用 UTC 时间”。
    • 选项卡:处理器
      • 勾选“启用 PAE/NX”;
      • 勾选“启用嵌套 VT-x/AMD-V”;
    • 选项卡:加速
      • 从下拉菜单中选择“Hyper-V”作为半虚拟化接口;
      • 勾选“启用嵌套分页”。

可选地,您还可以启用以下设置

  • 视图:显示
    • 选项卡:屏幕
      • 勾选“启用 3D 加速”。请注意,这可能会导致显示问题。
注意 “Hyper-V”设置并非运行系统所必需,但有助于避免许可问题。

创建虚拟机磁盘

要访问 Windows 分区,请创建一个指向相关 Windows 分区的原始 VMDK 文件(读取磁盘分区表需要 root 权限)。

# VBoxManage createmedium disk -filename VM_DIRECTORY/windows.vmdk --format=VMDK --variant RawDisk --property RawDrive=DISK --property Partitions=RESERVED_PARTITION_NUMBER,BASIC_DATA_PARTITION_NUMBER

将大写占位符字符串替换为如下内容

  • VM_DIRECTORY 替换为虚拟机文件夹的路径(通常是 ~/VirtualBox VMs 的子目录);
  • DISK 必须替换为包含所有 Windows 分区的块设备(例如:/dev/sda/dev/nvme0n1);
  • RESERVED_PARTITION_NUMBER 必须替换为标记为“Microsoft reserved partition”的分区的编号(例如:如果分区是 /dev/sda2,则编号为 2);
  • BASIC_DATA_PARTITION_NUMBER 必须替换为包含 Windows 安装的分区的编号(例如:如果分区是 /dev/sda3,则编号为 3);

示例

# VBoxManage createmedium disk -filename "/home/user/VirtualBox VMs/windows.vmdk" --format=VMDK --variant RawDisk --property RawDrive=/dev/nvme0n1 --property Partitions=2,3

该命令还将在虚拟机文件夹中创建一个额外的文件“windows-pt.vmdk”,该文件将被忽略。

注意 如果分区表发生更改,则必须重新创建 windows.vmdk
提示

也可以通过运行此命令并查看 MIN 列来找到分区编号

lsblk --output NAME,PARTLABEL,FSTYPE,MAJ:MIN,SIZE
NAME        PARTLABEL                    FSTYPE UUID                                 MAJ:MIN   SIZE
nvme0n1                                                                              259:0   931,5G
├─nvme0n1p1 EFI system partition         vfat   90DC-A6B3                            259:1     100M
├─nvme0n1p2 Microsoft reserved partition                                             259:2      16M
├─nvme0n1p3 Basic data partition         ntfs   D2A2A104A2A0EE63                     259:3     200G
...

现在更改虚拟磁盘所有者,以便运行 VirtualBox 的用户和组可以访问。

# chown VIRTUALBOX_RUNNING_USER:VIRTUALBOX_RUNNING_GROUP VM_DIRECTORY/windows.vmdk VM_DIRECTORY/windows-pt.vmdk

VIRTUALBOX_RUNNING_USERVIRTUALBOX_RUNNING_GROUP 替换为运行 VirtualBox 的用户和组,这很可能是您的用户。

允许 VirtualBox 读取物理分区

VirtualBox 必须具有原始磁盘访问权限才能运行 Windows 分区。通常,这需要以完全 root 权限运行 VirtualBox,但有更优雅的选项可用。

更高的安全性选项:使用专用的组来访问 Windows 分区

这里 udev 被配置为将对 Windows 分区的访问限制为 vboxusers 组,然后运行 VirtualBox 的用户被添加到该组。

可以通过创建以下文件自动将磁盘分配给 vboxusers

/etc/udev/rules.d/99-vbox.rules
#
# Rules to give VirtualBox users raw access to Windows partitions
#

# Microsoft Reserved partition
SUBSYSTEM=="block", ENV{ID_PART_ENTRY_TYPE}=="e3c9e316-0b5c-4db8-817d-f92df00215ae", GROUP="vboxusers"

# Windows partition
SUBSYSTEM=="block", ENV{ID_PART_ENTRY_TYPE}=="ebd0a0a2-b9e5-4433-87c0-68b6b72699c7", GROUP="vboxusers"

#
# Rules to give VirtualBox users raw access to Windows disk
#

# sdb
ENV{ID_PART_TABLE_UUID}=="WINDOWS_DISK_ID_PART_TABLE_UUID", GROUP="vboxusers"

WINDOWS_DISK_ID_PART_TABLE_UUID 必须替换为从 udevadm info /dev/WINDOWS_DISK (将 WINDOWS_DISK 替换为包含 Windows 分区的磁盘)获取的值。这些规则中的 UUID 对应于特定的GPT 分区类型,而其他大写字符串应按原样保留,因此无需替换。

然后,运行 VirtualBox 的用户必须添加到 vboxusers 组。这可以通过以下命令完成

# usermod -aG vboxusers VIRTUALBOX_RUNNING_USER

VIRTUALBOX_RUNNING_USER 替换为运行 VirtualBox 的用户,这很可能是您的用户。

较低的安全选项:使用 'disk' 组

为了在 VirtualBox 虚拟媒体管理器中添加 VMDK 文件而不以 root 身份运行 VirtualBox,运行 VirtualBox 的用户需要属于 vboxusersdisk 组。

# usermod -aG disk,vboxusers VIRTUALBOX_RUNNING_USER

VIRTUALBOX_RUNNING_USER 替换为运行 VirtualBox 的用户,这很可能是您的用户。

警告 请注意此编辑可能带来的潜在安全风险,因为您将授予您的用户帐户对 disk 组拥有的所有存储设备完全读写访问权限。

设置单独的 EFI 系统分区

虚拟机 EFI 引导文件将引用与物理 EFI 系统分区中的磁盘不同的磁盘,因此 VirtualBox 不能使用后者,而是必须使用专用虚拟磁盘中的 EFI 系统分区。可以使用以下命令创建此磁盘

$ VBoxManage createmedium disk --filename VM_DIRECTORY/esp.vmdk --size 512 --format VMDK

VM_DIRECTORY 替换为正在构建的虚拟机的文件夹。

向虚拟机添加虚拟磁盘

按以下方式配置虚拟机存储设备(设置面板 - 存储)

  • esp.vmdk 添加为连接到“SATA 端口 0”的 SATA 硬盘;
  • windows.vmdk 添加为连接到“SATA 端口 1”的 SATA 硬盘;
  • 将 Windows 安装 ISO 挂载到虚拟光驱。
  • 要添加 SATA 硬盘,请使用“控制器:SATA”设备右侧的第二个按钮;
  • 虚拟光驱应该已经存在,名为“Optical Drive”。

配置虚拟 UEFI 固件并创建 Windows 引导文件

现在启动虚拟机,它应该会自动从 Windows 安装盘启动。选择安装区域后,单击“修复计算机”链接,然后选择“疑难解答”,最后选择“命令提示符”以从安装介质启动命令提示符。

输入以下命令,在 esp.vmdk 磁盘上创建新的 GPT 表,并使用现有 Windows 分区的配置将其安装 Windows 引导加载程序

打开 Diskpart

X:\ diskpart

列出系统识别的所有磁盘

DISKPART> list disk

esp.vmkd 磁盘应标记为 disk 0,因为它连接到 SATA 端口 0,大小约为 512 MiB 且未分区。windows.vmdk 磁盘应标记为 disk 1;请注意,“大小”列显示的是磁盘大小,而不是分区大小。

选择 esp.vmdk 磁盘

DISKPART> select Disk 0

现在创建一个 GPT 分区表,一个 EFI 系统分区,大小与整个磁盘一样大,并为其分配标签和驱动器字母

DISKPART> clean
DISKPART> convert gpt
DISKPART> create partition efi size=500
DISKPART> format quick fs=fat32 label="System"
DISKPART> assign letter="S"

检查分区是否已正确创建

DISKPART> list volume

我们新创建的 EFI 系统分区将标记为“SYSTEM”,驱动器字母为“S”。

记下 Windows 安装卷的字母,因为在接下来的步骤中将使用它。通常是 D,但也可能不同:您可以根据其标签和大小来推断。大小与您物理硬盘上的 Windows 安装分区大小相同。

退出 diskpart

DISKPART> exit

将 Windows 引导加载程序安装到 EFI 系统分区。

D:
cd Windows\System32
bcdboot D:\Windows /s S: /f UEFI

现在关闭命令提示符,关闭虚拟机,然后分离 Windows 安装盘(从“首选项 > 设备”中移除光盘)。虚拟机现在应该从新安装的引导分区启动并加载物理 Windows 安装。它可能会在虚拟机窗口顶部显示一些与 UEFI 相关的错误,并且首次启动可能需要一些时间,但如果一切都已正确完成,您将能够访问您的 Windows 安装。

在 VirtualBox 中运行整个物理磁盘

注意 您可以参考 VirtualBox 官方文档 9.8.1. Using a Raw Host Hard Disk From a Guest

这与#在 VirtualBox 中运行原生 Windows 安装的工作方式相同,但 vmdk 将包含整个磁盘而不是一个分区,因此您无需创建单独的 ESP 或 MBR 分区,因为物理磁盘中的分区将被使用。

创建原始磁盘

# VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sdb

然后按照#在 VirtualBox 中运行原生 Windows 安装中的相同方法进行配置和虚拟磁盘附加。

设置客户机启动分辨率

通常在安装客户机操作系统增强功能后,全屏的 Arch 客户机运行 X 会被设置为您显示器的最佳分辨率;然而,虚拟控制台的帧缓冲将被设置为从 VirtualBox 的自定义 VESA 驱动程序检测到的标准、通常较小的分辨率。

为了以最佳分辨率使用虚拟控制台,Arch 需要识别该分辨率为有效,这反过来又要求 VirtualBox 将此信息传递给客户机操作系统。

首先,通过运行以下命令检查您期望的分辨率是否已被识别(需要安装 hwinfo

hwinfo --framebuffer

如果未显示最佳分辨率,则需要从宿主机运行 VBoxManage 工具,并向您的虚拟机添加“额外分辨率”(在 Windows 主机上,转到 VirtualBox 安装目录找到 VBoxManage.exe)。例如

$ VBoxManage setextradata "Arch Linux" "CustomVideoMode1" "1360x768x24"

上面示例中的“Arch Linux”和“1360x768x24”参数应替换为您虚拟机的名称和所需的分辨率。顺便说一下,此命令允许定义多达 16 个额外分辨率(“CustomVideoMode1”到“CustomVideoMode16”)。推荐的分辨率是 1280x720、1920x1080、2048x1080、2560x1440、3840x2160、1280x800、1280x1024、1440x900、1600x900。

之后,重启虚拟机并再次运行 hwinfo --framebuffer 以验证新的分辨率已被您的客户机系统识别(这并不能保证它们都能工作,取决于您的硬件限制)。

注意 从 VirtualBox 5.2 开始,hwinfo --framebuffer 可能不会显示任何输出,但您仍应能按照此过程设置自定义分辨率。

最后,将一个 video=resolution 内核参数添加到设置帧缓冲到新分辨率,例如

video=1360x768

此外,您可能还希望配置您的引导加载程序以使用相同分辨率。如果您使用 GRUB,请参阅GRUB/技巧和窍门#设置帧缓冲分辨率

注意 内核参数 vga 或引导加载程序的解决设置(例如 GRUB 的 GRUB_GFXPAYLOAD_LINUX)都不会修复帧缓冲,因为它们会因为内核模式设置而被覆盖。帧缓冲分辨率必须通过 video 内核参数设置,如上所述。

从主机 SSH 到客户机

虚拟机设置的网络选项卡包含“高级”部分,其中有一个创建端口转发的工具。可以使用它将客户机的 SSH 端口 22 转发到主机端口,例如 3022

user@host$ ssh -p 3022 $USER@localhost

将建立从主机到客户机的连接。

SSHFS 作为共享文件夹的替代方案

使用此端口转发和SSHFS,可以轻松地将客户机文件系统挂载到主机文件系统上

user@host$ sshfs -p 3022 $USER@localhost:$HOME ~/shared_folder

然后可以在两者之间传输文件。

故障排除

键盘和鼠标被锁定在虚拟机中

这意味着您的虚拟机已捕获键盘和鼠标的输入。只需按右侧的 Ctrl 键,您的输入就会再次控制您的主机。

要通过鼠标在主机和虚拟机之间无缝切换,而无需按任何键,从而实现无缝集成,请在客户机中安装客户机操作系统增强功能。如果您的客户机是 Arch Linux,请阅读VirtualBox/安装 Arch Linux 作为客户机#安装客户机操作系统增强功能,否则请阅读官方 VirtualBox 帮助。

没有 64 位操作系统客户端选项

启动虚拟机客户端时,如果没有 64 位选项可用,请确保您的 CPU 虚拟化功能(通常称为 VT-x)在 BIOS 中已启用。

如果您使用的是 Windows 主机,您可能需要禁用 Hyper-V,因为它会阻止 VirtualBox 使用 VT-x。[6]

VirtualBox GUI 与主机 GTK 主题不匹配

有关为 Qt 应用程序(如 VirtualBox)设置主题的信息,请参阅Qt 和 GTK 应用程序的统一外观

无法将 Ctrl+Alt+Fn 发送到客户机

您的客户机操作系统是 GNU/Linux 发行版,您想通过按 Ctrl+Alt+F2 打开新的 TTY shell,或者使用 Ctrl+Alt+Backspace 退出当前的 X 会话。如果您键入这些键盘快捷键而不进行任何调整,客户机将不会收到任何输入,而主机(如果它也是 GNU/Linux 发行版)将拦截这些快捷键。例如,要将 Ctrl+Alt+F2 发送到客户机,只需同时按下您的 *主机键*(通常是右侧的 Ctrl 键)并按 F2

USB 子系统不起作用

您的用户必须属于 vboxusers 组,并且您需要安装扩展包才能支持 USB 2。然后,您将能够为要从客户机操作系统访问的设备在虚拟机设置中启用 USB 2 并添加一个或多个过滤器。

如果 VBoxManage list usbhost 即使以 root 身份运行也未显示任何 USB 设备,请确保 /etc/udev/rules.d/ 中没有旧的 udev 规则(来自 VirtualBox 4.x)。VirtualBox 5.0 将 udev 规则安装到 /usr/lib/udev/rules.d/。您可以使用类似 pacman -Qo /usr/lib/udev/rules.d/60-vboxdrv.rules 的命令来确定 udev 规则文件是否过时。

有时,在旧的 Linux 主机上,USB 子系统未自动检测到,导致错误 Could not load the Host USB Proxy service: VERR_NOT_FOUND 或在主机上看不到 USB 驱动器,即使用户属于 vboxusers。此问题是由于 VirtualBox 在版本 3.0.8 中从 usbfs 切换到 sysfs。如果主机不理解此更改,您可以通过在您的 shell(例如,如果您使用 bash)的任何源文件中定义以下环境变量来恢复旧行为:

~/.bashrc
VBOX_USB=usbfs

然后确保环境已感知此更改(重新连接、手动源文件、启动新 shell 实例或重新启动)。

同时确保您的用户是 storage 组的成员。

USB 调制解调器在主机上不起作用

如果您有一个 USB 调制解调器正在被客户机操作系统使用,杀死客户机操作系统可能会导致调制解调器无法被主机系统使用。杀死并重启 VBoxSVC 应该可以解决此问题。

USB 设备导致客户机崩溃

如果将 USB 设备连接到客户机导致崩溃或任何其他错误行为,请尝试将 USB 控制器从 USB 2 (EHCI) 切换到 USB 3 (xHCI) 或反之。

启动虚拟机时主机冻结

通常,在升级 VirtualBox 或 Linux 内核后会观察到此类问题。将它们降级到之前的版本可能可以解决问题。

模拟麦克风不起作用

如果模拟麦克风的音频输入在主机上工作正常,但尽管麦克风设备似乎已正常检测到,但没有声音能传入客户机,那么在主机上安装声音服务器(如PulseAudio)可能会解决问题。

如果安装PulseAudio后麦克风仍无法工作,将“主机音频驱动程序”(在“VirtualBox > 虚拟机 > 设置 > 音频”下)设置为“ALSA 音频驱动程序”可能会有帮助。

已转换为 ISO 的图像问题

某些镜像格式无法可靠地转换为 ISO。例如,ccd2iso 会忽略 .ccd 和 .sub 文件,这可能导致磁盘镜像中的文件损坏。

在这种情况下,您将不得不使用 VirtualBox 内的 Linux CDemu 或任何其他用于挂载磁盘镜像的实用程序。

无法创建仅主机模式网络接口

确保所有必需的内核模块都已加载。请参阅 #加载 VirtualBox 内核模块

如果所有必需的内核模块都已加载,但您仍然无法创建仅主机模式网络适配器,请导航到“文件 > 主机网络管理器”并单击“创建”按钮以添加网络接口。

无法插入模块

当您在尝试加载模块时遇到以下错误

Failed to insert 'vboxdrv': Required key not available

对您的模块进行签名或在您的内核配置中禁用 CONFIG_MODULE_SIG_FORCE

VBOX_E_INVALID_OBJECT_STATE (0x80BB0007)

如果虚拟机未正常退出,可能会出现此问题。运行以下命令

$ VBoxManage controlvm virtual_machine_name poweroff

NS_ERROR_FAILURE 和缺少菜单项

如果扩展包未更新并且与新发布的 VirtualBox 版本不兼容,则可能会出现此错误。

在创建新虚拟磁盘时选择“QCOW/QCOW2/QED”磁盘格式时,有时也会出现此错误。

如果您在第一次启动虚拟机时遇到此消息

Failed to open a session for the virtual machine debian.
Could not open the medium '/home/.../VirtualBox VMs/debian/debian.qcow'.
QCow: Reading the L1 table for image '/home/.../VirtualBox VMs/debian/debian.qcow' failed (VERR_EOF).
VD: error VERR_EOF opening image file '/home/.../VirtualBox VMs/debian/debian.qcow' (VERR_EOF).

Result Code:
NS_ERROR_FAILURE (0x80004005)
Component:
Medium

退出 VirtualBox,删除新虚拟机的所有文件,然后从 VirtualBox 配置文件中删除 MachineRegistry 菜单的最后一行(或您正在创建的有问题的虚拟机)

~/.config/VirtualBox/VirtualBox.xml
...
<MachineRegistry>
  <MachineEntry uuid="{00000000-0000-0000-0000-000000000000}" src="/home/void/VirtualBox VMs/debian/debian.vbox"/>
  <MachineEntry uuid="{00000000-0000-0000-0000-000000000000}" src="/home/void/VirtualBox VMs/ubuntu/ubuntu.vbox"/>
  <MachineEntry uuid="{00000000-0000-0000-0000-000000000000}" src="/home/void/VirtualBox VMs/lastvmcausingproblems/lastvmcausingproblems.qcow"/>
</MachineRegistry>
...

OpenBSD 在虚拟化指令不可用时无法使用

虽然据报道 OpenBSD 在其他管理程序上无需启用虚拟化指令(VT-x AMD-V)即可正常工作,但在没有这些指令的 VirtualBox 上运行的 OpenBSD 虚拟机将无法使用,表现为大量段错误。使用 -norawr0 参数启动 VirtualBox 可能会解决问题。您可以这样做

$ VBoxSDL -norawr0 -vm name_of_OpenBSD_virtual_machine

Windows:“指定的路径不存在。请检查路径,然后重试。”

当从 Windows 客户机中的共享文件夹运行需要管理员权限的.exe文件时,可能会出现此错误消息。[7]

作为一种变通方法,将文件复制到虚拟驱动器或使用 UNC 路径\\vboxsvr)。有关更多信息,请参阅 [8]

Windows 8.x 错误代码 0x000000C4

如果启动时出现此错误代码,即使您选择了操作系统类型为 Win 8,也请尝试启用 CMPXCHG16B CPU 指令。

$ vboxmanage setextradata virtual_machine_name VBoxInternal/CPUM/CMPXCHG16B 1

Windows 8、8.1 或 10 无法安装、启动或出现错误“ERR_DISK_FULL”

通过转到“设置 > 存储 > 控制器:SATA”更新虚拟机的设置,并勾选“使用主机 I/O 缓存”。

WinXP:位深度不能大于 16

如果您以 16 位颜色深度运行,则图标可能会显得模糊/卡顿。但是,在尝试将颜色深度更改为更高级别时,系统可能会将您限制在较低分辨率,或者根本无法更改深度。要解决此问题,请在 Windows 中运行 regedit,并将以下项添加到 Windows XP 虚拟机的注册表中

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]
"ColorDepth"=dword:00000004

然后更新“桌面属性”窗口中的颜色深度。如果没有任何反应,请通过某种方法强制屏幕重绘(例如,按 Host+f 重绘/进入全屏)。

Windows:启用 3D 加速时屏幕闪烁

VirtualBox > 4.3.14 中存在一个回归,导致启用 3D 加速的 Windows 客户机出现闪烁。自 r120678 起,已实现一个补丁来识别 环境变量设置,像这样启动 VirtualBox

$ CR_RENDER_FORCE_PRESENT_MAIN_THREAD=0 VirtualBox

确保没有 VirtualBox 服务仍在运行。请参阅 VirtualBox 错误 13653

无法使用 Wayland 启动 VirtualBox:段错误

此问题是由 Qt 检测到 Wayland(例如,如果 XDG_SESSION_TYPE=wayland)引起的,而 VirtualBox 尚不支持 Wayland。请参阅 FS#58761上游错误

可以通过设置 环境变量 QT_QPA_PLATFORM=xcb 来禁用 Qt 平台检测并强制使用 X11 而不是 Wayland。为了不影响其他 Qt 应用程序(它们通常与 Wayland 配合良好),QT_QPA_PLATFORM=xcb 应仅在启动 VirtualBox 时设置。

如果通过 桌面条目启动,请按照桌面条目#修改环境变量中的说明进行操作,并将以 Exec=VirtualBox ... 开头的行更改为 Exec=env QT_QPA_PLATFORM=xcb VirtualBox ...。如果从 shell 启动,请将别名(Bash#别名virtualbox 设置为 env QT_QPA_PLATFORM=xcb virtualbox

注意 如果您在 Wayland 中遇到鼠标或键盘相关问题,也可以尝试上述设置。

使用 Intel GPU 的客户机随机冻结

对于 Intel CPU 和显卡,为客户机分配更多处理器会降低渲染性能,从而导致随机冻结。分配较少的处理器可能会有所帮助。

无法在全屏模式下查看桌面

通过选择“机器 > 设置”,选择“用户界面”选项卡,然后取消选中“迷你工具栏”复选框来禁用迷你工具栏。

配备 Intel Tiger Lake 芯片组的 Windows 10 客户机操作系统随机崩溃

通过将 split_lock_detect=off 添加到内核参数来禁用拆分锁定检测。

详细信息请参阅 VirtualBox 的 Ticket #20180

启用安全启动时保存设置失败

在 VirtualBox 7.0.0 中,在先前 VirtualBox 版本中创建的虚拟机中启用安全启动将失败,并出现一个不明确的错误(FS#76234

Failed to save the settings.

解决方案是单击“启用安全启动”复选框正下方的“重置密钥到默认值”按钮。

使用 Android Studio 模拟器后无法启动 VirtualBox 虚拟机

KVM 和 VirtualBox 内核模块可以加载但不能同时使用。Android Studio 模拟器是 QEMU 模拟器,它使用 KVM 进行加速。因此,Android Studio 模拟器和 VirtualBox 虚拟机(如果启用了硬件加速)不能同时运行。我们必须在使用一个完全停止后再使用另一个。

有时,VirtualBox 内核模块可能仍会被某个进程意外使用,导致所有 VirtualBox 虚拟机都无法启动,VirtualBox GUI 上的错误消息是“发生了严重错误”。

此时,我们可以使用 root 权限通过 vboxreload 检查并重新加载 VirtualBox 内核模块。如果提示某些模块仍在被使用,您需要手动终止相关进程并重新运行该命令。

3D 加速无法工作

  • 确保客户机上安装了客户机增强功能,并且主机上安装了主机模块。
  • 确保客户机增强功能和主机内核模块版本匹配。
    • 主机:modinfo vboxdrv | grep '^version:'
    • 客户机:打开 VM 的日志,找到“Guest Additions information report”
  • 确保 Vulkan 已在主机上安装并正常工作

安装 Kvantum 后 VirtualBox UI 元素渲染不正确

在某些 Kvantum(kvantum)配置和第三方主题下,一些 UI 元素(如图标栏和菜单)会显示为黑色或渲染不正确。这似乎仅限于启用了半透明窗口。请参阅 Kvantum 的问题 #418

要修复此行为,请执行以下任一操作:

  • 在“配置活动主题 > 合成与通用外观”部分禁用“半透明窗口”。
  • 在“Kvantum 管理器”中,将 VirtualBox,VirtualBoxVM 添加到“配置活动主题 > 合成与通用外观 > 不透明应用:”菜单字段。
    • 这使得 VirtualBox 窗口被忽略,从而创建了一个例外。

VirtualBox 正在独占控制一个音频设备,导致在虚拟机运行时 PipeWire 无法访问它。

默认情况下,VirtualBox 应该自动选择最佳音频驱动程序。然而,在 PipeWire 系统上,这通常会回退到 ALSA(请参阅 Pipewire 问题)。

这可能导致类似的日志记录

pipewire[2370]: spa.audioadapter: params Spa:Enum:ParamId:EnumFormat: 1:0 (convert format) Device or reso>
pipewire[2370]: pw.node: (alsa_output.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__Speaker__sink-6>
pipewire[2370]: spa.alsa: '_ucm0001.hw:sofhdadsp': playback open failed: Device or resource busy

解决方案是配置 VirtualBox 使用 PulseAudio 后端(PipeWire 将通过 pipewire-pulse 处理此问题)。

$ VBoxManage modifyvm "Your_virtual_machine_name" --audio-driver pulse --audio-controller hda

参见