NixBSD
NixBSD 是尝试构建一个可复现且可声明的 BSD,基于 NixOS。 尽管从理论上讲,这些工作的大部分可以复制用于构建其他 BSD, 但迄今为止的所有工作都集中在构建一个 FreeBSD 发行版上。
结构
截至 2023 年 1 月,NixBSD 由 3 个主要仓库组成:
nix
上游 nix 的一个分支,包含允许在 FreeBSD 上以及为 FreeBSD 平台进行构建的更改。 这些更改相当微小,主要围绕修复现有 FreeBSD 移植中的 bug。
这些更改很可能经过一些清理后很快就能上游化。
nixpkgs
上游 nixpkgs 的一个分支,支持 FreeBSD 平台以及多种 FreeBSD 软件包。
这添加了一些新的受支持系统,包括 x86_64-freebsd,即我们用于大部分开发的主机系统。它基于 staging 分支,并对 stdenv 进行了一些更改,这些更改也影响了 stdenv,因此你必须从 bootstrap 开始重新构建所有内容。
这需要大量工作才能清理到可上游化的状态, 但不应需要大规模的重组
NixBSD
此仓库包含用于构建系统的模块,类似于 nixpkgs 中的 nixos 目录。
在可能的情况下,模块直接从 nixpkgs 获取而不进行复制
(参见 module-list 中对 extPath 的引用。
一些模块是从 nixpkgs 复制并修改的。原始文件仍受 MIT License 保护,版权归原始贡献者所有。
不幸的是,将 NixBSD 上游合并到 NixOS 需要对 init 系统进行大量的重组和更改, 因此短期内不太可能发生。
freebsd-src
你可能会注意到没有 freebsd-src 的 fork。
对 FreeBSD 代码所需的更改极少,且主要涉及构建系统,
因此作为 patches 包含在 nixpkgs 中,或作为包文件中对 sed 的调用。
构建
测试模块更改的最简单方法是从 Linux 构建一个虚拟机。
你可以轻松使用 flake 输出 .#<configName>.<outputName> 来构建示例配置(configurations 中的目录)。
base 配置提供了一个简单的起点,包含一个用户账户和默认服务。
system.build 的所有输出均可用,此外还有几个。在开发过程中,你可能需要:
toplevel:顶层派生项,包含内核等软件、激活脚本等。 激活后,你会在 VM 镜像的/run/current-system处找到它的链接。vm:一个运行包含toplevel的虚拟机的脚本,使用 UEFI 启动。系统从可写的 CoW 副本启动,因此激活将运行,你可以编辑文件closureInfo:toplevel.drvPath的 closure-info。vmClosureInfo:vm.drvPath的 closure-info。
closureInfo 和 vmClosureInfo 输出包含关于 build closure 的元数据,包括所有包的列表。保留此副本的副本将防止 nix 垃圾回收你所有的构建。
替代构建器
flake 中存在一个替代构建器(二进制缓存)。
如果 Artemis 还记得,这里应该包含 .#base.vmClosureInfo 中的所有东西,
可以为你节省几个小时。
但请注意,受信任的替代构建器可能会恶意修改输出,因此仅在你信任 Artemis 时才使用它。
提示
- 在快速机器上,为最小配置构建
vmImageRunner可能需要超过 8 小时,因此强烈建议保留vmClosureInfo。不过,仅base.vmClosureInfo就占用超过 30GiB,如果空间不足,你可能希望删除它。 - 在高负载下,某些包检查可能会间歇性失败。如果发生这种情况,你可能希望使用
--max-jobs 4或更低的值进行构建,以便同时竞争 CPU 的包更少。 - 为了查看正在发生的事情,你可能希望使用 nix-output-monitor。对于 flake 命令,你可以将
nix替换为nom来使用它。
贡献
我们很乐意审查任何拉取请求!如果你有任何问题,请在此仓库中打开一个 issue,我们也在该 issue 跟踪器中处理 nix 和 nixpkgs 的问题。
贡献内容应使用 nixfmt 进行格式化。虽然你可以使用 nix fmt,
但那会重新构建整个宇宙。你可能希望改为运行 nix-shell -p nixfmt --run "nixfmt ."。
简而言之
在你的 nixbsd 检出目录中:
# Build the VM and all dependencies, make sure Nix doesn't delete them
# Will likely take several hours
nix build .#base.vmClosureInfo --out-link .gcroots/vm
# Build the VM (actual build happened last step, should only take a few seconds)
nix build .#base.vm
# Run a VM
result/bin/run-nixbsd-base-vm
# login as root:toor or bestie:toor
或者,仅构建并尝试一个 VM 进行玩耍,而不需要本地检出:
nix run 'github:nixos-bsd/nixbsd#extra.vm'
但在接受请求的替代构建器之前,请参见上述关于替代构建器信任的警告。 这会将 VM 状态文件放在当前目录中。