# 3.3 使用 VirtualBox 安装 FreeBSD

本节介绍在 Oracle VirtualBox 开源虚拟化平台上部署 FreeBSD 操作系统的技术方案与配置细节。

## 下载 VirtualBox

首先需要下载并安装 VirtualBox 虚拟机软件，这是后续操作的必要前提。

访问官方网站，点击页面右侧的 `Download` 按钮即可下载对应版本的安装程序。

<https://www.virtualbox.org>

## 安装设置

VirtualBox 安装完成后，按照以下步骤创建并配置虚拟机。以下演示基于 VirtualBox 7.1.4 和 Windows 11 24H2。

![VirtualBox 主界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-e08596061b9400e080d9a6e02c677d442c7badfb%2Fvb1.png?alt=media)

选择“新建”。

![新建虚拟机](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-b898480b69f8bae5aa0e09263d781308e513c99a%2Fvb2.png?alt=media)

名称输入“FreeBSD”，下方的相关选项会自动补全。

![虚拟机名称设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a5ef2d508bb19a843d064a005187894ca62413b1%2Fvb3.png?alt=media)

设置内存大小与 CPU 数量，并开启 EFI 支持选项。

> **技巧**
>
> 在 UEFI 模式下显卡可以正常驱动；而在 Wayland 下，由于缺少对应的 DRM/KMS（Direct Rendering Manager/Kernel Mode Setting，直接渲染管理器/内核模式设置）驱动支持，暂时无法使用。DRM/KMS 是 Linux/FreeBSD 等系统中用于管理显卡显示的内核子系统。

![硬件设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-9726ad8664c6a5be2fd115ee03489ccfa164fd18%2Fvb4.png?alt=media)

调整硬盘大小。

![硬盘大小设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-966c0a40b5ecd1a1e05ae29e3986081ea89eac5f%2Fvb4.5.png?alt=media)

打开设置。

![虚拟机设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-854b43aacb1cdfdc32d3f1d081ed94b63fd0d7cc%2Fvb5.png?alt=media)

显卡控制器使用 `VBoxSVGA` 即可。

> **警告**
>
> 不要勾选下方的“启用 3D 加速”选项，否则将导致无法使用 `VBoxSVGA` 控制器。

![显示设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-7ba1f4ace0e3b00b5bc8ef4eee7621e06d565f87%2Fvb5.5.png?alt=media)

开始安装。

![FreeBSD 安装界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-7ca3acd9adeca61c5efac9188389def751f7d01d%2Fvb6.png?alt=media)

![FreeBSD 安装界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-22e212fb315c212b6ac632d3294e1f56f1366196%2Fvb7.png?alt=media)

![FreeBSD 安装界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-283534d4423d09ab1b7cb1e98df2f899115d7851%2Fvb8.png?alt=media)

> **注意**
>
> 在较低版本的 VirtualBox 中，FreeBSD 安装完成后请手动关机并卸载或删除安装光盘，否则会再次进入安装界面。

安装后的系统：

![FreeBSD 系统界面](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-c5e505e7b72ce45e9609da0a414afe7bd6331dd0%2Fvb9.png?alt=media)

## 网络设置

VirtualBox 提供多种网络配置方式，以下介绍两种常用的网络设置方法。

### 方法 ① 桥接

> **技巧**
>
> VirtualBox 中的桥接模式可以使各方向的网络互通。

桥接是最简单的实现主机与虚拟机互通的方法，虚拟机可以获得一个与宿主机在同一网段的 IP 地址。例如，若主机 IP 为 192.168.31.123，则虚拟机 IP 可能为 192.168.31.x。

![桥接网络设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-a4f550d93e098e5fd32ba68a1fc5711c74ad5be3%2FVBbridge.png?alt=media\&token=72470ba1-2fbb-4b0d-9273-e8c4b5c00977)

设置后执行 `# dhclient em0` 即可（为了长期生效可在 `/etc/rc.conf` 中加入 `ifconfig_em0="DHCP"`）。

如果无法访问互联网，请将 DNS 设置为 `223.5.5.5`。如不清楚具体操作，请参阅本章其他部分。

### 方法 ② NAT + 仅主机模式

> **注意**
>
> 与 VMware 不同，VirtualBox 的默认 NAT 模式下，主机和虚拟机无法直接互通。虚拟机可以访问主机的特殊地址 `10.0.2.2` 及其上运行的服务，但主机无法访问虚拟机的端口，各虚拟机之间网络也相互隔离。参见：Oracle. Network Address Translation (NAT)\[EB/OL]. \[2026-03-26]. <https://www.virtualbox.org/manual/topics/networkingdetails.html#network_nat>. 你也可以按照手册中的端口转发来连通网络。

网络设置比较复杂，有时桥接不一定能生效。为了达到使用宿主机（如 Windows 11）控制虚拟机里的 FreeBSD 系统的目的，需要设置两块网卡——一块是 NAT 网络模式的网卡用来上网、另一块是仅主机模式的网卡用来与宿主机互通。如图所示：

![双网卡设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-595f433d2cc76baec8df12314a7a98eb9e884dad%2FQQ%E5%9B%BE%E7%89%8720211231155133.png?alt=media\&token=40c3c2e8-8e81-4724-9457-cab570d40cfb)

> **技巧**
>
> 在网卡类型下拉列表中，“网络地址转换（NAT）”与“NAT 网络”选项类似。根据官方手册 [Introduction to Networking Modes](https://www.virtualbox.org/manual/topics/networkingdetails.html#network_nat)，主要区别在于：“NAT 网络”模式下的虚拟机之间可以互通，而“网络地址转换（NAT）”模式下的虚拟机网络则是相互隔离的。

![仅主机模式设置](https://338876981-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FCJR3FQGH1PkdRtOljuxb%2Fuploads%2Fgit-blob-dc6721e4825a73a86bc534dcdedf84f20997a42c%2FQQ%E5%9B%BE%E7%89%8720211231155139.png?alt=media\&token=30eec9b6-de51-4e83-9742-6b558fdb9c83)

使用命令 `# ifconfig` 查看状态，如果第二块网卡 `em1` 没有获取到 IP 地址，请手动通过 DHCP 获取：`# dhclient em1`（为了长期生效，可在 `/etc/rc.conf` 中加入 `ifconfig_em1="DHCP"`）。

按这种方式设定的网络，虚拟机与主机所在的局域网无法互通。如果没有网络（互联网）请设置 DNS 为 `223.5.5.5`。如果不会，请参阅本章相关小节。

## 显卡驱动与增强工具

### 安装工具

* 使用 pkg 安装：

```sh
# pkg install virtualbox-ose-additions-72
```

或者使用 Ports：

```sh
# cd /usr/ports/emulators/virtualbox-ose-additions-72/
# make install clean
```

## 查看安装说明

```sh
root@ykla:/home/ykla # pkg info -D virtualbox-ose-additions-72
virtualbox-ose-additions-7.2.6.1500068:
On install:
VirtualBox Guest Additions are installed.
# VirtualBox 客户端增强功能已安装。

To enable and start the required services:

# sysrc vboxguest_enable="YES"
# sysrc vboxservice_enable="YES"
# 启用所需服务，使用 sysrc 添加开机启动项。

To start the services, restart the system.
# 要启动服务，请重启系统。

In some situations, a panic will occur when the kernel module loads.
Having no more than one virtual CPU might mitigate the issue.
# 某些情况下，加载内核模块时可能发生 panic。限制为单核虚拟 CPU 有可能缓解该问题。

For features such as window scaling and clipboard sharing, membership of
the wheel group is required. With username "jerry" as an example:

# pw groupmod wheel -m jerry
# 要启用窗口缩放、剪贴板共享等功能，用户需加入 wheel 组。
# 示例命令将用户 jerry 添加到 wheel 组。

The settings dialogue for FreeBSD guests encourages use of the VMSVGA
graphics controller. Whilst this might suit installations of FreeBSD
without a desktop environment (a common use case), it is not appropriate
where Guest Additions are installed.
# VirtualBox 会建议 FreeBSD 使用 VMSVGA 显卡控制器。
# 这对不含桌面的 FreeBSD 系统较为合适，但在已安装 Guest Additions 的环境下并不推荐。

Where Guest Additions are installed:

1. prefer VBoxSVGA
# 如果已安装 Guest Additions，应优先选择 VBoxSVGA 作为显卡控制器。

2. do not enable 3D acceleration (doing so will invisibly
   lose the preference for VBoxSVGA)
# 不要启用 3D 加速，否则 VBoxSVGA 的设置会被暗中忽略。

You may ignore the yellow alert that encourages use of VMSVGA.

# 可以忽略提示使用 VMSVGA 的黄色警告信息。
```

> **技巧**
>
> 请使用 UEFI，Xorg 可以自动识别驱动，**无需** 手动配置 `/usr/local/etc/X11/xorg.conf`（经测试，手动配置反而更卡）。

## 服务管理

* 启用服务并开机自启：

```sh
# service vboxguest enable   # 启用 VirtualBox Guest Additions 驱动
# service vboxservice enable # 启用 VirtualBox 服务
```

* 启动服务，调整权限（以普通用户 ykla 为例）：

```sh
# service vboxguest restart  # 重启 vboxguest 服务，可能提示找不到模块，但不影响使用
# service vboxservice restart # 重启 vboxservice 服务
# pw groupmod wheel -m ykla  # 将普通用户 ykla 添加到 wheel 组以获得管理权限，请替换为你的用户
```

## 故障排除与未竟事宜

### EFI 下无法正常关机

编辑 `/etc/sysctl.conf`，添加

```ini
hw.efi.poweroff=0	# 禁用 EFI 电源关闭功能，使系统通过 ACPI 正常关机
```

然后重启系统，再执行关机即可恢复，即使用 ACPI 而非 UEFI 接口进行关机操作。

### 参考文献

* mib. 12.0-U8.1 -> 13.0-U2 poweroff problem & solution\[EB/OL]. (2022-12-23)\[2026-03-26]. <https://www.truenas.com/community/threads/12-0-u8-1-13-0-u2-poweroff-problem-solution.104813/>. 提供了 EFI 环境下 FreeBSD 关机问题的解决方案。
* FreeBSD Forums. EFI: VirtualBox computer non-stop after successful shutdown of FreeBSD\[EB/OL]. (2022-04-28)\[2026-03-26]. <https://forums.freebsd.org/threads/efi-virtualbox-computer-non-stop-after-successful-shutdown-of-freebsd.84856/>. 详细分析了 VirtualBox 中 FreeBSD 关机异常的技术原因与修复方法。

### 鼠标被捕获在虚拟机窗口内，无法移出

请先按右侧的 `Ctrl` 键（默认设置下键盘左右各有一个 `Ctrl`），如果因自动缩放需要还原屏幕或找不到菜单栏，请按 `Home` + 右侧 `Ctrl`。

> **技巧**
>
> 在标准 108 键键盘上，`Home` 键位于 `Scroll Lock` 键的下方。

### UEFI 固件设置

开机时反复按 `Esc` 键即可进入 VirtualBox 虚拟机的 UEFI 固件设置。

## 课后习题

1. 查找 VirtualBox Guest Additions 在 FreeBSD 上的实现代码，分析 `vboxguest` 和 `vboxservice` 两个服务的职责划分，尝试禁用其中一个服务并观察系统功能的变化。
2. 修改 VirtualBox 的虚拟化引擎设置，对比 KVM 与原生虚拟化模式下 FreeBSD 的启动时间和系统性能。
3. 研究 `hw.efi.poweroff` 参数的内核实现，尝试修改该参数并观察关机行为的变化，修复该 Bug。
