(つ`ω´)つ says to Ubuntu 台灣社群
curl > /dev/sda:我是如何做出一套能用 wget | dd 直接寫入硬碟的 Linux 發行版 (★ 100 分) 作者示範了一種極端但可行的安裝方式:在 Unix 的「萬物皆檔案」觀念下,像 /dev/sda 這類區塊裝置也能像一般檔案一樣直接寫入,因此可以把透過 curl 或 wget 取得的磁碟映像檔,直接串流到硬碟,重開機後就換成另一套 OS (作業系統)。在多數採用 EFI (Extensible Firmware Interface,統一可延伸韌體介面) 的機器上,甚至不必額外調整開機選項,韌體就會自動找到新的 EFI 系統分割區。作者最初只是想省下在 Contabo 的 VPS (Virtual Private Server,虛擬私人伺服器) 上為預製映像檔另付物件儲存費用,沒想到一路追下去,變成一系列探討 Linux 開機早期機制的實驗。 文章先用 Raspberry Pi 的傳統燒錄流程當例子,說明這種做法其實只是把既有步驟一路簡化:先下載映像檔、再用 dd 寫入 SD 卡,接著可以改成用 curl 或 wget 直接把資料送進 dd,最後甚至連 dd 都省掉,直接把輸出重新導向到磁碟裝置即可。如果映像檔有壓縮,就串上 gunzip;若要跨機器傳送,也能透過 SSH (Secure Shell,安全殼層協定) 一邊傳、一邊解壓、一邊寫盤。至於可開機映像檔本身,可以先在 VM (Virtual Machine,虛擬機器) 裡安裝好任意系統,再取出 raw 磁碟映像檔,或用 QEMU (開源虛擬化模擬器) 建立;作者使用的 NixOS 也能直接自動產生這類映像檔。 真正的難題出在目標磁碟如果正是目前系統的根分割區,系統就無法先解除掛載它,因為作業系統本身還在上面執行。作者實際嘗試把壓縮後的 NixOS 映像檔直接灌到正在使用的 /dev/sda,結果機器寫到 77.8% 就當機,證明「在自己腳下改寫磁碟」雖然不是完全做不到,但風險極高,也很難期待穩定。較實際的辦法,是先開進不會掛載目標磁碟的救援環境,例如 Linux 安裝媒體或主機商提供的 rescue image;作者就是利用 Contabo 的 Debian 系救援系統,成功把 wget 下載到的映像檔直接寫回 /dev/sda。文章最後也把問題再往前推一步:如果把必要工具全部搬進 RAM (Random Access Memory,隨機存取記憶體),是否就能不靠第二套系統,在原地安全地改寫開機碟。 討論區補上了不少重要但容易被忽略的技術限制。有人指出,Linux 核心其實有 CONFIG_BLK_DEV_WRITE_MOUNTED 這個設定,可禁止對已掛載的區塊裝置直接寫入;也有人提醒,就算先把檔案系統改成唯讀,核心仍可能把快取中的資料回刷到磁碟,讓新舊映像互相污染,因此更穩妥的路線,是進入 initramfs / initrd (開機早期使用的暫存根檔案系統),或用 kexec (直接載入下一個 Linux 核心而不經完整韌體重新啟動) 切到極簡環境後再寫盤。其他留言則提到 rd.break、SysRq 緊急唯讀重掛、pivot_root、先把 LVM (Logical Volume Manager,邏輯磁碟區管理員) 搬進 RAM、或乾脆 netboot 等替代方式;也有人抱怨許多 VPS 供應商不願提供上傳 ISO (光碟映像檔) 或直接改寫開機碟的正式管道,才讓這種「邪門但有效」的技巧特別有吸引力。另有讀者提醒,若 QEMU 建出的映像檔與實體磁碟的磁區大小不同,GPT (GUID Partition Table,全域唯一識別碼分割表) 的對齊也可能出問題。整體來看,大家一方面很欣賞作者把系統安裝流程壓縮到近乎荒謬的工程美感,另一方面也一致認為,這種方法只有在充分理解開機流程、快取行為與磁碟結構時,才值得拿到真機上嘗試。 👥 42 則討論、評論 💬 https://news.ycombinator.com/item?id=47500522