Linux From Scratch (LFS) 及其後代代表一種新方法,向用戶揭示 Linux 操作系統是如何工作的。LFS 基於這樣的假設,即一部分一部分地編譯完整的操作系統不僅能夠揭示操作系統是如何工作的,也允許獨立的操作人員為速度、內存占用或安全性而構建系統。
許多作家已經編寫了有關 UNIX? 風格的書籍,深入研究了調度、內存管理、多進程和線程、文件系統,以及用戶與內核之間的交互。寫作 Linux 書籍的作家相對於 UNIX 作家來說有一個優勢:盡管團體發生了劇變,但是 Linux 內核不可能分成幾個相互競爭的分支,由於 GNU Public License (GPL)、集中式研究實驗室 Open Source Development Lab (OSDL) 和 Linus Torvalds 不可動搖的地位,使得 Linux 有幸成為一個緩慢移動的目標(slow-moving target)。
為什麼 UNIX 內核很重要
除了某些方面具有一定的相似性之外,不同的 Unix 內核並不怎麼相同。各種 UNIX 風格也具有一個 Linux 所缺少的優點:所有 UNIX 風格都被假定是完全的操作系統。Linux 通常被描述為“只是一個內核”(如果有這樣的定義的話,也是一個武斷的定義),它給出公共功能和實現的核心,不管內核是運行在不太強大的 Pentium? II 機器上還是 Symmetric Multiprocessing (SMP) 系統上,這些公共功能和實現都不會發生本質上的改變。為了更加簡化,有人可能會說,離 Linux 內核越遠,就會發現更多的變化,而 UNIX 系統則趨向於是各種 UNIX/POSIX 標准的離散實現。
事情並沒有這麼簡單。檢測 Linux 內核和系統級代碼可能是一件很費時間的事情,並且在現實世界中會限制使用。LFS 項目旨在解決 Linux 上有限的系統級可理解性問題。關於內核需要大量的庫和工具來讓 Linux 系統執行最基本的任務這一事實,已經做過討論了,但是如果一個比較熟練的用戶具有一個 slim-line Linux 發行版,他不想下載幾吉字節不讓他優化系統、也不讓他拋開所有這些麻煩且不必要的工具的二進制代碼,那該怎麼辦?如果一個非常熟練的用戶拒絕接受各種社團發行版的 苛刻條件(diktat),而想要運行一個來自 CD 的 Linux/Apache/mysql/PHP (LAMP) 類型的應用程序堆棧,那該怎麼辦?LFS 可以解決這些問題。
Linux From Scratch
LFS 項目顯然建立於那些對於構成基本的 Linux 系統來說充分而不必要的源文件的基礎之上。它已經超越了 Linux 內核和設備驅動程序,因為要產生一個可工作的 Linux 系統,您必須添加一個完整的編譯器工具鏈、許多 Linux 匯編程序實用工具、glibc 系統庫、系統配置工具和連接到 userland shell 訪問的工具。LFS 建立在這樣一個假設的基礎之上,即 Linux 或 UNIX 允許具有一些腳本編寫知識的用戶,了解一個完全有用的系統的工作方式,而不用深入研究內核代碼本身。
為了了解 Linux 系統的工作方式,LFS 的創建者們確定,通過遵循模塊依賴性來編譯系統,可能是了解一般操作系統和特定的 Linux 的機制最自然的方式。用戶掌握了編譯過程之後,就可以開始消除依賴性樹的那些連接到與支持操作系統基本目的無關的系統組件的部件。例如,在編譯完成之後,消除編譯器工具鏈本身是可行的。在沒有全套的命令行實用工具時,可以湊合使用嵌入式 LAMP 堆棧。配置實用工具也可以被丟棄,大多數用戶可以湊合著用一個而不是太多 Linux 將會支持的文件系統。
Linux 部件
LFS 系統的一個重要部件是,可以作為 tar ball 得到的大量源文件。文檔是另一個重要部件,並且是最重要的。實際上,很有可能利用一個最新的 LFS 書籍文件並創建一個 LFS 發行版,因為 LFS 書籍中詳細描述了每個下載位置和每個源文件及其依賴性的特征。用於從內核到編譯器到 shell 編譯每組源文件的過程都是已經寫好了的,如果可能,您也可以在描述具有不同特征的系統的 LFS 書籍中找到替代的例程。LFS 系統的另一個不太可能出現在一般用戶工具箱中的部件是,在基本 LFS 系統組合在一起之後引導系統所需的引導腳本。
現在對 LFS 發行版的最大警告是:勇敢的發行版構建者所需的是一個可工作的 Linux 發行版,包括一個完整的編譯器工具鏈和一套文件系統創建實用工具。自然,所有基於源代碼的 Linux 發行版都需要使用各個發行版都完全不同的特定編譯器版本來引導。LFS 不是該領域的惟一系統,但它是惟一允許您直接處理單個源文件的系統。大多數其他基於源代碼的 Linux 系統,比如 Sourcemage 和 MyGeOS,提供一個完整的下載,建議用戶使用。LFS 不作這樣的假設,並且鼓勵拆開 LFS 框架。
預先假設起作用的 Linux 發行版已安裝在非外來的(nonexotic)硬件上,即使 LFS 可能沒有配置工具和腳本那麼受關注。要編譯 LFS,您需要准備一個分區和一個文件系統,還需要編譯一個編譯器和系統庫。如果用手工完成的話,這是一個相當傷腦筋的過程,但是也的確可以增加您在處理其余安裝方面的自信。整個系統的編譯要花一小時到四天的時間,具體時間取決於底層硬件的年代和您的命令行技術熟練程度。
作一個相當大的假設,如果您願意很大程度上保留書籍安裝,並使對 LFS 書籍中提議的安裝的更改保持最小,您也可以使用自動化的安裝例程來安裝基於 LFS 的發行版。安裝例程沒有在 LFS 書籍中給出,但是可以在名稱 Automated Linux from Scratch (ALFS) 之下作為基於 XML 的發行版得到。活動安裝可以作為基於 C 的腳本得到,該腳本使用 ncurses 來模擬圖形安裝。該安裝也叫做 nALFS 並給出一個極為靈活的包安裝框架。工作需要一個起作用的 Linux 系統,並帶有可以工作的 C 編譯器和 XML 解析器。一個可以工作的 LFS 系統就足夠了。
Automated Linux From Scratch
ALFS 的目的是超越 LFS 本身。LFS 自己指導基於 Linux 的操作系統的內部工作,但是它不具有單個圖形用戶界面 (GUI)。 LFS 既不允許連接到網絡,也不允許連接到 Internet。ALFS 可以簡化系統的擴展,例如,通過添加支持 Internet 訪問的庫,或者通過安裝圖形桌面所需的 X 庫。
超越 LFS
LFS 的創建者們認識到了對其他各種基於源代碼的 Linux 系統的需求。為了這些想要超越 LFS 並添加 X Window System、 GNOME 和網絡支持的人,創建了另一個 LFS 派生物:Beyond Linux From Scratch (BLFS)。第三版 LFS 書籍(讓我們不會忘記是在談論書籍而非發行版),形成一個以一個角為基礎的三角形:對於自動化編譯和完全的基於源代碼的 Linux 發行版,基本的 LFS 版本是基礎。BLFS 將基本的 Linux 系統轉化成一個完全的用戶廣泛接受的 Linux 系統。AFLS 簡化基於源代碼的 Linux 安裝的安裝和擴展。整個基於源代碼的系統的編譯是由一個腳本指導的,您在針對運行腳本的硬件調整腳本之後,就可以讓腳本自己運行了。在您(或安裝工程師)確定需要運行哪些包,也即特定的辦公應用程序套件之後,您就可以容易地擴展安裝順序了。ALFS 也遲早會派上用場,因為它適用於從源代碼進行網絡范圍的安裝。
Hardened LFS
LFS 家族的最後一個成員解決基於源代碼的 Linux 的一個特別重要的方面:安全性。對於不想依賴於所選的 Linux 發行版服務器交付的補丁的那些人,安全性的普通方法是,針對所選的核心庫和應用程序跟蹤安全報告。對於 LFS 實現人員來說,問題有些不同:盡管不是不可能,但是也難以審計 Linux 內核代碼,也許還包括集中於基於 Linux 的操作系統的內部機能的很多庫和實用工具。
代碼審計相當費時,並且只有當補丁服務器是由專門人員集中維護的時,添加大量補丁才是明智的。但是可以取代一些為反映安全問題的新方法而重新編寫過的庫。一個好的例子是,通過從一個適當大的隨機數池中隨機分配數字,使得猜測進程標識符極為困難。OpenBSD 項目最先采用了該方法,隨後,各種 UNIX 風格和 Linux 發行版都采用了該方法。
一個相當新的項目叫做 Hardened Linux From Scratch (HLFS),在 Linux 下采用了這一安全方法。該項目假設相當正規地掌握了 LFS 和 BLFS 的一些部件,並使用了不會成為大多數 Linux 系統中的標准的幾個實用工具和庫。
添加到 HLFS 中的最重要的部件可能是 Stack-Smashing Protector (SSP),通過使用 gcc 指令可以啟用該功能。SSP 開發來防御 stack-smashing 攻擊,這類攻擊屬於影響 Linux 系統的一類最常見的安全威脅。其他安全措施包括一流的隨機數生成器和位置獨立的可執行程序的編譯,其中通常轉化成靜態鏈接對象代碼的可執行代碼作為共享庫出現,而位置獨立的可執行庫通過將地址隨機化可以隱藏這些地址。當然,可從 HLFS Web 站點得到大量補丁,並可查看其源代碼。
日益壯大的 LFS 家族
在許多方面,Linux 版本的 LFS 家族是一個方法,給予黑客以構造基於 Linux 的操作系統的能力。但是對於 LFS 的創建者們來說,最重要的結果似乎是:通過 LFS,所有 Linux 發行版對於所涉及的用戶都成了智能的了。通過允許用戶一部分一部分地構建 Linux 發行版,並幫助用戶將一個基於 Linux 的操作系統看作一個由許多部件組成的系統,還可以用另外的方法構建 Linux 發行版。
更一般來說,用戶要更改構建 Linux 發行版的方式,不必要是程序員:只要從構建 LFS 系統學到的一點腳本編寫能力就足夠了。LFS 專家可以改變和擴展 Linux 發行版的完美組合,而不會影響它的基本結構。對於有人員和專家維護 Linux 系統,但沒有資金從咨詢機構和公司購買商業支持的機構來說,該功能特別重要。已經針對教學目的和大型網絡,演示了基於 LFS 的 Linux 系統。它們也有可能用於其他領域。