DragonOS/docs/userland/rootfs/diskgen.md

35 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 从软件包到RootFS镜像
定义完软件包后,无需做更多修改,直接 `nix run .#rootfs-${target}` 即可构建 RootFS。
## 生成 Docker 镜像
我们利用 `pkgs.dockerTools.buildImage` 的展平和拷贝属性,将 `user/apps` 下的软件包,以及 `user/sysconfig`
中的配置文件复制到单层 overlayfs 中Docker原理`buildImage` 的终产物是一个可以被 `docker import` 的一个
`tar.gz`。见 `rootfs-tar.nix`
```{literalinclude} ../../../user/rootfs-tar.nix
:language: nix
```
## 解压 Docker tar 并生成文件系统镜像
原理:解压 docker 镜像,拿出第一层中的 `layer.tar`,然后使用 `guestfish` 导入到虚拟镜像文件中。见 `user/default.nix`
```{literalinclude} ../../../user/default.nix
:language: shell
:lines: 23-112
```
## nix script 的背后
生成 Docker 镜像时Docker Image 是作为二进制产物缓存在 /nix/store 中的,因此多次构建可能会快速占用硬盘。
hint: 要想释放磁盘空间,执行 `nix store gc`
但第二步:解压 Docker tar 到文件系统磁盘镜像文件,是以生成一个 shell script 并运行来实现的,生成的 `disk-image-${target}.img` 只会存在一个在 `bin` 目录下;同时从 `.tar.gz` 中解压出来的 `rootfs.tar` 也会存在于 `bin` 目录下,你可以自己解压看看里面都存了些啥。
TODO: 后续脚本允许分两步进行,中间允许注入自定义文件(除了直接在 sysconfig 中注入外)
如果你想看看这个脚本长什么样,你可以在项目根目录执行 `nix build .#rootfs-${target} -o bin/result` 。 nix 会把 script 对应的 derivation 链接到 result 目录下,只需 `cat bin/result/bin/build-rootfs-image` 就能看到全部命令。