lfs8.1

2019年11月09日 阅读数:626
这篇文章主要向大家介绍lfs8.1,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

Linux从头开始

版本8.1

由杰拉德 现场

主编:布鲁斯 Dubbs

版权©1999 - 2017杰拉德现场php

版权©1999 - 2017,杰拉德现场css

保留全部权利。html

这本书是许可下Creative Commons许可.前端

计算机指令可能会从书中提取的麻省理工学院的许可.node

LinuxLinus Torvalds®是一个注册商标。python


表的内容

前言

前言

个人学习之旅,更好地理解Linux开始在10年前,早在1998年。我第一次刚刚安装的Linux发行版,并迅速成为对整个概念和哲学背后的Linux。linux

总有许多方法来完成一个任务。一样能够适用于Linux发行版。许多已经存在多年。一些仍然存在,有些人变成别的东西,但别人一直属于咱们的记忆。他们都作不一样的事情来知足他们的目标受众的需求。由于不少不一样的方式来完成一样的最终目标存在,我开始意识到我再也不受限于任何一个实现。发现Linux以前,咱们只是忍受问题在其余操做系统当你别无选择。这是它是什么,无论你喜欢仍是不喜欢。对于Linux,选择的概念开始出现。若是你不喜欢什么东西,你是自由的,甚至鼓励改变它。ios

我试着大量的分布,不能决定任何一个。他们是伟大的系统自己。这不是对与错的问题了。��已经成为我的品味的问题。全部可用的选择,很明显这不是一个单一的系统,对我来讲是完美的。因此我开始建立本身的Linux系统,彻底符合个人我的喜爱。c++

真正让它本身的系统,我决心从源代码编译全部的代码,而不是使用预编译二进制包。这 “完美的”Linux系统将各类系统的优点没有他们的弱点。起初,他们的想法是至关艰巨的。我仍然致力于这样一个系统能够创建。git

后整理等问题循环依赖和编译时错误,我终于创建了一个定制的Linux系统。全面运做,彻底可用像任何其余的Linux系统。但这是我本身的创造。这是很是使人满意的本身这样的一个系统。惟一会被更好地建立每一个本身的软件。这是下一个最好的事情。

我分享个人目标与其余Linux社区的成员和经验,很明显,这些想法有持续的兴趣。它迅速成为纯这样的定制Linux系统服务不只知足用户特定需求,但也做为一个理想的学习机会为程序员和系统管理员来加强他们的(现有)Linux技能。扩大的利益, Linux从头开始项目诞生了。

这本书从头Linux的中央核心项目。它提供了必要的背景和指令为您设计和构建本身的系统。虽然这本书提供了一个模板,将致使一个正确的工做系统,您能够自由改变指令来知足本身,这在某种程度上,这个项目的一个重要组成部分。你仍然控制;咱们伸出援助之手让你开始你本身的旅程。

我衷心但愿你能有一个伟大的时间从头开始本身的Linux系统上工做,享受有一个系统的不少好处,真的是你本身的。

- - -
杰拉德现场
杰拉德在linuxfromscratch D0T org

观众

缘由有不少你想要读这本书。不少人提出的一个问题, “为何要经过手动的全部麻烦从头构建一个Linux系统,当你能够下载并安装一个现有的吗?”

这个项目存在的一个重要缘由是帮助你学习Linux系统是如何工做的。构建LFS系统帮助演示Linux的不一样之处,以及如何一块儿工做,彼此依赖。的最好的一件事情,这学习经验能够提供Linux系统是可以定制以知足您的独特需求。

LFS的另外一个主要好处是,它可让你有更多的控制系统不依赖别人的Linux实现。LFS,你坐在驾驶座上,决定系统的方方面面。

LFS容许您建立很是紧凑的Linux系统。安装普通发行版时,您经常被迫安装不少项目可能从未使用或理解。这些项目浪费资源。你可能会争辩说,今天的硬盘和cpu,这些资源再也不是考虑。可是,有时候你还受制于规模考虑若是没有其余。考虑可引导cd、u盘、嵌入式系统。这些地区LFS能够是有益的。

一个自定义构建的Linux系统的另外一个优势是安全。经过从源代码编译整个系统,您有权审计一切都和应用所需的安全补丁。再也不须要等待别人来编译二进制包,修复安全漏洞。除非你检查补丁并实现它你本身,你没有保证新的二进制包是创建正确和充分修复这个问题。

Linux从头开始的目标是创建一个完整的和可用的基础水平系统。若是你不但愿从头开始构建本身的Linux系统,您可能没有彻底受益于这本书的信息。

有太多其余好的理由来构建本身的LFS系统在这里所有列出来。最后,教育是迄今为止最强大的缘由。当你继续在LFS的经验,你会发现真正信息和知识的能力。

LFS目标架构

LFS的主要目标架构是AMD /英特尔x86(32位)和x86_64(64位)的cpu。另外一方面,这本书的指令也工做,一些修改,PC和手臂的cpu。创建一个系统,利用其中一个cpu,主要的先决条件,除了那些在接下来的几页,是现有的Linux系统,如早期LFS安装,Ubuntu,Red Hat / Fedora,SuSE,或其余目标的分布体系结构。还要注意,一个32位的分布能够安装和使用做为一个主机系统在64位AMD /英特尔电脑。

其余一些关于64位系统须要添加。一个32位的系统相比,可执行程序的大小略大,执行速度略快。例如,在一个测试构建的lfs - 6.5 Core2Duo基于CPU的系统,测量数据以下:

Architecture Build Time     Build Size 32-bit       198.5 minutes  648 MB 64-bit       190.6 minutes  709 MB

正如你所看到的,64位构建只��4%更快,比32位构建大9%。得到的64位系统是相对最小。固然,若是你有超过4 gb的RAM或想操做数据,超过4 gb,64位系统的优势是显著的。

默认的64位从LFS构建结果被认为是一个“纯”64位系统。也就是说,它只支持64位的可执行文件。创建一个“multi-lib”系统须要许多应用程序编译两次,一次为一个32位的系统,一次为一个64位的系统。这不是在LFS直接支持,由于它会干扰的教育目标提供所需的指令简单基本的Linux系统。你能够参考跨Linux从头开始项目高级主题。

LFS和标准

LFS的结构尽量遵循Linux标准。的主要标准是:

  • posix . 1的受权- 2008.

  • 文件系统的层次结构标准(FHS)3.0版

  • Linux标准基地(LSB)5.0版

    LSB有四个独立的标准:核心,桌面,运行时语言和成像。除了通用的需求也有架构具体要求。还有两个区域试验使用:Gtk3和图形。LFS尝试符合架构在前一节中讨论。

    请注意

    许多人不一样意LSB的要求。定义它的主要目的是确保专有软件可以兼容的系统上安装并正常运行。LFS是基于源以来,用户彻底控制哪些包是理想的,许多人选择不安装一些指定的LSB的包。

建立一个完整的LFS系统可以经过LSB认证考试是可能的,但不是没有许多其余包超出了LFS的范围。BLFS这些额外的包已经安装说明。并

包提供的LFS须要知足LSB需求

LSB的核心:

Bash,公元前,Binutils Coreutils、你要文件,Findutils,呆呆的,Grep,Gzip、M4,Man-DB,Ncurses,Procps,Psmisc,Sed,影子,焦油,Util-linux Zlib

LSB桌面:

没有一个

LSB运行时语言:

Perl

LSB成像:

没有一个

LSB Gtk3和LSB图形(试验用):

没有一个

BLFS包提供的须要并知足LSB需求

LSB的核心:

,批处理(部分),Cpio,艾德,Fcrontab,Initd-tools,Lsb_release,NSPR,NSS,PAM,罗马帝国,Sendmail(或后缀或进出口),时间

LSB桌面:

Alsa,ATK公司,开罗,Desktop-file-utils,Freetype Fontconfig,Gdk-pixbuf,Glib2,GTK + 2,Icon-naming-utils,Libjpeg-turbo,Libpng,Libtiff,Libxml2,MesaLib,Pango,Qt4 Xdg-utils,Xorg

LSB运行时语言:

Python,Libxml2,Libxslt

LSB成像:

杯子,Cups-filters,内容、理智

LSB Gtk3和LSB图形(试验用):

GTK + 3

BLFS包不是由LFS或须要并知足LSB需求

LSB的核心:

没有一个

LSB桌面:

没有一个

LSB运行时语言:

没有一个

LSB成像:

没有一个

LSB Gtk3和LSB图形(试验用):

没有一个

理由包在书中

如前所述,LFS的目标是创建一个完整的和可用的基础水平系统。这包括全部包须要复制自身,同时提供一个相对最小的基地来定制一个更完整的系统基于用户的选择。这并不意味着LFS系统是最小的可能。包括几个重要的包,不严格要求。下面的列表文档书中的每一个包的理由。

  • Acl

    这个包包含公用事业管理访问控制列表,用于定义更细粒度的可自由支配的文件和目录的访问权限。

  • Attr

    这个包包含项目管理文件系统对象的扩展属性。

  • Autoconf

    这个包包含项目生产shell脚本能够自动配置源代码从开发人员的模板。一般须要重建一个包后更新到构建过程。

  • Automake

    这个包包含从模板生成使文件的程序。一般须要重建一个包后更新到构建过程。

  • Bash

    这个包知足LSB核心要求系统提供一个Bourne Shell的接口。它选择在其余shell包由于它的一些常见的使用和普遍的功能超出了基本的外壳函数。

  • 公元前

    这个包提供了一种高精度数字处理语言。它知足要求须要在构建Linux内核。

  • Binutils

    这个包包含一个连接,一个汇编程序,和其余工具来处理对象文件。这个包的程序是最须要编译LFS系统的包。

  • 野牛

    这个包包含的GNU版本yacc(另外一个编译器编译器)须要构建其余几个LFS项目。

  • Bzip2

    这个包包含压缩和解压文件的程序。它是许多LFS包须要减压。

  • 检查

    这个包包含其余项目的测试工具。这只是临时安装的工具链。

  • Coreutils

    这个包包含许多基本程序用于查看和操做文件和目录。这些程序须要命令行文件管理,和是必要的在LFS每一个包的安装过程。

  • DejaGNU

    这个包包含测试其余程序的一个框架。这只是临时安装的工具链。

  • 你要

    这个包包含程序显示文件或目录之间的差别。这些程序能够用来建立补丁,还用于许多包的构建过程。

  • E2fsprogs

    这个包包含实用程序处理ext二、ext3和ext4文件系统。这些是最多见的和全面测试Linux支持的文件系统。

  • Eudev

    这个包是一个设备管理器。它动态地控制/ dev目录中的条目从系统设备被添加或删除。

  • 外籍人士

    这个包包含一个相对较小的XML解析库。这是所需的XML::解析器Perl模块。

  • 预计

    这个包包含一个程序执行脚本对话与其余互动节目。它一般用于测试其余包。这只是临时安装的工具链。

  • 文件

    这个包包含一个实用工具来肯定一个给定的文件或文件的类型。几包须要构建。

  • Findutils

    这个包包含程序找到文件在文件系统中。它是用于许多包的构建脚本。

  • Flex

    这个包包含一个实用工具生成的程序文本的识别模式。这是GNU版本的lex(词法分析器)计划。它须要创建几个LFS包。

  • 腼腆的人

    这个包包含操纵文本文件的程序。这是awk的GNU版本(Aho-Weinberg-Kernighan)。它是用在许多其余包的构建脚本。

  • 海湾合做委员会

    这个包是Gnu Compiler Collection。它包含了C和c++编译器以及其余一些不是由LFS。

  • 同时

    这个包包含GNU库数据库管理器。它被另外一个LFS包,Man-DB。

  • Gettext

    这个包包含公用事业和图书馆国际化和本地化的不少包。

  • Glibc

    这个包包含主要的C库。没有它Linux程序不会运行。

  • GMP

    这个包包含数学库,为高精度计算提供有用的功能。应构建Gcc。

  • Gperf

    这个包包含一个程序,生成一个完美哈希函数从一个关键组。Eudev所需。

  • Grep

    这个包包含搜索文件的程序。使用这些项目大多数软件包的构建脚本。

  • Groff

    这个包包含用于处理程序和格式文本。这些项目的一个重要功能是格式手册页。

  • GRUB

    这个包是大统一引导加载程序。这是几个可用的引导加载程序之一,可是是最灵活的。

  • Gzip

    这个包包含压缩和解压文件的程序。它须要解压许多包在LFS和超越。

  • Iana-etc

    这个包提供了网络服务和协议数据。它须要使适当的网络功能。

  • Inetutils

    这个包包含基本的网络管理的程序。

  • Intltool

    这个包包含用于从源文件中提取可翻译字符串的工具。

  • IProute2

    这个包包含项目基本和先进的IPv4和IPv6网络。这是选择在其余常见网络工具包(net-tools)IPv6的能力。

  • Kbd

    这个包包含密钥表文件,为非美国键盘键盘实用程序,控制台的字体。

  • Kmod

    这个包包含程序须要管理Linux内核模块。

  • 这个包包含一个很是好的文本文件查看器,容许向上或向下滚动当浏览一个文件。也被Man-DB查看手册。

  • Libcap

    这个包实现了用户空间接口的POSIX 1003.1 e Linux内核中可用的功能。

  • Libpipeline

    Libpipeline包包含一个库操做管道子流程的灵活和方便的方式。这是Man-DB所需的包。

  • Libtool

    这个包包含GNU通用库支持脚本。它包装在一致的使用共享库的复杂性,便携式接口。这是在其余LFS包所需的测试套件。

  • Linux内核

    这个包是操做系统。它是Linux在GNU / Linux环境中。

  • M4

    这个包包含一个通用文本宏处理器有用的做为其余程序的构建工具。

  • 使

    这个包包含一个程序为指导建设包。LFS所需的几乎每个包中。

  • Man-DB

    这个包包含项目寻找和查看手册页。这是选择,而不是 男人包因为卓越的国际化能力。它提供程序的人。

  • 手册页

    这个包包含了基本的Linux手册页的实际内容。

  • 货币政策委员会

    这个包包含复数的运算的功能。应由Gcc。

  • MPFR

    这个包包含多个精密运算的功能。应由Gcc。

  • Ncurses

    这个包包含库terminal-independent处理字符的屏幕。它常被用来提供光标控制菜单系统。须要LFS的包数量。

  • 补丁

    这个包包含一个程序修改或建立文件的应用 补丁一般文件建立的 diff程序。它是构建过程所需的几个LFS包。

  • Perl

    这个包是一个PERL解释器运行时语言。它须要几个LFS的安装和测试套件包。

  • Pkg-config

    这个包提供了一个程序来返回关于一个安装库的元数据或包。

  • Procps-NG

    这个包包含项目监控过程。这些程序是用于系统管理,也使用的LFS Bootscripts。

  • Psmisc

    这个包包含程序显示正在运行的进程的信息。这些项目是有用的系统管理。

  • Readline

    这个包是一组库提供了命令行编辑和历史功能。它使用Bash。

  • Sed

    这个包容许在文本编辑器中编辑文本而不打开它。它也须要大多数LFS包的配置脚本。

  • 影子

    这个包包含项目以安全的方式来处理密码。

  • Sysklogd

    这个包包含项目日志系统消息,例如那些由内核或守护进程在不寻常的事件发生。

  • Sysvinit

    这个包提供了 初始化程序,它是全部其余进程的父在Linux系统上。

  • 焦油

    这个包提供了存档和提取功能用于LFS几乎全部的包。

  • Tcl

    这个包包含工具命令语言中使用的许多测试套件LFS包。这只是临时安装的工具链。

  • Texinfo

    这个包包含程序阅读,写做,和转换信息页面。它是用于许多LFS的安装程序包。

  • Util-linux

    这个包包含各类各样的实用程序。其中包括实用程序来处理文件系统、控制台、分区,和消息。

  • Vim

    这个包包含一个编辑器。之因此选择它,是由于它的兼容性与经典的vi编辑器及其大量的强大的功能。一个编辑器是一个很是私人的选择对于许多用户和任何其余编辑器能够代替若是须要。

  • XML::解析器

    这个包是一个Perl模块,接口与外籍人士。

  • XZ跑龙套

    这个包包含压缩和解压文件的程序。它提供了最高的压缩和解压包在XZ有用或LZMA格式。

  • Zlib

    这个包包含一些程序所使用的压缩和解压缩的例程。

先决条件

构建LFS系统不是一个简单的任务。它须要必定程度的现有知识的Unix系统管理以解决问题和正确执行命令列出。特别是,做为一个绝对最低,您应该已经有能力使用命令行(壳)复制或移动文件和目录,目录和文件内容列表,改变当前目录。也但愿你有一个合理的使用和安装Linux软件的知识。

由于假定的LFS书籍 至少这个基本的水平,各类LFS支持论坛不太可能在这些领域可以给你提供了不少帮助。你会发现你的问题关于这些基本的知识可能会置之不理,或者你只是提到了LFS必要的课前阅读列表。

在构建LFS系统以前,咱们推荐阅读如下:

排版

使事情更容易,有一些排版约定使用这本书。本节包含了一些排版格式的例子在Linux从头开始。

./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.

强调

这种形式的文本是用于多个目的。其主要目的是为了强调重要的点或物品。

http://www.linuxfromscratch.org/

这种格式用于超连接在LFS社区和外部页面。它包括howto、下载位置,和网站。

cat > $LFS/etc/group << "EOF" root:x:0: bin:x:1: ...... EOF

使用这种格式在建立配置文件。第一个命令告诉系统建立该文件 $LFS/etc/group从任何类型的第二行到文件结束(EOF)序列。所以,整个部分是通常类型的观察。

<REPLACED TEXT>

这种格式是用来封装文本不能输入或复制和粘贴操做。

[OPTIONAL TEXT]

这种格式是用来封装的文本是可选的。

passwd(5)

这种格式是指一个特定的手册(人)页面。圆括号里面的数字代表一个特定部分手册内。例如, passwd有两个手册页。每LFS安装说明,这两个男人将位于页面/usr/share/man/man1/passwd.1 /usr/share/man/man5/passwd.5。当这本书使用 passwd(5)它是专门指 /usr/share/man/man5/passwd.5. 人密码将打印第一个页面发现匹配吗 “passwd”,这将 /usr/share/man/man1/passwd.1。对于这个示例,您将须要运行 男人5 passwd为了读取特定页面被称为。应该注意的是,大多数人页面没有重复的页面名称在不一样的部分。所以,男人 <program name>一般是足够的。

结构

这本书分为如下部分。

第一部分,介绍

第一部分解释了一些重要的笔记如何推动LFS安装。这一节还提供关于这本书的元信息。

第二部分——准备构建

第二部分描述了如何准备建设的进程制定一个分区,下载包,和编译临时工具。

第三部分,构建LFS系统

第三部分引导读者经过LFS system-compiling的建筑和安装的全部包,设置启动脚本和安装内核。生成的Linux系统的基础其余软件能够构建扩展所需的系统。在这本书的最后,有一个易于使用的参考清单的全部程序、库和重要的文件已经安装。

勘误表

用于建立一个LFS系统的软件是不断更新和提升。安全警告和错误修复可能成为可用的LFS书籍后被释放。检查是否这个版本的包版本或指令LFS须要任何修改来适应安全漏洞或其余bug修复,请访问http://www.linuxfromscratch.org/lfs/errata/8.1/在继续以前与您的构建。你应该注意任何变化如图所示,将它们应用于这本书的相关部门推动构建LFS系统。

第一部分介绍

第1章。介绍

1.1。如何构建一个LFS系统

LFS系统将由使用一个已经安装了Linux发行版(好比Debian,OpenMandriva Fedora,或openSUSE)。这个现有的Linux系统(主机)将被用做一个起点提供必要的程序,包括编译器、连接器,和壳牌,创建新的系统。选择 “发展”选择分布安装期间可以访问这些工具。

做为替代安装一个单独分配到您的机器上,您可能但愿使用一个LiveCD从商业分布。

第二章这本书描述了如何建立一个新的本地Linux分区和文件系统。这是新的LFS系统的地方将被编译和安装。第三章解释了哪些包和补丁须要下载到构建LFS系统以及如何存储它们在新的文件系统。第四章论述了设置一个合适的工做环境。请阅读第四章当心,由于它解释了几个重要的问题须要注意在开始工做以前第五章甚至更远。

第五章解释了安装的包的数量将造成基本的开发套件(或工具链),用于构建实际系统第六章。这些包是须要解决循环依赖的例子,编译一个编译器,您须要一个编译器。

第五章也向你展现了如何构建一个工具链的第一遍,包括Binutils和GCC(第一遍基本上意味着这两个核心包将从新安装)。下一步是构建Glibc,C库。Glibc将编译工具链项目建在第一遍。而后,第二个经过工具链的创建。这一次,对新建的工具链将动态连接Glibc。剩下的第五章包是使用第二个经过工具链。在这样作时,LFS安装过程将再也不依赖于宿主分布,除了正在运行的内核。

这一努力隔离新系统从主机分布彷佛有些过度了。一个完整的技术解释为何这样作是在提供5.2节,“工具链技术笔记”.

第六章,创建了完整的LFS系统。的 chroot(改变根)计划是用来输入虚拟环境和启动一个新的shell的LFS分区根目录将被设置。这很是相似于重启和指示内核挂载LFS分区做为根分区。系统并不会重启,而是使用 chroot由于建立一个可启动的系统须要额外的工做,这是没有必要的。主要的优势是 “chroot”容许你继续使用主机系统而LFS正在建造中。在等待包编译完成,你能够继续使用你的电脑是正常的。

完成安装,基本系统配置设置第七章和内核引导加载程序设置第八章.第九章包含的信息继续LFS的经验超出了这本书。在这本书中已经实现的步骤后,计算机将准备重启进入新LFS系统。

这是简而言之过程。详细���息在如下章节讨论每个步骤和包的描述。将澄清项看起来复杂,那么一切将会层次分明当你着手LFS冒险。

1.2。有什么新自上次发布

下面列出的包更新自书的先前版本。

升级到:

  • Automake 1.15.1

  • 公元前1.07.1

  • Binutils 2.29

  • Coreutils 8.27

  • 你要3.6

  • Eudev 3.2.2

  • E2fsprogs 1.43.5

  • Expat-2.2.3

  • 文件5.31

  • 2.6.4 Flex

  • GCC 7.2.0

  • 同时1.13

  • Glibc 2.26

  • gperf - 3.1

  • Grep 3.1

  • GRUB 2.02

  • IPRoute2 4.12.0

  • Kmod 24

  • 少487

  • Libpipeline 1.4.2

  • Linux 4.12.7

  • 手册页4.12

  • Perl 5.26.0

  • Pkg-config 0.29.2

  • Psmisc 23.1

  • 影子4.5

  • Tcl-core-8.6.7

  • Texinfo 6.4

  • Tzdata 2017 b

  • Util-Linux 2.30.1

  • Vim 8.0.586

补充道:

删除:

  • bc - 1.06.95 memory_leak - 1.补丁

1.3。更新日志

这是版本 8.1Linux从零开始的书,2017年9月1日。若是这本书是超过六个月大时,一个新的和更好的版本可能已经可用。为了找到答案,请检查镜子经过之一http://www.linuxfromscratch.org/mirrors.html.

下面是一个列表的更改自先前版本的书。

更新日志条目:

  • 2017-09-01

    • [bdubbs]- lfs - 8.1释放。

  • 2017-08-27

    • (bdubbs)——从systemd书的util-linux删除无效的选择。

  • 2017-08-24

    • (dj)——除去GlibC rpcgen指数。

    • (ken)——修复acl的testsuite perl - 5.26。

  • 2017-08-16

    • (bdubbs)——从glibc删除不须要的选项。

  • 2017-08-16

    • (bdubbs)——添加一个注意gmp,显示了如何建立通用的gmp库。

  • 2017-08-15

    • [bdubbs]——gcc-7.2.0更新。修复# 4125.

    • [bdubbs]——linux-4.12.7更新。修复# 4124.

    • [bdubbs]-更新glibc 2.26。修复# 4120.

    • [bdubbs]——更新binutils - 2.29。修复# 4117.

  • 2017-08-11

    • [bdubbs]——tcl-core-8.6.7更新。修复# 4123.

  • 2017-08-08

    • [bdubbs]——e2fsprogs-1.43.5更新。修复# 4122.

    • [bdubbs]——expat-2.2.3更新。修复# 4121.

    • [bdubbs]——linux-4.12.5更新。修复# 4119.

  • 2017-07-23

    • (dj)——util-linux-2.30.1更新。修复# 4114.

    • (dj)——linux-4.12.3更新。修复# 4115.

    • (dj)-更新人-页面- 4.12。修复# 4116.

  • 2017-07-18

    • (dj)——linux-4.12.2更新。修复# 4113.

    • (dj)——expat-2.2.2更新。修复# 4112.

    • (dj)——推迟systemd BLFS测试套件以前。并修复# 4107.

  • 2017-07-13

    • [bdubbs]——linux-4.12.1更新。修复# 4110.

    • [bdubbs]——libpipeline-1.4.2更新。修复# 4109.

    • [bdubbs]——iproute2-4.12.0更新。修复# 4108.

    • (bdubbs)——解决测试程序。修复# 4105.

    • [bdubbs]——在procps-ng修复测试程序。修复# 4106.

    • [bdubbs]-更新glibc 2.25 + adc7e06。修复# 4097.

  • 2017-07-03

    • [bdubbs]- linux - 4.12更新。

  • 2017-07-02

    • [bdubbs]——在attr修复测试程序。修复# 4103.

    • [bdubbs]-更新grep - 3.1。修复# 4104.

  • 2017-06-30

    • [bdubbs]——linux-4.11.8更新。修复# 4099.

  • 2017-06-26

    • [bdubbs]——修复一个错误在mountfs bootscript。

    • (bdubbs)——你要删除过期的种子在章节5和6。

  • 2017-06-24

    • [bdubbs]——更新texinfo - 6.4。修复# 4100.

    • [bdubbs]——linux-4.11.7更新。修复# 4099.

    • [bdubbs]——删除部分谈论着没有网卡的配置。

    • [bdubbs]——更新引导脚本卸载网络文件系统在下降网络。

  • 2017-06-21

    • [bdubbs]——automake-1.15.1更新。修复# 4098.

    • [bdubbs]——expat-2.2.1更新。修复# 4096.

    • [bdubbs]——更新psmisc - 23.1。修复# 4094.

    • [bdubbs]——linux-4.11.6更新。修复# 4095.

  • 2017-06-07

    • [bdubbs]——linux-4.11.4更新。修复# 4093.

  • 2017-06-02

    • [bdubbs]-更新util - linux - 2.30。修复# 4092.

    • [bdubbs]——perl-5.26.0更新。修复# 4091.

    • [bdubbs]- - - - - - - 5.31更新文件。修复# 4090.

    • 3.6[bdubbs]-你要更新。修复# 4089.

    • [bdubbs]——linux-4.11.3更新。修复# 4088.

  • 2017-05-25

    • [renodr]——修复i686系统的构建。包括06 Glibc章修改。

  • 2017-05-19

    • [bdubbs]——移库版本presevation packages.ent调试符号。修复# 4085.

    • [bdubbs]——linux-4.11.1更新。修复# 4086.

    • (bdubbs)4.5 -更新的影子。修复# 4087.

  • 2017-05-13

    • (dj)——-isystem介绍使用gcc的最终系统位置的内部头在Glibc构建。

    • (ken)——更新一些库版本再次剥离,部分修复# 4085.

    • (dj)——添加额外的符号连接,避免“/工具”最终系统中的引用。

  • 2017-05-07

    • [bdubbs]——flex-2.6.4更新。修复# 4084.

  • 2017-05-05

    • [bdubbs]-更新人-页面- 4.11。修复# 4083.

  • 2017-05-03

    • [bdubbs]——gcc-7.1.0更新。修复# 4082.

    • [bdubbs]——iproute2-4.11.0更新。修复# 4081.

    • glibc(bdubbs)——解决问题测试和添加一些解释配置选项。

    • (bdubbs)——添加一个命令/root/.联系vimrc这样默认不覆盖那些/etc/vimrc. vim选项

  • 2017-05-01

    • [bdubbs]- linux - 4.11更新。修复# 4080.

    • [bdubbs]——更新flex修补。

  • 2017-04-26

    • (bdubbs)——添加一个补丁来修复版本2.6.3:flex退化。

    • [bdubbs]——linux-4.10.13更新。修复# 4079.

  • 2017-04-26

    • [bdubbs]-更新grub 2.02。修复# 4042.

  • 2017-04-25

    • [bdubbs]——vim-8.0.586更新。修复# 4078.

    • [bdubbs]——eudev-3.2.2更新。修复# 4077.

    • [bdubbs]——linux-4.10.12更新。修复# 4075.

    • [bdubbs]——更新gperf - 3.1。修复# 4053.

    • (bdubbs)-提升指令保存调试信息选择的图书馆当剥离第六章的末尾。修复# 4076(再一次)。

  • 2017-04-22

    • (bdubbs)——添加指令保存调试信息选择图书馆当剥离第六章的末尾。修复# 4076.

  • 2017-04-11

    • [bdubbs]——删除没必要要的——disable-compile-warnings pkg-config指令。感谢杰弗瑞·史密斯指出这一点。

  • 2017-04-10

    • [bdubbs]——linux-4.10.9更新。修复# 4073.

    • [bdubbs]——bc-1.07.1更新。修复# 4074.

  • 2017-04-07

    • [bdubbs]——在bc - 1.07修复一个错误。

  • 2017-04-03

    • [bdubbs]-更新bc - 1.07。修复# 4071.

  • 2017-03-31

    • [bdubbs]——linux-4.10.8更新。修复# 4070.

    • [bdubbs]-更新少- 487。修复# 4069.

  • 2017-03-28

    • [bdubbs]——移动readline在公元前第六章。修复# 4068.

    • [bdubbs]—���linux-4.10.6更新。修复# 4065.

    • [bdubbs]——pkg-config-0.29.2更新。修复# 4066.

    • [bdubbs]更新tzdata - 2017 b。修复# 4067.

    • (bdubbs)——添加选项-Dusethreads perl 6章。

  • 2017-03-25

    • (dj)-更新lfs - bootscripts - 20170825。修复一个问题在rc脚本范围。感谢“quesker”# lfs-support报告和后续测试。

  • 2017-03-18

    • [bdubbs]——更新格式checkfs启动脚本的错误消息。修复# 4064.

    • [bdubbs]-更新人-页面- 4.10。修复# 4063.

    • [bdubbs]——linux-4.10.3更新。修复# 4062.

    • (bdubbs)-同时更新1.13。修复# 4061.

    • [bdubbs]——更新coreutils - 8.27。修复# 4060.

  • 2017-03-11

    • (dj)——修复的描述修改 gcc/config/{linux,i386/linux{,64}}.h在 海湾合做委员会经过1。

  • 2017-03-08

    • (dj)——在网络配置更新/ etc / hosts。

  • 2017-03-03

    • [bdubbs]——更新binutils - 2.28。公元前m4和binutils适应以前黄金连接器回归测试。修复# 4059.

    • [renodr]——linux-4.10.1更新。修复# 4056.

    • [renodr]——tzdata2017a更新。修复# 4057.

  • 2017-02-28

    • [bdubbs]——kmod-24更新。修复# 4054.

    • [bdubbs]——更新util-linux 2.29.2。修复# 4052.

    • [bdubbs]——iproute2-4.10.0更新。修复# 4051.

    • [bdubbs]- linux - 4.10更新。修复# 4049.

  • 2017-02-25

    • [bdubbs]- lfs - 8.0释放。

1.4。资源

1.4.1。常见问题解答

若是在构建的LFS系统您遇到任何错误,有任何问题,或想在书中有一个错误,请先咨询常见问题(FAQ)位于http://www.linuxfromscratch.org/faq/.

1.4.2。邮件列表

 linuxfromscratch.org服务器主机的邮件列表用于LFS的发展项目。这些列表包括的主要开发和支持列表,等等。若是FAQ并不能解决问题,下一步将是搜索邮件列表http://www.linuxfromscratch.org/search.html.

的信息在不一样的列表,如何订阅,存档位置,和额外的信息,请访问http://www.linuxfromscratch.org/mail.html.

3。IRC

LFS社区的一些成员提供帮助互联网中继聊天(IRC)。在使用这种支持以前,请确保你的问题尚未回答的LFS FAQ或者邮件列表档案。你能够找到的IRC网络 irc.freenode.net。支持通道被命名为# LFS-support。

1.4.4。镜像站点

LFS项目有不少全球镜子让访问网站并下载所需的包更方便。请访问LFS的网站http://www.linuxfromscratch.org/mirrors.html列表的当前的镜子。

1.4.5。联系信息

请直接提问和评论的LFS邮件列表(见上图)。

1.5。帮助

若是一个问题或经过这本书工做时遇到问题,请检查FAQ页面http://www.linuxfromscratch.org/faq/ generalfaq。问题每每已经回答。若是你的问题没有回答这个页面上,试图找到问题的根源。下面的提示将给你一些指导故障排除:http://www.linuxfromscratch.org/hints/downloads/files/errors.txt.

若是你找不到你的问题中列出的常见问题,搜索邮件列表http://www.linuxfromscratch.org/search.html.

咱们也有一个很棒的LFS社区愿意提供帮助经过邮件列表、IRC(参见1.4节,“资源”这本书的部分)。然而,咱们天天获得几个支持的问题,他们中的许多人很容易回答FAQ,首先经过搜索邮件列表。因此,为咱们提供最好的帮助,你须要作一些调查。让咱们关注更多的不一样寻常的支持需求。若是你搜索不产生一个解决方案,请包括全部相关信息(下面提到)在你的请求帮助。

1.5.1。东西提

除了一个简短的解释问题的经验,最重要的东西,包括在任何请求帮助:

  • 这本书的版本(在本例中使用 8.1 )

  • 主机分布和用于建立LFS版本

  • 的输出主机系统需求脚本

  • 包或部分中遇到的问题

  • 准确的错误信息或接收症状

  • 注意你是否已经偏离了这本书

请注意

偏离这本书 不意味着咱们将不会帮助你。毕竟,LFS我的偏好。前期对任何变化创建过程帮助咱们评估和肯定你的问题的可能缘由。

1.5.2。配置脚本的问题

若是出现错误而运行 配置脚本,检查 config.log文件。这个文件可能包含过程当中遇到的错误 配置没有打印到屏幕上。包括 有关若是你须要寻求帮助。

1.5.3。更正编译问题

屏幕输出和各类文件的内容是有用的在决定编译问题的缘由。屏幕输出 配置脚本和 使运行是颇有帮助的。没有必要包括整个输出,但包括足够的相关信息。下面是一个例子的信息的类型包括屏幕输出 使:

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

这不是足够的信息正确诊断问题,由于它只指出,有错误,不是 什么错了。整个部分,在上面的示例中,就是应该被保存,由于它包含的命令被执行死刑(s)和相关的错误消息。

一篇优秀的文章关于在互联网网上寻求帮助http://catb.org/ esr /常见问题/ smart-questions.html。阅读并按照提示在本文档中增长的可能性得到你须要的帮助。

第二部分。准备构建

第二章。准备主机系统

2.1。介绍

在这一章,构建所需的主机工具检查LFS,若是必要的话,安装。而后准备一个分区将主机LFS系统。咱们将建立的分区,建立一个文件系统,并挂载。

2.2。主机系统需求

你的主机系统应该有如下软件的最低版本。这应该不是一个问题对于大多数现代的Linux发行版。还要注意,许多发行版将软件标题到单独的包,一般的形式 “<包名称>重击”或 “<包名称> - dev”。必定要安装这些若是您的发行版提供。

早期版本的软件包可能上市工做,可是尚未测试。

  • bash - 3.2(/ bin / sh应该是一个象征性的或硬连接的bash)

  • binutils - 2.17(大于2.29版本不推荐,由于他们没有测试)

  • 野牛- 2.3(/ usr / bin / yacc应该连接到野牛或小脚本,执行野牛)

  • Bzip2-1.0.4

  • coreutils - 6.9

  • Diffutils-2.8.1

  • Findutils-4.2.31

  • Gawk-4.0.1(/ usr / bin / awk应该呆呆的连接)

  • gcc - 4.7包括c++编译器, g + +(版本大于7.2.0不推荐,由于他们没有测试)

  • glibc - 2.11(大于2.26版本不推荐,由于他们没有测试)

  • Grep-2.5.1a

  • Gzip-1.3.12

  • Linux内核- 3.2

    内核版本需求的缘由是,咱们在构建指定版本 glibc在第六章的建议开发人员。udev也须要。

    若是主机内核是早于3.2须要内核替换为最新版本。有两种方法你能够去。首先,看看你的Linux内核包供应商提供了一个3.2或更高版本。若是是这样,您可能但愿安装它。若是你的供应商没有提供一个可接受的内核包,或者你不肯意安装它,你能够本身编译一个内核。说明编译内核和配置引导加载程序(假设主机使用GRUB)位于第八章.

  • M4-1.4.10

  • 让- 3.81

  • Patch-2.5.4

  • Perl-5.8.8

  • Sed-4.1.5

  • 沥青- 1.22

  • texinfo - 4.7

  • Xz-5.0.0

重要的

注意上面提到的符号连接须要构建一个LFS系统使用说明包含在这本书。符号连接指向其余软件(如短跑、mawk等)可能会工做,但不支持的测试或LFS开发团队,而且可能须要偏离的指令或额外的补丁包。

是否你的主机系统全部适当的版本,和编译程序,运行如下:

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 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 EOF  bash version-check.sh

2.3。建筑LFS阶段

LFS设计是创建在一个会话中。也就是说,假设的说明系统的过程当中不会关闭。这并不意味着系统必须一口气完成。问题是,某些程序必须从新引导以后re-accomplished若是恢复LFS在不一样的点。

2.3.1。1 - 4章

这些章节完成主机系统。从新启动时,要注意如下几点:

  • 程序做为根用户在2.4节须要LFS环境变量设置 对根用户.

2.3.2。第五章

  • 必须挂载/ mnt / lfs分区。

  • 全部在第五章必须由用户指令 lfs。一个 苏- lfs须要作任何任务以前在第5章。

  • 的程序5.3节,“通常编译指令”是相当重要的。若是有任何疑问的安装包,确保任何先前扩展包,re-extract包文件,完成全部部分的指令。

2.3.3。章6 - 8

2.4。建立一个新的分区

像大多数其余操做系统,LFS一般是安装在专用的分区。构建LFS系统推荐的方法是使用一个空的分区或可用,若是你有足够的空间分区,建立一个。

最小系统须要一个分区的6字节(GB)。这是足以存储全部源tarball,编译的包。然而,若是LFS系统的目的是成为主要的Linux系统,安装额外的软件可能会将须要额外的空间。20 GB的分区是一个合理的大小提供了增加。LFS系统自己不会占用这么多的房间。这个需求的很大一部分是提供足够的免费临时存储以及LFS完成后添加额外的功能。另外,编译包须要大量的磁盘空间,能够包安装后回收。

由于老是没有足够的随机存取存储器(RAM)用于编译过程,这是一个好主意使用小磁盘分区 swap空间。这是内核所使用的存储使用的数据,让更多的内存用于活动进程。的 swap分区能够同样的LFS系统使用的主机系统,在这种状况下没有必要建立另外一个。

开始一个磁盘分区程序等 cfdisk fdisk用命令行选项命名的硬盘将建立新分区的例子 /dev/sda主要的集成驱动电路(IDE)磁盘。建立一个Linux native分区和一个 swap分区,若是必要的。请参考 cfdisk(8) fdisk(8)若是你还不知道如何使用程序。

请注意

对于有经验的用户,其余分区方案是可能的。新的LFS系统能够在软件突袭数组或一个LVM逻辑卷。然而,其中的一些选项须要一个initramfs,这是一个高级主题。这些分区方法不建议第一次LFS用户。

记住这个新分区的名称(例如, sda5)。这本书将称之为LFS分区。还记得的称号 swap分区。这些名字,之后将会须要的 /etc/fstab文件。

2.4.1。其余分区问题

请求的建议系统分区一般贴在LFS邮件列表。这是一个很是主观的话题。大多数发行版默认是使用整个驱动器除了一个小交换分区。这不是最佳的LFS几个缘由。它下降了灵活性,使得跨多个分布共享数据或LFS构建更加困难,使备份更耗费时间,能够经过低效浪费磁盘空间的分配文件系统结构。

2.4.1.1。根分区

一个根LFS分区(不要混淆 /root目录)10 g是一个很好的办法对于大多数系统。它提供了足够的空间来构建LFS和BLFS大部分,并但足够小,这样能够很容易地建立多个分区的实验。

2.4.1.2。���换分区

大多数发行版自动建立交换分区。一般推荐的交换分区的大小大约是物理RAM的两倍,可是这是不多须要。若是磁盘空间是有限的,是2 g的交换分区和监视磁盘交换的数量。

交换历来都不是好的。一般你能够告诉若是一个系统是由听磁盘交换活动和观察系统反应的命令。交换的第一反应应该是检查等不合理的命令试图编辑一个5 g的文件。若是交换成为一个正常的现象,最好的解决方案是购买更多的RAM为您的系统。

2.4.1.3。Grub Bios分区

若是 引导磁盘已经经过GUID来分区的分区表(GPT),而后一个小,一般1 MB,必须建立分区,若是它不存在。这个分区不格式化,但必须用于GRUB安装期间使用的引导加载程序。该分区将一般被贴上“BIOS引导”若是使用 fdisk或有一个代码 EF02若是使用 gdisk.

请注意

Grub Bios分区必须开车,Bios使用引导系统。这是不必定相同的驱动LFS根分区的位置。系统上的磁盘可能使用不一样的分区表类型。这个分区的要求只取决于类型的引导磁盘的分区表。

2.4.1.4。方便分区

有几个其余分区不是必需的,但应该考虑当设计一个磁盘布局。下面的列表并不全面,可是是做为一个指南。

  • / boot -强烈推荐。使用这个分区存储内核和其余引导信息。最小化潜在的更大的磁盘引导问题,让这个第一个物理分区关于第一个磁盘驱动器。一个分区大小为100 mb至关充足。

  • / home,强烈推荐。分享你的主目录和用户定制或LFS构建跨多个分布。大小一般是至关大的,取决于可用的磁盘空间。

  • / usr -若是使用一个单独的/ usr分区一般是提供一个瘦客户机或服务器无盘工做站。它一般是不须要LFS。5字节的大小将处理大多数安装。

  • / opt BLFS——这个目录是最有用,并安装多个大的包像Gnome或KDE能够安装没有嵌入的文件/ usr的层次结构。若是使用,5到10 g一般是足够的。

  • / tmp -一个单独的/ tmp目录是罕见的,但若是配置一个瘦客户机有用。这个分区,若是使用,一般不须要超过两个字节。

  • /usr/src——这个分区是很是有用的BLFS提供一个位置来存储源文件,并分享他们在LFS构建。它也能够用做BLFS构建包并位置。30 - 50 gb的至关大的分区容许足够的空间。

任何你想要的单独的分区,自动安装在须要指定的引导 /etc/fstab。如何指定分区的详细信息将在讨论8.2节,“建立挂载文件”.

2.5。建立一个文件系统的分区

如今创建了一个空白分区,能够建立文件系统。LFS能够使用任何文件系统认可的Linux内核中,但最多见的类型是ext3和ext4。文件系统的选择能够复杂,取决于文件的特色和分区的大小。例如:

ext2

适用于小的分区/ boot等极少更新。

ext3

是ext2的升级,包括日记帮助恢复分区的状态的状况下关闭不洁净。这是经常使用的做为一个通用文件系统。

ext4

是最新版本的ext文件系统分区类型的家庭。它提供了一些新功能,包括毫微秒时间戳,建立和使用很是大的文件(16 TB),和速度的改进。

其余文件系统,包括FAT32,NTFS,ReiserFS、XFS JFS,是有用的专业用途。能够找到更多的信息关于这些文件系统http://en.wikipedia.org/wiki/Comparison_of_file_systems.

LFS假设根文件系统(/)的类型是ext4。建立一个 ext4LFS分区上的文件系统,运行如下:

mkfs - v - t ext4 /dev/<xxx>

若是您使用的是现有的 swap分区,不须要格式。若是一个新的 swap分区被建立时,它须要用这个命令初始化:

mkswap /dev/<yyy>

取代 <yyy>的名称 swap分区。

2.6。设置$ LFS变量

在本书中,环境变量 LFS将使用几回。您应该确保这个变量老是定义整个LFS构建过程。它应该被设置为目录的名称您将构建LFS系统——咱们将使用 /mnt/lfs做为一个例子,但选择是你的目录。若是您正在构建LFS在一个单独的分区,将该目录分区的挂载点。选择一个目录位置和设置变量使用下面的命令:

出口LFS =/mnt/lfs

在这个变量设置等,命令是有益的 mkdir - v $ LFS /工具能够输入。壳牌将自动替换 “$ LFS”与 “/ mnt / lfs”(或其余变量设置为)处理命令行。

谨慎

不要忘记检查吗 LFS每当你离开和从新设置当前工做环境(如何时作 苏 root或另外一个用户)。检查 LFS变量是设置正确:

echo $LFS

确保输出显示了你的LFS系统的构建之路的位置,这是 /mnt/lfs若是提供的例子是紧随其后。若是输出是不正确的,能够使用前面给出的命令在这个页面设置$LFS到正确的目录名称。

请注意

保证的一种方式 LFS变量老是设置编辑 .bash_profile在你我的的主目录和文件 /root/.bash_profile和输入输出命令。此外,壳中指定 /etc/passwd文件须要的全部用户 LFSbash变量须要确保 /root/.bash_profile文件注册登陆过程的一部分。

2.7。愈来愈多的新分区

如今,建立一个文件系统,分区须要访问。为了作到这一点,须要安装在一个分区挂载点。这本书的目的,假设文件系统安装在指定的目录下 LFS环境变量如前一节所述。

建立挂载点并挂载LFS文件系统经过运行:

mkdir pv $ LFS 山- v - t ext4 /dev/<xxx>$ LFS

取代 <xxx>指定的LFS分区。

若是使用多个分区的LFS(例如,一个用于 /,另外一个用于 /usr),安装使用:

mkdir pv $ LFS 山- v - t ext4 /dev/<xxx>$ LFS mkdir - v $ LFS / usr 山- v - t ext4 /dev/<yyy>$ LFS / usr

取代 <xxx> <yyy>用适当的分区名称。

确保这个新分区是没有安装权限太限制(如 nosuid nodev选项)。运行 山设置命令没有任何参数,看看选项安装LFS的分区。若是 nosuid和/或 nodev设置,分区须要从新安装。

若是您使用的是 swap分区,确保使用启用 swapon命令:

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

取代 <zzz>的名称 swap分区。

如今有一个工做场所,是时候下载包。

第三章。包和补丁

3.1。介绍

本章包含包的列表,须要下载为了构建一个基本的Linux系统。上市版本号对应的软件版本已知的工做,和这本书是根据他们的使用。咱们强烈建议不要使用新版本,由于一个版本的构建命令不得使用新版本。最新的包版本须要变通的可能也有问题。这些变通方案将开发和稳定的开发版本的书。

下载位置可能并不老是容易。若是下载位置改变了这本书出版后,谷歌http://www.google.com/对于大多数包)提供了一个有用的搜索引擎。若是这个搜索是不成功的,试着下载讨论的一个替代手段http://www.linuxfromscratch.org/lfs/packages.html包.

下载包和补丁须要存储的地方方便地得到整个构建。工做目录也是须要解压源和建造它们。 $LFS/sources既能够使用存储包和补丁的地方做为一个工做目录。经过使用这个目录,所需的元素将会位于LFS分区和建筑过程的全部阶段中可用。

建立这个目录,执行如下命令,如用户 root下载会议开始前:

mkdir -v $LFS/sources

使这个目录可写的和粘性。 “黏糊糊的”意味着,即便多个用户在一个目录有写权限,只有一个文件的全部者能够删除的目录中的文件。下面的命令将使编写和粘性的模式:

chmod -v a+wt $LFS/sources

一个简单的方法来下载全部的包和补丁是经过使用wget-list做为一个输入 wget。例如:

wget --input-file=wget-list --continue --directory-prefix=$LFS/sources

此外,从lfs - 7.0开始,有一个单独的文件,md5sum,能够用来验证全部正确的包在继续以前都是可用的。该文件在 $LFS/sources并运行:

pushd $LFS/sources md5sum -c md5sums popd

3.2。全部的包

下载或以其余方式得到如下方案:

Acl(2.2.52) 380 KB:

下载:http://download.savannah.gnu.org/releases/acl/acl-2.2.52.src.tar.gz

MD5总和: a61415312426e9c2212bd7dc7929abda

Attr(2.4.47) 336 KB:

主页:http://savannah.nongnu.org/projects/attr

下载:http://download.savannah.gnu.org/releases/attr/attr-2.4.47.src.tar.gz

MD5总和: 84f58dec00b60f2dc8fd1c9709291cc7

Autoconf(2.69) 1186 KB:

主页:http://www.gnu.org/software/autoconf/

下载:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz

MD5总和: 50f97f4159805e374639a73e2636f22e

Automake(1.15.1) 1475 KB:

主页:http://www.gnu.org/software/automake/

下载:http://ftp.gnu.org/gnu/automake/automake-1.15.1.tar.xz

MD5总和: 24cd3501b6ad8cd4d7e2546f07e8b4d4

Bash(4.4) 9158 KB:

主页:http://www.gnu.org/software/bash/

下载:http://ftp.gnu.org/gnu/bash/bash-4.4.tar.gz

MD5总和: 148888a7c95ac23705559b6f477dfe25

Bc(1.07.1) 411 KB:

主页:http://www.gnu.org/software/bc/

下载:http://ftp.gnu.org/gnu/bc/bc-1.07.1.tar.gz

MD5总和: cda93857418655ea43590736fc3ca9fc

Binutils(2.29) 28392 KB:

主页:http://www.gnu.org/software/binutils/

下载:http://ftp.gnu.org/gnu/binutils/binutils-2.29.tar.bz2

MD5总和: 23733a26c8276edbb1168c9bee60e40e

野牛(3.0.4) 1928 KB:

主页:http://www.gnu.org/software/bison/

下载:http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.xz

MD5总和: c342201de104cc9ce0a21e0ad10d4021

Bzip2(1.0.6) 764 KB:

主页:http://www.bzip.org/

下载:http://www.bzip.org/1.0.6/bzip2-1.0.6.tar.gz

MD5总和: 00b516f4704d4a7cb50a1d97e6e8e15b

检查(0.11.0)它 736 KB:

主页:https://libcheck.github.io/check

下载:https://github.com/libcheck/check/releases/download/0.11.0/check-0.11.0.tar.gz

MD5总和: 9b90522b31f5628c2e0f55dda348e558

Coreutils(8.27) 5162 KB:

主页:http://www.gnu.org/software/coreutils/

下载:http://ftp.gnu.org/gnu/coreutils/coreutils-8.27.tar.xz

MD5总和: 502795792c212932365e077946d353ae

DejaGNU(1.6) 512 KB:

主页:http://www.gnu.org/software/dejagnu/

下载:http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.tar.gz

MD5总和: 1fdc2eb0d592c4f89d82d24dfdf02f0b

你要(3.6) 1366 KB:

主页:http://www.gnu.org/software/diffutils/

下载:http://ftp.gnu.org/gnu/diffutils/diffutils-3.6.tar.xz

MD5总和: 07cf286672ced26fba54cd0313bdc071

Eudev(3.2.2) 1780 KB:

下载:http://dev.gentoo.org/蓝色/ eudev / eudev-3.2.2.tar.gz

MD5总和: 41e19b70462692fefd072a3f38818b6e

E2fsprogs(1.43.5) 7425 KB:

主页:http://e2fsprogs.sourceforge.net/

下载:http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.43.5/e2fsprogs-1.43.5.tar.gz

MD5总和: 40aa1b7d7d6bd9c71db0fbf325a7c199

外籍人士(2.2.3) 426 KB:

主页:http://expat.sourceforge.net/

下载:http://prdownloads.sourceforge.net/expat/expat-2.2.3.tar.bz2

MD5总和: f053af63ef5f39bd9b78d01fbc203334

指望(5.45)- 614 KB:

主页:http://expect.sourceforge.net/

下载:http://prdownloads.sourceforge.net/expect/expect5.45.tar.gz

MD5总和: 44e1a4f4c877e9ddc5a542dfa7ecc92b

文件(5.31) 774 KB:

主页:http://www.darwinsys.com/file/

下载:ftp://ftp.astron.com/pub/file/file-5.31.tar.gz

MD5总和: 319627d20c9658eae85b056115b8c90a

请注意

文件(5.31)可能再也不可用在上市地点。偶尔主下载位置的网站管理员删除旧版本发布新版本时。另外一个下载位置可能正确的版本也能够发现:http://www.linuxfromscratch.org/lfs/download.html ftp.

Findutils(4.6.0) 3692 KB:

主页:http://www.gnu.org/software/findutils/

下载:http://ftp.gnu.org/gnu/findutils/findutils-4.6.0.tar.gz

MD5总和: 9936aa8009438ce185bea2694a997fc1

Flex(2.6.4) 1386 KB:

主页:http://flex.sourceforge.net

下载:https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz

MD5总和: 2882e3179748cc9f9c23ec593d6adc8d

呆呆(4.1.4) 2313 KB:

主页:http://www.gnu.org/software/gawk/

下载:http://ftp.gnu.org/gnu/gawk/gawk-4.1.4.tar.xz

MD5总和: 4e7dbc81163e60fd4f0b52496e7542c9

GCC(7.2.0) 60853 KB:

主页:http://gcc.gnu.org/

下载:http://ftp.gnu.org/gnu/gcc/gcc-7.2.0/gcc-7.2.0.tar.xz

MD5总和: ff370482573133a7fcdd96cd2f552292

同时(1.13) 872 KB:

主页:http://www.gnu.org/software/gdbm/

下载:http://ftp.gnu.org/gnu/gdbm/gdbm-1.13.tar.gz

MD5总和: 8929dcda2a8de3fd2367bdbf66769376

Gettext(0.19.8.1) 7041 KB:

主页:http://www.gnu.org/software/gettext/

下载:http://ftp.gnu.org/gnu/gettext/gettext-0.19.8.1.tar.xz

MD5总和: df3f5690eaa30fd228537b00cb7b7590

Glibc(2.26) 14339 KB:

主页:http://www.gnu.org/software/libc/

下载:http://ftp.gnu.org/gnu/glibc/glibc-2.26.tar.xz

MD5总和: 102f637c3812f81111f48f2427611be1

请注意

这个版本的glibc地址的安全问题尚未最新的稳定版本。

6.1.2 GMP(中) 1901 KB:

主页:http://www.gnu.org/software/gmp/

下载:http://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.xz

MD5总和: f58fa8001d60c4c77595fbbb62b63c1d

Gperf(3.1) 1188 KB:

主页:http://www.gnu.org/software/gperf/

下载:http://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz

MD5总和: 9e251c0a618ad0824b51117d5d9db87e

Grep(3.1) 1339 KB:

主页:http://www.gnu.org/software/grep/

下载:http://ftp.gnu.org/gnu/grep/grep-3.1.tar.xz

MD5总和: feca7b3e7c7f4aab2b42ecbfc513b070

Groff(1.22.3) 4091 KB:

主页:http://www.gnu.org/software/groff/

下载:http://ftp.gnu.org/gnu/groff/groff-1.22.3.tar.gz

MD5总和: cc825fa64bc7306a885f2fb2268d3ec5

GRUB(2.02) 5970 KB:

主页:http://www.gnu.org/software/grub/

下载:http://ftp.gnu.org/gnu/grub/grub-2.02.tar.xz

MD5总和: 8a4a2a95aac551fb0fba860ceabfa1d3

Gzip(1.8) 712 KB:

主页:http://www.gnu.org/software/gzip/

下载:http://ftp.gnu.org/gnu/gzip/gzip-1.8.tar.xz

MD5总和: f7caabb65cddc1a4165b398009bd05b9

Iana-Etc(2.30) 201 KB:

主页:http://freecode.com/projects/iana-etc

下载:http://anduin.linuxfromscratch.org/LFS/iana-etc-2.30.tar.bz2

MD5总和: 3ba3afb1d1b261383d247f46cb135ee8

Inetutils(1.9.4) 1333 KB:

主页:http://www.gnu.org/software/inetutils/

下载:http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.4.tar.xz

MD5总和: 87fef1fa3f603aef11c41dcc097af75e

Intltool(0.51.0) 159 KB:

主页:http://freedesktop.org/wiki/Software/intltool

下载:http://launchpad.net/intltool/trunk/0.51.0/ +下载/ intltool-0.51.0.tar.gz

MD5总和: 12e517cac2b57a0121cda351570f1e63

IPRoute2(4.12.0) 647 KB:

主页:https://www.kernel.org/pub/linux/utils/net/iproute2/

下载:https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-4.12.0.tar.xz

MD5总和: e6fecdf46a1542a26044e756fbbabe3b

Kbd(2.0.4) 1008 KB:

主页:http://ftp.altlinux.org/pub/people/legion/kbd

下载:https://www.kernel.org/pub/linux/utils/kbd/kbd-2.0.4.tar.xz

MD5总和: c1635a5a83b63aca7f97a3eab39ebaa6

Kmod(24) 525 KB:

下载:https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod - 24. tar.xz

MD5总和: 08297dfb6f2b3f625f928ca3278528af

(487)——更少 312 KB:

主页:http://www.greenwoodsoftware.com/less/

下载:http://www.greenwoodsoftware.com/less/less - 487. tar.gz

MD5总和: dcc8bf183a83b362d37fe9ef8df1fb60

LFS-Bootscripts(20170626)- 32 KB:

下载:http://www.linuxfromscratch.org/lfs/downloads/8.1/lfs bootscripts tar.bz2——20170626.

MD5总和: d4992527d67f28e2d0c12e3495422eab

Libcap(2.25) 64 KB:

主页:https://sites.google.com/site/fullycapable/

下载:https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.25.tar.xz

MD5总和: 6666b839e5d46c2ad33fc8aa2ceb5f77

Libpipeline(1.4.2) 808 KB:

主页:http://libpipeline.nongnu.org/

下载:http://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.4.2.tar.gz

MD5总和: d5c80387eb9c9e5d089da2a06e8a6b12

Libtool(2.4.6) 951 KB:

主页:http://www.gnu.org/software/libtool/

下载:http://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.xz

MD5总和: 1bfb9b923f2c1339b4d2ce1807064aa5

Linux(4.12.7) 96865 KB:

主页:http://www.kernel.org/

下载:https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.12.7.tar.xz

MD5总和: 245d1b4dc6e82669aac2c9e6a2dd82fe

请注意

Linux内核更新比较频繁,不少时候因为发现的安全漏洞。最新4.12。应该使用x内核版本,除非勘误表页面说。

速度或昂贵的带宽有限的用户谁但愿更新Linux内核中,基线版本的包和补丁能够单独下载。这可能节省一些时间或成本后续补丁级别升级在一个小版本。

M4(1.4.18) 1180 KB:

主页:http://www.gnu.org/software/m4/

下载:http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.xz

MD5总和: 730bb15d96fffe47e148d1e09235af82

使(4.2.1)准备 1375 KB:

主页:http://www.gnu.org/software/make/

下载:http://ftp.gnu.org/gnu/make/make-4.2.1.tar.bz2

MD5总和: 15b012617e7c44c0ed482721629577ac

Man-DB(2.7.6.1) 1506 KB:

主页:http://www.nongnu.org/man-db/

下载:http://download.savannah.gnu.org/releases/man-db/man-db-2.7.6.1.tar.xz

MD5总和: 2948d49d0ed7265f60f83aa4a9ac9268

手册页(4.12) 1552 KB:

主页:http://www.kernel.org/doc/man-pages/

下载:https://www.kernel.org/pub/linux/docs/man-pages/man-pages-4.12.tar.xz

MD5总和: a87cdf43ddc1844e7edc8950a28a51f0

MPC(1.0.3) 655 KB:

主页:http://www.multiprecision.org/

下载:http://www.multiprecision.org/mpc/download/mpc-1.0.3.tar.gz

MD5总和: d6a1d5f8ddea3abd2cc3e98f58352d26

MPFR(3.1.5) 1101 KB:

主页:http://www.mpfr.org/

下载:http://www.mpfr.org/mpfr-3.1.5/mpfr-3.1.5.tar.xz

MD5总和: c4ac246cf9795a4491e7766002cd528f

Ncurses(6.0) 3059 KB:

主页:http://www.gnu.org/software/ncurses/

下载:http://ftp.gnu.org/gnu//ncurses/ncurses-6.0.tar.gz

MD5总和: ee13d052e1ead260d7c28071f46eefb1

补丁(2.7.5) 711 KB:

主页:http://savannah.gnu.org/projects/patch/

下载:http://ftp.gnu.org/gnu/patch/patch-2.7.5.tar.xz

MD5总和: e3da7940431633fb65a01b91d3b7a27a

Perl(5.26.0) 11682 KB:

主页:http://www.perl.org/

下载:http://www.cpan.org/src/5.0/perl-5.26.0.tar.xz

MD5总和: 8c6995718e4cb62188f0d5e3488cd91f

Pkg-config(0.29.2) 1970 KB:

主页:http://www.freedesktop.org/wiki/Software/pkg-config

下载:https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz

MD5总和: f6e931e319531b736fadc017f470e68a

Procps(3.3.12) 826 KB:

主页:http://sourceforge.net/projects/procps-ng

下载:http://sourceforge.net/projects/procps-ng/files/Production/procps-ng-3.3.12.tar.xz

MD5总和: 957e42e8b193490b2111252e4a2b443c

Psmisc(23.1) 290 KB:

主页:http://psmisc.sourceforge.net/

下载:https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.1.tar.xz

MD5总和: bbba1f701c02fb50d59540d1ff90d8d1

Readline(7.0) 2842 KB:

主页:http://cnswww.cns.cwru.edu/php/chet/readline/rltop.html

下载:http://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz

MD5总和: 205b03a87fc83dab653b628c59b9fc91

Sed(4.4) 1154 KB:

主页:http://www.gnu.org/software/sed/

下载:http://ftp.gnu.org/gnu/sed/sed-4.4.tar.xz

MD5总和: e0c583d4c380059abd818cd540fe6938

(4.5)的影子 1589 KB:

下载:https://github.com/shadow-maint/shadow/releases/download/4.5/shadow-4.5.tar.xz

MD5总和: c350da50c2120de6bb29177699d89fe3

Sysklogd(1.5.1) 88 KB:

主页:http://www.infodrom.org/projects/sysklogd/

下载:http://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz

MD5总和: c70599ab0d037fde724f7210c2c8d7f8

Sysvinit(2.88 dsf)- 108 KB:

主页:http://savannah.nongnu.org/projects/sysvinit

下载:http://download.savannah.gnu.org/releases/sysvinit/sysvinit - 2.88 dsf.tar.bz2

MD5总和: 6eda8a97b86e0a6f59dabbf25202aa6f

焦油(1.29) 1950 KB:

主页:http://www.gnu.org/software/tar/

下载:http://ftp.gnu.org/gnu/tar/tar-1.29.tar.xz

MD5总和: a1802fec550baaeecff6c381629653ef

Tcl(8.6.7) 5738 KB:

主页:http://tcl.sourceforge.net/

下载:http://sourceforge.net/projects/tcl/files/Tcl/8.6.7/tcl-core8.6.7-src.tar.gz

MD5总和: 3f723d62c2e074bdbb2ddf330b5a71e1

Texinfo(6.4) 4393 KB:

主页:http://www.gnu.org/software/texinfo/

下载:http://ftp.gnu.org/gnu/texinfo/texinfo-6.4.tar.xz

MD5总和: 2a676c8339efe6ddea0f1cb52e626d15

时区数据(2017 b) 317 KB:

主页:http://www.iana.org/time-zones

下载:http://www.iana.org/time-zones/repository/releases/tzdata2017b.tar.gz

MD5总和: 50dc0dc50c68644c1f70804f2e7a1625

Udev-lfs Tarball(udev lfs - 20140408) 11 KB:

下载:http://anduin.linuxfromscratch.org/lfs/udev tar.bz2——lfs - 20140408.

MD5总和: c2d6b127f89261513b23b6d458484099

Util-linux(2.30.1) 4360 KB:

主页:http://freecode.com/projects/util-linux

下载:https://www.kernel.org/pub/linux/utils/util-linux/v2.30/util-linux-2.30.1.tar.xz

MD5总和: 5e5ec141e775efe36f640e62f3f8cd0d

Vim(8.0.586) 10613 KB:

主页:http://www.vim.org

下载:ftp://ftp.vim.org/pub/vim/unix/vim-8.0.586.tar.bz2

MD5总和: b35e794140c196ff59b492b56c1e73db

XML::解析器(2.44) 232 KB:

主页:https://github.com/chorny/XML-Parser

下载:http://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.44.tar.gz

MD5总和: af4813fe3952362451201ced6fbce379

Xz跑龙套(5.2.3) 1009 KB:

主页:http://tukaani.org/xz

下载:http://tukaani.org/xz/xz-5.2.3.tar.xz

MD5总和: 60fb79cab777e3f71ca43d298adacbd5

Zlib(1.2.11) 457 KB:

主页:http://www.zlib.net/

下载:http://zlib.net/zlib-1.2.11.tar.xz

MD5总和: 85adef240c5f370b308da8c938951a68

这些包的总大小:大约324 MB

3.3。须要的补丁

除了包,也须要几个补丁。这些补丁纠正任何错误的包应该固定的维护者。补丁也作一些小的修改,让包装更容易处理。如下补丁须要构建一个LFS系统:

Bash上游修复补丁 17个KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/bash - 4.4 - upstream_fixes 1.补丁

MD5总和: e3d5bf23a4e5628680893d46e6ff286e

Bzip2文件补丁, 1.6 KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/bzip2 - 1.0.6 install_docs - 1.补丁

MD5总和: 6a5ac7e89b791aae556de0f745916f7f

Coreutils国际化修复补丁 168 KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/coreutils - 8.27 i18n - 8.27补丁

MD5总和: a9404fb575dfd5514f3c8f4120f9ca7d

Glibc FHS补丁, 2.8 KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/glibc - 2.26 - fhs - 2.26补丁

MD5总和: 9a5997c3452909b1769918c759eff8a2

Kbd退格/删除修复补丁 12 KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/kbd - 2.0.4退格- 1.补丁

MD5总和: f75cca16a38da6caa7d52151f7136895

Sysvinit合并补丁, 3.9 KB:

下载:http://www.linuxfromscratch.org/patches/lfs/8.1/sysvinit - 2.88 - dsf -巩固- 1.补丁

MD5总和: 0b7b5ea568a878fdcc4057b2bf36e5cb

这些补丁的总大小:205.3 KB

除了上述须要的补丁,存在许多可选的LFS社区建立的补丁。这些可选补丁解决小问题或使功能在默认状况下不启用。随意浏览数据库位于补丁http://www.linuxfromscratch.org/patches/downloads/并得到任何额外的补丁,以知足系统的须要。

第四章。最后的准备

4.1。介绍

在这一章,咱们将执行一些额外的任务准备建设临时系统。咱们将建立一个目录 $LFS临时的安装工具,添加非特权用户,以减小风险,并为用户建立一个适当的构建环境。咱们还将解释的单位时间咱们用来衡量LFS包须要多长时间,或 “在布”,并给出一些信息包测试套件。

4.2。建立目录$ LFS /工具

全部程序编译第五章将安装在 $LFS/tools让他们独立于程序编译第六章。这里是临时工具和编译的程序不会是最后的LFS系统的一部分。经过这些项目在一个单独的目录中,他们很容易被丢弃后使用。这也能够防止这些程序结束主机生产目录(简单的事故第五章).

建立所需的目录运行如下 root:

mkdir -v $LFS/tools

下一步是建立一个 /tools符号连接在主机系统。这将指向LFS分区上建立的目录。运行这个命令 root:

ln -sv $LFS/tools /

请注意

上面的命令是正确的。的 ln命令有几个语法变化,因此必定要检查 信息coreutils ln ln(1)报告以前你可能认为是一个错误。

建立的符号连接使工具链编译,以便它老是指 /tools,这意味着编译器、汇编和连接器将在第五章(当咱们仍使用一些工具从主机)和将来(当咱们 “也能够”LFS分区)。

4.3。添加LFS用户

当登陆用户 root,犯了一个错误会损坏或破坏系统。所以,咱们建议以非特权用户的身份构建包在本章。你能够使用本身的用户名,可是,让它更容易创建一个清洁的工做环境,建立一个新的用户 lfs做为一个新组(也叫 lfs),用户在安装过程当中使用这个。做为 root发出如下命令来添加新用户:

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

命令行选项的含义:

-s /bin/bash

这使得 bash用户的默认shell lfs.

-g lfs

这个选项添加用户 lfs lfs.

-m

这将建立一个主目录 lfs.

-k /dev/null

这个参数能够防止可能的复制文件从一个骨架目录(默认 /etc/skel)经过改变输入位置特殊零装置。

lfs

这是实际的名称建立的组和用户。

登陆, lfs(相对于切换到用户 lfs当登陆 root,不须要 lfs用户密码),给予 lfs密码:

passwd lfs

格兰特 lfs彻底访问 $LFS/tools经过使 lfs目录的全部者:

chown -v lfs $LFS/tools

若是建立一个单独的工做目录做为建议,给用户 lfs这个目录的全部权:

chown -v lfs $LFS/sources

接下来,登陆用户 lfs。这能够经过一个虚拟控制台,经过显示管理器,或者替代用户命令以下:

su - lfs

的 “-”指示 苏开始登陆shell,而不是non-login壳。之间的区别这两种壳能够在细节中找到 bash(1) 信息bash.

4.4。设置环境

创建一个良好的工做环境,建立两个新的启动文件 bash壳。当登陆用户 lfs发出如下命令来建立一个新的 .bash_profile:

cat > ~/.bash_profile << "EOF" exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash EOF

当登陆用户 lfs一般,最初的外壳 登陆壳牌的读取 /etc/profile的主机(可能包含一些设置和环境变量) .bash_profile。的 exec env -我…/ bin / bash命令的 .bash_profile文件取代了彻底空的壳与一个新的运行环境,除了 HOME, TERM, PS1变量。这将确保不会没必要要的和潜在危险环境变量从主机系统泄漏到构建环境。这里使用的技术实现的目标确保一个清洁的环境。

外壳是一个新实例 non-login壳,不读了 /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

 组+ h命令关闭 bash哈希函数。哈希——一般是一个有用的特性bash使用一个哈希表来记住可执行文件的完整路径,避免搜索 PATH一次又一次地去寻找相同的可执行文件。然而,就应该使用新工具安装。经过关掉哈希函数,shell将老是搜索 PATH当一个程序运行。所以,壳牌将发现新编译的工具 $LFS/tools可就不记得以前版本的同一程序在不一样的位置。

设置用户文件建立掩模(umask)到022年确保新建立的文件和目录由主人只可写的,可是任何人均可读和可执行的(假设所使用的默认模式 open(2)系统调用,新文件将最终许可模式644和目录模式755)。

 LFS变量应该设置为所选的挂载点。

 LC_ALL变量控制某些项目的本地化,使他们的信息按照指定国家的惯例。设置 LC_ALL来 “POSIX”或 “C”(这两个是等价的)确保一切都如预期的那样在chroot环境中工做。

 LFS_TGT变量设置一个非默认,但兼容的机器描述使用在构建交叉编译器和连接器,当交叉编译临时工具链。中包含更多的信息5.2节,“工具链技术笔记”.

经过将 /tools/bin以前的标准 PATH安装在,全部的项目第五章��壳后当即拿起他们的安装。结合关掉哈希,这限制了风险,旧程序时从主机使用相同的程序可在第五章环境。

最后,对建筑环境的充分准备临时工具、对象来源的用户配置文件:

source ~/.bash_profile

4.5。对全局的

不少人想知道事先大约须要多长时间来编译和安装每一个包。由于Linux从头能够创建在许多不一样的系统,提供准确的时间估计是不可能的。最大的包(Glibc)须要大约20分钟最快的系统,可是在慢系统最多可能须要三天!而不是提供实际的时候,将使用标准建设单位(单位)测量。

全局的测量工做以下。第一个包从本书Binutils被编译第五章。的时间来编译这个包将被称为标准的建设单位或业务单位。全部其余的编译时间将表示相对于这一次。

例如,考虑一个包的编译时间是4.5单位。这意味着,若是一个系统花了10分钟Binutils编译和安装第一个经过,它将 约45分钟来构建这个示例包中。幸运的是,大多数为Binutils构建时间短于一个。

通常来讲,单位并不彻底准确,由于他们依赖于许多因素,包括主机系统版本的GCC。他们是这里提供给估计多长时间可能须要安装一个包,但这些数字能够随多达数十分钟在某些状况下。

请注意

对于许多现代系统与多个处理器(或核)的编译时间计划能够减小执行“平行”设置一个环境变量或者告诉 使计划有多少处理器可用。例如,一个Core2Duo能够支持两个同时发生的过程:

export MAKEFLAGS='-j 2'

或者只是建筑:

make -j2

使用多个处理器时,书中的单位单位会有所不一样甚至比他们一般所作的那样。在某些状况下,让一步就会失败。分析构建过程的输出也将更加困难,由于不一样的过程线���叉。若是你遇到一个问题,构建步骤,回复到一个处理器构建正确分析错误消息。

4.6。关于测试套件

大多数软件包提供一个测试套件。运行测试套件的一个新建的包是一个好主意,由于它能够提供一个 “完整性检查”代表一切正确编译。一般一套测试套件,通过检查证实了包功能开发人员的目的。然而,它并不保证免费包是彻底错误的。

一些测试套件是比别人更重要。例如,测试套件的核心工具链packages-GCC Binutils,Glibc-are相当重要的因为其核心做用在正常运转的系统。GCC和Glibc的测试套件能够须要很长时间才能完成,特别是在较慢的硬件,但强烈推荐。

请注意

经验代表,几乎没有能获得运行测试套件第五章。不能逃避的事实,主机系统老是施加一些影响测试这一章���内容,经常致使莫名其妙的失败。由于内置的工具第五章是暂时的,最终丢弃,咱们不推荐运行测试套件第五章对普通读者。的指令运行这些测试套件提供了测试人员和开发人员的好处,但他们是彻底可选的。

一个常见的问题与运行测试套件Binutils和GCC的伪终端(企业)。这能够致使大量的测试失败。这可能有几个缘由,但最可能的缘由是,主机系统没有的 devpts文件系统的正确设置。在更详细地讨论这个问题http://www.linuxfromscratch.org/lfs/faq.html no-ptys.

有时包测试套件会失败,但开发人员都知道的缘由,认为非关键。查阅日志位于http://www.linuxfromscratch.org/lfs/build-logs/8.1/来验证是否预计这些失败。本网站全部测试在本书中是有效的。

第五章。构建一个临时系统

5.1。介绍

这一章展现了如何创建一个最小的Linux系统。这个系统将包含足够的工具开始构建最终的LFS系统第六章容许的工做环境和更多的用户方便比最低的环境。

有两个步骤构建这个最小的系统。第一步是构建一个新的host-independent工具链(编译器、汇编器、链接器、图书馆和一些有用的实用程序)。第二步使用这个工具链构建其余必不可少的工具。

文件编译在本章将被安装 $LFS/tools目录来让他们分开的文件安装在下一章和主机生产目录。自包编译下面是暂时的,咱们不但愿他们污染即将LFS系统。

5.2。工具链技术注释

本节解释背后的一些原理和技术细节的总体构建方法。它不是必须当即明白这一节中的内容。大部分这些信息后将会更清晰的执行实际的构建。这部分能够称为过程当中在任什么时候间。

的���体目标第五章是产生一个临时区域包含一套好的工具,能够独立于主机系统。经过使用 chroot,剩下的章节中的命令将包含在这种环境下,保证一个干净、无端障目标LFS系统的构建。构建过程被设计为新读者和最小化风险提供最有教育价值在同一时间。

请注意

在继续以前,请注意工做平台的名称,一般称为目标三联体。一个简单的方法来肯定目标三联体是运行的名称 config.guess脚本附带的源代码不少包。解压Binutils来源和运行脚本: ./config.guess并注意输出。例如,对于一个32位的英特尔处理器的输出 i686-pc-linux-gnu。在64位系统上 x86_64-pc-linux-gnu.

也意识到平台的动态连接器的名称,一般被称为动态加载程序(不与标准连接器混淆 ldBinutils的一部分)。Glibc提供的动态连接器查找并加载一个程序所需的共享库,准备程序运行,而后运行它。动态连接器的名称为一个32位的机器将英特尔 ld-linux.so.2 (ld-linux-x86-64.so.264位系统)。也是肯定动态连接器的名称是检查一个随机二进制从主机系统经过运行: readelf -l <name of binary> | grep interpreter并注意输出。覆盖全部平台在权威的参考 shlib-versions文件在Glibc源代码树的根。

一些关键技术点的第五章构建方法:

  • 略调整工做平台的名称,经过改变“供应商”字段三联体的目标 LFS_TGT变量,确保第一个构建Binutils和GCC产生交叉耦合和交叉编译器兼容。而不是产生二进制文件架构,交叉耦合和交叉编译器将生成二进制文件与当前硬件兼容。

  • 临时库是交叉编译。因为其性质交叉编译器不能依赖任何东西,从它的主机系统,该方法消除了潜在的污染减小目标系统的头文件或库的机会从主机被归入新工具。交叉编译的可能性还容许构建32位和64位库在64位硬件能力。

  • 当心操纵源告诉编译器GCC的目标将使用动态连接器。

Binutils首先由于安装 配置运行GCC和Glibc汇编和连接器上执行各类功能测试,以肯定哪些软件功能启用或禁用。这是更重要的比人们第一次意识到的。错误配置GCC或Glibc会致使巧妙地破碎的工具链,这些破损的影响可能不会出现,直到接近尾声的构建整个分布。一个测试套件失败一般会强调这个错误以前太多执行额外的工做。

Binutils安装它的汇编和连接器在两个位置, /tools/bin /tools/$LFS_TGT/bin。在一个地方的工具很难与其余有关。连接器的一个重要方面是它的图书馆搜索顺序。能够得到详细的信息 ld经过它 --verbose国旗。例如,一个 ld --verbose | grep SEARCH将说明当前搜索路径及其顺序。它显示了哪些文件是联系在一块儿的 ld编译一个虚拟程序和传递 --verbose切换到连接器。例如, gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded将显示全部的文件在链接成功打开。

下一个包安装GCC。一个例子能够看到在其运行的 配置是:

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的配置脚本不会搜索目录的路径找到工具来使用。然而,在实际的操做 海湾合做委员会自己,不必定是使用相同的搜索路径。找出哪些标准连接器 海湾合做委员会将使用,运行: gcc -print-prog-name=ld.

能够得到详细的信息 海湾合做委员会经过它 -v命令行选项,编译一个虚拟的程序。例如, gcc -v dummy.c将显示详细信息预处理、编译和组装阶段,包括 海湾合做委员会包括搜索路径和他们的订单。

下安装消毒Linux API头。这些容许标准C库(Glibc)与Linux内核提供的功能。

下一个安装包是Glibc。最重要的考虑建筑Glibc编译器,二进制工具和内核头文件。编译器一般不是问题由于Glibc老是使用编译器有关 --host参数传递给它的配置脚本;例如,在咱们的案例中,编译器将 i686-lfs-linux-gnu-gcc。二进制工具和内核头文件能够是一个更复杂。所以,没有风险和使用可用的配置开关执行正确的选择。运行后 配置,检查的内容config.make文件 glibc-build目录的全部重要的细节。注意使用 CC="i686-lfs-gnu-gcc"控制使用二进制工具的使用 -nostdinc -isystem国旗来控制编译器的包括搜索路径。这些项目突出Glibc包装的一个重要方面是很是自给自足的建设机械和通常不依赖于工具链的缺省值。

Binutils第二步期间,咱们可以利用的 --with-lib-path配置开关控制 ld库搜索路径。

第二步的GCC,其来源也须要修改告诉GCC使用新的动态连接器。不这么作将致使GCC项目自己拥有的名称从主机系统的动态连接器 /lib目录嵌入到他们,这将击败的目标远离主机。从这一点开始,核心工具链是独立和自主。的其他部分第五章包全部构建新Glibc /tools.

在进入chroot环境第六章第一个主要包安装Glibc,因为其自给自足天然上面提到的。一旦这是安装到Glibc /usr,咱们将执行一个快速转换工具链的缺省值,而后进行构建目标LFS系统的其他部分。

5.3。通常编译指令

在构建包有几个假设在产品说明:

  • 几个包在编译以前修补,但只有当补丁须要规避的问题。一片一般是须要在这个和下一章,但有时只在一个或另外一个。所以,不要担忧若是指令下载补丁彷佛失踪。警告信息 抵消 模糊应用补丁时也会遇到。不要担忧这些警告,随着补丁还成功应用。

  • 大多数软件包编译期间,将会有一些警告,经过在屏幕上滚动。这些都是正常的,能够安全地忽略。这些警告他们appear-warnings弃用,但不是无效,使用C或c++语法。C标准常常变化,一些包仍然使用旧的标准。这不是一个问题,可是提示警告。

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

    echo $LFS

    确保输出显示��LFS的路径分区的挂载点,这是 /mnt/lfs,使用咱们的例子。

  • 最后两个重要项目必须强调:

    重要的

    构建指令假设主机系统需求,包括符号连接,设置正确:

    • bash在使用shell。

    • 上海是一个符号连接呢 bash.

    • /usr/bin/awk是一个符号连接呢 腼腆的人.

    • /usr/bin/yacc是一个符号连接呢 野牛或一个小脚本执行野牛。

    重要的

    强调构建过程:

    1. 把全部的资源可访问的目录和补丁chroot环境等 /mnt/lfs/sources/。作 不把资料放在 /mnt/lfs/tools/.

    2. 改变源目录。

    3. 为每个包:

      1. 使用 焦油程序,提取方案。在第五章,确保你是 lfs用户提取方案。

      2. 改变包提取时建立的目录。

      3. 按照这本书的指导来构建包。

      4. 改变回源目录。

      5. 删除提取的源目录除非另有指示。

5.4。binutils - 2.29 - 1

Binutils包包含一个连接,一个汇编程序,和其余工具来处理对象文件。

近似创建时间: 1单位
所需的磁盘空间: 547 MB

5.4.1以前。安装交叉Binutils

请注意

回去重读笔记在前一节中。理解标记为重要的笔记将节省你不少问题。

Binutils是第一个包很重要由于Glibc和GCC编译执行各类测试可用的连接器和汇编程序,以肯定哪些让本身的特性。

Binutils文档建议建筑Binutils专用的构建目录:

mkdir -v build cd       build

请注意

为了其他的书中列出的单位值的任何使用,测量的时间建造这个包的配置,包括第一次安装。为实现这一目标,包装的命令 时间命令以下: time { ./configure ... && ... && make install; }.

请注意

所需的近似创建业务单位价值和磁盘空间在第5章不包括测试套件的数据。

如今准备Binutils编译:

../configure --prefix=/tools            \              --with-sysroot=$LFS        \              --with-lib-path=/tools/lib \              --target=$LFS_TGT          \              --disable-nls              \              --disable-werror

配置选项的含义:

--prefix=/tools

这告诉配置脚本安装Binutils项目作准备 /tools目录中。

--with-sysroot=$LFS

对于交叉编译,这告诉构建系统在$ LFS寻找目标系统所需的库。

--with-lib-path=/tools/lib

这指定库路径连接器应该配置为使用。

--target=$LFS_TGT

由于机器的描述 LFS_TGT变量比返回的值略有不一样 config.guess脚本,这个开关会告诉的 配置脚本调整Binutil构建系统的交联剂。

--disable-nls

这个禁用国际化i18n是暂时不须要工具。

--disable-werror

这能够防止构建阻止事件有警告主人的编译器。

继续编译包:

make

如今编译完成。一般咱们将运行测试套件,但在这个早期阶段测试套件框架(Tcl、指望和DejaGNU)尚未到位。此时运行测试的好处是最小自项目从这个第一遍很快就会被那些从第二所取代。

若是在x86_64的基础上,建立一个符号连接,确保工具链的完整性:

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

安装包:

make install

这个包位于的细节部分6.16.2,“Binutils内容。”

最后一次更新在

5.5。GCC-7.2.0 -经过1

GCC包包含GNU编译器集合,包括C和c++编译器。

近似创建时间: 8.9业务单位
所需的磁盘空间: 2.2 GB

5.5.1。安装交叉GCC

GCC如今须要GMP,MPFR和MPC包。做为这些包可能不包括在您的主机分配,他们将用GCC。每一个包解压缩到GCC源目录和命名的目录的GCC构建过程将自动使用:

请注意

本章有频繁的误解。程序是同样的其余如前所述章(包构建指令)。首先从源目录中提取gcc tarball,而后改变目录建立。只有这样,你应该继续下面的说明。

tar -xf ../mpfr-3.1.5.tar.xz mv -v mpfr-3.1.5 mpfr tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp tar -xf ../mpc-1.0.3.tar.gz mv -v mpc-1.0.3 mpc

下面的命令将会改变GCC的默认的位置动态连接器使用一个安装在 /tools。它也消除了 /usr/include从GCC的包括搜索路径。问题:

for file in gcc/config/{linux,i386/linux{,64}}.h do   cp -uv $file{,.orig}   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \       -e 's@/usr@/tools@g' $file.orig > $file   echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file   touch $file.orig done

上面彷佛难以理解,让咱们将其分解。首先,咱们复制文件 gcc/config/linux.h, gcc/config/i386/linux.h, gcc/config/i368/linux64.h。一个文件的名称相同但添加后缀的 “.orig”。而后第一个sed表现突出 “/工具”每个的实例 “/lib/ld”, “/ lib64 / ld”或 “/ lib32 / ld”,而第二个取代硬编码的实例 “/ usr”。接下来,咱们添加定义语句改变默认startfile前缀的文件。注意,拖着 “/”在 “/工具/ lib /”是必需的。最后,咱们使用 触摸更新复制的文件的时间戳。当结合使用 cp - u,这样能够防止意外更改原始文件的命令是无心中运行两次。

最后,x86_64主机上,设置默认为64位库目录名称 “自由”:

case $(uname -m) in   x86_64)     sed -e '/m64=/s/lib64/lib/' \         -i.orig gcc/config/i386/t-linux64  ;; esac

GCC文档建议构建GCC在一个专用的构建目录:

mkdir -v build cd       build

准备GCC编译:

../configure                                       \     --target=$LFS_TGT                              \     --prefix=/tools                                \     --with-glibc-version=2.11                      \     --with-sysroot=$LFS                            \     --with-newlib                                  \     --without-headers                              \     --with-local-prefix=/tools                     \     --with-native-system-header-dir=/tools/include \     --disable-nls                                  \     --disable-shared                               \     --disable-multilib                             \     --disable-decimal-float                        \     --disable-threads                              \     --disable-libatomic                            \     --disable-libgomp                              \     --disable-libmpx                               \     --disable-libquadmath                          \     --disable-libssp                               \     --disable-libvtv                               \     --disable-libstdcxx                            \     --enable-languages=c,c++

配置选项的含义:

--with-newlib

由于C库尚未可用的工做,这能够确保构建libgcc时inhibit_libc常数定义。这能够防止任何代码的编译,须要libc的支持。

--without-headers

当建立一个完整的编译器GCC要求标准头与目标系统兼容。对咱们来讲这些头不会须要。这个开关能够防止GCC寻找他们。

--with-local-prefix=/tools

当地的前缀是系统中的位置,GCC将本地搜索包含文件安装。默认值是 /usr/local。设置这个 /tools有助于保持主机的位置 /usr/local这个GCC的搜索路径。

--with-native-system-header-dir=/tools/include

默认状况下GCC搜索 /usr/include系统头文件。会同sysroot开关,这一般会翻译 $LFS/usr/include。不过头,将安装将在接下来的两个部分 $LFS/tools/include。这个开关确保gcc会找到正确。在第二个经过的GCC,一样的开关将确保没有头从主机系统。

--disable-shared

这个开关迫使GCC内部静态库连接。这样作是为了不可能的主机系统的问题。

--disable-decimal-float, --disable-threads, --disable-libatomic, --disable-libgomp, --disable-libmpx, --disable-libquadmath, --disable-libssp, --disable-libvtv, --disable-libstdcxx

这些开关禁用支持十进制浮点扩展、线程、libatomic,libgomp,libmpx,libquadmath,libssp,libvtv,c++标准库。这些功能将没法编译构建交叉编译器时,不交叉编译临时libc的任务所必需的。

--disable-multilib

x86_64,LFS还不支持multilib配置。这个开关是x86无害。

--enable-languages=c,c++

这个选项能够确保只有C和c++编译器。这些是惟一的语言如今须要的。

GCC编译经过运行:

make

如今编译完成。在这一点上,测试套件一般会跑,可是,正如前面提到过的,测试套件框架尚未到位。此时运行测试的好处是最小自项目从这个第一遍很快就会被取代。

安装包:

make install

这个包位于的细节部分6.20.2,GCC的内容。”

最后一次更新在

5.6。Linux-4.12.7 API头

Linux内核API头(linux-4.12.7.tar.xz)公开的API使用Glibc。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 861 MB

5.6.1。安装Linux API的头

Linux内核须要公开的应用程序编程接口(API)系统的C库(LFS Glibc)使用。这样作是经过消毒各类C头文件的Linux内核源代码tarball。

确保没有过时文件嵌入到包:

make mrproper

如今从源中提取用户可见的内核头文件。他们被放置在一个中间本地目录复制到所需的位置,由于提取过程在目标目录中删除任何现有的文件。

make INSTALL_HDR_PATH=dest headers_install cp -rv dest/include/* /tools/include

最后一次更新在

5.7。glibc - 2.26

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

近似创建时间: 4.2业务单位
所需的磁盘空间: 790 MB

5.7.1。Glibc的安装

Glibc文档建议建筑Glibc专用的构建目录:

mkdir -v build cd       build

接下来,Glibc准备编译:

../configure                             \       --prefix=/tools                    \       --host=$LFS_TGT                    \       --build=$(../scripts/config.guess) \       --enable-kernel=3.2             \       --with-headers=/tools/include      \       libc_cv_forced_unwind=yes          \       libc_cv_c_cleanup=yes

配置选项的含义:

--host=$LFS_TGT, --build=$(../scripts/config.guess)

这些开关的综合效应是Glibc的构建系统自己须要配置保存,使用交叉耦合和交叉编译器 /tools.

--enable-kernel=3.2

这告诉Glibc 3.2编译库支持,后来Linux内核。替代旧的内核不启用。

--with-headers=/tools/include

这告诉Glibc编译自己对最近头安装目录的工具,因此它确切地知道哪些特性相应的内核,能够优化自己。

libc_cv_forced_unwind=yes

连接器安装在5.4节,“binutils - 2.29 - 1”交叉编译,所以不能使用到Glibc已经安装。这意味着force-unwind支持的配置测试将失败,由于它依赖于一个连接器工做。libc_cv_forced_unwind = yes变量传递以通知 配置force-unwind支持可没有它运行测试。

libc_cv_c_cleanup=yes

一样,咱们libc_cv_c_cleanup = yes穿过 配置脚本,则跳过测试配置和C清理处理支持。

在这个阶段可能出现如下警告:

configure: WARNING: *** These auxiliary programs are missing or *** incompatible versions: msgfmt *** some features will be disabled. *** Check the INSTALL file for required versions.

缺失或不兼容 msgfmt项目一般是无害的。这 msgfmt程序的一部分Gettext包主机分布应提供。

请注意

有报道称,这个包可能会失败在构建“并行”。若是发生这种状况,从新运行make命令“j - 1”选项。

编译包:

make

安装包:

make install

谨慎

在这一点上,必须中止并确保基本功能(编译和连接)的新工具链按预期工做。执行一个检查,运行如下命令:

echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c readelf -l a.out | grep ': /tools'

若是一切工做正常,应该没有错误,和最后一个命令的输出的形式:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

请注意,对于64位的机器,翻译的名字 /tools/lib64/ld-linux-x86-64.so.2.

若是输出和上面没有显示或没有输出,而后是错误的。调查和追溯的步骤找出问题并纠正它。这个问题必须解决以后才能继续。

一旦一切都好,清理测试文件:

rm -v dummy.c a.out

请注意

下下个建筑Binutils部分将做为一个额外的检查工具链创建正常。若是Binutils未能创建,这是一个迹象代表出了毛病前Binutils GCC或Glibc安装。

这个包位于的细节6.9.3部分,“Glibc的内容。”

最后一次更新在

5.8。Libstdc + + 7.2.0

Libstdc + +是标准c++库。它须要正确的操做的g++编译器。

近似创建时间: 0.4业务单位
所需的磁盘空间: 750 MB

5.8.1。安装目标Libstdc + +

请注意

Libstdc + +是GCC的一部分来源。你应该首先解压GCC tarball和改变 gcc-7.2.0目录中。

建立一个单独的构建目录Libstdc + +并输入:

mkdir -v build cd       build

准备Libstdc + +编译:

../libstdc++-v3/configure           \     --host=$LFS_TGT                 \     --prefix=/tools                 \     --disable-multilib              \     --disable-nls                   \     --disable-libstdcxx-threads     \     --disable-libstdcxx-pch         \     --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/7.2.0

配置选项的含义:

--host=...

代表使用交叉编译器咱们刚刚创建,而不是一个 /usr/bin.

--disable-libstdcxx-threads

由于咱们尚未创建C线程库,C + + 1不能创建。

--disable-libstdcxx-pch

这个开关防止预编译包含文件的安装,不须要在这个阶段。

--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/7.2.0

这是标准的位置搜索包含文件的c++编译器。在通常的构建,该信息自动传递给Libstdc + + 配置选项从顶层目录。在咱们的例子中,这些信息必须明确。

经过运行:编译libstdc + +

make

安装库:

make install

这个包位于的细节部分6.20.2,GCC的内容。”

最后一次更新在

5.9。binutils - 2.29 - 2

Binutils包包含一个连接,一个汇编程序,和其余工具来处理对象文件。

近似创建时间: 1.1业务单位
所需的磁盘空间: 582 MB

5.9.1。安装Binutils

建立一个单独的构建目录:

mkdir -v build cd       build

Binutils准备编译:

CC=$LFS_TGT-gcc                \ AR=$LFS_TGT-ar                 \ RANLIB=$LFS_TGT-ranlib         \ ../configure                   \     --prefix=/tools            \     --disable-nls              \     --disable-werror           \     --with-lib-path=/tools/lib \     --with-sysroot

新的配置选项的含义:

CC=$LFS_TGT-gcc AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib

由于这真的是一个本地构建Binutils,确保设置这些变量构建系统使用交叉编译器和相关的工具而不是主机系统上的。

--with-lib-path=/tools/lib

这告诉配置脚本指定库搜索路径Binutils编译期间,致使 /tools/lib被传递给连接器。这能够防止连接器主机上经过图书馆搜索目录。

--with-sysroot

sysroot特性使连接找到共享对象所必需的其余共享对象明确包括连接器的命令行。没有这个,一些包可能不成功创建在一些主机。

编译包:

make

安装包:

make install

如今准备的连接器 “其余”在下一章中阶段:

make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib cp -v ld/ld-new /tools/bin

使参数的含义:

-C ld clean

这告诉程序删除全部编译文件 ld子目录。

-C ld LIB_PATH=/usr/lib:/lib

这个选项重建中的一切 ld子目录。指定 LIB_PATHMakefile变量在命令行上容许咱们覆盖默认值的临时工具和点适当的最终路径。这个变量的值指定连接的默认库搜索路径。这种准备是用于下一章。

这个包位于的细节部分6.16.2,“Binutils内容。”

最后一次更新在

5.10。GCC-7.2.0 -经过2

GCC包包含GNU编译器集合,包括C和c++编译器。

近似创建时间: 11个业务单位
所需的磁盘空间: 2.6 GB

5.10.1。安装GCC

咱们第一次创建的GCC安装了几个内部系统头文件。一般其中之一, limits.h,将包括相应的系统 limits.h头,在这种状况下, /tools/include/limits.h。然而,当时的第一个创建的gcc /tools/include/limits.h不存在,因此内部头GCC安装部分,独立的文件,不包括系统的扩展功能头。这是构建临时libc足够,可是这个构建的GCC如今须要完整的内部头。建立一个完整版的内部头使用的命令是相同的什么GCC编译系统在正常状况下:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \   `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

再一次,改变GCC的默认的位置动态连接器使用一个安装在 /tools.

for file in gcc/config/{linux,i386/linux{,64}}.h do   cp -uv $file{,.orig}   sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \       -e 's@/usr@/tools@g' $file.orig > $file   echo ' #undef STANDARD_STARTFILE_PREFIX_1 #undef STANDARD_STARTFILE_PREFIX_2 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file   touch $file.orig done

若是基于x86_64,改变默认的64位库目录名称 “自由”:

case $(uname -m) in   x86_64)     sed -e '/m64=/s/lib64/lib/' \         -i.orig gcc/config/i386/t-linux64   ;; esac

在第一个构建的GCC须要GMP,MPFR和MPC包。解压压缩包并移动到所需的目录名称:

tar -xf ../mpfr-3.1.5.tar.xz mv -v mpfr-3.1.5 mpfr tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp tar -xf ../mpc-1.0.3.tar.gz mv -v mpc-1.0.3 mpc

建立一个单独的构建目录:

mkdir -v build cd       build

在开始构建GCC以前,记得要设置环境变量,覆盖默认的优化旗帜。

如今准备GCC编译:

CC=$LFS_TGT-gcc                                    \ CXX=$LFS_TGT-g++                                   \ AR=$LFS_TGT-ar                                     \ RANLIB=$LFS_TGT-ranlib                             \ ../configure                                       \     --prefix=/tools                                \     --with-local-prefix=/tools                     \     --with-native-system-header-dir=/tools/include \     --enable-languages=c,c++                       \     --disable-libstdcxx-pch                        \     --disable-multilib                             \     --disable-bootstrap                            \     --disable-libgomp

新的配置选项的含义:

--enable-languages=c,c++

这个选项能够确保C和c++编译器。

--disable-libstdcxx-pch

不创建预编译头(PCH) libstdc++。它占用了大量的空间,咱们不须要它。

--disable-bootstrap

对于本地版本的GCC,默认是“引导”构建。这并不仅是GCC编译,编译它好几回。它使用在第一轮编译程序编译自己第二次,第三次,而后再次。第二个和第三个迭代进行比较,以确保它能够复制自己完美。这也意味着这是正确编译。然而,LFS构建方法应该提供一个坚实的编译器,而不须要每次都引导。

编译包:

make

安装包:

make install

最后润色,建立一个符号连接。许多程序和脚本运行 cc而不是 海湾合做委员会,用于保持程序通用的,所以可用在各类UNIX系统上安装了GNU C编译器并不老是。运行 cc使系统管理员能够决定哪些C编译器安装:

ln -sv gcc /tools/bin/cc

谨慎

在这一点上,必须中止并确保基本功能(编译和连接)的新工具链按预期工做。执行一个检查,运行如下命令:

echo 'int main(){}' > dummy.c cc dummy.c readelf -l a.out | grep ': /tools'

若是一切工做正常,应该没有错误,和最后一个命令的输出的形式:

[Requesting program interpreter: /tools/lib/ld-linux.so.2]

请注意, /tools/lib,或 /tools/lib64对于64位机器显示为动态连接器的前缀。

若是输出和上面没有显示或没有输出,而后是错误的。调查和追溯的步骤找出问题并纠正它。这个问题必须解决以后才能继续。首先,再次执行完整性检查,使用海湾合做委员会而不是 cc。若是这是,那么 /tools/bin/cc符号连接是失踪。安装按上面的符号连接。接下来,确保 PATH是正确的。这能够经过运行检查 回声路径美圆和验证 /tools/bin在列表的头。若是 PATH是错误的,它可能意味着你没有登陆的用户吗 lfs或者出了问题4.4节,“设置环境。”

一旦一切都好,清理测试文件:

rm -v dummy.c a.out

这个包位于的细节部分6.20.2,GCC的内容。”

最后一次更新在

5.11。Tcl-core-8.6.7

Tcl包包含工具命令语言。

近似创建时间: 0.4业务单位
所需的磁盘空间: 42 MB

5.11.1。安装Tcl-core

这个包和将来三(DejaGNU指望,并检查)安装为GCC支持运行测试套件和Binutils和其余包。为测试目的安装四个包彷佛有些过度了,但这很安心,若是不是必要的,知道最重要的工具是正常工做。即便测试套件运行在本章(不强制),这些包都必须运行测试套件第六章.

注意,这里使用的Tcl包是运行LFS所需的最小版本测试。完整的包,看到BLFS Tcl程序.

Tcl准备编译:

cd unix ./configure --prefix=/tools

建设方案:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。Tcl运行测试套件,发出如下命令:

TZ=UTC make test

Tcl测试套件可体验到失败在特定主机的条件并不彻底理解。所以,测试套件的失败在这里不奇怪,不被认为是相当重要的。的 TZ=UTC参数设置时区为协调世界时(UTC),但只有时间的测试套件运行。这将确保时钟测试正确行使。细节上的 TZ环境变量提供了第七章.

安装包:

make install

让安装库可写的调试符号能够删除后:

chmod -v u+w /tools/lib/libtcl8.6.so

安装Tcl的头。期待,下一个包须要构建。

make install-private-headers

如今作一个必要的符号连接:

ln -sv tclsh8.6 /tools/bin/tclsh

5.11.2。Tcl-core内容

安装程序: tclsh(tclsh8.6连接)和tclsh8.6
安装库: libtcl8.6。因此,libtclstub8.6.a

简短的描述

tclsh8.6

Tcl命令shell

tclsh

tclsh8.6连接

libtcl8.6.so

Tcl图书馆

libtclstub8.6.a

Tcl的存根库

最后一次更新在

5.12。指望- 5.45

预计包包含一个程序的执行脚本与其余互动对话程序。

近似创建时间: 0.1业务单位
所需的磁盘空间: 4.3 MB

5.12.1。安装预计

首先,迫使指望的配置脚本使用 /bin/stty而不是 /usr/local/bin/stty它可能会发如今主机系统。这将确保咱们的测试套件工具保持理智的最终构建咱们的工具链:

cp -v configure{,.orig} sed 's:/usr/local/bin:/bin:' configure.orig > configure

如今预计准备编译:

./configure --prefix=/tools       \             --with-tcl=/tools/lib \             --with-tclinclude=/tools/include

配置选项的含义:

--with-tcl=/tools/lib

这将确保配置脚本找到临时的Tcl安装工具位置,而不是可能定位现有的主机系统。

--with-tclinclude=/tools/include

这明确告诉预计在哪里找到Tcl的内部标头。使用这个选项能够避免的状况 配置失败,由于它不能自动发现Tcl的头的位置。

建设方案:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。预计测试套件运行,发出如下命令:

make test

注意,但愿测试套件是已知的失败经验在某些主机不在咱们控制以内的条件。所以,测试套件的失败在这里不奇怪,不被认为是相当重要的。

安装包:

make SCRIPTS="" install

使参数的含义:

SCRIPTS=""

这能够防止安装补充Expect脚本,不须要。

5.12.2。内容的指望

安装程序: 预计
安装库: libexpect-5.45.so

简短的描述

预计

根据脚本与其余互动项目

libexpect-5.45.so

包含函数,容许指望做为Tcl扩展或直接从使用C或c++(没有Tcl)

最后一次更新在

5.13。dejagnu - 1.6

DejaGNU包包含测试其余程序的一个框架。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 3.2 MB

5.13.1。安装DejaGNU

DejaGNU准备编译:

./configure --prefix=/tools

构建和安装包:

make install

测试结果,问题:

make check

5.13.2。DejaGNU内容

安装程序: 小牛

简短的描述

小牛

一个定位适当的包装器脚本 预计壳,而后DejaGNU运行

最后一次更新在

5.14。Check-0.11.0

检查是C的单元测试框架。

近似创建时间: 0.1业务单位
所需的磁盘空间: 11 MB

5.14.1。安装检查

准备检查编译:

PKG_CONFIG= ./configure --prefix=/tools

配置参数的含义:

PKG_CONFIG=

这告诉配置脚本忽略任何pkg-config选项,可能会致使系统不试图连接库 /tools目录中。

建设方案:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。检查运行测试套件,发出如下命令:

make check

注意,检查测试套件可能须要较长(4单位)。

安装包:

make install

5.14.2。检查的内容

安装程序: checkmk
安装库: libcheck。{,,}

简短的描述

checkmk

Awk脚本生成C单元测试使用检查单元测试框架

libcheck.{a,so}

包含函数,容许检查在测试程序中调用

最后一次更新在

5.15。ncurses - 6.0

Ncurses包包含库terminal-independent处理字符的屏幕。

近似创建时间: 0.5业务单位
所需的磁盘空间: 38 MB

5.15.1。安装Ncurses

首先,确保 腼腆的人第一次发如今配置:

sed -i s/mawk// configure

Ncurses准备编译:

./configure --prefix=/tools \             --with-shared   \             --without-debug \             --without-ada   \             --enable-widec  \             --enable-overwrite

配置选项的含义:

--without-ada

这将确保Ncurses Ada编译器不支持它可能出如今主机,但一旦咱们进入将不可用 chroot环境。

--enable-overwrite

这告诉Ncurses安装它的头文件 /tools/include,而不是 /tools/include/ncurses,以确保其余包能够找到Ncurses头成功。

--enable-widec

这个开关会致使宽度字符库(例如, libncursesw.so.6.0)创建而不是正常的(例如, libncurses.so.6.0)。这些宽度字符库可用在多字节和传统的8位地区,而正常库只在8位场所正常工做。宽字符和正常库源代码兼容,但不是二进制兼容的。

编译包:

make

这个包有一个测试套件,但它只能包已经安装后运行。测试中驻留 test/目录中。看到 README该目录中的文件为进一步的细节。

安装包:

make install

这个包位于的细节部分6.23.2,“Ncurses的内容。”

最后一次更新在

5.16。bash - 4.4

Bash包包含Bourne-Again壳。

近似创建时间: 0.4业务单位
所需的磁盘空间: 61 MB

5.16.1。Bash的安装

Bash准备编译:

./configure --prefix=/tools --without-bash-malloc

配置选项的含义:

--without-bash-malloc

这个选项关闭使用Bash的内存分配(malloc)函数会致使分割的缺点。关闭这个选项,Bash将使用 malloc函数从Glibc更稳定。

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行Bash测试套件,发出如下命令:

make tests

安装包:

make install

使程序的连接使用 上海外壳:

ln -sv bash /tools/bin/sh

这个包位于的细节部分6.34.2,Bash的内容。”

最后一次更新在

5.17。Bison-3.0.4

野牛包包含一个解析器生成器。

近似创建时间: 0.3业务单位
所需的磁盘空间: 32 MB

5.17.1。安装的野牛

野牛准备编译:

./configure --prefix=/tools

编译包:

make

测试结果,问题:

make check

安装包:

make install

这个包位于的细节部分6.31.2,“野牛”的内容。

最后一次更新在

5.18。Bzip2-1.0.6

Bzip2包包含压缩和解压文件的程序。压缩的文本文件 bzip2产生一个更好的压缩比与传统的比例 gzip.

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 5.2 MB

5.18.1。安装Bzip2

Bzip2包不包含 配置脚本。编译和测试它:

make

安装包:

make PREFIX=/tools install

这个包位于的细节部分6.21.2,Bzip2内容。”

最后一次更新在

5.19。coreutils - 8.27

Coreutils包包含实用程序显示和设置基本制度特征。

近似创建时间: 0.6业务单位
所需的磁盘空间: 136 MB

5.19.1。安装Coreutils

Coreutils准备编译:

./configure --prefix=/tools --enable-install-program=hostname

配置选项的含义:

--enable-install-program=hostname

这使 主机名二进制建造和安装——它默认是禁用的,但Perl所要求的测试套件。

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行测试套件Coreutils不管如何,发出如下命令:

make RUN_EXPENSIVE_TESTS=yes check

 RUN_EXPENSIVE_TESTS=yes参数告诉测试套件运行几个额外的测试被认为是相对昂贵(CPU和内存使用)在一些平台上,但一般不是一个问题在Linux上。

安装包:

make install

这个包位于的细节部分6.50.2,“Coreutils内容。”

最后一次更新在

5.20。你要- 3.6

你要包包含程序显示文件或目录之间的差别。

近似创建时间: 0.2业务单位
所需的磁盘空间: 22 MB

5.20.1。你要安装

你要准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行你的测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节6.51.2节,“你要的内容。”

最后一次更新在

5.21。文件- 5.31

文件包包含一个实用工具来肯定一个给定的文件或文件的类型。

近似创建时间: 0.1业务单位
所需的磁盘空间: 16 MB

5.21.1。安装的文件

准备文件进行编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行测试套件的文件,发出如下命令:

make check

安装包:

make install

这个包位于的细节6.12.2节,“文件”的内容。

最后一次更新在

5.22。Findutils-4.6.0

Findutils包包含程序找到文件。这些项目提供了递归搜索目录树和建立、维护和搜索数据库(一般比递归查找更快,可是不可靠,若是数据库最近没有更新)。

近似创建时间: 0.3业务单位
所需的磁盘空间: 35 MB

5.22.1。安装Findutils

Findutils准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行测试套件Findutils不管如何,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.53.2,“Findutils内容。”

最后一次更新在

5.23。Gawk-4.1.4

呆呆的包包含操纵文本文件的程序。

近似创建时间: 0.2业务单位
所需的磁盘空间: 35 MB

5.23.1。安装呆呆的

准备呆呆的编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行呆呆的测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.52.2,呆呆的“内容”。

最后一次更新在

5.24。Gettext-0.19.8.1

国际化和本地化的Gettext包包含公用事业。这些容许编译程序与NLS(本地语言支持),使他们可以输出消息在用户的母语。

近似创建时间: 0.8业务单位
所需的磁盘空间: 164 MB

5.24.1。安装Gettext

对于咱们的临时的工具集,咱们只须要从Gettext构建和安装三个项目。

Gettext准备编译:

cd gettext-tools EMACS="no" ./configure --prefix=/tools --disable-shared

配置选项的含义:

EMACS="no"

这能够防止配置脚本肯定在哪里安装Emacs Lisp文件做为测试挂在一些虚拟主机。

--disable-shared

咱们不须要安装任何共享Gettext库,所以不须要构建它们。

编译包:

make -C gnulib-lib make -C intl pluralx.c make -C src msgfmt make -C src msgmerge make -C src xgettext

只有三个项目已经被编译,不可能没有编译运行测试套件从Gettext包额外的支持库。所以不建议尝试运行测试套件。

安装 msgfmt, msgmerge xgettext程序:

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

这个包位于的细节部分6.47.2,“Gettext的内容。”

最后一次更新在

5.25。grep - 3.1

Grep搜索包包含项目文件。

近似创建时间: 0.2业务单位
所需的磁盘空间: 19 MB

5.25.1。Grep的安装

Grep准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行Grep测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.33.2,“Grep的内容。”

最后一次更新在

5.26。gzip - 1.8

的Gzip压缩和解压文件包包含项目。

近似创建时间: 0.1业务单位
所需的磁盘空间: 9 MB

5.26.1。Gzip的安装

Gzip准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行Gzip测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.57.2,“Gzip的内容。”

最后一次更新在

5.27。M4-1.4.18

M4包包含一个宏处理器。

近似创建时间: 0.2业务单位
所需的磁盘空间: 19 MB

5.27.1。M4的安装

M4准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。M4运行测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节6.14.2部分,“M4的内容。”

最后一次更新在

5.28。Make-4.2.1

使编译包包含一个程序包。

近似创建时间: 0.1业务单位
所需的磁盘空间: 12.5 MB

5.28.1。安装使

准备进行编译:

./configure --prefix=/tools --without-guile

配置选项的含义:

--without-guile

这将确保Make-4.2.1不会对诡计库连接,这可能出如今主机系统,但不会中可用的 chroot环境下一章。

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行Make测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节6.61.2部分,“内容”。

最后一次更新在

5.29。Patch-2.7.5

补丁包包含一个程序修改或建立文件的应用 “补丁”一般文件建立的 diff程序。

近似创建时间: 0.2业务单位
所需的磁盘空间: 11 MB

5.29.1。安装补丁

准备补丁进行编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行补丁测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.62.2,“补丁的内容。”

最后一次更新在

5.30。Perl-5.26.0

Perl包包含实际提取和报告语言。

近似创建时间: 1.3业务单位
所需的磁盘空间: 261 MB

5.30.1。安装Perl

首先,修复一个构建问题只出如今LFS环境:

sed -e '9751 a#ifndef PERL_IN_XSUB_RE' \     -e '9808 a#endif'                  \     -i regexec.c

准备Perl编译:

sh Configure -des -Dprefix=/tools -Dlibs=-lm

建设方案:

make

虽然Perl附带一个测试套件,最好等到安装在下一章。

只有少数的实用程序和库须要安装在这个时间:

cp -v perl cpan/podlators/scripts/pod2man /tools/bin mkdir -pv /tools/lib/perl5/5.26.0 cp -Rv lib/* /tools/lib/perl5/5.26.0

这个包位于的细节部分6.40.2,“Perl”的内容。

最后一次更新在

5.31。sed - 4.4

Sed包包含一个流编辑器。

近似创建时间: 0.2业务单位
所需的磁盘空间: 16 MB

5.31.1。Sed的安装

Sed准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。Sed运行测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.27.2,“Sed的内容。”

最后一次更新在

5.32。沥青- 1.29

Tar包包含一个归档项目。

近似创建时间: 0.3业务单位
所需的磁盘空间: 33 MB

5.32.1。安装焦油

焦油准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。焦油运行测试套件,发出如下命令:

make check

安装包:

make install

最后一次更新在

5.33。texinfo - 6.4

Texinfo包包含项目为阅读,写做,和转换信息页面。

近似创建时间: 0.2业务单位
所需的磁盘空间: 99 MB

5.33.1。安装Texinfo

Texinfo准备编译:

./configure --prefix=/tools

请注意

做为配置过程的一部分,一个测试是由TestXS_la-TestXS.lo代表一个错误。这不是有关LFS和应被忽略。

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行测试套件Texinfo不管如何,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.69.2,“Texinfo内容。”

最后一次更新在

5.34。Util-linux-2.30.1

Util-linux包包含各类各样的实用程序。

近似创建时间: 0.8业务单位
所需的磁盘空间: 123 MB

5.34.1。安装Util-linux

Util-linux准备编译:

./configure --prefix=/tools                \             --without-python               \             --disable-makeinstall-chown    \             --without-systemdsystemunitdir \             --without-ncurses              \             PKG_CONFIG=""

配置选项的含义:

--without-python

这个开关禁用使用 Python若是是安装在主机系统上。它能避免试图创建没必要要的绑定。

--disable-makeinstall-chown

这个开关禁用使用 乔恩在安装期间命令。这是不须要在安装/工具目录,避免做为根用户安装的必要性。

--without-ncurses

这个开关禁用使用ncurses库的构建过程。这是不须要在安装/工具目录并避免问题在某些主机发行版。

--without-systemdsystemunitdir

系统使用systemd,包试图安装一个systemd特定文件到一个不存在的目录在/工具。这个开关禁用没必要要的行动。

PKG_CONFIG=""

设置环境变量添加没必要要的特性,能够防止在主机。注意,设置这个环境变量的位置显示是不一样于其余LFS部分变量在哪里设置前的命令。这个位置所示展现的另外一种方式使用配置时设置一个环境变量。

编译包:

make

安装包:

make install

最后一次更新在

5.35。Xz-5.2.3

Xz包包含压缩和解压文件的程序。它提供了功能lzma和更新的xz压缩格式。压缩的文本文件 xz产生一个更好的压缩比与传统的比例 gzip bzip2命令。

近似创建时间: 0.2业务单位
所需的磁盘空间: 17个MB

5.35.1。安装Xz

Xz准备编译:

./configure --prefix=/tools

编译包:

make

如今编译完成。正如前面所讨论的,运行测试套件是临时工具不是强制性的在这一章。运行Xz测试套件,发出如下命令:

make check

安装包:

make install

这个包位于的细节部分6.45.2,“Xz内容。”

最后一次更新在

5.36。剥离

本节中的步骤是可选的,但若是LFS分区,而小,有利于学习,能够删除没必要要的物品。到目前为止的可执行文件和库创建包含大约70 MB的没必要要的调试符号。删除这些符号:

strip --strip-debug /tools/lib/* /usr/bin/strip --strip-unneeded /tools/{,s}bin/*

这些命令将跳过大量文件、报告,它不认可他们的文件格式。大多数都是脚本而不是二进制文件。也使用系统带命令包括加沙地带二进制/工具。

照顾 不使用 --strip-unneeded在库。静态的将被摧毁和工具链包须要从新建造。

存更多的钱,删除文档:

rm -rf /tools/{,share}/{info,man,doc}

此时,您应该至少3 GB的空闲空间 $LFS能够用来构建和安装Glibc和Gcc在接下来的阶段。若是你能构建和安装Glibc,您能够构建和安装其他。

5.37。改变全部权

请注意

在这本书的其他部分的命令必须在登陆用户执行 root,再也不做为用户 lfs。此外,双重检查 $LFS被设置在 root的环境。

目前, $LFS/tools目录由用户 lfs,用户只存在于主机系统。若是 $LFS/tools目录保存,文件是属于没有对应账户的用户ID。这是危险的,由于一个用户账户建立后能够获得相同的用户ID和将本身的 $LFS/tools目录和全部文件,从而让这些文件可能的恶意操纵。

为了不这个问题,您能够添加 lfs用户后,建立新的LFS系统 /etc/passwd文件,照顾分配相同的用户和组id在主机系统。更好的是,改变的全部权 $LFS/tools目录的用户 root经过运行下面的命令:

chown -R root:root $LFS/tools

虽然 $LFS/tools目录能够删除LFS系统已经完成后,它能够保留创建附加的LFS系统 同一本书的版本。如何备份 $LFS/tools是一个我的喜爱的问题。

谨慎

若是你打算保持暂时的工具用于构建将来的LFS系统, 如今是时候回去了。第六章中后续的命令将改变目前的工具,呈现他们无用的将来构建。

第三部分。LFS系统建设

第六章。安装基本系统软件

6.1。介绍

在这一章,咱们进入建筑工地,开始认真构建LFS系统。咱们chroot临时迷你的Linux系统,作一些最后的准备,而后开始安装包。

这个软件的安装很简单。虽然在许多状况下,安装说明能够更短更通用的,咱们选择为每一个包提供完整的指令错误的可能性降到最低。学习是什么让一个Linux系统的关键工做是知道每一个包是用来和你为何(或系统)可能须要它。

咱们不建议使用优化。他们能够使程序运行更快,但他们也可能致使编译运行程序时,困难和问题。若是一个包拒绝编译使用优化时,试着编译它没有优化,看看修复这个问题。即便包编译使用优化时,存在的风险多是编译错误,由于之间的复杂交互代码并构建工具。还注意到 -march -mtune选项使用值没有指定在书中没有被测试。这可能致使问题的工具链包(Binutils,GCC和Glibc)。小的潜在收益实现使用编译器优化每每抵消风险。鼓励首次建筑商LFS构建没有定制优化。随后系统将仍然跑得很快,是稳定在同一时间。

包的顺序安装在本章须要严格执行,以确保没有指程序意外得到一个路径 /tools硬链接。出于一样的缘由,不要并行编译不一样的包。并行编译可能节省时间(特别是在双cpu的机器上),但它可能致使程序包含一个硬链接的路径 /tools,这将致使程序中止工做时,删除目录。

安装前安装说明,每一个页面提供关于包装的信息,包括一个简洁的描述,它包含什么,大约须要多长时间,多少磁盘空间这个建筑过程当中是必需的。安装说明后,有一个项目列表和库(以及简要的描述这些),包安装。

请注意

所需的业务单位价值和磁盘空间包括全部适用的测试套件数据包在第六章。

可是。关于图书馆

通常来讲,LFS编辑阻碍构建和安装静态库。最初的目的大多数静态库已通过时的在现代的Linux系统。除了静态库连接到一个程序能够是有害的。若是一个更新图书馆须要删除一个安全问题,全部的程序使用静态库须要工具的新图书馆。由于使用静态库并不老是显而易见的,相关的程序(程序须要作连接)甚至不被人知道的。

在第六章的程序,咱们删除或禁用大多数静态库的安装。在一些状况下,尤为是glibc和gcc,使用静态库总包建筑仍然是必不可少的过程。这一般是经过一个完成的 --disable-static选项 配置。在其余状况下,备用手段是必要的。

为一个更完整的讨论图书馆,看到讨论库:静态或共享?BLFS的书。并

6.2。虚拟内核文件系统作准备

各类文件系统导出由内核用于交流和从内核自己。这些文件系统是虚拟的,没有磁盘空间用于他们。文件系统的内容驻留在内存中。

首先建立目录上的文件系统安装:

mkdir -pv $LFS/{dev,proc,sys,run}

6.2.1。建立初始设备节点

在内核启动时系统,它须要一些设备节点的存在,尤为是 console null设备。必须在硬盘上建立设备节点,这样他们是可用的 udevd已经开始,另外当Linux是开始 init=/bin/bash。建立设备经过运行如下命令:

mknod -m 600 $LFS/dev/console c 5 1 mknod -m 666 $LFS/dev/null c 1 3

6.2.2。安装并填充/ dev

推荐的填充方法 /dev目录和设备(如安装一个虚拟文件系统 tmpfs) /dev建立目录,并容许设备动态虚拟文件系统上检测到或访问。建立设备一般是由Udev在引导过程当中完成的。由于这个新系统尚未Udev还没有启动,须要挂载和填充 /dev手动。这是经过绑定安装主机系统的 /dev目录中。绑定挂载是一种特殊类型的山,容许您建立一个镜像的目录或挂载点到其余位置。使用如下命令来实现:

mount -v --bind /dev $LFS/dev

6.2.3。安装虚拟内核文件系统

如今剩下的山虚拟内核文件系统:

mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -vt proc proc $LFS/proc mount -vt sysfs sysfs $LFS/sys mount -vt tmpfs tmpfs $LFS/run

开发的挂载选项的含义:

gid=5

这确保了全部devpts-created设备节点属于5组ID。这是之后咱们将使用的ID tty组。咱们使用组ID,而不是一个名字,由于主机系统可能使用不一样的ID的 tty组。

mode=0620

这确保了全部devpts-created设备节点模式0620(用户可读和可写,集团可写)。连同上面的选项,这将确保开发将建立设备节点,知足grantpt的要求(),这意味着Glibcpt_chown辅助二进制(默认不安装)不是必需的。

在某些主机系统, /dev/shm是一个符号连接呢 /run/shm。/运行tmpfs上面安装在这种状况下只须要建立一个目录。

if [ -h $LFS/dev/shm ]; then   mkdir -pv $LFS/$(readlink $LFS/dev/shm) fi

6.3。包管理

包管理是一个常常要求的LFS书籍。包管理器容许跟踪的安装文件便于拆卸和升级包。二进制文件和库文件,安装的软件包管理器将处理配置文件。在你开始怀疑以前,这个部分将不讨论也不推荐任何特定的软件包管理器。它提供的是一个比较流行的技术和它们是如何工做的。完美的包管理器为你可能在这些技术或可能的组合两个或更多的这些技术。本节简要提到升级包时可能出现的问题。

一些缘由没有包管理器中提到的LFS BLFS或包括:并

  • 处理包管理的目标将注意力从这些书如何构建Linux系统。

  • 有多个解决方案包管理,各有其优势和缺点。包括一个知足全部观众是很困难的。

有一些提示写在包管理的主题。参观提示项目看看其中一个适合您的须要。

6.3.1。升级的问题

包管理器很容易升级到新版本时释放。BLFS一般LFS中的指令和书并能够用来升级到新版本。这里有一些点,你应该知道升级的包时,特别是在正在运行的系统。

  • 若是须要升级到一个新版本,Glibc(例如,从Glibc 2.19 - 2.19到Glibc,重建LFS更安全。虽然你 可能能重建全部依赖的包订单,咱们不推荐它。

  • 若是一个包包含共享库的更新,若是库的名称更改,那么全部的包动态连接库须要从新编译连接的新图书馆。(注意,没有相关性包版本和图书馆的名称。)例如,考虑一个包foo-1.2.3,安装一个共享库的名字 libfoo.so.1。说你的包升级到新版本foo-1.2.4,安装一个共享库的名字 libfoo.so.2。在这种状况下,全部的包都是动态连接的 libfoo.so.1须要从新编译连接 libfoo.so.2。注意,您不该该删除之前的图书馆,直到从新编译依赖包。

再。包管理技术

如下是一些常见的包管理技术。包管理器在作决定以前,作一些研究各类技术,尤为是特定方案的缺点。

6.3.2.1。这一切都是在个人脑海里!

是的,这是一个包管理技术。有些人找不到须要包管理器,由于他们知道紧密的包和知道文件是由每一个包安装。一些用户也不须要任何包管理,由于他们打算重建整个系统方案时改变。

6.3.2.2。安装在不一样的目录

这是一个简单的包管理,不须要任何额外的包管理设施。每一个包是安装在一个单独的目录中。例如,包安装在foo - 1.1 /usr/pkg/foo-1.1和一个符号连接是由 /usr/pkg/foo/usr/pkg/foo-1.1。在安装新版本foo - 1.2时,它是安装在 /usr/pkg/foo-1.2和前一个符号连接被新版本的符号连接。

环境变量,如 PATH, LD_LIBRARY_PATH, MANPATH, INFOPATH CPPFLAGS须要扩大到包括 /usr/pkg/foo。超过几包,这个方案就变得难以管理。

6.3.2.3。符号连接风格包管理

这是前面的包管理技术的一种变体。每一个包安装相似于前面的方案。相反的符号连接,每一个文件的符号连接到 /usr层次结构。这消除了须要扩大环境变量。虽然用户能够建立符号连接的自动建立,许多包经理已经使用这种方法写的。一些流行的包括Stow,Epkg,贪污和仓库。

安装须要伪造,因此包认为它是安装在 /usr但在现实中它是安装在 /usr/pkg层次结构。以这种方式安装一般不是一个微不足道的任务。例如,考虑你安装一个包libfoo - 1.1。下面的说明可能不能正常安装包:

./configure --prefix=/usr/pkg/libfoo/1.1 make make install

安装工做,但依赖包可能不像你指望libfoo连接。若是你编译一个包,对libfoo连接,您可能会注意到,有关 /usr/pkg/libfoo/1.1/lib/libfoo.so.1而不是 /usr/lib/libfoo.so.1如你所愿。正确的方法是使用 DESTDIR策略来假的安装包。这种方法工做以下:

./configure --prefix=/usr make make DESTDIR=/usr/pkg/libfoo/1.1 install

大多数软件包支持这种方法,可是有一些不。不一致的包,您可能须要手动安装包中,或者你可能会发现更容易安装一些有问题的包 /opt.

6.3.2.4。基于时间戳的

在这种技术中,一个包的安装以前文件时间戳。在安装以后,一个简单的使用 找到命令与适当的选项能够生成一个日志的全部文件建立时间戳文件后安装。这种方法编写的包管理器安装日志。

这个方案的优势是简单,可是它有两个缺点。在安装过程当中,若是文件安装任何当前时间之外的时间戳,这些文件不会被追踪的包管理器。同时,这个计划时只能使用一个安装包。日志是不可靠的,若是两个包被安装在两个不一样的主机。

6.3.2.5。跟踪安装脚本

在这种方法中,安装脚本的命令执行记录。有两个技术,一个能够使用:

 LD_PRELOAD环境变量能够设置为指向一个库加载安装前。在安装期间,这个库跟踪正在安装的软件包依附于各类可执行文件等 cp, 安装, mv和跟踪修改文件系统的系统调用。这种方法起做用,全部的可执行文件须要动态连接没有suid和sgid位。预加载库在安装过程当中可能会致使一些没必要要的反作用。所以,建议一个执行一些测试来确保包管理器不会破坏任何东西和日志全部适当的文件。

第二个方法是使用 strace期间,记录全部的系统调用的执行安装脚本。

6.3.2.6。建立包档案

软件包安装在这个方案中,伪装成一个单独的树描述的符号连接风格包管理。安装后,使用安装包建立存档文件。这个档案用于安装包在本地机器上或甚至能够被用来在其余机器上安装包。

这种方法使用的大多数软件包管理器中发现的商业分布。包经理,按照这种方法的例子是RPM(顺便说一下,这是须要的Linux标准基础规范)、pkg-utils Debian的贴切,Gentoo的运输系统。一个提示描述如何采用这种风格的包管理对于LFS系统位于http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt.

建立包文件,包括依赖信息复杂,超出了LFS的范围。

Slackware使用 焦油基于系统包档案。这个系统故意不处理包依赖关系更复杂的软件包管理器同样。Slackware包管理的细节,请参阅http://www.slackbook.org/html/package-management.html.

6.3.2.7。基于用户的管理

LFS独有的,这个方案是由马提亚Benkmann,和可用的提示项目。在这个方案中,每一个包安装做为一个单独的用户到标准位置。属于一个包的文件很容易被检查用户ID。这种方法的特色和缺点过于复杂来描述在这一节中。详细信息请参阅暗示http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt.

6.3.3。LFS部署在多个系统

LFS系统的优势之一是,没有文件,取决于一个磁盘上的文件系统的位置。克隆LFS构建到另外一台计算机用一样的架构为基础系统同样简单 焦油在LFS分区包含根目录(大约250 mb未压缩的基础LFS版本),将文件经过网络传输或光盘复制到新系统和扩大它。从这一点上,几个配置文件将会被改变。可能须要更新的配置文件包括: /etc/hosts, /etc/fstab,/etc/passwd, /etc/group, /etc/shadow, /etc/ld.so.conf, /etc/sysconfig/rc.site, /etc/sysconfig/network, /etc/sysconfig/ifconfig.eth0.

一个定制的内核可能须要创建新系统根据不一样的系统硬件和原来的内核配置。

请注意

有一些报告问题之间复制时类似但不相同的架构。例如,Intel系统的指令集是不相同的AMD处理器和后版本的一些处理器指令早期版本中不可用。

最后新系统可引导经过8.4节,“使用GRUB引导过程设置”.

6.4。进入Chroot环境

是时候开始进入chroot环境构建和安装最后的LFS系统。做为用户 root运行如下命令进入的领域,目前,填充只有暂时的工具:

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

 -i选择的 envchroot环境的命令将清除全部变量。以后,只有 HOME, TERM, PS1, PATH变量设置。的 TERM=$TERM构建将设置 TERM变量在chroot chroot外为相同的值。此变量所需的程序 vim 少正确运行。若是须要其余变量,如 CFLAGS CXXFLAGS再次,这是一个好地方让他们。

从这个角度,没有须要使用 LFS变量了,由于全部的工做将被限制在LFS文件系统。这是由于Bash shell是告知 $LFS如今是根(/)目录。

请注意, /tools/bin在去年 PATH。这意味着一个临时工具将再也不使用一次它的最终版本安装。这发生在壳不 “还记得”执行的二进制文件的位置这个缘由,经过哈希是关闭 +h选项bash.

请注意, bash提示会说 I have no name!这是正常的,由于 /etc/passwd文件还没有建立。

请注意

重要的是,全部的命令在本章的其他部分和接下来的章节在chroot环境中运行。若是你由于任何缘由离开这个环境(例如重启),确保虚拟内核文件系统安装在解释道6.2.2节,“安装和填充/ dev”6.2.3节”,愈来愈多的虚拟内核文件系统”并输入chroot又在继续安装以前。

6.5。建立目录

是时候LFS建立一些结构文件系统。建立一个标准目录树经过发出如下命令:

mkdir -pv /{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt} mkdir -pv /{media/{floppy,cdrom},sbin,srv,var} install -dv -m 0750 /root install -dv -m 1777 /tmp /var/tmp mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -v  /usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -v  /usr/libexec mkdir -pv /usr/{,local/}share/man/man{1..8}  case $(uname -m) in  x86_64) mkdir -v /lib64 ;; esac  mkdir -v /var/{log,mail,spool} ln -sv /run /var/run ln -sv /run/lock /var/lock mkdir -pv /var/{opt,cache,lib/{color,misc,locate},local}

目录,默认状况下,建立755年许可模式,但这是不可取的全部目录。在上面的命令中,两个变化作了一个用户的主目录 root,另外一个为临时文件的目录。

第一个模式更改不只确保任何人均可以进入 /root目录做为一个普通用户同样与他或她的主目录。第二个模式变化确保任何用户均可以写的 /tmp /var/tmp目录,但不能删除其余用户的文件。后者是所谓的禁止 “粘的,”最高的1777位元遮罩(1)。

6.5.1。FHS合规报告

基于文件系统的目录树层次结构(FHS)(能够在标准https://wiki.linuxfoundation.org/en/FHS)。FHS还指定了可选的存在一些目录等 /usr/local/games/usr/share/games。咱们只建立所需的目录。可是,能够随意建立这些目录。

6.6。建立必要的文件和符号连接

一些程序使用硬链接路径项目不存在。为了知足这些项目,建立一个符号连接的数量将会取代了真正的文件在本章的课程后,软件已经安装:

ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} /bin ln -sv /tools/bin/{install,perl} /usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib ln -sv /tools/lib/libstdc++.{a,so{,.6}} /usr/lib sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la ln -sv bash /bin/sh

每一个连接的目的:

/bin/bash

许多 bash脚本指定 /bin/bash.

/bin/cat

这个路径名被硬编码到Glibc的配置脚本。

/bin/dd

的路径 dd将被硬编码到吗 /usr/bin/libtool实用程序。

/bin/echo

这是知足一个Glibc的测试套件的测试,预计 /bin/echo.

/usr/bin/install

的路径 install将被硬编码到吗 /usr/lib/bash/Makefile.inc文件。

/bin/ln

的路径 ln将被硬编码到吗 /usr/lib/perl5/5.26.0/<target-triplet>/Config_heavy.pl文件。

/bin/pwd

一些 配置脚本、尤为是Glibc的路径名硬编码。

/bin/rm

的路径 rm将被硬编码到吗 /usr/lib/perl5/5.26.0/<target-triplet>/Config_heavy.pl文件。

/bin/stty

这个路径名被硬编码到料,所以Binutils和GCC所需测试套件。

/usr/bin/perl

不少Perl脚本硬编码这个路径 perl程序。

/usr/lib/libgcc_s.so{,.1}

Glibc pthreads图书馆工做须要这个。

/usr/lib/libstdc++{,.6}

这是一些测试所需的Glibc的测试套件,以及在GMP c++支持。

/usr/lib/libstdc++.la

这能够防止一个 /tools参考,不然 /usr/lib/libstdc++.laGCC后安装。

/bin/sh

许多shell脚本硬编码 /bin/sh.

历史上,Linux维护一个文件挂载的文件系统的列表 /etc/mtab。现代内核维护该列表内部和暴露给用户经过 /proc文件系统。为了知足实用程序指望的存在 /etc/mtab,请建立如下符号连接:

ln -sv /proc/self/mounts /etc/mtab

为了让用户 root可以登陆和名字 “根”识别,必须有相关的条目 /etc/passwd /etc/group文件。

建立 /etc/passwd文件经过运行下面的命令:

cat > /etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false daemon:x:6:6:Daemon User:/dev/null:/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF

实际的密码 root( “x”这里使用只是一个占位符)稍后将被设置。

建立 /etc/group文件经过运行下面的命令:

cat > /etc/group << "EOF" root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty: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: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: nogroup:x:99: users:x:999: EOF

建立的组不属于任何标准组决定在Udev配置的需求在这一章,和部分常见惯例受雇于一些现有的Linux发行版。此外,一些测试套件依赖特定用户或组。Linux标准基地(LSB,可用http://www.linuxbase.org)建议,除了集团 root和组ID(GID)0,一组 bin1的GID。全部其余的组名和GID由系统管理员能够选择自由自编写良好的程序不依赖于GID编号,而是使用集团的名称。

删除 “我没有名字!”提示,启动一个新的shell。由于一个完整的安装在Glibc第五章 /etc/passwd /etc/group文件被建立,用户名和组名称解析将工做:

exec /tools/bin/bash --login +h

注意使用 +h指令。这告诉 bash不使用其内部路径散列。若是没有这个指令, bash会记得执行二进制文件的路径。确保使用新编译的二进制文件就安装, +h指令将用于本章的持续时间。

 登陆, agetty, 初始化程序(和其余人)使用的日志文件来记录信息,如登陆到系统时。然而,这些程序不会写入日志文件是否已经不存在。初始化日志文件,给他们适当的权限:

touch /var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp /var/log/lastlog chmod -v 664  /var/log/lastlog chmod -v 600  /var/log/btmp

 /var/log/wtmp文件记录全部登陆和注销。的 /var/log/lastlog文件记录每一个用户上次登陆。的 /var/log/faillog文件记录失败的登陆尝试。的 /var/log/btmp文件记录糟糕的登陆尝试。

请注意

 /run/utmp当前登陆用户的文件记录。这个文件是动态建立的启动脚本。

6.7。Linux-4.12.7 API头

Linux内核API头(linux-4.12.7.tar.xz)公开的API使用Glibc。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 865 MB

6.7.1。安装Linux API的头

Linux内核须要公开的应用程序编程接口(API)系统的C库(LFS Glibc)使用。这样作是经过消毒各类C头文件的Linux内核源代码tarball。

确保周围没有过时的文件和依赖从先前的活动:

make mrproper

如今从源中提取用户可见的内核头文件。他们被放置在一个中间本地目录复制到所需的位置,由于提取过程在目标目录中删除任何现有的文件。也有一些隐藏文件使用的内核开发人员和不须要经过LFS从中间目录中删除。

make INSTALL_HDR_PATH=dest headers_install find dest/include \( -name .install -o -name ..install.cmd \) -delete cp -rv dest/include/* /usr/include

6.7.2。Linux API标题的内容

安装头: /usr/include/asm/*.h,/usr/include/asm-generic / *。h,/usr/include/drm/*.h,/usr/include/linux/*.h,/usr/include/misc/*.h,/usr/include/mtd/*.h,/usr/include/rdma/*.h,/usr/include/scsi/*.h,/usr/include/sound/*.h,/usr/include/video/*.h,/usr/include/xen/*.h
安装目录: /usr/include/asm、/usr/include/asm-generic /usr/include/drm、/usr/include/linux /usr/include/misc,/usr/include/mtd,/usr/include/rdma,/usr/include/scsi,/usr/include/sound /usr/include/video,/usr/include/xen

简短的描述

/usr/include/asm/*.h

Linux API ASM头

/usr/include/asm-generic/*.h

Linux API ASM通用标题

/usr/include/drm/*.h

Linux API DRM头

/usr/include/linux/*.h

Linux API Linux头

/usr/include/mtd/*.h

Linux API MTD头

/usr/include/rdma/*.h

Linux API RDMA头

/usr/include/scsi/*.h

Linux API SCSI头

/usr/include/sound/*.h

Linux API声音头

/usr/include/video/*.h

Linux API视频头

/usr/include/xen/*.h

Linux API Xen头

最后一次更新在

6.8。人-页面- 4.12

手册页包包含超过2200手册页。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 27 MB

6.8.1。安装手册页

安装手册页经过运行:

make install

6.8.2。手册页的内容

安装文件: 各类手册页

简短的描述

man pages

描述C编程语言的功能,重要的设备文件,重要的配置文件

最后一次更新在

6.9。glibc - 2.26

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

近似创建时间: 20单位
所需的磁盘空间: 2.0 GB

6.9.1。Glibc的安装

请注意

Glibc构建系统是独立的,并将安装彻底,即便编译器规格文件和连接器仍然指向 /tools。规格和连接器没法调整前的Glibc安装,由于Glibc autoconf测试会给假的结果和击败的目标实现一个干净的构建。

Glibc的程序使用non-FHS compilant /var/db目录存储运行时数据。应用如下补丁做出这样程序运行时数据存储在FHS-compliant位置:

patch -Np1 -i ../glibc-2.26-fhs-1.patch

首先建立一个符号连接的兼容性,避免引用/工具在咱们最后的glibc:

ln -sfv /tools/lib/gcc /usr/lib

肯定GCC包括LSB合规的目录,并建立一个符号连接。此外,x86_64,建立一个兼容性动态加载程序正常工做所需的符号连接:

case $(uname -m) in     i?86)    GCC_INCDIR=/usr/lib/gcc/$(uname -m)-pc-linux-gnu/7.2.0/include             ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3     ;;     x86_64) GCC_INCDIR=/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include             ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64             ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3     ;; esac

删除一个文件,多是前一次构建遗留的尝试:

rm -f /usr/include/limits.h

Glibc文档建议建筑Glibc专用的构建目录:

mkdir -v build cd       build

Glibc准备编译:

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include" \ ../configure --prefix=/usr                          \              --disable-werror                       \              --enable-kernel=3.2                    \              --enable-stack-protector=strong        \              libc_cv_slibdir=/lib unset GCC_INCDIR

选项和新的配置参数的含义:

CC="gcc -isystem $GCC_INCDIR -isystem /usr/include"

设置gcc和系统包括目录的位置避免引入无效路径在调试符号。

--disable-werror

这个选项禁用-Werror选项传递给GCC。这是必要的,为运行测试套件。

--enable-stack-protector=strong

这个选项增长系统安全性经过添加一个已知的金丝雀(一个随机整数)堆栈在一个函数中,函数返回时,检查它。若是它改变了,有一个堆栈溢出,程序停止。

libc_cv_slibdir=/lib

这个变量设置正确的图书馆系统。咱们不但愿lib64使用。

编译包:

make

重要的

在本节中,测试套件的Glibc被认为是相当重要的。不要在任何状况下跳过它。

通常几个测试不经过,但你一般能够忽略下面列出的任何测试失败。如今测试构建结果:

make check

你可能会看到一些测试失败。Glibc测试套件有点依赖主机系统。这是一个列表的最多见的问题对于LFS的一些版本:

  • posix / tst-getaddrinfo4 posix / tst-getaddrinfo5架构可能会失败。

  •  rt / tst-cputimer1 rt / tst-cpuclock2众所周知,测试失败。缘由不是彻底理解,但迹象代表,小时机能够触发这些失败的问题。

  • 数学测试有时失败当系统上运行的CPU不是一个相对较新的英特尔或AMD处理器。

  •  nptl / tst-thread-affinity - { pthread、pthread2 sched }测试可能失败的缘由还没有肯定。

  • 其余测试已知的失败在一些架构malloc / tst-malloc-usable和nptl / tst-cleanupx4。

虽然这是一个无害的消息,Glibc的安装阶段将抱怨的缺失 /etc/ld.so.conf。防止这个警告:

touch /etc/ld.so.conf

修复生成Makefile跳过一个uneeded完整性检查失败的LFS部分环境:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

安装包:

make install

安装配置文件和运行时目录 nscd:

cp -v ../nscd/nscd.conf /etc/nscd.conf mkdir -pv /var/cache/nscd

接下来,安装场所,能够使系统响应在不一样的语言。没有一个地方是必需的,可是若是有些缺失,将来包将跳太重要的测试点的测试套件。

个别地区能够安装使用 localedef程序。如。,第一个 localedef下面的命令将 /usr/share/i18n/locales/cs_CZcharset-independent语境的定义 /usr/share/i18n/charmaps/UTF-8.gzcharmap定义和附加结果 /usr/lib/locale/locale-archive文件。下面的说明将安装所需的最小区域设置的最优覆盖测试:

mkdir -pv /usr/lib/locale localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8 localedef -i de_DE -f ISO-8859-1 de_DE localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro localedef -i de_DE -f UTF-8 de_DE.UTF-8 localedef -i en_GB -f UTF-8 en_GB.UTF-8 localedef -i en_HK -f ISO-8859-1 en_HK localedef -i en_PH -f ISO-8859-1 en_PH localedef -i en_US -f ISO-8859-1 en_US localedef -i en_US -f UTF-8 en_US.UTF-8 localedef -i es_MX -f ISO-8859-1 es_MX localedef -i fa_IR -f UTF-8 fa_IR localedef -i fr_FR -f ISO-8859-1 fr_FR localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro localedef -i fr_FR -f UTF-8 fr_FR.UTF-8 localedef -i it_IT -f ISO-8859-1 it_IT localedef -i it_IT -f UTF-8 it_IT.UTF-8 localedef -i ja_JP -f EUC-JP ja_JP localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R localedef -i ru_RU -f UTF-8 ru_RU.UTF-8 localedef -i tr_TR -f UTF-8 tr_TR.UTF-8 localedef -i zh_CN -f GB18030 zh_CN.GB18030

此外,安装现场为本身的国家,语言和字符集。

另外,安装中列出的全部地区 glibc-2.26/localedata/SUPPORTED文件(它包括上面列出的每个地区和许多更多)在一次耗时的命令以下:

make localedata/install-locales

而后使用 localedef命令建立和安装场所不列入 glibc-2.26/localedata/SUPPORTED文件在不可能的状况下你须要他们。

6.9.2。配置Glibc

6.9.2.1。添加nsswitch.conf

 /etc/nsswitch.conf须要建立文件由于Glibc违约不工做在网络环境。

建立一个新文件 /etc/nsswitch.conf经过运行如下:

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

6.9.2.2。添加时区数据

安装和设置时区数据以下:

tar -xf ../../tzdata2017b.tar.gz  ZONEINFO=/usr/share/zoneinfo mkdir -pv $ZONEINFO/{posix,right}  for tz in etcetera southamerica northamerica europe africa antarctica  \           asia australasia backward pacificnew systemv; do     zic -L /dev/null   -d $ZONEINFO       -y "sh yearistype.sh" ${tz}     zic -L /dev/null   -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}     zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz} done  cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO zic -d $ZONEINFO -p America/New_York unset ZONEINFO

珠海命令的意义:

zic -L /dev/null ...

这就产生了posix时区,没有任何闰秒。把这些都是常规的 zoneinfo zoneinfo/posix。有必要把POSIX时区 zoneinfo,不然各类测试套件将报告错误。在嵌入式系统中,空间紧张,你不打算更新时区,你能够节省1.9 mb经过不使用 posix目录,可是一些应用程序或测试套件可能产生一些失败。

zic -L leapseconds ...

这将建立正确的时区,包括闰秒。在嵌入式系统中,空间紧张,你不打算更新时区,或者关心正确的时间,你能够节省1.9 mb的省略 right目录中。

zic ... -p ...

这将建立的 posixrules文件。咱们使用纽约由于POSIX须要夏令时规则按照咱们的规则。

肯定当地时区的方法之一是运行如下脚本:

tzselect

回答几个问题关于位置后,脚本将输出时区的名称(例如, 美国/埃德蒙顿)。也有一些其余可能的时区中列出 /usr/share/zoneinfo 加拿大/东 EST5EDT不肯定的脚本,但能够使用。

而后建立 /etc/localtime文件经过运行:

cp - v /usr/share/zoneinfo/<xxx>/etc/localtime

取代 <xxx>与时区选择的名称(如。加拿大/东部)。

6.9.2.3。配置动态加载程序

默认状况下,动态加载程序(/lib/ld-linux.so.2)经过搜索 /lib /usr/lib所须要的动态库程序运行。然而,若是有图书馆目录以外 /lib /usr/lib这些须要被添加到 /etc/ld.so.conf文件动态加载程序为了找到他们。两个目录,一般包含额外的库 /usr/local/lib /opt/lib,因此这些目录添加到动态加载程序的搜索路径。

建立一个新文件 /etc/ld.so.conf经过运行如下:

cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib  EOF

若是须要,动态加载程序也能够搜索一个目录和包含的内容文件。通常包括目录中的文件的一行指定所需的库路径。添加此功能运行如下命令:

cat >> /etc/ld.so.conf << "EOF" # Add an include directory include /etc/ld.so.conf.d/*.conf  EOF mkdir -pv /etc/ld.so.conf.d

6.9.3。Glibc的内容

安装程序: catchsegv,gencat、getconf getent、iconv iconvconfig,ldconfig,ldd,lddlibc4,语境,localedef,makedb,mtrace,nscd,pldd,sln,sotruss,sprof,tzselect,xtrace zdump,珠海
安装库: ld - 2.26。因此,libBrokenLocale。{一},libSegFault。因此,libanl。{一},libc。{一},libc_nonshared。libcidn。因此,受阻。{一},libdl。{一},libg。libieee。libm。{一},libmcheck。libmemusage。因此,libnsl。{一},libnss_compat。因此,libnss_dns。因此,libnss_files。因此,libnss_hesiod。因此,libnss_nis。因此,libnss_nisplus。因此,libpthread。{一},libpthread_nonshared。libresolv。{一},librpcsvc。librt。{一},libthread_db。因此,libutil。{,,}
安装目录: /usr/include/arpa、/usr/include/bits /usr/include/gnu、/usr/include/net /usr/include/netash,/usr/include/netatalk,/usr/include/netax25,/usr/include/neteconet,/usr/include/netinet,/usr/include/netipx,/usr/include/netiucv,/usr/include/netpacket,/usr/include/netrom,/usr/include/netrose,/usr/include/nfs,/usr/include/protocols,/usr/include/rpc,/usr/include/rpcsvc,/usr/include/sys,/usr/lib/audit,/usr/lib/gconv,/usr/lib/locale,/usr/libexec/getconf,/usr/share/i18n,/usr/share/zoneinfo /var/cache/nscd,/var/lib/nss_db

简短的描述

catchsegv

能够用来建立一个堆栈跟踪当程序终止段错误

gencat

生成消息目录

getconf

显示系统配置文件系统特定的变量的值

getent

从行政数据库条目

iconv

执行字符集转换

iconvconfig

建立fastload iconv模块配置文件

ldconfig

配置动态连接器运行时绑定

ldd

报告每一个给定的程序或共享库所须要的共享库

lddlibc4

次助攻 ldd与对象文件

语言环境

打印当前语言环境的各类信息

localedef

编译语言环境规范

makedb

建立一个简单的数据库从文本输入

mtrace

读取和解释一个内存跟踪文件并显示总结人类可读的格式

nscd

一个守护进程,它提供了最多见的名字服务请求的缓存

pldd

运行的进��所使用的动态共享对象列表

sln

一个静态连接的 ln程序

sotruss

共享库过程调用指定命令的痕迹

sprof

读取和显示共享对象分析数据

tzselect

问用户的位置对应的时区描述系统和报告

xtrace

跟踪程序执行的打印当前执行的函数

zdump

时区翻斗车

珠海

时区编译器

ld-2.26.so

辅助项目共享库的可执行文件

libBrokenLocale

内部使用Glibc的总值破碎的项目(如黑客。,一些主题运行的应用程序)。看到评论 glibc-2.26/locale/broken_cur_max.c的更多信息

libSegFault

段错误信号处理器,使用 catchsegv

libanl

异步名称查找图书馆

libc

主要的C库

libcidn

内部使用Glibc处理国际化域名的 getaddrinfo()函数

libcrypt

加密库

libdl

动态连接库的接口

libg

虚拟图书馆不含功能。之前是一个运行时库 g + +

libieee

连接在此模块部队错误处理规则数学函数定义的电气和电子工程师协会(IEEE)。缺省值是POSIX。1错误处理

libm

数学库

libmcheck

打开内存分配与时检查

libmemusage

所使用的 memusage帮助收集程序的内存使用的信息

libnsl

网络服务库

libnss

名称服务切换库,包含函数解析主机名、用户名、组名称、别名、服务、协议等。

libpthread

POSIX线程库

libresolv

包含函数用于建立、发送和解释包互联网域名服务器

librpcsvc

包含功能提供杂项RPC服务

librt

包含功能提供大部分的POSIX指定的接口。1 b实时扩展

libthread_db

包含多线程程序的功能很是有用的调试器

libutil

包含代码 “标准函数中使用许多不一样的Unix实用工具

最后一次更新在

6.10。调整工具链

如今最后的C库安装了,是时候调整工具链,这样它将链接任何新编译程序对这些新的库。

首先,备份 /tools连接器,代之以调整连接器在第5章。咱们还将建立一个对应的连接 /tools/$(uname -m)-pc-linux-gnu/bin:

mv -v /tools/bin/{ld,ld-old} mv -v /tools/$(uname -m)-pc-linux-gnu/bin/{ld,ld-old} mv -v /tools/bin/{ld-new,ld} ln -sv /tools/bin/ld /tools/$(uname -m)-pc-linux-gnu/bin/ld

接下来,修改GCC规格文件,以便它指向新的动态连接器。简单地删除的全部实例 “/工具”应该留给咱们的正确路径动态连接器。也调整规格文件,以便GCC知道在哪里能够找到正确的标题和Glibc启动文件。一个 sed命令完成:

gcc -dumpspecs | sed -e 's@/tools@@g'                   \     -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \     -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >      \     `dirname $(gcc --print-libgcc-file-name)`/specs

是个好主意视觉检查规格文件来验证预期的变化其实是。

必须在这一点上,确保基本功能(调整工具链编译和连接)是按预期工做。为此,执行如下健康检查:

echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'

应该没有错误,和最后一个命令的输出将(容许特定于平台的动态连接器的不一样名称):

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

注意,在64位系统上 /lib是咱们的动态连接器的位置,而是经过一个符号连接/ lib64访问。

请注意

在32位系统上应该/lib/ld-linux.so.2解释器。

确保咱们设置使用正确的启动文件:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

最后一个命令的输出应该是:

/usr/lib/../lib/crt1.o succeeded /usr/lib/../lib/crti.o succeeded /usr/lib/../lib/crtn.o succeeded

验证编译器寻找正确的头文件:

grep -B1 '^ /usr/include' dummy.log

这个命令应该返回如下输出:

#include <...> search starts here:  /usr/include

接下来,验证新连接器使用正确的搜索路径:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

引用路径与“-linux-gnu”组件应该被忽略,可是最后一个命令的输出应该是:

SEARCH_DIR("/usr/lib") SEARCH_DIR("/lib")

下一个确保咱们使用正确的libc:

grep "/lib.*/libc.so.6 " dummy.log

最后一个命令的输出应该是:

attempt to open /lib/libc.so.6 succeeded

最后,确保使用正确的GCC动态连接器:

grep found dummy.log

最后一个命令的输出应该(容许特定于平台的动态连接器的不一样名称):

found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

若是输出没有出现如上所示仍是没有收到,而后是严重错误的。调查和追溯的步骤找出问题并纠正它。最可能的缘由是,调整与规范文件出现了错误。任何问题须要解决在继续以前的过程。

一旦一切都是正常工做,清理测试文件:

rm -v dummy.c a.out dummy.log

6.11。Zlib-1.2.11

Zlib压缩和解压缩包中包含一些程序所使用的例程。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 4.5 MB

6.11.1。安装Zlib

Zlib准备编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install

共享库须要搬到 /lib,结果 .so文件中 /usr/lib须要从新建立:

mv -v /usr/lib/libz.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

6.11.2。Zlib内容

安装库: libz。{,,}

简短的描述

libz

包含一些程序所使用的压缩和解压缩功能

最后一次更新在

6.12。文件- 5.31

文件包包含一个实用工具来肯定一个给定的文件或文件的类型。

近似创建时间: 0.1业务单位
所需的磁盘空间: 16 MB

6.12.1。安装的文件

准备文件进行编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.12.2。文件的内容

安装程序: 文件
安装库: libmagic.so

简短的描述

文件

尝试每个给定的文件进行分类;它经过执行几个tests-file系统测试,神奇数字测试,和语言测试

libmagic

包含神奇数字识别的程序,使用的 文件程序

最后一次更新在

6.13。readline - 7.0

Readline包是一组库提供了命令行编辑和历史功能。

近似创建时间: 0.1业务单位
所需的磁盘空间: 15 MB

6.13.1。安装Readline

从新安装Readline会致使旧的图书馆搬到< libraryname > .old。虽然这一般不是一个问题,在某些状况下,它能够触发一个连接错误 ldconfig。这能够避免经过发出如下两个种子:

sed -i '/MV.*old/d' Makefile.in sed -i '/{OLDSUFF}/c:' support/shlib-install

Readline准备编译:

./configure --prefix=/usr    \             --disable-static \             --docdir=/usr/share/doc/readline-7.0

编译包:

make SHLIB_LIBS="-L/tools/lib -lncursesw"

使选项的含义:

SHLIB_LIBS="-L/tools/lib -lncursesw"

这个选项Readline连接反对力量 libncursesw图书馆。

这个包不有一个测试套件。

安装包:

make SHLIB_LIBS="-L/tools/lib -lncurses" install

如今将动态库移动到一个更合适的位置并修复了一些符号连接:

mv -v /usr/lib/lib{readline,history}.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libreadline.so) /usr/lib/libreadline.so ln -sfv ../../lib/$(readlink /usr/lib/libhistory.so ) /usr/lib/libhistory.so

若是须要,安装文档:

install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-7.0

6.13.2。Readline的内容

安装库: libhistory。因此libreadline.so
安装目录: /usr/include/readline、/usr/share/readline /usr/share/doc/readline - 7.0

简短的描述

libhistory

回忆的历史提供了一致的用户界面

libreadline

艾滋病在离散程序用户界面的一致性,须要提供一个命令行界面

最后一次更新在

6.14。M4-1.4.18

M4包包含一个宏处理器。

近似创建时间: 0.4业务单位
所需的磁盘空间: 30 MB

6.14.1。M4的安装

M4准备编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.14.2。M4的内容

安装程序: m4

简短的描述

m4

给定的文件副本,同时扩大这些宏宏,它们包含(内置的或用户定义的,能够有任意数量的参数。除了执行宏扩展, m4内置函数包括命名文件,运行Unix命令,执行整数运算,操纵文本,递归,等 m4程序能够使用做为一个编译器的前端或宏处理器自己。)

最后一次更新在

6.15。Bc-1.07.1

Bc包包含一个任意精度数值处理语言。

近似创建时间: 0.1业务单位
所需的磁盘空间: 3.6 MB

6.15.1。公元前的安装

首先,改变内部脚本使用 sed而不是 艾德:

cat > bc/fix-libmath_h << "EOF" #! /bin/bash sed -e '1   s/^/{"/' \     -e     's/$/",/' \     -e '2,$ s/^/"/'  \     -e   '$ d'       \     -i libmath.h  sed -e '$ s/$/0}/' \     -i libmath.h EOF

建立临时符号连接的包能够找到readline库并确认其所需libncurses图书馆是可用的。即便/工具/ lib中的库是在这一点上,该系统将在本章的最后使用特性。

ln -sv /tools/lib/libncursesw.so.6 /usr/lib/libncursesw.so.6 ln -sfv libncurses.so.6 /usr/lib/libncurses.so

修复的问题 配置因为在LFS的早期阶段丢失的文件:

sed -i -e '/flex/s/as_fn_error/: ;; # &/' configure

公元前准备编译:

./configure --prefix=/usr           \             --with-readline         \             --mandir=/usr/share/man \             --infodir=/usr/share/info

配置选项的含义:

--with-readline

这个选项告诉Bc使用 readline图书馆已经安装在系统上,而不是使用本身的readline版本。

编译包:

make

公元前测试,运行下面的命令。有至关多的输出,因此你可能想要把输出重定向到一个文件。有一个很是小的比例的测试(10 12144),将显示一个圆滑错误在最后数字。

echo "quit" | ./bc/bc -l Test/checklib.b

安装包:

make install

6.15.2。公元前的内容

安装程序: bc和直流

简短的描述

公元前

是一个命令行计算器

直流

是一个逆波兰命令行计算器

最后一次更新在

6.16。binutils - 2.29

Binutils包包含一个连接,一个汇编程序,和其余工具来处理对象文件。

近似创建时间: 5.8业务单位
所需的磁盘空间: 4.2 GB

6.16.1。安装Binutils

验证企业是否正常工做在chroot环境中经过执行一个简单的测试:

expect -c "spawn ls"

这个命令应该输出以下:

spawn ls

相反,若是输出包括如下消息,那么环境不创建适当的企业操做。这个问题须要解决在运行测试套件以前Binutils和GCC:

The system has no more ptys. Ask your system administrator to create more.

Binutils文档建议建筑Binutils专用的构建目录:

mkdir -v build cd       build

Binutils准备编译:

../configure --prefix=/usr       \              --enable-gold       \              --enable-ld=default \              --enable-plugins    \              --enable-shared     \              --disable-werror    \              --with-system-zlib

配置参数的含义:

--enable-gold

创建黄金连接器和安装它ld.gold(默认连接器)。

--enable-ld=default

创建最初的快速公车提供连接器和安装它ld(默认连接器)和ld.bfd。

--enable-plugins

使插件支持连接器。

--with-system-zlib

使用安装zlib库而不是建筑包括版本。

编译包:

make tooldir=/usr

使参数的含义:

tooldir=/usr

一般,tooldir(可执行文件的目录最终将位于)设置 $(exec_prefix)/$(target_alias)。例如,x86_64机器将扩大 /usr/x86_64-unknown-linux-gnu。由于这是一个定制的系统,这种有针对性的目录 /usr不是必需的。 $(exec_prefix)/$(target_alias)若是系统被用来保存��用(例如,编译一个包在一个英特尔机器生成的代码,能够在PowerPC机器上执行)。

重要的

Binutils测试套件的这一部分被认为是相当重要的。在任何状况下不要跳过它。

测试结果:

make -k check

一个测试,debug_msg。sh,失败。

安装包:

make tooldir=/usr install

6.16.2。Binutils内容

安装程序: addr2line,ar,c++ filt,elfedit,gprof,ld,ld.bfd,ld.gold,nm,objcopy,objdump,ranlib,readelf,大小、字符串、和地带
安装库: libbfd。{一个,因此}和libopcodes。{,,}
安装目录: /usr/lib/ldscripts

简短的描述

addr2line

翻译程序地址文件名和行号;给定一个地址和一个可执行的名称,它使用调试信息的可执行文件,以肯定哪些源文件和行号与地址相关联

基于“增大化现实”技术

建立、修改和提取物档案

做为

一个组装的输出的汇编程序 海湾合做委员会成目标文件

c++ filt

链接器用来de-mangle c++和Java符号和防止重载函数发生冲突

elfedit

更新精灵ELF文件的标题

gprof

显示调用图配置文件数据

ld

一个连接器相结合的对象和归档文件到一个文件,将它们的数据和捆绑符号引用

ld.gold

下降版本只支持的ld elf对象文件格式

ld.bfd

硬连接 ld

纳米

列出了符号发生在一个给定的对象文件

objcopy

翻译一个文件到另外一个类型的对象

objdump

显示给定对象的信息文件,选项控制特定信息显示;显示的信息是有用的程序员正在编译工具

ranlib

生成一个索引的内容存档并将其存储在存档;定义的索引列表的全部符号归档成员可重定位的目标文件

readelf

显示有关精灵的信息类型的二进制文件

大小

列出了部分尺寸和给定的对象文件的总大小

字符串

输出,对于每一个给定的文件,可打印字符的序列至少指定的长度(4)违约;对象文件,打印,默认状况下,只有字符串的初始化和加载部分其余类型的文件时,它会扫描整个文件

丢弃对象文件的符号

libbfd

二进制文件描述符的图书馆

libopcodes

一个库来处理opcodes-the “可读的文本版本的处理器指令;它是用于构建实用程序 objdump

最后一次更新在

6.17。GMP-6.1.2

GMP包包含数学库。这些有用的高精度计算的功能。

近似创建时间: 1.2业务单位
所需的磁盘空间: 59 MB

6.17.1。GMP的安装

请注意

若是你正在构建32位x86,但你有一个CPU运行64位代码的能力 和你有指定的 CFLAGS在环境中,configure脚本将尝试配置64 -位和失败。避免这种状况经过调用下面的配置命令

ABI=32。/配置……

请注意

GMP生产库的默认设置为主机处理器优化。若是库适合处理器能力低于所需的主机的CPU,通用库能够经过运行下面的建立:

cp -v configfsf.guess config.guess cp -v configfsf.sub   config.sub

GMP准备编译:

./configure --prefix=/usr    \             --enable-cxx     \             --disable-static \             --docdir=/usr/share/doc/gmp-6.1.2

新的配置选项的含义:

--enable-cxx

该参数使c++支持

--docdir=/usr/share/doc/gmp-6.1.2

这个变量指定了正确的文档。

编译包和生成HTML文档:

make make html

重要的

测试套件的GMP在本节中被认为是相当重要的。在任何状况下不要跳过它。

测试结果:

make check 2>&1 | tee gmp-check-log

谨慎

gmp中的代码是高度优化的处理器建造的地方。偶尔,检测处理器识别错系统功能的代码和测试中会有错误或其余应用程序使用的gmp库消息“非法指令”。在这种状况下,gmp应配置选项——构建= x86_64-unknown-linux-gnu和重建。

确保全部190年测试套件测试经过。检查结果经过发出如下命令:

awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log

安装包和它的文档:

make install make install-html

6.17.2。GMP的内容

安装库: libgmp。因此libgmpxx.so
安装目录: /usr/share/doc/gmp-6.1.2

简短的描述

libgmp

包含精确数学函数

libgmpxx

包含c++精密的数学函数

最后一次更新在

6.18。MPFR-3.1.5

MPFR包包含多个精确数学的函数。

近似创建时间: 0.8业务单位
所需的磁盘空间: 45 MB

6.18.1。安装MPFR

MPFR准备编译:

./configure --prefix=/usr        \             --disable-static     \             --enable-thread-safe \             --docdir=/usr/share/doc/mpfr-3.1.5

编译包和生成HTML文档:

make make html

重要的

MPFR测试套件的这一部分被认为是相当重要的。在任何状况下不要跳过它。

测试结果并确保全部测试经过:

make check

安装包和它的文档:

make install make install-html

6.18.2。MPFR内容

安装库: libmpfr.so
安装目录: /usr/share/doc/mpfr-3.1.5

简短的描述

libmpfr

包含多种精密的数学函数

最后一次更新在

6.19。MPC-1.0.3

MPC包包含一个库复数的运算与任意精度高和正确的结果四舍五入。

近似创建时间: 0.3业务单位
所需的磁盘空间: 17个MB

6.19.1。MPC的安装

英国央行货币政策委员会准备编译:

./configure --prefix=/usr    \             --disable-static \             --docdir=/usr/share/doc/mpc-1.0.3

编译包和生成HTML文档:

make make html

测试结果,问题:

make check

安装包和它的文档:

make install make install-html

6.19.2。MPC的内容

安装库: libmpc.so
安装目录: /usr/share/doc/mpc-1.0.3

简短的描述

libmpc

包含复杂的数学函数

最后一次更新在

6.20。GCC-7.2.0

GCC包包含GNU编译器集合,包括C和c++编译器。

近似创建时间: 82年业务单位(测试)
所需的磁盘空间: 3.2 GB

6.20.1。安装GCC

若是基于x86_64,改变默认的64位库目录名称 “自由”:

case $(uname -m) in   x86_64)     sed -e '/m64=/s/lib64/lib/' \         -i.orig gcc/config/i386/t-linux64   ;; esac

删除以前建立的符号连接做为最终gcc包括将安装:

rm -f /usr/lib/gcc

GCC文档建议构建GCC在一个专用的构建目录:

mkdir -v build cd       build

准备GCC编译:

SED=sed                               \ ../configure --prefix=/usr            \              --enable-languages=c,c++ \              --disable-multilib       \              --disable-bootstrap      \              --with-system-zlib

请注意,对于其余语言,有一些还没有公布的先决条件。看到BLFS书说明如何构建全部的GCC支持的语言。

新的配置参数的含义:

SED=sed

设置环境变量能够防止一个硬编码的路径/工具/ bin / sed。

--with-system-zlib

这个开关告诉GCC连接到系统安装Zlib库的副本,而不是本身内部的副本。

编译包:

make

重要的

在本节中,GCC的测试套件被认为是相当重要的。不要在任何状况下跳过它。

在GCC测试套件是一组测试排气堆栈,因此增长堆栈大小以前运行测试:

ulimit -s 32768

测试结果,但不要停在错误:

make -k check

接收测试套件的总结结果,运行:

../contrib/test_summary

的总结,管的输出 grep -A7 Summ.

结果能够与那些位于http://www.linuxfromscratch.org/lfs/build-logs/8.1/http://gcc.gnu.org/ml/gcc-testresults/.

一些意想不到的失败老是没法避免。GCC开发人员一般是意识到这些问题,但没有解决。特别是,五libstdc + +测试套件的测试失败做为根用户运行时被称为咱们这里所作的。除非测试结果有很大的不一样从那些在上述URL,它是安全的继续。

请注意

在一些内核配置的组合和AMD处理器可能有超过1100失败在gcc。目标/ i386 / mpx测试(这是为了测试mpx选择最新的英特尔处理器)。这些能够安全地忽略AMD处理器。

安装包:

make install

建立一个符号连接的要求FHS“历史”的缘由。

ln -sv ../usr/bin/cpp /lib

许多软件包使用这个名字 cc调用C编译器。为了知足这些包,建立一个符号连接:

ln -sv gcc /usr/bin/cc

添加一个兼容性符号连接,使建筑项目与连接时优化(维度):

install -v -dm755 /usr/lib/bfd-plugins ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/7.2.0/liblto_plugin.so \         /usr/lib/bfd-plugins/

如今咱们最后的工具链,重要的是再次确保编译和连接��正常工做。咱们经过执行相同的健康检查咱们早些时候章:

echo 'int main(){}' > dummy.c cc dummy.c -v -Wl,--verbose &> dummy.log readelf -l a.out | grep ': /lib'

应该没有错误,和最后一个命令的输出将(容许特定于平台的动态连接器的不一样名称):

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

确保咱们设置使用正确的启动文件:

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

最后一个命令的输出应该是:

/usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crt1.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crti.o succeeded /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/../../../../lib/crtn.o succeeded

根据你的机器架构,上面可能会略有不一样,区别一般后目录的名称 /usr/lib/gcc。最重要的是 海湾合做委员会发现这三个 crt*.o下的文件 /usr/lib目录中。

验证编译器寻找正确的头文件:

grep -B4 '^ /usr/include' dummy.log

这个命令应该返回如下输出:

#include <...> search starts here:  /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include  /usr/local/include  /usr/lib/gcc/x86_64-pc-linux-gnu/7.2.0/include-fixed  /usr/include

再次注意,目录命名你的目标三联体可能和上面的不一样,取决于您的体系结构。

请注意

安装版本4.3.0,GCC如今无条件安装 limits.h文件到私人 include-fixed目录,目录必须到位。

接下来,验证新连接器使用正确的搜索路径:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

引用路径与“-linux-gnu”组件应该被忽略,可是最后一个命令的输出应该是:

SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64") SEARCH_DIR("/usr/local/lib64") SEARCH_DIR("/lib64") SEARCH_DIR("/usr/lib64") SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");

一个32位的系统可能会看到一些不一样的目录。例如,下面是一个i686机器的输出:

SEARCH_DIR("/usr/i686-pc-linux-gnu/lib32") SEARCH_DIR("/usr/local/lib32") SEARCH_DIR("/lib32") SEARCH_DIR("/usr/lib32") SEARCH_DIR("/usr/i686-pc-linux-gnu/lib") SEARCH_DIR("/usr/local/lib") SEARCH_DIR("/lib") SEARCH_DIR("/usr/lib");

下一个确保咱们使用正确的libc:

grep "/lib.*/libc.so.6 " dummy.log

最后一个命令的输出应该是:

attempt to open /lib/libc.so.6 succeeded

最后,确保使用正确的GCC动态连接器:

grep found dummy.log

最后一个命令的输出应该(容许特定于平台的动态连接器的不一样名称):

found ld-linux-x86-64.so.2 at /lib/ld-linux-x86-64.so.2

若是输出没有出现如上所示仍是没有收到,而后是严重错误的。调查和追溯的步骤找出问题并纠正它。最可能的缘由是,调整与规范文件出现了错误。任何问题须要解决在继续以前的过程。

一旦一切都是正常工做,清理测试文件:

rm -v dummy.c a.out dummy.log

最后,把错误的文件:

mkdir -pv /usr/share/gdb/auto-load/usr/lib mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

6.20.2。GCC的内容

安装程序: c++,cc(gcc)连接,cpp,g + +,gcc,gcc-ar,gcc-nm gcc-ranlib,gcov
安装库: libasan。{一},libatomic。{一},libgcc。libgcc_eh。libgcc_s。因此,libgcov。libgomp。{一},libiberty。libitm。{一},liblto_plugin。因此,libquadmath。{一},libssp。{一},libssp_nonshared。libstdc + +。{一},libsupc + +。1、libtsan。{,,}
安装目录: /usr/include/c + +,/usr/lib/gcc /usr/libexec/gcc,/usr/share/gcc-7.2.0

简短的描述

c++

c++编译器

cc

C编译器

cpp

C预处理器;它使用编译器扩大# include,#定义、源文件和相似的语句

g + +

c++编译器

海湾合做委员会

C编译器

gcc-ar

一个包装 基于“增大化现实”技术将插件添加到命令行中。这个程序只是用于添加”连接优化”并非有用的用默认构建选项

gcc-nm

一个包装 纳米将插件添加到命令行中。这个程序只是用于添加”连接优化”并非有用的用默认构建选项

gcc-ranlib

一个包装 ranlib将插件添加到命令行中。这个程序只是用于添加”连接优化”并非有用的用默认构建选项

gcov

一个覆盖测试工具;它是用来分析程序来肯定优化最具效果

libasan

洗手液运行时库的地址

libgcc

包含运行时支持 海湾合做委员会

libgcov

这个库在程序当GCC有关指示,使分析

libgomp

GNU的OpenMP API实现多平台共享内存并行编程在C / c++和Fortran

libiberty

包含各类GNU计划使用的例程,包括 getopt, obstack会, strerror, strtol, strtoul

liblto_plugin

GCC的连接时优化(LTO)插件让GCC跨编译单元进行优化

libquadmath

GCC四精确数学库的API

libssp

包含程序支持GCC的stack - smashing保护功能

libstdc++

标准c++库

libsupc++

提供平常支持c++编程语言

libtsan

洗手液的线程运行时库

最后一次更新在

6.21。Bzip2-1.0.6

Bzip2包包含压缩和解压文件的程序。压缩的文本文件 bzip2产生一个更好的压缩比与传统的比例 gzip.

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 2.3 MB

6.21.1。安装Bzip2

应用补丁,安装这个包的文档:

patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch

下面的命令确保安装符号连接是相对的:

sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

确保手册页安装到正确的位置:

sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile

Bzip2准备编译:

make -f Makefile-libbz2_so make clean

使参数的含义:

-f Makefile-libbz2_so

这将致使Bzip2建成使用不一样 Makefile文件,在这种状况下 Makefile-libbz2_so文件,该文件建立一个动态的 libbz2.so库和连接Bzip2公用事业。

编译和测试包:

make

安装程序:

make PREFIX=/usr install

安装共享 bzip2二进制的 /bin目录,进行一些必要的符号连接,和清理:

cp -v bzip2-shared /bin/bzip2 cp -av libbz2.so* /lib ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so rm -v /usr/bin/{bunzip2,bzcat,bzip2} ln -sv bzip2 /bin/bunzip2 ln -sv bzip2 /bin/bzcat

6.21.2。Bzip2内容

安装程序: bunzip2 bzip2(连接),bzcat bzip2(连接),bzcmp bzdiff(连接),bzdiff,bzegrep bzgrep(连接),bzfgrep bzgrep(连接),bzgrep,bzip2,bzip2recover,bzless bzmore(连接),和bzmore
安装库: libbz2。{,,}
安装目录: /usr/share/doc/bzip2-1.0.6

简短的描述

bunzip2

解压缩bzipped文件

bzcat

解压缩到标准输出

bzcmp

运行 cmpbzipped文件

bzdiff

运行 diffbzipped文件

bzegrep

运行 egrepbzipped文件

bzfgrep

运行 fgrepbzipped文件

bzgrep

运行 grepbzipped文件

bzip2

压缩文件使用burrows - wheeler排序文本块和霍夫曼编码压缩算法;压缩率比经过更传统的压缩机使用 “Lempel-Ziv算法,如 gzip

bzip2recover

试图从受损bzipped文件恢复数据

bzless

运行 bzipped文件

bzmore

运行 更多bzipped文件

libbz2

图书馆实现无损,块分类数据压缩,使用burrows - wheeler算法

最后一次更新在

6.22。Pkg-config-0.29.2

pkg-config包包含一个工具,经过包括路径和/或库路径在配置和构建工具使文件执行。

近似创建时间: 0.3业务单位
所需的磁盘空间: 28 MB

6.22.1。安装Pkg-config

Pkg-config准备编译:

./configure --prefix=/usr              \             --with-internal-glib       \             --disable-host-tool        \             --docdir=/usr/share/doc/pkg-config-0.29.2

新的配置选项的含义:

--with-internal-glib

这将容许pkg-config使用其内部版本Glib由于外部LFS版本不可用。

--disable-host-tool

这个选项禁用无用的建立硬连接到pkg-config程序。

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.22.2。Pkg-config内容

安装程序: pkg-config
安装目录: /usr/share/doc/pkg-config-0.29.2

简短的描述

pkg-config

返回指定的库或包元数据信息

最后一次更新在

6.23。ncurses - 6.0

Ncurses包包含库terminal-independent处理字符的屏幕。

近似创建时间: 0.3业务单位
所需的磁盘空间: 39 MB

6.23.1。安装Ncurses

不安装一个静态库,不是由配置:

sed -i '/LIBTOOL_INSTALL/d' c++/Makefile.in

Ncurses准备编译:

./configure --prefix=/usr           \             --mandir=/usr/share/man \             --with-shared           \             --without-debug         \             --without-normal        \             --enable-pc-files       \             --enable-widec

新的配置选项的含义:

--enable-widec

这个开关会致使宽度字符库(例如, libncursesw.so.6.0)创建而不是正常的(例如, libncurses.so.6.0)。这些宽度字符库可用在多字节和传统的8位地区,而正常库只在8位场所正常工做。宽字符和正常库源代码兼容,但不是二进制兼容的。

--enable-pc-files

这个开关生成并安装。为pkg-config电脑文件。

--without-normal

这个开关禁用构建和安装大多数静态库。

编译包:

make

这个包有一个测试套件,但它只能包已经安装后运行。测试中驻留 test/目录中。看到 README该目录中的文件为进一步的细节。

安装包:

make install

移动的共享库 /lib目录,预计他们将驻留的地方:

mv -v /usr/lib/libncursesw.so.6* /lib

由于图书馆移动,一个符号连接指向一个不存在的文件。重建:

ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so

许多应用程序仍预计连接器可以找到non-wide-character Ncurses库。欺骗这样的应用程序与宽度字符库连接的符号连接和连接器脚本:

for lib in ncurses form panel menu ; do     rm -vf                    /usr/lib/lib${lib}.so     echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so     ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/${lib}.pc done

最后,确保寻找旧的应用程序 -lcurses在构建时仍能够建造的:

rm -vf                     /usr/lib/libcursesw.so echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so ln -sfv libncurses.so      /usr/lib/libcurses.so

若是须要,安装Ncurses文档:

mkdir -v       /usr/share/doc/ncurses-6.0 cp -v -R doc/* /usr/share/doc/ncurses-6.0

请注意

上面的指令不建立non-wide-character Ncurses图书馆由于没有包安装编译源代码将在运行时连接攻击他们。然而,惟一已知的二进制只读应用程序符合连接对non-wide-character Ncurses库须要版本5。若是你必须有这样的图书馆由于某些二进制只读应用程序或符合LSB,符合构建包再次与如下命令:

make distclean ./configure --prefix=/usr    \             --with-shared    \             --without-normal \             --without-debug  \             --without-cxx-binding \             --with-abi-version=5  make sources libs cp -av lib/lib*.so.5* /usr/lib

6.23.2。Ncurses的内容

安装程序: captoinfo抽搐(连接),清晰,infocmp,infotocap抽搐(连接),ncursesw6-config,重置tset(连接),标签、抽搐,脚趾,tput,tset
安装库: libcursesw。因此(libncursesw.so符号连接和连接器脚本),libformw。因此,libmenuw。因此,libncursesw。因此,libncurses + + w。libpanelw。因此,non-wide-character同行没有在图书馆“w”的名字。
安装目录: /usr/share/tabset、/usr/share/terminfo /usr/share/doc/ncurses - 6.0

简短的描述

captoinfo

termcap描述转换成terminfo描述

清晰的

清除屏幕,若是可能的话

infocmp

比较或打印出terminfo描述

infotocap

terminfo描述转换成termcap描述

ncursesw6-config

为ncurses提供配置信息

重置

从新启动一个终端的默认值

选项卡

清除并设置制表符设置终端

抽搐

terminfo entry-description编译器,terminfo文件从源格式转换为所需的二进制格式ncurses库例程(terminfo文件包含信息在某个终端的功能。)

脚趾

列出了全部可用的终端类型,给主名称和描述

tput

使terminal-dependent功能的值可用于壳;它也能够用于重置或初始化一个终端或报告其长名称

tset

能够用来初始化终端

libcursesw

的连接 libncursesw

libncursesw

包含函数来显示文本终端屏幕上在许多复杂的方式;使用这些函数的一个很好的例子是在内核的菜单显示 使menuconfig

libformw

包含功能实现形式

libmenuw

包含实现菜单功能

libpanelw

包含函数来实现板

最后一次更新在

6.24。Attr-2.4.47

attr包包含公用事业管理文件系统对象的扩展属性。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 3.3 MB

6.24.1。安装Attr

修改的文档目录,以便它是版本目录:

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

防止安装已经安装的手册页 man pages包:

sed -i -e "/SUBDIRS/s|man[25]||g" man/Makefile

修复一个问题在测试过程引发的变化在perl - 5.26:

sed -i 's:{(:\\{(:' test/run

准备Attr编译:

./configure --prefix=/usr \             --bindir=/bin \             --disable-static

编译包:

make

测试须要运行在一个文件系统,支持扩展属性如ext二、ext三、或ext4文件系统。测试也称失败若是同时运行多个测试(大于1 - j选项)。测试结果,问题:

make -j1 tests root-tests

安装包:

make install install-dev install-lib chmod -v 755 /usr/lib/libattr.so

共享库须要搬到 /lib,结果 .so文件中 /usr/lib须要从新建立:

mv -v /usr/lib/libattr.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so

6.24.2。内容Attr

安装程序: attr,getfattr,setattr
安装库: libattr.so
安装目录: /usr/include/attr和/usr/share/doc/attr-2.4.47

简短的描述

attr

扩展属性的文件系统对象

getfattr

文件系统对象的扩展属性

setattr

设置文件系统对象的扩展属性

libattr

包含libbrary操纵扩展属性的功能

最后一次更新在

6.25。Acl-2.2.52

Acl包包含公用事业管理访问控制列表,用于定义更细粒度的可自由支配的文件和目录的访问权限。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 4.8 MB

6.25.1。Acl的安装

修改的文档目录,以便它是版本目录:

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

解决一些破碎的测试:

sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test

修复一个问题在测试过程引发的变化在perl - 5.26:

sed -i 's/{(/\\{(/' test/run

此外,修复一个缺陷的缘由 getfacl - e段错误过于长组名称:

sed -i -e "/TABS-1;/a if (x > (TABS-1)) x = (TABS-1);" \     libacl/__acl_to_any_text.c

Acl准备编译:

./configure --prefix=/usr    \             --bindir=/bin    \             --disable-static \             --libexecdir=/usr/lib

编译包:

make

Acl测试须要运行在一个文件系统,支持访问控制 Coreutils已建成的Acl库。若是须要,回到这个包和运行 使j - 1的测试后 Coreutils是创建在本章后面。

安装包:

make install install-dev install-lib chmod -v 755 /usr/lib/libacl.so

共享库须要搬到 /lib,结果 .so文件中 /usr/lib须要从新建立:

mv -v /usr/lib/libacl.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so

6.25.2。Acl的内容

安装程序: chacl、getfacl setfacl
安装库: libacl.so
安装目录: /usr/include/acl和/usr/share/doc/acl-2.2.52

简短的描述

chacl

改变文件或目录的访问控制列表

getfacl

文件访问控制列表

setfacl

设置文件访问控制列表

libacl

包含的库函数操做访问控制列表

最后一次更新在

6.26。libcap - 2.25

从googlecode得到Libcap包实现了用户空间接口的POSIX 1003.1 Linux内核中的可用功能。这些功能分区的全部强大的根特权为一组不一样的特权。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 1.3 MB

6.26.1。安装Libcap

防止一个静态库安装:

sed -i '/install.*STALIBNAME/d' libcap/Makefile

编译包:

make

这个包不有一个测试套件。

安装包:

make RAISE_SETFCAP=no lib=lib prefix=/usr install chmod -v 755 /usr/lib/libcap.so

使选项的含义:

RAISE_SETFCAP=no

这个参数跳过试图使用 setcap在自己。这避免了安装偏差若是内核或文件系统不支持扩展功能。

lib=lib

这个参数安装的图书馆 $prefix/lib而不是 $prefix/lib64x86_64。它没有x86上的效果。

共享库须要搬到 /lib,结果 .so文件中 /usr/lib须要从新建立:

mv -v /usr/lib/libcap.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so

6.26.2。Libcap内容

安装程序: capsh、getcap getpcaps,setcap
安装库: libcap.so

简短的描述

capsh

壳包装探索和约束功能的支持

getcap

检查文件能力

getpcaps

显示查询过程的能力(es)

libcap

包含操纵POSIX 1003.1 e的库函数功能

setcap

设置文件能力

最后一次更新在

6.27。sed - 4.4

Sed包包含一个流编辑器。

近似创建时间: 0.3业务单位
所需的磁盘空间: 25 MB

6.27.1。Sed的安装

首先解决一个问题在LFS环境和删除一个失败的测试:

sed -i 's/usr/tools/'                 build-aux/help2man sed -i 's/testsuite.panic-tests.sh//' Makefile.in

Sed准备编译:

./configure --prefix=/usr --bindir=/bin

编译包和生成HTML文档:

make make html

测试结果,问题:

make check

安装包和它的文档:

make install install -d -m755           /usr/share/doc/sed-4.4 install -m644 doc/sed.html /usr/share/doc/sed-4.4

6.27.2。对话的内容

安装程序: sed
安装目录: /usr/share/doc/sed - 4.4

简短的描述

sed

在一个经过过滤和转换文本文件

最后一次更新在

6.28。影子- 4.5

影子包包含项目以安全的方式来处理密码。

近似创建时间: 0.2业务单位
所需的磁盘空间: 42 MB

6.28.1。安装的影子

请注意

若是你想执行使用强密码,请参考http://www.linuxfromscratch.org/blfs/view/8.1/postlfs/cracklib.html安装前CrackLib建筑的影子。而后添加 --with-libcrack 配置下面的命令。

禁用的安装 组程序和它的手册页,Coreutils提供了一个更好的版本。也防止安装手册页,已经安装的 man pages包:

sed -i 's/groups$(EXEEXT) //' src/Makefile.in find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \; find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \; find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;

而不是使用默认的 地下室方法,使用更安全 sha - 512密码加密的方法还容许密码超过8个字符。也有必要改变过期了 /var/spool/mail位置阴影使用默认用户邮箱 /var/mail目前使用的位置:

sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \        -e 's@/var/spool/mail@/var/mail@' etc/login.defs

请注意

若是你选择与Cracklib创建阴影的支持,运行如下:

sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs

作一个小改变让默认useradd符合LFS组文件:

sed -i 's/1000/999/' etc/useradd

影子准备编译:

./configure --sysconfdir=/etc --with-group-name-max-length=32

配置选项的含义:

--with-group-name-max-length=32

最大的用户名是32个字符。使最大组名称相同。

编译包:

make

这个包不有一个测试套件。

安装包:

make install

错误的程序移动到适当的位置:

mv -v /usr/bin/passwd /bin

6.28.2。配置的影子

这个包包含工具添加、修改和删除用户和组;设置和修改本身的密码;并执行其余管理任务。对于一个完整的解释 密码阴影意思,看 doc/HOWTO文件打开源代码树中。若是使用影子的支持,请记住,程序,须要验证密码(显示经理、FTP程序pop3守护进程,等等)必须Shadow-compliant。也就是说,他们须要可以处理跟踪密码。

运行如下命令来启用跟踪密码:

pwconv

启用跟踪组密码,运行:

grpconv

影子股票配置 useradd实用程序有几个事项须要一些解释。首先,默认动做 useradd效用是建立用户和组的名称相同的用户。默认的用户ID(UID)和组ID(GID)数量将从1000年开始。这意味着若是你不传递参数 useradd,每一个用户将系统上的一个独特的组的成员。若是这种行为是不可取的,你须要经过 -g参数 useradd。存储在默认的参数/etc/default/useradd文件。您可能须要修改两个参数在此文件来知足您的特定需求。

/etc/default/useradd参数解释

GROUP=1000

该参数集的开始集团所属中使用的数字文件。你能够修改你的欲望。请注意, useradd永远不会重用一个UID或GID。若是使用该参数肯定人数,它将使用下一个可用的数量。还请注意,若是你没有一组1000年第一次在您的系统上使用 useradd没有 -g参数,你会获得一个信息显示在终端上,说: useradd: unknown GID 1000。你能够忽略这个消息将使用和组1000号。

CREATE_MAIL_SPOOL=yes

这个参数会致使 useradd建立一个邮箱文件为新建立的用户。 useradd将使集团拥有这个文件吗 mail集团拥有0660权限。若是你但愿这些邮箱文件不是由 useradd,发出如下命令:

sed -i 's/yes/no/' /etc/default/useradd

6.28.3。设置root密码

为用户选择一个密码 根,经过运行:

passwd root

6.28.4。内容的影子

安装程序: 恰克,chfn,chgpasswd chpasswd,chsh到期,faillog,gpasswd,groupadd,groupdel,groupmems,groupmod,grpck,grpconv,grpunconv,lastlog,登陆,logoutd,newgidmap,newgrp,newuidmap,分类列出,nologin,passwd,pwck,pwconv,pwunconv,sg newgrp(连接),苏,useradd,userdel,usermod,vigr vipw(连接),和vipw
安装目录: /etc/default

简短的描述

恰克

用于更改的密码更改之间的最大天数

chfn

用于更改用户的全名和其余信息

chgpasswd

用于更新组密码以批处理模式

chpasswd

用于更新用户密码以批处理模式

chsh

用于更改用户的默认登陆shell

到期

检查和执行当前的密码过时策略

faillog

用于检查登陆失败的日志,设定一个最大数量的失败以前一个账户阻塞,或重置失败数

gpasswd

用于添加和删除会员和管理员组

groupadd

建立一个组的名字

groupdel

删除给定名称的组

groupmems

容许用户管理他/她本身的组成员列表没有超级用户权限的要求。

groupmod

用于修改给定的组织的名称或GID吗

grpck

验证组文件的完整性 /etc/group /etc/gshadow

grpconv

建立或更新影子组文件从正常组文件

grpunconv

更新 /etc/group /etc/gshadow而后删除后者

lastlog

报告最近登陆的全部用户或一个给定的用户

登陆

使用系统让用户登陆吗

logoutd

守护程序用于执行限制登陆时间和港口吗

newgidmap

用于设置用户名称空间的gid映射

newgrp

是用来改变当前GID在一个登陆会话吗

newuidmap

用于设置用户的uid映射名称空间

分类列出

用于建立或更新整个系列的用户账户

nologin

显示一个消息,一个帐户不可用;它被设计用做默认的shell的帐户被禁用

passwd

是用来改变一个用户或组账户的密码吗

pwck

验证密码文件的完整性 /etc/passwd /etc/shadow

pwconv

建立或更新的影子口令文件正常的密码文件

pwunconv

更新 /etc/passwd /etc/shadow而后删除后者

sg

执行一个给定的命令在用户给定组的GID将

运行一个壳替代用户和组id

useradd

用给定的名称建立一个新用户,或更新后默认的新信息

userdel

删除给定的用户账户

usermod

用于修改给定用户的登陆名称,用户标识(UID)、壳牌、初始群体,主目录等。

vigr

编辑 /etc/group /etc/gshadow文件

vipw

编辑 /etc/passwd /etc/shadow文件

最后一次更新在

6.29。psmisc - 23.1

Psmisc包包含程序显示正在运行的进程的信息。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 4.2 MB

6.29.1。安装Psmisc

Psmisc准备编译:

./configure --prefix=/usr

编译包:

make

这个包不有一个测试套件。

安装包:

make install

最后,移动 killall 熔化炉FHS程序所指定的位置:

mv -v /usr/bin/fuser   /bin mv -v /usr/bin/killall /bin

6.29.2。Psmisc内容

安装程序: 熔化炉,killall peekfd、prtstat pstree,pstree。pstree x11(连接)

简短的描述

熔化炉

报告的进程id(pid)的流程使用给定的文件或文件系统

killall

杀死进程的名字;它发送一个信号,任何给定的命令运行的全部进程

peekfd

Peek在运行的进程的文件描述符,它的PID

prtstat

打印信息的过程

pstree

显示正在运行的进程做为一个树

pstree.x11

同样 pstree在退出前,除了它等待确认

最后一次更新在

6.30。iana -等- 2.30

Iana-Etc包为网络服务和协议提供数据。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 2.3 MB

6.30.1。安装Iana-Etc

下面的命令将IANA提供的原始数据转换为正确的格式 /etc/protocols /etc/services数据文件:

make

这个包不有一个测试套件。

安装包:

make install

6.30.2。Iana-Etc内容

安装文件: /etc/protocols和/ etc / services

简短的描述

/etc/protocols

描述了各类DARPA互联网协议,可从TCP / IP子系统

/etc/services

提供了一个友好之间的映射为互联网服务文本名称,及其潜在的分配的端口号和协议类型

最后一次更新在

6.31。Bison-3.0.4

野牛包包含一个解析器生成器。

近似创建时间: 0.3业务单位
所需的磁盘空间: 32 MB

6.31.1。安装的野牛

野牛准备编译:

./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4

编译包:

make

之间有一个环形依赖野牛和flex的检查。若是须要的话,在安装flex在下一节中,野牛检查能够与运行 作检查。三个测试lalr1有关。cc失败缘由未知。

安装包:

make install

6.31.2。内容的野牛

安装程序: 野牛和yacc
安装库: liby.a
安装目录: /usr/share/bison

简短的描述

野牛

生成,从一系列的规则,程序分析文本文件的结构;野牛是一个替代Yacc(另外一个编译器编译器)

yacc

一个包装 野牛,这意味着项目仍然打电话 yacc而不是 野牛;它调用 野牛 -y选项

liby

Yacc库包含Yacc-compatible的实现 yyerror main函数;这个库一般不是颇有用,但POSIX须要它

最后一次更新在

6.32。Flex-2.6.4

Flex包包含一个实用程序生成的程序文本的识别模式。

近似创建时间: 0.4业务单位
所需的磁盘空间: 32 MB

6.32.1。安装Flex

首先,修复一个问题介绍了glibc - 2.26:

sed -i "/math.h/a #include <malloc.h>" src/flexdef.h

构建过程假设 help2man程序能够建立可执行的手册页——help选项。这是不存在,因此咱们用一个环境变量来跳过这个过程。如今,准备Flex编译:

HELP2MAN=/tools/bin/true \ ./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.6.4

编译包:

make

测试结果(约0.5单位),问题:

make check

安装包:

make install

不知道几个项目 flex然而,试着运行它的前身, lex。为了支持这些项目,建立一个符号连接 lex运行 flex lex仿真模式:

ln -sv flex /usr/bin/lex

6.32.2。Flex的内容

安装程序: flex,flex + +(flex连接),lex flex(连接)
安装库: libfl。因此libfl_pic.so
安装目录: /usr/share/doc/flex-2.6.4

简短的描述

flex

生成程序的工具在文本识别模式;它容许多功能性指定模式发现的规则,消除须要开发一个专门的程序

flex + +

flex的延伸,用于生成c++代码和类。这是一个符号连接 flex

lex

一个脚本,该脚本运行 flex lex模拟模式

libfl

 flex图书馆

最后一次更新在

6.33。grep - 3.1

Grep搜索包包含项目文件。

近似创建时间: 0.4业务单位
所需的磁盘空间: 29 MB

6.33.1。Grep的安装

Grep准备编译:

./configure --prefix=/usr --bindir=/bin

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.33.2。Grep的内容

安装程序: fgrep egrep,grep

简短的描述

egrep

打印行匹配扩展正则表达式

fgrep

打印行匹配固定字符串的列表

grep

打印行匹配一个基本的正则表达式

最后一次更新在

6.34。bash - 4.4

Bash包包含Bourne-Again壳。

近似创建时间: 2.0业务单位
所需的磁盘空间: 56 MB

6.34.1。Bash的安装

把一些上游修复:

patch -Np1 -i ../bash-4.4-upstream_fixes-1.patch

Bash准备编译:

./configure --prefix=/usr                       \             --docdir=/usr/share/doc/bash-4.4 \             --without-bash-malloc               \             --with-installed-readline

新的配置选项的含义:

--with-installed-readline

这个选项告诉Bash使用 readline图书馆已经安装在系统上,而不是使用本身的readline版本。

编译包:

make

跳过了 “安装包”若是不是运行测试套件。

准备测试,确保 nobody用户能够写入源树:

chown -Rv nobody .

如今,运行测试 nobody用户:

su nobody -s /bin/bash -c "PATH=$PATH make tests"

安装包和移动主要可执行文件 /bin:

make install mv -vf /usr/bin/bash /bin

运行新编译的 bash目前正在执行的程序(取代):

exec /bin/bash --login +h

请注意

使使用的参数 bash过程一个交互式登陆shell,继续禁用散列,这样新项目被发现,由于他们变得可用。

6.34.2。Bash的内容

安装程序: bash、bashbug和sh(连接到bash)
安装目录: /usr/share/doc/bash - 4.4

简短的描述

bash

一个普遍使用的命令解释器;它执行许多类型的扩展和替换给定的命令行执行前,从而使这一翻译一个强大的工具

bashbug

一个shell脚本,以帮助用户组合和邮件标准格式化的bug报告有关 bash

上海

一个符号连接 bash程序;当调用 上海, bash试图模仿的创业行为的历史版本 上海尽量,符合POSIX标准

最后一次更新在

6.35。Libtool-2.4.6

Libtool包包含GNU通用库支持脚本。它包装在一致的使用共享库的复杂性,便携式接口。

近似创建时间: 1.8业务单位
所需的磁盘空间: 43个MB

6.35.1。安装Libtool

Libtool准备编译:

./configure --prefix=/usr

编译包:

make

测试结果(约11.0单位),问题:

make check

请注意

测试时间libtool能够与多个核心ibe系统上的显著减小。为此,添加 TESTSUITEFLAGS = - j < N >上面的线。例如,使用阁下能够减小测试时间60%以上。

5测试已知失败LFS构建环境因为循环依赖,但全部测试经过,若是automake安装后从新核对。

安装包:

make install

6.35.2。Libtool内容

安装程序: libtool和libtoolize
安装库: libltdl.so
安装目录: /usr/include/libltdl和/usr/share/libtool

简短的描述

libtool

提供了广义图书馆建筑的支持服务

libtoolize

提供了一种标准方法来添加 libtool支持一个包

libltdl

隐藏的各类困难dlopen库

最后一次更新在

6.36。同时- 1.13

同时包包含GNU数据库管理器。这是一个数据库函数库,使用可扩展散列和工做相似于标准的UNIX dbm。图书馆提供了存储键/数据对原语,搜索和检索数据的键和删除键及其数据。

近似创建时间: 0.1业务单位
所需的磁盘空间: 10 MB

6.36.1。同时安装

同时准备编译:

./configure --prefix=/usr \             --disable-static \             --enable-libgdbm-compat

配置选项的含义:

--enable-libgdbm-compat

这个开关使libgdbm兼容性图书馆建成,一些包之外的LFS可能须要它提供的老DBM的例程。

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.36.2。内容的同时

安装程序: gdbm_dump、gdbm_load gdbmtool
安装库: libgdbm。因此libgdbm_compat.so

简短的描述

gdbm_dump

同时数据库转储到一个文件

gdbm_load

再现同时数据库转储文件

gdbmtool

测试和修改同时数据库

libgdbm

包含函数来操纵一个散列数据库

libgdbm_compat

兼容性包含老DBM函数库

最后一次更新在

6.37。gperf - 3.1

Gperf生成一套完美哈希函数从一个关键。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 5.8 MB

6.37.1。Gperf安装

Gperf准备编译:

./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1

编译包:

make

众所周知,测试失败若是同时运行多个测试(大于1 - j选项)。测试结果,问题:

make -j1 check

安装包:

make install

6.37.2。Gperf内容

安装程序: gperf
安装目录: /usr/share/doc/gperf - 3.1

简短的描述

gperf

生成一个完美散列键设置

最后一次更新在

6.38。Expat-2.2.3

外籍人士包包含用于解析XML面向流的C库。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 9.5 MB

6.38.1。安装的外籍人士

首先解决一个问题在LFS regession测试环境:

sed -i 's|usr/bin/env |bin/|' run.sh.in

外籍人士准备编译:

./configure --prefix=/usr --disable-static

编译包:

make

测试结果,问题:

make check

安装包:

make install

若是须要,安装文档:

install -v -dm755 /usr/share/doc/expat-2.2.3 install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.2.3

6.38.2。外籍人士的内容

安装程序: xmlwf
安装库: libexpat.so
安装目录: /usr/share/doc/expat-2.2.3

简短的描述

xmlwf

是一个非验证工具来检查是否格式良好的XML文档吗

libexpat

包含解析XML的API函数

最后一次更新在

6.39。Inetutils-1.9.4

Inetutils包包含项目基本网络。

近似创建时间: 0.3业务单位
所需的磁盘空间: 27 MB

6.39.1。安装Inetutils

Inetutils准备编译:

./configure --prefix=/usr        \             --localstatedir=/var \             --disable-logger     \             --disable-whois      \             --disable-rcp        \             --disable-rexec      \             --disable-rlogin     \             --disable-rsh        \             --disable-servers

配置选项的含义:

--disable-logger

这个选项能够防止Inetutils安装 日志记录器计划,该脚本使用消息传递到系统日志守护进程。不要���装它,由于Util-linux安装最新版本。

--disable-whois

这个选项禁用Inetutils的建筑 域名查询服务客户端,这是过期了。更好的说明 域名查询服务BLFS客户机的书。并

--disable-r*

这些参数禁用建筑不该使用过期的项目,因为安全问题。这些程序所提供的功能能够提供的 opensshBLFS包的书。并

--disable-servers

这将禁止安装的各类网络服务器做为Inetutils包的一部分。这些服务器在基本的LFS系统被认为是不合适的。有些人天生没有安全感,只考虑安全可信的网络。注意,更好的替代品可供这些服务器。

编译包:

make

测试结果,问题:

make check

请注意

一个测试,libl。sh初始chroot环境中可能会失败,但会经过若是LFS系统完成后的测试运行。

安装包:

make install

移动一些程序,因此他们若是是可用的 /usr没法访问:

mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin mv -v /usr/bin/ifconfig /sbin

6.39.2。Inetutils内容

安装程序: dnsdomainname、ftp、ifconfig、主机名平,ping6,说话,telnet,tftp和路由跟踪

简短的描述

dnsdomainname

显示系统的DNS域名

ftp

文件传输协议的程序吗

主机名

报告或设置主机的名称

ifconfig

管理网络接口

发送回应请求包和报告回复花多长时间

ping6

的一个版本 IPv6网络

说话

用于与其余用户聊天吗

远程登陆

一个接口的TELNET协议

tftp

一个简单的文件传输程序

traceroute

痕迹的路线你包从主机到另外一个网络上的主机,显示全部中间跳(网关)

最后一次更新在

6.40。Perl-5.26.0

Perl包包含实际提取和报告语言。

近似创建时间: 8.6业务单位
所需的磁盘空间: 257 MB

6.40.1。安装Perl

首先建立一个基本的 /etc/hosts文件中引用一个Perl的配置文件以及可选的测试套件:

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

如今这个版本的Perl构建压缩::生::Zlib压缩::生:BZip2模块。默认状况下Perl将使用一个内部来源构建的副本。发出如下命令,以便Perl将使用库安装在系统:

export BUILD_ZLIB=False export BUILD_BZIP2=0

有彻底控制Perl是设置的方式,你能够删除 “des”选择从下面的命令和精心挑选的方式构建这个包。此外,用下面的命令同样,使用Perl自动侦测的违约:

sh Configure -des -Dprefix=/usr                 \                   -Dvendorprefix=/usr           \                   -Dman1dir=/usr/share/man/man1 \                   -Dman3dir=/usr/share/man/man3 \                   -Dpager="/usr/bin/less -isR"  \                   -Duseshrplib                  \                   -Dusethreads

配置选项的含义:

-Dvendorprefix=/usr

这样能够确保 perl知道如何告诉包他们应该安装perl模块。

-Dpager="/usr/bin/less -isR"

这将确保 less而不是使用 more.

-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3

自从Groff还没有安装, 配置认为咱们不但愿Perl的手册页。发行这些参数覆盖这一决定。

-Duseshrplib

创建一个共享libperl所需的一些perl模块。

-Dusethreads

perl构建支持线程。

编译包:

make

测试结果(大约2.5全局的问题:

make -k test

请注意

一些测试相关zlib将失败归因于使用zlib而不是内部的系统版本的版本。

安装包和清理:

make install unset BUILD_ZLIB BUILD_BZIP2

6.40.2。Perl的内容

安装程序: c2ph,corelist,cpan enc2xs、encguess h2ph,h2xs,instmodsh,json_pp,libnetcfg,perl,perl5.26.0 perl(硬连接),perlbug,perldoc,perlivp,perlthanks perlbug(硬连接),piconv,pl2pm,pod2html,pod2man,pod2text,pod2usage,podchecker,podselect,证实,pstruct c2ph(硬连接),ptar,ptardiff,ptargrep,shasum,splain xsubpp,zipdetails
安装库: 不少都不能被列在这里
安装目录: /usr/lib/perl5

简短的描述

c2ph

转储C结构的生成 cc - g - s

corelist

一个命令行前端模块::CoreList

cpan

与综合Perl档案网络交互(CPAN)从命令行

enc2xs

构建一个Perl扩展编码模块从Unicode字符映射或Tcl编码文件

encguess

猜一个或多个文件的编码类型

h2ph

转换 .hC头文件 .phPerl的头文件

h2xs

转换 .hPerl扩展C头文件

instmodsh

Shell脚本检查安装Perl模块,甚至能够从一个安装模块建立一个tarball

json_pp

在特定的输入和输出格式之间转换数据

libnetcfg

可用于配置 libnetPerl模块

perl

结合C的一些最好的特性, sed, awk 上海成一个单一的瑞士军队的语言

perl5.26.0

一个硬连接 perl

perlbug

用于生成错误报告关于Perl或随之而来的模块,和邮件

perldoc

显示一块pod格式的文档中嵌入Perl安装树或一个Perl脚本

perlivp

Perl安装验证过程;它能够用来验证Perl和图书馆已正确安装

perlthanks

用于生成谢谢消息邮件Perl开发人员

piconv

一个Perl版本的字符编码转换器 iconv

pl2pm

一个粗略的Perl4转换的工具 .pl文件到Perl5 .pm模块

pod2html

将文件从pod格式转换为HTML格式

pod2man

转换数据格式* roff输入仓

pod2text

圆荚体数据转换为格式化的ASCII文本

pod2usage

从嵌入式pod文档打印使用消息文件

podchecker

检查pod格式文档文件的语法

podselect

显示选中的部分pod文档

证实

命令行工具对测试:运行测试:利用模块

pstruct

转储C结构的生成 cc - g - s刺穿了

ptar

一个 焦油例如用Perl编写的程序

ptardiff

一个Perl程序,比较与unextracted提取档案

ptargrep

一个Perl程序,适用于模式匹配在tar存档文件的内容

shasum

打印或检查沙校验和

splain

Perl用于力详细预警诊断

xsubpp

将Perl XS代码转换成C代码

zipdetails

显示一个Zip文件的内部结构的详细信息

最后一次更新在

6.41。XML::解析器- 2.44

XML::解析器模块是一个Perl接口詹姆斯克拉克的XML解析器,外籍人士。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 2.0 MB

6.41.1。安装XML::解析器

准备XML::解析器进行编译:

perl Makefile.PL

编译包:

make

测试结果,问题:

make test

安装包:

make install

6.41.2。内容的XML::解析器

安装模块: Expat.so

简短的描述

Expat

提供Perl外籍接口

最后一次更新在

6.42。Intltool-0.51.0

Intltool是一个国际化的工具用于从源文件中提取可翻译字符串。

近似创建时间: 小于0.1业务单位
所需的磁盘空间: 1.5 MB

6.42.1。安装Intltool

第一次修复一个警告是由perl - 5.22及之后:

sed -i 's:\\\${:\\\$\\{:' intltool-update.in

Intltool准备编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO

6.42.2。Intltool内容

安装程序: intltool-extract、intltool-merge intltool-prepare、intltool-update intltoolize
安装目录: /usr/share/doc/intltool-0.51.0和/usr/share/intltool

简短的描述

intltoolize

准备一个包使用intltool

intltool-extract

生成头文件能够理解 gettext

intltool-merge

合并字符串翻译成各类文件类型

intltool-prepare

更新文件和合并他们的翻译文件

intltool-update

更新订单模板文件和合并的翻译

最后一次更新在

6.43。autoconf - 2.69

Autoconf包包含项目生产shell脚本能够自动配置源代码。

近似创建时间: 小于0.1业务单位(约3.3单位与测试)
所需的磁盘空间: 17.3 MB

6.43.1。安装Autoconf

Autoconf准备编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

这须要很长时间,大约3.3单位。此外,一些测试是使用Automake的跳过。完整的测试覆盖率,Autoconf Automake已经安装后能够从新测试。此外,两个测试失败因为libtool-2.4.3后来的变化。

请注意

autoconf的测试时间与多核系统能够显著减小。为此,添加 TESTSUITEFLAGS = - j < N >上面的线。例如,使用阁下能够减小测试时间60%以上。

安装包:

make install

6.43.2。Autoconf的内容

安装程序: autoconf、autoheader autom4te autoreconf,自动扫描,自动更新,ifnames
安装目录: /usr/share/autoconf

简短的描述

autoconf

生产shell脚本,自动配置软件源代码包,以适应各类各样的类unix系统;配置脚本产生不须要独立运行它们 autoconf程序

autoheader

一个工具用于建立模板文件的C #定义配置使用的语句

autom4te

一个包装器M4宏处理器

autoreconf

自动运行 autoconf, autoheader, aclocal, automake, gettextize, libtoolize以正确的顺序更改时节省时间 autoconfautomake模板文件

自动扫描

有助于建立一个 configure.in申请一个软件包;检查源文件目录树,他们寻找共同的可移植性问题,并建立一个 configure.scan文件,做为初步configure.in文件包

自动更新

修改一个 configure.in文件还称 autoconf宏的旧名称使用当前宏的名字

ifnames

有助于写做时 configure.in一个软件包文件;它打印C预处理器的标识符包使用条件(若是一个包已经设置有可移植性,这个程序能够帮助肯定 配置须要检查。它也能够填补的空白 configure.in生成的文件 自动扫描.]

最后一次更新在

6.44。Automake-1.15.1

Automake包包含使用Autoconf的程序生成makefile。

近似创建时间: 小于0.1业务单位(约8.5单位与测试)
所需的磁盘空间: 110 MB

6.44.1。安装Automake

Automake准备编译:

./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15.1

编译包:

make

有一些测试,错误连接到错误的flex版本的库,因此咱们暂时解决这个问题。同时,使用阁下让选项加速测试,即便在系统只有一个处理器,因为内部我的测试延迟。测试结果,问题:

sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh make -j4 check

已知三个测试失败的LFS环境:check12。sh,subobj。sh,check12-w.sh。

安装包:

make install

6.44.2。Automake的内容

安装程序: aclocal aclocal - 1.15(硬与aclocal),automake,automake - 1.15(硬与automake)
安装目录: /usr/share/automake /usr/share/aclocal - 1.15——1.15,/usr/share/doc/automake-1.15.1

简短的描述

aclocal

生成 aclocal.m4基于内容的文件 configure.in文件

aclocal - 1.15

一个硬连接 aclocal

automake

自动生成的工具 Makefile.in文件从 Makefile.am文件(建立的全部 Makefile.in文件包,在顶级目录中运行这个程序。经过扫描 configure.in每一个适当的文件时,它将自动发现 Makefile.am并生成相应的文件 Makefile.in文件。)

automake - 1.15

一个硬连接 automake

最后一次更新在

6.45。Xz-5.2.3

Xz包包含压缩和解压文件的程序。它提供了功能lzma和更新的xz压缩格式。压缩的文本文件 xz产生一个更好的压缩比与传统的比例 gzip bzip2命令。

近似创建时间: 0.2业务单位
所需的磁盘空间: 15 MB

6.45.1。安装Xz

Xz准备编译:

./configure --prefix=/usr    \             --disable-static \             --docdir=/usr/share/doc/xz-5.2.3

编译包:

make

测试结果,问题:

make check

安装包和确保全部必要的文件是正确的目录:

make install mv -v   /usr/bin/{lzma,unlzma,lzcat,xz,unxz,xzcat} /bin mv -v /usr/lib/liblzma.so.* /lib ln -svf ../../lib/$(readlink /usr/lib/liblzma.so) /usr/lib/liblzma.so

6.45.2。Xz内容

安装程序: xz lzcat(连接),lzcmp xzdiff(连接),lzdiff xzdiff(连接),lzegrep xzgrep(连接),lzfgrep xzgrep(连接),lzgrep xzgrep(连接),lzless xzless(连接),lzma xz(连接),lzmadec,lzmainfo,lzmore xzmore(连接),unlzma xz(连接),unxz xz(连接),xz,xzcat xz(连接),xzcmp xzdiff(连接),xzdec,xzdiff,xzegrep xzgrep(连接),xzfgrep xzgrep(连接),xzgrep xzless,xzmore
安装库: liblzma.so
安装目录: /usr/include/lzma和/usr/share/doc/xz-5.2.3

简短的描述

lzcat

解压缩到标准输出

lzcmp

运行 cmp在LZMA压缩文件

lzdiff

运行 diff在LZMA压缩文件

lzegrep

运行 egrep在LZMA压缩文件

lzfgrep

运行 fgrep在LZMA压缩文件

lzgrep

运行 grep在LZMA压缩文件

lzless

运行 在LZMA压缩文件

lzma

使用LZMA压缩或解压缩文件格式

lzmadec

一个小而快LZMA压缩文件的解码器

lzmainfo

显示的信息存储在LZMA压缩文件头

lzmore

运行 更多在LZMA压缩文件

unlzma

解压缩文件使用LZMA格式

unxz

解压缩文件使用XZ格式

xz

使用XZ压缩或解压缩文件格式

xzcat

解压缩到标准输出

xzcmp

运行 cmp在XZ压缩文件

xzdec

一个小而快XZ压缩文件的解码器

xzdiff

运行 diff在XZ压缩文件

xzegrep

运行 egrep在XZ压缩文件的文件

xzfgrep

运行 fgrep在XZ压缩文件

xzgrep

运行 grep在XZ压缩文件

xzless

运行 在XZ压缩文件

xzmore

运行 更多在XZ压缩文件

liblzma

图书馆实现无损,块分类数据压缩,使用Lempel-Ziv-Markov链算法

最后一次更新在

6.46。Kmod-24

Kmod包包含加载内核模块的库和工具

近似创建时间: 0.1业务单位
所需的磁盘空间: 12 MB

6.46.1。安装Kmod

Kmod准备编译:

./configure --prefix=/usr          \             --bindir=/bin          \             --sysconfdir=/etc      \             --with-rootlibdir=/lib \             --with-xz              \             --with-zlib

配置选项的含义:

--with-xz, --with-zlib

这些选项启用Kmod处理压缩内核模块。

--with-rootlibdir=/lib

这个选项能够确保不一样图书馆相关文件放置在正确的目录。

编译包:

make

这个包有一个测试套件,不能够在LFS chroot环境中运行。至少git项目须要和几个测试将不会运行以外的git存储库。

安装包,并为兼容Module-Init-Tools建立符号连接(之前的包处理Linux内核模块):

make install  for target in depmod insmod lsmod modinfo modprobe rmmod; do   ln -sfv ../bin/kmod /sbin/$target done  ln -sfv kmod /bin/lsmod

6.46.2。Kmod内容

安装程序: kmod depmod(连接),insmod(kmod连接),kmod,lsmod kmod(连接),modinfo kmod(连接),modprobe(kmod连接),rmmod(kmod连接)
安装库: libkmod.so

简短的描述

depmod

建立一个依赖文件符号的基础上,发现现有的模块;这种依赖性文件使用 modprobe自动负载所需的模块

insmod

安装一个可加载模块运行的内核

kmod

内核模块加载和卸载

lsmod

列出当前加载的模块

modinfo

检查一个对象文件与一个内核模块和显示,它能够收集的任何信息

modprobe

使用一个依赖文件,建立的 depmod自动加载相关的模块

rmmod

卸载模块从正在运行的内核

libkmod

这个库被其余程序使用内核模块加载和卸载

最后一次更新在

6.47。Gettext-0.19.8.1

国际化和本地化的Gettext包包含公用事业。这些容许编译程序与NLS(本地语言支持),使他们可以输出消息在用户的母语。

近似创建时间: 2.4业务单位
所需的磁盘空间: 199 MB

6.47.1。安装Gettext

首先,抑制两个调用test-lock永远在一些机器上能够循环:

sed -i '/^TESTS =/d' gettext-runtime/tests/Makefile.in && sed -i 's/test-lock..EXEEXT.//' gettext-tools/gnulib-tests/Makefile.in

Gettext准备编译:

./configure --prefix=/usr    \             --disable-static \             --docdir=/usr/share/doc/gettext-0.19.8.1

编译包:

make

测试结果(这须要很长时间,大约在布),问题:

make check

安装包:

make install chmod -v 0755 /usr/lib/preloadable_libintl.so

6.47.2。Gettext的内容

安装程序: autopoint、envsubst gettext,gettext。sh、gettextize msgattrib,msgcat、msgcmp msgcomm,msgconv,msgen,msgexec,msgfilter,msgfmt,msggrep,msginit,msgmerge,msgunfmt,msguniq,ngettext recode-sr-latin,xgettext
安装库: libasprintf。因此,libgettextlib。因此,libgettextpo。因此,libgettextsrc。因此,preloadable_libintl.so
安装目录: /usr/lib/gettext、/usr/share/doc/gettext-0.19.8.1 /usr/share/gettext

简短的描述

autopoint

标准Gettext基础设施文件复制到一个源包中

envsubst

替代品在shell环境变量格式字符串

gettext

将天然语言信息转化为用户的语言经过查找翻译的信息目录

gettext.sh

主要做为gettext的shell函数库

gettextize

全部标准Gettext文件复制到顶级目录的一个包开始国际化

msgattrib

过滤器的消息翻译目录根据它们的属性和操做的属性

msgcat

链接和合并 .po文件

msgcmp

比较两个 .po文件检查都包含相同的一组是否字符串

msgcomm

发现的常见的消息 .po文件

msgconv

将一个翻译目录转换为不一样的字符编码

msgen

建立一个英语翻译目录

msgexec

一个命令适用于全部翻译的翻译目录

msgfilter

一个过滤器适用于全部翻译的翻译目录

msgfmt

从翻译目录生成一个二进制消息目录

msggrep

提取全部消息的翻译目录匹配一个给定的模式或属于一些给定的源文件

msginit

建立一个新的 .po文件,初始化值的元信息从用户的环境

msgmerge

结合了两种原始翻译成一个单一的文件中

msgunfmt

反编译的二进制消息目录到原始的翻译文本

msguniq

结合重复的翻译在翻译目录

ngettext

显示的母语翻译的文本消息的语法形式取决于数量

recode-sr-latin

从新编码塞尔维亚斯拉夫字母到拉丁文本的脚本

xgettext

从给定的源文件提取可翻译消息行第一个翻译模板

libasprintf

定义了 autosprintf类,这使得C格式化输出例程可用在c++程序中,��用 <字符串>字符串和 <iostream>

libgettextlib

一个私人图书馆,其中包含了常规使用的各类Gettext项目;这些都不是用于通常用途

libgettextpo

用于编写专门的程序过程 .po文件;这个库时使用的标准应用程序附带Gettext(如 msgcomm, msgcmp, msgattrib, msgen)将是不够的

libgettextsrc

一个私人图书馆,其中包含了常规使用的各类Gettext项目;这些都不是用于通常用途

preloadable_libintl

一个库,旨在使用LD_PRELOAD助攻 libintl在日志翻译信息

最后一次更新在

6.48。Procps-ng-3.3.12

Procps-ng包包含项目监控过程。

近似创建时间: 0.1业务单位
所需的磁盘空间: 14 MB

6.48.1。安装Procps-ng

如今准备procps-ng编译:

./configure --prefix=/usr                            \             --exec-prefix=                           \             --libdir=/usr/lib                        \             --docdir=/usr/share/doc/procps-ng-3.3.12 \             --disable-static                         \             --disable-kill

配置选项的含义:

--disable-kill

这个开关禁用建设 杀了由Util-linux命令将安装包。

编译包:

make

LFS的测试套件须要一些自定义的修改。删除一个失败的测试脚本时不使用tty设备和修复两人。要运行测试套件,运行如下命令:

sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp sed -i '/set tty/d' testsuite/pkill.test/pkill.exp rm testsuite/pgrep.test/pgrep.exp make check

ps测试可能会失败,可是若是测试是经过从新运行第六章的末尾。

安装包:

make install

最后,必要的库移动到一个位置,若是能够找到 /usr不是安装。

mv -v /usr/lib/libprocps.so.* /lib ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so

6.48.2。Procps-ng内容

安装程序: 免费,pgrep、pidof pkill pmap,ps,pwdx,slabtop,sysctl,tload,顶部,正常运行时间,vmstat,w,手表
安装库: libprocps.so
安装目录: /usr/include/proc和/usr/share/doc/procps-ng-3.3.12

简短的描述

免费的

报告的和用去的内存(物理和交换内存)的系统

pgrep

查找过程基于他们的名字和其余属性

pidof

报告给出的pid程序

pkill

信号流程基于他们的名字和其余属性

pmap

报告给出的内存映射的过程

ps

列出了当前运行的进程

pwdx

报告进程的当前工做目录

slabtop

显示详细的实时内核耳光缓存信息

sysctl

在运行时修改内核参数

tload

输出当前系统平均负载图

顶部

显示一个列表最CPU密集型的过程;它提供了一个持续的观察实时处理器活动

正常运行时间

报告系统已运行多长时间,多少用户登陆,系统平均负载

vmstat

报告虚拟内存统计信息,让信息流程、内存、分页、块输入/输出(IO),陷阱和CPU活动

w

显示当前登陆的用户,以及从何时开始

反复运行一个给定的命令,显示第一屏的输出;这容许用户观看输出随时间变化

libprocps

包含函数所使用的大部分程序在这个包中

最后一次更新在

6.49。E2fsprogs-1.43.5

E2fsprogs包包含了实用程序来处理 ext2文件系统。它也支持的 ext3 ext4日志文件系统。

近似创建时间: 3.3业务单位
所需的磁盘空间: 58 MB

6.49.1。安装E2fsprogs

E2fsprogs文档建议包在源代码树的子目录:

mkdir -v build cd build

E2fsprogs准备编译:

LIBS=-L/tools/lib                    \ CFLAGS=-I/tools/include              \ PKG_CONFIG_PATH=/tools/lib/pkgconfig \ ../configure --prefix=/usr           \              --bindir=/bin           \              --with-root-prefix=""   \              --enable-elf-shlibs     \              --disable-libblkid      \              --disable-libuuid       \              --disable-uuidd         \              --disable-fsck

环境变量的意义和配置选项:

PKG_CONFIG_PATH, LIBS, CFLAGS

这些变量使e2fsprogs建成使用5.34节,“Util-linux-2.30.1”包了。

--with-root-prefix="" --bindir=/bin

(如某些项目 e2fsck程序)是必不可少的项目。例如,当 /usr不安装,这些项目仍然须要可用。他们属于目录 /lib /sbin。若是这个选项不是经过E2fsprogs的配置、程序安装到 /usr目录中。

--enable-elf-shlibs

这将建立一些程序在这个包中使用的共享库。

--disable-*

这能够防止E2fsprogs构建和安装 libuuid libblkid库, uuidd守护进程, fsck包装,如Util-Linux安装最新版本。

编译包:

make

创建和运行测试套件,咱们须要首先联系一些库从/工具/ lib位置测试程序看起来。运行测试,问题:

ln -sfv /tools/lib/lib{blk,uu}id.so.1 lib make LD_LIBRARY_PATH=/tools/lib check

的一个E2fsprogs测试将试图分配256 MB的内存。若是你没有比这更多的RAM,务必使充分交换空间测试。看到2.5节,“分区上建立一个文件系统”2.7节,“安装新的分区”有关建立并启用交换空间。

安装二进制文件、文档和共享库:

make install

安装静态库和标题:

make install-libs

让安装的静态库可写的调试符号能够删除后:

chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a

这个包安装gzip .info文件但不更新系统 dir文件。解压缩这个文件,而后更新系统 dir使用如下命令文件。

gunzip -v /usr/share/info/libext2fs.info.gz install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info

若是须要,建立并安装一些额外的文档经过发出如下命令:

makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo install -v -m644 doc/com_err.info /usr/share/info install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info

6.49.2。E2fsprogs内容

安装程序: debugfs badblocks、chattr compile_et,dumpe2fs,e2freefrag,e2fsck,e2image,e2label,e2undo,e4defrag,filefrag,fsck。ext2,fsck。ext3,fsck。ext4,fsck。ext4dev、logsave lsattr、mk_cmds mke2fs,mkfs。ext2,mkfs。ext3,mkfs。ext4,mkfs。mklost +发现,ext4dev resize2fs,和tune2fs
安装库: libcom_err。因此,libe2p。因此,libext2fs。因此,libss.so
安装目录: /usr/include/e2p、/usr/include/et /usr/include/ext2fs、/usr/include/ss /usr/share/et,/usr/share/ss

简短的描述

badblocks

搜索一个设备(一般是一个磁盘分区)坏块

chattr

在一个变化的属性文件 ext2文件系统;它也改变 ext3文件系统的日志记录版本 ext2文件系统

compile_et

一个错误表编译器;它将错误代码的表名称和消息转换成C源文件适合使用 com_err图书馆

debugfs

一个文件系统调试器;它能够用来检查和改变的状态 ext2文件系统

dumpe2fs

打印的超级块和块组信息文件系统出如今一个给定的设备

e2freefrag

自由空间碎片信息报告

e2fsck

是用来检查,能够修复吗 ext2文件系统和 ext3文件系统

e2image

用于保存重要吗 ext2文件系统数据到一个文件

e2label

显示或更改文件系统标签 ext2文件系统出如今一个给定的设备

e2undo

回放的undo日志undo_log ext2或ext3 / ext4文件系统上发现一个设备(这能够用于e2fsprogs撤销操做失败的计划。)

e4defrag

在线碎片整理程序ext4文件系统

filefrag

报告多么支离破碎的特定文件

fsck.ext2

默认状况下检查 ext2文件系统和是一个硬连接 e2fsck

fsck.ext3

默认状况下检查 ext3文件系统和是一个硬连接 e2fsck

fsck.ext4

默认状况下检查 ext4文件系统和是一个硬连接 e2fsck

fsck.ext4dev

默认状况下检查 ext4开发文件系统和一个硬连接 e2fsck

logsave

将一个命令的输出保存在一个日志文件

lsattr

列出了第二个扩展文件系统上的文件的属性

mk_cmds

将表的命令名称和帮助信息转换成C源文件适合使用 libss子系统的图书馆

mke2fs

建立一个 ext2 ext3文件系统在给定的设��

mkfs.ext2

在默认状况下建立 ext2文件系统和是一个硬连接 mke2fs

mkfs.ext3

在默认状况下建立 ext3文件系统和是一个硬连接 mke2fs

mkfs.ext4

在默认状况下建立 ext4文件系统和是一个硬连接 mke2fs

mkfs.ext4dev

在默认状况下建立 ext4开发文件系统和一个硬连接 mke2fs

mklost +发现

用于建立一个 lost+found在一个目录 ext2文件系统;这一策略预先分配磁盘块这个目录来减轻的任务 e2fsck

resize2fs

能够用来扩大或缩小 ext2文件系统

tune2fs

调整可调参数对一个文件系统 ext2文件系统

libcom_err

常见的错误显示例程

libe2p

所使用的 dumpe2fs, chattr, lsattr

libext2fs

包含程序让用户级程序操做 ext2文件系统

libss

所使用的 debugfs

最后一次更新在

6.50。coreutils - 8.27

Coreutils包包含实用程序显示和设置基本制度特征。

近似创建时间: 2.4业务单位
所需的磁盘空间: 171 MB

6.50.1。安装Coreutils

从Coreutils POSIX要求程序即便在多字节语言环境正确识别字符边界。如下补丁修复这种违规行为和其余国际化bug。

patch -Np1 -i ../coreutils-8.27-i18n-1.patch

请注意

在过去,许多bug被发如今这个补丁。报告新的bug Coreutils维护人员时,请先检查,若是他们没有这个补丁是能够重现的。

抑制一个测试在一些机器上永远循环:

sed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mk

如今准备Coreutils编译:

FORCE_UNSAFE_CONFIGURE=1 ./configure \             --prefix=/usr            \             --enable-no-install-program=kill,uptime

配置选项的含义:

FORCE_UNSAFE_CONFIGURE=1

这个环境变量容许包创建做为根用户。

--enable-no-install-program=kill,uptime

这个开关的目的是防止Coreutils安装二进制文件,稍后将由其余包安装。

编译包:

FORCE_UNSAFE_CONFIGURE=1 make

跳过了 “安装包”若是不是运行测试套件。

如今要运行的测试套件已经准备好了。首先,运行测试,用户是如何运行的 root:

make NON_ROOT_USERNAME=nobody check-root

咱们要运行的测试的 nobody用户。然而,某些测试,要求用户是多个组的成员。这些测试不跳过咱们将添加一个临时的组和用户 nobody它的一部分:

echo "dummy:x:1000:nobody" >> /etc/group

修复一些权限,这样非root用户能够编译和运行测试:

chown -Rv nobody . 

如今运行测试。肯定的路径 su环境包括/工具/ bin。

su nobody -s /bin/bash \           -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"

测试程序test-getlogin和date-debug失败在chroot环境这样一个部分构建的系统环境,可是若是在这一章的结束。

删除临时组:

sed -i '/dummy/d' /etc/group

安装包:

make install

FHS项目移动到指定的地点:

mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin mv -v /usr/bin/chroot /usr/sbin mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8 sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8

一些依靠LFS-Bootscripts的脚本包 头, 睡眠, 不错的。做为 /usr可能不可用在引导的早期阶段,这些二进制文件须要在根分区:

mv -v /usr/bin/{head,sleep,nice,test,[} /bin

6.50.2。Coreutils内容

安装程序: [base32 base64,basename,猫,chcon,chgrp,chmod,乔恩,chroot,校验和,通信,cp,csplit,削减,日期,dd,df,dir,dircolors,目录名,du,呼应,env,扩张,expr,因素,假,fmt,折叠,团体,头,hostid,id、安装、链接、连接、ln,logname,ls,md5sum,mkdir,mkfifo,mknod,mktemp,mv,不错,问,nohup,nproc,numfmt,开发部,粘贴,pathchk,小指,公关,printenv,printf,ptx,pwd,指向,realpath,rm,删除目录,runcon,seq,sha1sum,sha224sum,sha256sum,sha384sum,sha512sum,分解,shuf,睡眠,排序,分裂,统计,stdbuf,stty,和,同步,tac,尾巴,三通,测试、超时、触摸、tr,真的,截断,tsort,tty,uname,unexpand,uniq,分开,用户,vdir,wc,谁,whoami,是的
安装库: libstdbuf.so
安装目录: /usr/libexec/coreutils

简短的描述

base32

编码和解码数据根据base32规范(RFC 4648)

base64

根据base64编码和解码数据规范(RFC 4648)

basename

带任何路径和一个给定的文件名后缀

链接到标准输出文件

chcon

更改的文件和目录的安全上下文

chgrp

改变了组织的文件和目录的全部权

修改文件权限

改变每一个文件的权限为给定的模式;的模式能够是一个象征性的表示变化使或八进制数表明新的权限

乔恩

改变了用户和/或组的文件和目录的全部权

chroot

与指定的目录运行命令 /目录

校验和

打印循环冗余校验(CRC)每一个指定文件的校验和字节数

通信

比较两个文件排序,输出在三列独特的线条和线条是常见的

cp

拷贝文件

csplit

将给定的文件分为几个新文件,将它们根据给定的模式或行号和输出每一个新文件的字节数

减小

打印部分的线路,选择部分根据给定的字段或位置

日期

在给定的格式显示当前时间,或设置系统日期

dd

拷贝一个文件使用给定的块大小和计数,同时有选择地执行转换

df

报告的可用磁盘空间(使用)在全部挂载文件系统,或者只在文件系统保持选中的文件

dir

列出每一个给定的内容目录(同样的 ls命令)

dircolors

输出命令来设置 LS_COLOR环境变量改变所使用的配色方案 ls

目录名

条目录从文件后缀名

报告的磁盘空间使用的当前目录,由每一个给定的目录(包括全部子目录)或每个给定的文件

回声

显示给定的字符串

env

在修改后的环境中运行一个命令

扩大

将制表符转换为空格

expr

计算表达式

因素

打印全部指定的整数数字的主要因素

什么也不作,但没有成功;它老是退出状态码表示失败

fmt

将段落在给定的文件中

褶皱

包装线在给定的文件中

报告用户的组成员关系

打印前十行(或给定的行数)的每一个文件

hostid

报告的数字标识符(十六进制)主机

id

报告的有效用户ID、组ID和指定的当前用户或用户的组成员关系

安装

拷贝文件,设置他们的许可模式,若是可能的话,他们的全部者和组

加入

链接的线相同的加入字段从两个不一样的文件

连接

用给定的名称建立一个硬连接到一个文件

ln

使硬连接或软(象征性的)文件之间的联系

logname

报告当前用户的登陆名

ls

列出每一个���定目录的内容

md5sum

报告或检查消息摘要5 MD5校验和

mkdir

用给定的名称建立目录

mkfifo

建立先进先出(fifo),“命名管道”的UNIX的说法,用给定的名称

mknod

用给定的名称建立设备节点;设备节点是一个字符特殊文件,一块特殊文件,或一个FIFO

mktemp

建立临时文件以一种安全的方式;在脚本中使用它

mv

移动或重命名文件或目录

不错的

运行一个程序修改调度优先级

数字线从给定的文件

nohup

运行一个命令受禁锢,输出重定向��一个日志文件中

nproc

打印的数量处理单元可用于一个过程

numfmt

将数字转换为或从人类可读的字符串

od

八进制和其余格式的转储文件

粘贴

合并给定的文件,按顺序加入相应的线并排,制表符隔开

pathchk

检查文件名是否有效或可移植

小指

是一个轻量级的手指端;它报道一些给定的用户的信息

公关

分页和columnates文件打印

printenv

打印环境

printf

根据给定的格式打印给定的参数,就像C printf函数

ptx

产生一个交换指数从给定的文件的内容,每一个关键字的上下文

松材线虫病

报告的当前工做目录的名称

指向

报告的价值符号连接

realpath

打印的解决路径

rm

删除文件或目录

删除文件夹

删除目录是空的

runcon

运行一个命令,指定的安全上下文

seq

输出一个数字序列在必定范围内与一个给定的增量

sha1sum

打印或检查160位安全散列算法1(SHA1)校验和

sha224sum

打印或检查224位校验和安全散列算法

sha256sum

打印或检查256位校验和安全散列算法

sha384sum

打印或检查384位校验和安全散列算法

sha512sum

打印或检查512位校验和安全散列算法

分解

覆盖给定的文件屡次与复杂的模式,很难恢复数据

shuf

打乱行文本

睡眠

给定的时间停顿

排序

从给定的文件类型的

分裂

给定文件分割成小块,大小或行数

统计

显示文件或文件系统���状态

stdbuf

运行命令改变缓冲操做的标准流

stty

集或报了结端线设置

总和

为每一个给定的文件打印校验和和块数量

同步

将文件系统缓冲;它迫使改变块磁盘并更新超级块

tac

在反向链接给定的文件

尾巴

打印最后十行(或给定的行数)的每一个文件

三通

从标准输入读取在写标准输出和给定的文件

测试

比较值和检查文件类型

超时

运行一个命令的时间限制

触摸

修改文件时间戳,设置给定文件的访问和修改时间为当前时间;建立文件不存在零长度

tr

翻译、挤压和删除给定的字符从标准输入

真正的

什么也不作,成功;它老是退出状态码表示成功

截断

收缩或扩展一个文件到指定的大小

tsort

执行一个拓扑排序;它写一个彻底有序列表根据给定文件中的部分排序

tty

报告的文件名终端链接到标准输入

uname

报告系统信息

面板折叠

将空格转换为制表符

uniq

丢弃全部但一个连续相同的行

拆开

删除给定的文件

用户

报告当前登陆用户的名称

vdir

是同样的 ls - l

wc

报告的行数,话说,和字节为每一个给定的文件,以及总当多个文件

报告是谁登陆

显示本用户信息

报告与当前有效的用户ID相关联的用户名

是的

重复输出 “y或一个给定的字符串,直到死亡

libstdbuf

所使用的库 stdbuf

最后一次更新在

6.51。你要- 3.6

你要包包含程序显示文件或目录之间的差别。

近似创建时间: 0.4业务单位
所需的磁盘空间: 30 MB

6.51.1。你要安装

你要准备编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install

6.51.2。你要的内容

安装程序: diff,cmp diff3,sdiff

简短的描述

cmp

比较两个文件和报告是否在他们不一样的字节

diff

比较两个文件或目录并报告线在不一样的文件

diff3

比较三个文件

sdiff

合并两个文件和交互式地输出结果

最后一次更新在

6.52。Gawk-4.1.4

呆呆的包包含操纵文本文件的程序。

近似创建时间: 0.3业务单位
所需的磁盘空间: 36 MB

6.52.1。安装呆呆的

准备呆呆的编译:

./configure --prefix=/usr

编译包:

make

测试结果,问题:

make check

安装包:

make install

若是须要,安装文档:

mkdir -v /usr/share/doc/gawk-4.1.4 cp    -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.4

6.52.2。呆呆的内容

安装程序: awk呆呆(连接),呆呆的,gawk-4.1.4,igawk
安装库: filefuncs。因此,:。因此,叉。因此,原地。因此,ordchr。因此,readdir。readfile。因此,revoutput。因此,revtwoway。因此,rwarray。因此,testext。所以,从此
安装目录: /usr/lib/gawk、/usr/libexec/awk /usr/share/awk,/usr/share/doc/gawk-4.1.4

简短的描述

awk

的连接 腼腆的人

腼腆的人

一个程序用于处理文本文件;这是GNU的实现 awk

gawk-4.1.4

一个硬连接 腼腆的人

igawk

给了 腼腆的人包含文件的能力

最后一次更新在

6.53。Findutils-4.6.0

Findutils包包含程序找到文件。这些项目提供了递归搜索目录树和建立、维护和搜索数据库(一般比递归查找更快,可是不可靠,若是数据库最近没有更新)。

近似创建时间: 0.7业务单位
所需的磁盘空间: 48 MB

6.53.1。安装Findutils

首先,抑制一个测试在一些机器上能够永远循环:

sed -i 's/test-lock..EXEEXT.//' tests/Makefile.in

Findutils准备编译:

./configure --prefix=/usr --localstatedir=/var/lib/locate

配置选项的含义:

--localstatedir

这个选项的位置变化 定位数据库在 /var/lib/locateFHS-compliant。

编译包:

make

测试结果,问题:

make check

安装包:

make install

一些依靠LFS-Bootscripts的脚本包 找到。做为 /usr可能不可用在引导的早期阶段,这个项目须要在根分区。的 更新资料库脚本还须要修改正确的显式路径:

mv -v /usr/bin/find /bin sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb

6.53.2。Findutils内容

安装程序: 代码,发现、定位、oldfind更新资料库,xargs

简短的描述

代码

曾用于生产吗 定位数据库;它的祖先 frcode

找到

搜索给定目录树文件匹配指定的标准

定位

经过数据库的文件名搜索和报告的名称包含一个给定的字符串或匹配一个给定的模式

oldfind

旧版本的发现,使用不一样的算法

更新资料库

更新 定位数据库;它会扫描整个文件系统(包括其余文件系统正在安装,除非告知不要),把每一个文件的名字找到到数据库中

xargs

可用于应用给定命令的列表文件

最后一次更新在

6.54。Groff-1.22.3

Groff包包含程序处理和格式化文本。

近似创建时间: 0.4业务单位
所需的磁盘空间: 83 MB

6.54.1。安装Groff

Groff预计环境变量 PAGE包含默认纸张大小。为用户在美国, PAGE=letter是适当的。在其余地方, PAGE=A4可能更合适。而在编译配置默认纸张大小,它能够覆盖后经过呼应 “A4”或“信”到 /etc/papersize文件。

Groff准备编译:

页面=<paper_size>。/ configure——prefix = / usr

这个包不支持并行构建。编译包:

make -j1

这个包不有一个测试套件。

安装包:

make install

6.54.2。Groff内容

安装程序: addftinfo afmtodit,化学,eqn、eqn2graph gdiffmk,glilypond,gperl,gpinyin,grap2graph,入库单,grodvi,groff,groffer,熟料,grolbp,grolj4,gropdf,集团崛起,难看的,hpftodit,indxbib,lkbib,lookbib,mmroff,neqn,nroff,pdfmom,pdfroff,pfbtops,图片,pic2graph,post-grohtml,preconv,pre-grohtml,参考,roff2dvi,roff2html,roff2pdf,roff2ps,roff2text,roff2x,soelim,台,tfmtodit、troff
安装目录: /usr/lib/groff /usr/share/doc/groff-1.22.3,/usr/share/groff

简短的描述

addftinfo

读取troff字体文件并添加一些额外的font-metric使用的信息 groff系统

afmtodit

建立一个使用的字体文件 groff 集团

化学

Groff预处理生产化学结构图

eqn

编译的描述方程嵌入troff文件输入命令所理解 troff

eqn2graph

转换troff EQN(方程)裁剪图像

gdiffmk

标志着groff / nroff / troff文件之间的差别

glilypond

将曲谱用lilypond语言转换成groff语言

gperl

Preprocesor groff,容许添加perl代码进入groff文件

gpinyin

Preprocesor groff,容许添加象汉语拼音进入groff文件。

grap2graph

grap图转换成位图图像出现

入库单

一个 groff预处理器小鬼文件

grodvi

一个司机 groff生产特克斯dvi格式

groff

前端groff文档格式化系统;一般,它运行 troff程序和后处理器适合所选设备

groffer

显示groff X和遥控终端文件和手册页

熟料

读取文件和猜想的 groff选项 -e, -man, -me, -mm, -ms, -p, -s, -t须要打印文件和报告吗 groff命令包括那些选项

grolbp

是一个 groff为佳能CAPSL打印机驱动程序(LBP-4和LBP-8系列激光打印机)

grolj4

是一个司机 groff产生输出PCL5格式适用于惠普激光打印机4打印机

gropdf

翻译GNU的输出 troff为PDF

集团

翻译GNU的输出 troff到PostScript

难看的

翻译GNU的输出 troff成适合typewriter-like设备

hpftodit

建立一个使用的字体文件 groff -Tlj4从一个HP-tagged字体指标文件

indxbib

建立一个反向索引指定的书目数据库,文件使用 请参考, lookbib, lkbib

lkbib

搜索指定书目数据库引用包含密钥和报告发现的任何引用

lookbib

打印标准错误的提示(除非标准输入不是终端),读取一行包含一组从标准输入关键字,搜索指定文件引用的书目数据库包含这些关键词,打印上发现的任何引用标准输出,并重复这个过程,直到结束输入

mmroff

一个简单的预处理 groff

neqn

美国信息交换标准代码格式方程(ASCII)输出

nroff

一个脚���,模拟 nroff命令使用 groff

pdfmom

是一个包装groff,促进生产的PDF文档文件格式与妈妈宏。

pdfroff

使用groff建立pdf文档

pfbtops

翻译PostScript字体 .pfbASCII格式

图片

编译的描述图片嵌入troff或特克斯文件输入命令被特克斯或理解 troff

pic2graph

裁剪图片图转换成图像

post-grohtml

翻译GNU的输出 troff与HTML

preconv

转换编码的输入文件GNU troff理解

pre-grohtml

翻译GNU的输出 troff与HTML

请参考

��一个文件的内容复制到标准输出,除了之间的界线 .[ .]解释为引用,和之间的界限是什么 .R1 .R2解释为命令引用如何处理

roff2dvi

将每一年的文件转换成DVI格式

roff2html

将每一年的文件转换为HTML格式

roff2pdf

将每一年的文件转换成pdf文档

roff2ps

将每一年的文件转换成ps文件

roff2text

将每一年的文件转换成文本文件

roff2x

将每一年的文件转换成其余格式

soelim

读取文件并替换的形式 因此文件提到的内容 文件

资源描述

编译的描述表嵌入troff文件输入命令所理解 troff

tfmtodit

建立一个使用的字体文件 groff -Tdvi

troff

是高度兼容Unix troff;它一般应该使用调用 groff命令,该命令还将运行预处理器和后处理器以适当的顺序和适当的选项

最后一次更新在

6.55。grub - 2.02

GRUB包包含了大统一引导装载程序。

近似创建时间: 0.8业务单位
所需的磁盘空间: 144 MB

6.55.1。安装GRUB

GRUB准备编译:

./configure --prefix=/usr          \             --sbindir=/sbin        \             --sysconfdir=/etc      \             --disable-efiemu       \             --disable-werror

新的配置选项的含义:

--disable-werror

这容许构建完整的警告最近引入的Flex版本。

--disable-efiemu

这个选项最小化是由禁用LFS的特性和测试程序不须要。

编译包:

make

这个包不有一个测试套件。

安装包:

make install

使用GRUB,使你的LFS系统可引导将在讨论8.4节,“使用GRUB引导过程设置”.

6.55.2。GRUB的内容

安装程序: grub-bios-setup、grub-editenv grub-file、grub-fstest grub-glue-efi,grub-install,grub-kbdcomp,grub-macbless,grub-menulst2cfg,grub-mkconfig,grub-mkimage,grub-mklayout,grub-mknetdir,grub-mkpasswd-pbkdf2,grub-mkrelpath,grub-mkrescue,grub-mkstandalone,grub-ofpathname,grub-probe,grub-reboot,grub-render-label,grub-script-check,grub-set-default grub-sparc64-setup,grub-syslinux2cfg
安装目录: /usr/lib/grub,/etc/grub.d,/usr/share/grub和引导/ grub(grub-install首次运行时)

简短的描述

grub-bios-setup

是一个辅助程序grub-install吗

grub-editenv

一个工具来编辑环境

grub-file

检查是否指定类型的文件。

grub-fstest

工具来调试文件系统驱动程序

grub-glue-efi

流程ia32和amd64 EFI图像和胶水他们根据苹果的格式。

grub-install

在您的驱动器安装GRUB

grub-kbdcomp

脚本,该脚本将xkb布局成一个被GRUB

grub-macbless

苹果样式或HFS +祝福在HFS文件

grub-menulst2cfg

转换一个GRUB Legacy menu.lst成一个 grub.cfg使用GRUB 2

grub-mkconfig

生成一个grub配置文件

grub-mkimage

作一个GRUB启动映像

grub-mklayout

生成一个GRUB键盘布局文件