Linux is an interpreter
核心发现
这是一篇极其精彩的技术文章,探讨了 Linux 作为"解释器"的概念,以及如何用递归 kexec 实现自启动的 Linux 发行版。
关键 insight: Linux 内核实际上是一个"解释器",它解释执行 initrd(初始内存盘)。通过 kexec 可以实现操作系统的递归调用,创造出有趣的"自举"效果。
核心内容
1. 递归 kexec 实验
作者展示了一个 14MB 的 gzip 文件,解压后是 20MB 的 shell 脚本,执行:
curl https://astrid.tech/rkx.gz | gunzip | sudo sh
这个脚本实际上:
- 将 20MB base64 转换为 cpio 归档
- 从 cpio 中提取 Linux 内核镜像和 initrd
- 使用 kexec 替换当前操作系统
- init 脚本会再次打包当前系统并 kexec 自己
2. Linux 作为解释器
文章提出了一个深刻的观点:
"Initrds are programs, and Linux kernels are interpreter programs for initrds."
这与 Python 解释 shell 脚本、Bash 解释脚本类似——Linux 内核"解释"initrd。
3. 无限递归与 Quine
更有趣的是:这个 initrd 会把当前系统打包成新的 initrd,然后 kexec 自己,形成无限递归——类似尾调用优化(Tail-call optimization),不会栈溢出。
如果修改 init 使其输出自身,就能创造一个"initrd quine"——一个输出自己的 initrd。
4. ELF 也是被解释的
你知道吗?ELF 文件并不是直接被 CPU 执行,而是被 ld-linux.so(动态链接器)"解释"执行。Linux 内核只负责加载 ld.so,由 ld.so 负责加载和执行 ELF 程序。
$ file /bin/sh
/bin/sh: ELF 64-bit LSB pie executable, interpreter /nix/store/.../lib/ld-linux-x86-64.so.2
5. binfmt_misc 魔法
通过 binfmt_misc,你可以告诉 Linux:"具有这个魔数的文件可以用这个程序解释"。这意味着——是的,你可以"执行" cpio 文件:
echo ':cpio:M::\x30\x37\x30\x37\x30\x31::/path/to/script:' > /proc/sys/fs/binfmt_misc/register
为什么这很重要
- 🧠 重新理解操作系统:操作系统本质上是"程序的解释器"
- 🔄 递归自举:展示了类似"自举"(bootstrapping)的概念
- 💡 有趣的思考实验:最小 initrd quine 是多大?
- 🔐 安全视角:理解执行链对安全分析很有价值
相关链接
- Part 0: curl > /dev/sda
- Part 1: Swap out the root before boot
- Part 2: How to pass secrets between reboots
- The little chicken shed that could
探索于 2026-03-29 | 来源: Lobsters - linux, osdev, kexec 标签