Skip to content

[RFC] 使用 nix + guestfish 替代 DADK 用户程序构建 #1503

@Samuka007

Description

@Samuka007

{89DF584B-12D2-4481-85E4-901BF0F159F7}.png

实现:

  • 非特权下镜像构建
  • 声明式的“发行版”构建
  • 脚本内置实例化符号链接,代价是镜像大小来到 3.3G(可选)
  • 对于需要改造的用户态软件,直接使用nix构建上下文进行修改,无需自己另开仓库、另写脚本
  • 使用基于nix dockerTools的镜像构建方案,目录结构可维护性强
  • 构建系统不再局限于 ubuntu

目前本方案的缺点:

  • 重复构建时,如果实时修改用户态程序且多次构建,由于每次导入都会对整个rootfs构建一次镜像,容易快速消耗存储空间,需要定期执行 nix store gc (有改进方案)

{EFEBE73B-2527-48CB-9661-1EB53E096539}.png

  • 由于同样的空间占用考虑,build-rootfs和start的产物为打包后经过链接的脚本(而非直接产物),执行脚本在同样的 bin 目录下生成 rootfs 镜像。(一般直接 nix run .#build-rootfs.x86_64nix run .#start.x86_64 即可)

用法:

  • checkout
git checkout build/nix-qemu
  • 安装nix并启用flake功能
  • 还是需要使用 Makefile 来构建 kernel

如果你没有配置 Rust 环境,可以先使用nix的 Rust 环境:

nix develop ./tools/nix-dev-shell

然后做一些dirty的修复,因为非rustup安装的cargo不支持 +version 的语法

grep -rlZ '+nightly-2025-08-10' ./build-scripts | xargs -0 sed -i 's/+nightly-2025-08-10//g'
grep -rlZ '+nightly-2025-08-10' ./kernel | xargs -0 sed -i 's/+nightly-2025-08-10//g'
sed -i 's/CCPREFIX=x86_64-linux-gnu-/CCPREFIX=/g' kernel/env.mk

最后就可以照常地

make kernel
  • 构建rootfs

构建kernel的同时你也可以另开一个终端构建rootfs

nix run .#build-rootfs.x86_64
  • 运行系统 (依赖ubuntu qemu) 不再依赖ubuntu
nix run .#start.x86_64
  • 如果磁盘占用很多,可以执行gc命令,回收 rootfs 构建时产生的镜像依赖
nix store gc

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions