引导裸Linux

2026-06-15 1 阅读 abnercoimbre
Boot Naked Linux 2026-05-19 c / linux 启动一个 Linux 内核来托管一个进程,而不是一个完整的操作系统......并且在不到一秒的时间内完成!当我还是个孩子的时候,计算机并没有被宠坏,而是24/7运行,当你用完它们时,你把它们关掉,当你再次需要它们时,你只需打开它们,在一秒钟左右的时间内,它们就会加载磁盘驱动器中的任何内容。在 2000 年代初期,有一个短暂的时刻,新推出的 SSD 使启动速度变得更快,但科技行业一如既往地填补了这个空白,直到即使是配备快速 SSD 的 16 核怪物也需要一分钟才能站稳脚跟。所以我想尝试另一种选择。保留 Linux 内核,但删除我能删除的所有其他内容。这里是……嗯,不完全是这里什么都没有,但这里少了很多。更新:按照悠久的传统,在尝试修复一些细节时,我发现“从头开始构建一个小型 Linux”,它完成了我在这里所做的大部分工作,但在一年前的 Rust 中,所以这也值得一看。你好世界! Linux 系统做的第一件事就是运行某种“init”程序,该程序加载所有其他进程、配置等。这个程序没有什么特别之处,它只是一个常规的可执行文件或脚本,无论如何,多年来已经采取了一些不同的方法。所以我们可以用 C 语言编写一个新的...这是 init.c : #include #include #include int main(int argc, char **argv) { fprintf(stderr, "Hello from init.c!"); }重新启动(RB_POWER_OFF);它所做的只是打印一条消息,然后重新启动计算机。如果我们的 init 进程退出内核恐慌,那么我们不会忙着等待 1 或永远休眠或其他什么,而是使用 restart(RB_POWER_OFF) 以有序的方式关闭虚拟机。现代Linux支持相当复杂的多阶段进程。那里有很多资源,其中很多已经过时了 20 年,并且已经发生了变化,但这里是我认为它现在如何工作的总结,截至 2026 年和 Linux 6.8 或附近:引导加载程序使用内核和名为“initrd”的虚拟文件系统运行。内核尝试将“initrd”文件解压到“initramfs”中,这是 RAM 中的根文件系统,允许运行初始化工具。它查找名为 /init 的文件(或 rdinit= 内核参数中指定的任何文件)(如果存在),运行该文件,然后该进程接管初始化。否则,它会回退到:挂载 root= 内核参数指定的根分区,挂载 /dev 处的 devtmpfs 文件系统,运行 /init(或 init= 内核参数中指定的任何内容)。否则,或者如果 init 进程退出,它会发生内核恐慌。大多数现代发行版使用第一个分支:提供相当大的 initrd 文件系统,以便可以在尝试引导实际文件系统之前加载模块和固件。我的 PC 启动的 initrd 文件大小为 73MB,根据 lsintramfs,它包含 2163 个文件!有几个示例说明如何构建一个文件系统来替换 init ,但我想更简单地替换整个 initrd 。如果我们静态编译示例代码,例如:包含它需要的所有库,我们可以制作自己的 initrd,其中只有一个文件: gcc -static init.c -o init echo 'init' | cpio -o --format=newc | cpio -o --format=newc | gzip -c > initrd 关于 cpio cpio 是一个非常奇怪且古老的程序,带有命令行,这使得 tar 看起来用户友好。但现在我们先不用担心细节。我会注意到,稍后,如果您收到内核消息:Initramfs unpacking failed: no cpio magic …这意味着 cpio 格式或压缩或类似的内容与您的内核不兼容。内核将尝试继续,但稍后出现错误消息,例如:检查 rdinit=/init 的访问失败:-2,忽略...意味着 initramfs 没有发生,或者您的二进制文件位于错误的位置(-2 是 -ENOENT,这意味着未找到文件)。您可能还会收到有关不兼容架构的消息。此消息出现在启动过程的早期,无论如何都会尝试继续,因此您必须仔细查看。然而,如果您看到:尝试将 rootfs 映像解包为 initramfs... ...然后没有其他内容,这是一个好兆头。它永远不会记录它是否成功,直到很久以后它才希望说: Run /init as init process 顺便说一句,如果您希望将许多文件打包到 cpio 存档中,您需要类似以下内容: (cd $SOURCE_DIR; find . | cpio -o -H newc) | gzip -c > $OUTPUT_FILE 在文件列表中进行管道传输的整个过程可能看起来很反常,但 cpio 比 tar 更旧,比 shell 文件名通配更旧,所以也许我们可以原谅它虚拟化在真实硬件上实现这一点将涉及大量的 USB 密钥交换,所以我使用 QEMU 来制作一个虚拟系统来进行实验。 QEMU 允许您仅从内核和文件系统启动