ITADN
nixos-bsd/nixbsd
nixos-bsd/nixbsd · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

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 副本启动,因此激活将运行,你可以编辑文件
  • closureInfotoplevel.drvPath 的 closure-info。
  • vmClosureInfovm.drvPath 的 closure-info。

closureInfovmClosureInfo 输出包含关于 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 状态文件放在当前目录中。