A!die Software Studio Welcome to A!Die Software Studio

第三章 构建系统软件

by adie
May, 2012
   上一章   回目录   下一章   

第三章 构建系统软件

我们已经建立好了用于构建 LFS 系统的工具了,为了尽量减少宿主系统的影响,我们使用 chroot 切换到新的系统中进行工作,然后再安装系统软件。

3.1 切换系统

我们之前的 $LFS/tools 是属于 lfs 这个用户的,而 lfs 这个用户是宿主系统上的用户,所以我们首先要把文件的所有者改回 root,由于 root 的用户 ID 和 组 ID 都是 0,可以确保在新的系统下面所有者仍然是 root。

使用 root 而不是 lfs 用户登录虚拟机:

login as: root
root@192.168.237.131's password:
Last login: ...
root [ ~ ]# chown -R root:root /mnt/lfs/tools

由于之后的操作会改变 tools 目录的内容,而构建的 tools 目录也可以用于安装相同版本的多个 LFS 系统,如果需要的话可以进行备份:

root [ ~ ]# cd /mnt/lfs/tools
root [ /mnt/lfs/tools ]# tar zcvf tools.tar.gz ./
root [ /mnt/lfs/tools ]# mv tools.tar.gz /mnt/lfs/usr/src

接下来我们需要创建一些系统目录和文件:

root [ ~ ]# export LFS=/mnt/lfs
root [ ~ ]# mkdir -pv $LFS/{dev,proc,sys}
mkdir: created directory `/mnt/lfs/dev'
mkdir: created directory `/mnt/lfs/proc'
mkdir: created directory `/mnt/lfs/sys'
root [ ~ ]# mknod -m 600 $LFS/dev/console c 5 1
root [ ~ ]# mknod -m 666 $LFS/dev/null c 1 3
root [ ~ ]# mount -v --bind /dev $LFS/dev
/dev on /mnt/lfs/dev type none (rw,bind)
root [ ~ ]# mount -vt devpts devpts $LFS/dev/pts
devpts on /mnt/lfs/dev/pts type devpts (rw)
root [ ~ ]# mount -vt tmpfs shm $LFS/dev/shm
shm on /mnt/lfs/dev/shm type tmpfs (rw)
root [ ~ ]# mount -vt proc proc $LFS/proc
proc on /mnt/lfs/proc type proc (rw)
root [ ~ ]# mount -vt sysfs sysfs $LFS/sys
sysfs on /mnt/lfs/sys type sysfs (rw)

/dev,/sys,/proc 都是内核虚拟的文件系统,我们首先创建一个挂载点目录,然后把内核文件系统挂载上去。/dev 包含了硬件设备文件;/proc 包含了运行的进程信息;/sys 包含了一些系统信息,配置等等。console 和 null 是系统引导时需要的设备节点,我们必须在硬盘上创建它们。

现在我们使用 chroot 来切换环境,为了让以后重新登录时切换方便,我们把切换的命令放入脚本中,以后每次登陆后都运行一次这个脚本:

root [ ~ ]# cat > chsys.sh <<  "EOF"
> export LFS=/mnt/lfs
> 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
> EOF
root [ ~ ]# chmod +x chsys.sh
root [ ~ ]# ./chsys.sh
I have no name!:/#

env -i 命令清除所有 chroot 环境变量,然后重新设置了 HOME, TERM, PS1 和 PATH 的值。通过 +h 选项并且把 /tools/bin 放在 PATH 的最后,可以保证一旦我们完成了系统上的一个工具,就会立即取代临时工具。

此时,命令提示符变为 I have no name!这是正常的,稍后创建了 /etc/passwd 文件后就正常了。

要点指示 11:CHROOT命令

chroot 即 change root directory,更改 root 目录。使用 chroot 之后,系统的目录结构将以指定的位置作为 "/" 位置。使用chroot 主要有 3 个用途:

1. 限制用户的能力,增加系统安全性。chroot 之后,在新的根目录下访问不到旧系统的根目录结构和文件了。

2. 在进行开发的时候建立一个与原系统隔离的目录结构。可以用来测试软件的静态编译和系统无关的独立开发。

3. 用于系统救急。在系统从磁盘引导起来后,从初始的 RAM 磁盘切换系统的根位置并执行真正的 init。

3.2 创建系统目录结构

Linux/Unix 系统的目录树是有一定规则的,为了解决各种系统的一些差别,已经形成了一个标准(http://www.adintr.com/media/books/fhs.pdf),我们这里将基本按照标准来创建这些目录结构:

I have no name!:/# mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
I have no name!:/# mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
I have no name!:/# install -dv -m 0750 /root
I have no name!:/# install -dv -m 1777 /tmp /var/tmp
I have no name!:/# mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
I have no name!:/# mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
I have no name!:/# mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
I have no name!:/# mkdir -pv /usr/{,local/}share/man/man{1..8}
I have no name!:/# for dir in /usr /usr/local; do
> ln -sv share/{man,doc,info} $dir
> done
I have no name!:/# mkdir -v /var/{lock,log,mail,run,spool}
I have no name!:/# mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

为了保证兼容性,接下来创建一些符号连接:

I have no name!:/# ln -sv /tools/bin/{bash,cat,echo,grep,pwd,stty} /bin>
I have no name!:/# ln -sv /tools/bin/perl /usr/bin
I have no name!:/# ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
I have no name!:/# ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
I have no name!:/# ln -sv bash /bin/sh

创建一个空文件 /etc/mtab,它用来记录已经加载的文件系统:

I have no name!:/# touch /etc/mtab

创建 /etc/passwd 和 /etc/group 文件,这两个文件记录了系统的用户和组信息:

I have no name!:/# cat > /etc/passwd <<  "EOF"
> root:x:0:0:root:/root:/bin/bash
> nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
> EOF
I have no name!:/# cat > /etc/group <<  "EOF"
> root:x:0:
> bin:x:1:
> sys:x:2:
> kmem:x:3:
> tty:x:4:
> tape: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:
> mail:x:34:
> nogroup:x:99:
> EOF

重启 shell 就可以看到正常的命令提示符了:

I have no name!:/# exec /tools/bin/bash --login +h
root:/#  

login,agetty 和 init 等一些程序要使用日志文件来记录登陆之类的信息,如果文件不存在,它们就无法写入,所以我们把这些日志文件先初始化好:

root:/# touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
root:/# chgrp -v utmp /var/run/utmp /var/log/lastlog
changed group of `/var/run/utmp' to utmp
changed group of `/var/log/lastlog' to utmp
root:/# chmod -v 664 /var/run/utmp /var/log/lastlog
mode of `/var/run/utmp' changed to 0664 (rw-rw-r--)
mode of `/var/log/lastlog' changed to 0664 (rw-rw-r--)

系统结构就创建到此了,下面我们开始安装软件。

3.3 安装 Linux 内核头文件

Glibc 需要这些头文件才能工作,所以我们需要首先安装它。

root:/# cd
root:~# cat > install_linux_header.sh <<  "EOF"
> cd /sources
> rm -r linux-2.6.22.5
> tar xvf linux-2.6.22.5.tar.bz2
> cd linux-2.6.22.5
> sed -i '/scsi/d' include/Kbuild
> make mrproper
> make headers_check
> make INSTALL_HDR_PATH=dest headers_install
> cp -rv dest/include/* /usr/include
> cd
> echo -e '\aFinished!'
> EOF
root:~# source install_linux_header.sh

我们首先删除了之前的文件,然后重新解压,并且在安装之前用 sed 命令对安装位置做了一次修改,这是 Glibc 需要的。

3.4 安装 man-pages

包含了一些用户手册。

root:~# cat > install_man_page.sh <<  "EOF"
> cd /sources
> tar xvf man-pages-2.63.tar.bz2
> cd man-pages-2.63
> make install
> cd
> echo -e '\aFinished!'
> EOF
root:~# source install_man_page.sh

3.5 安装 Glibc

Glibc 软件包包含主要的 C 库。这个库提供了基本例程, 用于分配内存、 搜索目录、 打开关闭文件、 读写文件、 字串处理、模式匹配、数学计算等等。

Glibc 对系统来说很重要,所以我们一步一步的来手动安装,确保过程中没有出现错误。首先,我们清除上次安装的临时文件并重新解压:

root:~# cd /sources
root:/sources# rm -r glibc-2.5.1
root:/sources# tar xvf glibc-2.5.1.tar.bz2
root:/sources# cd glibc-2.5.1
root:/sources/glibc-2.5.1#  

glibc-libidn 为 Glibc提供 IDN(国际化域名,即包含各地本地语言的域名,比如中文域名等等) 支持,解压 glibc-libidn 的源代码到 glibc 的目录下以便一起进行安装。

root:/sources/glibc-2.5.1# tar xvf ../glibc-libidn-2.5.1.tar.gz
root:/sources/glibc-2.5.1# mv glibc-libidn-2.5.1 libidn

在vi_VN.TCVN 脚本里,bash 会进入死循环,目前还不清楚是 bash 的 BUG 还是 Glibc 的 BUG,我们禁止安装它来避免这个问题。

root:/sources/glibc-2.5.1# sed -i '/vi_VN.TCVN/d' localedata/SUPPORTED

当运行 make install 时,一个叫做 test-installation.pl 的脚本会在我们新安装的 Glibc 上做一个小的完整性测试。然而,由于我们的 toolchain 仍然指向 /tools 目录, 完整性测试会导致使用错误的Glibc。安装下面的操作, 我们可以强制脚本测试我们刚安装的 Glibc:

root:/sources/glibc-2.5.1# sed -i 's|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=/lib/ld-linux.so.2 -o|' scripts/test-installation.pl

ldd shell 脚本包含 Bash-specific 语法。 如果参照BLFS文档的 Shells章节安装了其他的 /bin/sh 的话,要把它的默认程序解释器改变为 /bin/bash:

root:/sources/glibc-2.5.1# sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

现在开始为编译进行配置:

root:/sources/glibc-2.5.1# rm -r ../glibc-build
root:/sources/glibc-2.5.1# mkdir ../glibc-build
root:/sources/glibc-2.5.1# cd ../glibc-build
root:/sources/glibc-build# ../glibc-2.5.1/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc

一步一步的进行,确保没有错误:

root:/sources/glibc-build# make

下面是测试,注意不要跳过:

root:/sources/glibc-build# touch /etc/ld.so.conf
root:/sources/glibc-build# make -k check 2>&1 | tee glibc-check-log

其中一些已知的错误是可以忽略的,包括 posix/annexc、nptl/tst-clock2、nptl/tst-attr3、rt/tst-cpuclock2、math、atime。之后进行安装:

root:/sources/glibc-build# make install

下面是安装本地化,这不是必须的,但是没有的化之后的某些测试会被跳过:

root:/sources/glibc-build# mkdir -pv /usr/lib/locale
mkdir: created directory `/usr/lib/locale'
root:/sources/glibc-build# localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
root:/sources/glibc-build# localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
root:/sources/glibc-build# localedef -i de_DE -f ISO-8859-1 de_DE
root:/sources/glibc-build# localedef -i de_DE -f UTF-8 de_DE.UTF-8
root:/sources/glibc-build# localedef -i en_HK -f ISO-8859-1 en_HK
root:/sources/glibc-build# localedef -i en_PH -f ISO-8859-1 en_PH
root:/sources/glibc-build# localedef -i en_US -f ISO-8859-1 en_US
root:/sources/glibc-build# localedef -i en_US -f UTF-8 en_US.UTF-8
root:/sources/glibc-build# localedef -i es_MX -f ISO-8859-1 es_MX
root:/sources/glibc-build# localedef -i fa_IR -f UTF-8 fa_IR
root:/sources/glibc-build# localedef -i fr_FR -f ISO-8859-1 fr_FR
root:/sources/glibc-build# localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
root:/sources/glibc-build# localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
root:/sources/glibc-build# localedef -i it_IT -f ISO-8859-1 it_IT
root:/sources/glibc-build# localedef -i ja_JP -f EUC-JP ja_JP
root:/sources/glibc-build# localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
root:/sources/glibc-build# localedef -i zh_CN -f GB18030 zh_CN.GB18030

我们还需要创建 /etc/nsswitch.conf 文件,因为在这个文件丢失或不正确的情况下,Glibc 会使用默认配置, 而 Glibc 的默认配置无法很好地在网络环境下工作。 并且我们也需要设置自己的时区。

root:/sources/glibc-build# cat > /etc/nsswitch.conf <<  "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
> EOF
root:/sources/glibc-build# tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
 1) Africa
 2) Americas
 3) Antarctica
 4) Arctic Ocean
 5) Asia
 6) Atlantic Ocean
 7) Australia
 8) Europe
 9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
 1) Afghanistan           18) Israel                35) Palestine
 2) Armenia               19) Japan                 36) Philippines
 3) Azerbaijan            20) Jordan                37) Qatar
 4) Bahrain               21) Kazakhstan            38) Russia
 5) Bangladesh            22) Korea (North)         39) Saudi Arabia
 6) Bhutan                23) Korea (South)         40) Singapore
 7) Brunei                24) Kuwait                41) Sri Lanka
 8) Cambodia              25) Kyrgyzstan            42) Syria
 9) China                 26) Laos                  43) Taiwan
10) Cyprus                27) Lebanon               44) Tajikistan
11) East Timor            28) Macau                 45) Thailand
12) Georgia               29) Malaysia              46) Turkmenistan
13) Hong Kong             30) Mongolia              47) United Arab Emirates
14) India                 31) Myanmar (Burma)       48) Uzbekistan
15) Indonesia             32) Nepal                 49) Vietnam
16) Iran                  33) Oman                  50) Yemen
17) Iraq                  34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang
3) central China - Gansu, Guizhou, Sichuan, Yunnan, etc.
4) Tibet & most of Xinjiang Uyghur
5) southwest Xinjiang Uyghur
#? 1

The following information has been given:

        China
        east China - Beijing, Guangdong, Shanghai, etc.

Therefore TZ='Asia/Shanghai' will be used.
Local time is now:      Sun Apr 15 23:18:28 CST 2012.
Universal Time is now:  Sun Apr 15 15:18:28 UTC 2012.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
        TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai
root:/sources/glibc-build# cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
removed `/etc/localtime'
`/usr/share/zoneinfo/Asia/Shanghai' -> `/etc/localtime'

其中,cp 命令的 --remove-destination选项强制删除已存在的符号链接。我们采用拷贝文件而不是创建符号链接的原因是:有可能 /usr 在单独的分区上,如果启动进入单用户模式,就会出问题。

默认情况下,动态链接库加载程序 (/lib/ld-linux.so.2) 搜索 /lib 和 /usr/lib 目录来寻找程序运行时需要使用的动态连接库。 但是, 如果某些库在这两个目录之外, 你就需要把它们的路径加到 /etc/ld.so.conf 文件里,以便动态链接库加载程序能够找到它们。 /usr/local/lib 和 /opt/lib 是两个经常包含动态连接库但又不在默认目录中的目录, 我们要把它们添加到动态链接库加载程序的搜索路径中。

root:/sources/glibc-build# cat > /etc/ld.so.conf <<  "EOF"
> # Begin /etc/ld.so.conf
> /usr/local/lib
> /opt/lib
> # End /etc/ld.so.conf
> EOF

3.6 再次调整工具链

现在,最终的 Glibc库已经安装好了,我们需要再次调整工具链,让随后编译的那些工具都连接到这个库上。上一次调整工具链的时候,我们从宿主系统的 /{,usr/}lib 转向新安装的/tools/lib 目录。现在,我们把工具链使用的库将从临时的 /tools/lib 转向 LFS 系统最终的 /{,usr/}lib 目录。调整的过程和之前是类似的。

root:~# mv -v /tools/bin/{ld,ld-old}
root:~# mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
root:~# mv -v /tools/bin/{ld-new,ld}
root:~# ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
root:~# gcc -dumpspecs | sed -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > `dirname $(gcc --print-libgcc-file-name)`/specs

首先,进行备份后替换掉原来的连接器。然后修改 gcc 的 specs 文件,只需要把其中 /tools 的内容删除掉,就会自动指向正确的路径了。下面我们对调整进行检查,首先可以尝试用 vi 打开 `dirname $(gcc --print-libgcc-file-name)`/specs 文件,搜索是否还有 /tools 存在。然后我们编译程序来检验:

root:~# echo 'main(){}' > dummy.c
root:~# cc dummy.c -v -Wl,--verbose &> dummy.log
root:~# readelf -l a.out | grep ': /lib'
      [Requesting program interpreter: /lib/ld-linux.so.2]
root:~# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
root:~# grep -B1 '^ /usr/include' dummy.log
#include <...> search starts here:
 /usr/include
root:~# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
root:~# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:~# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:~# rm -v dummy.c a.out dummy.log
removed `dummy.c'
removed `a.out'
removed `dummy.log'

确保你看到的输出和上面一致或类似,尤其注意前缀应该是 /lib,/usr这样的,除了 SEARCH_DIR("/tools/i686-pc-linux-gnu/lib") 外不应该再包含 /tools 了。

如果你的输出不正常,在继续之前必须检查之前的步骤,确保输出正常。

3.7 安装 Binutils 和 Gcc

首先安装 Binutils

root:~# cat > install_binutils.sh <<  "EOF"
> cd /sources
> rm -r binutils-build
> rm -r binutils-2.17
> tar xvf binutils-2.17.tar.bz2
> cd binutils-2.17
> mkdir -v ../binutils-build
> cd ../binutils-build
> ../binutils-2.17/configure --prefix=/usr --enable-shared
> make tooldir=/usr
> make check
> make tooldir=/usr install
> cp -v ../binutils-2.17/include/libiberty.h /usr/include
> echo -e "\aFinished!"
> EOF
root:~# source install_binutils.sh

然后是 gcc

root:~# cat > install_gcc.sh <<  "EOF"
> cd /sources
> rm -r gcc-build
> rm -r gcc-4.1.2
> tar xvf gcc-4.1.2.tar.bz2
> cd gcc-4.1.2
> sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
> sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
> sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
> sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
> mkdir -v ../gcc-build
> cd ../gcc-build
> ../gcc-4.1.2/configure --prefix=/usr --libexecdir=/usr/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
> make
> make -k check
> make install
> ln -sv ../usr/bin/cpp /lib
> ln -sv gcc /usr/bin/cc
> echo -e "\aFinished!"
> EOF
root:~# source install_gcc.sh

其中 sed 的作用分别是:

1. 禁止安装 libiberty.a,我们使用 Binutils 中的那一份;
2. 保持和 bootstrap 编译的编译选项一致;
3. 禁用 fixincludes 脚本,它有可能会出错,而我们的头文件不需要修复;
4. 我们稍后再安装 mktemp,这里让 gcc 先认为我们已经安装了。

安装完成后可以使用

root:/sources/gcc-build# ../gcc-4.1.2/contrib/test_summary
root:/sources/gcc-build# ../gcc-4.1.2/contrib/test_summary | grep -A7 Summ

命令来查看测试结果和摘要。

最后,我们还要做一次和调整完工具链之后相似的验证,如果以下命令输出有不一致的地方,就需要检查前面的步骤了:

root:~# echo 'main(){}' > dummy.c
root:~# cc dummy.c -v -Wl,--verbose &> dummy.log
root:~# readelf -l a.out | grep ': /lib'
      [Requesting program interpreter: /lib/ld-linux.so.2]
root:~# grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o succeeded
root:~# grep -B3 '^ /usr/include' dummy.log
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
 /usr/include
root:~# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
root:~# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:~# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:~# rm dummy.c a.out dummy.log

3.8 安装其他软件包

到此我们最终的编译环境就已经搭建好了,现在我们开始编译和安装软件包。和之前一样,为了简便,我们把这些软件包的安装命令都放在脚本里面,可以一次完成所有安装,也可以分别进行安装。我们要安装的软件包括:

Berkeley DB:数据库相关的程序和工具,许多其他的应用会使用到;
Sed:一个流编辑器;
E2fsprogs:处理ext2 文件系统的工具,它还支持ext3 和 ext4 日志文件系统;
Coreutils:包括一套显示、设置基本系统属性的工具;
Iana-Etc:提供了网络服务和协议的数据;
M4:M4 软件包包含一个宏处理器;
Bison:包含一个语法分析程序生成器;
Ncurses:包提供字符终端处理库;
Procps:包含监测程序的程序;
Libtool:一个GNU通用库支持脚本, 将使用动态库的复杂性隐藏在统一的、可移植的接口中;
Perl:实用萃取与报告语言(Practical Extraction and Report Language);
Readline:一个提供命令行编辑和历史纪录功能的库集合;
Zlib:一些程序会用到的压缩和解压程序;
Autoconf:生成用于自动配置源代码的 shell 脚本;
Automake:与 Autoconf 配合使用,产生 Makefile 文件;
Bash:Bourne-Again SHell,命令行解析软件;
Bzip2:包含了对文件进行压缩和解压缩的工具,对于文本文件,bzip2 比传统的gzip拥有更高压缩比;
Diffutils:显示两个文件或目录的差异;
File:用来判断一个或一组文件类型的工具;
Findutils:查找文件的工具;
Flex:能生成识别文本模式程序的工具;
GRUB:包含 GRand 统一引导装载程序;
Gawk:包含处理文本文件的程序;
Gettext:包含国际化和本地化的工具;
Grep:可以搜索文件中符合指定匹配模式的行;
Groff:包含一些处理和格式化文本的程序;
Gzip:包含压缩和解压缩文件的程序;
Inetutils:包含基础网络程序;
IPRoute2:包含了基本的和高级的基于 IPv4 网络的程序;
Kbd:包含键盘映射表和键盘工具;
Less:包含一个文本文件查看器;
Make:包含一个编译软件包的程序;
Man-DB:查找和显示 man 手册页的程序;
Mktemp:在 shell 脚本中创建安全的临时文件;
Module-Init-Tools:处理 Linux内核模块时使用的工具;
Patch:一个根据“patch”文件来修改或建立文件的程序。补丁文件通常是用 diff 程序创建的;
Psmisc:用于显示进程信息的程序;
Shadow:用于安全方式下处理密码的程序;
Sysklogd:包含记录系统日志信息的程序,比如内核处理意外事务的日志;
Sysvinit:一些控制系统启动、运行、关闭的程序;
Tar:一个归档程序;
Texinfo:读取、写入和转换成 Info 文档的程序;
Udev:包含动态地创建设备节点的程序;
Util-linux:包括处理文件系统,控制台,分区和信息的工具;
Vim:一个强大的文本编辑器。

安装这些软件包的脚本由于太长,就不详细列出来了,可以通过如下方式从网络获取来进行安装:

root:~# cd
root:~# wget http://www.adintr.com/down/lfs/install_tools.tar.gz
root:~# tar xvf install_tools.tar.gz
root:~# source install_tools/install_all.sh

如果当前系统中找不到 wget 命令,可以先 exit 退回 LiveCD 的系统,下载好文件后再运行之前创建的 ./chsys.sh 来进入 LFS 的系统。

   上一章   回目录   下一章   

▲评论

› 网友 匿名 () 于 2014-02-28 09:59:20 发表评论说:

最后一部,退回 退回 LiveCD 的系统下载好了install_tools.tar.gz ,但运行./chsys.sh 进来后,找不到这个包了.....怎么办?

› 网友 匿名 () 于 2014-02-28 10:14:35 发表评论说:

找到原因了,这个install_tools.tar.gz要从/root目录下,复制到/mnt/lfs/source目录下就好.

› 网友 zero () 于 2014-02-28 12:53:47 发表评论说:

终极版:
1.在LiveCD系统(寄主系统)里面要把下好的包,移动到/mnt/lfs/root里面,这样LFS系统的/root目录里才能看到这个下好的包(sh的脚本,安装路径都指向这里).
2. tar -zxvf install_tools.tar.gz
3. cd install_tools
4. source install_all.sh

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com