未來已經到來,或直接在瀏覽器中編碼

我會告訴你發生在我身上的一個有趣的情況,以及如何成為一個著名專案的貢獻者。

不久前我正在琢磨一個想法:直接從 UEFI 啟動 Linux...
這個想法並不新鮮,有很多關於這個主題的手冊。 你可以看到其中之一 這裡

事實上,我長期以來嘗試解決這個問題的結果是完全形式化的 決定。 這個解決方案非常有效,我在我的一些家用機器上使用它。 更詳細地描述了該解決方案。 這裡.

UEFI-Boot的本質是ESP(EFI System Partition)分區與/boot目錄結合在一起。 那些。 所有核心和開機映像 (initrd) 都位於同一分割區,UEFI 可以從該分割區啟動可執行文件,特別是啟動系統開機載入程式。 但許多發行版中的 Linux 核心本身已經使用 UEFISTUB 選項進行了組裝,該選項允許核心本身從 UEFI 啟動。

該解決方案有一個不愉快的時刻 - ESP 分割區被格式化為 FAT32,無法在其上建立硬連結(系統在更新 initrd 時定期建立硬連結)。 這並沒有什麼特別犯罪的地方,但是在更新核心元件時看到系統警告並不是很令人愉快...

還有另一種方法。

除了引導程式/Linux 核心之外,UEFI 開機管理器(與您需要註冊作業系統引導程式的管理器相同)還可以載入驅動程式。 因此,您可以載入 /boot 所在檔案系統的驅動程序,並使用 UEFI 直接從那裡載入核心。 當然,驅動程式需要放置在ESP分區中。 這大致上就是 GRUB 之類的開機載入程式所做的事情。 但亮點在於,所有常用的 GRUB 功能都已經在 UEFI 中了。 更準確地說是在它的下載管理器中。 更無聊的是,UEFI 啟動管理器在某些方面甚至具有更多功能。

這似乎是一個美麗的解決方案,但有一個“但是”(或者更確切地說,確實如此,但稍後​​會詳細介紹)。 事實上,UEFI 驅動系統非常簡單。 不存在掛載檔案系統或將驅動程式與特定裝置關聯之類的事情。 有一個傳統名稱為 Map 的系統調用,它依次獲取每個驅動程式並嘗試將其與所有(至少是合適的)設備關聯起來。 如果驅動程式能夠取得設備,則會建立對應 - 連線記錄。 這正是新載入的驅動程式與所有其他驅動程式在公共堆中初始化的方式。 您只需將驅動程式引導記錄中的一位 (LOAD_OPTION_FORCE_RECONNECT) 設為 1,UEFI 將在載入後執行此全域重新對應。

但這並不那麼容易做到。 標準 efibootmgr 實用程式(用於設定 UEFI 卸載管理器)不知道如何(或更確切地說,不知道如何)設定此位元。 我必須透過一個相當複雜和危險的過程手動安裝它。

再次嘗試用手做,我無法忍受並正式化 GitHub 上的問題 要求開發者添加此功能。

幾天過去了,卻沒有人理會我的請求。 出於好奇,我查看了原始程式碼......我分叉了它,並在我的膝蓋上想出瞭如何添加此功能......「在我的膝蓋上」因為我沒有安裝類似的東西並編輯了原始程式碼直接在瀏覽器中編碼。

我對C(程式語言)了解非常膚淺,但我勾畫出了一個近似的解決方案(主要是複製貼上)......然後我想- 至少我可能有很多錯誤(我過去嘗試編輯別人的) C 程式碼大約第 10 次完成)我將發出 Pull 請求。 出色地 設計的.

Travis CI 被附加到檢查拉取請求。 他認真地告訴我所有的錯誤。 好吧,如果存在已知錯誤,則無需修復它:再次在瀏覽器中修復,並且在第四次嘗試時程式碼有效(對我來說是一項成就)。

就像這樣,在不離開瀏覽器的情況下,我將一個非常真實的 Pull 請求格式化為實用程序,該實用程式幾乎在所有現代 Linux 發行版中都使用。

令我驚訝的是,在沒有真正了解語言的情況下,沒有設定任何東西(依賴項需要相當多的函式庫來進行彙編),甚至沒有運行編譯器,我只是在瀏覽器中。

然而,自19年2019月XNUMX日以來,我的請求一直沒有得到回應,我已經開始忘記這件事了。

但昨天這個請求被加入了 master 中。

那我的故事是關於什麼的呢? 他談論的事實是,在現代技術的框架內,事實證明,真正的程式碼已經可以在瀏覽器中編寫,而無需在本地部署任何開發工具和依賴項。

此外,我必須承認,這已經是我對知名(至少在狹窄的圈子裡)實用程式的第二次拉取請求。 上次,我要求更正 SyncThing Web 介面中某些欄位的顯示,結果導致我在完全不了解的環境中進行了一行編輯。

只有註冊用戶才能參與調查。 登入, 請。

我該多寫還是不寫?

  • 是的

  • 不值得

294 位用戶投票。 138 名用戶棄權。

來源: www.habr.com

添加評論