李守中
该站已迁往根域名 https://lishouzhong.com
需要注意,迁移后的文章的 url 可能会发生变化。
域名 https://note.lishouzhong.com 下的内容将不再更新,但已有内容会永久保留。

Virtualbox 相关

Table of Contents

1. VirtualBox 使用

1.1. 精简虚拟磁盘文件的大小

1.1.1. 对未使用部分的非 0 块写 0

1.1.1.1. Linux 虚拟机

如果文件系统为 ext 系列,使用 zerofree 这个包能做到只对非 0 块写 0,减少了非必要的写入操作,延长了硬盘寿命。具体操作方法为:

  1. 用 Ubuntu 或者 Debian 的 live 镜像进入体验系统。
  2. 执行 sudo apt install -y zerofree 安装软件。
  3. 执行 sudo zerofree /dev/sda{2-3} 对分区写 0 后退出体验系统。

如果文件系统为 xfs 或者其他,那么只能用最基础的方法:

# 创建一个全 0 的大文件,对于所有的块写 0
dd if=/dev/zero of=/null.dat
# 删除这个文件
rm -f /null.dat
1.1.1.2. Windows 虚拟机

在 windows 虚拟机上,下载微软 SysinternalsSuite 套件,执行里面的 sdelete.exe: .\sdelete.exe -z c:

1.1.2. 精简磁盘文件

如果使用 Linux 为宿主机,执行如下命令,根据情况替换 VDI 磁盘路径:

VBoxManage modifyhd --compact /home/lsz/VirtualBoxVMs/Win10LTSC/Win10LTSC.vdi

如果使用 Windows 为宿主机,在 PowerShell 或者 CMD 中执行如下命令,根据情况替换 VDI 磁盘路径:

PS C:\Users\lsz> cd C:\"Program Files"\Oracle\VirtualBox
PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage modifyhd --compact D:\VirtualBoxVMs\Win10LTSC2019\Win10LTSC2019.vdi

1.2. 虚拟机复制

尽量在 virtualbox 的界面按下 Alt+M 选择 复制 来进行虚拟机复制。

如果只是复制原虚拟机文件夹,然后直接粘贴产生副本,那么在导入副本中的虚拟机时,virtualbox 会报错:

未能打开位于 D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vbox 的虚拟电脑。

Trying to open a VM config 'D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vbox' which has the same UUID as an existing virtual machine.

返回 代码: E_FAIL (0x80004005)
组件: MachineWrap
界面: IMachine {85632c68-b5bb-4316-a900-5eb28d3413df}
被召者: IVirtualBox {d0a0163f-e254-4e5b-a1f2-011cf991c38d}

如果只是 VDI 文件的 UUID 冲突,可以使用 VirtualBox 自带的工具为硬盘重新生成 UUID:

PS C:\Users\lsz> cd C:\Program Files\Oracle\VirtualBox
PS C:\Program Files\Oracle\VirtualBox> .\VBoxManage.exe internalcommands sethduuid "D:/VirtualBoxVMs/Win10LTSC2/Win10LTSC.vdi"
UUID changed to: 8acc15bc-cefc-41ce-83d2-b4e2c4f0a154

但如果整个虚拟机完全相同,那要改的地方就太多了。此处略过。

2. Linux 虚拟机

2.1. 关于增强功能

原先 VirtualBox 的增强功能是需要先挂载一个 ISO 文件,然后执行脚本编译内核模块。这也意味着,如果内核更新了,这个模块需要重新编译一遍。

后来 VirtualBox 学习 VMware 把增强功能做进了 virtualbox-guest-additions 软件包中,并将其发布在多个发行版的软件源中:

  • Debian 系发行版默认软件源中有这个包。
  • RedHat 系发行版的包在 rpmfusion 这个第三方源里面。
  • Fedora 自带的软件源里有这个包。

用包管理器安装 virtualbox-guest-additions 即可安装增强功能,不必再手动编译了。

2.2. 不能使用文件拖拽 ( drag and drop ) 功能

在使用 x11 套件作为桌面服务的发行版中,安装 virtualbox-guest-additions 后,文件拖拽功能就可以正常使用了。

但是自 Debian 10 和 Fedora 25 开始,Wayland 是默认的桌面服务,而 Wayland 不支持 Virtualbox 的拖拽功能。

所以,在使用 Wayland 作为桌面服务的发行版中,无论 virtualbox-guest-additions 是否安装,都无法使用拖拽功能。

2.3. vmwgfx: Failed to send host log message

Linux 如果使用了 VMSVGA 作为显卡控制器会报:

... [drm:vmw_host_log [vmwgfx]] ERROR Failed to send host log message.

这个 [bug](https://www.virtualbox.org/ticket/19168) 在 VirtualBox 6.1.0 的时候就出现了,但是直到 6.1.30 都没修好。

如果不使用 GUI 的话,只需要把显卡控制器改成其他类型就好了。不改的话倒是用起来也没什么问题。

2.4. Virtio-SCSI 的 Bug

Virtio-SCSI 直到 6.1.30 还是个实验特性,尽量别用。否则在 Linux 启动的时候,日志里可能出现这样的报错:

[...] blk_update_request: I/O error, dev sda, sector yyyyyy op 0x0:(READ) flags 0x80700 phys_seg 20 prio class 0

如果只给虚拟机 1 个 vCPU,Virtio-SCSI 这个特性是能用的:

  • AHCI (Host I/O Cache on or off) = OK
  • virtio-scsi (Host I/O Cache on or off) = OK

但如果给 2 个 vCPU,就不能开 I/O 缓存了:

  • AHCI (Host I/O Cache on or off) = OK
  • virtio-scsi (Host I/O Cache off) = OK
  • virtio-scsi (Host I/O Cache on) = BAD (I/O errors)

3. Windows 虚拟机

3.1. 发送 ACPI 信号无法关机 ( 正常关闭无反应,只能强制退出 )

对于物理机来说,ACPI 的关机信号由物理电源按键发送,而 VirtualBox 在关闭虚拟机时就是模拟物理按键发送 ACPI 关机信号。

无法关机的原因在于 ACPI 信号的接收或者处理出了问题,在 控制面板 -> 系统和安全 -> 电源选项 -> 选择电源按钮的功能 中,把 按电源按钮时 改为 关机 即可。



Last Update: 2023-08-13 Sun 14:33

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: lsz.sino@outlook.com

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议