前言
根據LFS文檔,建構Linux系統。LFS版本:Linux From Scratch Version 7.9-systemd
首先了解一下該版本下LFS建構中的軟體包和作用(摘自Linux From Scratch Version 7.9-systemd内容):
Acl: 這個軟體包包括了管理通路控制清單(ACL)的工具,用于定義檔案和目錄更細粒度的自主通路權。
Attr: 這個軟體包包
括了管理檔案系統的對象擴充屬性的程式
Autoconf: 這個軟體包包括了能根據開發者的模闆自動生成配置源代碼的 shell 腳本的程式。更新了建構過程之後重新建構軟體包通常需要這個。
Automake: 這個軟體包包括了從模闆生成 Make 檔案的程式。更新了建構過程之後重新建構軟體包通常需要這個。
Bash: 這個軟體包能滿足提供到系統的 Bourne Shell 接口的 LSB 核心需求。由于其通用性和在基本 shell 功能上的擴充能力,是以選擇它而不是其它的 shell 軟體包。
Bc: 這個軟體包提供了一種任意精度的數值處理語言。在建構 Linux 核心時需要它。
Binutils: 這個軟體包包括了一個連結器、彙編器和其它處理對象檔案的工具。編譯 LFS 系統以及之上的大部分軟體包需要這個軟體包中的程式。
Bison: 這個軟體包中有 yacc(Yet Another Compiler Compiler) 的 GNU 版本,需要用來建構一些其它的 LFS 程式。
Bzip2: 這個軟體包包括了用來壓縮和解壓縮檔案的程式。在解壓縮很多 LFS 軟體包的時候需要它。
Check: 這個軟體包包括了一個用于其它程式的測試工具。它隻安裝在臨時工具鍊中。
Coreutils: 這個軟體包包括了一些檢視和管理檔案和目錄的重要程式。在指令行裡管理檔案和每個 LFS 軟體包的安裝過程中需要它。
D-Bus: 這個軟體包包括了一個用于提供消息總線的程式,消息總線是一種應用程式之間通信的簡單方式。systemd 也需要它。
DejaGNU: 這個軟體包包括了一個測試其它程式的架構。隻安裝在臨時工具鍊中。
Diffutils: 這個軟體包包括了一些顯示檔案和目錄差異的程式。這些程式可以用來建立更新檔,也用于很多軟體包的建構過程。
E2fsprogs: 這個軟體包包括了一些處理 ext2、ext3 和 ext4 檔案系統的工具。這些是 Linux 上支援的最常用而且完全經過考驗的檔案系統。
Expat: 這個軟體包包括了一個相對小的 XML 解析庫。Perl 子產品 XML::Parser 需要用到這個。
Expect: 這個軟體包包括了一個生成與其它程式互動的腳本對話框的程式。通常用來測試其它軟體包。隻安裝在臨時工具鍊中。
File: 這個軟體包包括了一個能判斷給定檔案的類型的工具。一些軟體包需要用它來建構。
Findutils: 這個軟體包包括了一些在檔案系統中查找檔案的程式。在很多軟體包建構腳本中會用到它。
Flex: 這個軟體包包括了一個能生成識别文本模式程式的工具。是 lex(lexical analyzer) 程式的 GNU 版本。建構很多 LFS 軟體包需要用到它。
Gawk: 這個軟體包包括了一些操作文本檔案的程式。是 awk(Aho-Weinberg-Kernighan) 的 GNU 版本。在很多軟體包的建構腳本中會用到它。
Gcc: 這個軟體包是 GNU 編譯器工具集。它包括 C 和 C++ 的編譯器以及其它一些不是由 LFS 建構的軟體包。
GDBM: 這個軟體包包括了 GNU 資料庫管理庫。LFS 的另一個軟體包 Man-DB 會用到它。
Gettext: 這個軟體包包括了很多軟體包國際化和本地化需要用到的工具和庫。
Glibc: 這個軟體包包括了主要的 C 語言庫。缺少它 Linux 程式就運作不了。
GMP: 這個軟體包包括了能提供任意精度數值運算的數學庫。編譯 Gcc 會用到它。
Gperf: 這個軟體包包括了一個能從一個鍵集生成完美哈希函數的程式。sysetmd 會用到它。
Grep: 這個軟體包包括了一些在檔案中搜尋的程式。大部分軟體包的建構腳本會用到它。
Groff: 這個軟體包包括了處理和格式化文本的程式。其中一個重要的功能是格式化 man 頁面。
GRUB: 這個包是 Grand Unified Boot Loader。是可用的引導加載器之一,但最靈活。
Gzip: 這個包包括了一些壓縮和解壓縮檔案的程式。解壓很多 LFS 以及之上的軟體包時會需要它。
Iana-etc: 這個軟體包提供了網絡服務和協定的資料。啟用合适的網絡功能會用到它。
Inetutils: 這個包包括了基本網絡管理的程式。
Intltool: 這個包包括了能從源檔案中抽取可翻譯字元串的工具。
IProute2: 這個包包括了一些基本和進階的 IPv4 和 IPv6 網絡的程式。由于其 IPv6 功能,是以選擇它而不選擇其它的常見網絡工具包(net-tools)。
Kbd: 這個包包括了一些鍵盤映射檔案,用于非 US 鍵盤的鍵盤工具以及一些控制台字型。
Kmod: 這個軟體包包括了一些用于管理 Linux 核心子產品的程式。
Less: 這個軟體包包括了一個很好的文本檔案檢視器,允許檢視檔案的時候向上或向下滾動。Man-DB 用它來檢視 man 頁面。
Libcap: 這個包實作了可以用于 Linux 核心的,從使用者空間到 POSIX 1003.1e 的接口。
Libpipeline: 這個包包括了一個以靈活和便捷的方式操作子程序流水線的庫。Man-DB 軟體包會用到它。
Libtool: 這個軟體包包括一些 GNU 通用庫支援腳本。它降低了在一緻、可移植的接口上使用共享庫的複雜度。在其他 LFS 軟體包的測試套件裡需要它。
Linux Kernel: 這個包就是作業系統。即我們常說的 “GNU/Linux” 中的 “Linux”。
M4: 這個包包括了一個普通的文本宏處理器,作為其它程式的建構工具使用。
Make: 這個包包括了一個指導軟體包建構的程式。LFS 中的幾乎每個包都需要它。
Man-DB: 這個包包括了一些查找和檢視 man 頁面的程式。由于其更好的國際化功能,用來代替 man軟體包。它提供了 man 程式。
Man-pages: 這個包包括了基本的 Linux man 頁面的真正内容。
MPC: 這個包包括了複數運算的函數。Gcc 需要它。
MPFR: 這個包包括了多精度運算的函數。Gcc 需要它。
Ncurses: 這個包包括了一些處理字元界面的不依賴特定終端的庫。通常用來為菜單系統提供光标控制。一些 LFS 的軟體包會用到它。
Patch: 這個包包括了一個通過更新檔檔案來修改或建立檔案的程式,更新檔檔案通常是由 diff 程式建立的。一些 LFS 軟體包的建構過程會需要它。
Perl: 這個包包括了一個運作時語言 PERL 的解析器。一些 LFS 軟體包的安裝和測試套件會需要它。
Pkg-config: 這個包提供了一個傳回已安裝庫或軟體包的中繼資料的程式。
Procps-NG: 這個包包括了一些監視程序的程式。這些程式對系統管理非常有用,也用于 LFS 的啟動腳本。
Psmisc: 這個包包括了一些顯示運作中程序資訊的程式。這些程式對系統管理非常有用。
Readline: 這個包提供了一些指令行編輯和曆史功能的庫。Bash 會使用它。
Sed: 這個包提供了不通過文本編輯器而直接編輯文本的功能。大部分 LFS 軟體包的配置腳本需要它。
Shadow: 這個包包括了一些以安全方式處理密碼的程式。
Systemd: 作為 Sysvinit 的替代品,這個包提供了一個 init 程式以及一些其它的引導和系統控制功能。很多 Linux 發行版都用它。
Tar: 這個軟體包提供了歸檔和提取 LFS 中的幾乎所有軟體包的能力。
Tcl: 這個包包括了在很多 LFS 軟體包測試套件中使用的工具指令語言。隻安裝在臨時工具鍊中。
Texinfo: 這個包包括了一些讀、寫以及轉換資訊頁面的程式。在很多 LFS 軟體包的安裝過程中會使用它。
Util-linux: 該軟體包包括了許多工具。其中有處理檔案系統、控制台、分區和消息的工具。
Vim: 這個包包括了一個編輯器。由于 vi 編輯器的經典以及大量的強大功能而選擇它。對很多使用者來說一個編輯器是一個非常個人的選擇,如果需要的話也可以選擇其它編輯器。
XML::Parser: 這個包是和 Expat 互動的 Perl 子產品。
XZ Utils: 這個包包括了一些壓縮和解壓縮檔案的程式。通常它的壓縮率最高,在解壓 XZ 或者 LZMA 格式的軟體包時非常有用。
Zlib: 這個包包括了一些程式所使用的壓縮和解壓縮功能。
準備工作
檢查主控端
檢查主控端的軟體和核心版本是否符合LFS7.9的需求。
軟體版本清單:
Bash-3.2 (/bin/sh should be a symbolic or hard link to bash)
Binutils-2.17
Bison-2.3 (/usr/bin/yacc should be a link to bison or small script that executes bison)
Bzip2-1.0.4
Coreutils-6.9
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1
GCC-4.7 including the C++ compiler, g++
Glibc-2.11
Grep-2.5.1a
Gzip-1.3.12
Linux Kernel-2.6.32
M4-1.4.10
Make-3.81
Patch-2.5.4
Perl-5.8.8
Sed-4.1.5
Tar-1.18
Texinfo-4.7
Xz-5.0.0
1.檢查主控端的軟體版本:
使用lfs7.9的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
我的主控端是ubuntu 16.04桌面個人版,是以得到的結果如下:
bash, version 4.3.48(1)-release
/bin/sh -> /bin/dash
ERROR: /bin/sh does not point to bash
Binutils: (GNU Binutils for Ubuntu) 2.26.1
version-check.sh: 11: version-check.sh: bison: not found
yacc not found
bzip2, Version 1.0.6, 6-Sept-2010.
Coreutils: 8.25
diff (GNU diffutils) 3.3
find (GNU findutils) 4.7.0-git
version-check.sh: 25: version-check.sh: gawk: not found
/usr/bin/awk -> /usr/bin/mawk
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
(Ubuntu GLIBC 2.23-0ubuntu10) 2.23
grep (GNU grep) 2.25
gzip 1.6
Linux version 4.13.16+ ([email protected]) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)) #1 SMP Wed Oct 10 14:56:29 CST 2018
version-check.sh: 41: version-check.sh: m4: not found
GNU Make 4.1
GNU patch 2.7.5
Perl version=‘5.22.1’;
sed (GNU sed) 4.2.2
tar (GNU tar) 1.28
version-check.sh: 47: version-check.sh: makeinfo: not found
xz (XZ Utils) 5.1.0alpha
g++ compilation OK
可以發現上面有一些錯誤,這裡給出如下解決方案:
- shell腳本未指向bash而是dash:
修改預設的腳本連結到bash:ln -sf bash /bin/sh
- bison: not found(bison是屬于 GNU 項目的一個文法分析器生成器)
安裝bison:sudo apt-get install bison
- yacc not found(安裝bison後yacc也會被安裝上,它是一個經典的生成文法分析器的工具)
- gawk not found(linux下查找替換文本工具)
同樣的安裝gawk:sudo apt-get install gawk
- makeinfo: command not found
安裝makeinfo:sudo apt-get install texinfo
以上修正完畢後,輸出如下:
bash, version 4.3.48(1)-release
/bin/sh -> /bin/bash
Binutils: (GNU Binutils for Ubuntu) 2.26.1
bison (GNU Bison) 3.0.4
/usr/bin/yacc -> /usr/bin/bison.yacc
bzip2, Version 1.0.6, 6-Sept-2010.
Coreutils: 8.25
diff (GNU diffutils) 3.3
find (GNU findutils) 4.7.0-git
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
/usr/bin/awk -> /usr/bin/gawk
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
(Ubuntu GLIBC 2.23-0ubuntu10) 2.23
grep (GNU grep) 2.25
gzip 1.6
Linux version 4.13.16+ ([email protected]) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)) #1 SMP Wed Oct 10 14:56:29 CST 2018
m4 (GNU M4) 1.4.17
GNU Make 4.1
GNU patch 2.7.5
Perl version=‘5.22.1’;
sed (GNU sed) 4.2.2
tar (GNU tar) 1.28
texi2any (GNU texinfo) 6.1
xz (XZ Utils) 5.1.0alpha
g++ compilation OK
1.主控端的庫檔案一緻性檢查:
同樣的,使用lfs7.9的library-check.sh:
#!/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
執行結果如下:
libgmp.la: not found
libmpfr.la: not found
libmpc.la: not found
正如lfs的描述所說,這些庫檔案要麼全有,要麼全沒有。這兩種結果都是正确的。