分类: LINUX
2012-06-11 11:56:59
Linux From Scratch
Version 7.1中文随笔翻译
Created by Gerard Beekmans
Edited by Matthew Burgess and Bruce Dubbs
山东职业学院网管中心SeeSky译制
Linux From Scratch: Version 7.1
by Created by Gerard Beekmans and Edited by Matthew Burgess and Bruce Dubbs
Copyright © 1999-2012 Gerard Beekmans
Copyright © 1999-2012, Gerard Beekmans
All rights reserved.
This book is licensed under a Creative Commons License.
Computer instructions may be extracted from the book under the MIT License.
Linux® is a registered trademark of Linus Torvalds.
目录
我学习Linux的旅程要追溯到十多年前的1998年,也正是从那个时候开始,我对Linux有了更好的理解。当时我刚刚安装了第一个Linux发行版,并很快对Linux整体的概念和隐藏在Linux中的哲理产生了兴趣。
要完成一个独立的任务总会有很多方式。这同样适用于Linux的发行版。在过去的几年里,存在过很多种Linux发行版本。有一些现在仍然存在,有一些已经变成了其他版本,另外的一些发行版则留给了我们的记忆。它们总是做一些不同的事情以满足它们的目标客户的需求。由于有很多的方法来完成那些相同的目标,我开始意识到我不应该再被Linux的某一个版本实现所限制。在发现Linux之前,由于没有其他的选择,我们只能简单的忍受这些已经存在的操作系统。事实就是如此,不管你是不是喜欢它。随着Linux的出现,我们选择的可能性也开始出现。如果你不喜欢某些东西,你可以自由的,甚至是被鼓励去改变它们。
我尝试过几种Linux发行版,但还是不能决定选用其中的一种。这些发行版在它们所擅长的方面都很优秀。这不是对或者错的问题,他已经变成了个人的品味问题。在这所有可用的发行版中,有一件事变得很明显,就是没有一个单独的发行版对于我来说是完美的。所以我开始着手创建我自己的Linux系统,这样一来这个系统就可以完全符合我自己的喜好了。
为了真实的构建自己的系统,我决定从源代码编译所有东西,而不是使用那些已经编译好的二进制包。这个“完美”的系统将拥有各种发布版系统的优点,同时也将摒弃他们的弱点。首先,这个想法是相当艰巨的,但我任然坚持相信这样的系统是能够被构建出来了。
通过整理如循环依赖和编译时错误之类的问题后,我最后构建出了一个定制的Linux系统。它就像当时正在运行的其他Linux系统一样可以完整的运行并且完美的可用。但他是我自己的产品。我对组合了一个自己的系统感到非常满意。接下来将是构建我自己的软件。
当我在Linux社区中与其他的成员分享我的目标和经验的时候,大家对这个想法都很感兴趣。它很快成为了一项计划,定制操作系统不单单是满足了一些特定用户的需求,而且这个过程也是程序员和系统管理员提高他们Linux技能(目前的技能)的理想学习机会。正是由于大家对此很感兴趣,Linux From Scratch(从无到有的Linux,LFS)就诞生了。
这本LFS工具书以这个项目为核心,它提供了你设计和构建独有系统所需的背景和必要的指令说明。当你按照这本书中所提供的模版构建一个可正确运转的系统的时候,你可以随意的改变这些指令,在某种程度上说,这也是这个项目中的一个重要部分。你可以自由把握这个构建的过程,我们只是伸出援手来帮助你开始这个旅程。
我真诚的希望你在自己的LFS系统上有一个不错的工作时间,并且会喜欢拥有自己的系统所给你带来的许多收益。
--
Gerard Beekmans
gerard@linuxfromscratch.org
你希望读这本书的原因有很多。许多人都有这样一个疑问,“为什么你不直接下载并安装一个已经存在的Linux发行版,而自己找麻烦自己动手编译一个Linux系统呢?”
这个项目存在的一个很重要原因是它能够帮助你学习Linux系统的内部运行机制。构建一个LFS系统演示了是什么产生了Linux时钟以及各个部件之间是怎么共同工作并相互依赖的。这个学习经历能带给你的最好的事情就是你将有能力构建一个适合你自己的独一无二的Linux系统。
LFS系统的另外一个关键的好处是你将对系统有更多的控制权,而不用依赖其他人的Linux实现。在LFS的构建中,你将坐在驾驶员的位置上指定系统的每一个部分是怎么样的。
LFS允许你构建一个非常紧凑的Linux系统。当你安装一个定期的发布版Linux时,你会被强迫安装大量的软件,这些软件可能永远都不会被用到或者我们根本不了解它们是什么。这些程序将会浪费资源,你也许会说,根据当今硬件设备和CPU技术的发展情况,这都不是事。有时候,无论怎样,你仍然会受到系统尺寸的限制。想想CD引导盘、USB闪存和嵌入式系统。它们都是LFS发挥作用的场景。
构建自定义Linux系统的另外一个优势就是安全。通过完全从源代码构建一个完整的系统,你可以审核构建过程中每一个模块并安装你渴望的所有安全补丁,所以你就不需要等着其他人编译一个二进制包以用来修复安全漏洞。除非你自己检测补丁并实现它们,你将不能保证新的二进制包被正确的编译并充分的修补了这个漏洞。
LFS的目标是构建一个完整可用的基础层系统。如果你不希望从最初构建你自己的Linux系统,你可能不会从这本书获益。
有太多的原因让你构建自己的LFS系统,以致于我们不能将这些原因都列出来。最后,教育是其中最有力的原因。当你坚持走完了你的LFS旅程,你将会发现你的知识增加了一大截。
目标架构
LFS的主要目标架构是Intel的32位架构。如果你之前没有构建过LFS系统,你可能需要从这种架构开始你的工作。32位的计算机架构最广泛的支持了Linux系统,同时32架构使开源软件和非开源的软件能够和谐的工作。
另一方面,这本书中的指令经过一些修改就可以在Power PC和64位的AMD/Inte CPU上工作。为了使用这些CPU中的一个构建系统,先决条件是,除了将在接下来的几页中提到的要求之外,你需要有一个已经存在的Linux系统,例如早先构建的LFS、Ubuntu、Red Hat/Fedora、SuSE或者是其它适用于32架构的Linux发行版系统。还需要指出的是一个32位的发行版是可以在一个64位的AMD/Intel计算机上安装使用的。
还有其他的一些有关64系统的事实需要被说明。与32位的系统相比,在64位系统中可执行程序的尺寸会稍微大一点并且执行速度会稍微快些。例如,在一个Core2Duo CPU为基础所构建的LFS-6.5系统上,我们有以下统计:
Architecture Build Time Build Size
32-bit 198.5 minutes 648 MB
64-bit 190.6 minutes 709 MB
你可以看到,在64位系统上构建LFS比在32位系统上快了4%,而构建出来的可执行程序只大了9%。所以64位系统带来的好处是很小的。当然,如果你有多于4GB的内存或者想操作超过4GB的数据,64位系统将有很大的优势。
从LFS所构建出来的默认的64位系统被认为是“纯净”的64系统。就是说它只支持64位的应用程序。构建一个“多种链接库”的系统需要将很多程序编译两次,一次是为了32位系统编译的,另外一次是为了64位系统而编译的。这在LFS系统中没有被直接的支持,因为它会干涉为了教育目的而构建一个基础Linux系统的初衷。关于这个更高级的主题,你可以参考Cross Linux From Scratch项目。
最后一个关于64位系统的问题是,有许多软件包并不能在“纯净”的64位系统上正确的编译,或者它们需要专门的指令才能编译,通常这些软件包中都嵌入了一些具有32位特性的汇编成分,以致于如果在“纯净”的64位系统上编译它们的时候将会遭到失败。这包括一些来自Beyond Linux From Scratch(BLFS)的图形化驱动。许多问题可以被解决,但是可能需要一些特殊的指令规则或补丁。
和标准
LFS系统的结构尽量的符合Linux标准规范。其中规范有:
l POSIX.1-2008.
l Filesystem Hierarchy Standard(FHS)(底层文件系统标准)
l Linux Standard Base(LSB) Core Specification 4.0(Linux标准核心规范4.0)
LSB有五个独立的标准:核心、C++、桌面、运行时语言和打印。除了一般的需求之外还有体系架构的要求。LFS尝试符合早起Linux相关部门所得出的体系结构。
注意
许多人并不同意LSB的需求。定义这些标准的主要目的是确保专利软件能够在一个未知的系统上安装并正确的运行。因为LFS是基于源代码的,用户能够完全的控制哪些软件包是需要的,同时可以有选择的安装那些LSB所指定的软件包。
创建一个完整的LFS系统并使其有能力通过LSB的认证测试是有可能的,但是一些额外的包已经超出了LFS的范围。这些额外的包在BLFS中有安装说明。
LFS所提供的包需要满足LSB的要求
LSB Core: Bash、Binutils、Coreutils、Diffutils、File、Findutils、 Gawk、Grep、Gzip、M4、ManDB、Ncurses、Procps、 Psmisc、Sed、Shadow、Tar、Util-linux、Zlib
LSB C++: Gcc
LSB Desktop: None
LSB Runtime Languages: Perl
LSB Printing: None
LSB Multimeda: None
BLFS所提供的包需要满足LSB的要求
LSB Core: Bc、Cpio、Ed、Fcrontab、Initd-tools、PAM、 Sendmail(or Postfix or Exim)
LSB C++: None
LSB Desktop: ATK、Cairo、Desktop-file-utils、Freetype、Fontconfig、 Glib2、GTK+2、Iconnaming-utils、Libjpeg、Libpng、 Libxml2、MesaLib、Pango、Qt3、Qt4、Xorg
LSB printing: CPUS
LSB Multmeda: Alsa Libraries、NSPR、NSS、OpenSSL、Java
LFS或BLFS所提供的包中不需要满足LSB的要求的
LSB Core: At、Batch、Lsb_release
LSB C++: None
LSB Desktop: None
LSB Runtime Languages: None
LSB Printing: None
LSB Multimeda: Xdg-utils
如前边所说的,LFS的目的是构建一个完整可用的基础层系统。这里包含了所需的所有包,这些包用来按照用户的需求构建一个最低级的完整的系统。这并不意味着LFS是最小的系统。有几个非常重要的包并不是被严格需求的。下边的列表文件对每一个包进行了简要的阐述。
l Autoconf
这个包中的程序可以生成一个shell脚本,这个脚本能够按照开发人员的模版自动的配置源代码。
l Automake
这个包包含了从模板生成Makefile文件的程序。在我们升级了程序的时候常常需要重新编译它们。
l Bash
这个包是为了满足LSB的核心需求而为系统提供一个伯恩外壳借口(Bourne Shell interface)。选择Bash的原因是它被普遍的使用,同时它比基础的shell函数有更多的功能。
l Binutils
这个包包含了一个链接器、一个汇编器还有一些其它的用于操作目标文件的工具。这个包中的程序非常重要,我们在LFS中编译的大多数包都要用到它,另外它还有更多的用处。
l Bison(北美野牛)
这个包中包含了用于构建几个其他的LFS程序所需的GNU版本的yacc(编译器代码生成器)。
l Bzip2
这个包中的程序用户压缩或解压缩文件。它用于压缩很多的LFS包。
这个包包含了许多用于查看或操作文件的基础程序。这些程序将用户命令行文件管理,而且要用于安装LFS中的所有的包。
l DejaGNU
这个包中包含了一个用于测试其它程序的框架。它只安装在临时工具链中。
l Diffutils
这个包中的程序用来显示文件和文件夹之间的不同。这个程序可以用来创建补丁,并用在许多包的构建过程中。
l Expect
这个包中的程序用于与其它交互程序执行脚本式的对话。它通常用来测试其它的包。他只安装在临时工具链中。
l E2fsprogs
这个包中包含了处理ext2、ext3和ext4文件系统的使用工具。这些都是Linux系统支持的最常见的并且经过全面检测的文件系统。
l File
这个包中包含了用于确定所给的文件或文档类型的实用工具。有几个包需要用它来构建。
l Findutils
这个包包含了用于在文件系统中查找文件所需的程序。它用在许多包的脚本构建过程中。
l Flex
这个包中包含的工具可以生成识别文本中的模式的程序,它是GNU版本的lex(lexical analyzer词法分析程序)程序。它被用于构建几个LFS包。
l Gawk
这个包中包含了操作文本文件的程序。它是GNU版的awk(Aho-Weinberg-Kernighan)。它用在许多包的脚本构建过程中。
l Gcc
这个包是GNU编译器集合。它包含了C和C++编译器以及其它的几个LFS没有构建的。
l GDBM
这个包包含着GNU数据管理器库。它被另外一个LFS包所使用,Man-DB。
l Gettext
这个包包含着用于许多包的国际化和本地化的工具和链接库。
l Glibc
这个包包含主要的C库。Linux程序没有它将不能运行。
l GMP
这个包包含了数学函数库,这个库提供了高精度计算的有用函数。当编译Gcc的时候将用到它。
l Grep
这个包包含了搜寻文件的程序。它用在许多包的脚本构建过程中。
l Groff
这个包包含了处理和格式化文本的工具。这个程序的一个重要的函数用于格式化man页面。
l GRUB
这个包是Grand Unified Boot Loader(统一引导程序)。它是其中一个可用的引导程序,但也是最灵活的一个。
l Gzip
这个包包含了用于压缩文件和解压缩文件的程序。它用于在LFS中压缩很多的包或其它的工作。
l Iana-etc
这个包提供了用于网络服务和协议的数据。它用于启用适当的网络能力。
l Inetutiles
这个包包含基础的网络管理程序。
l IProute2
这个包包含用于基础的和高级IPv4和IPv6网络的程序。还有为IPv6能力而选择的其它公共网络工具包。
l Kbd
这个包为非US键盘提供了键盘表文件和键盘实用工具,还有一些控制台字体。
l Kmod
这个包包含了用于管理Linux内核模块的程序。
l Less
这个包包含了一个非常不错的文本文件查看器,它允许在查看文档的时候进行上下翻页。它通常被Man-DB用来查看man页。
l Libtool
这个包包含了GNU通用库支持脚本。它将复杂的共享库使用包装称一个一致的、便携的接口。它被用于其它LFS包的测试套件。
l Linux Kernel
这个包是操作系统。它是GNU/Linux环境中的Linux。
l M4
这个包包含了一个有用的一般的文本宏处理器,它作为其它程序的构建工具。
l Make
这个包包含了一个用于引导包编译的程序。它几乎被LFS中的所有包所使用。
l Man-DB
这个包包含了查找和查看man页的程序。它被选择来替代man包是因为其优越的国际化能力。它提供了man程序。
l Man-pages
这个包包含了基础Linux man页的真实内容。
l MPC
这个包包含了用于复数计算的算法。Gcc需要这个包。
l MPFR
这个包包含了用于多精度计算的函数。Gcc需要这个包。
l Ncurses
这个包包含了用于字符界面的独立终端处理的函数库。它通常为菜单系统提供光标控制。它被LFS中的许多包所需要。
l Patch
这个包包含一个程序,这个程序通过向diff程序申请创建一个补丁来修改或创建文件。它在LFS中被多个包使用。
l Perl
这个包是PERL语言的解释器。它被用作几个LFS包的安装和测试套件。
l Procps
这个包包含了进程监视程序。这个程序对系统的管理是非常有用的,且常常被LFS启动脚本所使用。
l Psmisc
这个包包含了能够列出系统当前运行的进程信息的程序。这个程序在系统管理过程中非常有用。
l Readline
这个包是一个函数库集,它提供了命令行的编辑和历史命令记录功能。它被Bash所使用。
l Sed
这个包允许在没有用文本编辑器打开一个文件的时候编辑一个文件。它被绝大多数的LFS包配置脚本所使用。
l Shadow
这个包包含的程序能够以安全的方式来操作密码。
l Sysklogd
这个包为记录系统信息提供了程序,例如内核所给出的信息或者是当不寻常的事件发生的时候守护进程所给出的信息。
l Sysvinit
这个包提供了初始化程序,它是Linux系统中其他所有进程的父进程。
l Tar
这个包提供了归档和提取功能,实际上LFS上的所有包都要用到它。
l Tcl
这个包中包含了用于LFS包测试套件中要用到的工具命令语言。它只在临时工具链中被安装。
l Texinfo
这个包中包含了读取、写入和转化信息页的程序。它在安装许多LFS包的时候被用到。
l Udev
这个包中包含的程序用于动态的创建设备节点。也可以选择在/dev文档中创建成千的静态设备。
l Util-linux
这个包包含了各种各样的工具程序。它们是操作文件系统、控制台、分区以及信息的实用工具。
l Vim
这个包包含了一个编辑器。之所以选择它是因为它与经典的vi编辑器相兼容和其丰富的功能。选择什么样的编辑器是个人的问题,如果需要你可以自己选择喜欢的编辑器替代vim。
l XZ Utils
这个包包含了用于压缩和解压缩文件的程序。它提供了最高的压缩率,同时它可以解压缩XZ和LZMA格式的文件。
l Zlib
这个包包含了一些包要用到的压缩和解压缩程序。
预备知识
编译LFS系统不是一个简单的任务。它需要你拥有一定的Unix系统管理方面的知识和能力,这样你才能解决遇到的问题并正确的运行我们所列出的命令。特别的,最基础的东西是,你至少应当会使用命令行把文件从一个目录拷贝到另外一个目录、列出目录内容和文件的内容或改变当前目录等。我们也期望你有能力使用和安装Linux软件。
由于这本LFS书假设你已经至少拥有了这些基本的能力,所以各种LFS支持论坛不大可能会提供这方面的帮助。你将会发现你的有关于这些Linux基础方面的问题不会得到答复,或者是被简单的告知LFS的课前阅读列表。
在构建LFS系统之前,我们推荐阅读以下HOWTOs:
l 如何编译软件http://www.tldp.org/HOWTO/Software-Building-HOWTO.html
这是一个有关如何在Linux系统环境中编译和安装一个“普通”软件的综合性指导。虽然它是很久以前写的,但是它仍然提供了一个编译和安装软件所需的基础的技术概要。
l Linux用户手册http://www.linuxhq.com/guides/LUG/guide.html
这个手册涵盖了各种各样的Linux软件的使用,这个手册也是很陈旧了,但仍然是有效地。
l 必要的课前阅读线索http://www.linuxfromscratch.org/hints/downloads/files/essential_prereading.txt
这是特别为新的Linux用户准备的LFS线索。它包含了一个链接列表,这些链接连接到了一些关于更广泛话题的优秀资源源。一个尝试安装LFS系统的人需要了解这个列表中所列出的许多主题。
你的主机系统需要有下面列出的标志着最低版本号的软件。这对于一个现代的Linux发行版系统不是一个问题。还需要注意的是在很多发行版中常把软件头文件放入分开的包中,常是以“
以下列出的软件的早期版本也许能够正常工作,但是我们没有测试过。
l Bask-3.2(/bin/sh 需要是一个bash的符号链接或硬链接)
l Binutils-2.17(不推荐使用高于2.22的版本,因为它们没有被测试)
l Bison-2.3(/usr/bin/yacc 需要是一个bison的链接或者是运行bison的脚本)
l Bzip2-1.0.4
l Coreutils-6.9
l Diffutils-2.8.1
l Findutils-4.2.31
l Gawk-3.1.5(/usr/bin/awk需要是一个指向gawk的链接)
l Gcc-4.1.2(不推荐使用高于4.6.2的版本,因为它们没有被测试)
l Glibc-2.5.1(不推荐使用高于2.14.1的版本,因为它们没有被测试)
l Grep-2.5.1a
l Gzip -1.312
l Linux Kernel-2.6.25(已经使用GCC-4.1.2或更高版本编译过的)
之所以选用规定版本的kerne,是因为这是我们在第六章中编译glibc的时候开发者所推荐的版本。它也被udev所需要。
如果主机的内核版本号也超过了2.6.25,或者它不是使用GCC-4.1.2编译的,你也需要按照坚持规范更换系统的内核。有两种方法可以完成这件事。第一个,看看你的Linux提供商是不是提供了2.6.25的核心包或者是更老的核心包。如果是这样的话,你可能希望安装它。如果你的供应商没有提供一个可接受的核心包,或者你并不想安装它,你可以编译自己的内核。如何编译内核的指令和配置引导程序(假设系统使用GRUB)的介绍位于第8章。
l M4-1.4.10
l Make-3.81
l Patch-2.5.4
l Perl-5.8.8
l Sed-4.1.5
l Tar-1.18
l Texinfo-4.9
l Xz-5.0.3
注意,上边所提到的版本要求以及符号链接在我们构建LFS系统的过程中所必需的,我们将使用这些包并跟随者本书中的指令说明来构建LFS。如果这些符号链接指向了其它的软件(例如dash、mawk等),它可能能够工作,但是它们没有被开发团队的测试过,我们也不支持你这样做,而且可能用到的指令将会有偏差或需要额外的补丁。
为了看看你的宿主系统是不是已经包含了所有合适的软件版本,是不是有了编译程序的能力,你需要运行以下指令:
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 [ -e /usr/bin/yacc ];
then echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
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 [ -e /usr/bin/awk ];
then echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
else echo "awk not found"; fi
gcc --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
echo "Texinfo: `makeinfo --version | head -n1`"
xz --version | head -n1
echo 'main(){}' > dummy.c && gcc -o dummy dummy.c
if [ -x dummy ]
then echo "gcc compilation OK";
else echo "gcc compilation failed"; fi
rm -f dummy.c dummy
EOF
bash version-check.sh
印刷格式
为了让工作更容易完成,有几个贯穿这本书的排版惯例。这一部分包含一些贯穿LFS的印刷格式的例子。
./configure --prefix=/usr
这种文本的格式让文本看起来显而易见,除非在文字的周围还有其他的注释。这种格式也常用在解释段中以用于指示哪条命令被引用了。
在某些情况下,一整条逻辑行会被用反斜杠分成两个或更多条物理行。
CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
--prefix=/tools --disable-nls --disable-werror
注意,反斜杠必须随后立即返回。其它的像空格或制表符的空字符串将会造成错误的结果。
install-info: unknown option '--dir-file=/mnt/lfs/usr/info/dir'
这一种文本(固定宽度文本)格式显示了屏幕输出,通常作为一指令的运行结果。这种格式也常常用来显示文件名,例如/etc/ld.so.conf
重点
在这本书中这种格式的文本通常用于几个目的。它的主要目的是强调重要的地方和事物。
这种格式通常是指向LFS社区或外部页面的超链接。其中包括HOWTOs、下载站点和web站点。
cat > $LFS/etc/group << "EOF"
root:x:0:
bin:x:1:
....................
EOF
这种格式常用作创建配置文件的时候。第一条命令告诉系统创建$LFS/etc/group文件,接下来连着的都是这个文档的内容,知道遇到文件结束(EOF)为止。Therefore, this entire section is generally typed as seen.
这个格式中所封装的文本不需要输入或者复制粘贴就行了。
[OPTIONAL TEXT]
这个格式用来封装可选的内容。
passwd(5)
这种格式是参考指定的man页。在括号中的数字表示了man页中指定的某一块。例如,passwd有两个man页。按照LFS安装说明,这两个man页位于/usr/share/man/man1/passwd.1和/usr/share/man/man5/passwd.5.如果书中使用了passwd(5)那么它指的就是/usr/share/man/man5/passwd.5.man passwd将会打印出找到的符合“passwd”的第一页,将会是/usr/share/man/man1/passwd.1.在这个例子中,为了查看指定的页面你需要使用man 5 passwd来打开这一页。需要说明的是许多的man页并没有分成不同片段的副本页。因此,使用man
这本书被分为以下几个部分。
第1部分——介绍
第一部分说明了几个要点,它们指出了如何开展LFS的安装。这一段还提供了这本书中的元信息。
第2部分——为编译做准备
第二段描述了怎样准备编译工作——划分一个分区、下载所需的包和编译临时工具链。
第3部分——编译LFS系统
第3部分知道读者一步步的构建LFS系统——一个一个的编译和安装所有的包,设置引导脚本,同时安装内核。通过这些过程所编译出的系统是基础系统,我们将依赖这个系统,在这个系统上我们可以编译其它的软件来扩充它。在这本书的最后一部分,有一个便于使用的软件、链接库和已经被安装上的重要文件的列表。
那些用于创建LFS的软件在不断地升级和提高。在这本LFS书发布之后一些安全警告和漏洞补丁可能会变得有效。为了检测这本LFS构建书中的包版本或指令是否因为随之而来的安全缺陷和漏洞所改变,请在继续你的编译工作之前浏览。你应当注意网站中的变化,并在你构建LFS的同时将它们应用到相应的部分中去。
介绍
介绍
如何构建一个LFS系统
LFS系统将在一个已经安装的Linux发行版系统(例如Debian、Mandriva、Red Hat或SUSE)上进行构建。这个已经存在的Linux(宿主系统)作为一个开始点为编译工作提供必须的程序,包括一个编译器、链接器和shell,它们都被用来构建新系统。在安装这些系统的时候要记得选择“开发者”选项,以满足这些软件条件。
除了在你的机器上安装一个独立的发布版系统,你也可以使用这些发行版系统的LiveCD光盘系统进行编译工作。
这本书的第二章描述了如何创建一个新的Linux本地分区和文件系统。我们将在这个分区中编译和安装LFS系统。第三章说明了你需要下载哪些包和补丁来构建LFS系统,还将告诉你需要把这些包和补丁存储在什么地方。第四章讨论了如何构建一个合适的编译工作环境。请认真的阅读第四章,在这一章里将会解释一些在编译工作开始之前需要注意的重要问题,在认真阅读以后再开始第五章的工作。
第五章解释了一些来自于基础开发套件(或工具链)中的包的安装问题,在第六章中我们将使用这些包编译真实的系统。这些包中的一些包用来解决循环依赖问题——例如,为了编译一个编译器,你需要一个编译器。
第五章还将向你展示如何进行工具链的第一遍编译工作,包括Binutils和GCC(第一遍意味着这两个包在后边将被第二次编译)。下一步是编译Glibc,也就是C库。Glibc将使用第一遍编译构建的工具链进行编译。然后,我们就对工具链进行第二次编译。这一次,工具链将针对Glibc进行动态链接。在剩下的第五章中的包将使用第二次编译的工具链进行编译。当这些都做完了,LFS的安装过程就不再依赖宿主系统了,除了正在运行的内核。
这些为了将新系统从宿主系统中隔离出来的努力看起来很麻烦。我们在5.2节将会给出为什么要这样做的一个详细的技术说明,也就是“工具链技术说明”。
在第六章中,整个LFS系统已经被编译了。这个时候我们将会使用chroot(change root)程序进入一个虚拟的环境,在这个环境中我们开启一个新的shell,它的根目录被设置在LFS分区中。这个过程很类似于重新启动,并将内核(kernel)挂载到LFS分区上作为根分区。系统并没有真的被重启,而只是被chroot's代替了,因为创建一个可引导的系统需要而外的工作,而不像前边的配置那么简单。主要优势是“chrooting”允许你在编译LFS的同时继续使用宿主系统。在等待包编译的过程中,你可以像平常一样继续使用你的系统。
为了完成安装,LFS引导脚本将被在第七章中配置,内核和引导程序将在第八章中被配置。第九章包含了一些超出本书范围的有关LFS的经验。在这本书中的所有步骤都被完成之后,计算机也已经做好了重新启动进入新的LFS系统的准备了。
以上所说的是简单的过程。详细的信息将在接下来章节和包描述中进行讨论。看起来很复杂的项目将被详细的说明,在LFS的旅程中一切都会井井有条进行。
本书从上一版之后有什么更新
下边的列表列出了从上一个版本之后进行了更新的包。
升级到:
l Automake 1.11.3
l Binutils 2.22
l Coreutils 8.15
l E2fsprogs 1.42
l File 5.10
l GCC 4.6.2
l GDBM 1.10
l GMP 5.0.4
l Grep 2.10
l Inetutils 1.9.1
l IPRoute2 3.2.0
l Libtool 2.4.2
l Linux 3.2.6
l Man-DB 2.6.1
l Psmisc 22.15
l Shadow 4.1.5
l TCL 8.5.11
l Udev 181
l Util-Linux 2.20.1
l Zlib 1.2.6
添加了:
l glibc-2.14.1-sort-1.patch
l Kmod-5
l mpfr-3.1.0-fixes-1.patch
l shadow-4.1.5-nscd-1.patch
移除了:
l bash-4.2-fixes-3.patch
l coreutils-8.14-test_fix-1.patch
l gcc-4.6.1-locale-1.patch
更新日志
本书是Linux From Scratch的7.1版,创建于2012年3月2号。如果这个版本从发布到今已经超过了6个月,那么很可能一个更好的版本已经可用了。为了找到最新的版本,请查看镜像.
下边的列表是从上一个版本依赖进行的所有更改。
更新记录:
……详细更新记录略……
资源
1.4.1 FAQ
如果在LFS系统的构建过程中你遇到了错误,有什么问题或在这本书中发现了排版错误,请查看FAQ:。
1.4.2 邮件列表
linuxfromscratch.org服务器拥有大量的邮件列表,它们用于LFS项目的开发工作。这些列表中包括主要的开发和支持列表。如果FAQ没有解决你所遇到的问题,下一步就是搜索位于的邮件列表。有关不同的列表、如何订阅、存档位置以及额外信息的内容请浏览
。
1.4.3 IRC
我们社区的一些成员在我们的IRC上提供了支持。在使用这种支持之前,请确保你的问题再FAQ和邮件列表中没有找到解决方法。你可以在irc.linuxfromscratch.org找到IRC。这个支持管道名为#LFS-support。
1.4.4 镜像站点
LFS有几个互联镜像用来提供访问和更方便的下载所需的包。请浏览LFS站点以获得当前可用的镜像列表。
1.4.5 联系方式
请直接将你的问题和评论发送到LFS邮件列表中的一个中。
帮助
如果你在按照本书的说明构建系统的过程中遇到了问题,请查看FAQ页面。你所遇到的问题通常已经被问过了。如果你在这里没有找到你所关心的问题,尽力找到这个问题的原因。下边的线索将为你解决问题提供一些引导:。
如果你在FAQ中没有找到你的问题,请搜索邮件列表。
我们也有一个很好的社区愿意通过邮件列表和IRC(请查看1.4节,“资源”章节)提供帮助。无论怎样,我们每天都会收到一些问题,这些问题中的大多数都可以通过查看FAQ和邮件列表进行解决。所以,为了我们能够提供更好的服务,你需要先自己找找解决问题的办法,这样我们就可以把精力放在解决那些不同寻常的问题只上了。如果通过搜索没有得到想要的答案,请在你的问题请求中包括与问题相关的所有信息(下面将提到)。
1.5.1 要提供的信息
除了对问题的简要说明,以下列出的基础信息可以更好地帮助我们解决您所遇到的问题:
l 所使用的LFS说明书的版本(在本书中是7.1)
l 用于构建LFS的宿主系统的品牌和版本
l 系统需求脚本输出
l 发生问题的包和章节
l 准确的错误信息和症状
l 注意你是不是偏离了本书的路线
注意
偏离这本书的路线并不意味着我们不会帮助你。毕竟,LFS是根据个人偏好来创建的。你对整个过程的自由发挥的详细内容对我们评估问题发生的原因将很有帮助。
1.5.2 配置脚本的问题
当运行configure配置脚本的时候出现了问题,回顾config.log文件。这个文件将在配置的过程中将有问题的部分打印到屏幕上。在你的问题请求中请包涵相关的输出信息。
1.5.3 编辑问题
屏幕输出和各种文件的内容对于确定编译问题出现的原因是很有用的。来自configure配置脚本和make命令输出的内容都很有用。不可能包含所有的输出,但是包含与问题相关的信息就足够了。以下是一个来自于make指令运行输出的内容的实例:
gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2
在这个例子中,许多人都只包括以下一小段:
make [2]: *** [make] Error 1
这没有足够的信息用于适当的判定问题,因为这段内容只是注明了出现了问题,却没有说是什么问题。以上列出的完整的一段信息将是我们所需要保存的,因为它包括了我们执行的命令和所遇到的问题。
一片在线的卓越的文章对于解决问题是很有帮助的,请浏览。阅读这些文档将增加你的解决问题的概率。