Jump to...
redirecting...

Log for Ubuntu 台灣社群

99
Linux 核心可視為一種直譯器 (★ 174 分)

作者從一個看似危險的 curl 管線指令下手,拆開 rkx.gz 後發現它其實是一個約 20 MB 的 shell script,會先檢查是否具備 root 權限與 kexec、base64、cpio 等工具,再把內嵌的 base64 內容還原成一個 cpio(Unix 常見封存格式)檔案,從中抽出 Linux 核心映像 k,並以 kexec(不經完整韌體與傳統開機流程,直接切換到另一個 Linux 核心的機制)載入它。那個 cpio 檔同時也被當成 initrd(開機初期載入到記憶體中的 RAM 磁碟)使用;解開後可見 /bin/init 與核心檔 k,而 /init 會掛載 /proc、把目前根目錄重新打包成新的 cpio,再用同一個核心與新的 initrd 再次執行 kexec。結果就是一個會反覆把自己重新封裝並接手開機的 Linux 系統。

作者由此提出一個帶有實驗性和哲學意味的主張:initrd / initramfs(開機早期使用的記憶體檔案系統)可以被看成一種程式,而 Linux 核心則像是負責執行它的直譯器。這種遞迴不會像一般函式呼叫那樣層層堆疊,而更像做了尾端呼叫最佳化(tail-call optimization),因為每次都是用新核心取代舊核心,而不是在舊核心之上再包一層。作者還把它拿去對照 Quine(會輸出自身內容的程式):如果把 /init 最後一步改成輸出重新封存出的 cpio,而不是再度 kexec,那它就會吐出自己的內容。由於 initramfs 位於 tmpfs(記憶體型檔案系統)中,作者因此把這種自我複製視為在 RAM 裡對自身程式狀態的重現,而不是傳統磁碟 I/O。

文章後半則一路追問「誰在直譯直譯器」。shell script 靠 shebang,也就是檔頭的 `#!`,交給 /bin/sh 執行,但 /bin/sh 自己其實是 ELF(Executable and Linkable Format,Linux 常見可執行檔格式),其中又會指定動態連結器 ld.so 來載入共享函式庫並啟動程式。作者據此擴大解讀,認為連 ELF 也可看成需要另一層程式來解讀的格式;而 Linux 的 binfmt_misc(可依檔案魔術位元組把格式綁定到特定直譯器的機制)甚至能把原本不能直接執行的 cpio 封存註冊成「可執行檔」,例如交給包了 QEMU(開源虛擬機器模擬器)的腳本,或交給另一個只負責 kexec 的腳本。如此一來,cpio 的直譯器就可以是下一次重開機時的 Linux 核心,而那個核心的最終執行環境又回到實體或虛擬硬體,形成全文想展示的怪異循環。

在 Hacker News 的留言中,整體反應偏向欣賞,許多人把它視為很有駭客精神的技術惡作劇與學習筆記,認為它把平常對 curl 管線執行腳本的警惕、Linux 開機流程與格式載入機制,巧妙揉成一個好玩的觀念實驗。作者也補充,最初確實是從不想付每月 1.5 美元的物件儲存費用出發,但後來更像是順著這個念頭一路深挖 Linux 細節;不少人因此延伸討論到工程成本與自架的現實,認為低預算開發者、個人作者或非營利團隊未必適合直接套用大型雲端平台的成本邏輯,省小錢的 hack 有時反而能逼出更可攜、更能掌握的做法。另一派則提醒,這篇寫法為了論證刻意把概念拉得很寬:嚴格說來,真正被執行的是 cpio 裡的 /init,而不是封存檔本身;initramfs 也不等同一般檔案系統。也有人進一步強調,真正逐條執行機器指令的仍是 CPU 與硬體,因此把作業系統全面稱為直譯器,比較像是富啟發性的隱喻,而不是精確定義。

👥 36 則討論、評論 💬
https://news.ycombinator.com/item?id=47556359
[photo](media:AgACAgUAAx0CPRn5XQABAkwNaciwqzVUp-kMl-wwck8UnckBNW0AAn0PaxurzEBWvnHJelYf8NEBAAMCAANzAAM6BA@telegram)
[photo](media:AgACAgUAAx0CPRn5XQABAkwPaciyItOHGZDTjXT5a91slq6I4XQAAnwPaxurzEBWqShFlOhwV64BAAMCAANzAAM6BA@telegram)
想翻身的‍来‍‌‌
已於天瓏上架寄售
社群朋友出的,歡迎大家多多捧場