小站会根据您的关注,为您发现更多,

看到喜欢的小站就马上关注吧!

下一站,你会遇见谁的梦想?

小站头像

LFS

RSS 归档

站长

61人关注

站长在关注

2012 / . 06 / . 28

5.5. GCC-4.6.2 - 第一遍

GCC 软件包包含 GNU 编译器集合,其中有 C 和 C++ 编译器。

 

预计编译时间:      5.0 SBU

所需磁盘空间:     1.2 GB


5.5.1. 安装交叉编译 GCC

 

现在,GCC需要GMP,MPFR和MPC软件包。可能由于你的宿主系统的发行版并没有包含这些软件包,所以它们需要和GCC一起编译。解压每一个软件包放置到GCC源码目录下并重命名解压后的文件夹从而方便GCC自动的使用它们:

 

tar -jxf ../mpfr-3.1.0.tar.bz2


mv -v mpfr-3.1.0 mpfr


tar -Jxf ../gmp-5.0.4.tar.xz


mv -v gmp-5.0.4 gmp


tar -zxf ../mpc-0.9.tar.gz


mv -v mpc-0.9 mpc

 

应用一个补丁程序来允许 libiberty 和 zlib 目标库的创建从而来禁止那些在交叉环境中不正确的选项:

 

patch -Np1 -i ../gcc-4.6.2-cross_compile-1.patch

 

GCC 的文档推荐创建一个专用目录来编译它,而不是在源码目录中:


mkdir -v ../gcc-build


cd ../gcc-build


为编译 GCC 做准备:


../gcc-4.6.2/configure \
--target=$LFS_TGT --prefix=/tools \
--disable-nls --disable-shared --disable-multilib \
--disable-decimal-float --disable-threads \
--disable-libmudflap --disable-libssp \
--disable-libgomp --disable-libquadmath \
--disable-target-libiberty --disable-target-zlib \
--enable-languages=c --without-ppl --without-cloog \
--with-mpfr-include=$(pwd)/../gcc-4.6.2/mpfr/src \
--with-mpfr-lib=$(pwd)/mpfr/src/.libs


配置选项的含义:

--disable-shared
    该参数强制 GCC 链接其内部的静态库。 我们这样做是为了避免和宿主系统产生问题。
--disable-decimal-float, --disable-threads, --disable-libmudflap, --disable-libssp, --disable-libgomp
    这些参数分别禁用了十进制浮点运算、线程、 libmudflap, libssp 和 libgomp 的支持。 这些功能在建立交叉编译器时会造成编译失败,而且,在交叉编译临时libc 的任务中也不是必需的。
--disable-multilib
    在 x86_64 架构上, LFS 系统还不支持 multilib 的配置。 这个参数对x86架构是无害的。
--enable-languages=c
    这个参数确保只建立 C 编译器。我们现在只需要这一种编译器。

 

编译 GCC:


make


现在编译完成了。 通常我们会在这里运行测试套件,但是正如前面说过的, 测试套件目前尚未 安装, 而且在这里运行测试没什么用处, 因为第一遍安装的程序很快就会被第二遍的程序所覆盖。


安裝这个软件包:


make install


使用 --disable-shared 参数的意思是不编译和安装 libgcc_eh.a 文件。Glibc 软件包依赖这个库, 因为它使用其内部的 -lgcc_eh 来创建系统。 这种依赖性,可通过建立一个指向 libgcc.a符号链接得到满足, 因为该文件最终将含有通常在 libgcc_eh.a 中的 对象:


ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | \
sed 's/libgcc/&_eh/'`


这个软件包的详细内容位于6.17.2章节,“GCC的内容”。

 

2012 / . 04 / . 18

5.4. Binutils-2.22 - 第一遍

Binutils 软件包包含一个链接器,一个汇编器和其他处理目标文件的工具。

 

预计编译时间:      1 SBU

所需磁盘空间:     350 MB


5.4.1. 安装交叉编译 Binutils

 

[Note]    注意

回头重新阅读上节中的注意事项。理解这些标记的 “note” 对于你以后节省大量问题很重要。

 

安装的第一个软件包是 Binutils ,这非常重要,因为 Glibc 和 GCC 会针对可用的连接器 和汇编器进行多种测试,以决定启用它们自己的哪些特性。

 

Binutils 的文档推荐创建一个专用目录来编译它,而不是在源码目录中:

 

mkdir -v ../binutils-build


cd ../binutils-build

 

[Note]    注意

如果你想使用本书余下部份列出的 SBU 值, 那么现在就要测量一下编译本软件包的时间。 你可以用类似于下面这样的 time 命令 : time { ./configure ... && make && make install; }.

 

[Note]    注意

第5章中的SBU的估所需的磁盘空间大小的估值不包括测试套件数据

 

现在为编译 Binutils 作准备:

 

../binutils-2.22/configure \
    --target=$LFS_TGT --prefix=/tools \
    --disable-nls --disable-werror


配置选项的含义:

--target=$LFS_TGT
    因为 LFS_TGT 变量中的机器描述和 config.guess 脚本的返回值略有不同, 所以, 这个开关会告诉 configure 脚本,为了创建交叉链接器,要调整Binutil 的编译系统。

--prefix=/tools
    这个参数告诉 configure 脚本,准备把 Binutils 软件包中的程序安装到 /tools 目录中。

--disable-nls
    这个参数禁止了国际化(通常简称i18n --译者),因为临时工具不需要i18n特性。

--disable-werror
    在有从宿主编译器发出的警告时,这个参数防止了编译程序停止。

 

接下来编译这个软件包:

 

make

 

现在编译完成了, 通常我们会运行测试套件,但是目前测试套件(Tcl, Expect, DejaGNU) 尚未安装。 而且在这里运行测试也没什么用处, 因为第一遍安装的程序很快就会被第二遍的程序 所覆盖。

 

如果在x86_64 上编译,就要创建一个符号链接,来确保工具链正常:

 

case $(uname -m) in
  x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac

 

安装这个软件包:

 

make install

 

这个软件包的详细内容位于6.13.2章节, “ Binutils 的内容 ”

2012 / . 04 / . 16

5.3. 常用编译器用法说明

当安装软件包时,在本说明中提出了一些假设:


一些软件包在编译前打了补丁, 但是只有在需要用补丁来规避问题时才需要打。 一个补丁经常在本章和下一章都需要, 但是有时仅用在其中一章里。 因此, 如果某个已下载的补丁忘记介绍了, 请不要着急。在使用补丁时,也有可能遇到关于 offset 或 fuzz 的警告信息。 因为这个补丁总会应用成功, 所以你不必担心这些警告信息。

 

在大部分软件包的编译过程中,屏幕上会出现一些警告, 这是正常的, 可以放心的忽略。 这些警告就像它显示的--是关 或 C++ 语法过时的警告,但该语法并非无效。 语言的标准变化相当频繁, 而一些软件包还在使用旧的标准。 这没有问题, 但会引起警告。



[Important]    重要

安装完每一个软件包后,除非特别指出,要删除它们的源目录和编译目录, 删除这些资源可以避免以后重安装同一个软件包时,出现误配置。

 



最后一次检查 LFS 环境变量设置是否正确:


echo $LFS


确保输出显示的目录是 LFS 分区的挂载点。在我们的例子中,是 /mnt/lfs

最后,必须要强调两个重点:



[Important]    重要

本构建指导假设使用的是 bash shell。

 

 

[Important]    重要

再次强调一下构建过程:

1.  将所有源码和补丁放置到一个目录中,如/mnt/lfs/source/, 从而能在chroot环境中可以访问到。但不要把源码放置到/mnt/lfs/tools/这个目录下。

2.  切换到源码目录下。

3. 对于每个包:
    a. 使用tar工具解压软件包。在第五章中,一定确认自己是lfs用户来解压软件包的。
    b. 切换到解包创建的目录下。
    c.  根据这本书的说明来构建包。
    d.  切换回源码目录下。
    e.  删除它们的源目录和任何<package>编译目录在这个创建的过程中。除非另有说明。

 

2012 / . 04 / . 16

5.2. 工具链技术说明

本节阐述了整个构建方法的一些基本原理和技术细节, 您不必马上就理解本节中的所有内容。 在您实际操作之后,就会了解大多数的东西,您可以在任何时候回顾本节。

 

第五章的总体目标是提供一个临时环境,它包含一组已知良好的脱离宿主系统的工具。 为创建一个干净、 没有问题的目标LFS系统,通过使用 chroot, 剩下章节中的命令将包含在这个环境中。这个创建过程被设计为尽量减少新手犯错误的可能, 同时尽可能多的提供教育价值。

 

[Important]    重要

在继续之前,要先知道工作平台的名称,就是所谓的"target triplet"(目标三元组)。要确定 target triplet 的名称, 有一个简单的方法, 就是运行许多源码包里都有的 config.guess 脚本。解开 Binutils 的源码包,然后运行脚本 ./config.guess并注意输出的内容。例如, 最新的32位Intel 处理器的输出类似于 i686-pc-linux-gnu

工作平台的动态连接器名称也需要知道,这里指的是动态加载器(不要与 Binutils 里的 标准连接器 ld 混淆了)。动态连接器由 Glibc 提供, 用来找到并加载一个程序运行时所需的共享库, 在做好程序运行的准备之后,运行这个程序。32位Intel电脑的动态连 接器的名称通常是 ld-linux.so.2。确定这个名称还有一个必杀技, 就是在宿主系统 上随便找一个二进制文件,运行 readelf -l <二进制文件名> | grep interpreter并查看输出的内容。涵盖所有平台的权威参考请查看 Glibc 源码根目录里的 shlib-versions 文件。

 

关于第五章中构建方法如何工作的一些技术要点:

 

1、通过改变 LFS_TGT 变量的“生产商”字段,稍微调整工作平台的名字,来确定首先安装的Binutils 和 GCC 生成了一个兼容的交叉连接器和交叉编译器。 交叉链接器和交叉编译器会产生兼容当前硬件的二进制文件,而不是另一个架构的二进制文件。

 

2、临时库文件是交叉编译的, 因为本地的交叉编译器不能对宿主系统有任何依赖关系,所以本方法通过减少宿主系统的头文件或库进入新工具链的机会,消除了对目标系统的潜在污染。 交叉编译还使在64位硬件上创建32位和64位库文件成为可能性。

 

3、小心处理 gccspecs 文件,该文件告诉编译器要使用哪个动态连接器。

 

首先安装的是 Binutils, 因为 GCC 和 Glibc 运行的 configure 文件要在汇编器和联接器上执行各种各样的特性测试, 以确定软件的哪些功能要启用, 哪些功能要禁用。 这样做比你想像的还要重要,配置不正 确的 GCC 或者 Glibc 会导致工具链出现微妙的错误,这样的错误造成的影响可能直到整个系统快要编译 完成的时候才显现出来。 测试程序通常会在其它的许多工作进行之前给出错误警告 。

 

Binutils 将它的汇编器和连接器安装在两个位置: /tools/bin/tools/$LFS_TGT/bin。 一个位置的工具是另外一个位置的硬链接。 连接器的一个重要用途是它的库搜索顺序,将 --verbose 参数传递给 ld 可以获得详细的信息。比如,输入 ld --verbose | grep SEARCH 将显示当前搜索路径和顺序。要显示 ld 连接的是哪些文件,可以编译一个伪(dummy)程序并把 --verbose 参数传递给连接器。例如,输入 gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded 将显示所有连接过程中成功打开的文件。

 

第二个安装的软件包是 GCC。 下面是运行 configure 脚本时,输出内容的一个示例:

 

checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as
checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld

 

基于上面提到过的原因,这是重要的步骤,它同时证明了 GCC 的配置脚本并不是搜索 PATH 里的目录来寻找要使用哪个工具的,而且,在 gcc 的实际操作中, 不必使用相同的搜索路径。 要知道 gcc会使用哪个标准连接器,请运行命令:gcc -print-prog-name=ld

 

在编译一个伪程序的时候,给 gcc 命令传递 -v 选项可以获得详细的信息。举个例子: gcc -v dummy.c 将显示在预处理、编译和汇编各个阶段的详细信息,包括 gcc文件包含的搜索路径及其顺序。

 

接下来安装的软件包是 Glibc。编译 Glibc 的时候, 最需要注意的地方是编译器、 二进制工具(Binutils)和内核头文件。编译器一般不是问题, 因为 Glibc 总是将与编译器相关的 --host 参数传递给它的配置脚本,在我们的例子里就是 i686-lfs-linux-gnu-gcc, 而二进制工具和内核头文件可能有点复杂。因此, 为慎重起见, 要使用可用的配置开关(选项)来强制进行正确的选择。在运行 configure 之后,请检查 glibc-build 目录下的 config.make 文件的内容,查看所有重要的细节。 注意 CC="i686-lfs-gnu-gcc"的作用是控制要使用哪个二进制工具; 而 -nostdinc-isystem 参数则是用来控制编译器的 include 搜索路径。 这些选项表明了 Glibc 软件包的一个重要特征:根据其编译机器的情况, 它是非常自给自足的, 而且一般不依赖于工具链的默认值。

 

安装完 Glibc 以后, 要更改 gcc 的 specs 文件,以便指向 /tools/lib 里新的动态连接器。 最后一步是至关重要的,要确保搜索和链接只在预设的 /tools 目录内进行。 指向动态链接器的固化路径被嵌入到每个共享的可执行和链接格式 (ELF)文件里。 这可以通过运行: readelf -l <name of binary> | grep interpreter 来检查。修改 gcc 的specs 文件,确保从现在到本章结束,编译的每个程序都使用 /tools/lib

 

对于第二遍编译 GCC,为了告诉GCC使用新的动态连接器,它的源代码也需要改变。 不这样做的 结果是 GCC 会把宿主系统 /lib 目录下动态连接器的名字嵌入进来, 这样有悖于与宿主系统隔离的目标。

 

第二遍编译 Binutils 的过程中,我们利用 --with-lib-path 选项来控制 ld 的库搜索路径。 如前面所指出的,核心工具链是自包含和自依赖的,所以第五章余下的软件包的编译将依赖于 /tools 下新的 Glibc 。

 

第六章中进入 chroot 环境后,第一个安装的主要软件包就是 Glibc, 原因是上面所提 到的 Glibc 自给自足的特性。 一旦 Glibc 安装到 /usr 目录后, 我们会马上改变工具链的默认 值, 然后构建目标 LFS 系统的其它部分。

2012 / . 04 / . 15

5.1. 介绍

本章介绍如何编译和安装一个小的 Linux 系统。这个系统将仅包含必要的工具,来开始构建第六章中最终的LFS系统。 同时,提供一个更方便用户的工作环境。

 

构建这个小系统分两步进行,第一步是构建一个新的不依赖于宿主系统的工具链(编译器、汇编器 、 连接器、库文件以及一些有用的软件),第二步是利用这个工具链去构建其它基本的工具。

 

本章中编译的文件将安装在 $LFS/tools 目录下, 这样可以与下一章将要安装的软件以及宿主系统区分开来。因为现在编译出来的软件包是起临时作用的,我们不希望这些软件和即将建立的 LFS 系统混杂在一起。

2012 / . 04 / . 15

5. 构建临时系统

5.1  介绍

5.2  工具链技术说明

5.3  常用编译器用法说明

5.4  Binutils-2.22 - 第一遍

5.5  GCC-4.6.2 - 第一遍

5.6  Linux-3.2.6 API Headers

5.7  Glibc-2.14.1

5.8  调整工具链

5.9  Binutils-2.22 - 第二遍

5.10 GCC-4.6.2 - 第二遍

5.11 Tcl-8.5.11

5.12 Expect-5.45

5.13 DejaGNU-1.5

5.14 Check-0.98

5.15 Ncurses-5.9

5.16 Bash-4.2

5.17 Bzip2-1.0.6

5.18 Coreutils-8.15

5.19 Diffutils-3.2

5.20 File-5.10

5.21 Findutils-4.4.2

5.22 Gawk-4.0.0

5.23 Gettext-0.18.1.1

5.24 Grep-2.10

5.25 Gzip-1.4

5.26 M4-1.4.16

5.27 Make-3.82

5.28 Patch-2.6.1

5.29 Perl-5.14.2

5.30 Sed-4.2.1

5.31 Tar-1.26

5.32 Texinfo-4.13a

5.33 Xz-5.0.3

5.34 清理系统
   
5.35 改变所有者

2012 / . 04 / . 13

4.6. 关于软件包测试套件

大多数软件包提供测试套件。编译完一个软件包之后最好立即运行一下它提供的测试程序, 因为测试程序将进行一次"健全检查"来确认所有的代码是否都正确编译了。 通过了测试程序的一系列检查,通常意味着软件包在按照开发者的预期运行, 但是这并不保证这个软件包就完全没有 bug 了。

 

某些软件包的测试程序是极为重要的,例如核心工具链软件包 GCC 、Binutils 、Glibc 的测试程序, 这是因为这些软件包在一个良好工作的系统里的处于核心角色。GCC 和 Glibc 的测试程序需要运行很长时间,尤其在速度慢的硬件上,但我们仍然强烈建议您运行这些测试程序。

 

[Note]    注意

经验显示,运行第五章中的测试程序时会有点小问题。 不可避免的是, 宿主系统总是对这一章的测试程序施加某些影响, 常常导致无法解释的测试失败。因为第五章中编译的工具是临时的, 而且在最后会被丢弃, 我们不推荐中等水平的读 者运行第五章中的测试程序, 这些测试程序的 指令是为开发和测试人员准备的, 它们不是必需的。

 

Binutils 和 GCC 的测试程序一个常见的问题就是在伪终端(PTY)外运行, 这样可能会出现大 量的测试失败。 可能的原因有几个, 但最可能的原因是宿主系统没有正确的设置 devpts 文件系统, 关于这个问题更详细的讨论请参考 http://www.linuxfromscratch.org//lfs/faq.html#no-ptys.

 

某些软件包测试程序可能会给出错误的失败信息,请参考 http://www.linuxfromscratch.org/lfs/build-logs/7.1/ 以确认您所遇到的 测试失败是否是预期会出现的。这个站点的内容对于本书所有的测试都是正确的。

 

2012 / . 04 / . 12

4.5. 关于 SBUs

许多人都想知道编译和安装一个软件包预计需要多长时间。因为 Linux From Scratch 可以在多种不同的系统上创建, 准确估计所需的时间是不可能的。 最快的系统上编译安装最大的软件包(Glibc)大约需要 20 分钟, 但在很慢的系统上可能耗费长达三天时间。 我们不提供准确时间, 代之以标准编译时间单位(SBU)来度量。

 

SBU 度量具体说明如下,本书中第一个编译的软件包是第五章中静态编译的 Binutils 。 编译这个软件包所花费的时间就作为标准编译时间单位或SBU。 所有其它软件的编译时间都用这个时间来衡量。

 

例如,对于一个编译时间为 4.5 SBU 的软件包,这意味着如果一个系统静态编译安装 Binutils 需要花费 10 分钟,那么编译这个软件包将大约需要 45 分钟。 幸运的是, 大多数软件包编译安装所需的时间都比 Binutils 所需的时间要短。

 

 

通常,SBU 并不十分精确,因为它依赖于许多因素,包括宿主系统 GCC 的版本。另外, 在基于对称 多处理器(SMP)的机器上,SBU 更加不准确。我们提供SBU, 仅仅是给出安装一个软件包所需 时间的大概估计, 在某些情况下实际花费的时间与预估计的时间之间可能有数十分钟的差异。

 

 

 

要查看在一些特定机器上的实际编译安装时间,我们推荐您查看 LinuxFromScratch SBU 的主页 http://www.linuxfromscratch.org/~sbu/.

 

 

 

[Note]    注意

 对于很多使用多处理器(或核心)的现代系统, 通过设置一个环境变量或告诉 make 程序有几个可用的处理器,以执行”并行编译“可以减少编译一个软件包的时间,比如,一个 Core2Duo 通过下面的设置,可以支持两个并行的处理器:

set MAKEFLAGS='-j 2'

或仅仅在编译时使用下列参数:

make -j2

因此,当使用多处理器时,本书中得 SBU 单位会比通常差别更大。因为不同进程的线路相互交错,所以分析编译过程的输出也更加困难。如果你在编译过程中遇到问题,为了正确分析这些错误信息,就需要恢复到单个处理器来编译。

2012 / . 04 / . 11

4.4. 设置环境变量

通过给 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, TERMPS1 变量外)。 这样能保证我们的编译环境不会被宿主系统中不必要的或者有潜在危险的环境变量所影响, 从而确保获得一个干净的工作环境。

 

另一个新的 shell 实例是非登陆shell(non-login shell),它不读取 /etc/profile.bash_profile 文件,而是读取 .bashrc 文件。现在创建 .bashrc 文件:

 

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
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"以外的值 (在本章中) 可能会在您退出 chroot 环境后再想返回的时候出现问题。 请把 LC_ALL 设置为 “POSIX” 或 “C” (这两者是等价的) 以确保在 chroot 环境中的所有东西都像预期的那样正常工作。

 

LFS_TGT 变量设置一个非默认的,但是用于我们建立交叉编译器和链接器以及交叉编译我们的临时工具链时的兼容机器说明。 更多的信息包含在 Section 5.2, “工具链技术说明”

 

通过把 /tools/bin 放在标准 PATH 文件最前面,使 第五章 中所有的程序安装好后, 就可以立即被 shell 运行。将这一点和关闭 hash 功能结合起来, 预防了当第5章环境中的程序要运行时,宿主系统中的相同的程序被运行的风险。

 

最后,为了完全准备好编译临时工具的工作环境,导入刚刚创建的 profile 文件:

 

source ~/.bash_profile

2012 / . 04 / . 10

4.3. 添加 LFS 用户

以root 用户登录的时候,犯一个错误就足以损坏甚至摧毁系统,因此,本章我们推荐使用一个无特权的用户来编译和安装软件包。您可以使用您自己的用户名,不过为了建立一个干净的工作环境,建议您新建一个名为lfs 的组,并在其中添加一个名为 lfs 的用户,我们将在安装过程中使用这个用户。以root 用户运行下列命令来添加新用户:

 

groupadd lfs


useradd -s /bin/bash -g lfs -m -k /dev/null lfs

 

命令行选项的含义是:

-s /bin/bash

指定 bashlfs 用户的默认 shell。

 

-g lfs

该选项将 lfs 用户添加到 lfs 组。

 

-m

该选项为 lfs 用户创建 home 目录。

 

-k /dev/null

这个参数通过将输入位置修改为特殊的空设备来防止从框架目录(默认是 /etc/skel) 拷贝文件。

 

lfs

这是所创建的组和用户的实际名字

 

为了可以使用 lfs 用户登录(与从 root 用户切换到 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.

 

 

2012 / . 04 / . 09

4.2. 创建 $LFS/tools 目录

第五章中编译的所有程序都将安装到 $LFS/tools 目录下,以便与第六章中编译的程序隔离开来。 这里编译的程序只是临时使用的工具,不是最终 LFS 系统的组成部分。 把这些程序放到一个单独的目录下,在使用过之后简单的删除掉就可以了。 这样做也可以防止这些程序与宿主系统中相同的程序混淆 ( 第五章中容易出现这样的事情)。

 

以 root 用户运行下面的命令来创建所需的目录:

 

mkdir -v $LFS/tools

 

下一步是在宿主系统上创建一个 /tools 符号链接,指向 LFS 分区上新创建的目录, 这个命令同样要作为 root 身份运行:

 

ln -sv $LFS/tools  /

 

[Note]  注意

上面的命令是正确的。 ln 命令的语法有了一点变化。如果您认为发现了一个错误, 在报告它之前, 先用info coreutils lnln(1)命令查看手册页。

 

所创建的符号链接使得将要编译的工具链总是位于/tools 目录下,这意味着编译器、 汇编器和连接器在本章(这时我们还在使用宿主系统的一些工具)和下一章(这时我们 “chrooted” 到了 LFS 分区)都可以使用。

2012 / . 04 / . 09

4.1. 关于环境变量 $LFS

贯穿本书,都要用到环境变量 LFS 。 要保持这个变量总是被定义是很重要的。 它应该被设置为已选择的LFS分区的加载点。 用下面的命令检查LFS变量设置是否恰当:

 

echo $LFS

 

确保输出显示的路径是LFS分区的挂载点,如果你遵循我们的例子做,就应该是/mnt/lfs 。 如果输出不正确,请用下面的命令设置:

 

export LFS=/mnt/lfs

 

设置这个环境变量的好处是您以后可以按照原样输入形如 mkdir $LFS/tools 的命令。当 shell处理这个命令行的时候,会自动用 “/mnt/lfs” (或者该环境变量所设定的值)替换 “$LFS”。

 

当您离开然后重新进入当前工作环境的时候(比如,当 suroot 或其他用户时)不要忘记检查$LFS是否设置正确。

2012 / . 04 / . 08

3.3. 需要的补丁

除了软件包,还需要一些补丁。这些补丁修复了本该由软件开发者修补的软件包错误。 这些补丁也做了小的修改,以便软件包间可以更容易协调工作。构建LFS系统,需要下面的补丁:

 

Bash Upstream Fixes Patch - 22 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/bash-4.2-fixes-4.patch
MD5 sum: 244e3ff74d53792f1db32dea75dc8627

Bzip2 Documentation Patch - 1.6 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/bzip2-1.0.6-install_docs-1.patch
MD5 sum: 6a5ac7e89b791aae556de0f745916f7f

Coreutils Internationalization Fixes Patch - 123 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/coreutils-8.15-i18n-1.patch
MD5 sum: 70953451fa1d0e950266b3d0477adb8d

Coreutils Uname Patch - 1.6 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/coreutils-8.15-uname-1.patch
MD5 sum: 500481b75892e5c07e19e9953a690e54

Flex GCC-4.4.x Patch - 1 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/flex-2.5.35-gcc44-1.patch
MD5 sum: ad9109820534278c6dd0898178c0788f

GCC Cross Compile Patch - 1.8 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/gcc-4.6.2-cross_compile-1.patch
MD5 sum: 1b7886a7a4df3a48617e88a481862264

GCC Startfiles Fix Patch - 1.5 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/gcc-4.6.2-startfiles_fix-1.patch
MD5 sum: 799ef1971350d2e3c794f2123f247cc6

Glibc Bug Fixes Patch - 5.5 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-fixes-1.patch
MD5 sum: 13bdfb7db1654d9c3d7934d24479a6c4

Glibc Bug Sort Relocatable Objects Patch - 8.0 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-sort-1.patch
MD5 sum: 740e71017059a4290761db0cc9dd63f3

Glibc GCC Build Fix Patch - 2.5 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-gcc_fix-1.patch
MD5 sum: d1f28cb98acb9417fe52596908bbb9fd

Glibc GCC CPUID Patch - 0.8 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/glibc-2.14.1-cpuid-1.patch
MD5 sum: 4f110dc9c8d4754fbda841492ce796b4

Kbd Backspace/Delete Fix Patch - 12 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/kbd-1.15.2-backspace-1.patch
MD5 sum: f75cca16a38da6caa7d52151f7136895

MPFR Fixes Patch - 17 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/mpfr-3.1.0-fixes-1.patch
MD5 sum: 6a1a0be6f2326e237ce27a0254e360a5

Patch Testsuite Fix Patch - 1 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/patch-2.6.1-test_fix-1.patch
MD5 sum: c51e1a95bfc5310635d05081472c3534

Perl Libc Patch - 1 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/perl-5.14.2-libc-1.patch
MD5 sum: 23682f20b6785e97f99d33be7719c9d6

Perl Security Patch - 1 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/perl-5.14.2-security_fix-1.patch
MD5 sum: 7fa3e7e11fecf9d75f65452d700c3dd5

Procps HZ Errors Patch - 2.3 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/procps-3.2.8-fix_HZ_errors-1.patch
MD5 sum: 2ea4c8e9a2c2a5a291ec63c92d7c6e3b

Procps Watch Patch - 3.5 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/procps-3.2.8-watch_unicode-1.patch
MD5 sum: cd1a757e532d93662a7ed71da80e6b58

Readline Upstream Fixes Patch - 1.3 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/readline-6.2-fixes-1.patch
MD5 sum: 3c185f7b76001d3d0af614f6f2cd5dfa

Shadow nscd Patch - 1.1 KB:
下载: http://www.linuxfromscratch.org/patches/lfs/7.1/shadow-4.1.5-nscd-1.patch
MD5 sum: 6fd6a209c1aa623bad913fcff20b7d8e

这些补丁包总的大小是:约 209.5 KB

 

除了需要以上的补丁,LFS社区还创建了一些可选补丁。这些可选补丁解决了一些不重要的问题, 或者开启了软件某些默认不开启的功能。请仔细阅读位于http://www.linuxfromscratch.org/patches/downloads/ 的补丁数据库, 找到适合你系统的其他补丁。

2012 / . 04 / . 08

3.2. 全部软件包

下载或用别的办法获取下列软件包:

 

Autoconf (2.68) - 1,350 KB:

主页: http://www.gnu.org/software/autoconf/
下载: http://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.bz2
MD5 sum: 864d785215aa60d627c91fcb21b05b07

 

Automake (1.11.3) - 1,051 KB:

主页: http://www.gnu.org/software/automake/
下载: http://ftp.gnu.org/gnu/automake/automake-1.11.3.tar.xz
MD5 sum: 3d72b2076eb4397ad5e9a2aace6357fd

 

Bash (4.2) - 6,845 KB:

主页: http://www.gnu.org/software/bash/
下载: http://ftp.gnu.org/gnu/bash/bash-4.2.tar.gz
MD5 sum: 3fb927c7c33022f1c327f14a81c0d4b0

 

Binutils (2.22) - 19,505 KB:

主页: http://www.gnu.org/software/binutils/
下载: http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
MD5 sum: ee0f10756c84979622b992a4a61ea3f5

 

Bison (2.5) - 1,983 KB:

主页: http://www.gnu.org/software/bison/
下载: http://ftp.gnu.org/gnu/bison/bison-2.5.tar.bz2
MD5 sum: 9dba20116b13fc61a0846b0058fbe004

 

Bzip2 (1.0.6) - 764 KB:

主页: http://www.bzip.org/
下载: http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz
MD5 sum: 00b516f4704d4a7cb50a1d97e6e8e15b

 

Check (0.9.8) - 546 KB:

主页: http://check.sourceforge.net/
下载: http://sourceforge.net/projects/check/files/check/0.9.8/check-0.9.8.tar.gz
MD5 sum: 5d75e9a6027cde79d2c339ef261e7470

 

Coreutils (8.15) - 4,827 KB:

主页: http://www.gnu.org/software/coreutils/
下载: http://ftp.gnu.org/gnu/coreutils/coreutils-8.15.tar.xz
MD5 sum: 094909fafa86110140b32e4948941545

 

DejaGNU (1.5) - 563 KB:

主页: http://www.gnu.org/software/dejagnu/
下载: http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.5.tar.gz
MD5 sum: 3df1cbca885e751e22d3ebd1ac64dc3c

 

Diffutils (3.2) - 1,976 KB:

主页: http://www.gnu.org/software/diffutils/
下载: http://ftp.gnu.org/gnu/diffutils/diffutils-3.2.tar.gz
MD5 sum: 22e4deef5d8949a727b159d6bc65c1cc

 

E2fsprogs (1.42) - 5,576 KB:

主页: http://e2fsprogs.sourceforge.net/
下载: http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.42.tar.gz
MD5 sum: a3c4ffd7352310ab5e9412965d575610

 

Expect (5.45) - 614 KB:

主页: http://expect.sourceforge.net/
下载: http://prdownloads.sourceforge.net/expect/expect5.45.tar.gz
MD5 sum: 44e1a4f4c877e9ddc5a542dfa7ecc92b

 

File (5.10) - 595 KB:

主页: http://www.darwinsys.com/file/
下载: ftp://ftp.astron.com/pub/file/file-5.10.tar.gz
MD5 sum: 4cea34b087b060772511e066e2038196

[Note]  注意

File (5.10)在所列的位置可能找不到。主下载站点的管理员有时在新版软件发布后, 会删除旧的版本。一个可替代的下载位置是 http://www.
linuxfromscratch.org/lfs/download.html#ftp.
  在这里可以找到所需的版本。

 

Findutils (4.4.2) - 2,100 KB:

主页: http://www.gnu.org/software/findutils/
下载: http://ftp.gnu.org/gnu/findutils/findutils-4.4.2.tar.gz
MD5 sum: 351cc4adb07d54877fa15f75fb77d39f

 

Flex (2.5.35) - 1,227 KB:

主页: http://flex.sourceforge.net
下载: http://prdownloads.sourceforge.net/flex/flex-2.5.35.tar.bz2
MD5 sum: 10714e50cea54dc7a227e3eddcd44d57

 

Gawk (4.0.0) - 2,016 KB:

主页: http://www.gnu.org/software/gawk/
下载: http://ftp.gnu.org/gnu/gawk/gawk-4.0.0.tar.bz2
MD5 sum: 7cdc48e99b885a4bbe0e98dcf1706b22

 

GCC (4.6.2) - 70,308 KB:

主页: http://gcc.gnu.org/
下载: http://ftp.gnu.org/gnu/gcc/gcc-4.6.2/gcc-4.6.2.tar.bz2
MD5 sum: 028115c4fbfb6cfd75d6369f4a90d87e

 

GDBM (1.10) - 640 KB:

主页: http://www.gnu.org/software/gdbm/
下载: http://ftp.gnu.org/gnu/gdbm/gdbm-1.10.tar.gz
MD5 sum: 88770493c2559dc80b561293e39d3570

 

Gettext (0.18.1.1) - 14,785 KB:

主页: http://www.gnu.org/software/gettext/
下载: http://ftp.gnu.org/gnu/gettext/gettext-0.18.1.1.tar.gz
MD5 sum: 3dd55b952826d2b32f51308f2f91aa89

 

Glibc (2.14.1) - 15,284 KB:

主页: http://www.gnu.org/software/libc/
下载: http://ftp.gnu.org/gnu/glibc/glibc-2.14.1.tar.bz2
MD5 sum: 5869a2620c6917dd392289864c6ce595

 

GMP (5.0.4) - 1,650 KB:

主页: http://www.gnu.org/software/gmp/
下载: http://ftp.gnu.org/gnu/gmp/gmp-5.0.4.tar.xz
MD5 sum: 0881f4ff2617226c673fc534ac39d448

 

Grep (2.10) - 1,048 KB:

主页: http://www.gnu.org/software/grep/
下载: http://ftp.gnu.org/gnu/grep/grep-2.10.tar.xz
MD5 sum: 709915434d09f5db655e5ebd7fd6bb7f

 

Groff (1.21) - 3,774 KB:

主页: http://www.gnu.org/software/groff/
下载: http://ftp.gnu.org/gnu/groff/groff-1.21.tar.gz
MD5 sum: 8b8cd29385b97616a0f0d96d0951c5bf

 

GRUB (1.99) - 4,544 KB:

主页: http://www.gnu.org/software/grub/
下载: http://ftp.gnu.org/gnu/grub/grub-1.99.tar.gz
MD5 sum: ca9f2a2d571b57fc5c53212d1d22e2b5

 

Gzip (1.4) - 886 KB:

主页: http://www.gnu.org/software/gzip/
下载: http://ftp.gnu.org/gnu/gzip/gzip-1.4.tar.gz
MD5 sum: e381b8506210c794278f5527cba0e765

 

Iana-Etc (2.30) - 201 KB:

主页: http://freshmeat.net/projects/iana-etc/
下载: http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration//iana-etc/iana-etc-2.30.
tar.bz2
MD5 sum: 3ba3afb1d1b261383d247f46cb135ee8

 

Inetutils (1.9.1) - 1,941 KB:

主页: http://www.gnu.org/software/inetutils/
下载: http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.1.tar.gz
MD5 sum: 944f7196a2b3dba2d400e9088576000c

 

IPRoute2 (3.2.0) - 365 KB:

主页: http://www.kernel.org/pub/linux/utils/net/iproute2/
下载: http://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-3.2.0.tar.xz
MD5 sum: 6f814291cc3d7f4312cf8c2c052da5f1

 

Kbd (1.15.2) - 1,520 KB:

下载: http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration/kbd/kbd-1.15.2.tar.gz
MD5 sum: 77d0b51454522bc6c170bbdc6e31202a

 

Kmod (5) - 855 KB:

下载: http://packages.profusion.mobi/kmod/kmod-5.tar.xz
MD5 sum: b271c2ec54aba1c67bda63c8579d8c15


Less (444) - 301 KB:
主页: http://www.greenwoodsoftware.com/less/
下载: http://www.greenwoodsoftware.com/less/less-444.tar.gz
MD5 sum: 56f9f76ffe13f70155f47f6b3c87d421


LFS-Bootscripts (20120229) - 32 KB:
下载: http://www.linuxfromscratch.org/lfs/downloads/7.1/lfs-bootscripts-20120229.tar.bz2
MD5 sum: 9dd71c43f58143229d9f7b4025974dc9

 

Libpipeline (1.2.0) - 670 KB:
主页: http://libpipeline.nongnu.org/
下载: http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.2.0.tar.gz
MD5 sum: dd3a987a0d2b594716baee2f73d61ae3

 

Libtool (2.4.2) - 2,571 KB:
主页: http://www.gnu.org/software/libtool/
下载: http://ftp.gnu.org/gnu/libtool/libtool-2.4.2.tar.gz
MD5 sum: d2f3b7d4627e69e13514a40e72a24d50

 

Linux (3.2.6) - 63,560 KB:
主页: http://www.kernel.org/
下载: http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.2.6.tar.xz
MD5 sum: b50e258e601a428d13bdcc9ae35f8340


[Note]  注意

由于发现了多次安全漏洞,Linux内核升级相对比较频繁。可找到的最新版 3.2.x 版内核应该是可用的,除非在勘误页面说明不可用。

对于有速度限制或带宽比较昂贵的用户,如果想升级Linux 内核, 可以单独下载基线版本软件包和补丁。 对于随后的次要版本升级补丁, 这样可以节约时间和成本。

 

M4 (1.4.16) - 1,229 KB:
主页: http://www.gnu.org/software/m4/
下载: http://ftp.gnu.org/gnu/m4/m4-1.4.16.tar.bz2
MD5 sum: 8a7cef47fecab6272eb86a6be6363b2f

 

Make (3.82) - 1,213 KB:
主页: http://www.gnu.org/software/make/
下载: http://ftp.gnu.org/gnu/make/make-3.82.tar.bz2
MD5 sum: 1a11100f3c63fcf5753818e59d63088f

 

Man-DB (2.6.1) - 2,449 KB:
主页: http://www.nongnu.org/man-db/
下载: http://download.savannah.gnu.org/releases/man-db/man-db-2.6.1.tar.gz
MD5 sum: 79658e8695c7b9b3be1ee340d78a4692

 

Man-pages (3.35) - 1,650 KB:
主页: http://man7.org/linux/man-pages/index.html
下载: http://man7.org/linux/download/man-pages/man-pages-3.35.tar.gz
MD5 sum: e41432ee35a49036bbaf8d4598506e9c

 

MPC (0.9) - 553 KB:
主页: http://www.multiprecision.org/
下载: http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz
MD5 sum: 0d6acab8d214bd7d1fbbc593e83dd00d

MPFR (3.1.0) - 1,176 KB:
主页: http://www.mpfr.org/
下载: http://www.mpfr.org/mpfr-3.1.0/mpfr-3.1.0.tar.bz2
MD5 sum: 238ae4a15cc3a5049b723daef5d17938

 

Ncurses (5.9) - 2,760 KB:
主页: http://www.gnu.org/software/ncurses/
下载: ftp://ftp.gnu.org/gnu/ncurses/ncurses-5.9.tar.gz
MD5 sum: 8cb9c412e5f2d96bc6f459aa8c6282a1

 

Patch (2.6.1) - 248 KB:
主页: http://savannah.gnu.org/projects/patch/
下载: http://ftp.gnu.org/gnu/patch/patch-2.6.1.tar.bz2
MD5 sum: 0818d1763ae0c4281bcdc63cdac0b2c0

 

Perl (5.14.2) - 12,917 KB:
主页: http://www.perl.org/
下载: http://www.cpan.org/src/5.0/perl-5.14.2.tar.bz2
MD5 sum: 04a4c5d3c1f9f19d77daff8e8cd19a26

 

Procps (3.2.8) - 279 KB:
主页: http://procps.sourceforge.net/
下载: http://procps.sourceforge.net/procps-3.2.8.tar.gz
MD5 sum: 9532714b6846013ca9898984ba4cd7e0

 

Psmisc (22.15) - 382 KB:
主页: http://psmisc.sourceforge.net/
下载: http://prdownloads.sourceforge.net/psmisc/psmisc-22.15.tar.gz
MD5 sum: 35e155bae2e499a6dcba35884560db1e

 

Readline (6.2) - 2,225 KB:
主页: http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html
下载: http://ftp.gnu.org/gnu/readline/readline-6.2.tar.gz
MD5 sum: 67948acb2ca081f23359d0256e9a271c

 

Sed (4.2.1) - 878 KB:
主页: http://www.gnu.org/software/sed/
下载: http://ftp.gnu.org/gnu/sed/sed-4.2.1.tar.bz2
MD5 sum: 7d310fbd76e01a01115075c1fd3f455a

 

Shadow (4.1.5) - 2,105 KB:
主页: http://pkg-shadow.alioth.debian.org/
下载: http://pkg-shadow.alioth.debian.org/releases/shadow-4.1.5.tar.bz2
MD5 sum: d5f7a588fadb79faeb4b08b1eee82e9a

 

Sysklogd (1.5) - 85 KB:
主页: http://www.infodrom.org/projects/sysklogd/
下载: http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.tar.gz
MD5 sum: e053094e8103165f98ddafe828f6ae4b

 

Sysvinit (2.88dsf) - 108 KB:
主页: http://savannah.nongnu.org/projects/sysvinit
下载: http://download.savannah.gnu.org/releases/sysvinit/sysvinit-2.88dsf.tar.bz2
MD5 sum: 6eda8a97b86e0a6f59dabbf25202aa6f

 

Tar (1.26) - 2,285 KB:
主页: http://www.gnu.org/software/tar/
下载: http://ftp.gnu.org/gnu/tar/tar-1.26.tar.bz2
MD5 sum: 2cee42a2ff4f1cd4f9298eeeb2264519

 

Tcl (8.5.11) - 4,379 KB:
主页: http://tcl.sourceforge.net/
下载: http://prdownloads.sourceforge.net/tcl/tcl8.5.11-src.tar.gz
MD5 sum: b01a9691c83990b3db0ce62d1012ca67

 

Texinfo (4.13a) - 2,687 KB:
主页: http://www.gnu.org/software/texinfo/
下载: http://ftp.gnu.org/gnu/texinfo/texinfo-4.13a.tar.gz
MD5 sum: 71ba711519209b5fb583fed2b3d86fcb

 

Udev (181) - 678 KB:
主页: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html
下载: http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-181.tar.xz
MD5 sum: 0d7af750702620a871b9f9b98d8ad859

 

Udev Configuration Tarball - 7 KB:
下载: http://www.linuxfromscratch.org/lfs/downloads/7.1/udev-config-20100128.tar.bz2
MD5 sum: c1142e2c9be90996fcf56310f12a2652

 

Util-linux (2.20.1) - 4,506 KB:
主页: http://userweb.kernel.org/~kzak/util-linux/
下载: http://www.kernel.org/pub/linux/utils/util-linux/v2.20/util-linux-2.20.1.tar.bz2
MD5 sum: 079b37517fd4e002a2e6e992e8b4e361

 

Vim (7.3) - 8,675 KB:
主页: http://www.vim.org
下载: ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
MD5 sum: 5b9510a17074e2b37d8bb38ae09edbf2

 

Xz Utils (5.0.3) - 1,002 KB:
主页: http://tukaani.org/xz
下载: http://tukaani.org/xz/xz-5.0.3.tar.bz2
MD5 sum: 8d900b742b94fa9e708ca4f5a4b29003

 

Zlib (1.2.6) - 490 KB:
主页: http://www.zlib.net/
下载: http://www.zlib.net/zlib-1.2.6.tar.bz2
MD5 sum: dc2cfa0d2313ca77224b4d932b2911e9


这些软件包总的大小是:约 285 MB

2012 / . 04 / . 07

3.1. 介绍

本节包含了构建基础Linux系统所需要下载的软件包列表。 列出的版本是已知可以正常工作的版本,并且本书就是以这个版本为基础的。 我们强烈建议您不要使用更新的版本, 因为一个版本的构建命令可能不能在新版本下工作。这些最新版本的软件包可能还有问题需要变通。本书中软件包的运行环境是稳定的。

 

下载位置可能并不总是有效的,如果本书发布后,某个软件的下载位置改变了, Google (http://www.google.com/) 可以搜索到大多数的软件包。如果Google也没有搜索到, 请尝试 http://www.linuxfromscratch.org/lfs/packages.html#packages 上的其他下载方法。

 

下载的软件包和补丁,需要存储在一个构建过程中方便访问的位置。 还需要一个路径来解压和编译源代码。 $LFS/sources可以存放源码包, 也可以作为工作路径。 使用这个目录的好处是,所有需要的部件都在 LFS 分区上,构建过程中的所有步骤都可以访问到。

 

要建立这个目录,在下载前,请以root用户身份执行下面的命令:

 

mkdir -v $LFS/sources

 

将这个目录设置成可写和sticky。“Sticky”的意思是,即使有多个用户对这个目录有可写权限, 只有文件所有者可以删除设置 sticky 的目录中的文件。下面的命令可以设置目录可写和 sticky 模 式:

 

chmod -v a+wt $LFS/sources

 

下载全部软件包和补丁的一个简单方法是将 wget-list 作为 wget 的输入。例如:

 

wget -i wget-list -P $LFS/sources

 

另外,在开始LFS-7.0之前还一个单独的文件叫做md5sums可以用来验证所有正确的把文件放置在$ LFS/sources目录中并运行


pushd $LFS/sources


md5sum -c md5sums


popd

2012 / . 04 / . 06

2.4. 挂载这个新分区

现在文件系统已经创建完成,下一步就是要使得分区能够进行访问。为了做到这一点,就需要把它挂载到一个选定的挂载点上。考虑到本书的目的,建议把这个文件系统挂载到 /mnt/lfs 目录,当然,你也可以选择其他路径。

 

选择一个挂载点,并把它指定到 LFS 环境变量,请运行:

 

export LFS=/mnt/lfs

 

然后, 运行下列命令,来创建这个加载点,并加载LFS文件系统:

 

mkdir -pv $LFS


mount -v -t ext3 /dev/<xxx> $LFS

 

如果LFS使用多个分区 (例如,一个分区装载是 / 另一个是 /usr), 请运行下列命令挂载:

 

mkdir -pv $LFS


mount -v -t ext3 /dev/<xxx> $LFS


mkdir -v $LFS/usr


mount -v -t ext3 /dev/<yyy> $LFS/usr

 

用恰当的分区名代替 <xxx><yyy>

 

确认挂载这个新分区时,没有使用太多的限制选项 (比如 nosuid, nodev, 或 noatime 选项)。 运行没有任何选项的 mount 命令来看看挂载LFS分区设置了什么选项。如果使用了nosuid, nodev, 和/或 noatime , 那么就需要重新挂载这个分区。

 

如果你使用交换分区,请确保启用了 swapon 命令:

 

/sbin/swapon -v /dev/<zzz>

 

交换分区的名字来代替 <zzz>

 

现在,工作空间已经建立了,可以下载软件包了。

2012 / . 04 / . 06

2.3. 在这个分区上创建文件系统

现在,已经建立了一个空的分区,可以在其上创建文件系统了。 在Linux世界最常用的是第二代 扩展文件系统(ext2), 但是,对于大容量硬盘,日志文件系统越来越受欢迎。第三代扩展文件系统 (ext3) 是 ext2 的增强版,它加入了日志功能,并且和E2fsprogs 工具兼容。 我们将建立 ext3 文件系统。 创建其他文件系统的介绍,可以参考 http://www.linuxfromscratch.org/blfs/view/svn/postlfs/filesystems.html.

 

要在LFS分区建立 ext3 文件系统,请运行下列命令:

 

mke2fs -jv /dev/<xxx>

 

用 LFS 分区的名字(在前面的例子中是hda5)代替 <xxx>

 

[Note]  注意

有些发行版宿主系统的文件系统创建工具(E2fsprogs),可能使用了自定义的特性。 因为LFS安装的E2fsprogs不支持这些特性,可能在第九章引导进入新的LFS系统时出现问题; 你会收到一个类似 “unsupported filesystem features, upgrade your e2fsprogs” 的错误。 为了检查你的宿主系统是否使用了自定义的特性,请运行下面的命令:

 

debugfs -R feature /dev/<xxx>

 

如果输出的特性不同于has_journal, ext_attr, resize_inode, dir_index, filetype, sparse_super, large_fileneeds_recovery, 那么就说明你的宿主系统可能有自定义的增强特性。 在这种情况下, 为了避免后面出现问题, 你应该重新编译E2fsprogs软件包, 并用生成的二进制文件在你的LFS分区上重新创建文件系统:

 

cd /tmp


tar -xzvf /path/to/sources/e2fsprogs-1.42.tar.gz


cd e2fsprogs-1.42


mkdir -v build


cd build


../configure


make    #note that we intentionally don't 'make install' here!


./misc/mke2fs -jv /dev/<xxx>


cd /tmp


rm -rfv e2fsprogs-1.42

 

如果你使用原有的交换分区,就不必格式化了,但,如果你创建了一个新的交换分区, 就需要用这个命令进行初始化:

 

mkswap /dev/<yyy>

 

交换分区的名字来代替 <yyy>

2012 / . 04 / . 05

2.2. 创建一个新的分区

和大多数其他操作系统一样, LFS通常安装在一个专用分区上。 我们推荐, 将LFS系统构建在一个 可用的空分区上, 或者, 如果你有足够的空白磁盘空间, 就直接创建一个。

 

最小的LFS系统,大约需要2.8GB的分区。 这样才有足够的空间存放和编译所有的源码包。 然而,如果你打算将LFS系统当做主Linux系统, 你可能需要安装其他的软件, 这就需要额外的空间 。10GB的硬盘空间是一个比较合理的大小。 LFS系统本身并不占用这么大的空间。 大部分所需空间是用来提供足够的临时空间。编译软件包会用到大量的磁盘空间, 等软件包安装以后, 这些临时空间会被收回。

 

因为编译过程中,并不总是有足够的可用内存(RAM),所以最好把一个小的磁盘分区作为交换分 区。内核使用交换分区存放不常用的数据,以便把更多的内存留给活动进程。 LFS系统可以和宿主系统使用同一个交换分区,因此, 若宿主系统已经有了交换分区时, 就没有必要为LFS系统再创建一个了。

 

启动一个磁盘分区程序,比如 cfdiskfdisk, 用即将在上面创建新分区的硬盘名字作为命令行选项,如主IDE硬盘名字就是 /dev/hda 。 创建一个Linux本地分区,需要的话,您还要创建一个交换分区。 如果您还不知道如何使用这两个工具的话, 请参考 cfdisk(8)或者 fdisk(8) 手册页。

 

[Note]   注意:

对于有经验的用户其他的分区方案是可能的新的LFS系统上的软件可以
RAID阵列一个LVM逻辑卷然而,其中一些选项需要一个initramfs的,这是一个
高级话题。这些划分方法不推荐使用首次LFS的用户


请记住这个新分区的名字 (如 hda5)。本书将称其为LFS分区。也要记住 交换 分区的名字, 这些名字将在后面的/etc/fstab 文件中用到。

 

2.2.1. 其他分区问题

 

对系统分区建议的问卷经常发布在 LFS 邮件列表上。这是一个高度主观的话题。 大多数发布版默认使用整个硬盘,并分出一个小的交换分区。 因为一些原因,这不是 LFS 系统的最佳选择。它使多个分布的数据共享减少了灵活性,使备份更费时,并且通过文件系统结构的低效率分配会浪费磁盘空间,或者使创建LFS 更困难。

 

2.2.1.1. 根分区

 

一个10GB的根分区 (不要和 /root 目录混淆) 对于大多数系统都是一个较好的方案。它提供了足够的空间来编译 LFS 和大多数的 BLFS 软件,而且,因为它比较小,可以很容易的在硬盘上建立多个分区用于实验。

 

2.2.1.2. 交换分区

 

大多数发布系统自动建立一个交换分区。通常建议交换分区的尺寸是物理内存总量的两倍左右,然而这很少需要。如果磁盘空间有限,可以将交换分区设为2GB,并监测的磁盘交换量。

磁盘交换并不总是好的。通常你仅仅通过听磁盘的活动,和观察系统如何对命令做出反应,就可以知道是否在进行磁盘交换。磁盘交换的第一个反应,应该是检查一 个无反应的命令,就像试图编辑一个5GB的文件一样。 如果总是发生磁盘交换,最好的解决办法是为你的机器购买更多的内存。

 

2.2.1.3. 适当的分区

 

有一些的其他分区不是必需的,但在设计磁盘布局时应该考虑。下面列出的并不详尽,但可以作为指导。

 

  • /boot – 强烈建议。 使用给分区存储内核和其他启动信息。为了尽量减少大硬盘潜在的启动问题,将给分区设置为第一个硬盘上的第一个物理分区。 一个 100MB的分区就够用了。

  • /home – 强烈建议。跨过多个发布系统或 LFS 系统的共享主目录和用户定制。 它的尺寸普遍较大,取决于可用的磁盘空间。

  • /usr – 如果为瘦客户端或无盘站提供服务,通常要用的一个单独的 /usr 分区。在LFS中一般不需要它, 一个5GB的分区可以处理大多数安装。

  • /opt – 这个目录对于 BLFS 很有用,在这里可以安装很多大的软件包,比如 Gnome 或 KDE 而不安装到 /usr 目录。 如果要用,通常需要5-10GB的空间。

  • /tmp – 一个单独的 /tmp 分区比较少见,但是如果配置瘦客户端时,它就很有用了。如果需要,该分区通常不必超过2GB。

  • /usr/src – 该分区对于提供一个存储 BLFS 源文件的位置,并在 LFS 编译中共享它们,非常有用, 它还可以用来当作编译 BLFS 软件包的位置。该分区应该使用30-50GB的空间。

 

你想在启动时自动加载的任何单独的分区,都要明确写进 /etc/fstab 文件。 关于如何列出分区的细节,我们将在 Section 8.2, “创建 /etc/fstab 文件” 讨论。

+
X