爲了讓安裝時軟件包過程當中方便訪問,咱們最好創建一個目錄來解壓和編譯源碼包。咱們在咱們的工做目錄/mnt/lfs中創建一個名字爲sources的目錄 既能夠用來存儲軟件包和補丁,也能夠做爲工做目錄。使用這個目錄的好處是,全部須要的部件都在 LFS 分區上,構建過程當中的全部步驟均可以訪問到。shell
要建立這個目錄,在開始下載以前用 root 用戶登陸,並運行下面的命令:bash
mkdir -v $LFS/sources
把目錄設置爲可寫和 sticky 模式,這裏"Sticky"的意思是雖然某個目錄對於多個用戶有寫入的權限,但這個目錄中的文件只有其全部者才能刪除。請運行下面的命令使目錄可寫,並設置 sticky 模式:框架
chmod -v a+wt $LFS/sources
下邊編譯的全部程序都將安裝到 $LFS/tools 目錄下,以便與後邊教程中編譯的程序隔離開來。這裏編譯的程序只是臨時使用的工具,不是最終 LFS 系統的組成部分。把這些程序放到一個單獨的目錄下,在使用過以後簡單的刪除掉就能夠了。這樣作也能夠防止這些程序與系統中相同的程序混淆(新手很容易出現這樣的事情)。相關知識點:chmod a+wt是將目錄或文件的屬性設置爲1777,這樣任何人均可以對其進行讀寫。 以 root 用戶運行下面的命令來建立所需的目錄:
mkdir -v $LFS/tools
下一步是在宿主系統上建立一個 /tools 符號連接,指向 LFS 分區上新建立的目錄,這個命令一樣要做爲 root 用戶運行:
ln -sv $LFS/tools /
注意:ln -sv $LFS/tools執行後應該會提示
`/tools' -> `/mnt/lfs/tools'
表示正確。
相關知識點:
上面這兩句就創建了神奇的工具鏈目錄(是工具鏈目錄不是工具鏈),這樣的建立方式是爲了在建立工具鏈和使用工具鏈建立目標系統的時候對於工具鏈的位置都是/tools,這樣可保證工具鏈的正常使用工具
添加 LFS 用戶spa
以 root 用戶登陸的時候,若是出現操做錯誤就足以損壞甚至摧毀系統,所以,咱們推薦使用一個無特權的用戶來編譯和安裝軟件包。建議您新建一個名爲 lfs 的組,並在其中添加一個名爲 lfs 的用戶,咱們將在安裝過程當中使用這個用戶。以 root 用戶運行下列命令來添加新用戶:命令行
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
命令行選項的含義:code
爲了可使用 lfs 用戶登陸(與從 root 用戶切換到 lfs 用戶不一樣,這種切換不須要 lfs 用戶有一個密碼),必須先爲 lfs 用戶設置一個密碼(設置lfs密碼,設置爲空就好了,也就是輸入密碼的時候直接回車就成。):繼承
passwd lfs
經過把 lfs 用戶設置爲 $LFS/tools 目錄的全部者來授予 lfs 用戶對該目錄的徹底訪問權限:教程
chown -v lfs $LFS/tools
若是您依照建議建立了獨立的工做目錄,請將該目錄的全部權賦予 lfs 用戶:源碼
chown -v lfs $LFS/sources
接下來,以 lfs 用戶登陸。您能夠經過一個虛擬控制檯,或者經過顯示管理器,或者用下面的切換用戶命令:
su - lfs
"-" 參數指示 su 開啓一個登錄Shell(login shell)而不是非登錄Shell(non-login shell),這兩種 shell 的不一樣之處請參考 bash(1) 和 info bash 。這時候你會發現命令行提示符已經由#改成了$
設置工做環境
經過給 bash shell 建立兩個新的啓動文件來設置一個良好的工做環境。用 lfs 用戶登陸,輸入下面的命令來建立一個新的 .bash_profile 文件:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
做爲 lfs 用戶登陸的時候,初始 shell 一般是一個登錄shell(login shell),它會首先讀取當前系統的 /etc/profile 文件(可能包含一些設置和環境變量),而後繼續讀取 .bash_profile 文件來完成登陸初始化。.bash_profile 文件中的 exec env -i.../bin/bash 命令用徹底空的環境來取代當前的環境(除了繼承 HOME, TERM, PS1 變量外)。這樣能保證咱們的編譯環境不會被當前系統中沒必要要的或者有潛在危險的環境變量所影響,從而確保得到一個乾淨的工做環境。
另外一個新的 shell 實例是非登錄shell(non-login shell),它不讀取 /etc/profile 或 .bash_profile 文件,而是讀取 .bashrc 文件。如今建立 .bashrc 文件:
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
set +h 命令關閉 bash 的 hash 功能,hash 一般是一個有用的特性:bash 使用一個 hash 表來記錄可執行文件的完整路徑,以免爲了找到同一個可執行文件而反覆搜索 PATH 裏的目錄。然而,新工具裝好以後就要當即使用,經過關閉 hash 功能,當要運行程序的時候,shell 將老是搜索 PATH 裏的目錄,這樣新工具一編譯好,shell 就能夠在 $LFS/tools 目錄裏找到,而不是執行所記憶的其它地方的舊版本程序。
將用戶文件建立掩碼(umask)設爲 022 ,使得新建立的文件和目錄只有全部者可寫,其餘用戶只能讀取和運行(open(2) 系統調用的默認模式是新文件權限 644,新目錄權限 755)。
LFS 環境變量應該設爲所選擇的掛載點。
LC_ALL 環境變量控制着某些程序的本地化,使其顯示的信息遵循指定國家的慣例。若是當前系統使用的 Glibc 版本低於 2.2.4,將 LC_ALL 環境變量設置爲"POSIX"或"C"之外的值(在本章中)可能會在您退出虛根環境後再想返回的時候出現問題。請把 LC_ALL 設置爲"POSIX"或"C"(這二者是等價的)以確保在虛根環境中的全部東西都像預期的那樣正常工做。
經過把 /tools/bin 放在 PATH 的最前面,當全部的程序安裝好後,就能夠當即被 shell 運行。將這一點和關閉 hash 功能結合起來,預防了當前系統的舊程序在不應運行的時候卻被運行了的風險。
最後,爲了徹底準備好編譯臨時工具的工做環境,導入剛剛建立的 profile 文件:
source ~/.bash_profile
這裏利用了bash的環境變量的設置文件將lfs的環境設置爲符合編譯工具鏈要求的最少的環境參數 這裏面最重要的就是PATH這個參數,目的是爲了可以利用工具鏈裏面的工具製做工具鏈:首先查找/tools/bin下是否有須要的命令,若是沒有再到/bin和/usr/bin下找,而後用/bin或/usr/bin下面的命令來幫助生成須要的命令並放在/tools/bin下,這樣此消彼漲,最終可完成一個自給自足的工具鏈。 到此爲止就能夠開始工具鏈的製做了,不過製做LFS是一個漫長而浩大的工程,因此要一直開機直到完成有時候比較困難,特別是在機器速度比較慢的狀況下,可以從新啓動到最後工做的狀態是很重要的。在不一樣的階段從新啓動並恢復狀態的步驟不徹底相同,因此本文會在不一樣的階段討論從新啓動恢復到工做狀態的方法和步驟。