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 选项的自定义内核时,您必须使用内核编译期间生成的密钥签署您的模块。
您可以作为 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 的文件,其内容如下(基于 Gentoo:Signed kernel module support#Building the kernel with proper keys)
[ 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 目录,然后作为 root 用户运行 mokutil --import signing_key.x509。之后您应该能够重新运行签名命令而不会出现错误。
如果这仍然不起作用,请尝试将您的内核更新到已提供签名文件的较新版本(大多数内核软件包应该如此),或者如果您正在编译自己的内核,请确保在您构建内核并运行它之后,将 src/(kernel version)/certs/signing_key.x509 和 src/(kernel version)/certs/signing_key.pem 从构建内核的文件夹复制到 /lib/modules/$(uname -r)/build/certs 目录。
加载 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/Install Arch Linux as a guest#Install the Guest Additions。
扩展包
Oracle VM VirtualBox 扩展包提供了附加功能,并以非自由许可证发布,仅供个人使用。要安装它,virtualbox-ext-oracleAUR 软件包可用,并且可以在 seblu 仓库中找到预构建版本。
如果您更喜欢使用传统的手动方式:手动下载扩展包并通过 GUI(文件 > 工具 > 扩展包管理器)或通过 VBoxManage extpack install <.vbox-extpack> 安装,请确保您有像 Polkit 这样的工具来授予 VirtualBox 特权访问。扩展包的安装需要 root 访问权限。
您也可以不使用 Polkit,通过以下命令安装扩展包
# vboxmanage extpack install path-to-extension-pack
非自由扩展包的其中一个功能是支持远程桌面协议(RDP)。这部分功能也可以通过安装 virtualbox-ext-vnc 软件包,使用开源的 VNC 扩展包来获得。
前端
VirtualBox 附带四种前端
- 如果您想使用常规 GUI 运行 VirtualBox,请使用
VirtualBox。 - 如果您想从命令行启动和管理虚拟机,请使用
VBoxSDL命令,它只为虚拟机提供一个简单的窗口,没有任何覆盖层。 - 如果您想在不运行任何 GUI 的情况下使用 VirtualBox(例如在服务器上),请使用
VBoxHeadless命令。通过 VRDP 扩展,您仍然可以远程访问虚拟机的显示器。 - 如果您想远程管理虚拟机,VirtualBox 网络服务(
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/Install Arch Linux as a guest。
虚拟磁盘管理
另请参阅 #从/向其他虚拟机监控程序导入/导出 VirtualBox 虚拟机。
VirtualBox 支持的格式
VirtualBox 支持以下虚拟磁盘格式
- VDI:虚拟磁盘镜像(Virtual Disk Image)是 VirtualBox 自己的开放容器格式,默认在您使用 VirtualBox 创建虚拟机时使用。
- VMDK:虚拟机磁盘(Virtual Machine Disk)最初由 VMware 为其产品开发。该规范最初是闭源的,但后来成为 VirtualBox 完全支持的开放格式。此格式提供将文件拆分为多个 2GB 文件的能力。如果您想将虚拟机存储在不支持超大文件的机器上,此功能特别有用。其他格式,除了 Parallels 的 HDD 格式,不提供类似的特性。
- VHD:虚拟硬盘(Virtual Hard Disk)是微软在 Windows Virtual PC 和 Hyper-V 中使用的格式。如果您打算使用这些微软产品中的任何一个,您将不得不选择此格式。
- 提示 自 Windows 7 以来,此格式无需任何额外应用程序即可直接挂载。
- VHDX(只读):这是微软开发的虚拟硬盘格式的扩展版本,随 Windows Server 2012 中的 Hyper-V 3.0 于 2012 年 9 月 4 日发布。此新版磁盘格式提供了增强的性能(更好的块对齐)、更大的块大小和日志支持,从而带来了断电恢复能力。VirtualBox 应该只读支持此格式。
- HDD(版本 2):HDD 格式由 Parallels Inc 开发,并用于其虚拟机监控程序解决方案,如 Parallels Desktop for Mac。此格式的更新版本(即 3 和 4)由于缺乏此专有格式的文档而不受支持。注意 目前关于版本 2 格式支持存在争议。虽然 VirtualBox 官方手册仅报告支持 HDD 文件格式的第二版本,但维基百科的贡献者报告第一版本也可能有效。如果您能用 HDD 格式的第一版本进行一些测试,欢迎提供帮助。
- QED:QEMU 增强磁盘(QEMU Enhanced Disk)格式是 QEMU(另一个自由开源虚拟机监控程序)的旧文件格式。此格式从 2010 年开始设计,旨在提供 QCOW2 和其他格式的卓越替代方案。此格式具有完全异步 I/O 路径、强大的数据完整性、后端文件和稀疏文件。QED 格式仅用于与使用旧版本 QEMU 创建的虚拟机兼容。
- QCOW:QEMU 写时复制(QEMU Copy On Write)格式是 QEMU 当前的格式。QCOW 格式支持基于 zlib 的透明压缩和加密(后者存在缺陷,不建议使用)。QCOW 有两个版本:QCOW 和 QCOW2。QCOW2 倾向于取代第一个版本。VirtualBox 目前完全支持 QCOW。QCOW2 有两个修订版:QCOW2 0.10 和 QCOW2 1.1(这是您使用 QEMU 创建虚拟磁盘时的默认版本)。VirtualBox 不支持 QCOW2。
- OVF:开放虚拟化格式(Open Virtualization Format)是一种开放格式,旨在实现不同虚拟机监控程序之间虚拟机的互操作性和分发。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/
或者,您可以使用来自 qemu-img 的 nbd 内核模块和 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。
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 中勾选 System > Free disk space 复选框,或在 CLI 中使用
bleachbit -c system.free_disk_space; - 在基于 UNIX 的系统上,通过使用
cat
# cat /dev/zero >/path/to/fillfile || rm /path/to/fillfile
- 当
fillfile达到分区限制时,您将收到类似No space left on device的消息。这意味着分区中的所有用户空间和非保留块都将填充零。由于cat将此报告为错误,因此|| rm /path/to/fillfile将在之后删除该文件,再次释放空间。 - 以 root 身份使用此命令很重要,以确保所有空闲块都被覆盖。实际上,默认情况下,当使用 ext 文件系统分区时,文件系统块的指定百分比会保留给超级用户(请参阅
mkfs.ext4man 手册页中的-m参数或使用tune2fs -l查看为 root 应用程序保留了多少空间)。
- 在 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 文件应用上述命令。
- 这种写入零和压缩/回收/清理空间的概念仅在虚拟磁盘上没有加密的情况下才有效。
- 在 Windows 上,您可以使用
manage-bde -status命令检查 BitLocker 是否启用,并使用manage-bde -off c:禁用它,其中c:指的是加密驱动器。之后,重复上述步骤。
- 在 Windows 上,您可以使用
TRIM
VirtualBox 通过一个实验性的“丢弃(discard)”附加选项在 VDI 文件中提供 TRIM 模拟。此选项未文档化,可通过命令行或 .vbox 文件编辑访问。启用后,来自客户机操作系统的 TRIM 命令会导致 VDI 文件的相应部分被压缩。
增加虚拟磁盘
一般步骤
如果您因创建虚拟机时选择的硬盘大小过小而导致空间不足,VirtualBox 手册建议的解决方案是使用 VBoxManage modifyhd。但是,此命令仅适用于 VDI 和 VHD 磁盘以及动态分配的变体。如果您也想调整固定大小的虚拟磁盘,请阅读此技巧,它适用于 Windows 或类 UNIX 虚拟机。
首先,在您要增加的虚拟磁盘旁边创建一个新的虚拟磁盘
$ VBoxManage createmedium disk -filename new.vdi --size 10000
其中大小以 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 Live 镜像并将其作为虚拟 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 替换为新的。
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
VBoxManage clonehd。技巧与提示
从/向其他虚拟机监控程序导入/导出 VirtualBox 虚拟机
如果您打算在其他虚拟机监控程序上使用您的虚拟机,或者想将使用其他虚拟机监控程序创建的虚拟机导入到 VirtualBox 中,您可能会对阅读以下步骤感兴趣。
移除增强功能
大多数虚拟机监控程序解决方案都提供增强功能:VirtualBox 附带增强功能,VMware 附带 VMware Tools,Parallels 附带 Parallels Tools 等。这些附加组件旨在在客户机操作系统安装后安装在虚拟机内部。它们由设备驱动程序和系统应用程序组成,通过提供这些功能来优化客户机操作系统,以获得更好的性能和可用性。
如果您的虚拟机已安装增强功能,请先将其卸载。您的客户机,特别是如果它使用的是 Windows 系列的操作系统,如果您仍在其他虚拟机监控程序中使用特定的驱动程序,可能会出现异常行为、崩溃甚至根本无法启动。
使用正确的虚拟磁盘格式
此步骤将取决于是否能够直接转换虚拟磁盘镜像。
自动化工具
有些公司提供工具,可以将位于虚拟机中甚至原生安装中的 Windows 或 GNU/Linux 操作系统创建为虚拟机。使用此类产品,您无需执行此步骤和后续步骤,并且可以在此处停止阅读。
- Parallels Transporter 是 Parallels Inc 的一款非免费产品。此解决方案基本上由一个名为代理的软件组成,该软件将安装在您要导入/转换的客户机中。然后,仅在 OS X 上运行的 Parallels Transporter 将从该代理创建一个虚拟机,该代理通过 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"
最后,要求您的虚拟机监控程序使用您已转换的现有虚拟磁盘并启动虚拟机。
- 在 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 - 如果您有多个由 systemd 管理的虚拟机且它们未能正常停止,请尝试在
[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 库,可以将 d3d 调用转换为 OpenGL,然后进行加速,从而在 Windows 客户机中获得 Direct3D 加速。这些库现在是 VirtualBox 增强功能的一部分。
如上所述启用 OpenGL 加速后,将客户机重启到安全模式(在 Windows 屏幕出现但 VirtualBox 屏幕消失后按 F8),并安装 VirtualBox 增强功能,在安装过程中勾选Direct3D 支持复选框。重启回正常模式后,您应该拥有加速的 Direct3D。
- 此技巧对某些游戏可能有效,也可能无效,具体取决于它们进行的硬件检查和使用的 D3D 部分。
- 这已在 Windows XP、7 和 8.1 上测试过。如果此方法不适用于您的 Windows 版本,请在此处添加数据。
USB 驱动器上的 VirtualBox
当在 USB 驱动器上使用 VirtualBox 时,例如使用 ISO 镜像启动已安装的机器,您将需要手动从现有驱动器创建 VMDK。然而,一旦新的 VMDKs 保存并且您转移到另一台机器,您可能会再次遇到启动适当机器的问题。为了解决这个问题,您可以使用以下脚本启动 VirtualBox。此脚本将清理并注销旧的 VMDK 文件,并为您创建新的、正确的 VMDKs
#!/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 发行版时,伪 RAID 设备将映射到 /dev/mapper/,而设备仍然可以单独访问。然而,在您的虚拟机中,它可能例如在 /dev/sdaX 中出现,没有任何映射,因为控制主机操作系统(例如 Windows)中伪 RAID 的驱动程序正在抽象化伪 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 磁盘作为虚拟驱动器,为此我们将使用一个约 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 主机上
必须以管理员身份运行命令提示符。
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 as a guest#Install the Guest Additions,因为这个 Arch Linux 虚拟机基本上是一个 Arch Linux 客户机。
/etc/X11/xorg.conf,这样 Xorg 就能即时获取所需的一切。然而,如果您确实需要自己的 Xorg 配置,也许值得将您的默认 systemd 目标设置为 multi-user.target,并以 root 身份运行 systemctl isolate graphical.target(更多详情请参阅 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 as a guest中描述的步骤完全相同,但要遵循#确保您有持久的命名方案和#确保您的 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 - 选择启动维护管理器
- 选择从文件启动
现在您将看到一些模糊的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维基页面,但已在此处更新。
- 移除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.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上的任务
- 使用ntfs-3g提供的
ntfsresize工具,将原生Windows分区大小缩小到Windows实际所需的大小。您将指定的大小将与下一步创建的VDI大小相同。如果此大小过小,您可能会损坏Windows安装,并且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和微软引导加载程序。在安全模式下,驱动程序很可能会通过Windows即插即用检测机制进行安装查看。此外,通过菜单设备 > 插入增强功能CD镜像...安装VirtualBox增强功能。如果没有出现新的磁盘对话框,请导航到CD驱动器并手动启动安装程序。
- 您最终应该会拥有一个正常工作的Windows虚拟机。不要忘记阅读#已知限制。
- 性能提示:根据VirtualBox手册,SATA控制器的性能优于IDE。如果您无法立即从虚拟SATA控制器启动Windows,那很可能是因为缺少SATA驱动程序。将虚拟磁盘连接到IDE控制器,创建一个空的SATA控制器并启动虚拟机——Windows应该会自动安装SATA控制器驱动程序。然后您可以关闭虚拟机,将虚拟磁盘从IDE控制器分离并将其连接到SATA控制器。
修复MBR和微软引导加载程序
如果您的Windows虚拟机拒绝启动,您可能需要对虚拟机应用以下修改。
- 在Windows启动之前,在您的虚拟机中启动一个GNU/Linux 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: booting cloned disk),或者需要手动修复分区表,或者使用您在上一步中创建的恢复盘修复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 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_USER和VIRTUALBOX_RUNNING_GROUP替换为将运行VirtualBox的用户和组,这很可能就是您的用户。
允许VirtualBox读取物理分区
VirtualBox必须拥有原始磁盘访问权限才能运行Windows分区。通常,这需要VirtualBox以完整的root权限运行,但有更优雅的选项可用。
更高安全选项:为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”设备右侧的第二个按钮;
- 虚拟光驱应该已经存在,名为“光驱”。
配置虚拟UEFI固件并创建Windows引导文件
现在启动虚拟机,它应该会自动从Windows安装盘启动。选择安装区域设置后,点击“修复您的计算机”链接,然后选择“疑难解答”,再选择“命令提示符”,以从安装介质启动命令提示符。
输入以下命令,在esp.vmdk磁盘中创建新的GPT表,并使用现有Windows分区的配置在其上安装Windows引导加载程序
打开Diskpart
X:\ diskpart
列出系统识别的所有磁盘
DISKPART> list disk
由于esp.vmdk磁盘连接到SATA端口0,它应该被标记为disk 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中运行原生Windows安装的工作方式相同,但vmdk将包含整个磁盘而不是单个分区,因此您无需创建单独的ESP或MBR分区,因为将使用物理磁盘中的分区。
创建原始磁盘
# VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/sdb
然后按照#在VirtualBox中运行原生Windows安装中的相同方法进行配置和虚拟磁盘连接。
设置访客机起始分辨率
通常,安装增强功能后,运行X的全屏Arch访客机会被设置为显示器的最佳分辨率;然而,虚拟控制台的帧缓冲器将设置为从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,以验证您的访客系统是否已识别出新的分辨率(这不保证所有分辨率都能工作,具体取决于您的硬件限制)。
hwinfo --framebuffer可能不会显示任何输出,但您仍应能够按照此过程设置自定义分辨率。最后,添加一个video=resolution内核参数,将帧缓冲器设置为新分辨率,例如
video=1360x768
此外,您可能希望配置您的引导加载程序以使用相同的分辨率。如果您使用GRUB,请参阅GRUB/提示与技巧#设置帧缓冲分辨率。
vga和引导加载程序的分辨率设置(例如GRUB的GRUB_GFXPAYLOAD_LINUX)都无法修复帧缓冲,因为它们会被内核模式设置覆盖。帧缓冲分辨率必须通过上述的内核参数video来设置。从主机SSH到访客机
虚拟机设置的网络选项卡包含一个端口转发工具。可以使用它将访客机SSH端口22转发到主机端口,例如60022。之后,您可以从主机通过指定的主机端口连接到访客机
[user@host]$ ssh -p 60022 user@localhost
SSHFS作为共享文件夹的替代方案
使用此端口转发和SSHFS可以轻松地将访客机文件系统挂载到主机上
[user@host]$ sshfs -p 60022 user@localhost:$HOME ~/shared_folder
然后在这两者之间传输文件。
指定仅主机网络
出于安全原因,VirtualBox网络驱动程序限制了可用子网范围。这在更改虚拟网络适配器设置时会导致E_ACCESSDENIED错误[5]。您可以通过创建/etc/vbox/networks.conf并向其中添加网络子网来更改允许的网络列表。例如
/etc/vbox/networks.conf
* 10.0.0.0/8 192.168.0.0/16 * 2001:db8:1234::/48
对于IPv6,最佳实践是生成一个新的、随机的ULA前缀。
更改/etc/vbox/networks.conf后,不要忘记重新加载驱动程序并重启VirtualBox
# modprobe -r vboxnetadp vboxnetflt # modprobe vboxnetadp vboxnetflt
故障排除
键盘和鼠标被锁定在虚拟机中
这意味着您的虚拟机已经捕获了您的键盘和鼠标输入。只需按下右侧的Ctrl键,您的输入就应该能够再次控制您的主机。
要透明地用鼠标在主机和虚拟机之间来回切换,无需按任何键,从而实现无缝集成,请在访客机内部安装增强功能。如果您的访客机是Arch Linux,请阅读VirtualBox/将Arch Linux作为访客机安装#安装增强功能,否则请查阅VirtualBox官方帮助。
没有64位操作系统客户端选项
启动虚拟机客户端时,如果没有可用的64位选项,请确保在BIOS中启用了CPU虚拟化功能(通常命名为VT-x)。
如果您使用的是Windows主机,您可能需要禁用Hyper-V,因为它会阻止VirtualBox使用VT-x。[6]
VirtualBox GUI与主机GTK主题不匹配
有关VirtualBox等基于Qt的应用程序的主题设置,请参阅Qt和GTK应用程序的统一外观。
无法向访客机发送Ctrl+Alt+Fn
您的访客操作系统是GNU/Linux发行版,您想通过按下Ctrl+Alt+F2打开一个新的TTY shell,或通过Ctrl+Alt+Backspace退出当前的X会话。如果您不加任何调整地输入这些键盘快捷键,访客机将不会收到任何输入,而主机(如果它也是GNU/Linux发行版)将拦截这些快捷键。例如,要向访客机发送Ctrl+Alt+F2,只需按下您的主机键(通常是右侧的Ctrl键)并同时按下F2。
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启动,则将virtualbox别名(Bash#别名)设置为env QT_QPA_PLATFORM=xcb virtualbox。
搭载Intel GPU的访客机随机冻结
使用Intel CPU和显卡时,为访客机分配更多处理器可能会降低渲染性能,从而导致随机冻结。分配更少的处理器可能会有所帮助。
无法在全屏模式下查看桌面
通过选择机器 > 设置,然后选择用户界面选项卡并取消勾选迷你工具栏复选框来禁用迷你工具栏
搭载Intel Tiger Lake芯片组的Windows 10访客操作系统随机崩溃
通过向内核参数添加split_lock_detect=off来禁用拆分锁检测。
详细信息请参阅VirtualBox的工单 #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管理器的配置活动主题 > 合成与通用外观部分下禁用半透明窗口。
- 在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 virtual_machine_name --audio-driver pulse --audio-controller hda
参见
- 用户指南(单HTML页面)