VirtualBox
VirtualBox 是一款虚拟机管理程序,用于在现有操作系统之上运行称为虚拟机的特殊环境中的操作系统。VirtualBox 处于持续开发中,并且不断实施新功能。它配备了 Qt 图形用户界面,以及用于管理和运行虚拟机的无头和 SDL 命令行工具。
为了将主机系统的功能集成到虚拟机中,包括共享文件夹和剪贴板、视频加速和无缝窗口集成模式,为某些虚拟机操作系统提供了增强功能。
更多信息,请参阅官方文档。
Arch Linux 主机安装步骤
为了在您的 Arch Linux 机器上启动 VirtualBox 虚拟机,请按照以下安装步骤操作。
安装核心软件包
安装 virtualbox 软件包。您还需要选择一个软件包来为您的主机模块提供支持
- 对于 linux 内核,选择 virtualbox-host-modules-arch,
- 对于 linux-lts 内核,选择 virtualbox-host-modules-lts,
- 对于任何其他内核,选择 virtualbox-host-dkms。
要编译 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-arch 和 virtualbox-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
中找到。
/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
来启动使用该网络接口的虚拟机。
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)。此功能的一部分也可以通过安装开源的 VNC 扩展包 来获得,方法是安装 virtualbox-ext-vnc 软件包。
前端
VirtualBox 带有四个前端
- 如果您想使用带有常规 GUI 的 VirtualBox,请使用
VirtualBox
。 - 如果您想从命令行启动和管理您的虚拟机,请使用
VBoxSDL
命令,它仅为虚拟机提供一个纯窗口,没有任何覆盖。 - 如果您想在不运行任何 GUI 的情况下使用 VirtualBox(例如在服务器上),请使用
VBoxHeadless
命令。通过 VRDP 扩展,您仍然可以远程访问虚拟机的显示。 - 如果您想远程管理虚拟机,VirtualBox web service (
vboxwebsrv
) 提供了服务器端后端。它可以与 RemoteBox (GUI) 或 phpVirtualBox (WebUI) 一起使用。
请参阅 VirtualBox 手册,了解如何创建虚拟机。
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 开发,并在其虚拟机管理程序解决方案中使用,例如 Parallels Desktop for Mac。由于缺乏此专有格式的文档,因此不支持此格式的较新版本(即 3 和 4)。注意: 目前关于版本 2 格式的支持存在争议。虽然官方 VirtualBox 手册 仅报告支持 HDD 文件格式的第二个版本,但维基百科的贡献者 报告第一个版本也可能有效。如果您可以使用 HDD 格式的第一个版本执行一些测试,欢迎提供帮助。
- QED:QEMU 增强磁盘格式是 QEMU 的旧文件格式,QEMU 是另一个免费和开源的虚拟机管理程序。此格式于 2010 年设计,旨在提供优于 QCOW2 和其他格式的替代方案。此格式具有完全异步的 I/O 路径、强大的数据完整性、后备文件和稀疏文件。仅为了与使用旧版本 QEMU 创建的虚拟机兼容,才支持 QED 格式。
- 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=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[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 storage.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)删除所有膨胀文件,该工具也适用于 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 Suite 的
sdelete
,键入sdelete -s -z c:
,您需要在虚拟机中为您拥有的每个驱动器重新执行该命令; - 或者,如果您喜欢脚本,则有一个 PowerShell 解决方案,但仍然需要为所有驱动器重复执行。
- 来自 Sysinternals Suite 的
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 文件的相应部分被压缩。
增加虚拟磁盘
一般步骤
如果您因为创建虚拟机时选择的硬盘空间太小而空间不足,VirtualBox 手册建议的解决方案是使用 VBoxManage modifyhd。但是,此命令仅适用于 VDI 和 VHD 磁盘,且仅适用于动态分配的变体。如果您也想调整固定大小的虚拟磁盘,请继续阅读此技巧,它适用于 Windows 或类 UNIX 虚拟机。
首先,在您要增加的虚拟磁盘旁边创建一个新的虚拟磁盘
$ VBoxManage createmedium disk -filename new.vdi --size 10000
其中 size 以 MiB 为单位,在本例中 10000MiB ~= 10GiB,而 new.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 并重启。
最后,从 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>
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
技巧和窍门
从/向其他虚拟机监控程序导入/导出 VirtualBox 虚拟机
如果您计划在另一个虚拟机监控程序上使用您的虚拟机,或者想将使用另一个虚拟机监控程序创建的虚拟机导入到 VirtualBox 中,您可能会对阅读以下步骤感兴趣。
删除增强功能
大多数虚拟机监控程序解决方案都提供 Guest additions:VirtualBox 附带 Guest Additions,VMware 附带 VMware Tools,Parallels 附带 Parallels Tools 等。这些附加组件旨在在安装客户操作系统后安装在虚拟机内部。它们由设备驱动程序和系统应用程序组成,这些驱动程序和应用程序优化客户操作系统以获得更好的性能和可用性 通过提供这些功能。
如果您已将增强功能安装到您的虚拟机中,请先卸载它们。您的客户机,特别是如果它正在使用 Windows 系列的操作系统,如果仍在另一个虚拟机监控程序中使用特定的驱动程序,则可能会表现异常、崩溃甚至可能根本无法启动。
使用正确的虚拟磁盘格式
此步骤将取决于是否可以直接转换虚拟磁盘映像。
自动工具
一些公司提供工具,这些工具能够从 Windows 或 GNU/Linux 操作系统创建虚拟机,这些操作系统位于虚拟机中甚至本地安装中。使用这样的产品,您不需要应用此步骤和以下步骤,并且可以停止在此处阅读。
- Parallels Transporter 是 Parallels Inc. 的一款非免费产品。此解决方案基本上由一个名为 agent 的软件组成,该软件将安装在您要导入/转换的客户机中。然后,仅在 OS X 上运行的 Parallels Transporter 将从该 agent 创建虚拟机,该 agent 通过 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"
最后,要求您的虚拟机监控程序使用您已转换的现有虚拟磁盘并启动虚拟机。
- 在 VirtualBox 上,如果您不想浏览整个 GUI 来找到添加新虚拟驱动器设备的正确位置,您可以 手动从 .vbox 文件替换虚拟磁盘,或者使用 #增加 VDI 磁盘的大小 或 VirtualBox 手册页 中描述的
VBoxManage storageattach
。 - 同样,在 VMware 产品中,您可以通过在您的 .vmx 配置文件中调整 .vmdk 文件位置来替换当前虚拟磁盘位置。
虚拟机启动管理
使用服务启动虚拟机(自动启动)
在下面查找将用于将虚拟机视为服务的 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
替换为虚拟机前端类型,通常为gui
、headless
或separate
- 将
stopmode
替换为所需的状态切换,通常为savestate
或acpipowerbutton
[Service]
部分末尾添加 KillMode=none
和 TimeoutStopSec=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 网络摄像头/麦克风
- 确保虚拟机未运行,并且您的网络摄像头/麦克风未被使用。
- 调出 VirtualBox 主窗口,然后转到 Arch 机器的设置。转到 USB 部分。
- 确保选中“启用 USB 控制器”。还要确保选中“启用 USB 2.0 (EHCI) 控制器”。
- 单击“从设备添加过滤器”按钮(带有“+”图标的电缆)。
- 从列表中选择您的 USB 网络摄像头/麦克风设备。
- 现在单击“确定”并启动您的虚拟机。
检测网络摄像头和其他 USB 设备
如果您要查找的设备未在上面部分中的任何菜单中显示,并且您已尝试所有三个 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 加速后,将虚拟机客户机重启到安全模式(在 Windows 屏幕出现之前但在 VirtualBox 屏幕消失之后按 F8 键),并安装 VirtualBox 增强功能,在安装期间启用Direct3D 支持复选框。 重启回到正常模式,您应该就拥有加速的 Direct3D。
- 对于某些游戏,此技巧可能有效,也可能无效,具体取决于它们进行的硬件检查以及它们使用的 D3D 部分。
- 这已在 Windows XP、7 和 8.1 上测试过。 如果此方法在您的 Windows 版本上不起作用,请在此处添加数据。
USB 盘上的 VirtualBox
当在 USB 盘上使用 VirtualBox 时,例如使用 ISO 镜像启动已安装的虚拟机,您将必须手动从现有驱动器创建 VMKD。 但是,一旦保存了新的 VMDK 并且您移动到另一台机器,您可能会在再次启动合适的虚拟机时遇到问题。 为了解决这个问题,您可以使用以下脚本来启动 VirtualBox。 此脚本将清理并取消注册旧的 VMDK 文件,并为您创建新的、正确的 VMDK。
#!/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 镜像
现在,我们需要创建一个新的虚拟机,它将使用 原始磁盘 作为虚拟驱动器,为此我们将使用大约 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 主机上
必须以管理员身份运行命令提示符。
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
命令,您可以先将当前目录更改为 VirtualBox 安装文件夹,方法是使用 cd C:\Program Files\Oracle\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 作为虚拟机客户机#安装增强功能,因为此 Arch Linux 虚拟机基本上是一个 Arch Linux 虚拟机客户机。
/etc/X11/xorg.conf
,这样 Xorg 将动态选择它需要的一切。 但是,如果您确实需要自己的 Xorg 配置,也许值得将您的默认 systemd 目标设置为 multi-user.target
,并使用 systemctl isolate graphical.target
作为 root 用户(更多详细信息请参见 Systemd#Targets 和 Systemd#Change current target)。 这样,图形界面被禁用(即 Xorg 未启动),并且在您登录后,您可以手动使用自定义的 xorg.conf
来 startx
}。从 VirtualBox 安装原生 Arch Linux 系统
在某些情况下,在运行另一个操作系统时安装原生 Arch Linux 系统可能很有用:完成此操作的一种方法是通过 VirtualBox 在 原始磁盘 上执行安装。 如果现有操作系统是基于 Linux 的,您可能需要考虑遵循 从现有 Linux 安装。
这种情况与 #在 VirtualBox 中运行原生 Arch Linux 安装 非常相似,但将以不同的顺序执行这些步骤:从 #创建原始磁盘 VMDK 镜像 开始,然后 #创建虚拟机配置文件。
现在,您应该有一个可用的虚拟机配置,其虚拟 VMDK 磁盘与真实磁盘绑定。 安装过程与 VirtualBox/Install Arch Linux 作为虚拟机客户机 中描述的步骤完全相同,但需要 #确保您具有持久命名方案 和 #确保您的 mkinitcpio 镜像正确。
- 对于 BIOS 系统和 MBR 磁盘,请勿在虚拟机内部安装引导加载程序,这将不起作用,因为 MBR 未链接到您的真实机器的 MBR,并且您的虚拟磁盘仅映射到没有 MBR 的真实分区。
- 对于没有 CSM 和 GPT 磁盘的 UEFI 系统,安装将根本不起作用,因为
- 这就是为什么建议首先在原生安装中创建分区,否则分区将不会在您的 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,请输入以下内容
- 在 UEFI 提示符下键入
exit
- 选择Boot Maintenance Manager(启动维护管理器)
- 选择Boot From File(从文件启动)
现在您将进入几个晦涩的 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 分区上才能成功操作。其他分区的操作也是可行的,但尚未经过测试(详见 #已知限制)。
需要在您的原生 Windows 安装中首先完成一些任务,然后在您的 GNU/Linux 主机上完成。
Windows 上的任务
以下前三点来自 这个过时的 VirtualBox wiki 页面,但在此进行了更新。
- 移除 IDE/ATA 控制器检查(仅限 Windows XP):Windows 会记住它安装时所用的 IDE/ATA 驱动器控制器,如果检测到这些控制器已更改,则不会启动。微软提出的解决方案是重用相同的控制器或使用相同序列号的控制器之一,但这在虚拟机中是不可能实现的。MergeIDE,一个德国工具,基于微软提出的另一个解决方案开发,可以使用。该解决方案基本上包括从初始驱动程序存档中获取 Windows XP 支持的所有 IDE/ATA 控制器驱动程序(位置是硬编码的,或者将其指定为
.bat
脚本的第一个参数),安装它们并将它们注册到 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.sys
或intelppm.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 上的任务
- 使用
ntfsresize
减小原生 Windows 分区大小,使其达到 Windows 实际需要的尺寸,ntfsresize
可从 ntfs-3g 获得。您将指定的尺寸将与下一步中创建的 VDI 的尺寸相同。如果此尺寸太小,您可能会破坏您的 Windows 安装,后者可能根本无法启动。
- 首先使用
--no-action
选项运行测试 # ntfsresize --no-action --size 52Gi /dev/sda1
- 如果只有之前的测试成功,请再次执行此命令,但这次不带上述测试标志。
- 在您的 GNU/Linux 主机上安装 VirtualBox(如果您的主机是 Arch Linux,请参阅 #Arch Linux 主机的安装步骤)。
- 从驱动器的开头到 Windows 安装所在的第一个分区的末尾创建 Windows 磁盘镜像。从磁盘开头复制是必要的,因为驱动器开头的 MBR 空间需要与 Windows 分区一起位于虚拟驱动器上。在本示例中,后续的两个分区
sda2
和sda3
将稍后从分区表中删除,并且 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 > 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 安装
在某些情况下,能够与 Windows 双启动并且在虚拟机中访问分区是有用的。此过程与 #将原生 Windows 安装迁移到虚拟机 在几个方面显着不同
- Windows 分区不会被复制到虚拟磁盘镜像。相反,会创建一个原始 VMDK 文件;
- 虚拟机中的更改将镜像到分区中,反之亦然;
- OEM 许可证应该仍然满足,因为 Windows 分区仍然直接在硬件上启动。
创建虚拟机
必须手动创建 VirtualBox 虚拟机。目前,不要向虚拟机添加任何存储设备或磁盘,稍后将手动完成。
使用以下设置配置虚拟机(可以通过单击主工具栏中的“设置”按钮打开设置面板)
- 视图:系统
- 选项卡:主板
- 勾选启用 I/O APIC;
- 勾选启用 EFI;
- 如果您的系统是这种情况,则勾选硬件时钟使用 UTC 时间。
- 选项卡:处理器
- 勾选启用 PAE/NX;
- 勾选启用嵌套 VT-x/AMD-V;
- 选项卡:加速
- 从下拉菜单中选择准虚拟化接口 Hyper-V;
- 勾选启用嵌套分页。
- 选项卡:主板
您可以选择性地启用以下设置
- 视图:显示
- 选项卡:屏幕
- 勾选启用 3D 加速。请注意,这可能会导致故障。
- 选项卡:屏幕
创建虚拟机磁盘
要访问 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_USER
和 VIRTUALBOX_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 的用户需要加入 vboxusers
和 disk
组。
# usermod -aG disk,vboxusers VIRTUALBOX_RUNNING_USER
将 VIRTUALBOX_RUNNING_USER
替换为将要运行 VirtualBox 的用户,这很可能就是您自己的用户。
设置独立的 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
磁盘连接到 SATA 端口 0,大小约为 512 MiB 且未分区,因此应标记为 disk 0
。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 中运行整个物理磁盘
这与 #Run a native Windows installation inside VirtualBox 的工作方式相同,但 vmdk 将包含整个磁盘而不是一个分区,因此您无需创建单独的 ESP 或 MBR 分区,因为将使用物理磁盘中的分区。
创建原始磁盘
# VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sdb
然后按照 #Run a native Windows installation inside VirtualBox 中的相同方法进行配置和虚拟磁盘连接。
设置 Guest 启动分辨率
您可以使用 VBoxManage
工具更改 BIOS/UEFI 启动分辨率。例如
$ VBoxManage setextradata "Your Virtual Machine Name" "VBoxInternal2/EfiGraphicsResolution" "2560x1440"
推荐的分辨率有 1280x720、1920x1080、2048x1080、2560x1440、3840x2160、1280x800、1280x1024、1440x900、1600x900。
从 Host SSH 连接到 Guest
虚拟机设置的网络选项卡中的“高级”部分包含一个用于创建端口转发的工具。可以使用它将 Guest ssh 端口 22
转发到 Host 端口,例如 3022
user@host$ ssh -p 3022 $USER@localhost
将建立从 Host 到 Guest 的连接。
使用此端口转发和 SSHFS,可以轻松地将 Guest 文件系统挂载到 Host 文件系统上
user@host$ sshfs -p 3022 $USER@localhost:$HOME ~/shared_folder
然后在两者之间传输文件。
故障排除
键盘和鼠标被锁定在虚拟机中
这意味着您的虚拟机已捕获您的键盘和鼠标输入。只需按下右侧的 Ctrl
键,您的输入应该会再次控制您的 Host。
为了透明地控制您的虚拟机,使您的鼠标可以在 Host 和 Guest 之间来回移动,而无需按任何键,从而实现无缝集成,请在 Guest 内部安装增强功能。如果您的 Guest 是 Arch Linux,请阅读 VirtualBox/Install Arch Linux as a guest#Install the Guest Additions,否则请阅读 VirtualBox 官方帮助。
没有 64 位操作系统客户端选项
当启动虚拟机客户端,并且没有 64 位选项可用时,请确保您的 CPU 虚拟化功能(通常名为 VT-x
)已在 BIOS 中启用。
如果您使用的是 Windows Host,您可能需要禁用 Hyper-V,因为它会阻止 VirtualBox 使用 VT-x。 [5]
VirtualBox GUI 与 Host GTK 主题不匹配
有关为基于 Qt 的应用程序(如 VirtualBox)设置主题的信息,请参阅 Uniform look for Qt and GTK applications。
无法将 Ctrl+Alt+Fn 发送到 Guest
您的 Guest 操作系统是 GNU/Linux 发行版,并且您想通过按 Ctrl+Alt+F2
打开新的 TTY shell,或者通过 Ctrl+Alt+Backspace
退出当前的 X 会话。如果您在没有任何调整的情况下键入这些键盘快捷键,Guest 将不会收到任何输入,并且 Host(如果它也是 GNU/Linux 发行版)将拦截这些快捷键。例如,要将 Ctrl+Alt+F2
发送到 Guest,只需按下您的Host 键(通常是右侧的 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 Host 上,USB 子系统未自动检测到,导致错误 Could not load the Host USB Proxy service: VERR_NOT_FOUND
,或者 Host 上看不到 USB 驱动器,即使该用户在 vboxusers 组中。此问题是由于 VirtualBox 在 3.0.8 版本中从 usbfs 切换到 sysfs 引起的。如果 Host 不理解此更改,您可以通过在 shell 源的任何文件中(例如,如果您使用 bash,则在您的 ~/.bashrc
中)定义以下环境变量来恢复到旧的行为
~/.bashrc
VBOX_USB=usbfs
然后确保环境已意识到此更改(重新连接,手动 source 文件,启动新的 shell 实例或重新启动)。
还要确保您的用户是 storage
组的成员。
USB 调制解调器在 Host 上无法工作
如果您有一个 Guest 操作系统正在使用的 USB 调制解调器,则终止 Guest 操作系统可能会导致 Host 系统无法使用该调制解调器。终止并重新启动 VBoxSVC
应该可以解决此问题。
USB 设备导致 Guest 崩溃
如果将 USB 设备连接到 Guest 导致崩溃或任何其他错误行为,请尝试将 USB 控制器从 USB 2 (EHCI) 切换到 USB 3 (xHCI),反之亦然。
Host 在虚拟机启动时冻结
通常,此类问题在升级 VirtualBox 或 Linux 内核后出现。将其降级到之前的版本可能可以解决问题。
模拟麦克风无法工作
如果来自模拟麦克风的音频输入在 Host 上工作正常,但似乎没有声音传递到 Guest,尽管麦克风设备显然被正常检测到,但在 Host 上安装声音服务器(例如 PulseAudio)可能会解决此问题。
如果在安装 PulseAudio 后麦克风仍然无法工作,将Host 音频驱动程序(在VirtualBox > 虚拟机 > 设置 > 音频下)设置为ALSA 音频驱动程序可能会有所帮助。
转换为 ISO 的镜像文件出现问题
某些镜像格式无法可靠地转换为 ISO。例如,ccd2iso 忽略 .ccd 和 .sub 文件,这可能会导致磁盘镜像文件损坏。
在这种情况下,您要么必须在 VirtualBox 中为 Linux 使用 CDemu,要么使用任何其他用于挂载磁盘镜像的实用程序。
创建 Host-Only 网络接口失败
确保所有必需的内核模块都已加载。请参阅 #Load the VirtualBox kernel modules。
如果所有必需的内核模块都已加载,但您仍然无法创建 Host-Only 适配器,请导航到文件 > Host 网络管理器,然后单击创建按钮以添加网络接口。
插入模块失败
当您尝试加载模块时遇到以下错误
Failed to insert 'vboxdrv': Required key not available
签名您的模块,或在您的内核配置中禁用 CONFIG_MODULE_SIG_FORCE
。
VBOX_E_INVALID_OBJECT_STATE (0x80BB0007)
如果虚拟机非正常退出,则可能会发生这种情况。运行以下命令
$ VBoxManage controlvm virtual_machine_name poweroff
如果扩展包未更新并与新发布的 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 在其他未启用虚拟化指令(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 并选中使用 Host 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#别名) 为 env QT_QPA_PLATFORM=xcb virtualbox
。
Intel GPU 虚拟机中随机冻结
对于 Intel CPU 和显卡,为虚拟机分配更多处理器可能会降低渲染性能,从而导致随机冻结。分配较少的处理器可能会有所帮助。
无法在全屏模式下查看桌面
通过选择控制面板 > 设置,选择用户界面选项卡并取消选中迷你工具栏复选框来禁用迷你工具栏
Windows 10 客户操作系统在使用 Intel Tiger Lake 芯片组时随机崩溃
通过将 split_lock_detect=off
添加到内核参数来禁用 split lock 检测。
详细信息在 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 Manager 下禁用半透明窗口。
- 在 Kvantum Manager 的配置活动主题 > 合成和常规外观 > 不透明应用: 菜单字段中添加
VirtualBox,VirtualBoxVM
。- 这为 virtualbox 窗口创建了一个例外,使其被忽略。
另请参阅
- 用户指南 在单个 HTML 页面上