24.5 在 Linux 系统上交叉构建 FreeBSD

本章介绍在 Linux 系统上交叉构建 FreeBSD 操作系统的步骤。交叉构建通过在主机构建系统上生成目标架构的可执行代码,实现开发环境与运行环境的解耦。以下是操作环境和步骤说明:

设备环境

本章以 Ubuntu 24.04 LTS 为例进行说明,其他 Linux 发行版也可参考。构建过程内存消耗较大,建议配置如下:

  • 内存:不低于 12 GB

  • Swap:建议为 16 GB

若内存不足,构建过程可能因内存耗尽而失败。

安装软件包

构建 FreeBSD 需要安装以下软件包和开发库。以 root 权限执行:

apt update
apt install git build-essential libbz2-dev libarchive-dev libssl-dev flex

各软件包作用:

  • git:版本控制工具,用于获取 FreeBSD 源代码

  • build-essential:基础构建工具集合

  • libbz2-dev:bzip2 压缩库开发文件

  • libarchive-dev:归档库开发文件

  • libssl-dev:SSL 库开发文件

  • flex:词法分析器生成工具

部分用户可能需要根据网络环境更换软件源。

禁用熄屏

长时间构建过程中,避免系统自动熄屏可防止构建中断。

对于 GNOME 桌面环境,可进入“设置”→“电源”→“节电选项”,将“熄屏”选项设置为“从不”。

若无图形界面,可使用终端复用工具(如 tmux 或 screen)保持会话运行。

禁用 systemd-oomd

自 Ubuntu 22.04 LTS(Desktop)起,系统默认启用 systemd-oomd 服务。该服务会在系统达到内存阈值时强制结束高占用进程,可能导致构建失败,且此操作不会向用户提供提示信息。

禁用 systemd-oomd 的自启动,并立即停止其运行:

检查 systemd-oomd 的运行状态:

使用 git 拉取 FreeBSD 源代码

拉取 FreeBSD 源代码仓库:

--depth 1 指定浅克隆,仅获取最新一次提交,可大幅减少下载量和存储空间。如需完整历史记录,可省略此参数。

拉取完成后,源代码位于 /home/ykla/freebsd-src(目录 freebsd-src 由 Git 自动创建)。

如需构建特定版本(如 15.0-RELEASE),可在克隆后切换到对应分支:

创建放置构建产物的目录

创建目录 bsdobj 用于存放构建产物:

选项 -p:若其父目录不存在,则一并创建。

目录结构如下:

构建工具链与世界(用户空间)

buildworld 目标构建 FreeBSD 的完整用户空间(world),包括系统库、命令行工具等。这是交叉构建的第一步。

切换到 FreeBSD 源代码根目录:

指定对象目录并使用 make.py 构建 arm64/aarch64 的基本系统,同时启用 AArch64 和 ARM 的 LLVM 后端,并禁用 32 位库支持:

选项说明:

项目
说明

MAKEOBJDIRPREFIX=/home/ykla/bsdobj

指定所有构建产物的输出目录

tools/build/make.py

在非 FreeBSD 系统上启动构建流程的官方脚本

--bootstrap-toolchain

用源代码树里的 LLVM/Clang/LLD 自举工具链,而非通过 apt 安装,使之更接近原生构建

-j16

启用 16 个并行编译任务。一般与 CPU 线程数一致,例如 4 线程可使用 -j4

TARGET=arm64

目标平台设为 arm64

TARGET_ARCH=aarch64

目标 CPU 架构设为 aarch64

WITH_LLVM_TARGET_AARCH64=yes

启用 LLVM 的 AArch64 后端

WITH_LLVM_TARGET_ARM=yes

启用 LLVM 的 ARM 后端

WITHOUT_LIB32=yes

禁用 32 位兼容库及相关组件,当前测试未通过

buildworld

构建 FreeBSD 用户空间(world)

buildworld 构建时间较长,视硬件配置可能需要数小时。构建成功后,可通过检查 bsdobj 目录下是否生成了对应架构的目录结构来验证。

验证构建结果是否成功,可参考下图:

构建结果验证

构建内核工具链

确保当前仍位于 FreeBSD 源代码根目录:

使用与 buildworld 相同的参数构建内核工具链:

除末尾的 kernel-toolchain 不同外,其余选项参数均保持一致。

验证内核工具链的构建结果,可参考下图:

内核工具链构建结果

构建内核

确保当前仍位于 FreeBSD 源代码根目录:

使用指定参数构建 arm64/aarch64 内核:

除了末尾的 buildkernel 有变化,其他选项参数均一致。

验证内核的构建结果,可参考下图:

内核构建结果

附录:RISC-V 64

使用引导工具链并忽略 GCC 检测,构建 riscv64 架构的内核工具链:

验证 RISC-V 内核工具链的构建结果,可参考下图:

RISC-V 内核工具链构建结果

使用引导工具链并忽略 GCC 检测,构建 riscv64 内核:

验证 RISC-V 内核的构建结果,可参考下图:

RISC-V 内核构建结果

故障排除与未竟事宜

基于 Archlinux 构建 FreeBSD

要在 Arch 上编译,需要设置临时环境变量:

此参数显式指定 strerror_r 返回类型,避免因 glibc 同时支持 POSIX 和 GNU 两种规范导致的编译错误。否则构建过程会停留在 krb5 阶段。

此外,还必须确保 hostname 命令存在且能够正常输出,同时需安装 time 等软件包。

32 位构建的问题

FreeBSD 15.0 已不再支持任何 32 位架构。

Ubuntu 原生的 LLVM 工具链

待测试

构建更多体系结构(如 amd64)

待解决

参考文献

最后更新于