返回

文章详情

裸启动Linux

Hacker News2026年6月15日 16:03

2026-05-19 c / linux 启动一个Linux内核来托管一个单一的进程,而不是一个完整的操作系统……而且在不到一秒的时间内完成!当我还是个孩子时,计算机并没有被宠坏,也不会24/7地运行,当你用完它们时,你会将它们关闭,当你想再次使用它们时,你只需打开它们,差不多一秒钟后,它们就会加载磁盘驱动器中的内容。在2000年代初,刚推出的SSD使得启动变得快速,但一如既往,科技行业拉起了后腿,即便是一个16核的怪兽加上快速的SSD,依旧需要一分钟才能启动。因此,我想尝试一种替代方案。保留Linux内核,但剥离掉我能剥离的其他所有东西。开始吧……好吧,不是完全没东西,但要少得多。更新:遵循长久以来的传统,在试图修复几个细节时,我找到了“从零开始构建一个微型Linux”,这做的基本上与我在这儿做的差不多,但用的是Rust,而且是在一年前,所以那也是值得一看的。你好,世界!Linux系统首先执行一种“init”程序,它加载所有其他进程、配置等。这程序没有什么特别之处,它只是一个常规的可执行文件或脚本,历年来有几种不同的方法。因此我们可以用C语言编写一个新的……这是init.c: #include <stdio.h> #include <stdlib.h> #include <sys/reboot.h> int main(int argc, char **argv) { fprintf(stderr, "Hello from init.c!"); reboot(RB_POWER_OFF); } 它的功能就是打印一条消息,然后重启计算机。如果我们的init进程退出,内核会崩溃,因此我们不再忙等1秒或永远睡眠,而是使用reboot(RB_POWER_OFF)以有序的方式关闭虚拟机。制作initrd现代Linux支持相当复杂的多阶段过程。外面有很多资源,其中许多过时了20年,尽管发生了一些变化,但下面是目前我认为它工作的总结,截止到2026年和Linux 6.8或左右:一个引导加载程序与一个内核和一个称为‘initrd’的虚拟文件系统一起运行。内核尝试将‘initrd’文件解压到‘initramfs’中,这是一个允许初始化工具运行的RAM根文件系统。它查找名为/init的文件(或rdinit=内核参数中指定的文件),如果存在,它会运行这个文件并将控制权交给该进程进行初始化。否则,它会退回到:挂载由root=内核参数指定的根分区;在/dev挂载devtmpfs文件系统;从中运行/init(或init=内核参数中指定的文件)。否则,或者如果init进程退出,内核就会崩溃。大多数现代发行版使用第一条分支:提供一个相当大的initrd文件系统,以便在尝试引导真实文件系统之前加载模块和固件。我的PC启动时使用的initrd文件大小为73MB,根据lsinitramfs显示,它包含2163个文件!有一些关于如何构建文件系统并替换init的示例,但我想更加简单,完全替换整个initrd。如果我们静态编译我们的示例代码,例如:包含它所需的所有库,我们可以制作自己仅含一个文件的initrd:gcc -static init.c -o init echo 'init' | cpio -o --format=newc | gzip -c > initrd关于cpio,cpio是一个非常奇怪而古老的程序,命令行看起来让tar显得友好。不过目前我们不必担心细节。我要提到的是,如果你收到内核消息:Initramfs unpacking failed: no cpio magic……这意味着cpio格式或压缩或者类似的东西与您的内核不兼容。内核将尝试继续,但稍后的错误消息如:check access for rdinit=/init failed: -2, ignoring…意味着要么initramfs没有发生,要么您的二进制文件位置不对(-2是-ENOENT,意为未找到文件)。你也可能会收到关于不兼容架构的消息。这个消息在启动过程中会相当早出现,它会尝试继续,因此你需要仔细回顾。相反,如果你看到:Trying to unpack rootfs image as initramfs……然后没有其他信息,这是一个好兆头。它不会记录成功,直到更晚的时候希望它能说:Run /init as init process。顺便提及,如果您希望将多个文件打包成cpio存档,您要类似于: (cd $SOURCE_DIR; find . | cpio -o -H newc) | gzip -c > $OUTPUT_FILE 关于文件列表的管道听起来可能古怪,但cpio比tar更古老,甚至比shell文件名展开更古老,所以也许我们可以原谅它虚拟化。在真实硬件上运行这个进行实验会涉及烦人的USB Key交换,所以我使用QEMU来创建一个虚拟系统进行实验。QEMU允许您仅通过内核和文件系统映像启动。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡