版權©1999 - 2017傑拉德現場php
版權©1999 - 2017,傑拉德現場css
保留全部權利。html
這本書是許可下Creative Commons許可.前端
計算機指令可能會從書中提取的麻省理工學院的許可.node
LinuxLinus Torvalds®是一個註冊商標。python
個人學習之旅,更好地理解Linux開始在10年前,早在1998年。我第一次剛剛安裝的Linux發行版,並迅速成爲對整個概念和哲學背後的Linux。linux
總有許多方法來完成一個任務。一樣能夠適用於Linux發行版。許多已經存在多年。一些仍然存在,有些人變成別的東西,但別人一直屬於咱們的記憶。他們都作不一樣的事情來知足他們的目標受衆的需求。由於不少不一樣的方式來完成一樣的最終目標存在,我開始意識到我再也不受限於任何一個實現。發現Linux以前,咱們只是忍受問題在其餘操做系統當你別無選擇。這是它是什麼,無論你喜歡仍是不喜歡。對於Linux,選擇的概念開始出現。若是你不喜歡什麼東西,你是自由的,甚至鼓勵改變它。ios
我試着大量的分佈,不能決定任何一個。他們是偉大的系統自己。這不是對與錯的問題了。��已經成爲我的品味的問題。全部可用的選擇,很明顯這不是一個單一的系統,對我來講是完美的。因此我開始建立本身的Linux系統,徹底符合個人我的喜愛。c++
真正讓它本身的系統,我決心從源代碼編譯全部的代碼,而不是使用預編譯二進制包。這 「完美的」Linux系統將各類系統的優點沒有他們的弱點。起初,他們的想法是至關艱鉅的。我仍然致力於這樣一個系統能夠創建。git
後整理等問題循環依賴和編譯時錯誤,我終於創建了一個定製的Linux系統。全面運做,徹底可用像任何其餘的Linux系統。但這是我本身的創造。這是很是使人滿意的本身這樣的一個系統。惟一會被更好地建立每一個本身的軟件。這是下一個最好的事情。
我分享個人目標與其餘Linux社區的成員和經驗,很明顯,這些想法有持續的興趣。它迅速成爲純這樣的定製Linux系統服務不只知足用戶特定需求,但也做爲一個理想的學習機會爲程序員和系統管理員來加強他們的(現有)Linux技能。擴大的利益, Linux從頭開始項目誕生了。
這本書從頭Linux的中央核心項目。它提供了必要的背景和指令爲您設計和構建本身的系統。雖然這本書提供了一個模板,將致使一個正確的工做系統,您能夠自由改變指令來知足本身,這在某種程度上,這個項目的一個重要組成部分。你仍然控制;咱們伸出援助之手讓你開始你本身的旅程。
我衷心但願你能有一個偉大的時間從頭開始本身的Linux系統上工做,享受有一個系統的不少好處,真的是你本身的。
- - -
傑拉德現場
傑拉德在linuxfromscratch D0T org
緣由有不少你想要讀這本書。不少人提出的一個問題, 「爲何要經過手動的全部麻煩從頭構建一個Linux系統,當你能夠下載並安裝一個現有的嗎?」
這個項目存在的一個重要緣由是幫助你學習Linux系統是如何工做的。構建LFS系統幫助演示Linux的不一樣之處,以及如何一塊兒工做,彼此依賴。的最好的一件事情,這學習經驗能夠提供Linux系統是可以定製以知足您的獨特需求。
LFS的另外一個主要好處是,它可讓你有更多的控制系統不依賴別人的Linux實現。LFS,你坐在駕駛座上,決定系統的方方面面。
LFS容許您建立很是緊湊的Linux系統。安裝普通發行版時,您經常被迫安裝不少項目可能從未使用或理解。這些項目浪費資源。你可能會爭辯說,今天的硬盤和cpu,這些資源再也不是考慮。可是,有時候你還受制於規模考慮若是沒有其餘。考慮可引導cd、u盤、嵌入式系統。這些地區LFS能夠是有益的。
一個自定義構建的Linux系統的另外一個優勢是安全。經過從源代碼編譯整個系統,您有權審計一切都和應用所需的安全補丁。再也不須要等待別人來編譯二進制包,修復安全漏洞。除非你檢查補丁並實現它你本身,你沒有保證新的二進制包是創建正確和充分修復這個問題。
Linux從頭開始的目標是創建一個完整的和可用的基礎水平系統。若是你不但願從頭開始構建本身的Linux系統,您可能沒有徹底受益於這本書的信息。
有太多其餘好的理由來構建本身的LFS系統在這裏所有列出來。最後,教育是迄今爲止最強大的緣由。當你繼續在LFS的經驗,你會發現真正信息和知識的能力。
LFS的主要目標架構是AMD /英特爾x86(32位)和x86_64(64位)的cpu。另外一方面,這本書的指令也工做,一些修改,PC和手臂的cpu。創建一個系統,利用其中一個cpu,主要的先決條件,除了那些在接下來的幾頁,是現有的Linux系統,如早期LFS安裝,Ubuntu,Red Hat / Fedora,SuSE,或其餘目標的分佈體系結構。還要注意,一個32位的分佈能夠安裝和使用做爲一個主機系統在64位AMD /英特爾電腦。
其餘一些關於64位系統須要添加。一個32位的系統相比,可執行程序的大小略大,執行速度略快。例如,在一個測試構建的lfs - 6.5 Core2Duo基於CPU的系統,測量數據以下:
Architecture Build Time Build Size 32-bit 198.5 minutes 648 MB 64-bit 190.6 minutes 709 MB
正如你所看到的,64位構建只��4%更快,比32位構建大9%。得到的64位系統是相對最小。固然,若是你有超過4 gb的RAM或想操做數據,超過4 gb,64位系統的優勢是顯著的。
默認的64位從LFS構建結果被認爲是一個「純」64位系統。也就是說,它只支持64位的可執行文件。創建一個「multi-lib」系統須要許多應用程序編譯兩次,一次爲一個32位的系統,一次爲一個64位的系統。這不是在LFS直接支持,由於它會干擾的教育目標提供所需的指令簡單基本的Linux系統。你能夠參考跨Linux從頭開始項目高級主題。
LFS的結構儘量遵循Linux標準。的主要標準是:
LSB有四個獨立的標準:核心,桌面,運行時語言和成像。除了通用的需求也有架構具體要求。還有兩個區域試驗使用:Gtk3和圖形。LFS嘗試符合架構在前一節中討論。
許多人不一樣意LSB的要求。定義它的主要目的是確保專有軟件可以兼容的系統上安裝並正常運行。LFS是基於源以來,用戶徹底控制哪些包是理想的,許多人選擇不安裝一些指定的LSB的包。
建立一個完整的LFS系統可以經過LSB認證考試是可能的,但不是沒有許多其餘包超出了LFS的範圍。BLFS這些額外的包已經安裝說明。並
LSB的核心: |
Bash,公元前,Binutils Coreutils、你要文件,Findutils,呆呆的,Grep,Gzip、M4,Man-DB,Ncurses,Procps,Psmisc,Sed,影子,焦油,Util-linux Zlib |
LSB桌面: |
沒有一個 |
LSB運行時語言: |
Perl |
LSB成像: |
沒有一個 |
LSB Gtk3和LSB圖形(試驗用): |
沒有一個 |
LSB的核心: |
,批處理(部分),Cpio,艾德,Fcrontab,Initd-tools,Lsb_release,NSPR,NSS,PAM,羅馬帝國,Sendmail(或後綴或進出口),時間 |
LSB桌面: |
Alsa,ATK公司,開羅,Desktop-file-utils,Freetype Fontconfig,Gdk-pixbuf,Glib2,GTK + 2,Icon-naming-utils,Libjpeg-turbo,Libpng,Libtiff,Libxml2,MesaLib,Pango,Qt4 Xdg-utils,Xorg |
LSB運行時語言: |
Python,Libxml2,Libxslt |
LSB成像: |
杯子,Cups-filters,內容、理智 |
LSB Gtk3和LSB圖形(試驗用): |
GTK + 3 |
如前所述,LFS的目標是創建一個完整的和可用的基礎水平系統。這包括全部包須要複製自身,同時提供一個相對最小的基地來定製一個更完整的系統基於用戶的選擇。這並不意味着LFS系統是最小的可能。包括幾個重要的包,不嚴格要求。下面的列表文檔書中的每一個包的理由。
Acl
這個包包含公用事業管理訪問控制列表,用於定義更細粒度的可自由支配的文件和目錄的訪問權限。
Attr
這個包包含項目管理文件系統對象的擴展屬性。
Autoconf
這個包包含項目生產shell腳本能夠自動配置源代碼從開發人員的模板。一般須要重建一個包後更新到構建過程。
Automake
這個包包含從模板生成使文件的程序。一般須要重建一個包後更新到構建過程。
Bash
這個包知足LSB核心要求系統提供一個Bourne Shell的接口。它選擇在其餘shell包由於它的一些常見的使用和普遍的功能超出了基本的外殼函數。
公元前
這個包提供了一種高精度數字處理語言。它知足要求須要在構建Linux內核。
Binutils
這個包包含一個連接,一個彙編程序,和其餘工具來處理對象文件。這個包的程序是最須要編譯LFS系統的包。
野牛
這個包包含的GNU版本yacc(另外一個編譯器編譯器)須要構建其餘幾個LFS項目。
Bzip2
這個包包含壓縮和解壓文件的程序。它是許多LFS包須要減壓。
檢查
這個包包含其餘項目的測試工具。這只是臨時安裝的工具鏈。
Coreutils
這個包包含許多基本程序用於查看和操做文件和目錄。這些程序須要命令行文件管理,和是必要的在LFS每一個包的安裝過程。
DejaGNU
這個包包含測試其餘程序的一個框架。這只是臨時安裝的工具鏈。
你要
這個包包含程序顯示文件或目錄之間的差別。這些程序能夠用來建立補丁,還用於許多包的構建過程。
E2fsprogs
這個包包含實用程序處理ext二、ext3和ext4文件系統。這些是最多見的和全面測試Linux支持的文件系統。
Eudev
這個包是一個設備管理器。它動態地控制/ dev目錄中的條目從系統設備被添加或刪除。
外籍人士
這個包包含一個相對較小的XML解析庫。這是所需的XML::解析器Perl模塊。
預計
這個包包含一個程序執行腳本對話與其餘互動節目。它一般用於測試其餘包。這只是臨時安裝的工具鏈。
文件
這個包包含一個實用工具來肯定一個給定的文件或文件的類型。幾包須要構建。
Findutils
這個包包含程序找到文件在文件系統中。它是用於許多包的構建腳本。
Flex
這個包包含一個實用工具生成的程序文本的識別模式。這是GNU版本的lex(詞法分析器)計劃。它須要創建幾個LFS包。
靦腆的人
這個包包含操縱文本文件的程序。這是awk的GNU版本(Aho-Weinberg-Kernighan)。它是用在許多其餘包的構建腳本。
海灣合做委員會
這個包是Gnu Compiler Collection。它包含了C和c++編譯器以及其餘一些不是由LFS。
同時
這個包包含GNU庫數據庫管理器。它被另外一個LFS包,Man-DB。
Gettext
這個包包含公用事業和圖書館國際化和本地化的不少包。
Glibc
這個包包含主要的C庫。沒有它Linux程序不會運行。
GMP
這個包包含數學庫,爲高精度計算提供有用的功能。應構建Gcc。
Gperf
這個包包含一個程序,生成一個完美哈希函數從一個關鍵組。Eudev所需。
Grep
這個包包含搜索文件的程序。使用這些項目大多數軟件包的構建腳本。
Groff
這個包包含用於處理程序和格式文本。這些項目的一個重要功能是格式手冊頁。
GRUB
這個包是大統一引導加載程序。這是幾個可用的引導加載程序之一,可是是最靈活的。
Gzip
這個包包含壓縮和解壓文件的程序。它須要解壓許多包在LFS和超越。
Iana-etc
這個包提供了網絡服務和協議數據。它須要使適當的網絡功能。
Inetutils
這個包包含基本的網絡管理的程序。
Intltool
這個包包含用於從源文件中提取可翻譯字符串的工具。
IProute2
這個包包含項目基本和先進的IPv4和IPv6網絡。這是選擇在其餘常見網絡工具包(net-tools)IPv6的能力。
Kbd
這個包包含密鑰表文件,爲非美國鍵盤鍵盤實用程序,控制檯的字體。
Kmod
這個包包含程序須要管理Linux內核模塊。
少
這個包包含一個很是好的文本文件查看器,容許向上或向下滾動當瀏覽一個文件。也被Man-DB查看手冊。
Libcap
這個包實現了用戶空間接口的POSIX 1003.1 e Linux內核中可用的功能。
Libpipeline
Libpipeline包包含一個庫操做管道子流程的靈活和方便的方式。這是Man-DB所需的包。
Libtool
這個包包含GNU通用庫支持腳本。它包裝在一致的使用共享庫的複雜性,便攜式接口。這是在其餘LFS包所需的測試套件。
Linux內核
這個包是操做系統。它是Linux在GNU / Linux環境中。
M4
這個包包含一個通用文本宏處理器有用的做爲其餘程序的構建工具。
使
這個包包含一個程序爲指導建設包。LFS所需的幾乎每個包中。
Man-DB
這個包包含項目尋找和查看手冊頁。這是選擇,而不是 男人包因爲卓越的國際化能力。它提供程序的人。
手冊頁
這個包包含了基本的Linux手冊頁的實際內容。
貨幣政策委員會
這個包包含複數的運算的功能。應由Gcc。
MPFR
這個包包含多個精密運算的功能。應由Gcc。
Ncurses
這個包包含庫terminal-independent處理字符的屏幕。它常被用來提供光標控制菜單系統。須要LFS的包數量。
補丁
這個包包含一個程序修改或建立文件的應用 補丁一般文件建立的 diff程序。它是構建過程所需的幾個LFS包。
Perl
這個包是一個PERL解釋器運行時語言。它須要幾個LFS的安裝和測試套件包。
Pkg-config
這個包提供了一個程序來返回關於一個安裝庫的元數據或包。
Procps-NG
這個包包含項目監控過程。這些程序是用於系統管理,也使用的LFS Bootscripts。
Psmisc
這個包包含程序顯示正在運行的進程的信息。這些項目是有用的系統管理。
Readline
這個包是一組庫提供了命令行編輯和歷史功能。它使用Bash。
Sed
這個包容許在文本編輯器中編輯文本而不打開它。它也須要大多數LFS包的配置腳本。
影子
這個包包含項目以安全的方式來處理密碼。
Sysklogd
這個包包含項目日誌系統消息,例如那些由內核或守護進程在不尋常的事件發生。
Sysvinit
這個包提供了 初始化程序,它是全部其餘進程的父在Linux系統上。
焦油
這個包提供了存檔和提取功能用於LFS幾乎全部的包。
Tcl
這個包包含工具命令語言中使用的許多測試套件LFS包。這只是臨時安裝的工具鏈。
Texinfo
這個包包含程序閱讀,寫做,和轉換信息頁面。它是用於許多LFS的安裝程序包。
Util-linux
這個包包含各類各樣的實用程序。其中包括實用程序來處理文件系統、控制檯、分區,和消息。
Vim
這個包包含一個編輯器。之因此選擇它,是由於它的兼容性與經典的vi編輯器及其大量的強大的功能。一個編輯器是一個很是私人的選擇對於許多用戶和任何其餘編輯器能夠代替若是須要。
XML::解析器
這個包是一個Perl模塊,接口與外籍人士。
XZ跑龍套
這個包包含壓縮和解壓文件的程序。它提供了最高的壓縮和解壓包在XZ有用或LZMA格式。
Zlib
這個包包含一些程序所使用的壓縮和解壓縮的例程。
構建LFS系統不是一個簡單的任務。它須要必定程度的現有知識的Unix系統管理以解決問題和正確執行命令列出。特別是,做爲一個絕對最低,您應該已經有能力使用命令行(殼)複製或移動文件和目錄,目錄和文件內容列表,改變當前目錄。也但願你有一個合理的使用和安裝Linux軟件的知識。
由於假定的LFS書籍 至少這個基本的水平,各類LFS支持論壇不太可能在這些領域可以給你提供了不少幫助。你會發現你的問題關於這些基本的知識可能會置之不理,或者你只是提到了LFS必要的課前閱讀列表。
在構建LFS系統以前,咱們推薦閱讀如下:
Software-Building-HOWTOhttp://www.tldp.org/HOWTO/Software-Building-HOWTO.html
這是一個全面的構建和安裝指南 「通用的」在Linux下Unix軟件包。雖然是前一段時間,它還提供了一個很好的總結所需的基本技術構建和安裝軟件。
初學者指南從源代碼安裝http://moi.vonos.net/linux/beginners-installing-from-source/
本指南提供了一個很好的總結所需的基本技能和技巧從源代碼構建軟件。
使事情更容易,有一些排版約定使用這本書。本節包含了一些排版格式的例子在Linux從頭開始。
./configure --prefix=/usr
這種形式的文本是設計類型同樣除非另有指出在周圍的文本。它也被運用於解釋部分提到的是識別的命令。
在某些狀況下,一個邏輯行是擴展到兩個或多個物理行最後一個反斜槓。
CC="gcc -B/usr/bin/" ../binutils-2.18/configure \ --prefix=/tools --disable-nls --disable-werror
注意,反斜槓必須當即返回。等其餘空格字符空格或製表符會產生不正確的結果。
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
這種形式的文本(寬度固定的文本)顯示屏幕輸出,一般做爲命令的結果。這種格式還用於顯示文件名,例如 /etc/ld.so.conf
.
強調
這種形式的文本是用於多個目的。其主要目的是爲了強調重要的點或物品。
http://www.linuxfromscratch.org/
這種格式用於超連接在LFS社區和外部頁面。它包括howto、下載位置,和網站。
cat > $LFS/etc/group << "EOF" EOFroot:x:0: bin:x:1: ......
使用這種格式在建立配置文件。第一個命令告訴系統建立該文件 $LFS/etc/group
從任何類型的第二行到文件結束(EOF)序列。所以,整個部分是通常類型的觀察。
<REPLACED TEXT>
這種格式是用來封裝文本不能輸入或複製和粘貼操做。
[OPTIONAL TEXT]
這種格式是用來封裝的文本是可選的。
passwd(5)
這種格式是指一個特定的手冊(人)頁面。圓括號裏面的數字代表一個特定部分手冊內。例如, passwd有兩個手冊頁。每LFS安裝說明,這兩個男人將位於頁面/usr/share/man/man1/passwd.1
和 /usr/share/man/man5/passwd.5
。當這本書使用 passwd(5)
它是專門指 /usr/share/man/man5/passwd.5
. 人密碼將打印第一個頁面發現匹配嗎 「passwd」,這將 /usr/share/man/man1/passwd.1
。對於這個示例,您將須要運行 男人5 passwd爲了讀取特定頁面被稱爲。應該注意的是,大多數人頁面沒有重複的頁面名稱在不一樣的部分。所以,男人 <program name>
一般是足夠的。
這本書分爲如下部分。
第一部分解釋了一些重要的筆記如何推動LFS安裝。這一節還提供關於這本書的元信息。
第二部分描述瞭如何準備建設的進程制定一個分區,下載包,和編譯臨時工具。
第三部分引導讀者經過LFS system-compiling的建築和安裝的全部包,設置啓動腳本和安裝內核。生成的Linux系統的基礎其餘軟件能夠構建擴展所需的系統。在這本書的最後,有一個易於使用的參考清單的全部程序、庫和重要的文件已經安裝。
用於建立一個LFS系統的軟件是不斷更新和提升。安全警告和錯誤修復可能成爲可用的LFS書籍後被釋放。檢查是否這個版本的包版本或指令LFS須要任何修改來適應安全漏洞或其餘bug修復,請訪問http://www.linuxfromscratch.org/lfs/errata/8.1/在繼續以前與您的構建。你應該注意任何變化如圖所示,將它們應用於這本書的相關部門推動構建LFS系統。
LFS系統將由使用一個已經安裝了Linux發行版(好比Debian,OpenMandriva Fedora,或openSUSE)。這個現有的Linux系統(主機)將被用做一個起點提供必要的程序,包括編譯器、連接器,和殼牌,創建新的系統。選擇 「發展」選擇分佈安裝期間可以訪問這些工具。
做爲替代安裝一個單獨分配到您的機器上,您可能但願使用一個LiveCD從商業分佈。
第二章這本書描述瞭如何建立一個新的本地Linux分區和文件系統。這是新的LFS系統的地方將被編譯和安裝。第三章解釋了哪些包和補丁須要下載到構建LFS系統以及如何存儲它們在新的文件系統。第四章論述了設置一個合適的工做環境。請閱讀第四章當心,由於它解釋了幾個重要的問題須要注意在開始工做以前第五章甚至更遠。
第五章解釋了安裝的包的數量將造成基本的開發套件(或工具鏈),用於構建實際系統第六章。這些包是須要解決循環依賴的例子,編譯一個編譯器,您須要一個編譯器。
第五章也向你展現瞭如何構建一個工具鏈的第一遍,包括Binutils和GCC(第一遍基本上意味着這兩個核心包將從新安裝)。下一步是構建Glibc,C庫。Glibc將編譯工具鏈項目建在第一遍。而後,第二個經過工具鏈的創建。這一次,對新建的工具鏈將動態連接Glibc。剩下的第五章包是使用第二個經過工具鏈。在這樣作時,LFS安裝過程將再也不依賴於宿主分佈,除了正在運行的內核。
這一努力隔離新系統從主機分佈彷佛有些過度了。一個完整的技術解釋爲何這樣作是在提供5.2節,「工具鏈技術筆記」.
在第六章,創建了完整的LFS系統。的 chroot(改變根)計劃是用來輸入虛擬環境和啓動一個新的shell的LFS分區根目錄將被設置。這很是相似於重啓和指示內核掛載LFS分區做爲根分區。系統並不會重啓,而是使用 chroot由於建立一個可啓動的系統須要額外的工做,這是沒有必要的。主要的優勢是 「chroot」容許你繼續使用主機系統而LFS正在建造中。在等待包編譯完成,你能夠繼續使用你的電腦是正常的。
完成安裝,基本系統配置設置第七章和內核引導加載程序設置第八章.第九章包含的信息繼續LFS的經驗超出了這本書。在這本書中已經實現的步驟後,計算機將準備重啓進入新LFS系統。
這是簡而言之過程。詳細���息在如下章節討論每個步驟和包的描述。將澄清項看起來複雜,那麼一切將會層次分明當你着手LFS冒險。
下面列出的包更新自書的先前版本。
升級到:
Automake 1.15.1
公元前1.07.1
Binutils 2.29
Coreutils 8.27
你要3.6
Eudev 3.2.2
E2fsprogs 1.43.5
Expat-2.2.3
文件5.31
2.6.4 Flex
GCC 7.2.0
同時1.13
Glibc 2.26
gperf - 3.1
Grep 3.1
GRUB 2.02
IPRoute2 4.12.0
Kmod 24
少487
Libpipeline 1.4.2
Linux 4.12.7
手冊頁4.12
Perl 5.26.0
Pkg-config 0.29.2
Psmisc 23.1
影子4.5
Tcl-core-8.6.7
Texinfo 6.4
Tzdata 2017 b
Util-Linux 2.30.1
Vim 8.0.586
補充道:
刪除:
bc - 1.06.95 memory_leak - 1.補丁
這是版本 8.1Linux從零開始的書,2017年9月1日。若是這本書是超過六個月大時,一個新的和更好的版本可能已經可用。爲了找到答案,請檢查鏡子經過之一http://www.linuxfromscratch.org/mirrors.html.
下面是一個列表的更改自先前版本的書。
更新日誌條目:
2017-09-01
[bdubbs]- lfs - 8.1釋放。
2017-08-27
(bdubbs)——從systemd書的util-linux刪除無效的選擇。
2017-08-24
(dj)——除去GlibC rpcgen指數。
(ken)——修復acl的testsuite perl - 5.26。
2017-08-16
(bdubbs)——從glibc刪除不須要的選項。
2017-08-16
(bdubbs)——添加一個注意gmp,顯示瞭如何建立通用的gmp庫。
2017-08-15
2017-08-11
[bdubbs]——tcl-core-8.6.7更新。修復# 4123.
2017-08-08
2017-07-23
2017-07-18
2017-07-13
2017-07-03
[bdubbs]- linux - 4.12更新。
2017-07-02
2017-06-30
[bdubbs]——linux-4.11.8更新。修復# 4099.
2017-06-26
[bdubbs]——修復一個錯誤在mountfs bootscript。
(bdubbs)——你要刪除過期的種子在章節5和6。
2017-06-24
2017-06-21
2017-06-07
[bdubbs]——linux-4.11.4更新。修復# 4093.
2017-06-02
2017-05-25
[renodr]——修復i686系統的構建。包括06 Glibc章修改。
2017-05-19
2017-05-13
(dj)——-isystem介紹使用gcc的最終系統位置的內部頭在Glibc構建。
(ken)——更新一些庫版本再次剝離,部分修復# 4085.
(dj)——添加額外的符號連接,避免「/工具」最終系統中的引用。
2017-05-07
[bdubbs]——flex-2.6.4更新。修復# 4084.
2017-05-05
[bdubbs]-更新人-頁面- 4.11。修復# 4083.
2017-05-03
2017-05-01
[bdubbs]- linux - 4.11更新。修復# 4080.
[bdubbs]——更新flex修補。
2017-04-26
(bdubbs)——添加一個補丁來修復版本2.6.3:flex退化。
[bdubbs]——linux-4.10.13更新。修復# 4079.
2017-04-26
[bdubbs]-更新grub 2.02。修復# 4042.
2017-04-25
2017-04-22
(bdubbs)——添加指令保存調試信息選擇圖書館當剝離第六章的末尾。修復# 4076.
2017-04-11
[bdubbs]——刪除沒必要要的——disable-compile-warnings pkg-config指令。感謝傑弗瑞·史密斯指出這一點。
2017-04-10
2017-04-07
[bdubbs]——在bc - 1.07修復一個錯誤。
2017-04-03
[bdubbs]-更新bc - 1.07。修復# 4071.
2017-03-31
2017-03-28
2017-03-25
(dj)-更新lfs - bootscripts - 20170825。修復一個問題在rc腳本範圍。感謝「quesker」# lfs-support報告和後續測試。
2017-03-18
2017-03-11
(dj)——修復的描述修改 gcc/config/{linux,i386/linux{,64}}.h
在 海灣合做委員會經過1。
2017-03-08
(dj)——在網絡配置更新/ etc / hosts。
2017-03-03
2017-02-28
2017-02-25
[bdubbs]- lfs - 8.0釋放。
若是在構建的LFS系統您遇到任何錯誤,有任何問題,或想在書中有一個錯誤,請先諮詢常見問題(FAQ)位於http://www.linuxfromscratch.org/faq/.
的 linuxfromscratch.org
服務器主機的郵件列表用於LFS的發展項目。這些列表包括的主要開發和支持列表,等等。若是FAQ並不能解決問題,下一步將是搜索郵件列表http://www.linuxfromscratch.org/search.html.
的信息在不一樣的列表,如何訂閱,存檔位置,和額外的信息,請訪問http://www.linuxfromscratch.org/mail.html.
LFS社區的一些成員提供幫助互聯網中繼聊天(IRC)。在使用這種支持以前,請確保你的問題尚未回答的LFS FAQ或者郵件列表檔案。你能夠找到的IRC網絡 irc.freenode.net
。支持通道被命名爲# LFS-support。
LFS項目有不少全球鏡子讓訪問網站並下載所需的包更方便。請訪問LFS的網站http://www.linuxfromscratch.org/mirrors.html列表的當前的鏡子。
若是一個問題或經過這本書工做時遇到問題,請檢查FAQ頁面http://www.linuxfromscratch.org/faq/ generalfaq。問題每每已經回答。若是你的問題沒有回答這個頁面上,試圖找到問題的根源。下面的提示將給你一些指導故障排除:http://www.linuxfromscratch.org/hints/downloads/files/errors.txt.
若是你找不到你的問題中列出的常見問題,搜索郵件列表http://www.linuxfromscratch.org/search.html.
咱們也有一個很棒的LFS社區願意提供幫助經過郵件列表、IRC(參見1.4節,「資源」這本書的部分)。然而,咱們天天獲得幾個支持的問題,他們中的許多人很容易回答FAQ,首先經過搜索郵件列表。因此,爲咱們提供最好的幫助,你須要作一些調查。讓咱們關注更多的不一樣尋常的支持需求。若是你搜索不產生一個解決方案,請包括全部相關信息(下面提到)在你的請求幫助。
除了一個簡短的解釋問題的經驗,最重要的東西,包括在任何請求幫助:
這本書的版本(在本例中使用 8.1 )
主機分佈和用於建立LFS版本
的輸出主機系統需求腳本
包或部分中遇到的問題
準確的錯誤信息或接收症狀
注意你是否已經偏離了這本書
偏離這本書 不意味着咱們將不會幫助你。畢竟,LFS我的偏好。前期對任何變化創建過程幫助咱們評估和肯定你的問題的可能緣由。
若是出現錯誤而運行 配置腳本,檢查 config.log
文件。這個文件可能包含過程當中遇到的錯誤 配置沒有打印到屏幕上。包括 有關若是你須要尋求幫助。
屏幕輸出和各類文件的內容是有用的在決定編譯問題的緣由。屏幕輸出 配置腳本和 使運行是頗有幫助的。沒有必要包括整個輸出,但包括足夠的相關信息。下面是一個例子的信息的類型包括屏幕輸出 使:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\" -DLOCALEDIR=\"/mnt/lfs/usr/share/locale\" -DLIBDIR=\"/mnt/lfs/usr/lib\" -DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I. -g -O2 -c getopt1.c gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o expand.o file.o function.o getopt.o implicit.o job.o main.o misc.o read.o remake.o rule.o signame.o variable.o vpath.o default.o remote-stub.o version.o opt1.o -lutil job.o: In function `load_too_high': /lfs/tmp/make-3.79.1/job.c:1565: undefined reference to `getloadavg' collect2: ld returned 1 exit status make[2]: *** [make] Error 1 make[2]: Leaving directory `/lfs/tmp/make-3.79.1' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/lfs/tmp/make-3.79.1' make: *** [all-recursive-am] Error 2
在這種狀況下,不少人就包括底部:
make [2]: *** [make] Error 1
這不是足夠的信息正確診斷問題,由於它只指出,有錯誤,不是 什麼錯了。整個部分,在上面的示例中,就是應該被保存,由於它包含的命令被執行死刑(s)和相關的錯誤消息。
一篇優秀的文章關於在互聯網網上尋求幫助http://catb.org/ esr /常見問題/ smart-questions.html。閱讀並按照提示在本文檔中增長的可能性得到你須要的幫助。
你的主機系統應該有如下軟件的最低版本。這應該不是一個問題對於大多數現代的Linux發行版。還要注意,許多發行版將軟件標題到單獨的包,一般的形式 「<包名稱>重擊」或 「<包名稱> - dev」。必定要安裝這些若是您的發行版提供。
早期版本的軟件包可能上市工做,可是尚未測試。
bash - 3.2(/ bin / sh應該是一個象徵性的或硬連接的bash)
binutils - 2.17(大於2.29版本不推薦,由於他們沒有測試)
野牛- 2.3(/ usr / bin / yacc應該連接到野牛或小腳本,執行野牛)
Bzip2-1.0.4
coreutils - 6.9
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1(/ usr / bin / awk應該呆呆的連接)
gcc - 4.7包括c++編譯器, g + +(版本大於7.2.0不推薦,由於他們沒有測試)
glibc - 2.11(大於2.26版本不推薦,由於他們沒有測試)
Grep-2.5.1a
Gzip-1.3.12
Linux內核- 3.2
內核版本需求的緣由是,咱們在構建指定版本 glibc在第六章的建議開發人員。udev也須要。
若是主機內核是早於3.2須要內核替換爲最新版本。有兩種方法你能夠去。首先,看看你的Linux內核包供應商提供了一個3.2或更高版本。若是是這樣,您可能但願安裝它。若是你的供應商沒有提供一個可接受的內核包,或者你不肯意安裝它,你能夠本身編譯一個內核。說明編譯內核和配置引導加載程序(假設主機使用GRUB)位於第八章.
M4-1.4.10
讓- 3.81
Patch-2.5.4
Perl-5.8.8
Sed-4.1.5
瀝青- 1.22
texinfo - 4.7
Xz-5.0.0
注意上面提到的符號連接須要構建一個LFS系統使用說明包含在這本書。符號連接指向其餘軟件(如短跑、mawk等)可能會工做,但不支持的測試或LFS開發團隊,而且可能須要偏離的指令或額外的補丁包。
是否你的主機系統全部適當的版本,和編譯程序,運行如下:
cat > version-check.sh << "EOF" EOF bash version-check.sh#!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 MYSH=$(readlink -f /bin/sh) echo "/bin/sh -> $MYSH" echo $MYSH | grep -q bash || echo "ERROR: /bin/sh does not point to bash" unset MYSH echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3- bison --version | head -n1 if [ -h /usr/bin/yacc ]; then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`"; elif [ -x /usr/bin/yacc ]; then echo yacc is `/usr/bin/yacc --version | head -n1` else echo "yacc not found" fi bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6- echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2 diff --version | head -n1 find --version | head -n1 gawk --version | head -n1 if [ -h /usr/bin/awk ]; then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`"; elif [ -x /usr/bin/awk ]; then echo awk is `/usr/bin/awk --version | head -n1` else echo "awk not found" fi gcc --version | head -n1 g++ --version | head -n1 ldd --version | head -n1 | cut -d" " -f2- # glibc version grep --version | head -n1 gzip --version | head -n1 cat /proc/version m4 --version | head -n1 make --version | head -n1 patch --version | head -n1 echo Perl `perl -V:version` sed --version | head -n1 tar --version | head -n1 makeinfo --version | head -n1 xz --version | head -n1 echo 'int main(){}' > dummy.c && g++ -o dummy dummy.c if [ -x dummy ] then echo "g++ compilation OK"; else echo "g++ compilation failed"; fi rm -f dummy.c dummy
LFS設計是創建在一個會話中。也就是說,假設的說明系統的過程當中不會關閉。這並不意味着系統必須一口氣完成。問題是,某些程序必須從新引導以後re-accomplished若是恢復LFS在不一樣的點。
這些章節完成主機系統。從新啓動時,要注意如下幾點:
程序做爲根用戶在2.4節須要LFS環境變量設置 對根用戶.
必須掛載/ mnt / lfs分區。
全部在第五章必須由用戶指令 lfs。一個 蘇- lfs須要作任何任務以前在第5章。
的程序5.3節,「通常編譯指令」是相當重要的。若是有任何疑問的安裝包,確保任何先前擴展包,re-extract包文件,完成全部部分的指令。
必須掛載/ mnt / lfs分區。
當進入chroot,LFS環境變量必須設置爲根。LFS變量沒有使用。
必須掛載虛擬文件系統。能夠進入chroot以前或以後經過改變主機虛擬終端,做爲根用戶運行命令6.2.2節,「安裝和填充/ dev」和6.2.3節」,愈來愈多的虛擬內核文件系統」.
像大多數其餘操做系統,LFS一般是安裝在專用的分區。構建LFS系統推薦的方法是使用一個空的分區或可用,若是你有足夠的空間分區,建立一個。
最小系統須要一個分區的6字節(GB)。這是足以存儲全部源tarball,編譯的包。然而,若是LFS系統的目的是成爲主要的Linux系統,安裝額外的軟件可能會將須要額外的空間。20 GB的分區是一個合理的大小提供了增加。LFS系統自己不會佔用這麼多的房間。這個需求的很大一部分是提供足夠的免費臨時存儲以及LFS完成後添加額外的功能。另外,編譯包須要大量的磁盤空間,能夠包安裝後回收。
由於老是沒有足夠的隨機存取存儲器(RAM)用於編譯過程,這是一個好主意使用小磁盤分區 swap
空間。這是內核所使用的存儲使用的數據,讓更多的內存用於活動進程。的 swap
分區能夠同樣的LFS系統使用的主機系統,在這種狀況下沒有必要建立另外一個。
開始一個磁盤分區程序等 cfdisk或 fdisk用命令行選項命名的硬盤將建立新分區的例子 /dev/sda
主要的集成驅動電路(IDE)磁盤。建立一個Linux native分區和一個 swap
分區,若是必要的。請參考 cfdisk(8)
或 fdisk(8)
若是你還不知道如何使用程序。
對於有經驗的用戶,其餘分區方案是可能的。新的LFS系統能夠在軟件突襲數組或一個LVM邏輯卷。然而,其中的一些選項須要一個initramfs,這是一個高級主題。這些分區方法不建議第一次LFS用戶。
記住這個新分區的名稱(例如, sda5
)。這本書將稱之爲LFS分區。還記得的稱號 swap
分區。這些名字,之後將會須要的 /etc/fstab
文件。
請求的建議系統分區一般貼在LFS郵件列表。這是一個很是主觀的話題。大多數發行版默認是使用整個驅動器除了一個小交換分區。這不是最佳的LFS幾個緣由。它下降了靈活性,使得跨多個分佈共享數據或LFS構建更加困難,使備份更耗費時間,能夠經過低效浪費磁盤空間的分配文件系統結構。
一個根LFS分區(不要混淆 /root
目錄)10 g是一個很好的辦法對於大多數系統。它提供了足夠的空間來構建LFS和BLFS大部分,並但足夠小,這樣能夠很容易地建立多個分區的實驗。
大多數發行版自動建立交換分區。一般推薦的交換分區的大小大約是物理RAM的兩倍,可是這是不多須要。若是磁盤空間是有限的,是2 g的交換分區和監視磁盤交換的數量。
交換歷來都不是好的。一般你能夠告訴若是一個系統是由聽磁盤交換活動和觀察系統反應的命令。交換的第一反應應該是檢查等不合理的命令試圖編輯一個5 g的文件。若是交換成爲一個正常的現象,最好的解決方案是購買更多的RAM爲您的系統。
若是 引導磁盤已經經過GUID來分區的分區表(GPT),而後一個小,一般1 MB,必須建立分區,若是它不存在。這個分區不格式化,但必須用於GRUB安裝期間使用的引導加載程序。該分區將一般被貼上「BIOS引導」若是使用 fdisk或有一個代碼 EF02若是使用 gdisk.
Grub Bios分區必須開車,Bios使用引導系統。這是不必定相同的驅動LFS根分區的位置。系統上的磁盤可能使用不一樣的分區表類型。這個分區的要求只取決於類型的引導磁盤的分區表。
有幾個其餘分區不是必需的,但應該考慮當設計一個磁盤佈局。下面的列表並不全面,可是是做爲一個指南。
/ boot -強烈推薦。使用這個分區存儲內核和其餘引導信息。最小化潛在的更大的磁盤引導問題,讓這個第一個物理分區關於第一個磁盤驅動器。一個分區大小爲100 mb至關充足。
/ home,強烈推薦。分享你的主目錄和用戶定製或LFS構建跨多個分佈。大小一般是至關大的,取決於可用的磁盤空間。
/ usr -若是使用一個單獨的/ usr分區一般是提供一個瘦客戶機或服務器無盤工做站。它一般是不須要LFS。5字節的大小將處理大多數安裝。
/ opt BLFS——這個目錄是最有用,並安裝多個大的包像Gnome或KDE能夠安裝沒有嵌入的文件/ usr的層次結構。若是使用,5到10 g一般是足夠的。
/ tmp -一個單獨的/ tmp目錄是罕見的,但若是配置一個瘦客戶機有用。這個分區,若是使用,一般不須要超過兩個字節。
/usr/src——這個分區是很是有用的BLFS提供一個位置來存儲源文件,並分享他們在LFS構建。它也能夠用做BLFS構建包並位置。30 - 50 gb的至關大的分區容許足夠的空間。
任何你想要的單獨的分區,自動安裝在須要指定的引導 /etc/fstab
。如何指定分區的詳細信息將在討論8.2節,「建立掛載文件」.
如今創建了一個空白分區,能夠建立文件系統。LFS能夠使用任何文件系統認可的Linux內核中,但最多見的類型是ext3和ext4。文件系統的選擇能夠複雜,取決於文件的特色和分區的大小。例如:
適用於小的分區/ boot等極少更新。
是ext2的升級,包括日記幫助恢復分區的狀態的狀況下關閉不潔淨。這是經常使用的做爲一個通用文件系統。
是最新版本的ext文件系統分區類型的家庭。它提供了一些新功能,包括毫微秒時間戳,建立和使用很是大的文件(16 TB),和速度的改進。
其餘文件系統,包括FAT32,NTFS,ReiserFS、XFS JFS,是有用的專業用途。能夠找到更多的信息關於這些文件系統http://en.wikipedia.org/wiki/Comparison_of_file_systems.
LFS假設根文件系統(/)的類型是ext4。建立一個 ext4
LFS分區上的文件系統,運行如下:
mkfs - v - t ext4 /dev/<xxx>
若是您使用的是現有的 swap
分區,不須要格式。若是一個新的 swap
分區被建立時,它須要用這個命令初始化:
mkswap /dev/<yyy>
取代 <yyy>
的名稱 swap
分區。
在本書中,環境變量 LFS
將使用幾回。您應該確保這個變量老是定義整個LFS構建過程。它應該被設置爲目錄的名稱您將構建LFS系統——咱們將使用 /mnt/lfs
做爲一個例子,但選擇是你的目錄。若是您正在構建LFS在一個單獨的分區,將該目錄分區的掛載點。選擇一個目錄位置和設置變量使用下面的命令:
出口LFS =/mnt/lfs
在這個變量設置等,命令是有益的 mkdir - v $ LFS /工具能夠輸入。殼牌將自動替換 「$ LFS」與 「/ mnt / lfs」(或其餘變量設置爲)處理命令行。
不要忘記檢查嗎 LFS
每當你離開和從新設置當前工做環境(如何時作 蘇來 root
或另外一個用戶)。檢查 LFS
變量是設置正確:
echo $LFS
確保輸出顯示了你的LFS系統的構建之路的位置,這是 /mnt/lfs
若是提供的例子是緊隨其後。若是輸出是不正確的,能夠使用前面給出的命令在這個頁面設置$LFS
到正確的目錄名稱。
保證的一種方式 LFS
變量老是設置編輯 .bash_profile
在你我的的主目錄和文件 /root/.bash_profile
和輸入輸出命令。此外,殼中指定 /etc/passwd
文件須要的全部用戶 LFS
bash變量須要確保 /root/.bash_profile
文件註冊登陸過程的一部分。
如今,建立一個文件系統,分區須要訪問。爲了作到這一點,須要安裝在一個分區掛載點。這本書的目的,假設文件系統安裝在指定的目錄下 LFS
環境變量如前一節所述。
建立掛載點並掛載LFS文件系統經過運行:
mkdir pv $ LFS 山- v - t ext4 /dev/$ LFS<xxx>
取代 <xxx>
指定的LFS分區。
若是使用多個分區的LFS(例如,一個用於 /
,另外一個用於 /usr
),安裝使用:
mkdir pv $ LFS 山- v - t ext4 /dev/$ LFS mkdir - v $ LFS / usr 山- v - t ext4 /dev/$ LFS / usr<xxx><yyy>
取代 <xxx>
和 <yyy>
用適當的分區名稱。
確保這個新分區是沒有安裝權限太限制(如 nosuid
或 nodev
選項)。運行 山設置命令沒有任何參數,看看選項安裝LFS的分區。若是 nosuid
和/或 nodev
設置,分區須要從新安裝。
若是您使用的是 swap
分區,確保使用啓用 swapon命令:
/sbin/swapon - v /dev/<zzz>
取代 <zzz>
的名稱 swap
分區。
如今有一個工做場所,是時候下載包。
本章包含包的列表,須要下載爲了構建一個基本的Linux系統。上市版本號對應的軟件版本已知的工做,和這本書是根據他們的使用。咱們強烈建議不要使用新版本,由於一個版本的構建命令不得使用新版本。最新的包版本須要變通的可能也有問題。這些變通方案將開發和穩定的開發版本的書。
下載位置可能並不老是容易。若是下載位置改變了這本書出版後,谷歌http://www.google.com/對於大多數包)提供了一個有用的搜索引擎。若是這個搜索是不成功的,試着下載討論的一個替代手段http://www.linuxfromscratch.org/lfs/packages.html包.
下載包和補丁須要存儲的地方方便地得到整個構建。工做目錄也是須要解壓源和建造它們。 $LFS/sources
既能夠使用存儲包和補丁的地方做爲一個工做目錄。經過使用這個目錄,所需的元素將會位於LFS分區和建築過程的全部階段中可用。
建立這個目錄,執行如下命令,如用戶 root
下載會議開始前:
mkdir -v $LFS/sources
使這個目錄可寫的和粘性。 「黏糊糊的」意味着,即便多個用戶在一個目錄有寫權限,只有一個文件的全部者能夠刪除的目錄中的文件。下面的命令將使編寫和粘性的模式:
chmod -v a+wt $LFS/sources
一個簡單的方法來下載全部的包和補丁是經過使用wget-list做爲一個輸入 wget。例如:
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
此外,從lfs - 7.0開始,有一個單獨的文件,md5sum,能夠用來驗證全部正確的包在繼續以前都是可用的。該文件在 $LFS/sources
並運行:
pushd $LFS/sources md5sum -c md5sums popd
下載或以其餘方式得到如下方案:
下載:http://download.savannah.gnu.org/releases/acl/acl-2.2.52.src.tar.gz
MD5總和: a61415312426e9c2212bd7dc7929abda
主頁:http://savannah.nongnu.org/projects/attr
下載:http://download.savannah.gnu.org/releases/attr/attr-2.4.47.src.tar.gz
MD5總和: 84f58dec00b60f2dc8fd1c9709291cc7
主頁:http://www.gnu.org/software/autoconf/
下載:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz
MD5總和: 50f97f4159805e374639a73e2636f22e
主頁:http://www.gnu.org/software/automake/
下載:http://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.xz
MD5總和: 24cd3501b6ad8cd4d7e2546f07e8b4d4
主頁:http://www.gnu.org/software/bash/
下載:http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz
MD5總和: 148888a7c95ac23705559b6f477dfe25
主頁:http://www.gnu.org/software/bc/
下載:http://ftp.gnu.org/gnu/bc/bc-1.07.1.tar.gz
MD5總和: cda93857418655ea43590736fc3ca9fc
主頁:http://www.gnu.org/software/binutils/
下載:http://ftp.gnu.org/gnu/binutils/binutils-2.29.tar.bz2
MD5總和: 23733a26c8276edbb1168c9bee60e40e
主頁:http://www.gnu.org/software/bison/
下載:http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.xz
MD5總和: c342201de104cc9ce0a21e0ad10d4021
下載:http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
MD5總和: 00b516f4704d4a7cb50a1d97e6e8e15b
主頁:https://libcheck.github.io/check
下載:https://github.com/libcheck/check/releases/download/0.11.0/check-0.11.0.tar.gz
MD5總和: 9b90522b31f5628c2e0f55dda348e558
主頁:http://www.gnu.org/software/coreutils/
下載:http://ftp.gnu.org/gnu/coreutils/coreutils-8.27.tar.xz
MD5總和: 502795792c212932365e077946d353ae
主頁:http://www.gnu.org/software/dejagnu/
下載:http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.tar.gz
MD5總和: 1fdc2eb0d592c4f89d82d24dfdf02f0b
主頁:http://www.gnu.org/software/diffutils/
下載:http://ftp.gnu.org/gnu/diffutils/diffutils-3.6.tar.xz
MD5總和: 07cf286672ced26fba54cd0313bdc071
下載:http://dev.gentoo.org/藍色/ eudev / eudev-3.2.2.tar.gz
MD5總和: 41e19b70462692fefd072a3f38818b6e
主頁:http://e2fsprogs.sourceforge.net/
下載:http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.43.5/e2fsprogs-1.43.5.tar.gz
MD5總和: 40aa1b7d7d6bd9c71db0fbf325a7c199
主頁:http://expat.sourceforge.net/
下載:http://prdownloads.sourceforge.net/expat/expat-2.2.3.tar.bz2
MD5總和: f053af63ef5f39bd9b78d01fbc203334
主頁:http://expect.sourceforge.net/
下載:http://prdownloads.sourceforge.net/expect/expect5.45.tar.gz
MD5總和: 44e1a4f4c877e9ddc5a542dfa7ecc92b
主頁:http://www.darwinsys.com/file/
下載:ftp://ftp.astron.com/pub/file/file-5.31.tar.gz
MD5總和: 319627d20c9658eae85b056115b8c90a
文件(5.31)可能再也不可用在上市地點。偶爾主下載位置的網站管理員刪除舊版本發佈新版本時。另外一個下載位置可能正確的版本也能夠發現:http://www.linuxfromscratch.org/lfs/download.html ftp.
主頁:http://www.gnu.org/software/findutils/
下載:http://ftp.gnu.org/gnu/findutils/findutils-4.6.0.tar.gz
MD5總和: 9936aa8009438ce185bea2694a997fc1
主頁:http://flex.sourceforge.net
下載:https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz
MD5總和: 2882e3179748cc9f9c23ec593d6adc8d
主頁:http://www.gnu.org/software/gawk/
下載:http://ftp.gnu.org/gnu/gawk/gawk-4.1.4.tar.xz
MD5總和: 4e7dbc81163e60fd4f0b52496e7542c9
下載:http://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.xz
MD5總和: ff370482573133a7fcdd96cd2f552292
主頁:http://www.gnu.org/software/gdbm/
下載:http://ftp.gnu.org/gnu/gdbm/gdbm-1.13.tar.gz
MD5總和: 8929dcda2a8de3fd2367bdbf66769376
主頁:http://www.gnu.org/software/gettext/
下載:http://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.xz
MD5總和: df3f5690eaa30fd228537b00cb7b7590
主頁:http://www.gnu.org/software/libc/
下載:http://ftp.gnu.org/gnu/glibc/glibc-2.26.tar.xz
MD5總和: 102f637c3812f81111f48f2427611be1
這個版本的glibc地址的安全問題尚未最新的穩定版本。
主頁:http://www.gnu.org/software/gmp/
下載:http://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz
MD5總和: f58fa8001d60c4c77595fbbb62b63c1d
主頁:http://www.gnu.org/software/gperf/
下載:http://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz
MD5總和: 9e251c0a618ad0824b51117d5d9db87e
主頁:http://www.gnu.org/software/grep/
下載:http://ftp.gnu.org/gnu/grep/grep-3.1.tar.xz
MD5總和: feca7b3e7c7f4aab2b42ecbfc513b070
主頁:http://www.gnu.org/software/groff/
下載:http://ftp.gnu.org/gnu/groff/groff-1.22.3.tar.gz
MD5總和: cc825fa64bc7306a885f2fb2268d3ec5
主頁:http://www.gnu.org/software/grub/
下載:http://ftp.gnu.org/gnu/grub/grub-2.02.tar.xz
MD5總和: 8a4a2a95aac551fb0fba860ceabfa1d3
主頁:http://www.gnu.org/software/gzip/
下載:http://ftp.gnu.org/gnu/gzip/gzip-1.8.tar.xz
MD5總和: f7caabb65cddc1a4165b398009bd05b9
主頁:http://freecode.com/projects/iana-etc
下載:http://anduin.linuxfromscratch.org/LFS/iana-etc-2.30.tar.bz2
MD5總和: 3ba3afb1d1b261383d247f46cb135ee8
主頁:http://www.gnu.org/software/inetutils/
下載:http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.4.tar.xz
MD5總和: 87fef1fa3f603aef11c41dcc097af75e
主頁:http://freedesktop.org/wiki/Software/intltool
下載:http://launchpad.net/intltool/trunk/0.51.0/ +下載/ intltool-0.51.0.tar.gz
MD5總和: 12e517cac2b57a0121cda351570f1e63
主頁:https://www.kernel.org/pub/linux/utils/net/iproute2/
下載:https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.12.0.tar.xz
MD5總和: e6fecdf46a1542a26044e756fbbabe3b
主頁:http://ftp.altlinux.org/pub/people/legion/kbd
下載:https://www.kernel.org/pub/linux/utils/kbd/kbd-2.0.4.tar.xz
MD5總和: c1635a5a83b63aca7f97a3eab39ebaa6
下載:https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod - 24. tar.xz
MD5總和: 08297dfb6f2b3f625f928ca3278528af
主頁:http://www.greenwoodsoftware.com/less/
下載:http://www.greenwoodsoftware.com/less/less - 487. tar.gz
MD5總和: dcc8bf183a83b362d37fe9ef8df1fb60
下載:http://www.linuxfromscratch.org/lfs/downloads/8.1/lfs bootscripts tar.bz2——20170626.
MD5總和: d4992527d67f28e2d0c12e3495422eab
主頁:https://sites.google.com/site/fullycapable/
下載:https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.25.tar.xz
MD5總和: 6666b839e5d46c2ad33fc8aa2ceb5f77
主頁:http://libpipeline.nongnu.org/
下載:http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.4.2.tar.gz
MD5總和: d5c80387eb9c9e5d089da2a06e8a6b12
主頁:http://www.gnu.org/software/libtool/
下載:http://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.xz
MD5總和: 1bfb9b923f2c1339b4d2ce1807064aa5
下載:https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.12.7.tar.xz
MD5總和: 245d1b4dc6e82669aac2c9e6a2dd82fe
Linux內核更新比較頻繁,不少時候因爲發現的安全漏洞。最新4.12。應該使用x內核版本,除非勘誤表頁面說。
速度或昂貴的帶寬有限的用戶誰但願更新Linux內核中,基線版本的包和補丁能夠單獨下載。這可能節省一些時間或成本後續補丁級別升級在一個小版本。
主頁:http://www.gnu.org/software/m4/
下載:http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.xz
MD5總和: 730bb15d96fffe47e148d1e09235af82
主頁:http://www.gnu.org/software/make/
下載:http://ftp.gnu.org/gnu/make/make-4.2.1.tar.bz2
MD5總和: 15b012617e7c44c0ed482721629577ac
主頁:http://www.nongnu.org/man-db/
下載:http://download.savannah.gnu.org/releases/man-db/man-db-2.7.6.1.tar.xz
MD5總和: 2948d49d0ed7265f60f83aa4a9ac9268
主頁:http://www.kernel.org/doc/man-pages/
下載:https://www.kernel.org/pub/linux/docs/man-pages/man-pages-4.12.tar.xz
MD5總和: a87cdf43ddc1844e7edc8950a28a51f0
主頁:http://www.multiprecision.org/
下載:http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz
MD5總和: d6a1d5f8ddea3abd2cc3e98f58352d26
下載:http://www.mpfr.org/mpfr-3.1.5/mpfr-3.1.5.tar.xz
MD5總和: c4ac246cf9795a4491e7766002cd528f
主頁:http://www.gnu.org/software/ncurses/
下載:http://ftp.gnu.org/gnu//ncurses/ncurses-6.0.tar.gz
MD5總和: ee13d052e1ead260d7c28071f46eefb1
主頁:http://savannah.gnu.org/projects/patch/
下載:http://ftp.gnu.org/gnu/patch/patch-2.7.5.tar.xz
MD5總和: e3da7940431633fb65a01b91d3b7a27a
下載:http://www.cpan.org/src/5.0/perl-5.26.0.tar.xz
MD5總和: 8c6995718e4cb62188f0d5e3488cd91f
主頁:http://www.freedesktop.org/wiki/Software/pkg-config
下載:https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz
MD5總和: f6e931e319531b736fadc017f470e68a
主頁:http://sourceforge.net/projects/procps-ng
下載:http://sourceforge.net/projects/procps-ng/files/Production/procps-ng-3.3.12.tar.xz
MD5總和: 957e42e8b193490b2111252e4a2b443c
主頁:http://psmisc.sourceforge.net/
下載:https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.1.tar.xz
MD5總和: bbba1f701c02fb50d59540d1ff90d8d1
主頁:http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
下載:http://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz
MD5總和: 205b03a87fc83dab653b628c59b9fc91
主頁:http://www.gnu.org/software/sed/
下載:http://ftp.gnu.org/gnu/sed/sed-4.4.tar.xz
MD5總和: e0c583d4c380059abd818cd540fe6938
下載:https://github.com/shadow-maint/shadow/releases/download/4.5/shadow-4.5.tar.xz
MD5總和: c350da50c2120de6bb29177699d89fe3
主頁:http://www.infodrom.org/projects/sysklogd/
下載:http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz
MD5總和: c70599ab0d037fde724f7210c2c8d7f8
主頁:http://savannah.nongnu.org/projects/sysvinit
下載:http://download.savannah.gnu.org/releases/sysvinit/sysvinit - 2.88 dsf.tar.bz2
MD5總和: 6eda8a97b86e0a6f59dabbf25202aa6f
主頁:http://www.gnu.org/software/tar/
下載:http://ftp.gnu.org/gnu/tar/tar-1.29.tar.xz
MD5總和: a1802fec550baaeecff6c381629653ef
主頁:http://tcl.sourceforge.net/
下載:http://sourceforge.net/projects/tcl/files/Tcl/8.6.7/tcl-core8.6.7-src.tar.gz
MD5總和: 3f723d62c2e074bdbb2ddf330b5a71e1
主頁:http://www.gnu.org/software/texinfo/
下載:http://ftp.gnu.org/gnu/texinfo/texinfo-6.4.tar.xz
MD5總和: 2a676c8339efe6ddea0f1cb52e626d15
主頁:http://www.iana.org/time-zones
下載:http://www.iana.org/time-zones/repository/releases/tzdata2017b.tar.gz
MD5總和: 50dc0dc50c68644c1f70804f2e7a1625
下載:http://anduin.linuxfromscratch.org/lfs/udev tar.bz2——lfs - 20140408.
MD5總和: c2d6b127f89261513b23b6d458484099
主頁:http://freecode.com/projects/util-linux
下載:https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.1.tar.xz
MD5總和: 5e5ec141e775efe36f640e62f3f8cd0d
下載:ftp://ftp.vim.org/pub/vim/unix/vim-8.0.586.tar.bz2
MD5總和: b35e794140c196ff59b492b56c1e73db
主頁:https://github.com/chorny/XML-Parser
下載:http://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.44.tar.gz
MD5總和: af4813fe3952362451201ced6fbce379
下載:http://tukaani.org/xz/xz-5.2.3.tar.xz
MD5總和: 60fb79cab777e3f71ca43d298adacbd5
下載:http://zlib.net/zlib-1.2.11.tar.xz
MD5總和: 85adef240c5f370b308da8c938951a68
這些包的總大小:大約324 MB
除了包,也須要幾個補丁。這些補丁糾正任何錯誤的包應該固定的維護者。補丁也作一些小的修改,讓包裝更容易處理。如下補丁須要構建一個LFS系統:
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/bash - 4.4 - upstream_fixes 1.補丁
MD5總和: e3d5bf23a4e5628680893d46e6ff286e
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/bzip2 - 1.0.6 install_docs - 1.補丁
MD5總和: 6a5ac7e89b791aae556de0f745916f7f
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/coreutils - 8.27 i18n - 8.27補丁
MD5總和: a9404fb575dfd5514f3c8f4120f9ca7d
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/glibc - 2.26 - fhs - 2.26補丁
MD5總和: 9a5997c3452909b1769918c759eff8a2
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/kbd - 2.0.4退格- 1.補丁
MD5總和: f75cca16a38da6caa7d52151f7136895
下載:http://www.linuxfromscratch.org/patches/lfs/8.1/sysvinit - 2.88 - dsf -鞏固- 1.補丁
MD5總和: 0b7b5ea568a878fdcc4057b2bf36e5cb
這些補丁的總大小:205.3 KB
除了上述須要的補丁,存在許多可選的LFS社區建立的補丁。這些可選補丁解決小問題或使功能在默認狀況下不啓用。隨意瀏覽數據庫位於補丁http://www.linuxfromscratch.org/patches/downloads/並得到任何額外的補丁,以知足系統的須要。
在這一章,咱們將執行一些額外的任務準備建設臨時系統。咱們將建立一個目錄 $LFS
臨時的安裝工具,添加非特權用戶,以減小風險,併爲用戶建立一個適當的構建環境。咱們還將解釋的單位時間咱們用來衡量LFS包須要多長時間,或 「在布」,並給出一些信息包測試套件。
全部程序編譯第五章將安裝在 $LFS/tools
讓他們獨立於程序編譯第六章。這裏是臨時工具和編譯的程序不會是最後的LFS系統的一部分。經過這些項目在一個單獨的目錄中,他們很容易被丟棄後使用。這也能夠防止這些程序結束主機生產目錄(簡單的事故第五章).
建立所需的目錄運行如下 root
:
mkdir -v $LFS/tools
下一步是建立一個 /tools
符號連接在主機系統。這將指向LFS分區上建立的目錄。運行這個命令 root
:
ln -sv $LFS/tools /
上面的命令是正確的。的 ln命令有幾個語法變化,因此必定要檢查 信息coreutils ln和 ln(1)
報告以前你可能認爲是一個錯誤。
建立的符號連接使工具鏈編譯,以便它老是指 /tools
,這意味着編譯器、彙編和連接器將在第五章(當咱們仍使用一些工具從主機)和將來(當咱們 「也能夠」LFS分區)。
當登陸用戶 root
,犯了一個錯誤會損壞或破壞系統。所以,咱們建議以非特權用戶的身份構建包在本章。你能夠使用本身的用戶名,可是,讓它更容易創建一個清潔的工做環境,建立一個新的用戶 lfs
做爲一個新組(也叫 lfs
),用戶在安裝過程當中使用這個。做爲 root
發出如下命令來添加新用戶:
groupadd lfs useradd -s /bin/bash -g lfs -m -k /dev/null lfs
命令行選項的含義:
-s /bin/bash
這使得 bash用戶的默認shell lfs
.
-g lfs
這個選項添加用戶 lfs
組 lfs
.
-m
這將建立一個主目錄 lfs
.
-k /dev/null
這個參數能夠防止可能的複製文件從一個骨架目錄(默認 /etc/skel
)經過改變輸入位置特殊零裝置。
lfs
這是實際的名稱建立的組和用戶。
登陸, lfs
(相對於切換到用戶 lfs
當登陸 root
,不須要 lfs
用戶密碼),給予 lfs
密碼:
passwd lfs
格蘭特 lfs
徹底訪問 $LFS/tools
經過使 lfs
目錄的全部者:
chown -v lfs $LFS/tools
若是建立一個單獨的工做目錄做爲建議,給用戶 lfs
這個目錄的全部權:
chown -v lfs $LFS/sources
接下來,登陸用戶 lfs
。這能夠經過一個虛擬控制檯,經過顯示管理器,或者替代用戶命令以下:
su - lfs
的 「-
」指示 蘇開始登陸shell,而不是non-login殼。之間的區別這兩種殼能夠在細節中找到 bash(1)
和 信息bash.
創建一個良好的工做環境,建立兩個新的啓動文件 bash殼。當登陸用戶 lfs
發出如下命令來建立一個新的 .bash_profile
:
cat > ~/.bash_profile << "EOF" EOFexec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
當登陸用戶 lfs
一般,最初的外殼 登陸殼牌的讀取 /etc/profile
的主機(可能包含一些設置和環境變量) .bash_profile
。的 exec env -我…/ bin / bash命令的 .bash_profile
文件取代了徹底空的殼與一個新的運行環境,除了 HOME
, TERM
, PS1
變量。這將確保不會沒必要要的和潛在危險環境變量從主機系統泄漏到構建環境。這裏使用的技術實現的目標確保一個清潔的環境。
外殼是一個新實例 non-login殼,不讀了 /etc/profile
或 .bash_profile
文件,而是讀取 .bashrc
文件代替。建立 .bashrc
文件:
cat > ~/.bashrc << "EOF" EOFset +h umask 022 LFS=/mnt/lfs LC_ALL=POSIX LFS_TGT=$(uname -m)-lfs-linux-gnu PATH=/tools/bin:/bin:/usr/bin export LFS LC_ALL LFS_TGT PATH
的 組+ h命令關閉 bash哈希函數。哈希——一般是一個有用的特性bash使用一個哈希表來記住可執行文件的完整路徑,避免搜索 PATH
一次又一次地去尋找相同的可執行文件。然而,就應該使用新工具安裝。經過關掉哈希函數,shell將老是搜索 PATH
當一個程序運行。所以,殼牌將發現新編譯的工具 $LFS/tools
可就不記得以前版本的同一程序在不一樣的位置。
設置用戶文件建立掩模(umask)到022年確保新建立的文件和目錄由主人只可寫的,可是任何人均可讀和可執行的(假設所使用的默認模式 open(2)
系統調用,新文件將最終許可模式644和目錄模式755)。
的 LFS
變量應該設置爲所選的掛載點。
的 LC_ALL
變量控制某些項目的本地化,使他們的信息按照指定國家的慣例。設置 LC_ALL
來 「POSIX」或 「C」(這兩個是等價的)確保一切都如預期的那樣在chroot環境中工做。
的 LFS_TGT
變量設置一個非默認,但兼容的機器描述使用在構建交叉編譯器和連接器,當交叉編譯臨時工具鏈。中包含更多的信息5.2節,「工具鏈技術筆記」.
經過將 /tools/bin
以前的標準 PATH
安裝在,全部的項目第五章��殼後當即拿起他們的安裝。結合關掉哈希,這限制了風險,舊程序時從主機使用相同的程序可在第五章環境。
最後,對建築環境的充分準備臨時工具、對象來源的用戶配置文件:
source ~/.bash_profile
不少人想知道事先大約須要多長時間來編譯和安裝每一個包。由於Linux從頭能夠創建在許多不一樣的系統,提供準確的時間估計是不可能的。最大的包(Glibc)須要大約20分鐘最快的系統,可是在慢系統最多可能須要三天!而不是提供實際的時候,將使用標準建設單位(單位)測量。
全局的測量工做以下。第一個包從本書Binutils被編譯第五章。的時間來編譯這個包將被稱爲標準的建設單位或業務單位。全部其餘的編譯時間將表示相對於這一次。
例如,考慮一個包的編譯時間是4.5單位。這意味着,若是一個系統花了10分鐘Binutils編譯和安裝第一個經過,它將 約45分鐘來構建這個示例包中。幸運的是,大多數爲Binutils構建時間短於一個。
通常來講,單位並不徹底準確,由於他們依賴於許多因素,包括主機系統版本的GCC。他們是這裏提供給估計多長時間可能須要安裝一個包,但這些數字能夠隨多達數十分鐘在某些狀況下。
對於許多現代系統與多個處理器(或核)的編譯時間計劃能夠減小執行「平行」設置一個環境變量或者告訴 使計劃有多少處理器可用。例如,一個Core2Duo能夠支持兩個同時發生的過程:
export MAKEFLAGS='-j 2'
或者只是建築:
make -j2
使用多個處理器時,書中的單位單位會有所不一樣甚至比他們一般所作的那樣。在某些狀況下,讓一步就會失敗。分析構建過程的輸出也將更加困難,由於不一樣的過程線���叉。若是你遇到一個問題,構建步驟,回覆到一個處理器構建正確分析錯誤消息。
大多數軟件包提供一個測試套件。運行測試套件的一個新建的包是一個好主意,由於它能夠提供一個 「完整性檢查」代表一切正確編譯。一般一套測試套件,通過檢查證實了包功能開發人員的目的。然而,它並不保證免費包是徹底錯誤的。
一些測試套件是比別人更重要。例如,測試套件的核心工具鏈packages-GCC Binutils,Glibc-are相當重要的因爲其核心做用在正常運轉的系統。GCC和Glibc的測試套件能夠須要很長時間才能完成,特別是在較慢的硬件,但強烈推薦。
經驗代表,幾乎沒有能獲得運行測試套件第五章。不能逃避的事實,主機系統老是施加一些影響測試這一章���內容,經常致使莫名其妙的失敗。由於內置的工具第五章是暫時的,最終丟棄,咱們不推薦運行測試套件第五章對普通讀者。的指令運行這些測試套件提供了測試人員和開發人員的好處,但他們是徹底可選的。
一個常見的問題與運行測試套件Binutils和GCC的僞終端(企業)。這能夠致使大量的測試失敗。這可能有幾個緣由,但最可能的緣由是,主機系統沒有的 devpts
文件系統的正確設置。在更詳細地討論這個問題http://www.linuxfromscratch.org/lfs/faq.html no-ptys.
有時包測試套件會失敗,但開發人員都知道的緣由,認爲非關鍵。查閱日誌位於http://www.linuxfromscratch.org/lfs/build-logs/8.1/來驗證是否預計這些失敗。本網站全部測試在本書中是有效的。
這一章展現瞭如何創建一個最小的Linux系統。這個系統將包含足夠的工具開始構建最終的LFS系統第六章容許的工做環境和更多的用戶方便比最低的環境。
有兩個步驟構建這個最小的系統。第一步是構建一個新的host-independent工具鏈(編譯器、彙編器、鏈接器、圖書館和一些有用的實用程序)。第二步使用這個工具鏈構建其餘必不可少的工具。
文件編譯在本章將被安裝 $LFS/tools
目錄來讓他們分開的文件安裝在下一章和主機生產目錄。自包編譯下面是暫時的,咱們不但願他們污染即將LFS系統。
本節解釋背後的一些原理和技術細節的總體構建方法。它不是必須當即明白這一節中的內容。大部分這些信息後將會更清晰的執行實際的構建。這部分能夠稱爲過程當中在任什麼時候間。
的���體目標第五章是產生一個臨時區域包含一套好的工具,能夠獨立於主機系統。經過使用 chroot,剩下的章節中的命令將包含在這種環境下,保證一個乾淨、無端障目標LFS系統的構建。構建過程被設計爲新讀者和最小化風險提供最有教育價值在同一時間。
在繼續以前,請注意工做平臺的名稱,一般稱爲目標三聯體。一個簡單的方法來肯定目標三聯體是運行的名稱 config.guess腳本附帶的源代碼不少包。解壓Binutils來源和運行腳本: ./config.guess
並注意輸出。例如,對於一個32位的英特爾處理器的輸出 i686-pc-linux-gnu。在64位系統上 x86_64-pc-linux-gnu.
也意識到平臺的動態連接器的名稱,一般被稱爲動態加載程序(不與標準連接器混淆 ldBinutils的一部分)。Glibc提供的動態連接器查找並加載一個程序所需的共享庫,準備程序運行,而後運行它。動態連接器的名稱爲一個32位的機器將英特爾 ld-linux.so.2
(ld-linux-x86-64.so.2
64位系統)。也是肯定動態連接器的名稱是檢查一個隨機二進制從主機系統經過運行: readelf -l <name of binary> | grep interpreter
並注意輸出。覆蓋全部平臺在權威的參考 shlib-versions
文件在Glibc源代碼樹的根。
一些關鍵技術點的第五章構建方法:
略調整工做平臺的名稱,經過改變「供應商」字段三聯體的目標 LFS_TGT
變量,確保第一個構建Binutils和GCC產生交叉耦合和交叉編譯器兼容。而不是產生二進制文件架構,交叉耦合和交叉編譯器將生成二進制文件與當前硬件兼容。
臨時庫是交叉編譯。因爲其性質交叉編譯器不能依賴任何東西,從它的主機系統,該方法消除了潛在的污染減小目標系統的頭文件或庫的機會從主機被歸入新工具。交叉編譯的可能性還容許構建32位和64位庫在64位硬件能力。
當心操縱源告訴編譯器GCC的目標將使用動態連接器。
Binutils首先由於安裝 配置運行GCC和Glibc彙編和連接器上執行各類功能測試,以肯定哪些軟件功能啓用或禁用。這是更重要的比人們第一次意識到的。錯誤配置GCC或Glibc會致使巧妙地破碎的工具鏈,這些破損的影響可能不會出現,直到接近尾聲的構建整個分佈。一個測試套件失敗一般會強調這個錯誤以前太多執行額外的工做。
Binutils安裝它的彙編和連接器在兩個位置, /tools/bin
和 /tools/$LFS_TGT/bin
。在一個地方的工具很難與其餘有關。連接器的一個重要方面是它的圖書館搜索順序。能夠得到詳細的信息 ld經過它 --verbose
國旗。例如,一個 ld --verbose | grep SEARCH
將說明當前搜索路徑及其順序。它顯示了哪些文件是聯繫在一塊兒的 ld編譯一個虛擬程序和傳遞 --verbose
切換到連接器。例如, gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded
將顯示全部的文件在鏈接成功打開。
下一個包安裝GCC。一個例子能夠看到在其運行的 配置是:
checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld
這是上面提到的重要的緣由。它還代表,GCC的配置腳本不會搜索目錄的路徑找到工具來使用。然而,在實際的操做 海灣合做委員會自己,不必定是使用相同的搜索路徑。找出哪些標準連接器 海灣合做委員會將使用,運行: gcc -print-prog-name=ld
.
能夠得到詳細的信息 海灣合做委員會經過它 -v
命令行選項,編譯一個虛擬的程序。例如, gcc -v dummy.c
將顯示詳細信息預處理、編譯和組裝階段,包括 海灣合做委員會包括搜索路徑和他們的訂單。
下安裝消毒Linux API頭。這些容許標準C庫(Glibc)與Linux內核提供的功能。
下一個安裝包是Glibc。最重要的考慮建築Glibc編譯器,二進制工具和內核頭文件。編譯器一般不是問題由於Glibc老是使用編譯器有關 --host
參數傳遞給它的配置腳本;例如,在咱們的案例中,編譯器將 i686-lfs-linux-gnu-gcc。二進制工具和內核頭文件能夠是一個更復雜。所以,沒有風險和使用可用的配置開關執行正確的選擇。運行後 配置,檢查的內容config.make
文件 glibc-build
目錄的全部重要的細節。注意使用 CC="i686-lfs-gnu-gcc"
控制使用二進制工具的使用 -nostdinc
和 -isystem
國旗來控制編譯器的包括搜索路徑。這些項目突出Glibc包裝的一個重要方面是很是自給自足的建設機械和通常不依賴於工具鏈的缺省值。
Binutils第二步期間,咱們可以利用的 --with-lib-path
配置開關控制 ld庫搜索路徑。
第二步的GCC,其來源也須要修改告訴GCC使用新的動態連接器。不這麼作將致使GCC項目自己擁有的名稱從主機系統的動態連接器 /lib
目錄嵌入到他們,這將擊敗的目標遠離主機。從這一點開始,核心工具鏈是獨立和自主。的其他部分第五章包全部構建新Glibc /tools
.
在進入chroot環境第六章第一個主要包安裝Glibc,因爲其自給自足天然上面提到的。一旦這是安裝到Glibc /usr
,咱們將執行一個快速轉換工具鏈的缺省值,而後進行構建目標LFS系統的其他部分。
在構建包有幾個假設在產品說明:
幾個包在編譯以前修補,但只有當補丁須要規避的問題。一片一般是須要在這個和下一章,但有時只在一個或另外一個。所以,不要擔憂若是指令下載補丁彷佛失蹤。警告信息 抵消或 模糊應用補丁時也會遇到。不要擔憂這些警告,隨着補丁還成功應用。
大多數軟件包編譯期間,將會有一些警告,經過在屏幕上滾動。這些都是正常的,能夠安全地忽略。這些警告他們appear-warnings棄用,但不是無效,使用C或c++語法。C標準常常變化,一些包仍然使用舊的標準。這不是一個問題,可是提示警告。
最後一次檢查 LFS
環境變量設置正確:
echo $LFS
確保輸出顯示��LFS的路徑分區的掛載點,這是 /mnt/lfs
,使用咱們的例子。
最後兩個重要項目必須強調:
構建指令假設主機系統需求,包括符號連接,設置正確:
bash在使用shell。
上海是一個符號連接呢 bash.
/usr/bin/awk是一個符號連接呢 靦腆的人.
/usr/bin/yacc是一個符號連接呢 野牛或一個小腳本執行野牛。
Binutils包包含一個連接,一個彙編程序,和其餘工具來處理對象文件。
回去重讀筆記在前一節中。理解標記爲重要的筆記將節省你不少問題。
Binutils是第一個包很重要由於Glibc和GCC編譯執行各類測試可用的連接器和彙編程序,以肯定哪些讓本身的特性。
Binutils文檔建議建築Binutils專用的構建目錄:
mkdir -v build cd build
爲了其他的書中列出的單位值的任何使用,測量的時間建造這個包的配置,包括第一次安裝。爲實現這一目標,包裝的命令 時間命令以下: time { ./configure ... && ... && make install; }
.
所需的近似創建業務單位價值和磁盤空間在第5章不包括測試套件的數據。
如今準備Binutils編譯:
../configure --prefix=/tools \ --with-sysroot=$LFS \ --with-lib-path=/tools/lib \ --target=$LFS_TGT \ --disable-nls \ --disable-werror
配置選項的含義:
--prefix=/tools
這告訴配置腳本安裝Binutils項目作準備 /tools
目錄中。
--with-sysroot=$LFS
對於交叉編譯,這告訴構建系統在$ LFS尋找目標系統所需的庫。
--with-lib-path=/tools/lib
這指定庫路徑連接器應該配置爲使用。
--target=$LFS_TGT
由於機器的描述 LFS_TGT
變量比返回的值略有不一樣 config.guess腳本,這個開關會告訴的 配置腳本調整Binutil構建系統的交聯劑。
--disable-nls
這個禁用國際化i18n是暫時不須要工具。
--disable-werror
這能夠防止構建阻止事件有警告主人的編譯器。
繼續編譯包:
make
如今編譯完成。一般咱們將運行測試套件,但在這個早期階段測試套件框架(Tcl、指望和DejaGNU)尚未到位。此時運行測試的好處是最小自項目從這個第一遍很快就會被那些從第二所取代。
若是在x86_64的基礎上,建立一個符號連接,確保工具鏈的完整性:
case $(uname -m) in x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;; esac
安裝包:
make install
這個包位於的細節部分6.16.2,「Binutils內容。」
最後一次更新在
GCC包包含GNU編譯器集合,包括C和c++編譯器。
GCC如今須要GMP,MPFR和MPC包。做爲這些包可能不包括在您的主機分配,他們將用GCC。每一個包解壓縮到GCC源目錄和命名的目錄的GCC構建過程將自動使用:
本章有頻繁的誤解。程序是同樣的其餘如前所述章(包構建指令)。首先從源目錄中提取gcc tarball,而後改變目錄建立。只有這樣,你應該繼續下面的說明。
tar -xf ../mpfr-3.1.5.tar.xz mv -v mpfr-3.1.5 mpfr tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp tar -xf ../mpc-1.0.3.tar.gz mv -v mpc-1.0.3 mpc
下面的命令將會改變GCC的默認的位置動態連接器使用一個安裝在 /tools
。它也消除了 /usr/include
從GCC的包括搜索路徑。問題:
for file in gcc/config/{linux,i386/linux{,64}}.h do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done
上面彷佛難以理解,讓咱們將其分解。首先,咱們複製文件 gcc/config/linux.h
, gcc/config/i386/linux.h
, gcc/config/i368/linux64.h
。一個文件的名稱相同但添加後綴的 「.orig」。而後第一個sed表現突出 「/工具」每個的實例 「/lib/ld」, 「/ lib64 / ld」或 「/ lib32 / ld」,而第二個取代硬編碼的實例 「/ usr」。接下來,咱們添加定義語句改變默認startfile前綴的文件。注意,拖着 「/」在 「/工具/ lib /」是必需的。最後,咱們使用 觸摸更新複製的文件的時間戳。當結合使用 cp - u,這樣能夠防止意外更改原始文件的命令是無心中運行兩次。
最後,x86_64主機上,設置默認爲64位庫目錄名稱 「自由」:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
GCC文檔建議構建GCC在一個專用的構建目錄:
mkdir -v build cd build
準備GCC編譯:
../configure \ --target=$LFS_TGT \ --prefix=/tools \ --with-glibc-version=2.11 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --disable-nls \ --disable-shared \ --disable-multilib \ --disable-decimal-float \ --disable-threads \ --disable-libatomic \ --disable-libgomp \ --disable-libmpx \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libstdcxx \ --enable-languages=c,c++
配置選項的含義:
--with-newlib
由於C庫尚未可用的工做,這能夠確保構建libgcc時inhibit_libc常數定義。這能夠防止任何代碼的編譯,須要libc的支持。
--without-headers
當建立一個完整的編譯器GCC要求標準頭與目標系統兼容。對咱們來講這些頭不會須要。這個開關能夠防止GCC尋找他們。
--with-local-prefix=/tools
當地的前綴是系統中的位置,GCC將本地搜索包含文件安裝。默認值是 /usr/local
。設置這個 /tools
有助於保持主機的位置 /usr/local
這個GCC的搜索路徑。
--with-native-system-header-dir=/tools/include
默認狀況下GCC搜索 /usr/include
系統頭文件。會同sysroot開關,這一般會翻譯 $LFS/usr/include
。不過頭,將安裝將在接下來的兩個部分 $LFS/tools/include
。這個開關確保gcc會找到正確。在第二個經過的GCC,一樣的開關將確保沒有頭從主機系統。
--disable-shared
這個開關迫使GCC內部靜態庫連接。這樣作是爲了不可能的主機系統的問題。
--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libmpx, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx
這些開關禁用支持十進制浮點擴展、線程、libatomic,libgomp,libmpx,libquadmath,libssp,libvtv,c++標準庫。這些功能將沒法編譯構建交叉編譯器時,不交叉編譯臨時libc的任務所必需的。
--disable-multilib
x86_64,LFS還不支持multilib配置。這個開關是x86無害。
--enable-languages=c,c++
這個選項能夠確保只有C和c++編譯器。這些是惟一的語言如今須要的。
GCC編譯經過運行:
make
如今編譯完成。在這一點上,測試套件一般會跑,可是,正如前面提到過的,測試套件框架尚未到位。此時運行測試的好處是最小自項目從這個第一遍很快就會被取代。
安裝包:
make install
這個包位於的細節部分6.20.2,GCC的內容。」
最後一次更新在
Linux內核API頭(linux-4.12.7.tar.xz)公開的API使用Glibc。
Linux內核須要公開的應用程序編程接口(API)系統的C庫(LFS Glibc)使用。這樣作是經過消毒各類C頭文件的Linux內核源代碼tarball。
確保沒有過時文件嵌入到包:
make mrproper
如今從源中提取用戶可見的內核頭文件。他們被放置在一箇中間本地目錄複製到所需的位置,由於提取過程在目標目錄中刪除任何現有的文件。
make INSTALL_HDR_PATH=dest headers_install cp -rv dest/include/* /tools/include
這個包位於的細節6.7.2部分,「Linux API標題的內容。」
最後一次更新在
Glibc包包含主要的C庫。這個庫提供的基本例程分配內存,搜索目錄,打開和關閉文件、讀寫文件、字符串處理、模式匹配、算術等等。
Glibc文檔建議建築Glibc專用的構建目錄:
mkdir -v build cd build
接下來,Glibc準備編譯:
../configure \ --prefix=/tools \ --host=$LFS_TGT \ --build=$(../scripts/config.guess) \ --enable-kernel=3.2 \ --with-headers=/tools/include \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes
配置選項的含義:
--host=$LFS_TGT, --build=$(../scripts/config.guess)
這些開關的綜合效應是Glibc的構建系統自己須要配置保存,使用交叉耦合和交叉編譯器 /tools
.
--enable-kernel=3.2
這告訴Glibc 3.2編譯庫支持,後來Linux內核。替代舊的內核不啓用。
--with-headers=/tools/include
這告訴Glibc編譯自己對最近頭安裝目錄的工具,因此它確切地知道哪些特性相應的內核,能夠優化自己。
libc_cv_forced_unwind=yes
連接器安裝在5.4節,「binutils - 2.29 - 1」交叉編譯,所以不能使用到Glibc已經安裝。這意味着force-unwind支持的配置測試將失敗,由於它依賴於一個連接器工做。libc_cv_forced_unwind = yes變量傳遞以通知 配置force-unwind支持可沒有它運行測試。
libc_cv_c_cleanup=yes
一樣,咱們libc_cv_c_cleanup = yes穿過 配置腳本,則跳過測試配置和C清理處理支持。
在這個階段可能出現如下警告:
configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.
缺失或不兼容 msgfmt項目一般是無害的。這 msgfmt程序的一部分Gettext包主機分佈應提供。
有報道稱,這個包可能會失敗在構建「並行」。若是發生這種狀況,從新運行make命令「j - 1」選項。
編譯包:
make
安裝包:
make install
在這一點上,必須中止並確保基本功能(編譯和連接)的新工具鏈按預期工做。執行一個檢查,運行如下命令:
echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep ': /tools'
若是一切工做正常,應該沒有錯誤,和最後一個命令的輸出的形式:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
請注意,對於64位的機器,翻譯的名字 /tools/lib64/ld-linux-x86-64.so.2
.
若是輸出和上面沒有顯示或沒有輸出,而後是錯誤的。調查和追溯的步驟找出問題並糾正它。這個問題必須解決以後才能繼續。
一旦一切都好,清理測試文件:
rm -v dummy.c a.out
下下個建築Binutils部分將做爲一個額外的檢查工具鏈創建正常。若是Binutils未能創建,這是一個跡象代表出了毛病前Binutils GCC或Glibc安裝。
這個包位於的細節6.9.3部分,「Glibc的內容。」
最後一次更新在
Libstdc + +是標準c++庫。它須要正確的操做的g++編譯器。
Libstdc + +是GCC的一部分來源。你應該首先解壓GCC tarball和改變 gcc-7.2.0
目錄中。
建立一個單獨的構建目錄Libstdc + +並輸入:
mkdir -v build cd build
準備Libstdc + +編譯:
../libstdc++-v3/configure \ --host=$LFS_TGT \ --prefix=/tools \ --disable-multilib \ --disable-nls \ --disable-libstdcxx-threads \ --disable-libstdcxx-pch \ --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/7.2.0
配置選項的含義:
--host=...
代表使用交叉編譯器咱們剛剛創建,而不是一個 /usr/bin
.
--disable-libstdcxx-threads
由於咱們尚未創建C線程庫,C + + 1不能創建。
--disable-libstdcxx-pch
這個開關防止預編譯包含文件的安裝,不須要在這個階段。
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/7.2.0
這是標準的位置搜索包含文件的c++編譯器。在通常的構建,該信息自動傳遞給Libstdc + + 配置選項從頂層目錄。在咱們的例子中,這些信息必須明確。
經過運行:編譯libstdc + +
make
安裝庫:
make install
這個包位於的細節部分6.20.2,GCC的內容。」
最後一次更新在
Binutils包包含一個連接,一個彙編程序,和其餘工具來處理對象文件。
建立一個單獨的構建目錄:
mkdir -v build cd build
Binutils準備編譯:
CC=$LFS_TGT-gcc \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../configure \ --prefix=/tools \ --disable-nls \ --disable-werror \ --with-lib-path=/tools/lib \ --with-sysroot
新的配置選項的含義:
CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib
由於這真的是一個本地構建Binutils,確保設置這些變量構建系統使用交叉編譯器和相關的工具而不是主機系統上的。
--with-lib-path=/tools/lib
這告訴配置腳本指定庫搜索路徑Binutils編譯期間,致使 /tools/lib
被傳遞給連接器。這能夠防止連接器主機上經過圖書館搜索目錄。
--with-sysroot
sysroot特性使連接找到共享對象所必需的其餘共享對象明確包括連接器的命令行。沒有這個,一些包可能不成功創建在一些主機。
編譯包:
make
安裝包:
make install
如今準備的連接器 「其餘」在下一章中階段:
make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib cp -v ld/ld-new /tools/bin
使參數的含義:
-C ld clean
這告訴程序刪除全部編譯文件 ld
子目錄。
-C ld LIB_PATH=/usr/lib:/lib
這個選項重建中的一切 ld
子目錄。指定 LIB_PATH
Makefile變量在命令行上容許咱們覆蓋默認值的臨時工具和點適當的最終路徑。這個變量的值指定連接的默認庫搜索路徑。這種準備是用於下一章。
這個包位於的細節部分6.16.2,「Binutils內容。」
最後一次更新在
GCC包包含GNU編譯器集合,包括C和c++編譯器。
咱們第一次創建的GCC安裝了幾個內部系統頭文件。一般其中之一, limits.h
,將包括相應的系統 limits.h
頭,在這種狀況下, /tools/include/limits.h
。然而,當時的第一個創建的gcc /tools/include/limits.h
不存在,因此內部頭GCC安裝部分,獨立的文件,不包括系統的擴展功能頭。這是構建臨時libc足夠,可是這個構建的GCC如今須要完整的內部頭。建立一個完整版的內部頭使用的命令是相同的什麼GCC編譯系統在正常狀況下:
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
再一次,改變GCC的默認的位置動態連接器使用一個安裝在 /tools
.
for file in gcc/config/{linux,i386/linux{,64}}.h do cp -uv $file{,.orig} sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ -e 's@/usr@/tools@g' $file.orig > $file echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file touch $file.orig done
若是基於x86_64,改變默認的64位庫目錄名稱 「自由」:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
在第一個構建的GCC須要GMP,MPFR和MPC包。解壓壓縮包並移動到所需的目錄名稱:
tar -xf ../mpfr-3.1.5.tar.xz mv -v mpfr-3.1.5 mpfr tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp tar -xf ../mpc-1.0.3.tar.gz mv -v mpc-1.0.3 mpc
建立一個單獨的構建目錄:
mkdir -v build cd build
在開始構建GCC以前,記得要設置環境變量,覆蓋默認的優化旗幟。
如今準備GCC編譯:
CC=$LFS_TGT-gcc \ CXX=$LFS_TGT-g++ \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../configure \ --prefix=/tools \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --enable-languages=c,c++ \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp
新的配置選項的含義:
--enable-languages=c,c++
這個選項能夠確保C和c++編譯器。
--disable-libstdcxx-pch
不創建預編譯頭(PCH) libstdc++
。它佔用了大量的空間,咱們不須要它。
--disable-bootstrap
對於本地版本的GCC,默認是「引導」構建。這並不僅是GCC編譯,編譯它好幾回。它使用在第一輪編譯程序編譯自己第二次,第三次,而後再次。第二個和第三個迭代進行比較,以確保它能夠複製自己完美。這也意味着這是正確編譯。然而,LFS構建方法應該提供一個堅實的編譯器,而不須要每次都引導。
編譯包:
make
安裝包:
make install
最後潤色,建立一個符號連接。許多程序和腳本運行 cc而不是 海灣合做委員會,用於保持程序通用的,所以可用在各類UNIX系統上安裝了GNU C編譯器並不老是。運行 cc使系統管理員能夠決定哪些C編譯器安裝:
ln -sv gcc /tools/bin/cc
在這一點上,必須中止並確保基本功能(編譯和連接)的新工具鏈按預期工做。執行一個檢查,運行如下命令:
echo 'int main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'
若是一切工做正常,應該沒有錯誤,和最後一個命令的輸出的形式:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
請注意, /tools/lib
,或 /tools/lib64
對於64位機器顯示爲動態連接器的前綴。
若是輸出和上面沒有顯示或沒有輸出,而後是錯誤的。調查和追溯的步驟找出問題並糾正它。這個問題必須解決以後才能繼續。首先,再次執行完整性檢查,使用海灣合做委員會而不是 cc。若是這是,那麼 /tools/bin/cc
符號連接是失蹤。安裝按上面的符號連接。接下來,確保 PATH
是正確的。這能夠經過運行檢查 回聲路徑美圓和驗證 /tools/bin
在列表的頭。若是 PATH
是錯誤的,它可能意味着你沒有登陸的用戶嗎 lfs
或者出了問題4.4節,「設置環境。」
一旦一切都好,清理測試文件:
rm -v dummy.c a.out
這個包位於的細節部分6.20.2,GCC的內容。」
最後一次更新在
Tcl包包含工具命令語言。
這個包和將來三(DejaGNU指望,並檢查)安裝爲GCC支持運行測試套件和Binutils和其餘包。爲測試目的安裝四個包彷佛有些過度了,但這很安心,若是不是必要的,知道最重要的工具是正常工做。即便測試套件運行在本章(不強制),這些包都必須運行測試套件第六章.
注意,這裏使用的Tcl包是運行LFS所需的最小版本測試。完整的包,看到BLFS Tcl程序.
Tcl準備編譯:
cd unix ./configure --prefix=/tools
建設方案:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。Tcl運行測試套件,發出如下命令:
TZ=UTC make test
Tcl測試套件可體驗到失敗在特定主機的條件並不徹底理解。所以,測試套件的失敗在這裏不奇怪,不被認爲是相當重要的。的 TZ=UTC
參數設置時區爲協調世界時(UTC),但只有時間的測試套件運行。這將確保時鐘測試正確行使。細節上的 TZ
環境變量提供了第七章.
安裝包:
make install
讓安裝庫可寫的調試符號能夠刪除後:
chmod -v u+w /tools/lib/libtcl8.6.so
安裝Tcl的頭。期待,下一個包須要構建。
make install-private-headers
如今作一個必要的符號連接:
ln -sv tclsh8.6 /tools/bin/tclsh
最後一次更新在
預計包包含一個程序的執行腳本與其餘互動對話程序。
首先,迫使指望的配置腳本使用 /bin/stty
而不是 /usr/local/bin/stty
它可能會發如今主機系統。這將確保咱們的測試套件工具保持理智的最終構建咱們的工具鏈:
cp -v configure{,.orig} sed 's:/usr/local/bin:/bin:' configure.orig > configure
如今預計準備編譯:
./configure --prefix=/tools \ --with-tcl=/tools/lib \ --with-tclinclude=/tools/include
配置選項的含義:
--with-tcl=/tools/lib
這將確保配置腳本找到臨時的Tcl安裝工具位置,而不是可能定位現有的主機系統。
--with-tclinclude=/tools/include
這明確告訴預計在哪裏找到Tcl的內部標頭。使用這個選項能夠避免的狀況 配置失敗,由於它不能自動發現Tcl的頭的位置。
建設方案:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。預計測試套件運行,發出如下命令:
make test
注意,但願測試套件是已知的失敗經驗在某些主機不在咱們控制以內的條件。所以,測試套件的失敗在這裏不奇怪,不被認爲是相當重要的。
安裝包:
make SCRIPTS="" install
使參數的含義:
SCRIPTS=""
這能夠防止安裝補充Expect腳本,不須要。
最後一次更新在
DejaGNU包包含測試其餘程序的一個框架。
DejaGNU準備編譯:
./configure --prefix=/tools
構建和安裝包:
make install
測試結果,問題:
make check
最後一次更新在
檢查是C的單元測試框架。
準備檢查編譯:
PKG_CONFIG= ./configure --prefix=/tools
配置參數的含義:
PKG_CONFIG=
這告訴配置腳本忽略任何pkg-config選項,可能會致使系統不試圖連接庫 /tools
目錄中。
建設方案:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。檢查運行測試套件,發出如下命令:
make check
注意,檢查測試套件可能須要較長(4單位)。
安裝包:
make install
最後一次更新在
Ncurses包包含庫terminal-independent處理字符的屏幕。
首先,確保 靦腆的人第一次發如今配置:
sed -i s/mawk// configure
Ncurses準備編譯:
./configure --prefix=/tools \ --with-shared \ --without-debug \ --without-ada \ --enable-widec \ --enable-overwrite
配置選項的含義:
--without-ada
這將確保Ncurses Ada編譯器不支持它可能出如今主機,但一旦咱們進入將不可用 chroot環境。
--enable-overwrite
這告訴Ncurses安裝它的頭文件 /tools/include
,而不是 /tools/include/ncurses
,以確保其餘包能夠找到Ncurses頭成功。
--enable-widec
這個開關會致使寬度字符庫(例如, libncursesw.so.6.0
)創建而不是正常的(例如, libncurses.so.6.0
)。這些寬度字符庫可用在多字節和傳統的8位地區,而正常庫只在8位場所正常工做。寬字符和正常庫源代碼兼容,但不是二進制兼容的。
編譯包:
make
這個包有一個測試套件,但它只能包已經安裝後運行。測試中駐留 test/
目錄中。看到 README
該目錄中的文件爲進一步的細節。
安裝包:
make install
這個包位於的細節部分6.23.2,「Ncurses的內容。」
最後一次更新在
Bash包包含Bourne-Again殼。
Bash準備編譯:
./configure --prefix=/tools --without-bash-malloc
配置選項的含義:
--without-bash-malloc
這個選項關閉使用Bash的內存分配(malloc
)函數會致使分割的缺點。關閉這個選項,Bash將使用 malloc
函數從Glibc更穩定。
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行Bash測試套件,發出如下命令:
make tests
安裝包:
make install
使程序的連接使用 上海外殼:
ln -sv bash /tools/bin/sh
這個包位於的細節部分6.34.2,Bash的內容。」
最後一次更新在
野牛包包含一個解析器生成器。
野牛準備編譯:
./configure --prefix=/tools
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
這個包位於的細節部分6.31.2,「野牛」的內容。
最後一次更新在
Bzip2包包含壓縮和解壓文件的程序。壓縮的文本文件 bzip2產生一個更好的壓縮比與傳統的比例 gzip.
Bzip2包不包含 配置腳本。編譯和測試它:
make
安裝包:
make PREFIX=/tools install
這個包位於的細節部分6.21.2,Bzip2內容。」
最後一次更新在
Coreutils包包含實用程序顯示和設置基本制度特徵。
Coreutils準備編譯:
./configure --prefix=/tools --enable-install-program=hostname
配置選項的含義:
--enable-install-program=hostname
這使 主機名二進制建造和安裝——它默認是禁用的,但Perl所要求的測試套件。
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行測試套件Coreutils不管如何,發出如下命令:
make RUN_EXPENSIVE_TESTS=yes check
的 RUN_EXPENSIVE_TESTS=yes
參數告訴測試套件運行幾個額外的測試被認爲是相對昂貴(CPU和內存使用)在一些平臺上,但一般不是一個問題在Linux上。
安裝包:
make install
這個包位於的細節部分6.50.2,「Coreutils內容。」
最後一次更新在
你要包包含程序顯示文件或目錄之間的差別。
你要準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行你的測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節6.51.2節,「你要的內容。」
最後一次更新在
文件包包含一個實用工具來肯定一個給定的文件或文件的類型。
準備文件進行編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行測試套件的文件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節6.12.2節,「文件」的內容。
最後一次更新在
Findutils包包含程序找到文件。這些項目提供了遞歸搜索目錄樹和建立、維護和搜索數據庫(一般比遞歸查找更快,可是不可靠,若是數據庫最近沒有更新)。
Findutils準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行測試套件Findutils不管如何,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.53.2,「Findutils內容。」
最後一次更新在
呆呆的包包含操縱文本文件的程序。
準備呆呆的編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行呆呆的測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.52.2,呆呆的「內容」。
最後一次更新在
國際化和本地化的Gettext包包含公用事業。這些容許編譯程序與NLS(本地語言支持),使他們可以輸出消息在用戶的母語。
對於咱們的臨時的工具集,咱們只須要從Gettext構建和安裝三個項目。
Gettext準備編譯:
cd gettext-tools EMACS="no" ./configure --prefix=/tools --disable-shared
配置選項的含義:
EMACS="no"
這能夠防止配置腳本肯定在哪裏安裝Emacs Lisp文件做爲測試掛在一些虛擬主機。
--disable-shared
咱們不須要安裝任何共享Gettext庫,所以不須要構建它們。
編譯包:
make -C gnulib-lib make -C intl pluralx.c make -C src msgfmt make -C src msgmerge make -C src xgettext
只有三個項目已經被編譯,不可能沒有編譯運行測試套件從Gettext包額外的支持庫。所以不建議嘗試運行測試套件。
安裝 msgfmt, msgmerge和 xgettext程序:
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin
這個包位於的細節部分6.47.2,「Gettext的內容。」
最後一次更新在
Grep搜索包包含項目文件。
Grep準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行Grep測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.33.2,「Grep的內容。」
最後一次更新在
的Gzip壓縮和解壓文件包包含項目。
Gzip準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行Gzip測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.57.2,「Gzip的內容。」
最後一次更新在
M4包包含一個宏處理器。
M4準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。M4運行測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節6.14.2部分,「M4的內容。」
最後一次更新在
使編譯包包含一個程序包。
準備進行編譯:
./configure --prefix=/tools --without-guile
配置選項的含義:
--without-guile
這將確保Make-4.2.1不會對詭計庫連接,這可能出如今主機系統,但不會中可用的 chroot環境下一章。
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行Make測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節6.61.2部分,「內容」。
最後一次更新在
補丁包包含一個程序修改或建立文件的應用 「補丁」一般文件建立的 diff程序。
準備補丁進行編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行補丁測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.62.2,「補丁的內容。」
最後一次更新在
Perl包包含實際提取和報告語言。
首先,修復一個構建問題只出如今LFS環境:
sed -e '9751 a#ifndef PERL_IN_XSUB_RE' \ -e '9808 a#endif' \ -i regexec.c
準備Perl編譯:
sh Configure -des -Dprefix=/tools -Dlibs=-lm
建設方案:
make
雖然Perl附帶一個測試套件,最好等到安裝在下一章。
只有少數的實用程序和庫須要安裝在這個時間:
cp -v perl cpan/podlators/scripts/pod2man /tools/bin mkdir -pv /tools/lib/perl5/5.26.0 cp -Rv lib/* /tools/lib/perl5/5.26.0
這個包位於的細節部分6.40.2,「Perl」的內容。
最後一次更新在
Sed包包含一個流編輯器。
Sed準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。Sed運行測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.27.2,「Sed的內容。」
最後一次更新在
Tar包包含一個歸檔項目。
焦油準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。焦油運行測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.68.2,「焦油���內容。」
最後一次更新在
Texinfo包包含項目爲閱讀,寫做,和轉換信息頁面。
Texinfo準備編譯:
./configure --prefix=/tools
做爲配置過程的一部分,一個測試是由TestXS_la-TestXS.lo代表一個錯誤。這不是有關LFS和應被忽略。
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行測試套件Texinfo不管如何,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.69.2,「Texinfo內容。」
最後一次更新在
Util-linux包包含各類各樣的實用程序。
Util-linux準備編譯:
./configure --prefix=/tools \ --without-python \ --disable-makeinstall-chown \ --without-systemdsystemunitdir \ --without-ncurses \ PKG_CONFIG=""
配置選項的含義:
--without-python
這個開關禁用使用 Python若是是安裝在主機系統上。它能避免試圖創建沒必要要的綁定。
--disable-makeinstall-chown
這個開關禁用使用 喬恩在安裝期間命令。這是不須要在安裝/工具目錄,避免做爲根用戶安裝的必要性。
--without-ncurses
這個開關禁用使用ncurses庫的構建過程。這是不須要在安裝/工具目錄並避免問題在某些主機發行版。
--without-systemdsystemunitdir
系統使用systemd,包試圖安裝一個systemd特定文件到一個不存在的目錄在/工具。這個開關禁用沒必要要的行動。
PKG_CONFIG=""
設置環境變量添加沒必要要的特性,能夠防止在主機。注意,設置這個環境變量的位置顯示是不一樣於其餘LFS部分變量在哪裏設置前的命令。這個位置所示展現的另外一種方式使用配置時設置一個環境變量。
編譯包:
make
安裝包:
make install
最後一次更新在
Xz包包含壓縮和解壓文件的程序。它提供了功能lzma和更新的xz壓縮格式。壓縮的文本文件 xz產生一個更好的壓縮比與傳統的比例 gzip或 bzip2命令。
Xz準備編譯:
./configure --prefix=/tools
編譯包:
make
如今編譯完成。正如前面所討論的,運行測試套件是臨時工具不是強制性的在這一章。運行Xz測試套件,發出如下命令:
make check
安裝包:
make install
這個包位於的細節部分6.45.2,「Xz內容。」
最後一次更新在
本節中的步驟是可選的,但若是LFS分區,而小,有利於學習,能夠刪除沒必要要的物品。到目前爲止的可執行文件和庫創建包含大約70 MB的沒必要要的調試符號。刪除這些符號:
strip --strip-debug /tools/lib/* /usr/bin/strip --strip-unneeded /tools/{,s}bin/*
這些命令將跳過大量文件、報告,它不認可他們的文件格式。大多數都是腳本而不是二進制文件。也使用系統帶命令包括加沙地帶二進制/工具。
照顧 不使用 --strip-unneeded
在庫。靜態的將被摧毀和工具鏈包須要從新建造。
存更多的錢,刪除文檔:
rm -rf /tools/{,share}/{info,man,doc}
此時,您應該至少3 GB的空閒空間 $LFS
能夠用來構建和安裝Glibc和Gcc在接下來的階段。若是你能構建和安裝Glibc,您能夠構建和安裝其他。
在這本書的其他部分的命令必須在登陸用戶執行 root
,再也不做爲用戶 lfs
。此外,雙重檢查 $LFS
被設置在 root
的環境。
目前, $LFS/tools
目錄由用戶 lfs
,用戶只存在於主機系統。若是 $LFS/tools
目錄保存,文件是屬於沒有對應賬戶的用戶ID。這是危險的,由於一個用戶賬戶建立後能夠獲得相同的用戶ID和將本身的 $LFS/tools
目錄和全部文件,從而讓這些文件可能的惡意操縱。
爲了不這個問題,您能夠添加 lfs
用戶後,建立新的LFS系統 /etc/passwd
文件,照顧分配相同的用戶和組id在主機系統。更好的是,改變的全部權 $LFS/tools
目錄的用戶 root
經過運行下面的命令:
chown -R root:root $LFS/tools
雖然 $LFS/tools
目錄能夠刪除LFS系統已經完成後,它能夠保留創建附加的LFS系統 同一本書的版本。如何備份 $LFS/tools
是一個我的喜愛的問題。
若是你打算保持暫時的工具用於構建將來的LFS系統, 如今是時候回去了。第六章中後續的命令將改變目前的工具,呈現他們無用的將來構建。
在這一章,咱們進入建築工地,開始認真構建LFS系統。咱們chroot臨時迷你的Linux系統,作一些最後的準備,而後開始安裝包。
這個軟件的安裝很簡單。雖然在許多狀況下,安裝說明能夠更短更通用的,咱們選擇爲每一個包提供完整的指令錯誤的可能性降到最低。學習是什麼讓一個Linux系統的關鍵工做是知道每一個包是用來和你爲何(或系統)可能須要它。
咱們不建議使用優化。他們能夠使程序運行更快,但他們也可能致使編譯運行程序時,困難和問題。若是一個包拒絕編譯使用優化時,試着編譯它沒有優化,看看修復這個問題。即便包編譯使用優化時,存在的風險多是編譯錯誤,由於之間的複雜交互代碼並構建工具。還注意到 -march
和 -mtune
選項使用值沒有指定在書中沒有被測試。這可能致使問題的工具鏈包(Binutils,GCC和Glibc)。小的潛在收益實現使用編譯器優化每每抵消風險。鼓勵首次建築商LFS構建沒有定製優化。隨後系統將仍然跑得很快,是穩定在同一時間。
包的順序安裝在本章須要嚴格執行,以確保沒有指程序意外得到一個路徑 /tools
硬鏈接。出於一樣的緣由,不要並行編譯不一樣的包。並行編譯可能節省時間(特別是在雙cpu的機器上),但它可能致使程序包含一個硬鏈接的路徑 /tools
,這將致使程序中止工做時,刪除目錄。
安裝前安裝說明,每一個頁面提供關於包裝的信息,包括一個簡潔的描述,它包含什麼,大約須要多長時間,多少磁盤空間這個建築過程當中是必需的。安裝說明後,有一個項目列表和庫(以及簡要的描述這些),包安裝。
所需的業務單位價值和磁盤空間包括全部適用的測試套件數據包在第六章。
通常來講,LFS編輯阻礙構建和安裝靜態庫。最初的目的大多數靜態庫已通過時的在現代的Linux系統。除了靜態庫連接到一個程序能夠是有害的。若是一個更新圖書館須要刪除一個安全問題,全部的程序使用靜態庫須要工具的新圖書館。由於使用靜態庫並不老是顯而易見的,相關的程序(程序須要作連接)甚至不被人知道的。
在第六章的程序,咱們刪除或禁用大多數靜態庫的安裝。在一些狀況下,尤爲是glibc和gcc,使用靜態庫總包建築仍然是必不可少的過程。這一般是經過一個完成的 --disable-static
選項 配置。在其餘狀況下,備用手段是必要的。
爲一個更完整的討論圖書館,看到討論庫:靜態或共享?BLFS的書。並
各類文件系統導出由內核用於交流和從內核自己。這些文件系統是虛擬的,沒有磁盤空間用於他們。文件系統的內容駐留在內存中。
首先建立目錄上的文件系統安裝:
mkdir -pv $LFS/{dev,proc,sys,run}
在內核啓動時系統,它須要一些設備節點的存在,尤爲是 console
和 null
設備。必須在硬盤上建立設備節點,這樣他們是可用的 udevd已經開始,另外當Linux是開始 init=/bin/bash
。建立設備經過運行如下命令:
mknod -m 600 $LFS/dev/console c 5 1 mknod -m 666 $LFS/dev/null c 1 3
推薦的填充方法 /dev
目錄和設備(如安裝一個虛擬文件系統 tmpfs
) /dev
建立目錄,並容許設備動態虛擬文件系統上檢測到或訪問。建立設備一般是由Udev在引導過程當中完成的。由於這個新系統尚未Udev還沒有啓動,須要掛載和填充 /dev
手動。這是經過綁定安裝主機系統的 /dev
目錄中。綁定掛載是一種特殊類型的山,容許您建立一個鏡像的目錄或掛載點到其餘位置。使用如下命令來實現:
mount -v --bind /dev $LFS/dev
如今剩下的山虛擬內核文件系統:
mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run
開發的掛載選項的含義:
gid=5
這確保了全部devpts-created設備節點屬於5組ID。這是之後咱們將使用的ID tty
組。咱們使用組ID,而不是一個名字,由於主機系統可能使用不一樣的ID的 tty
組。
mode=0620
這確保了全部devpts-created設備節點模式0620(用戶可讀和可寫,集團可寫)。連同上面的選項,這將確保開發將建立設備節點,知足grantpt的要求(),這意味着Glibcpt_chown輔助二進制(默認不安裝)不是必需的。
在某些主機系統, /dev/shm
是一個符號連接呢 /run/shm
。/運行tmpfs上面安裝在這種狀況下只須要建立一個目錄。
if [ -h $LFS/dev/shm ]; then mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi
包管理是一個常常要求的LFS書籍。包管理器容許跟蹤的安裝文件便於拆卸和升級包。二進制文件和庫文件,安裝的軟件包管理器將處理配置文件。在你開始懷疑以前,這個部分將不討論也不推薦任何特定的軟件包管理器。它提供的是一個比較流行的技術和它們是如何工做的。完美的包管理器爲你可能在這些技術或可能的組合兩個或更多的這些技術。本節簡要提到升級包時可能出現的問題。
一些緣由沒有包管理器中提到的LFS BLFS或包括:並
處理包管理的目標將注意力從這些書如何構建Linux系統。
有多個解決方案包管理,各有其優勢和缺點。包括一個知足全部觀衆是很困難的。
有一些提示寫在包管理的主題。參觀提示項目看看其中一個適合您的須要。
包管理器很容易升級到新版本時釋放。BLFS一般LFS中的指令和書並能夠用來升級到新版本。這裏有一些點,你應該知道升級的包時,特別是在正在運行的系統。
若是須要升級到一個新版本,Glibc(例如,從Glibc 2.19 - 2.19到Glibc,重建LFS更安全。雖然你 可能能重建全部依賴的包訂單,咱們不推薦它。
若是一個包包含共享庫的更新,若是庫的名稱更改,那麼全部的包動態連接庫須要從新編譯連接的新圖書館。(注意,沒有相關性包版本和圖書館的名稱。)例如,考慮一個包foo-1.2.3,安裝一個共享庫的名字 libfoo.so.1
。說你的包升級到新版本foo-1.2.4,安裝一個共享庫的名字 libfoo.so.2
。在這種狀況下,全部的包都是動態連接的 libfoo.so.1
須要從新編譯連接 libfoo.so.2
。注意,您不該該刪除之前的圖書館,直到從新編譯依賴包。
如下是一些常見的包管理技術。包管理器在作決定以前,作一些研究各類技術,尤爲是特定方案的缺點。
是的,這是一個包管理技術。有些人找不到須要包管理器,由於他們知道緊密的包和知道文件是由每一個包安裝。一些用戶也不須要任何包管理,由於他們打算重建整個系統方案時改變。
這是一個簡單的包管理,不須要任何額外的包管理設施。每一個包是安裝在一個單獨的目錄中。例如,包安裝在foo - 1.1 /usr/pkg/foo-1.1
和一個符號連接是由 /usr/pkg/foo
來/usr/pkg/foo-1.1
。在安裝新版本foo - 1.2時,它是安裝在 /usr/pkg/foo-1.2
和前一個符號連接被新版本的符號連接。
環境變量,如 PATH
, LD_LIBRARY_PATH
, MANPATH
, INFOPATH
和 CPPFLAGS
須要擴大到包括 /usr/pkg/foo
。超過幾包,這個方案就變得難以管理。
這是前面的包管理技術的一種變體。每一個包安裝相似於前面的方案。相反的符號連接,每一個文件的符號連接到 /usr
層次結構。這消除了須要擴大環境變量。雖然用戶能夠建立符號連接的自動建立,許多包經理已經使用這種方法寫的。一些流行的包括Stow,Epkg,貪污和倉庫。
安裝須要僞造,因此包認爲它是安裝在 /usr
但在現實中它是安裝在 /usr/pkg
層次結構。以這種方式安裝一般不是一個微不足道的任務。例如,考慮你安裝一個包libfoo - 1.1。下面的說明可能不能正常安裝包:
./configure --prefix=/usr/pkg/libfoo/1.1 make make install
安裝工做,但依賴包可能不像你指望libfoo連接。若是你編譯一個包,對libfoo連接,您可能會注意到,有關 /usr/pkg/libfoo/1.1/lib/libfoo.so.1
而不是 /usr/lib/libfoo.so.1
如你所願。正確的方法是使用 DESTDIR
策略來假的安裝包。這種方法工做以下:
./configure --prefix=/usr make make DESTDIR=/usr/pkg/libfoo/1.1 install
大多數軟件包支持這種方法,可是有一些不。不一致的包,您可能須要手動安裝包中,或者你可能會發現更容易安裝一些有問題的包 /opt
.
在這種技術中,一個包的安裝以前文件時間戳。在安裝以後,一個簡單的使用 找到命令與適當的選項能夠生成一個日誌的全部文件建立時間戳文件後安裝。這種方法編寫的包管理器安裝日誌。
這個方案的優勢是簡單,可是它有兩個缺點。在安裝過程當中,若是文件安裝任何當前時間之外的時間戳,這些文件不會被追蹤的包管理器。同時,這個計劃時只能使用一個安裝包。日誌是不可靠的,若是兩個包被安裝在兩個不一樣的主機。
在這種方法中,安裝腳本的命令執行記錄。有兩個技術,一個能夠使用:
的 LD_PRELOAD
環境變量能夠設置爲指向一個庫加載安裝前。在安裝期間,這個庫跟蹤正在安裝的軟件包依附於各類可執行文件等 cp, 安裝, mv和跟蹤修改文件系統的系統調用。這種方法起做用,全部的可執行文件須要動態連接沒有suid和sgid位。預加載庫在安裝過程當中可能會致使一些沒必要要的反作用。所以,建議一個執行一些測試來確保包管理器不會破壞任何東西和日誌全部適當的文件。
第二個方法是使用 strace期間,記錄全部的系統調用的執行安裝腳本。
軟件包安裝在這個方案中,僞裝成一個單獨的樹描述的符號連接風格包管理。安裝後,使用安裝包建立存檔文件。這個檔案用於安裝包在本地機器上或甚至能夠被用來在其餘機器上安裝包。
這種方法使用的大多數軟件包管理器中發現的商業分佈。包經理,按照這種方法的例子是RPM(順便說一下,這是須要的Linux標準基礎規範)、pkg-utils Debian的貼切,Gentoo的運輸系統。一個提示描述如何採用這種風格的包管理對於LFS系統位於http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt.
建立包文件,包括依賴信息複雜,超出了LFS的範圍。
Slackware使用 焦油基於系統包檔案。這個系統故意不處理包依賴關係更復雜的軟件包管理器同樣。Slackware包管理的細節,請參閱http://www.slackbook.org/html/package-management.html.
LFS獨有的,這個方案是由馬提亞Benkmann,和可用的提示項目。在這個方案中,每一個包安裝做爲一個單獨的用戶到標準位置。屬於一個包的文件很容易被檢查用戶ID。這種方法的特色和缺點過於複雜來描述在這一節中。詳細信息請參閱暗示http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt.
LFS系統的優勢之一是,沒有文件,取決於一個磁盤上的文件系統的位置。克隆LFS構建到另外一臺計算機用一樣的架構爲基礎系統同樣簡單 焦油在LFS分區包含根目錄(大約250 mb未壓縮的基礎LFS版本),將文件經過網絡傳輸或光盤複製到新系統和擴大它。從這一點上,幾個配置文件將會被改變。可能須要更新的配置文件包括: /etc/hosts
, /etc/fstab
,/etc/passwd
, /etc/group
, /etc/shadow
, /etc/ld.so.conf
, /etc/sysconfig/rc.site
, /etc/sysconfig/network
, /etc/sysconfig/ifconfig.eth0
.
一個定製的內核可能須要創建新系統根據不一樣的系統硬件和原來的內核配置。
有一些報告問題之間複製時類似但不相同的架構。例如,Intel系統的指令集是不相同的AMD處理器和後版本的一些處理器指令早期版本中不可用。
最後新系統可引導經過8.4節,「使用GRUB引導過程設置」.
是時候開始進入chroot環境構建和安裝最後的LFS系統。做爲用戶 root
運行如下命令進入的領域,目前,填充只有暫時的工具:
chroot "$LFS" /tools/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='\u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ /tools/bin/bash --login +h
的 -i
選擇的 envchroot環境的命令將清除全部變量。以後,只有 HOME
, TERM
, PS1
, PATH
變量設置。的 TERM=$TERM
構建將設置 TERM
變量在chroot chroot外爲相同的值。此變量所需的程序 vim和 少正確運行。若是須要其餘變量,如 CFLAGS
或 CXXFLAGS
再次,這是一個好地方讓他們。
從這個角度,沒有須要使用 LFS
變量了,由於全部的工做將被限制在LFS文件系統。這是由於Bash shell是告知 $LFS
如今是根(/
)目錄。
請注意, /tools/bin
在去年 PATH
。這意味着一個臨時工具將再也不使用一次它的最終版本安裝。這發生在殼不 「還記得」執行的二進制文件的位置這個緣由,經過哈希是關閉 +h
選項bash.
請注意, bash提示會說 I have no name!
這是正常的,由於 /etc/passwd
文件還沒有建立。
重要的是,全部的命令在本章的其他部分和接下來的章節在chroot環境中運行。若是你由於任何緣由離開這個環境(例如重啓),確保虛擬內核文件系統安裝在解釋道6.2.2節,「安裝和填充/ dev」和6.2.3節」,愈來愈多的虛擬內核文件系統」並輸入chroot又在繼續安裝以前。
是時候LFS建立一些結構文件系統。建立一個標準目錄樹經過發出如下命令:
mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt} mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -v /usr/libexec mkdir -pv /usr/{,local/}share/man/man{1..8} case $(uname -m) in x86_64) mkdir -v /lib64 ;; esac mkdir -v /var/{log,mail,spool} ln -sv /run /var/run ln -sv /run/lock /var/lock mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}
目錄,默認狀況下,建立755年許可模式,但這是不可取的全部目錄。在上面的命令中,兩個變化作了一個用戶的主目錄 root
,另外一個爲臨時文件的目錄。
第一個模式更改不只確保任何人均可以進入 /root
目錄做爲一個普通用戶同樣與他或她的主目錄。第二個模式變化確保任何用戶均可以寫的 /tmp
和 /var/tmp
目錄,但不能刪除其餘用戶的文件。後者是所謂的禁止 「粘的,」最高的1777位元遮罩(1)。
基於文件系統的目錄樹層次結構(FHS)(能夠在標準https://wiki.linuxfoundation.org/en/FHS)。FHS還指定了可選的存在一些目錄等 /usr/local/games
和/usr/share/games
。咱們只建立所需的目錄。可是,能夠隨意建立這些目錄。
一些程序使用硬鏈接路徑項目不存在。爲了知足這些項目,建立一個符號連接的數量將會取代了真正的文件在本章的課程後,軟件已經安裝:
ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin ln -sv /tools/bin/{install,perl} /usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la ln -sv bash /bin/sh
每一個連接的目的:
/bin/bash
許多 bash腳本指定 /bin/bash
.
/bin/cat
這個路徑名被硬編碼到Glibc的配置腳本。
/bin/dd
的路徑 dd
將被硬編碼到嗎 /usr/bin/libtool
實用程序。
/bin/echo
這是知足一個Glibc的測試套件的測試,預計 /bin/echo
.
/usr/bin/install
的路徑 install
將被硬編碼到嗎 /usr/lib/bash/Makefile.inc
文件。
/bin/ln
的路徑 ln
將被硬編碼到嗎 /usr/lib/perl5/5.26.0/<target-triplet>/Config_heavy.pl
文件。
/bin/pwd
一些 配置腳本、尤爲是Glibc的路徑名硬編碼。
/bin/rm
的路徑 rm
將被硬編碼到嗎 /usr/lib/perl5/5.26.0/<target-triplet>/Config_heavy.pl
文件。
/bin/stty
這個路徑名被硬編碼到料,所以Binutils和GCC所需測試套件。
/usr/bin/perl
不少Perl腳本硬編碼這個路徑 perl程序。
/usr/lib/libgcc_s.so{,.1}
Glibc pthreads圖書館工做須要這個。
/usr/lib/libstdc++{,.6}
這是一些測試所需的Glibc的測試套件,以及在GMP c++支持。
/usr/lib/libstdc++.la
這能夠防止一個 /tools
參考,不然 /usr/lib/libstdc++.la
GCC後安裝。
/bin/sh
許多shell腳本硬編碼 /bin/sh
.
歷史上,Linux維護一個文件掛載的文件系統的列表 /etc/mtab
。現代內核維護該列表內部和暴露給用戶經過 /proc
文件系統。爲了知足實用程序指望的存在 /etc/mtab
,請建立如下符號連接:
ln -sv /proc/self/mounts /etc/mtab
爲了讓用戶 root
可以登陸和名字 「根」識別,必須有相關的條目 /etc/passwd
和 /etc/group
文件。
建立 /etc/passwd
文件經過運行下面的命令:
cat > /etc/passwd << "EOF" EOFroot:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false daemon:x:6:6:Daemon User:/dev/null:/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
實際的密碼 root
( 「x」這裏使用只是一個佔位符)稍後將被設置。
建立 /etc/group
文件經過運行下面的命令:
cat > /etc/group << "EOF" EOFroot:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: usb:x:14: cdrom:x:15: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: nogroup:x:99: users:x:999:
建立的組不屬於任何標準組決定在Udev配置的需求在這一章,和部分常見慣例受僱於一些現有的Linux發行版。此外,一些測試套件依賴特定用戶或組。Linux標準基地(LSB,可用http://www.linuxbase.org)建議,除了集團 root
和組ID(GID)0,一組 bin
1的GID。全部其餘的組名和GID由系統管理員能夠選擇自由自編寫良好的程序不依賴於GID編號,而是使用集團的名稱。
刪除 「我沒有名字!」提示,啓動一個新的shell。由於一個完整的安裝在Glibc第五章和 /etc/passwd
和 /etc/group
文件被建立,用戶名和組名稱解析將工做:
exec /tools/bin/bash --login +h
注意使用 +h
指令。這告訴 bash不使用其內部路徑散列。若是沒有這個指令, bash會記得執行二進制文件的路徑。確保使用新編譯的二進制文件就安裝, +h
指令將用於本章的持續時間。
的 登陸, agetty, 初始化程序(和其餘人)使用的日誌文件來記錄信息,如登陸到系統時。然而,這些程序不會寫入日誌文件是否已經不存在。初始化日誌文件,給他們適當的權限:
touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664 /var/log/lastlog chmod -v 600 /var/log/btmp
的 /var/log/wtmp
文件記錄全部登陸和註銷。的 /var/log/lastlog
文件記錄每一個用戶上次登陸。的 /var/log/faillog
文件記錄失敗的登陸嘗試。的 /var/log/btmp
文件記錄糟糕的登陸嘗試。
的 /run/utmp
當前登陸用戶的文件記錄。這個文件是動態建立的啓動腳本。
Linux內核API頭(linux-4.12.7.tar.xz)公開的API使用Glibc。
Linux內核須要公開的應用程序編程接口(API)系統的C庫(LFS Glibc)使用。這樣作是經過消毒各類C頭文件的Linux內核源代碼tarball。
確保周圍沒有過時的文件和依賴從先前的活動:
make mrproper
如今從源中提取用戶可見的內核頭文件。他們被放置在一箇中間本地目錄複製到所需的位置,由於提取過程在目標目錄中刪除任何現有的文件。也有一些隱藏文件使用的內核開發人員和不須要經過LFS從中間目錄中刪除。
make INSTALL_HDR_PATH=dest headers_install find dest/include \( -name .install -o -name ..install.cmd \) -delete cp -rv dest/include/* /usr/include
最後一次更新在
手冊頁包包含超過2200手冊頁。
安裝手冊頁經過運行:
make install
最後一次更新在
Glibc包包含主要的C庫。這個庫提供的基本例程分配內存,搜索目錄,打開和關閉文件、讀寫文件、字符串處理、模式匹配、算術等等。
Glibc構建系統是獨立的,並將安裝徹底,即便編譯器規格文件和連接器仍然指向 /tools
。規格和連接器沒法調整前的Glibc安裝,由於Glibc autoconf測試會給假的結果和擊敗的目標實現一個乾淨的構建。
Glibc的程序使用non-FHS compilant /var/db
目錄存儲運行時數據。應用如下補丁做出這樣程序運行時數據存儲在FHS-compliant位置:
patch -Np1 -i ../glibc-2.26-fhs-1.patch
首先建立一個符號連接的兼容性,避免引用/工具在咱們最後的glibc:
ln -sfv /tools/lib/gcc /usr/lib
肯定GCC包括LSB合規的目錄,並建立一個符號連接。此外,x86_64,建立一個兼容性動態加載程序正常工做所需的符號連接:
case $(uname -m) in i?86) GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/7.2.0/include ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3 ;; x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64 ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3 ;; esac
刪除一個文件,多是前一次構建遺留的嘗試:
rm -f /usr/include/limits.h
Glibc文檔建議建築Glibc專用的構建目錄:
mkdir -v build cd build
Glibc準備編譯:
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \ ../configure --prefix=/usr \ --disable-werror \ --enable-kernel=3.2 \ --enable-stack-protector=strong \ libc_cv_slibdir=/lib unset GCC_INCDIR
選項和新的配置參數的含義:
CC="gcc -isystem $GCC_INCDIR -isystem /usr/include"
設置gcc和系統包括目錄的位置避免引入無效路徑在調試符號。
--disable-werror
這個選項禁用-Werror選項傳遞給GCC。這是必要的,爲運行測試套件。
--enable-stack-protector=strong
這個選項增長系統安全性經過添加一個已知的金絲雀(一個隨機整數)堆棧在一個函數中,函數返回時,檢查它。若是它改變了,有一個堆棧溢出,程序停止。
libc_cv_slibdir=/lib
這個變量設置正確的圖書館系統。咱們不但願lib64使用。
編譯包:
make
在本節中,測試套件的Glibc被認爲是相當重要的。不要在任何狀況下跳過它。
通常幾個測試不經過,但你一般能夠忽略下面列出的任何測試失敗。如今測試構建結果:
make check
你可能會看到一些測試失敗。Glibc測試套件有點依賴主機系統。這是一個列表的最多見的問題對於LFS的一些版本:
posix / tst-getaddrinfo4和 posix / tst-getaddrinfo5架構可能會失敗。
的 rt / tst-cputimer1和 rt / tst-cpuclock2衆所周知,測試失敗。緣由不是徹底理解,但跡象代表,小時機能夠觸發這些失敗的問題。
數學測試有時失敗當系統上運行的CPU不是一個相對較新的英特爾或AMD處理器。
的 nptl / tst-thread-affinity - { pthread、pthread2 sched }測試可能失敗的緣由還沒有肯定。
其餘測試已知的失敗在一些架構malloc / tst-malloc-usable和nptl / tst-cleanupx4。
雖然這是一個無害的消息,Glibc的安裝階段將抱怨的缺失 /etc/ld.so.conf
。防止這個警告:
touch /etc/ld.so.conf
修復生成Makefile跳過一個uneeded完整性檢查失敗的LFS部分環境:
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
安裝包:
make install
安裝配置文件和運行時目錄 nscd:
cp -v ../nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd
接下來,安裝場所,能夠使系統響應在不一樣的語言。沒有一個地方是必需的,可是若是有些缺失,將來包將跳太重要的測試點的測試套件。
個別地區能夠安裝使用 localedef程序。如。,第一個 localedef下面的命令將 /usr/share/i18n/locales/cs_CZ
charset-independent語境的定義 /usr/share/i18n/charmaps/UTF-8.gz
charmap定義和附加結果 /usr/lib/locale/locale-archive
文件。下面的說明將安裝所需的最小區域設置的最優覆蓋測試:
mkdir -pv /usr/lib/locale localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030
此外,安裝現場爲本身的國家,語言和字符集。
另外,安裝中列出的全部地區 glibc-2.26/localedata/SUPPORTED
文件(它包括上面列出的每個地區和許多更多)在一次耗時的命令以下:
make localedata/install-locales
而後使用 localedef命令建立和安裝場所不列入 glibc-2.26/localedata/SUPPORTED
文件在不可能的狀況下你須要他們。
的 /etc/nsswitch.conf
須要建立文件由於Glibc違約不工做在網絡環境。
建立一個新文件 /etc/nsswitch.conf
經過運行如下:
cat > /etc/nsswitch.conf << "EOF" EOF# Begin /etc/nsswitch.conf passwd: files group: files shadow: files hosts: files dns networks: files protocols: files services: files ethers: files rpc: files # End /etc/nsswitch.conf
安裝和設置時區數據以下:
tar -xf ../../tzdata2017b.tar.gz ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right} for tz in etcetera southamerica northamerica europe africa antarctica \ asia australasia backward pacificnew systemv; do zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz} zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz} zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz} done cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO
珠海命令的意義:
zic -L /dev/null ...
這就產生了posix時區,沒有任何閏秒。把這些都是常規的 zoneinfo
和 zoneinfo/posix
。有必要把POSIX時區 zoneinfo
,不然各類測試套件將報告錯誤。在嵌入式系統中,空間緊張,你不打算更新時區,你能夠節省1.9 mb經過不使用 posix
目錄,可是一些應用程序或測試套件可能產生一些失敗。
zic -L leapseconds ...
這將建立正確的時區,包括閏秒。在嵌入式系統中,空間緊張,你不打算更新時區,或者關心正確的時間,你能夠節省1.9 mb的省略 right
目錄中。
zic ... -p ...
這將建立的 posixrules
文件。咱們使用紐約由於POSIX須要夏令時規則按照咱們的規則。
肯定當地時區的方法之一是運行如下腳本:
tzselect
回答幾個問題關於位置後,腳本將輸出時區的名稱(例如, 美國/埃德蒙頓)。也有一些其餘可能的時區中列出 /usr/share/zoneinfo
如 加拿大/東或 EST5EDT不肯定的腳本,但能夠使用。
而後建立 /etc/localtime
文件經過運行:
cp - v /usr/share/zoneinfo//etc/localtime<xxx>
取代 <xxx>
與時區選擇的名稱(如。加拿大/東部)。
默認狀況下,動態加載程序(/lib/ld-linux.so.2
)經過搜索 /lib
和 /usr/lib
所須要的動態庫程序運行。然而,若是有圖書館目錄以外 /lib
和 /usr/lib
這些須要被添加到 /etc/ld.so.conf
文件動態加載程序爲了找到他們。兩個目錄,一般包含額外的庫 /usr/local/lib
和 /opt/lib
,因此這些目錄添加到動態加載程序的搜索路徑。
建立一個新文件 /etc/ld.so.conf
經過運行如下:
cat > /etc/ld.so.conf << "EOF" EOF# Begin /etc/ld.so.conf /usr/local/lib /opt/lib
若是須要,動態加載程序也能夠搜索一個目錄和包含的內容文件。通常包括目錄中的文件的一行指定所需的庫路徑。添加此功能運行如下命令:
cat >> /etc/ld.so.conf << "EOF" EOF mkdir -pv /etc/ld.so.conf.d# Add an include directory include /etc/ld.so.conf.d/*.conf
能夠用來建立一個堆棧跟蹤當程序終止段錯誤 |
|
生成消息目錄 |
|
顯示系統配置文件系統特定的變量的值 |
|
從行政數據庫條目 |
|
執行字符集轉換 |
|
建立fastload iconv模塊配置文件 |
|
配置動態連接器運行時綁定 |
|
報告每一個給定的程序或共享庫所須要的共享庫 |
|
次助攻 ldd與對象文件 |
|
打印當前語言環境的各類信息 |
|
編譯語言環境規範 |
|
建立一個簡單的數據庫從文本輸入 |
|
讀取和解釋一個內存跟蹤文件並顯示總結人類可讀的格式 |
|
一個守護進程,它提供了最多見的名字服務請求的緩存 |
|
運行的進��所使用的動態共享對象列表 |
|
一個靜態連接的 ln程序 |
|
共享庫過程調用指定命令的痕跡 |
|
讀取和顯示共享對象分析數據 |
|
問用戶的位置對應的時區描述系統和報告 |
|
跟蹤程序執行的打印當前執行的函數 |
|
時區翻斗車 |
|
時區編譯器 |
|
輔助項目共享庫的可執行文件 |
|
內部使用Glibc的總值破碎的項目(如黑客。,一些主題運行的應用程序)。看到評論 |
|
段錯誤信號處理器,使用 catchsegv |
|
異步名稱查找圖書館 |
|
主要的C庫 |
|
內部使用Glibc處理國際化域名的 |
|
加密庫 |
|
動態連接庫的接口 |
|
虛擬圖書館不含功能。之前是一個運行時庫 g + + |
|
連接在此模塊部隊錯誤處理規則數學函數定義的電氣和電子工程師協會(IEEE)。缺省值是POSIX。1錯誤處理 |
|
數學庫 |
|
打開內存分配與時檢查 |
|
所使用的 memusage幫助收集程序的內存使用的信息 |
|
網絡服務庫 |
|
名稱服務切換庫,包含函數解析主機名、用戶名、組名稱、別名、服務、協議等。 |
|
POSIX線程庫 |
|
包含函數用於建立、發送和解釋包互聯網域名服務器 |
|
包含功能提供雜項RPC服務 |
|
包含功能提供大部分的POSIX指定的接口。1 b實時擴展 |
|
包含多線程程序的功能很是有用的調試器 |
|
包含代碼 「標準」函數中使用許多不一樣的Unix實用工具 |
最後一次更新在
如今最後的C庫安裝了,是時候調整工具鏈,這樣它將鏈接任何新編譯程序對這些新的庫。
首先,備份 /tools
連接器,代之以調整連接器在第5章。咱們還將建立一個對應的連接 /tools/$(uname -m)-pc-linux-gnu/bin
:
mv -v /tools/bin/{ld,ld-old} mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old} mv -v /tools/bin/{ld-new,ld} ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld
接下來,修改GCC規格文件,以便它指向新的動態連接器。簡單地刪除的全部實例 「/工具」應該留給咱們的正確路徑動態連接器。也調整規格文件,以便GCC知道在哪裏能夠找到正確的標題和Glibc啓動文件。一個 sed命令完成:
gcc -dumpspecs | sed -e 's@/tools@@g' \ -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \ -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \ `dirname $(gcc --print-libgcc-file-name)`/specs
是個好主意視覺檢查規格文件來驗證預期的變化其實是。
必須在這一點上,確保基本功能(調整工具鏈編譯和連接)是按預期工做。爲此,執行如下健康檢查:
echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
應該沒有錯誤,和最後一個命令的輸出將(容許特定於平臺的動態連接器的不一樣名稱):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
注意,在64位系統上 /lib
是咱們的動態連接器的位置,而是經過一個符號連接/ lib64訪問。
在32位系統上應該/lib/ld-linux.so.2解釋器。
確保咱們設置使用正確的啓動文件:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
最後一個命令的輸出應該是:
/usr/lib/../lib/crt1.o succeeded /usr/lib/../lib/crti.o succeeded /usr/lib/../lib/crtn.o succeeded
驗證編譯器尋找正確的頭文件:
grep -B1 '^ /usr/include' dummy.log
這個命令應該返回如下輸出:
#include <...> search starts here: /usr/include
接下來,驗證新連接器使用正確的搜索路徑:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
引用路徑與「-linux-gnu」組件應該被忽略,可是最後一個命令的輸出應該是:
SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")
下一個確保咱們使用正確的libc:
grep "/lib.*/libc.so.6 " dummy.log
最後一個命令的輸出應該是:
attempt to open /lib/libc.so.6 succeeded
最後,確保使用正確的GCC動態連接器:
grep found dummy.log
最後一個命令的輸出應該(容許特定於平臺的動態連接器的不一樣名稱):
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2
若是輸出沒有出現如上所示仍是沒有收到,而後是嚴重錯誤的。調查和追溯的步驟找出問題並糾正它。最可能的緣由是,調整與規範文件出現了錯誤。任何問題須要解決在繼續以前的過程。
一旦一切都是正常工做,清理測試文件:
rm -v dummy.c a.out dummy.log
Zlib壓縮和解壓縮包中包含一些程序所使用的例程。
Zlib準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
共享庫須要搬到 /lib
,結果 .so
文件中 /usr/lib
須要從新建立:
mv -v /usr/lib/libz.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
最後一次更新在
文件包包含一個實用工具來肯定一個給定的文件或文件的類型。
準備文件進行編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
Readline包是一組庫提供了命令行編輯和歷史功能。
從新安裝Readline會致使舊的圖書館搬到< libraryname > .old。雖然這一般不是一個問題,在某些狀況下,它能夠觸發一個連接錯誤 ldconfig。這能夠避免經過發出如下兩個種子:
sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install
Readline準備編譯:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/readline-7.0
編譯包:
make SHLIB_LIBS="-L/tools/lib -lncursesw"
使選項的含義:
SHLIB_LIBS="-L/tools/lib -lncursesw"
這個選項Readline連接反對力量 libncursesw
圖書館。
這個包不有一個測試套件。
安裝包:
make SHLIB_LIBS="-L/tools/lib -lncurses" install
如今將動態庫移動到一個更合適的位置並修復了一些符號連接:
mv -v /usr/lib/lib{readline,history}.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.so ln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so
若是須要,安裝文檔:
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-7.0
最後一次更新在
M4包包含一個宏處理器。
M4準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
Bc包包含一個任意精度數值處理語言。
首先,改變內部腳本使用 sed而不是 艾德:
cat > bc/fix-libmath_h << "EOF" #! /bin/bash sed -e '1 s/^/{"/' \ -e 's/$/",/' \ -e '2,$ s/^/"/' \ -e '$ d' \ -i libmath.h sed -e '$ s/$/0}/' \ -i libmath.h EOF
建立臨時符號連接的包能夠找到readline庫並確認其所需libncurses圖書館是可用的。即便/工具/ lib中的庫是在這一點上,該系統將在本章的最後使用特性。
ln -sv /tools/lib/libncursesw.so.6 /usr/lib/libncursesw.so.6 ln -sfv libncurses.so.6 /usr/lib/libncurses.so
修復的問題 配置因爲在LFS的早期階段丟失的文件:
sed -i -e '/flex/s/as_fn_error/: ;; # &/' configure
公元前準備編譯:
./configure --prefix=/usr \ --with-readline \ --mandir=/usr/share/man \ --infodir=/usr/share/info
配置選項的含義:
--with-readline
這個選項告訴Bc使用 readline
圖書館已經安裝在系統上,而不是使用本身的readline版本。
編譯包:
make
公元前測試,運行下面的命令。有至關多的輸出,因此你可能想要把輸出重定向到一個文件。有一個很是小的比例的測試(10 12144),將顯示一個圓滑錯誤在最後數字。
echo "quit" | ./bc/bc -l Test/checklib.b
安裝包:
make install
最後一次更新在
Binutils包包含一個連接,一個彙編程序,和其餘工具來處理對象文件。
驗證企業是否正常工做在chroot環境中經過執行一個簡單的測試:
expect -c "spawn ls"
這個命令應該輸出以下:
spawn ls
相反,若是輸出包括如下消息,那麼環境不創建適當的企業操做。這個問題須要解決在運行測試套件以前Binutils和GCC:
The system has no more ptys. Ask your system administrator to create more.
Binutils文檔建議建築Binutils專用的構建目錄:
mkdir -v build cd build
Binutils準備編譯:
../configure --prefix=/usr \ --enable-gold \ --enable-ld=default \ --enable-plugins \ --enable-shared \ --disable-werror \ --with-system-zlib
配置參數的含義:
--enable-gold
創建黃金連接器和安裝它ld.gold(默認連接器)。
--enable-ld=default
創建最初的快速公車提供連接器和安裝它ld(默認連接器)和ld.bfd。
--enable-plugins
使插件支持連接器。
--with-system-zlib
使用安裝zlib庫而不是建築包括版本。
編譯包:
make tooldir=/usr
使參數的含義:
tooldir=/usr
一般,tooldir(可執行文件的目錄最終將位於)設置 $(exec_prefix)/$(target_alias)
。例如,x86_64機器將擴大 /usr/x86_64-unknown-linux-gnu
。由於這是一個定製的系統,這種有針對性的目錄 /usr
不是必需的。 $(exec_prefix)/$(target_alias)
若是系統被用來保存��用(例如,編譯一個包在一個英特爾機器生成的代碼,能夠在PowerPC機器上執行)。
Binutils測試套件的這一部分被認爲是相當重要的。在任何狀況下不要跳過它。
測試結果:
make -k check
一個測試,debug_msg。sh,失敗。
安裝包:
make tooldir=/usr install
翻譯程序地址文件名和行號;給定一個地址和一個可執行的名稱,它使用調試信息的可執行文件,以肯定哪些源文件和行號與地址相關聯 |
|
建立、修改和提取物檔案 |
|
一個組裝的輸出的彙編程序 海灣合做委員會成目標文件 |
|
鏈接器用來de-mangle c++和Java符號和防止重載函數發生衝突 |
|
更新精靈ELF文件的標題 |
|
顯示調用圖配置文件數據 |
|
一個連接器相結合的對象和歸檔文件到一個文件,將它們的數據和捆綁符號引用 |
|
下降版本只支持的ld elf對象文件格式 |
|
硬連接 ld |
|
列出了符號發生在一個給定的對象文件 |
|
翻譯一個文件到另外一個類型的對象 |
|
顯示給定對象的信息文件,選項控制特定信息顯示;顯示的信息是有用的程序員正在編譯工具 |
|
生成一個索引的內容存檔並將其存儲在存檔;定義的索引列表的全部符號歸檔成員可重定位的目標文件 |
|
顯示有關精靈的信息類型的二進制文件 |
|
列出了部分尺寸和給定的對象文件的總大小 |
|
輸出,對於每一個給定的文件,可打印字符的序列至少指定的長度(4)違約;對象文件,打印,默認狀況下,只有字符串的初始化和加載部分其餘類型的文件時,它會掃描整個文件 |
|
丟棄對象文件的符號 |
|
二進制文件描述符的圖書館 |
|
一個庫來處理opcodes-the 「可讀的文本」版本的處理器指令;它是用於構建實用程序 objdump |
最後一次更新在
GMP包包含數學庫。這些有用的高精度計算的功能。
若是你正在構建32位x86,但你有一個CPU運行64位代碼的能力 和你有指定的 CFLAGS
在環境中,configure腳本將嘗試配置64 -位和失敗。避免這種狀況經過調用下面的配置命令
。/配置……ABI=32
GMP生產庫的默認設置爲主機處理器優化。若是庫適合處理器能力低於所需的主機的CPU,通用庫能夠經過運行下面的建立:
cp -v configfsf.guess config.guess cp -v configfsf.sub config.sub
GMP準備編譯:
./configure --prefix=/usr \ --enable-cxx \ --disable-static \ --docdir=/usr/share/doc/gmp-6.1.2
新的配置選項的含義:
--enable-cxx
該參數使c++支持
--docdir=/usr/share/doc/gmp-6.1.2
這個變量指定了正確的文檔。
編譯包和生成HTML文檔:
make make html
測試套件的GMP在本節中被認爲是相當重要的。在任何狀況下不要跳過它。
測試結果:
make check 2>&1 | tee gmp-check-log
gmp中的代碼是高度優化的處理器建造的地方。偶爾,檢測處理器識別錯系統功能的代碼和測試中會有錯誤或其餘應用程序使用的gmp庫消息「非法指令」。在這種狀況下,gmp應配置選項——構建= x86_64-unknown-linux-gnu和重建。
確保全部190年測試套件測試經過。檢查結果經過發出如下命令:
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
安裝包和它的文檔:
make install make install-html
最後一次更新在
MPFR包包含多個精確數學的函數。
MPFR準備編譯:
./configure --prefix=/usr \ --disable-static \ --enable-thread-safe \ --docdir=/usr/share/doc/mpfr-3.1.5
編譯包和生成HTML文檔:
make make html
MPFR測試套件的這一部分被認爲是相當重要的。在任何狀況下不要跳過它。
測試結果並確保全部測試經過:
make check
安裝包和它的文檔:
make install make install-html
最後一次更新在
MPC包包含一個庫複數的運算與任意精度高和正確的結果四捨五入。
英國央行貨幣政策委員會準備編譯:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/mpc-1.0.3
編譯包和生成HTML文檔:
make make html
測試結果,問題:
make check
安裝包和它的文檔:
make install make install-html
最後一次更新在
GCC包包含GNU編譯器集合,包括C和c++編譯器。
若是基於x86_64,改變默認的64位庫目錄名稱 「自由」:
case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' \ -i.orig gcc/config/i386/t-linux64 ;; esac
刪除以前建立的符號連接做爲最終gcc包括將安裝:
rm -f /usr/lib/gcc
GCC文檔建議構建GCC在一個專用的構建目錄:
mkdir -v build cd build
準備GCC編譯:
SED=sed \ ../configure --prefix=/usr \ --enable-languages=c,c++ \ --disable-multilib \ --disable-bootstrap \ --with-system-zlib
請注意,對於其餘語言,有一些還沒有公佈的先決條件。看到BLFS書說明如何構建全部的GCC支持的語言。
新的配置參數的含義:
SED=sed
設置環境變量能夠防止一個硬編碼的路徑/工具/ bin / sed。
--with-system-zlib
這個開關告訴GCC連接到系統安裝Zlib庫的副本,而不是本身內部的副本。
編譯包:
make
在本節中,GCC的測試套件被認爲是相當重要的。不要在任何狀況下跳過它。
在GCC測試套件是一組測試排氣堆棧,因此增長堆棧大小以前運行測試:
ulimit -s 32768
測試結果,但不要停在錯誤:
make -k check
接收測試套件的總結結果,運行:
../contrib/test_summary
的總結,管的輸出 grep -A7 Summ
.
結果能夠與那些位於http://www.linuxfromscratch.org/lfs/build-logs/8.1/和http://gcc.gnu.org/ml/gcc-testresults/.
一些意想不到的失敗老是沒法避免。GCC開發人員一般是意識到這些問題,但沒有解決。特別是,五libstdc + +測試套件的測試失敗做爲根用戶運行時被稱爲咱們這裏所作的。除非測試結果有很大的不一樣從那些在上述URL,它是安全的繼續。
在一些內核配置的組合和AMD處理器可能有超過1100失敗在gcc。目標/ i386 / mpx測試(這是爲了測試mpx選擇最新的英特爾處理器)。這些能夠安全地忽略AMD處理器。
安裝包:
make install
建立一個符號連接的要求FHS「歷史」的緣由。
ln -sv ../usr/bin/cpp /lib
許多軟件包使用這個名字 cc調用C編譯器。爲了知足這些包,建立一個符號連接:
ln -sv gcc /usr/bin/cc
添加一個兼容性符號連接,使建築項目與連接時優化(維度):
install -v -dm755 /usr/lib/bfd-plugins ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/7.2.0/liblto_plugin.so \ /usr/lib/bfd-plugins/
如今咱們最後的工具鏈,重要的是再次確保編譯和連接��正常工做。咱們經過執行相同的健康檢查咱們早些時候章:
echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'
應該沒有錯誤,和最後一個命令的輸出將(容許特定於平臺的動態連接器的不一樣名稱):
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
確保咱們設置使用正確的啓動文件:
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
最後一個命令的輸出應該是:
/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crt1.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crti.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crtn.o succeeded
根據你的機器架構,上面可能會略有不一樣,區別一般後目錄的名稱 /usr/lib/gcc
。最重要的是 海灣合做委員會發現這三個 crt*.o
下的文件 /usr/lib
目錄中。
驗證編譯器尋找正確的頭文件:
grep -B4 '^ /usr/include' dummy.log
這個命令應該返回如下輸出:
#include <...> search starts here: /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include /usr/local/include /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include-fixed /usr/include
再次注意,目錄命名你的目標三聯體可能和上面的不一樣,取決於您的體系結構。
安裝版本4.3.0,GCC如今無條件安裝 limits.h
文件到私人 include-fixed
目錄,目錄必須到位。
接下來,驗證新連接器使用正確的搜索路徑:
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
引用路徑與「-linux-gnu」組件應該被忽略,可是最後一個命令的輸出應該是:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64") SEARCH_DIR("/usr/lib64") SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");
一個32位的系統可能會看到一些不一樣的目錄。例如,下面是一個i686機器的輸出:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32") SEARCH_DIR("/usr/local/lib32") SEARCH_DIR("/lib32") SEARCH_DIR("/usr/lib32") SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");
下一個確保咱們使用正確的libc:
grep "/lib.*/libc.so.6 " dummy.log
最後一個命令的輸出應該是:
attempt to open /lib/libc.so.6 succeeded
最後,確保使用正確的GCC動態連接器:
grep found dummy.log
最後一個命令的輸出應該(容許特定於平臺的動態連接器的不一樣名稱):
found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2
若是輸出沒有出現如上所示仍是沒有收到,而後是嚴重錯誤的。調查和追溯的步驟找出問題並糾正它。最可能的緣由是,調整與規範文件出現了錯誤。任何問題須要解決在繼續以前的過程。
一旦一切都是正常工做,清理測試文件:
rm -v dummy.c a.out dummy.log
最後,把錯誤的文件:
mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
c++編譯器 |
|
C編譯器 |
|
C預處理器;它使用編譯器擴大# include,#定義、源文件和相似的語句 |
|
c++編譯器 |
|
C編譯器 |
|
一個包裝 基於「增大化現實」技術將插件添加到命令行中。這個程序只是用於添加」連接優化」並非有用的用默認構建選項 |
|
一個包裝 納米將插件添加到命令行中。這個程序只是用於添加」連接優化」並非有用的用默認構建選項 |
|
一個包裝 ranlib將插件添加到命令行中。這個程序只是用於添加」連接優化」並非有用的用默認構建選項 |
|
一個覆蓋測試工具;它是用來分析程序來肯定優化最具效果 |
|
洗手液運行時庫的地址 |
|
包含運行時支持 海灣合做委員會 |
|
這個庫在程序當GCC有關指示,使分析 |
|
GNU的OpenMP API實現多平臺共享內存並行編程在C / c++和Fortran |
|
包含各類GNU計劃使用的例程,包括 getopt, obstack會, strerror, strtol, strtoul |
|
GCC的連接時優化(LTO)插件讓GCC跨編譯單元進行優化 |
|
GCC四精確數學庫的API |
|
包含程序支持GCC的stack - smashing保護功能 |
|
標準c++庫 |
|
提供平常支持c++編程語言 |
|
洗手液的線程運行時庫 |
最後一次更新在
Bzip2包包含壓縮和解壓文件的程序。壓縮的文本文件 bzip2產生一個更好的壓縮比與傳統的比例 gzip.
應用補丁,安裝這個包的文檔:
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
下面的命令確保安裝符號連接是相對的:
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
確保手冊頁安裝到正確的位置:
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
Bzip2準備編譯:
make -f Makefile-libbz2_so make clean
使參數的含義:
-f Makefile-libbz2_so
這將致使Bzip2建成使用不一樣 Makefile
文件,在這種狀況下 Makefile-libbz2_so
文件,該文件建立一個動態的 libbz2.so
庫和連接Bzip2公用事業。
編譯和測試包:
make
安裝程序:
make PREFIX=/usr install
安裝共享 bzip2二進制的 /bin
目錄,進行一些必要的符號連接,和清理:
cp -v bzip2-shared /bin/bzip2 cp -av libbz2.so* /lib ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so rm -v /usr/bin/{bunzip2,bzcat,bzip2} ln -sv bzip2 /bin/bunzip2 ln -sv bzip2 /bin/bzcat
最後一次更新在
pkg-config包包含一個工具,經過包括路徑和/或庫路徑在配置和構建工具使文件執行。
Pkg-config準備編譯:
./configure --prefix=/usr \ --with-internal-glib \ --disable-host-tool \ --docdir=/usr/share/doc/pkg-config-0.29.2
新的配置選項的含義:
--with-internal-glib
這將容許pkg-config使用其內部版本Glib由於外部LFS版本不可用。
--disable-host-tool
這個選項禁用無用的建立硬連接到pkg-config程序。
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
Ncurses包包含庫terminal-independent處理字符的屏幕。
不安裝一個靜態庫,不是由配置:
sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in
Ncurses準備編譯:
./configure --prefix=/usr \ --mandir=/usr/share/man \ --with-shared \ --without-debug \ --without-normal \ --enable-pc-files \ --enable-widec
新的配置選項的含義:
--enable-widec
這個開關會致使寬度字符庫(例如, libncursesw.so.6.0
)創建而不是正常的(例如, libncurses.so.6.0
)。這些寬度字符庫可用在多字節和傳統的8位地區,而正常庫只在8位場所正常工做。寬字符和正常庫源代碼兼容,但不是二進制兼容的。
--enable-pc-files
這個開關生成並安裝。爲pkg-config電腦文件。
--without-normal
這個開關禁用構建和安裝大多數靜態庫。
編譯包:
make
這個包有一個測試套件,但它只能包已經安裝後運行。測試中駐留 test/
目錄中。看到 README
該目錄中的文件爲進一步的細節。
安裝包:
make install
移動的共享庫 /lib
目錄,預計他們將駐留的地方:
mv -v /usr/lib/libncursesw.so.6* /lib
由於圖書館移動,一個符號連接指向一個不存在的文件。重建:
ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
許多應用程序仍預計連接器可以找到non-wide-character Ncurses庫。欺騙這樣的應用程序與寬度字符庫連接的符號連接和連接器腳本:
for lib in ncurses form panel menu ; do rm -vf /usr/lib/lib${lib}.so echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc done
最後,確保尋找舊的應用程序 -lcurses
在構建時仍能夠建造的:
rm -vf /usr/lib/libcursesw.so echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so ln -sfv libncurses.so /usr/lib/libcurses.so
若是須要,安裝Ncurses文檔:
mkdir -v /usr/share/doc/ncurses-6.0 cp -v -R doc/* /usr/share/doc/ncurses-6.0
上面的指令不建立non-wide-character Ncurses圖書館由於沒有包安裝編譯源代碼將在運行時連接攻擊他們。然而,惟一已知的二進制只讀應用程序符合連接對non-wide-character Ncurses庫須要版本5。若是你必須有這樣的圖書館由於某些二進制只讀應用程序或符合LSB,符合構建包再次與如下命令:
make distclean ./configure --prefix=/usr \ --with-shared \ --without-normal \ --without-debug \ --without-cxx-binding \ --with-abi-version=5 make sources libs cp -av lib/lib*.so.5* /usr/lib
termcap描述轉換成terminfo描述 |
|
清除屏幕,若是可能的話 |
|
比較或打印出terminfo描述 |
|
terminfo描述轉換成termcap描述 |
|
爲ncurses提供配置信息 |
|
從新啓動一個終端的默認值 |
|
清除並設置製表符設置終端 |
|
terminfo entry-description編譯器,terminfo文件從源格式轉換爲所需的二進制格式ncurses庫例程(terminfo文件包含信息在某個終端的功能。) |
|
列出了全部可用的終端類型,給主名稱和描述 |
|
使terminal-dependent功能的值可用於殼;它也能夠用於重置或初始化一個終端或報告其長名稱 |
|
能夠用來初始化終端 |
|
的連接 |
|
包含函數來顯示文本終端屏幕上在許多複雜的方式;使用這些函數的一個很好的例子是在內核的菜單顯示 使menuconfig |
|
包含功能實現形式 |
|
包含實現菜單功能 |
|
包含函數來實現板 |
最後一次更新在
attr包包含公用事業管理文件系統對象的擴展屬性。
修改的文檔目錄,以便它是版本目錄:
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
防止安裝已經安裝的手冊頁 man pages
包:
sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile
修復一個問題在測試過程引發的變化在perl - 5.26:
sed -i 's:{(:\\{(:' test/run
準備Attr編譯:
./configure --prefix=/usr \ --bindir=/bin \ --disable-static
編譯包:
make
測試須要運行在一個文件系統,支持擴展屬性如ext二、ext三、或ext4文件系統。測試也稱失敗若是同時運行多個測試(大於1 - j選項)。測試結果,問題:
make -j1 tests root-tests
安裝包:
make install install-dev install-lib chmod -v 755 /usr/lib/libattr.so
共享庫須要搬到 /lib
,結果 .so
文件中 /usr/lib
須要從新建立:
mv -v /usr/lib/libattr.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so
最後一次更新在
Acl包包含公用事業管理訪問控制列表,用於定義更細粒度的可自由支配的文件和目錄的訪問權限。
修改的文檔目錄,以便它是版本目錄:
sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in
解決一些破碎的測試:
sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test
修復一個問題在測試過程引發的變化在perl - 5.26:
sed -i 's/{(/\\{(/' test/run
此外,修復一個缺陷的緣由 getfacl - e段錯誤過於長組名稱:
sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);" \ libacl/__acl_to_any_text.c
Acl準備編譯:
./configure --prefix=/usr \ --bindir=/bin \ --disable-static \ --libexecdir=/usr/lib
編譯包:
make
Acl測試須要運行在一個文件系統,支持訪問控制 Coreutils已建成的Acl庫。若是須要,回到這個包和運行 使j - 1的測試後 Coreutils是創建在本章後面。
安裝包:
make install install-dev install-lib chmod -v 755 /usr/lib/libacl.so
共享庫須要搬到 /lib
,結果 .so
文件中 /usr/lib
須要從新建立:
mv -v /usr/lib/libacl.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so
最後一次更新在
從googlecode得到Libcap包實現了用戶空間接口的POSIX 1003.1 Linux內核中的可用功能。這些功能分區的全部強大的根特權爲一組不一樣的特權。
防止一個靜態庫安裝:
sed -i '/install.*STALIBNAME/d' libcap/Makefile
編譯包:
make
這個包不有一個測試套件。
安裝包:
make RAISE_SETFCAP=no lib=lib prefix=/usr install chmod -v 755 /usr/lib/libcap.so
使選項的含義:
RAISE_SETFCAP=no
這個參數跳過試圖使用 setcap在自己。這避免了安裝偏差若是內核或文件系統不支持擴展功能。
lib=lib
這個參數安裝的圖書館 $prefix/lib
而不是 $prefix/lib64
x86_64。它沒有x86上的效果。
共享庫須要搬到 /lib
,結果 .so
文件中 /usr/lib
須要從新建立:
mv -v /usr/lib/libcap.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so
最後一次更新在
Sed包包含一個流編輯器。
首先解決一個問題在LFS環境和刪除一個失敗的測試:
sed -i 's/usr/tools/' build-aux/help2man sed -i 's/testsuite.panic-tests.sh//' Makefile.in
Sed準備編譯:
./configure --prefix=/usr --bindir=/bin
編譯包和生成HTML文檔:
make make html
測試結果,問題:
make check
安裝包和它的文檔:
make install install -d -m755 /usr/share/doc/sed-4.4 install -m644 doc/sed.html /usr/share/doc/sed-4.4
最後一次更新在
影子包包含項目以安全的方式來處理密碼。
若是你想執行使用強密碼,請參考http://www.linuxfromscratch.org/blfs/view/8.1/postlfs/cracklib.html安裝前CrackLib建築的影子。而後添加 --with-libcrack
到 配置下面的命令。
禁用的安裝 組程序和它的手冊頁,Coreutils提供了一個更好的版本。也防止安裝手冊頁,已經安裝的 man pages
包:
sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
而不是使用默認的 地下室方法,使用更安全 sha - 512密碼加密的方法還容許密碼超過8個字符。也有必要改變過期了 /var/spool/mail
位置陰影使用默認用戶郵箱 /var/mail
目前使用的位置:
sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \ -e 's@/var/spool/mail@/var/mail@' etc/login.defs
若是你選擇與Cracklib創建陰影的支持,運行如下:
sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs
作一個小改變讓默認useradd符合LFS組文件:
sed -i 's/1000/999/' etc/useradd
影子準備編譯:
./configure --sysconfdir=/etc --with-group-name-max-length=32
配置選項的含義:
--with-group-name-max-length=32
最大的用戶名是32個字符。使最大組名稱相同。
編譯包:
make
這個包不有一個測試套件。
安裝包:
make install
錯誤的程序移動到適當的位置:
mv -v /usr/bin/passwd /bin
這個包包含工具添加、修改和刪除用戶和組;設置和修改本身的密碼;並執行其餘管理任務。對於一個完整的解釋 密碼陰影意思,看 doc/HOWTO
文件打開源代碼樹中。若是使用影子的支持,請記住,程序,須要驗證密碼(顯示經理、FTP程序pop3守護進程,等等)必須Shadow-compliant。也就是說,他們須要可以處理跟蹤密碼。
運行如下命令來啓用跟蹤密碼:
pwconv
啓用跟蹤組密碼,運行:
grpconv
影子股票配置 useradd實用程序有幾個事項須要一些解釋。首先,默認動做 useradd效用是建立用戶和組的名稱相同的用戶。默認的用戶ID(UID)和組ID(GID)數量將從1000年開始。這意味着若是你不傳遞參數 useradd,每一個用戶將系統上的一個獨特的組的成員。若是這種行爲是不可取的,你須要經過 -g
參數 useradd。存儲在默認的參數/etc/default/useradd
文件。您可能須要修改兩個參數在此文件來知足您的特定需求。
/etc/default/useradd
參數解釋
GROUP=1000
該參數集的開始集團所屬中使用的數字文件。你能夠修改你的慾望。請注意, useradd永遠不會重用一個UID或GID。若是使用該參數肯定人數,它將使用下一個可用的數量。還請注意,若是你沒有一組1000年第一次在您的系統上使用 useradd沒有 -g
參數,你會獲得一個信息顯示在終端上,說: useradd: unknown GID 1000
。你能夠忽略這個消息將使用和組1000號。
CREATE_MAIL_SPOOL=yes
這個參數會致使 useradd建立一個郵箱文件爲新建立的用戶。 useradd將使集團擁有這個文件嗎 mail
集團擁有0660權限。若是你但願這些郵箱文件不是由 useradd,發出如下命令:
sed -i 's/yes/no/' /etc/default/useradd
爲用戶選擇一個密碼 根,經過運行:
passwd root
用於更改的密碼更改之間的最大天數 |
|
用於更改用戶的全名和其餘信息 |
|
用於更新組密碼以批處理模式 |
|
用於更新用戶密碼以批處理模式 |
|
用於更改用戶的默認登陸shell |
|
檢查和執行當前的密碼過時策略 |
|
用於檢查登陸失敗的日誌,設定一個最大數量的失敗以前一個賬戶阻塞,或重置失敗數 |
|
用於添加和刪除會員和管理員組 |
|
建立一個組的名字 |
|
刪除給定名稱的組 |
|
容許用戶管理他/她本身的組成員列表沒有超級用戶權限的要求。 |
|
用於修改給定的組織的名稱或GID嗎 |
|
驗證組文件的完整性 |
|
建立或更新影子組文件從正常組文件 |
|
更新 |
|
報告最近登陸的全部用戶或一個給定的用戶 |
|
使用系統讓用戶登陸嗎 |
|
守護程序用於執行限制登陸時間和港口嗎 |
|
用於設置用戶名稱空間的gid映射 |
|
是用來改變當前GID在一個登陸會話嗎 |
|
用於設置用戶的uid映射名稱空間 |
|
用於建立或更新整個系列的用戶賬戶 |
|
顯示一個消息,一個帳戶不可用;它被設計用做默認的shell的帳戶被禁用 |
|
是用來改變一個用戶或組賬戶的密碼嗎 |
|
驗證密碼文件的完整性 |
|
建立或更新的影子口令文件正常的密碼文件 |
|
更新 |
|
執行一個給定的命令在用戶給定組的GID將 |
|
運行一個殼替代用戶和組id |
|
用給定的名稱建立一個新用戶,或更新後默認的新信息 |
|
刪除給定的用戶賬戶 |
|
用於修改給定用戶的登陸名稱,用戶標識(UID)、殼牌、初始羣體,主目錄等。 |
|
編輯 |
|
編輯 |
最後一次更新在
Psmisc包包含程序顯示正在運行的進程的信息。
Psmisc準備編譯:
./configure --prefix=/usr
編譯包:
make
這個包不有一個測試套件。
安裝包:
make install
最後,移動 killall和 熔化爐FHS程序所指定的位置:
mv -v /usr/bin/fuser /bin mv -v /usr/bin/killall /bin
最後一次更新在
Iana-Etc包爲網絡服務和協議提供數據。
下面的命令將IANA提供的原始數據轉換爲正確的格式 /etc/protocols
和 /etc/services
數據文件:
make
這個包不有一個測試套件。
安裝包:
make install
最後一次更新在
野牛包包含一個解析器生成器。
野牛準備編譯:
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4
編譯包:
make
之間有一個環形依賴野牛和flex的檢查。若是須要的話,在安裝flex在下一節中,野牛檢查能夠與運行 作檢查。三個測試lalr1有關。cc失敗緣由未知。
安裝包:
make install
最後一次更新在
Flex包包含一個實用程序生成的程序文本的識別模式。
首先,修復一個問題介紹了glibc - 2.26:
sed -i "/math.h/a #include <malloc.h>" src/flexdef.h
構建過程假設 help2man程序能夠建立可執行的手冊頁——help選項。這是不存在,因此咱們用一個環境變量來跳過這個過程。如今,準備Flex編譯:
HELP2MAN=/tools/bin/true \ ./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4
編譯包:
make
測試結果(約0.5單位),問題:
make check
安裝包:
make install
不知道幾個項目 flex然而,試着運行它的前身, lex。爲了支持這些項目,建立一個符號連接 lex
運行 flex
在 lex仿真模式:
ln -sv flex /usr/bin/lex
最後一次更新在
Grep搜索包包含項目文件。
Grep準備編譯:
./configure --prefix=/usr --bindir=/bin
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
Bash包包含Bourne-Again殼。
把一些上游修復:
patch -Np1 -i ../bash-4.4-upstream_fixes-1.patch
Bash準備編譯:
./configure --prefix=/usr \ --docdir=/usr/share/doc/bash-4.4 \ --without-bash-malloc \ --with-installed-readline
新的配置選項的含義:
--with-installed-readline
這個選項告訴Bash使用 readline
圖書館已經安裝在系統上,而不是使用本身的readline版本。
編譯包:
make
跳過了 「安裝包」若是不是運行測試套件。
準備測試,確保 nobody
用戶能夠寫入源樹:
chown -Rv nobody .
如今,運行測試 nobody
用戶:
su nobody -s /bin/bash -c "PATH=$PATH make tests"
安裝包和移動主要可執行文件 /bin
:
make install mv -vf /usr/bin/bash /bin
運行新編譯的 bash目前正在執行的程序(取代):
exec /bin/bash --login +h
使使用的參數 bash過程一個交互式登陸shell,繼續禁用散列,這樣新項目被發現,由於他們變得可用。
最後一次更新在
Libtool包包含GNU通用庫支持腳本。它包裝在一致的使用共享庫的複雜性,便攜式接口。
Libtool準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果(約11.0單位),問題:
make check
測試時間libtool能夠與多個核心ibe系統上的顯著減小。爲此,添加 TESTSUITEFLAGS = - j < N >上面的線。例如,使用閣下能夠減小測試時間60%以上。
5測試已知失敗LFS構建環境因爲循環依賴,但全部測試經過,若是automake安裝後從新覈對。
安裝包:
make install
最後一次更新在
同時包包含GNU數據庫管理器。這是一個數據庫函數庫,使用可擴展散列和工做相似於標準的UNIX dbm。圖書館提供了存儲鍵/數據對原語,搜索和檢索數據的鍵和刪除鍵及其數據。
同時準備編譯:
./configure --prefix=/usr \ --disable-static \ --enable-libgdbm-compat
配置選項的含義:
--enable-libgdbm-compat
這個開關使libgdbm兼容性圖書館建成,一些包之外的LFS可能須要它提供的老DBM的例程。
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
Gperf生成一套完美哈希函數從一個關鍵。
Gperf準備編譯:
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
編譯包:
make
衆所周知,測試失敗若是同時運行多個測試(大於1 - j選項)。測試結果,問題:
make -j1 check
安裝包:
make install
最後一次更新在
外籍人士包包含用於解析XML面向流的C庫。
首先解決一個問題在LFS regession測試環境:
sed -i 's|usr/bin/env |bin/|' run.sh.in
外籍人士準備編譯:
./configure --prefix=/usr --disable-static
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
若是須要,安裝文檔:
install -v -dm755 /usr/share/doc/expat-2.2.3 install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.3
最後一次更新在
Inetutils包包含項目基本網絡。
Inetutils準備編譯:
./configure --prefix=/usr \ --localstatedir=/var \ --disable-logger \ --disable-whois \ --disable-rcp \ --disable-rexec \ --disable-rlogin \ --disable-rsh \ --disable-servers
配置選項的含義:
--disable-logger
這個選項能夠防止Inetutils安裝 日誌記錄器計劃,該腳本使用消息傳遞到系統日誌守護進程。不要���裝它,由於Util-linux安裝最新版本。
--disable-whois
這個選項禁用Inetutils的建築 域名查詢服務客戶端,這是過期了。更好的說明 域名查詢服務BLFS客戶機的書。並
--disable-r*
這些參數禁用建築不該使用過期的項目,因爲安全問題。這些程序所提供的功能能夠提供的 opensshBLFS包的書。並
--disable-servers
這將禁止安裝的各類網絡服務器做爲Inetutils包的一部分。這些服務器在基本的LFS系統被認爲是不合適的。有些人天生沒有安全感,只考慮安全可信的網絡。注意,更好的替代品可供這些服務器。
編譯包:
make
測試結果,問題:
make check
一個測試,libl。sh初始chroot環境中可能會失敗,但會經過若是LFS系統完成後的測試運行。
安裝包:
make install
移動一些程序,因此他們若是是可用的 /usr
沒法訪問:
mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin mv -v /usr/bin/ifconfig /sbin
最後一次更新在
Perl包包含實際提取和報告語言。
首先建立一個基本的 /etc/hosts
文件中引用一個Perl的配置文件以及可選的測試套件:
echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
如今這個版本的Perl構建壓縮::生::Zlib壓縮::生:BZip2模塊。默認狀況下Perl將使用一個內部來源構建的副本。發出如下命令,以便Perl將使用庫安裝在系統:
export BUILD_ZLIB=False export BUILD_BZIP2=0
有徹底控制Perl是設置的方式,你能夠刪除 「des」選擇從下面的命令和精心挑選的方式構建這個包。此外,用下面的命令同樣,使用Perl自動偵測的違約:
sh Configure -des -Dprefix=/usr \ -Dvendorprefix=/usr \ -Dman1dir=/usr/share/man/man1 \ -Dman3dir=/usr/share/man/man3 \ -Dpager="/usr/bin/less -isR" \ -Duseshrplib \ -Dusethreads
配置選項的含義:
-Dvendorprefix=/usr
這樣能夠確保 perl知道如何告訴包他們應該安裝perl模塊。
-Dpager="/usr/bin/less -isR"
這將確保 less
而不是使用 more
.
-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3
自從Groff還沒有安裝, 配置認爲咱們不但願Perl的手冊頁。發行這些參數覆蓋這一決定。
-Duseshrplib
創建一個共享libperl所需的一些perl模塊。
-Dusethreads
perl構建支持線程。
編譯包:
make
測試結果(大約2.5全局的問題:
make -k test
一些測試相關zlib將失敗歸因於使用zlib而不是內部的系統版本的版本。
安裝包和清理:
make install unset BUILD_ZLIB BUILD_BZIP2
轉儲C結構的生成 cc - g - s |
|
一個命令行前端模塊::CoreList |
|
與綜合Perl檔案網絡交互(CPAN)從命令行 |
|
構建一個Perl擴展編碼模塊從Unicode字符映射或Tcl編碼文件 |
|
猜一個或多個文件的編碼類型 |
|
轉換 |
|
轉換 |
|
Shell腳本檢查安裝Perl模塊,甚至能夠從一個安裝模塊建立一個tarball |
|
在特定的輸入和輸出格式之間轉換數據 |
|
可用於配置 |
|
結合C的一些最好的特性, sed, awk和 上海成一個單一的瑞士軍隊的語言 |
|
一個硬連接 perl |
|
用於生成錯誤報告關於Perl或隨之而來的模塊,和郵件 |
|
顯示一塊pod格式的文檔中嵌入Perl安裝樹或一個Perl腳本 |
|
Perl安裝驗證過程;它能夠用來驗證Perl和圖書館已正確安裝 |
|
用於生成謝謝消息郵件Perl開發人員 |
|
一個Perl版本的字符編碼轉換器 iconv |
|
一個粗略的Perl4轉換的工具 |
|
將文件從pod格式轉換爲HTML格式 |
|
轉換數據格式* roff輸入倉 |
|
圓莢體數據轉換爲格式化的ASCII文本 |
|
從嵌入式pod文檔打印使用消息文件 |
|
檢查pod格式文檔文件的語法 |
|
顯示選中的部分pod文檔 |
|
命令行工具對測試:運行測試:利用模塊 |
|
轉儲C結構的生成 cc - g - s刺穿了 |
|
一個 焦油例如用Perl編寫的程序 |
|
一個Perl程序,比較與unextracted提取檔案 |
|
一個Perl程序,適用於模式匹配在tar存檔文件的內容 |
|
打印或檢查沙校驗和 |
|
Perl用於力詳細預警診斷 |
|
將Perl XS代碼轉換成C代碼 |
|
顯示一個Zip文件的內部結構的詳細信息 |
最後一次更新在
XML::解析器模塊是一個Perl接口詹姆斯克拉克的XML解析器,外籍人士。
準備XML::解析器進行編譯:
perl Makefile.PL
編譯包:
make
測試結果,問題:
make test
安裝包:
make install
最後一次更新在
Intltool是一個國際化的工具用於從源文件中提取可翻譯字符串。
第一次修復一個警告是由perl - 5.22及之後:
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
Intltool準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
最後一次更新在
Autoconf包包含項目生產shell腳本能夠自動配置源代碼。
Autoconf準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
這須要很長時間,大約3.3單位。此外,一些測試是使用Automake的跳過。完整的測試覆蓋率,Autoconf Automake已經安裝後能夠從新測試。此外,兩個測試失敗因爲libtool-2.4.3後來的變化。
autoconf的測試時間與多核系統能夠顯著減小。爲此,添加 TESTSUITEFLAGS = - j < N >上面的線。例如,使用閣下能夠減小測試時間60%以上。
安裝包:
make install
生產shell腳本,自動配置軟件源代碼包,以適應各類各樣的類unix系統;配置腳本產生不須要獨立運行它們 autoconf程序 |
|
一個工具用於建立模板文件的C #定義配置使用的語句 |
|
一個包裝器M4宏處理器 |
|
自動運行 autoconf, autoheader, aclocal, automake, gettextize, libtoolize以正確的順序更改時節省時間 autoconf和automake模板文件 |
|
有助於建立一個 |
|
修改一個 |
|
有助於寫做時 |
最後一次更新在
Automake包包含使用Autoconf的程序生成makefile。
Automake準備編譯:
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15.1
編譯包:
make
有一些測試,錯誤連接到錯誤的flex版本的庫,因此咱們暫時解決這個問題。同時,使用閣下讓選項加速測試,即便在系統只有一個處理器,因爲內部我的測試延遲。測試結果,問題:
sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh make -j4 check
已知三個測試失敗的LFS環境:check12。sh,subobj。sh,check12-w.sh。
安裝包:
make install
最後一次更新在
Xz包包含壓縮和解壓文件的程序。它提供了功能lzma和更新的xz壓縮格式。壓縮的文本文件 xz產生一個更好的壓縮比與傳統的比例 gzip或 bzip2命令。
Xz準備編譯:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/xz-5.2.3
編譯包:
make
測試結果,問題:
make check
安裝包和確保全部必要的文件是正確的目錄:
make install mv -v /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /bin mv -v /usr/lib/liblzma.so.* /lib ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so
解壓縮到標準輸出 |
|
運行 cmp在LZMA壓縮文件 |
|
運行 diff在LZMA壓縮文件 |
|
運行 egrep在LZMA壓縮文件 |
|
運行 fgrep在LZMA壓縮文件 |
|
運行 grep在LZMA壓縮文件 |
|
運行 少在LZMA壓縮文件 |
|
使用LZMA壓縮或解壓縮文件格式 |
|
一個小而快LZMA壓縮文件的解碼器 |
|
顯示的信息存儲在LZMA壓縮文件頭 |
|
運行 更多在LZMA壓縮文件 |
|
解壓縮文件使用LZMA格式 |
|
解壓縮文件使用XZ格式 |
|
使用XZ壓縮或解壓縮文件格式 |
|
解壓縮到標準輸出 |
|
運行 cmp在XZ壓縮文件 |
|
一個小而快XZ壓縮文件的解碼器 |
|
運行 diff在XZ壓縮文件 |
|
運行 egrep在XZ壓縮文件的文件 |
|
運行 fgrep在XZ壓縮文件 |
|
運行 grep在XZ壓縮文件 |
|
運行 少在XZ壓縮文件 |
|
運行 更多在XZ壓縮文件 |
|
圖書館實現無損,塊分類數據壓縮,使用Lempel-Ziv-Markov鏈算法 |
最後一次更新在
Kmod包包含加載內核模塊的庫和工具
Kmod準備編譯:
./configure --prefix=/usr \ --bindir=/bin \ --sysconfdir=/etc \ --with-rootlibdir=/lib \ --with-xz \ --with-zlib
配置選項的含義:
--with-xz, --with-zlib
這些選項啓用Kmod處理壓縮內核模塊。
--with-rootlibdir=/lib
這個選項能夠確保不一樣圖書館相關文件放置在正確的目錄。
編譯包:
make
這個包有一個測試套件,不能夠在LFS chroot環境中運行。至少git項目須要和幾個測試將不會運行以外的git存儲庫。
安裝包,併爲兼容Module-Init-Tools建立符號連接(之前的包處理Linux內核模塊):
make install for target in depmod insmod lsmod modinfo modprobe rmmod; do ln -sfv ../bin/kmod /sbin/$target done ln -sfv kmod /bin/lsmod
最後一次更新在
國際化和本地化的Gettext包包含公用事業。這些容許編譯程序與NLS(本地語言支持),使他們可以輸出消息在用戶的母語。
首先,抑制兩個調用test-lock永遠在一些機器上能夠循環:
sed -i '/^TESTS =/d' gettext-runtime/tests/Makefile.in && sed -i 's/test-lock..EXEEXT.//' gettext-tools/gnulib-tests/Makefile.in
Gettext準備編譯:
./configure --prefix=/usr \ --disable-static \ --docdir=/usr/share/doc/gettext-0.19.8.1
編譯包:
make
測試結果(這須要很長時間,大約在布),問題:
make check
安裝包:
make install chmod -v 0755 /usr/lib/preloadable_libintl.so
標準Gettext基礎設施文件複製到一個源包中 |
|
替代品在shell環境變量格式字符串 |
|
將天然語言信息轉化爲用戶的語言經過查找翻譯的信息目錄 |
|
主要做爲gettext的shell函數庫 |
|
全部標準Gettext文件複製到頂級目錄的一個包開始國際化 |
|
過濾器的消息翻譯目錄根據它們的屬性和操做的屬性 |
|
鏈接和合並 |
|
比較兩個 |
|
發現的常見的消息 |
|
將一個翻譯目錄轉換爲不一樣的字符編碼 |
|
建立一個英語翻譯目錄 |
|
一個命令適用於全部翻譯的翻譯目錄 |
|
一個過濾器適用於全部翻譯的翻譯目錄 |
|
從翻譯目錄生成一個二進制消息目錄 |
|
提取全部消息的翻譯目錄匹配一個給定的模式或屬於一些給定的源文件 |
|
建立一個新的 |
|
結合了兩種原始翻譯成一個單一的文件中 |
|
反編譯的二進制消息目錄到原始的翻譯文本 |
|
結合重複的翻譯在翻譯目錄 |
|
顯示的母語翻譯的文本消息的語法形式取決於數量 |
|
從新編碼塞爾維亞斯拉夫字母到拉丁文本的腳本 |
|
從給定的源文件提取可翻譯消息行第一個翻譯模板 |
|
定義了 autosprintf類,這使得C格式化輸出例程可用在c++程序中,��用 <字符串>字符串和 <iostream>流 |
|
一個私人圖書館,其中包含了常規使用的各類Gettext項目;這些都不是用於通常用途 |
|
用於編寫專門的程序過程 |
|
一個私人圖書館,其中包含了常規使用的各類Gettext項目;這些都不是用於通常用途 |
|
一個庫,旨在使用LD_PRELOAD助攻 |
最後一次更新在
Procps-ng包包含項目監控過程。
如今準備procps-ng編譯:
./configure --prefix=/usr \ --exec-prefix= \ --libdir=/usr/lib \ --docdir=/usr/share/doc/procps-ng-3.3.12 \ --disable-static \ --disable-kill
配置選項的含義:
--disable-kill
這個開關禁用建設 殺了由Util-linux命令將安裝包。
編譯包:
make
LFS的測試套件須要一些自定義的修改。刪除一個失敗的測試腳本時不使用tty設備和修復兩人。要運行測試套件,運行如下命令:
sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp sed -i '/set tty/d' testsuite/pkill.test/pkill.exp rm testsuite/pgrep.test/pgrep.exp make check
ps測試可能會失敗,可是若是測試是經過從新運行第六章的末尾。
安裝包:
make install
最後,必要的庫移動到一個位置,若是能夠找到 /usr
不是安裝。
mv -v /usr/lib/libprocps.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so
報告的和用去的內存(物理和交換內存)的系統 |
|
查找過程基於他們的名字和其餘屬性 |
|
報告給出的pid程序 |
|
信號流程基於他們的名字和其餘屬性 |
|
報告給出的內存映射的過程 |
|
列出了當前運行的進程 |
|
報告進程的當前工做目錄 |
|
顯示詳細的實時內核耳光緩存信息 |
|
在運行時修改內核參數 |
|
輸出當前系統平均負載圖 |
|
顯示一個列表最CPU密集型的過程;它提供了一個持續的觀察實時處理器活動 |
|
報告系統已運行多長時間,多少用戶登陸,系統平均負載 |
|
報告虛擬內存統計信息,讓信息流程、內存、分頁、塊輸入/輸出(IO),陷阱和CPU活動 |
|
顯示當前登陸的用戶,以及從何時開始 |
|
反覆運行一個給定的命令,顯示第一屏的輸出;這容許用戶觀看輸出隨時間變化 |
|
包含函數所使用的大部分程序在這個包中 |
最後一次更新在
E2fsprogs包包含了實用程序來處理 ext2
文件系統。它也支持的 ext3
和 ext4
日誌文件系統。
E2fsprogs文檔建議包在源代碼樹的子目錄:
mkdir -v build cd build
E2fsprogs準備編譯:
LIBS=-L/tools/lib \ CFLAGS=-I/tools/include \ PKG_CONFIG_PATH=/tools/lib/pkgconfig \ ../configure --prefix=/usr \ --bindir=/bin \ --with-root-prefix="" \ --enable-elf-shlibs \ --disable-libblkid \ --disable-libuuid \ --disable-uuidd \ --disable-fsck
環境變量的意義和配置選項:
PKG_CONFIG_PATH, LIBS, CFLAGS
這些變量使e2fsprogs建成使用5.34節,「Util-linux-2.30.1」包了。
--with-root-prefix=""
和
--bindir=/bin
(如某些項目 e2fsck程序)是必不可少的項目。例如,當 /usr
不安裝,這些項目仍然須要可用。他們屬於目錄 /lib
和 /sbin
。若是這個選項不是經過E2fsprogs的配置、程序安裝到 /usr
目錄中。
--enable-elf-shlibs
這將建立一些程序在這個包中使用的共享庫。
--disable-*
這能夠防止E2fsprogs構建和安裝 libuuid
和 libblkid
庫, uuidd
守護進程, fsck包裝,如Util-Linux安裝最新版本。
編譯包:
make
創建和運行測試套件,咱們須要首先聯繫一些庫從/工具/ lib位置測試程序看起來。運行測試,問題:
ln -sfv /tools/lib/lib{blk,uu}id.so.1 lib make LD_LIBRARY_PATH=/tools/lib check
的一個E2fsprogs測試將試圖分配256 MB的內存。若是你沒有比這更多的RAM,務必使充分交換空間測試。看到2.5節,「分區上建立一個文件系統」和2.7節,「安裝新的分區」有關建立並啓用交換空間。
安裝二進制文件、文檔和共享庫:
make install
安裝靜態庫和標題:
make install-libs
讓安裝的靜態庫可寫的調試符號能夠刪除後:
chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
這個包安裝gzip .info
文件但不更新系統 dir
文件。解壓縮這個文件,而後更新系統 dir
使用如下命令文件。
gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
若是須要,建立並安裝一些額外的文檔經過發出如下命令:
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
搜索一個設備(一般是一個磁盤分區)壞塊 |
|
在一個變化的屬性文件 |
|
一個錯誤表編譯器;它將錯誤代碼的表名稱和消息轉換成C源文件適合使用 |
|
一個文件系統調試器;它能夠用來檢查和改變的狀態 |
|
打印的超級塊和塊組信息文件系統出如今一個給定的設備 |
|
自由空間碎片信息報告 |
|
是用來檢查,能夠修復嗎 |
|
用於保存重要嗎 |
|
顯示或更改文件系統標籤 |
|
回放的undo日誌undo_log ext2或ext3 / ext4文件系統上發現一個設備(這能夠用於e2fsprogs撤銷操做失敗的計劃。) |
|
在線碎片整理程序ext4文件系統 |
|
報告多麼支離破碎的特定文件 |
|
默認狀況下檢查 |
|
默認狀況下檢查 |
|
默認狀況下檢查 |
|
默認狀況下檢查 |
|
將一個命令的輸出保存在一個日誌文件 |
|
列出了第二個擴展文件系統上的文件的屬性 |
|
將表的命令名稱和幫助信息轉換成C源文件適合使用 |
|
建立一個 |
|
在默認狀況下建立 |
|
在默認狀況下建立 |
|
在默認狀況下建立 |
|
在默認狀況下建立 |
|
用於建立一個 |
|
能夠用來擴大或縮小 |
|
調整可調參數對一個文件系統 |
|
常見的錯誤顯示例程 |
|
所使用的 dumpe2fs, chattr, lsattr |
|
包含程序讓用戶級程序操做 |
|
所使用的 debugfs |
最後一次更新在
Coreutils包包含實用程序顯示和設置基本制度特徵。
從Coreutils POSIX要求程序即便在多字節語言環境正確識別字符邊界。如下補丁修復這種違規行爲和其餘國際化bug。
patch -Np1 -i ../coreutils-8.27-i18n-1.patch
在過去,許多bug被髮如今這個補丁。報告新的bug Coreutils維護人員時,請先檢查,若是他們沒有這個補丁是能夠重現的。
抑制一個測試在一些機器上永遠循環:
sed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mk
如今準備Coreutils編譯:
FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
配置選項的含義:
FORCE_UNSAFE_CONFIGURE=1
這個環境變量容許包創建做爲根用戶。
--enable-no-install-program=kill,uptime
這個開關的目的是防止Coreutils安裝二進制文件,稍後將由其餘包安裝。
編譯包:
FORCE_UNSAFE_CONFIGURE=1 make
跳過了 「安裝包」若是不是運行測試套件。
如今要運行的測試套件已經準備好了。首先,運行測試,用戶是如何運行的 root
:
make NON_ROOT_USERNAME=nobody check-root
咱們要運行的測試的 nobody
用戶。然而,某些測試,要求用戶是多個組的成員。這些測試不跳過咱們將添加一個臨時的組和用戶 nobody
它的一部分:
echo "dummy:x:1000:nobody" >> /etc/group
修復一些權限,這樣非root用戶能夠編譯和運行測試:
chown -Rv nobody .
如今運行測試。肯定的路徑 su
環境包括/工具/ bin。
su nobody -s /bin/bash \ -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
測試程序test-getlogin和date-debug失敗在chroot環境這樣一個部分構建的系統環境,可是若是在這一章的結束。
刪除臨時組:
sed -i '/dummy/d' /etc/group
安裝包:
make install
FHS項目移動到指定的地點:
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
一些依靠LFS-Bootscripts的腳本包 頭, 睡眠, 不錯的。做爲 /usr
可能不可用在引導的早期階段,這些二進制文件須要在根分區:
mv -v /usr/bin/{head,sleep,nice,test,[} /bin
編碼和解碼數據根據base32規範(RFC 4648) |
|
根據base64編碼和解碼數據規範(RFC 4648) |
|
帶任何路徑和一個給定的文件名後綴 |
|
鏈接到標準輸出文件 |
|
更改的文件和目錄的安全上下文 |
|
改變了組織的文件和目錄的全部權 |
|
改變每一個文件的權限爲給定的模式;的模式能夠是一個象徵性的表示變化使或八進制數表明新的權限 |
|
改變了用戶和/或組的文件和目錄的全部權 |
|
與指定的目錄運行命令 |
|
打印循環冗餘校驗(CRC)每一個指定文件的校驗和字節數 |
|
比較兩個文件排序,輸出在三列獨特的線條和線條是常見的 |
|
拷貝文件 |
|
將給定的文件分爲幾個新文件,將它們根據給定的模式或行號和輸出每一個新文件的字節數 |
|
打印部分的線路,選擇部分根據給定的字段或位置 |
|
在給定的格式顯示當前時間,或設置系統日期 |
|
拷貝一個文件使用給定的塊大小和計數,同時有選擇地執行轉換 |
|
報告的可用磁盤空間(使用)在全部掛載文件系統,或者只在文件系統保持選中的文件 |
|
列出每一個給定的內容目錄(同樣的 ls命令) |
|
輸出命令來設置 |
|
條目錄從文件後綴名 |
|
報告的磁盤空間使用的當前目錄,由每一個給定的目錄(包括全部子目錄)或每個給定的文件 |
|
顯示給定的字符串 |
|
在修改後的環境中運行一個命令 |
|
將製表符轉換爲空格 |
|
計算表達式 |
|
打印全部指定的整數數字的主要因素 |
|
什麼也不作,但沒有成功;它老是退出狀態碼錶示失敗 |
|
將段落在給定的文件中 |
|
包裝線在給定的文件中 |
|
報告用戶的組成員關係 |
|
打印前十行(或給定的行數)的每一個文件 |
|
報告的數字標識符(十六進制)主機 |
|
報告的有效用戶ID、組ID和指定的當前用戶或用戶的組成員關係 |
|
拷貝文件,設置他們的許可模式,若是可能的話,他們的全部者和組 |
|
鏈接的線相同的加入字段從兩個不一樣的文件 |
|
用給定的名稱建立一個硬連接到一個文件 |
|
使硬連接或軟(象徵性的)文件之間的聯繫 |
|
報告當前用戶的登陸名 |
|
列出每一個���定目錄的內容 |
|
報告或檢查消息摘要5 MD5校驗和 |
|
用給定的名稱建立目錄 |
|
建立先進先出(fifo),「命名管道」的UNIX的說法,用給定的名稱 |
|
用給定的名稱建立設備節點;設備節點是一個字符特殊文件,一塊特殊文件,或一個FIFO |
|
建立臨時文件以一種安全的方式;在腳本中使用它 |
|
移動或重命名文件或目錄 |
|
運行一個程序修改調度優先級 |
|
數字線從給定的文件 |
|
運行一個命令受禁錮,輸出重定向��一個日誌文件中 |
|
打印的數量處理單元可用於一個過程 |
|
將數字轉換爲或從人類可讀的字符串 |
|
八進制和其餘格式的轉儲文件 |
|
合併給定的文件,按順序加入相應的線並排,製表符隔開 |
|
檢查文件名是否有效或可移植 |
|
是一個輕量級的手指端;它報道一些給定的用戶的信息 |
|
分頁和columnates文件打印 |
|
打印環境 |
|
根據給定的格式打印給定的參數,就像C printf函數 |
|
產生一個交換指數從給定的文件的內容,每一個關鍵字的上下文 |
|
報告的當前工做目錄的名稱 |
|
報告的價值符號連接 |
|
打印的解決路徑 |
|
刪除文件或目錄 |
|
刪除目錄是空的 |
|
運行一個命令,指定的安全上下文 |
|
輸出一個數字序列在必定範圍內與一個給定的增量 |
|
打印或檢查160位安全散列算法1(SHA1)校驗和 |
|
打印或檢查224位校驗和安全散列算法 |
|
打印或檢查256位校驗和安全散列算法 |
|
打印或檢查384位校驗和安全散列算法 |
|
打印或檢查512位校驗和安全散列算法 |
|
覆蓋給定的文件屢次與複雜的模式,很難恢復數據 |
|
打亂行文本 |
|
給定的時間停頓 |
|
從給定的文件類型的 |
|
給定文件分割成小塊,大小或行數 |
|
顯示文件或文件系統���狀態 |
|
運行命令改變緩衝操做的標準流 |
|
集或報了結端線設置 |
|
爲每一個給定的文件打印校驗和和塊數量 |
|
將文件系統緩衝;它迫使改變塊磁盤並更新超級塊 |
|
在反向鏈接給定的文件 |
|
打印最後十行(或給定的行數)的每一個文件 |
|
從標準輸入讀取在寫標準輸出和給定的文件 |
|
比較值和檢查文件類型 |
|
運行一個命令的時間限制 |
|
修改文件時間戳,設置給定文件的訪問和修改時間爲當前時間;建立文件不存在零長度 |
|
翻譯、擠壓和刪除給定的字符從標準輸入 |
|
什麼也不作,成功;它老是退出狀態碼錶示成功 |
|
收縮或擴展一個文件到指定的大小 |
|
執行一個拓撲排序;它寫一個徹底有序列表根據給定文件中的部分排序 |
|
報告的文件名終端鏈接到標準輸入 |
|
報告系統信息 |
|
將空格轉換爲製表符 |
|
丟棄全部但一個連續相同的行 |
|
刪除給定的文件 |
|
報告當前登陸用戶的名稱 |
|
是同樣的 ls - l |
|
報告的行數,話說,和字節爲每一個給定的文件,以及總當多個文件 |
|
報告是誰登陸 |
|
報告與當前有效的用戶ID相關聯的用戶名 |
|
重複輸出 「y」或一個給定的字符串,直到死亡 |
|
所使用的庫 stdbuf |
最後一次更新在
你要包包含程序顯示文件或目錄之間的差別。
你要準備編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
最後一次更新在
呆呆的包包含操縱文本文件的程序。
準備呆呆的編譯:
./configure --prefix=/usr
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
若是須要,安裝文檔:
mkdir -v /usr/share/doc/gawk-4.1.4 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.4
最後一次更新在
Findutils包包含程序找到文件。這些項目提供了遞歸搜索目錄樹和建立、維護和搜索數據庫(一般比遞歸查找更快,可是不可靠,若是數據庫最近沒有更新)。
首先,抑制一個測試在一些機器上能夠永遠循環:
sed -i 's/test-lock..EXEEXT.//' tests/Makefile.in
Findutils準備編譯:
./configure --prefix=/usr --localstatedir=/var/lib/locate
配置選項的含義:
--localstatedir
這個選項的位置變化 定位數據庫在 /var/lib/locate
FHS-compliant。
編譯包:
make
測試結果,問題:
make check
安裝包:
make install
一些依靠LFS-Bootscripts的腳本包 找到。做爲 /usr
可能不可用在引導的早期階段,這個項目須要在根分區。的 更新資料庫腳本還須要修改正確的顯式路徑:
mv -v /usr/bin/find /bin sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb
最後一次更新在
Groff包包含程序處理和格式化文本。
Groff預計環境變量 PAGE
包含默認紙張大小。爲用戶在美國, PAGE=letter
是適當的。在其餘地方, PAGE=A4
可能更合適。而在編譯配置默認紙張大小,它能夠覆蓋後經過呼應 「A4」或「信」到 /etc/papersize
文件。
Groff準備編譯:
頁面=。/ configure——prefix = / usr<paper_size>
這個包不支持並行構建。編譯包:
make -j1
這個包不有一個測試套件。
安裝包:
make install
讀取troff字體文件並添加一些額外的font-metric使用的信息 groff系統 |
|
建立一個使用的字體文件 groff和 集團 |
|
Groff預處理生產化學結構圖 |
|
編譯的描述方程嵌入troff文件輸入命令所理解 troff |
|
轉換troff EQN(方程)裁剪圖像 |
|
標誌着groff / nroff / troff文件之間的差別 |
|
將曲譜用lilypond語言轉換成groff語言 |
|
Preprocesor groff,容許添加perl代碼進入groff文件 |
|
Preprocesor groff,容許添加象漢語拼音進入groff文件。 |
|
grap圖轉換成位圖圖像出現 |
|
一個 groff預處理器小鬼文件 |
|
一個司機 groff生產特克斯dvi格式 |
|
前端groff文檔格式化系統;一般,它運行 troff程序和後處理器適合所選設備 |
|
顯示groff X和遙控終端文件和手冊頁 |
|
讀取文件和猜想的 groff選項 |
|
是一個 groff爲佳能CAPSL打印機驅動程序(LBP-4和LBP-8系列激光打印機) |
|
是一個司機 groff產生輸出PCL5格式適用於惠普激光打印機4打印機 |
|
翻譯GNU的輸出 troff爲PDF |
|
翻譯GNU的輸出 troff到PostScript |
|
翻譯GNU的輸出 troff成適合typewriter-like設備 |
|
建立一個使用的字體文件 groff -Tlj4從一個HP-tagged字體指標文件 |
|
建立一個反向索引指定的書目數據庫,文件使用 請參考, lookbib, lkbib |
|
搜索指定書目數據庫引用包含密鑰和報告發現的任何引用 |
|
打印標準錯誤的提示(除非標準輸入不是終端),讀取一行包含一組從標準輸入關鍵字,搜索指定文件引用的書目數據庫包含這些關鍵詞,打印上發現的任何引用標準輸出,並重復這個過程,直到結束輸入 |
|
一個簡單的預處理 groff |
|
美國信息交換標準代碼格式方程(ASCII)輸出 |
|
一個腳���,模擬 nroff命令使用 groff |
|
是一個包裝groff,促進生產的PDF文檔文件格式與媽媽宏。 |
|
使用groff建立pdf文檔 |
|
翻譯PostScript字體 |
|
編譯的描述圖片嵌入troff或特克斯文件輸入命令被特克斯或理解 troff |
|
裁剪圖片圖轉換成圖像 |
|
翻譯GNU的輸出 troff與HTML |
|
轉換編碼的輸入文件GNU troff理解 |
|
翻譯GNU的輸出 troff與HTML |
|
��一個文件的內容複製到標準輸出,除了之間的界線 .[和 .]解釋爲引用,和之間的界限是什麼 .R1和 .R2解釋爲命令引用如何處理 |
|
將每一年的文件轉換成DVI格式 |
|
將每一年的文件轉換爲HTML格式 |
|
將每一年的文件轉換成pdf文檔 |
|
將每一年的文件轉換成ps文件 |
|
將每一年的文件轉換成文本文件 |
|
將每一年的文件轉換成其餘格式 |
|
讀取文件並替換的形式 。因此文件提到的內容 文件 |
|
編譯的描述表嵌入troff文件輸入命令所理解 troff |
|
建立一個使用的字體文件 groff -Tdvi |
|
是高度兼容Unix troff;它一般應該使用調用 groff命令,該命令還將運行預處理器和後處理器以適當的順序和適當的選項 |
最後一次更新在
GRUB包包含了大統一引導裝載程序。
GRUB準備編譯:
./configure --prefix=/usr \ --sbindir=/sbin \ --sysconfdir=/etc \ --disable-efiemu \ --disable-werror
新的配置選項的含義:
--disable-werror
這容許構建完整的警告最近引入的Flex版本。
--disable-efiemu
這個選項最小化是由禁用LFS的特性和測試程序不須要。
編譯包:
make
這個包不有一個測試套件。
安裝包:
make install
使用GRUB,使你的LFS系統可引導將在討論8.4節,「使用GRUB引導過程設置」.