根文件系统
Nex 在其启动的 Firecracker 虚拟机中 使用的根文件系统是一个 ext4(64位文件系统)块设备。简单来说,它基本上就是一个代表整个文件系统的单个文件。
截至 2024 年 4 月,Nex CLI 已具备构建根文件系统(一个 .ext4 文件)的功能。要构建根文件系统,请运行以下命令:
└─❯ nex rootfs --help
usage: nex rootfs [<flags>]
Build custom rootfs
Flags:
--script=script.sh Additional boot script ran during initialization
--image="synadia/nex-rootfs:alpine" Base image for rootfs build
--agent=../path/to/nex-agent Path to agent binary
--size=157286400 Size of rootfs filesystem
您至少需要包含 --agent 标志。
请注意,您需要确保根文件系统足够大,以容纳稍后通过 nex run 运行的任何二进制文件。默认大小为 150MB,这通常足以支持约 20MB 的二进制文件。
从编程到脚本化,有无数种方式可以填充一个 ext4 文件系统。尽管我们当前的 CI 管道更多是基于编程的方式,但基本原理仍然适用。
构建根文件系统的步骤如下:
创建一个给定大小的空 rootfs.ext4 文件,并填充空块。
使用 mkfs.ext4 工具将该块设备转换为一个 ext4 文件系统。
一个意外但非常有用的小技巧是,我们可以使用 Docker 来完成第 3 步。我们可以将块设备挂载为一个文件夹,然后将该文件夹映射到 Docker 镜像内的某个文件夹。如果我们在 Docker 镜像内运行设置脚本,然后卸载文件系统,那么我们的 rootfs.ext4 文件就会成为 Docker 镜像完成时的状态快照。
以下是一个示例脚本,实现了上述功能:
这里我们使用公共的 alpine Docker 镜像来运行一个脚本 setup-alpine.sh,该脚本会修改文件系统以构建我们需要的内容。请注意,我们实际上将 openrc-service.sh 脚本挂载到了 /etc/init.d/agent。这有效地将该文件复制到新的根文件系统中,从而设置好我们的 OpenRC 服务。
让我们看看 setup-alpine.sh 可能是什么样子:
此脚本首先向基础的 alpine 镜像中添加了 openrc 和 util-linux,然后使用 rc-update 添加 agent 脚本到启动阶段。
目前,我们结合代码和脚本自动构建经过验证的根文件系统,可以通过 nex preflight 命令自动下载。