【為什麼我們要挑選這篇文章】在 20 年前,USB 隨身碟還不興盛的年代,人們通常使用磁片存取資料。然而磁片的容量僅 1.44 MB,真的是非常小,很多檔案都存不進去。近期,有波蘭工程師將現代的 Linux 存入磁片,並且成功在電腦上運作。他是怎麼做到的?(責任編輯:郭家宏)

本文經 AI 新媒體量子位(公眾號 ID:QbitAI)授權轉載,轉載請連繫出處
作者:量子位

用磁片啟動 Linux 系統曾經很「家常便飯」,當然那都是 1990 – 2000 年代的事了。

有年紀的同學可能熟悉。

但現在,即使你還有一張能用的 3.5 英吋磁片,可 1.44 MB 的容量遠遠裝不下一個現代 Linux 內核,更不用說還得加上所有支持軟體了。

但奇人有招,波蘭一位遊戲開發小哥,只用一張磁片就把現代 Linux 作業系統嵌進去了!

碟上還有幾百 KiB 的剩餘空間!而且用的都是最新「組件」,包括今年 5/16 才發佈的 5.13.0-rc2 版本的 Linux 內核。

5 個步驟,在一張磁片裝下現代 Linux 系統

小哥把這個系統命名為 Floppinux,在它的官網上帶大家走了整個過程,包括從下拉(pull down)、編譯原代碼到建立最終的磁碟映像的所有命令。

而之所以做這麼一件事情,是因為小哥覺得自己用了好多年 Linux,也用過很多 Live-CD(能夠在不安裝到硬碟的前提下,體驗 Linux 作業系統的東西)。

但他對其背後的基本原理知之甚少,所以決定動手研究一下。

小哥的第一個目標是運行 Nomad Diskmag 程式。

Diskmag 這個遠古東西不知道有人了解嗎?它的全名叫 disk magazine,也就是磁碟雜誌,是一種在上世紀 80 – 90 年代,以磁片形式發行的電子雜誌。90 年代後就被網路出版物所取代了。

小哥已經用 bash 腳本搞定了前端界面,就差封面、目錄和 cat 每個文件的正文了。

為了運行他寫的腳本,需要一個可用的 Linux 發行版,也就是一個可以在磁片上運行的系統。

動手!

因為在 64 位元系統上編譯 32 位元程式碼有點棘手。為了更簡單,小哥用他的 32 位元 CPU 的舊筆電來做這一切。

可以使用 32 位元系統的 VirtualBox,如果要用 64 位元,添加命令「ARCH=x86」,例如:make ARCH=x86 tinyconfig。

下面就是把現代 Linux 作業系統裝進一張 1.44 MB 磁片的大概過程:

1. 建立併進入你想要保存文件的目錄

2. 配置和構建定製內核

使用最新 Linux 內核(版本 5.13.0-rc2):

git clone –depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

進行最小配置:make tinyconfig

添加額外配置:make menuconfig

從菜單中選擇以下選項:

將設置保存並退出,等待編譯完成,最後內核將在 arch/x86/boot/bzImage 中建構,把它移到主目錄。

3. 添加工具

如果沒有工具,內核只會啟動,無法執行任何操作。小哥使用 BusyBox(最流行的輕量級工具之一),下載並解壓:

wget https://busybox.net/downloads/busybox-1.33.1.tar.bz2

進入目錄,進行啟動配置:make allnoconfig

然後選擇你想要的工具:make menuconfig

每個菜單項都顯示各工具需占用多少 KB,合理選擇哦。

小哥的選擇:

保存配置並退出,編譯完成後 _install 目錄下會建立一個包含所有文件的文件系統,把它移到主目錄。

4. 添加目錄結構

有了內核和基本工具,仍然需要一些額外的目錄結構:

cd ../filesystem
mkdir -pv {dev,proc,etc/init.d,sys,tmp}
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3

接下來建立幾個配置文件,啟動後顯示歡迎消息:

cat >> welcome << EOF
Some welcome text…
EOF

然後配置處理啟動、退出和重啟的 Inittab 文件&實際的初始化腳本,並使初始化腳本可執行,並將所有文件的所有者設置為 root。(限於篇幅命令已省略,具體可查看連結

最後,將此目錄壓縮為一個文件。

可透過從主目錄運行 QEMU(在 GNU/Linux 平台上廣泛使用的模擬處理器)對以上所有內容進行測試。

5. 下面就是把這一切放進磁片了

建立指向內核和文件系統的 Syslinux 引導文件(boot file):

cat >> syslinux.cfg << EOF
DEFAULT linux
LABEL linux
SAY [ BOOTING FLOPPINUX VERSION 0.1.0 ]
KERNEL bzImage
APPEND initrd=rootfs.cpio.gz
EOF

chmod +x syslinux.cfg

建立空磁片映像:

dd if=/dev/zero of=floppinux.img bs=1k count=1440
mkdosfs floppinux.img
syslinux –install floppinux.img

Mount it! 並將 syslinux、內核和文件系統複製到磁片映像:

sudo mount -o loop floppinux.img /mnt
sudo cp bzImage /mnt
sudo cp rootfs.cpio.gz /mnt
sudo cp syslinux.cfg /mnt
sudo umount /mnt

完成!

現在你就有了自己的發行版映像 floppinux.img,你可以存到磁片,然後在真正的硬體上啟動它了!

啟動僅需 1 分多鐘,而且磁片空間還有剩

小哥花了不到 3 分鐘存取成功,然後開始了首次啟動。

影片傳送門

成功!大概只花了 1 分多鐘。

啊,從螢幕上看了小哥似乎不年輕,頭髮也禿得讓人落淚。

小哥(老哥)表示,在這種裸機的現代硬體上,唯一能阻止啟動速度的就是軟驅的實際速度。它們最大原始速度為 125 KB/s。實際上可能會更慢。

下面是磁片佔有空間總結,可以看到還剩 272 KiB。

硬體開源項目網站 Hackaday 對小哥的創造進行了報導,並點評道:

當然,為了將最新的 Linux 內核和 BusyBox 建構到大約 1 MB 的空間,必須做出一些讓步,所以 Floppinux 肯定不是任何人所說的日常驅動程式。一旦系統啟動,除了編寫一些 shell 腳本之外,就沒有什麼可做的了。

即使你沒有磁片,也值得跟著他的教學,在 QEMU 中啟動映像,看看如何從零開始正式建構一個 Linux 系統。這事不僅可以用來吹牛,這樣一個最小安裝的所有組件如何組合在一起的知識,對學習嵌入式 Linux 設備也很有用。

而在 Hacker News 論壇上很多人紛紛對小哥豎起大拇指,有人表示,最令他驚訝的就是用最新版的 Linux 內核和 BusyBox。而且這對其他嵌入式系統也很有用。

有人說,92 年的時候我可是需要兩張 5.25 英吋的磁片來運行 Linux!

文中的主角小哥叫 Krzysztof Jankowski,來自波蘭,85 後,是一名專業的遊戲開發者和數位藝術家。

25 年前就開始用 QBASIC 寫程式,喜歡 FOSS、像素畫(pixel art)、樹莓派、遊戲引擎等。

去年,他創辦了自己的公司 Cyfrowy Nomada,與 beffio 簽訂了高級遊戲引擎開發合同。他成為一名專業的遊戲開發商的夢想成為現實。

他和他的夥伴們開發的遊戲「自由坦克」(Tanks of Freedom)不知道有人玩過沒?

GitHub 傳送門

參考連結

Bits》、《Hackaday》、《Hacker News》、《KKJ

(本文經 AI 新媒體量子位 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為〈波兰极客用一张软盘运行Linux系统,用的还是最新内核!〉。首圖來源:GitHub

延伸閱讀

【內附教學】電腦無法升級 Windows 11?神人用樹莓派成功安裝
神人工程師不只用 C 語言建 SQLite 資料庫,現在還用一個檔案寫出網路伺服器
【已開源】神人 DIY 自駕腳踏車!平衡超強,就算靜止也不會倒