天天看點

LFS(Linux From Scratch)建構過程全記錄(一):準備工作前言準備工作

前言

  根據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

  可以發現上面有一些錯誤,這裡給出如下解決方案:

  1. shell腳本未指向bash而是dash:
修改預設的腳本連結到bash:ln -sf bash /bin/sh
  1. bison: not found(bison是屬于 GNU 項目的一個文法分析器生成器)
安裝bison:sudo apt-get install bison
  1. yacc not found(安裝bison後yacc也會被安裝上,它是一個經典的生成文法分析器的工具)
  2. gawk not found(linux下查找替換文本工具)
同樣的安裝gawk:sudo apt-get install gawk
  1. 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的描述所說,這些庫檔案要麼全有,要麼全沒有。這兩種結果都是正确的。

繼續閱讀