VirtualBox

来自 ArchWiki
(重定向自 VirtualBox/技巧与诀窍

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

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

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

Arch Linux 主机的安装步骤

为了在您的 Arch Linux 机器上启动 VirtualBox 虚拟机,请按照以下安装步骤操作。

安装核心软件包

安装 virtualbox 软件包。您还需要选择一个软件包来为主机模块提供支持

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

签名模块

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

导航到您的内核树文件夹并执行以下命令

# for module in `ls /lib/modules/$(uname -r)/kernel/misc/{vboxdrv.ko,vboxnetadp.ko,vboxnetflt.ko}` ; do ./scripts/sign-file sha1 certs/signing_key.pem certs/signing_key.x509 $module ; done
注意: 哈希算法不必与配置的算法匹配,但必须内置到内核中。

加载 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 模块在启动时自动加载,您必须屏蔽默认的 /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,方法是在 /etc/modules-load.d/ 中创建一个同名的空文件(或指向 /dev/null 的符号链接)。

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

要手动加载模块,请运行

# modprobe vboxdrv

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

  • 当您打算使用桥接仅主机网络功能时,都需要 vboxnetadpvboxnetflt。更准确地说,vboxnetadp 需要在 VirtualBox 全局首选项中创建主机接口,而 vboxnetflt 需要启动使用该网络接口的虚拟机。
注意: 如果在您更新模块时内核中加载了 VirtualBox 内核模块,则需要手动重新加载它们才能使用新的更新版本。要做到这一点,以 root 身份运行 vboxreload

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

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

增强功能

还建议在运行 VirtualBox 的主机上安装 virtualbox-guest-iso 软件包。此软件包将充当磁盘镜像,可用于将增强功能安装到 Arch Linux 以外的虚拟机系统。.iso 文件将位于 /usr/lib/virtualbox/additions/VBoxGuestAdditions.iso,可能需要在虚拟机内手动挂载。挂载后,您可以在虚拟机内运行增强功能安装程序。对于 Arch Linux 虚拟机,另请参见VirtualBox/安装 Arch Linux 作为虚拟机#安装增强功能

扩展包

Oracle VM VirtualBox 扩展包提供附加功能,并以非自由许可发布,仅供个人使用。要安装它,可以使用 virtualbox-ext-oracleAUR 软件包,并且可以在 seblu 仓库中找到预构建版本。

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

非自由扩展包功能之一是对远程桌面协议 (RDP) 的支持。通过安装 virtualbox-ext-vnc 软件包,也可以获得开源 VNC 扩展包的此部分功能。

前端

VirtualBox 带有四个前端

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

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

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

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/安装 Arch Linux 作为虚拟机

虚拟磁盘管理

另请参见#从其他虚拟机管理器导入/导出 VirtualBox 虚拟机

VirtualBox 支持的格式

VirtualBox 支持以下虚拟磁盘格式

  • VDI:虚拟磁盘镜像 是 VirtualBox 自己的开放容器,当您使用 VirtualBox 创建虚拟机时默认使用。
  • VMDK:虚拟机磁盘 最初由 VMware 为其产品开发。该规范最初是闭源的,但后来成为 VirtualBox 完全支持的开放格式。此格式提供了拆分为多个 2GB 文件的能力。如果您想将虚拟机存储在不支持非常大文件的机器上,此功能特别有用。除 Parallels 的 HDD 格式外,其他格式不提供这种等效功能。
  • VHD:虚拟硬盘 是 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 开发,并在其虚拟机管理器解决方案(如适用于 Mac 的 Parallels Desktop)中使用。由于缺乏此专有格式的文档,因此不支持此格式的较新版本(即 3 和 4)。
    注意: 目前关于版本 2 格式的支持存在争议。虽然官方 VirtualBox 手册 仅报告支持 HDD 文件格式的第二个版本,但维基百科的贡献者报告第一个版本也可能有效。如果您可以使用 HDD 格式的第一个版本执行一些测试,欢迎提供帮助。
  • QED:QEMU 增强磁盘格式 是 QEMU 的旧文件格式,QEMU 是另一个免费开源虚拟机管理器。此格式从 2010 年开始设计,旨在提供优于 QCOW2 和其他格式的替代方案。此格式具有完全异步的 I/O 路径、强大的数据完整性、后备文件和稀疏文件。QED 格式仅用于兼容使用旧版本 QEMU 创建的虚拟机。
  • QCOW:QEMU 写入时复制格式 是 QEMU 的当前格式。QCOW 格式确实支持基于 zlib 的透明压缩和加密(后者有缺陷,不建议使用)。QCOW 有两个版本:QCOW 和 QCOW2。QCOW2 趋于取代第一个版本。QCOW 目前完全受 VirtualBox 支持。QCOW2 有两个修订版:QCOW2 0.10 和 QCOW2 1.1(这是使用 QEMU 创建虚拟磁盘时的默认设置)。VirtualBox 不支持 QCOW2。
  • OVF:开放虚拟化格式 是一种开放格式,专为不同虚拟机管理器之间的虚拟机互操作性和分发而设计。VirtualBox 通过 VBoxManage 导入/导出功能 支持此格式的所有修订版,但存在已知限制
  • 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=修订版 指定要使用的修订版。

挂载虚拟磁盘

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-imgqemu-nbd[2]

# 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 存储.vdi

另一种方法是使用 vdfuseAUR

# vdfuse -a -f storage.vdi mountpoint1

它将磁盘挂载在 mountpoint1 中,命名格式为 PartitionN。然后可以将每个分区循环挂载在 mountpoint2

# mount -o loop mountpoint1/PartitionN mountpoint2

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)删除所有膨胀,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 手册页中的 -m 参数,或使用 tune2fs -l 查看为 root 应用程序保留了多少空间)。
当上述过程完成后,您可以删除您创建的文件 fillfile
  • 在 Windows 上,有两个工具可用
    • 来自 Sysinternals Suitesdelete,键入 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 文件上应用上述命令。

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 是要创建的新硬盘的名称。

注意: 默认情况下,此命令使用 Standard(对应于动态分配)文件格式变体,因此不会使用与源虚拟磁盘相同的文件格式变体。如果您的 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 live image 并将其作为虚拟 CD/DVD 磁盘文件挂载,启动您的虚拟机,增加/移动您的分区,卸载 GParted live 并重启。

注意: 在 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 主机和其他操作系统之间传输

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

#!/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 主机中使用,那么在路径名称末尾您应该使用反斜杠 \ 而不是 / 。
  • 该脚本通过查找文件名中的 { 来检测快照。
  • 为了使其在新主机上运行,您需要首先通过单击管理 -> 添加... 或使用快捷键 Ctrl+A 将其添加到注册表中,然后浏览到包含配置的 .vbox 文件,或者使用命令行 VBoxManage registervm filename.vbox

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

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

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

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

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

技巧和窍门

从/向其他虚拟机监控程序导入/导出 VirtualBox 虚拟机

如果您计划在另一个虚拟机监控程序上使用您的虚拟机,或者想将使用另一个虚拟机监控程序创建的虚拟机导入到 VirtualBox 中,您可能会对阅读以下步骤感兴趣。

移除增强功能

大多数虚拟机监控程序解决方案都提供 Guest Additions:VirtualBox 附带 Guest Additions,VMware 附带 VMware Tools,Parallels 附带 Parallels Tools 等。这些附加组件旨在在安装客户操作系统后安装在虚拟机内部。它们由设备驱动程序和系统应用程序组成,这些驱动程序和系统应用程序优化了客户操作系统,以获得更好的性能和可用性,通过提供这些功能

如果您已将增强功能安装到您的虚拟机中,请先卸载它们。您的客户机,特别是如果它使用的是 Windows 系列的操作系统,如果您仍在另一个虚拟机监控程序中使用特定的驱动程序,则可能会表现异常、崩溃甚至可能无法启动。

使用正确的虚拟磁盘格式

此步骤将取决于是否可以直接转换虚拟磁盘映像。

自动工具

一些公司提供工具,这些工具能够从 Windows 或 GNU/Linux 操作系统创建虚拟机,这些操作系统位于虚拟机中,甚至位于本机安装中。使用这样的产品,您无需应用此步骤和以下步骤,并且可以停止阅读此处。

  • Parallels Transporter 是 Parallels Inc. 的产品,不是免费的。此解决方案基本上包含一个名为代理的软件,该软件将安装在您要导入/转换的客户机中。然后,Parallels Transporter仅适用于 OS X,将从该代理创建一个虚拟机,该代理通过 USB 或以太网网络联系。
  • VMware vCenter Converter[死链接 2024-07-30 ⓘ] 在 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 解决方案都提供了在这 2 个接口之间进行选择的选项,但在 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 单元,以便在下次启动时启动虚拟机。要直接启动它,只需启动 systemd 单元即可。

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 操作系统,这将不会有太大作用,因为大多数操作系统都没有自动检测功能。

如果您要查找的设备未显示在上面部分中的任何菜单中,并且您已尝试所有三个 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

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

Windows 客户机中的 D3D 加速

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

在如上所述启用 OpenGL 加速后,将客户机重启到安全模式(在 Windows 屏幕出现之前但在 VirtualBox 屏幕消失之后按 F8),并安装 VirtualBox guest additions,在安装期间启用复选框Direct3D 支持。重启回到正常模式,您应该具有加速的 Direct3D。

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

USB 密钥上的 VirtualBox

在 USB 密钥上使用 VirtualBox 时,例如使用 ISO 映像启动已安装的机器,您将必须手动从现有驱动器创建 VMKD。但是,一旦保存了新的 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 时,会出现此问题。当您本机运行 GNU/Linux 发行版时,fake RAID 设备将在 /dev/mapper/ 中映射,而设备仍然可以单独访问。但是,在您的虚拟机中,它可能在 /dev/sdaX 中显示而没有任何映射,例如,因为控制您的主机操作系统(例如 Windows)中的 fake RAID 的驱动程序正在抽象 fake RAID 设备。

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

警告
  • 确保您的主机分区在您的 Arch Linux 虚拟机中只能以只读方式访问,这将避免由于您注意力不集中而写入主机分区而导致损坏的风险。
  • 您绝不应允许 VirtualBox 从您的第二个操作系统的条目启动,提醒一下,该操作系统用作此虚拟机的主机!因此,请特别注意,特别是如果您的默认引导加载程序/引导管理器条目是您的另一个操作系统。给予更重要的超时或将其放在首选项顺序的下方。

确保您的 mkinitcpio 映像正确

确保您的 mkinitcpio 配置使用 HOOK block

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

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

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

创建原始磁盘 VMDK 映像

现在,我们需要创建一个新的虚拟机,它将使用 RAW 磁盘 作为虚拟驱动器,为此我们将使用 ~ 1Kio 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/安装 Arch Linux 作为客户机#安装 Guest Additions,因为此 Arch Linux 虚拟机基本上是一个 Arch Linux 客户机。

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

从 VirtualBox 安装本机 Arch Linux 系统

在某些情况下,在运行另一个操作系统时安装本机 Arch Linux 系统可能很有用:完成此操作的一种方法是通过 VirtualBox 在 raw disk 上执行安装。如果现有操作系统是基于 Linux 的,您可能需要考虑遵循 从现有 Linux 安装

此方案与 #在 VirtualBox 内运行本机 Arch Linux 安装 非常相似,但将按不同的顺序执行这些步骤:首先#创建原始磁盘 VMDK 映像,然后 #创建虚拟机配置文件

现在,您应该有一个可用的虚拟机配置,其虚拟 VMDK 磁盘绑定到真实磁盘。安装过程与 VirtualBox/安装 Arch Linux 作为客户机 中描述的步骤完全相同,但需要 #确保您具有持久的命名方案#确保您的 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 客户机

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

$ 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[4]

将原生 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 安装可能安装了第一个或第二个版本。在这种情况下,请禁用 启用 IO/APIC VirtualBox 扩展功能
  • 禁用任何 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 镜像,请跳过与分区相关的部分。
  • 使用 ntfs-3g 提供的 ntfsresize 工具将原生 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 Guest Additions。如果未出现新的磁盘对话框,请导航到 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 保留分区”的分区号(例如:如果分区是 /dev/sda2,则数字将是 2);
  • BASIC_DATA_PARTITION_NUMBER 必须替换为包含 Windows 安装的分区号(例如:如果分区是 /dev/sda3,则数字将是 3);

示例

$ sudo 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”设备右侧的第二个按钮;
  • 虚拟光驱应该已经作为“光驱”存在。

配置虚拟 UEFI 固件并创建 Windows 启动文件

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

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

打开 Diskpart

X:\ diskpart

列出系统识别的所有磁盘

DISKPART> list disk

由于 esp.vmkd 磁盘已连接到 SATA 端口 0,大小约为 512 MiB 且未分区,因此应标记为 disk 0windows.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. 从 Guest 操作系统使用原始主机硬盘

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

创建原始磁盘

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

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

设置 Guest 启动分辨率

您可以使用 VBoxManage 工具更改 BIOS/UEFI 启动分辨率。例如

$ VBoxManage setextradata "Your Virtual Machine Name" "VBoxInternal2/EfiGraphicsResolution" "2560x1440"

推荐分辨率为 1280x720、1920x1080、2048x1080、2560x1440、3840x2160、1280x800、1280x1024、1440x900、1600x900。

从主机 SSH 连接到 Guest

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

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

将建立从主机到 Guest 的连接。

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

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

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

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

故障排除

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

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

为了使用鼠标在主机和虚拟机之间透明地来回控制您的虚拟机,而无需按任何键,从而实现无缝集成,请在 Guest 操作系统内安装 增强功能。如果您的 Guest 操作系统是 Arch Linux,请阅读 VirtualBox/Install Arch Linux as a guest#安装增强功能,否则请阅读官方 VirtualBox 帮助。

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

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

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

VirtualBox GUI 与主机 GTK 主题不匹配

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

无法将 Ctrl+Alt+Fn 发送到 Guest

您的 Guest 操作系统是 GNU/Linux 发行版,您想通过按 Ctrl+Alt+F2 打开一个新的 TTY shell,或者通过 Ctrl+Alt+Backspace 退出当前的 X 会话。如果您在没有任何调整的情况下键入这些键盘快捷键,Guest 将不会收到任何输入,并且主机(如果它也是 GNU/Linux 发行版)将拦截这些快捷键。例如,要将 Ctrl+Alt+F2 发送到 Guest,只需点击您的主机键(通常是右 Ctrl 键)并同时按下 F2

USB 子系统无法工作

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

如果即使以 root 身份运行 VBoxManage list usbhost 也没有显示任何 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

~/.bashrc
VBOX_USB=usbfs

然后确保环境已意识到此更改(重新连接,手动源文件,启动新的 shell 实例或重新启动)。

还要确保您的用户是 storage 组的成员。

USB 调制解调器在主机上无法工作

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

USB 设备导致 Guest 崩溃

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

主机在虚拟机启动时冻结

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

模拟麦克风无法工作

如果来自模拟麦克风的音频输入在主机上工作正常,但似乎没有声音传递到 Guest,尽管麦克风设备显然被正常检测到,则在主机上安装 声音服务器(例如 PulseAudio)可能会解决问题。

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

转换为 ISO 的镜像出现问题

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

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

未能创建仅主机网络接口

确保所有必需的内核模块都已加载。请参阅 #加载 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 Guest 操作系统中的共享文件夹运行需要管理员权限的 .exe 文件时,可能会出现此错误消息。[6]

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

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 Guest 操作系统会闪烁。自 r120678 以来,已实施一个补丁来识别环境变量设置,像这样启动 VirtualBox

$ CR_RENDER_FORCE_PRESENT_MAIN_THREAD=0 VirtualBox

确保没有 VirtualBox 服务仍在运行。请参阅 VirtualBox bug 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 启动,则将 virtualbox 别名 (Bash#Aliases) 为 env QT_QPA_PLATFORM=xcb virtualbox

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

具有 Intel GPU 的 Guest 操作系统随机冻结

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

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

要禁用迷你工具栏,请选择控制 > 设置,选择用户界面选项卡并取消选中迷你工具栏复选框

Windows 10 客户操作系统在使用 Intel Tiger Lake 芯片组时随机崩溃

要禁用 split lock 检测,请将 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 上的错误消息是“发生严重错误”。

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

3D 加速不工作

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

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

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

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

  • Kvantum 管理器配置活动主题 > 合成 & 常规外观部分下,禁用半透明窗口
  • Kvantum 管理器配置活动主题 > 合成 & 常规外观 > 不透明应用:菜单字段中,添加 VirtualBox,VirtualBoxVM
    • 这会为 virtualbox 窗口创建一个例外,使其被忽略。

另请参阅