一. 準備工作 1. 需要一個Linux宿主系統,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架構上可以運行的其它發行版 二. LFS目標架構 LFS主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) 的目標架構。另外,做一些更改可以讓LF ...
一. 準備工作
1. 需要一個Linux宿主系統,例如早先版本的 LFS,Ubuntu/Fedora,SuSE 或者是在你的架構上可以運行的其它發行版
如果想實現Win7與Linux雙系統,可參考我的上一篇博文:Win7下硬碟安裝Ubuntu 12.04.3雙系統
二. LFS目標架構
LFS主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) 的目標架構。另外,做一些更改可以讓LFS 順利地在 Power PC 和
ARM CPU 上運行。
假如按照本文的預設方式構建,那麼你將得到一個“純” 64 位系統————這意味著你僅能夠執行64 位的程式。有一些異常老舊的
包無法在“純” 64位系統上構建,或者是需要專門的編譯指令。通常出現這樣的問題是因為這些包包含有一些與32 位系統緊密相關的
彙編指令。大多數問題都有解決方案,但可能需要特別的方法或者是補丁。
三. 宿主系統需求
確保宿主系統已經包含了所有合適的軟體版本,具有了編譯程式的能力,這對於一個現代的Linux發行版系統不是一個問題。
你需要運行以下指令:
cat > version-check.sh << "EOF" #!/bin/bash # Simple script to list version numbers of critical development tools export LC_ALL=C bash --version | head -n1 | cut -d" " -f2-4 echo "/bin/sh -> `readlink -f /bin/sh`" 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 yacc 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 '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 EOF bash version-check.shView Code
同時,還請進行庫文件的一致性檢查,這些文件應該要麼都在或者是都缺失,而不應該只有一兩個。
cat > library-check.sh << "EOF" #!/bin/bash for lib in lib{gmp,mpfr,mpc}.la; do echo $lib: $(if find /usr/lib* -name $lib| grep -q $lib;then :;else echo not;fi) found done unset lib EOF bash library-check.shView Code
四. 準備新分區
1. 創建新分區
a. 創建10G的空閑分區,存儲所有的源碼包及滿足編譯的需求。
b. 如果宿主系統創建了swap
分區,則LFS 系統可以與之共用,如果沒有,則新建,推薦大小為物理記憶體的兩倍左右。
2. 在分區上創建文件系統
a. 在 LFS 分區上創建 ext4
文件系統,運行以下命令:
mkfs -v -t ext4 /dev/<xxx>
b. 如果是新建 swap
分區,需要用下麵的命令初始化:
mkswap /dev/<yyy>
<xxx>
、<yyy>
都需要替換為實際的設備名稱(如 sda1,sdb2),以下同。
3. 掛載新分區
a. 設置掛載點為 $LFS 環境變數:
export LFS=/mnt/lfs
b. 創建掛載點並用下麵的命令掛載 LFS 文件系統:
mkdir -pv $LFS # 建立掛載點 mount -v -t ext4 /dev/<xxx> $LFS # 將 /dev/<xxx> 掛載到 $LFS
如果重啟設備,可能進入後發現 /mnt/lfs 目錄下沒有內容,這時只需要再次掛載 /dev/<xxx> 到 /mnt/lfs。
c. 如果你正在使用交換
分區,用 swapon 命令確保它已經啟用
/sbin/swapon -v /dev/<yyy>
五. 軟體包與補丁
1. 以 root
用戶執行下麵的命令創建$LFS/sources目錄,用於保存軟體包和補丁,同時用來解壓源代碼並執行編譯
mkdir -v $LFS/sources
2. 設置目錄的寫許可權和粘滯模式
chmod -v a+wt $LFS/sources
“粘滯模式”意思是就算有多個用戶對某個目錄有寫許可權,仍然只有該文件的主人能刪除一個粘滯目錄里的文件。
3. 下載需要的軟體包和補丁,它們用來構建一個基本的 Linux 系統
a. 下載方式一:點擊此直接下載
b. 下載方式二:點擊此下載 wget-list 文件作為 wget 的輸入。例如:
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
由於這些文件都分佈在國外的不同站點上,因此有些會下載很慢。感謝中科大提供的鏡像:wget-list-LFS7.7-systemd-USTC
4. 校驗所有的文件是否都正確
點擊此下載 md5sums 文件,將這個文件拷貝到 $LFS/sources
目錄里並執行:
pushd $LFS/sources
md5sum -c md5sums
popd
多數情況下校對會不成功,並不影響構建。
六. 最後的準備工作
1. 創建 $LFS/tools 文件夾
以 root
用戶運行以下的命令:
mkdir -v $LFS/tools
編譯的臨時工具會安裝到 $LFS/tools
文件夾,不會成為最終 LFS 系統的一部分。
2. 在宿主系統中創建 /tools
的符號鏈接,將其指向$LFS/tools
以 root
用戶運行以下的命令:
ln -sv $LFS/tools /
創建的符號鏈接使得編譯的工具鏈總是指向 /tools
文件夾。
3. 添加lfs用戶
以 root
用戶運行以下命令來添加新組和新用戶:
groupadd lfs # 添加新組 useradd -s /bin/bash -g lfs -m -k /dev/null lfs # 添加新用戶 passwd lfs # 為用戶設置密碼 chown -v lfs $LFS/tools # 賦予了訪問 $LFS/tools 文件夾的所有許可權 chown -v lfs $LFS/sources # 賦予了訪問 $LFS/sources 文件夾的所有許可權 su - lfs # 切換用戶View Code
當以 root
用戶登錄時,犯一個小錯誤可能會破壞或摧毀整個系統。
4. 設置環境
以 lfs
用戶登錄運行以下兩個命令,為 bash shell 創建兩個開機啟動的文件。
cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOFView Code
cat > ~/.bashrc << "EOF" set +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 EOFView Code
啟用配置文件:
source ~/.bash_profile