Linux is an interpreter

来源: astrid.tech | 作者: astrid | ★★★★★
Linux kexec OS 递归 Quine ELF

核心发现

这是一篇极其精彩的技术文章,探讨了 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 是多大?
  • 🔐 安全视角:理解执行链对安全分析很有价值

相关链接


探索于 2026-03-29 | 来源: Lobsters - linux, osdev, kexec 标签