Linux From Scratch

Version 7.7-systemd

创建者：Gerard Beekmans

编辑者：Matthew Burgess 和 Armin K.

翻译团队：LCTT 译者/校对：wxy, ictlyh, dongfengweixiao, zpl1025, H-mudcup, Yuking-net, kevinSJ

Copyright ? 1999-2015 Gerard Beekmans

目录

  • 序章

    • 前言
    • 致读者
    • LFS 的目标架构
    • LFS 和标准
    • 本书中的软件包逻辑
    • 前置需求
    • 宿主系统需求
    • 排版约定
    • 本书结构
    • 勘误表

  • 第一部分 介绍

    • 第一章 介绍

      • 如何构建 LFS 系统
      • 上次发布以来的更新
      • 更新日志
      • 资源
      • 帮助

  • 第二部分 准备构建

    • 第二章 准备新分区

      • 简介
      • 创建新分区
      • 在分区上创建文件系统
      • 挂载新分区
      • 设置 $LFS 变量

    • 第三章 软件包与补丁

      • 简介
      • 所有软件包
      • 所需补丁

    • 第四章 最后的准备

      • 简介
      • 创建 $LFS/tools 目录
      • 添加 LFS 用户
      • 设置环境
      • 关于 SBU
      • 关于测试套件

    • 第五章 构建临时文件系统

      • 简介
      • 工具链技术备注
      • 通用编译指南
      • Binutils-2.25 - 第一遍
      • GCC-4.9.2 - 第一遍
      • Linux-3.19 API 头文件
      • Glibc-2.21
      • Libstdc++-4.9.2
      • Binutils-2.25 - 第二遍
      • GCC-4.9.2 - 第二遍
      • Tcl-8.6.3
      • Expect-5.45
      • DejaGNU-1.5.2
      • Check-0.9.14
      • Ncurses-5.9
      • Bash-4.3.30
      • Bzip2-1.0.6
      • Coreutils-8.23
      • Diffutils-3.3
      • File-5.22
      • Findutils-4.4.2
      • Gawk-4.1.1
      • Gettext-0.19.4
      • Grep-2.21
      • Gzip-1.6
      • M4-1.4.17
      • Make-4.1
      • Patch-2.7.4
      • Perl-5.20.2
      • Sed-4.2.2
      • Tar-1.28
      • Texinfo-5.2
      • Util-linux-2.26
      • Xz-5.2.0
      • 清理无用内容
      • 改变属主

  • 第三部分 构建 LFS 系统

    • 第六章 安装基本的系统软件

      • 简介
      • 准备虚拟内核文件系统
      • 软件包管理
      • 进入 chroot 环境
      • 创建目录
      • 创建必需的文件和符号链接
      • Linux-3.19 API Headers
      • Man-pages-3.79
      • Glibc-2.21
      • 调整工具链
      • Zlib-1.2.8
      • File-5.22
      • Binutils-2.25
      • GMP-6.0.0a
      • MPFR-3.1.2
      • MPC-1.0.2
      • GCC-4.9.2
      • Bzip2-1.0.6
      • Pkg-config-0.28
      • Ncurses-5.9
      • Attr-2.4.47
      • Acl-2.2.52
      • Libcap-2.24
      • Sed-4.2.2
      • Shadow-4.2.1
      • Psmisc-22.21
      • Procps-ng-3.3.10
      • E2fsprogs-1.42.12
      • Coreutils-8.23
      • Iana-Etc-2.30
      • M4-1.4.17
      • Flex-2.5.39
      • Bison-3.0.4
      • Grep-2.21
      • Readline-6.3
      • Bash-4.3.30
      • Bc-1.06.95
      • Libtool-2.4.6
      • GDBM-1.11
      • Expat-2.1.0
      • Inetutils-1.9.2
      • Perl-5.20.2
      • XML::Parser-2.44
      • Autoconf-2.69
      • Automake-1.15
      • Diffutils-3.3
      • Gawk-4.1.1
      • Findutils-4.4.2
      • Gettext-0.19.4
      • Intltool-0.50.2
      • Gperf-3.0.4
      • Groff-1.22.3
      • Xz-5.2.0
      • GRUB-2.02~beta2
      • Less-458
      • Gzip-1.6
      • IPRoute2-3.19.0
      • Kbd-2.0.2
      • Kmod-19
      • Libpipeline-1.4.0
      • Make-4.1
      • Patch-2.7.4
      • Systemd-219
      • D-Bus-1.8.16
      • Util-linux-2.26
      • Man-DB-2.7.1
      • Tar-1.28
      • Texinfo-5.2
      • Vim-7.4
      • 关于调试符号
      • 再次清理无用内容
      • 清理

    • 第七章 基本系统配置

      • 简介
      • 通用网络配置
      • LFS 系统中的设备和模块控制
      • 定制设备的符号链接
      • 配置系统时钟
      • 配置 Linux 主控台
      • 配置系统本地化
      • 创建 /etc/inputrc 文件
      • 创建 /etc/shells 文件
      • 使用及配置 Systemd

    • 第八章 让 LFS 系统可引导

      • 简介
      • 创建 /etc/fstab 文件
      • Linux-3.19
      • 用 GRUB 设置引导过程

    • 第九章 尾声

      • 最后的最后
      • 为 LFS 用户数添砖加瓦
      • 重启系统
      • 接下来做什么呢？

  • 第四部分 附录

    • 附录 A. 缩略词和术语
    • 附录 B. 荣誉榜
    • 附录 C. 依赖关系
    • 附录 D. LFS 许可协议
      • Creative Commons License
      • The MIT License

  • 索引

  • 下一页

    序章

  • .
  • .


Linux From Scratch - Version 7.7-systemd

  • 上一页

    主页

  • 下一页

    前言

  • .
  • 主页

序章

目录

  • 前言
  • 致读者
  • LFS 的目标架构
  • LFS 和标准
  • 本书中的软件包逻辑
  • 前置需求
  • 宿主系统需求
  • 排版约定
  • 本书结构
  • 勘误表
  • 下一页

    前言

  • .
  • 主页


前言

    序章

  • 下一页

    致读者

  • 返回
  • 主页

i. 前言

自 1998 年始，我对 Linux 从学习到深入了解已经有十多年。当安装好我的第一个 Linux 发行版后，我很快就为 Linux 所蕴含的整套理念及其背后的哲学思想所着迷。

做一件事总是有很多的方法。对于 Linux 发行版亦是如此。这么多年来已经有了许多发行版。一些仍然存活，另外一些已经变成其它样子，有些则已经只活在我们的记忆中。所有这些发行版均有不同的特点，以满足不同受众的需求。条条大路通罗马，我开始意识到自己可以不再必须受限于别人做好的发行版。在发现 Linux 之前，我们只能忍受各种操作系统的问题，因为我们别无选择。无论你爱还是不爱，它就在那里。而在 Linux 下，你才有了选择的可能。如果不喜欢某个东西，就可以自由地改变它，Linux 甚至鼓励你这样做。

我尝试过很多发行版，但是无法确定该用哪个。从某个角度来说，它们都是很不错的系统。这并不是说某个系统好或不好的问题，而是一个个人习惯问题。在各种可用选择中，显然没有哪个单一的系统于我而言最完美。于是我着手创建自己的 Linux 系统，以完全满足自己的喜好。

为了使其真正是我自己的系统，我毅然决定从源代码编译所有东西，而不是使用预编译好的二进制包。这个“完美”的 Linux 系统将具不同系统的优点，而没有它们与之俱来的不足。起初，这种想法相当让人畏惧，但我一直保持着可以构建出这样一个系统的信念。

在梳理了诸如循环依赖和编译错误之类的问题后，我最终构建出一个订制的 Linux 系统。它完全可以工作，并与当时已有的任何其它 Linux 系统一样完美可用。但它是我自己所创造的。能够亲手组装出这样一个系统让人很满意，而唯一一个能让人感觉更美妙的事是能够亲自创建软件的每个部分。

当我将自己的目标和经验与 Linux 社区的其它成员分享时，引发了大家对这些想法的不断关注。很快人们就清楚地意识到，这样一个定制的 Linux 系统不仅仅可以满足用户的特定需求，还可为程序员和系统管理员提供一个理想的学习机会，以增强他们（已有）的 Linux 技能。正是由于这种广泛的兴趣，Linux From Scratch Project 诞生了。

这本 Linux From Scratch 手册是该项目的重中之重。它为您提供了设计和构建自己的系统所需的背景知识和指令。本手册给出了一个样板，可以由此得到一个能正常工作的系统，但您可自由改变指令以适合自己的需求，从某种程度上说，这是本项目的一个重要组成部分。您仍然可以控制一切，我们只是在您开启自己的旅程时助您一臂之力。

我真诚地希望您在自己的 Linux From Scratch 系统上能度过一段美好的时光，并能享受拥有一个真正属于自己的系统的众多好处。

--
Gerard Beekmans
gerard@linuxfromscratch.org

翻译团队：LCTT 译者/校对：Yuking-net,wxy
  • 上一页

    序章

  • 下一页

    致读者

  • 返回


致读者

序章

    前言

  • 下一页

    LFS 的目标构架

  • 返回
  • 主页

ii. 致读者

说到为什么要读这本书，我想，原因一定很多。有些人可能会提出这样的疑问： “都已经有现成的 Linux 系统可以下载和安装了，你为什么还要多此一举的从无到有创建一个呢？”

此项目存在的一个重要原因是帮助你了解 Linux 内部是如何工作的。通过构建 LFS 系统，你可以更好的理解 Linux 是如何正常运转，和其它程序之间是如何协同工作，以及和其它程序之间的依赖关系。最棒的是，这个学习经历能给你提供自定义 Linux 系统以满足你自己独特需求的能力。

另一个重要的原因是，你对系统本身有更多的控制权，而不必知道别人是如何实现的。在 LFS 下，你就是主宰，系统的各个方面都需要你亲力亲为。

LFS 可以让你创建极其精简的 Linux 系统。当安装那些常规的 Linux 系统，你往往迫不得已安装那些你用不到的（甚至你都不知道它们是干什么的）程序。这些程序也许会浪费你的硬件资源。你可能要说了，现在计算机的资源那么丰富，稍微浪费一些又有什么关系呢。但是你依旧要考虑到可引导 CD、USB 棒或者是一些嵌入式环境，它们对资源高度敏感，这恰恰是 LFS 所擅长的地方。

另一个优势是，自定义的 Linux 系统有更高的安全性。通过从源码构建一个完整的系统，你有权审核所有的代码和打入所需的安全补丁。这避免了花很长时间去等待别人编译修复了安全漏洞的二进制程序。而且，除非你检查了补丁文件且做了完整的验证，否则你又怎么能确信，新的二进制程序的的确确编译正确且解决了问题呢？

从零构建一个基本可用的 Linux 系统是本书的目标，如果你并不打算这么做，那么，这本书可能对你来说用处并不大。

有太多的原因来支撑你从头构建属于自己的 LFS 系统了。最重要的原因，我想还是当你学会构建 LFS 后，就会发现你已经学会太多的相关信息和知识了。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    前言

  • 下一页

    LFS 的目标架构


LFS 的目标架构

序章

    致读者

  • 下一页

    LFS 和标准

  • 返回
  • 主页

iii. LFS 的目标架构

LFS 当前主要支持 AMD/Intel 的 x86(32 位)和 x86_64(64 位) CPU。另外，本文档也涉及一些更改可以让 LFS 顺利地在 Power PC 和 ARM CPU 上运行。为了顺利构建 LFS，除了后面几页的内容外，你主要需要一个可以在当前 CPU 上正常运行的 Linux 系统，例如：早先版本的 LFS，Ubuntu/Fedora，SuSE 或者是在你的架构上可以运行的其它发行版。对了，32 位的发行版是可以在 64 位的 AMD/Intel 处理器上作为宿主机正常安装和运作的。

不过，64 位的一些实情是：和 32 位相比，运行的速度稍微的快那么一点点，但是相较而言，体积也稍微的大一点点。以在 Core 2 Duo 处理器上运行的 LFS-6.5 系统为例，以下是一些实际的数据：

架构      构建时间    构建后大小
32-bit  198.5 分钟   648 MB
64-bit  190.6 分钟   709 MB

正如你看到的，64 位程序仅仅比 32 位程序快了 4%，体积大了 9%。由此可见，单纯的追逐 64 位系统其实并没有太大的必要。但是，假如你的电脑的内存超过了 4G 又或者说需要操作大于 4G 的数据，64 位系统的优势就比较明显了。

假如按照本文的默认方式构建，那么你将得到一个“纯” 64 位系统————这意味着你仅能够执行 64 位的程序。构建 “multi-lib” 也并不是不可以，但是这意味着很多的程序都需要编译两次：一次编译为 32 位程序，一次编译为 64 位程序。不过，本文档并不涉及这部份的内容：这会干扰用户学习如何构建“最基本” Linux 系统。你可以通过阅读 Cross Linux From Scratch 的相关内容获得有关本话题的更多帮助。

关于 64 位系统，还有一点需要说明。有一些异常老旧的包无法在“纯” 64 位系统上构建，或者是需要专门的编译指令。通常出现这样的问题是因为这些包包含有一些与 32 位系统紧密相关的汇编指令。这些包括一些 Xorg 的视频卡驱动（http://xorg.freedesktop.org/releases/individual/driver/），大多数类似的情况都有解决方案，但可能需要特别的方法或者是补丁。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    致读者

  • 下一页

    LFS 和标准


LFS 和标准

序章

    LFS 的目标架构

  • 下一页

    本书中的软件包逻辑

  • 返回
  • 主页

iv. LFS 和标准

LFS 的结构尽可能的遵循 Linux 的标准。主要的标准有：

  • POSIX.1-2008.

  • 文件系统层次标准 版本 3.0 草案 1 (FHS)

  • Linux 标准基础（LSB）规格

    LSB 有五个独立的标准：内核、C++、桌面、运行时语言和输出。除了普通的要求，还有架构特定要求。LFS 试图遵从前一节中所讨论的架构要求。

    注意

    很多人不认同 LSB 的要求。定义它的主要目的是确保私有软件能够在兼容的系统上安装并正常运行。由于 LFS 是基于源代码的，用户对于需要什么软件包有完全的控制权，很多人选择不安装 LSB 规范所要求的软件包。

创建一个能够通过 LSB 认证测试的完整 LFS 系统是可行的，但需要很多 LFS 范围之外的额外软件包。在 BLFS 中有这些额外软件包的安装说明。

由 LFS 提供，用于满足 LSB 要求的软件包

LSB 内核: | Bash, Bc, Binutils, Coreutils, Diffutils, File, Findutils, Gawk, Grep, Gzip, M4, Man-DB, Ncurses, Procps, Psmisc, Sed, Shadow, Tar, Util-linux, Zlib
LSB C++: | Gcc
LSB 桌面: | 无
LSB 运行时语言: | Perl
LSB 输出: | 无
LSB 多媒体: | 无

由BLFS提供，用于满足 LSB 要求的软件包

LSB 内核: | At, Batch (At 包的一部分), Cpio, Ed, Fcrontab, Initd-tools, Lsb_release, PAM, Pax, Sendmail (或 Postfix，或 Exim), time
LSB C++: | 无
LSB 桌面: | ATK, Cairo, Desktop-file-utils, Freetype, Fontconfig, Glib2, GTK+2, Icon-naming-utils, Libjpeg, Libpng, Libxml2, MesaLib, Pango, Qt4, Xorg
LSB 运行时语言: | Python
LSB 输出: | CUPS
LSB 多媒体: | Alsa Libraries, NSPR, NSS, OpenSSL, Java, Xdg-utils

LFS 和 BLFS 没有提供，用于满足 LSB 要求的软件包

LSB 内核: | 无
LSB C++: | 无
LSB 桌面: | Qt3
LSB 运行时语言: | 无
LSB 输出: | 无
LSB 多媒体: | 无
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    LFS 的目标架构

  • 下一页

    本书中的软件包逻辑


本书中的软件包逻辑

序章

    LFS 和标准

  • 下一页

    前置需求

  • 返回
  • 主页

v. 本书中的软件包逻辑

正如前文所述，LFS 的目标是构建一个完整可用的基本系统。该系统包含自复制所需的所有软件包，因此，用户可以从一个相对小的基础开始，依选择配置一个相对复杂的系统。所以，严格意义上说，LFS 并不是最小可用系统的代名词。甚至某些最重要的软件包都不一定必须安装。下面的列表介绍了本书中选择每个软件包的理由。

  • Acl

    这个软件包包括了管理访问控制列表（ACL）的工具，用于定义文件和目录更细粒度的自主访问权。

  • Attr

    这个软件包包括了管理文件系统的对象扩展属性的程序。

  • Autoconf

    这个软件包包括了能根据开发者的模板自动生成配置源代码的 shell 脚本的程序。更新了构建过程之后重新构建软件包通常需要这个。

  • Automake

    这个软件包包括了从模板生成 Make 文件的程序。更新了构建过程之后重新构建软件包通常需要这个。

  • Bash

    这个软件包能满足提供到系统的 Bourne Shell 接口的 LSB 核心需求。由于其通用性和在基本 shell 功能上的扩展能力，所以选择它而不是其它的 shell 软件包。

  • Bc

    这个软件包提供了一种任意精度的数值处理语言。在构建 Linux 内核时需要它。

  • Binutils

    这个软件包包括了一个链接器、汇编器和其它处理对象文件的工具。编译 LFS 系统以及之上的大部分软件包需要这个软件包中的程序。

  • Bison

    这个软件包中有 yacc(Yet Another Compiler Compiler) 的 GNU 版本，需要用来构建一些其它的 LFS 程序。

  • Bzip2

    这个软件包包括了用来压缩和解压缩文件的程序。在解压缩很多 LFS 软件包的时候需要它。

  • Check

    这个软件包包括了一个用于其它程序的测试工具。它只安装在临时工具链中。

  • Coreutils

    这个软件包包括了一些查看和管理文件和目录的重要程序。在命令行里管理文件和每个 LFS 软件包的安装过程中需要它。

  • D-Bus

    这个软件包包括了一个用于提供消息总线的程序，消息总线是一种应用程序之间通信的简单方式。systemd 也需要它。

  • DejaGNU

    这个软件包包括了一个测试其它程序的框架。只安装在临时工具链中。

  • Diffutils

    这个软件包包括了一些显示文件和目录差异的程序。这些程序可以用来创建补丁，也用于很多软件包的构建过程。

  • E2fsprogs

    这个软件包包括了一些处理 ext2、ext3 和 ext4 文件系统的工具。这些是 Linux 上支持的最常用而且完全经过考验的文件系统。

  • Expat

    这个软件包包括了一个相对小的 XML 解析库。Perl 模块 XML::Parser 需要用到这个。

  • Expect

    这个软件包包括了一个生成与其它程序交互的脚本对话框的程序。通常用来测试其它软件包。只安装在临时工具链中。

  • File

    这个软件包包括了一个能判断给定文件的类型的工具。一些软件包需要用它来构建。

  • Findutils

    这个软件包包括了一些在文件系统中查找文件的程序。在很多软件包构建脚本中会用到它。

  • Flex

    这个软件包包括了一个能生成识别文本模式程序的工具。是 lex(lexical analyzer) 程序的 GNU 版本。构建很多 LFS 软件包需要用到它。

  • Gawk

    这个软件包包括了一些操作文本文件的程序。是 awk(Aho-Weinberg-Kernighan) 的 GNU 版本。在很多软件包的构建脚本中会用到它。

  • Gcc

    这个软件包是 GNU 编译器工具集。它包括 C 和 C++ 的编译器以及其它一些不是由 LFS 构建的软件包。

  • GDBM

    这个软件包包括了 GNU 数据库管理库。LFS 的另一个软件包 Man-DB 会用到它。

  • Gettext

    这个软件包包括了很多软件包国际化和本地化需要用到的工具和库。

  • Glibc

    这个软件包包括了主要的 C 语言库。缺少它 Linux 程序就运行不了。

  • GMP

    这个软件包包括了能提供任意精度数值运算的数学库。编译 Gcc 会用到它。

  • Gperf

    这个软件包包括了一个能从一个键集生成完美哈希函数的程序。sysetmd 会用到它。

  • Grep

    这个软件包包括了一些在文件中搜索的程序。大部分软件包的构建脚本会用到它。

  • Groff

    这个软件包包括了处理和格式化文本的程序。其中一个重要的功能是格式化 man 页面。

  • GRUB

    这个包是 Grand Unified Boot Loader。是可用的引导加载器之一，但最灵活。

  • Gzip

    这个包包括了一些压缩和解压缩文件的程序。解压很多 LFS 以及之上的软件包时会需要它。

  • Iana-etc

    这个软件包提供了网络服务和协议的数据。启用合适的网络功能会用到它。

  • Inetutils

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

  • Intltool

    这个包包括了能从源文件中抽取可翻译字符串的工具。

  • IProute2

    这个包包括了一些基本和高级的 IPv4 和 IPv6 网络的程序。由于其 IPv6 功能，所以选择它而不选择其它的常见网络工具包（net-tools）。

  • Kbd

    这个包包括了一些键盘映射文件，用于非 US 键盘的键盘工具以及一些控制台字体。

  • Kmod

    这个软件包包括了一些用于管理 Linux 内核模块的程序。

  • Less

    这个软件包包括了一个很好的文本文件查看器，允许查看文件的时候向上或向下滚动。Man-DB 用它来查看 man 页面。

  • Libcap

    这个包实现了可以用于 Linux 内核的，从用户空间到 POSIX 1003.1e 的接口。

  • Libpipeline

    这个包包括了一个以灵活和便捷的方式操作子进程流水线的库。Man-DB 软件包会用到它。

  • Libtool

    这个软件包包括一些 GNU 通用库支持脚本。它降低了在一致、可移植的接口上使用共享库的复杂度。在其他 LFS 软件包的测试套件里需要它。

  • Linux Kernel

    这个包就是操作系统。即我们常说的 “GNU/Linux” 中的 “Linux”。

  • M4

    这个包包括了一个普通的文本宏处理器，作为其它程序的构建工具使用。

  • Make

    这个包包括了一个指导软件包构建的程序。LFS 中的几乎每个包都需要它。

  • Man-DB

    这个包包括了一些查找和查看 man 页面的程序。由于其更好的国际化功能，用来代替 man软件包。它提供了 man 程序。

  • Man-pages

    这个包包括了基本的 Linux man 页面的真正内容。

  • MPC

    这个包包括了复数运算的函数。Gcc 需要它。

  • MPFR

    这个包包括了多精度运算的函数。Gcc 需要它。

  • Ncurses

    这个包包括了一些处理字符界面的不依赖特定终端的库。通常用来为菜单系统提供光标控制。一些 LFS 的软件包会用到它。

  • Patch

    这个包包括了一个通过补丁文件来修改或新建文件的程序，补丁文件通常是由 diff 程序创建的。一些 LFS 软件包的构建过程会需要它。

  • Perl

    这个包包括了一个运行时语言 PERL 的解析器。一些 LFS 软件包的安装和测试套件会需要它。

  • Pkg-config

    这个包提供了一个返回已安装库或软件包的元数据的程序。

  • Procps-NG

    这个包包括了一些监视进程的程序。这些程序对系统管理非常有用，也用于 LFS 的启动脚本。

  • Psmisc

    这个包包括了一些显示运行中进程信息的程序。这些程序对系统管理非常有用。

  • Readline

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

  • Sed

    这个包提供了不通过文本编辑器而直接编辑文本的功能。大部分 LFS 软件包的配置脚本需要它。

  • Shadow

    这个包包括了一些以安全方式处理密码的程序。

  • Systemd

    作为 Sysvinit 的替代品，这个包提供了一个 init 程序以及一些其它的引导和系统控制功能。很多 Linux 发行版都用它。

  • Tar

    这个软件包提供了归档和提取 LFS 中的几乎所有软件包的能力。

  • Tcl

    这个包包括了在很多 LFS 软件包测试套件中使用的工具命令语言。只安装在临时工具链中。

  • Texinfo

    这个包包括了一些读、写以及转换信息页面的程序。在很多 LFS 软件包的安装过程中会使用它。

  • Util-linux

    该软件包包括了许多工具。其中有处理文件系统、控制台、分区和消息的工具。

  • Vim

    这个包包括了一个编辑器。由于 vi 编辑器的经典以及大量的强大功能而选择它。对很多用户来说一个编辑器是一个非常个人的选择，如果需要的话也可以选择其它编辑器。

  • XML::Parser

    这个包是和 Expat 交互的 Perl 模块。

  • XZ Utils

    这个包包括了一些压缩和解压缩文件的程序。通常它的压缩率最高，在解压 XZ 或者 LZMA 格式的软件包时非常有用。

  • Zlib

    这个包包括了一些程序所使用的压缩和解压缩功能。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    LFS 和标准

  • 下一页

    前置需求


前置需求

前言

    本书中的软件包逻辑

  • 下一页

    宿主系统需求

  • 返回
  • 主页

vi. 前置需求

构建一个 LFS 系统并不是一个简单的任务。它要求对 Unix 系统管理有一定水平的了解，以便可以解决问题并正确地执行所列出的命令。特别是，最起码你应该有使用命令行 (shell)复制或移动文件和目录、列出目录和文件内容、切换当前目录的能力。同时也希望你有使用和安装 Linux 软件的基本知识。

因为 LFS 书中假设你至少有这些基本技能，所以众多的 LFS 支持论坛看起来在这方面给你提供不了太多帮助。你会发现对于这些基本知识的问题并不会得到解答，或者会简单的建议你去看一下 LFS 主要的提前阅读列表。

构建 LFS 系统之前，我们建议阅读以下的 HOWTO：

  • 编译软件 HOWTO http://www.tldp.org/HOWTO/Software-Building-HOWTO.html

    这是一个在 Linux 上编译和安装“通用” Unix 软件包的综合指南。尽管成文有一段时间了，但它提供了一个编译和安装软件所需基本技能的不错的总结。

  • Linux 用户指南 http://tldp.org/pub/Linux/docs/ldp-archived/users-guide/

    该指南涵盖的各类 Linux 软件的使用。这个指南也挺旧了，但是仍然有效。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    本书中的软件包逻辑

  • 下一页

    宿主系统需求


宿主系统需求

前言

    前置需求

  • 下一页

    排版约定

  • 返回
  • 主页

vii. 宿主系统需求

你的宿主机应该安装有以下的软件包，且软件包的版本不能低于标注的版本（译者注：事实上版本低于标注版本也可能通过，所以 Linux 内核版本稍低而无法安装更高版本软件的用户也不必过于担心。例如译者的系统是 Ubuntu 14.04，其中有好多软件版本就低于指定版本，但仍然能成功构建）。对于大部分现代 Linux 来说应该不是什么问题。不少发行版可能会将开发用到的头文件单独打包，并且命名为 “<package-name>-devel” 或是 “<package-name>-dev” 这样的形式。务必保证这样的包都已经装上！

可能某些软件包的版本低于以下标注的版本也可以工作，不过我们不能一一测试。

  • Bash-3.2 （/bin/sh 应该是到 bash 的符号链接或硬链接）

  • Binutils-2.17 （不推荐安装 2.25 以上的版本，它们没有经过测试，并不敢保证没有问题）

  • Bison-2.3 （/usr/bin/yacc 应该是一个到 bison 的链接或者是一个执行 bison 的脚本）

  • Bzip2-1.0.4

  • Coreutils-6.9

  • Diffutils-2.8.1

  • Findutils-4.2.31

  • Gawk-4.0.1 （/usr/bin/awk 应该是到 gawk 的链接）

  • GCC-4.1.2 包括 C++ 编译器、 g++ （不推荐安装 4.9.2 以上的版本，它们没有经过测试，并不敢保证没有问题）

    注意

    有报告称，部分发行版使用的 gcc 库存在缺失或者是不一致的情况。这一情况可能会干扰到一些 LFS 软件包的构建。请检查 /usr/lib 或是 /usr/lib64 下是否存在 libgmp.la、libmpfr.la 和 libmpc.la。这三个文件应该要么都存在，要么都没有，而不是只有一两个。假如你的系统有这样的问题，要么重命名或删除这些文件（并重新安装 GCC），要么安装缺少的软件包。

  • Glibc-2.5.1 （不推荐安装 2.21 以上的版本，它们都没有经过测试，并不敢保证没有问题）

  • Grep-2.5.1a

  • Gzip-1.3.12

  • Linux Kernel-2.6.32

    之所以指定使用这一版本的内核，是因为在第六章需要编译 glibc，开发人员有此建议。同时，编译 udev 也同样依赖于此版本的内核。

    如果当前宿主机的内核版本早于 2.6.32，也许需要先升级到更新的版本。升级方法有两种：假如你的系统维护者有提供更新版本的内核，那么直接升级就可以了；假如你的系统维护者没有提供更新版本的内核，或者你不想安装它，那么你需要自己编译内核。第八章将指导你如何编译内核和设置系统的启动配置（这里假定你使用 GRUB）。

  • M4-1.4.10

  • Make-3.81

  • Patch-2.5.4

  • Perl-5.8.8

  • Sed-4.1.5

  • Tar-1.18

  • Texinfo-4.7

  • Xz-5.0.0

需要注意的是，通过学习本文构建 LFS 系统，必须包含上文提及的所有文件链接。那些链接假如指向其它的软件（例如 dash，mawk 等） ，也许依旧可以构建系统，但是开发团队并没有做过系统的测试，而且可能会在执行一些命令或者应用某些补丁的时候出现问题。（译者注：这句话的本义是，本书建议构建 LFS 建议使用的 sh 应该是 bash，但是假如你喜欢 dash，这并不一定不行，但是假如出问题，那也是在情理之中的事情。）

请执行以下命令，查看宿主机的各个软件包的版本以及编译环境是否准备妥当：

cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -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 yacc 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 '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

译者注：这里给出一个典型的输出（当前译者使用的系统为：LSB Version:1.4,Distributor ID:Arch,Description:Arch Linux,Release:rolling
Codename:n/a）
bash, version 4.3.33(1)-release
/bin/sh -> /usr/bin/bash # 这里 sh 是到 bash 的硬链接
Binutils: (GNU Binutils) 2.25.0 # 版本正好是 2.25（好险）
bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4 # yacc 是到 bison 的硬链接
bzip2, Version 1.0.6, 6-Sept-2010.
Coreutils: 8.23
diff (GNU diffutils) 3.3
find (GNU findutils) 4.4.2
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)
/usr/bin/awk -> /usr/bin/gawk # awk 是到 gawk 的硬链接
gcc (GCC) 4.9.2 20150304 (prerelease)
g++ (GCC) 4.9.2 20150304 (prerelease)
(GNU libc) 2.21 # glib 的版本是 2.21
grep (GNU grep) 2.21
gzip 1.6
Linux version 4.0.0-2-ARCH (builduser@tobias) (gcc version 4.9.2 20150304 (prerelease) (GCC) )
m4 (GNU M4) 1.4.17
GNU Make 4.1
GNU patch 2.7.5
Perl version='5.20.2';
sed (GNU sed) 4.2.2
tar (GNU tar) 1.28
makeinfo (GNU texinfo) 5.2
xz (XZ Utils) 5.2.1
g++ compilation OK # 编译器功能正常

同时，还请进行库文件的一致性检查：

cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
echo $lib: $(if find /usr/lib* -name $lib|
grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF
bash library-check.sh

这些文件应该要么都在或者是都缺失，而不应该只有一两个。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    前置需求

  • 下一页

    排版约定


排版约定

前言

    宿主系统需求

  • 下一页

    本书结构

  • 返回
  • 主页

viii. 排版约定

为了能更轻松地阅读，这里有一些全书使用的排版约定。这个部分包括一些来自 Linux From Scratch 中的排版格式例子。

./configure --prefix=/usr

这种形式的文本被设计成完全按照看到的样子输入，除非在周围文本中另有说明。它也用在解释部分，用以指出引用的是哪个命令。

某些情况下，一个逻辑行会通过在行末添加反斜杠被折叠为两个或者更多的物理行。

CC="gcc -B/usr/bin/" ../binutils-2.18/configure \
  --prefix=/tools --disable-nls --disable-werror

注意，反斜杠后面必须紧跟一个回车符。其它空格字符，例如空格和tab键会导致错误结果。

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）。因此，这整个部分正如看到的那样输入。

<需要替换的文本>

这种格式用来封装需要替换为合适内容的文本，以及复制粘贴操作。

[可选的文本]

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

passwd(5)

这种格式用来表示特定的手册 (man) 页面。括号内的数字表示该手册的特定部分。例如 passwd 有两个手册页面。在 LFS 安装说明中，这两个手册页面会表示为 /usr/share/man/man1/passwd.1 以及 /usr/share/man/man5/passwd.5。当书中使用 passwd(5) 时它特指 /usr/share/man/man5/passwd.5。man passwd 会输出它找到匹配 “passwd” 的第一个手册页面，也就是 /usr/share/man/man1/passwd.1。在这个例子中，你需要执行 man 5 passwd 才能阅读指定的手册页面。应该注意的是，大部分的手册页面在不同部分不会有重复的页面名字。因此，man <program name> 通常就足够了。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    宿主系统需求

  • 下一页

    本书结构


本书结构

前言

    排版约定

  • 下一页

    勘误表

  • 返回
  • 主页

ix. 本书结构

本书分为以下几个部分。

第一部分 介绍

第一部分 解释了一些安装 LFS 时的重要注意事项。同时还提供了本书的基本信息。

第二部分 构建的准备工作

第二部分 描述了构建的一些准备工作，包括分区，下载软件包，编译一些临时工具。

第三部分 构建 LFS 系统

第三部分 引导用户开始 LFS 系统的构建——逐一的编译和安装所有的软件包，设置启动脚本，安装内核。生成的 Linux 系统是继续编译其它一系列软件的基础，通过那些软件来扩展系统，系统才能更好地满足我们的需求。在本书的最后，我们还给出了一个便于使用的引用列表，包括安装好的程序、库和一些重要文件。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    排版约定

  • 下一页

    勘误表


勘误表

前言

    本书结构

  • 下一页

    介绍

  • 返回
  • 主页

x. 勘误表

构建 LFS 系统的软件是在不断的更新和改进的，也许在这本 LFS 书发布以后就会出现一些安全警告或者是修复了一些 bug。请在着手构建之前访问 http://www.linuxfromscratch.org/lfs/errata/7.7-systemd/ ，检查此版本 LFS 软件包的版本或说明，是否需要修改以解决安全漏洞或其它 bug。您应该关注本书的一切变化，且将其应用到 LFS 系统的构建中去。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    结构

  • 下一页

    介绍


    勘误表

  • 下一页

    介绍

  • .
  • 主页

第一部分 介绍

目录

  • 1. 介绍

    • 如何构建 LFS 系统
    • 上次以来发布的更新
    • 更新日志
    • 资源
    • 帮助
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    勘误表

  • 下一页

    介绍

  • .


第一章 介绍

I. 介绍

    序章

  • 下一页

    如何构建 LFS 系统

  • 返回
  • 主页

1. 介绍

目录

  • 如何构建 LFS 系统
  • 上次发布以来的更新
  • 更新日志
  • 资源
  • 帮助
翻译团队：LCTT 译者/校对：kevinSJ,wxy
  • 上一页

    序章

  • 下一页

    如何构建 LFS 系统


1.1. 如何构建 LFS 系统

第一章 介绍

    介绍

  • 下一页

    上次发布以来的更新

  • 返回
  • 主页

1.1. 如何构建 LFS 系统

LFS 系统需要在一个已经安装好的 Linux 发行版（比如 Debian、OpenMandriva、Fedora 或 OpenSUSE）中构建。这个已有的 Linux 系统（即宿主）作为构建新系统的起始点，提供了必要的程序，包括一个编译器、链接器和 shell。请在安装发行版的过程中选择 “development（开发）”选项以便使用这些开发工具。

除了将一个独立发行版安装到你的电脑上之外，你也可以使用商业发行版的 LiveCD。

本书的第二章描述了如何创建一个的新 Linux 本地分区和文件系统，这就是编译和安装新的 LFS 系统的地方。第三章介绍了构建 LFS 系统所需下载的软件包和补丁，以及如何把它们保存在新的文件系统里。 第四章讨论了如何设置恰当的工作环境。因为它阐述了几个需要注意的重要问题，在你按照第五章及之后的内容开始工作前，请仔细阅读第四章。

第五章阐述了构成基本开发套件（即工具链）的大量软件包的安装，在第六章中将用这个开发套件构建真正的系统。其中一些包是需要解决循环依赖——比如，你需要一个编译器来编译一个编译器。

第五章还将向你展示如何构建第一遍的工具链，包括 Binutils 和 GCC （第一遍基本上就是重新安装这两个核心软件包）。下一步是构建 Glibc，即 C 语言库。Glibc 将用第一遍构建的工具链编译。然后，第二遍的工具链就被编译好了。这次，工具链将被动态链接到新建成的 Glibc。 第五章中剩余的包将用这个第二遍的工具链编译。当这些工作完成以后，LFS 的安装过程就不会再依赖于宿主发行版了，除了正在运行的内核。

把新系统从宿主发行版中分离出来的工作看起来可能有点多余。5.2 “工具链技术备注”这一节给出了为什么要这么做的完整技术说明。

在第六章，会构建完整的 LFS 系统。我们将使用 chroot (change root 改变根目录) 程序来进入一个虚拟环境并启动一个新的 shell，这个 shell 的根目录将被指向到 LFS 分区。这个过程非常像是重启并让内核把 LFS 分区挂载为根分区。系统并没有真正的重启，而是在使用 chroot 实现的，因为创建一个可启动的系统还需要有一些目前尚未完成的额外工作。 使用 “chroot” 的最大好处是，它在运行过程中允许你在构建 LFS 的同时继续使用宿主系统。在等待包的编译过程中，你可以继续正常使用你的电脑。

为了完成安装，还需要第七章中的基本的系统配置方法， 第八章中的内核和启动引导程序的配置方法。 第九章包含了学完本书以后继续使用 LFS 的一些建议。在本书内的步骤完成之后，电脑就可以重启进入新的 LFS 系统了。

流程大概就是这样。每一步的详细信息都会在之后的章节和软件包的描述里讨论。当你踏上这段 LFS 之旅，就会理清这些看起来很复杂的东西，每一个都将对号入座。

翻译团队：LCTT 译者/校对：H-mudcup,wxy
  • 上一页

    介绍

  • 下一页

    上次发布以来的更新


1.2. 上次发布以来的更新

第一章 介绍

    如何构建 LFS 系统

  • 下一页

    更新日志

  • 返回
  • 主页

1.2. 上次发布以来的更新

下面列出了自本书上一次发布之后的一些软件包更新。

更新：

  • Automake 1.15

  • Bash 4.3.30

  • Binutils 2.25

  • Bison 3.0.4

  • D-Bus-1.8.16

  • DejaGNU 1.5.2

  • File 5.22

  • GCC 4.9.2

  • Gettext 0.19.4

  • Glibc 2.21

  • Grep 2.21

  • Groff 1.22.3

  • GRUB 2.02~beta2

  • IPRoute2 3.19.0

  • Kmod 19

  • Libpipeline 1.4.0

  • Libtool 2.4.6

  • Linux 3.19

  • Make 4.1

  • Man-DB 2.7.1

  • Man-pages 3.79

  • Patch 2.7.4

  • Perl 5.20.2

  • Procps-ng 3.3.10

  • Systemd 219

  • TCL 8.6.3

  • Tzdata 2015a

  • Util-Linux 2.26

  • XML-Parser-2.44

  • XZ-Utils 5.2.0

新增：

  • bash-4.3.30-upstream_fixes-1.patch

  • mpfr-3.1.2-upstream_fixes-3.patch

  • readline-6.3-upstream_fixes-3.patch

  • systemd-219-compat-1.patch

移除：

  • binutils-2.24-load_gcc_lto_plugin_by_default-1.patch

  • binutils-2.24-lto_testsuite-1.patch

  • binutils-2.24-multiple_plugins-1.patch

  • bash-4.3-upstream_fixes-3.patch

  • gcc-4.9.1-upstream_fixes-1.patch

  • readline-6.3-upstream_fixes-2.patch

  • systemd-216-compat-1.patch

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    如何构建 LFS 系统

  • 下一页

    更新日志


1.3. 更新日志

第一章 介绍

    上次发布以来的更新

  • 下一页

    资源

  • 返回
  • 主页

1.3. 更新日志

这是 Linux From Scratch 手册的 7.7-systemd 版本，发布于2015年3月6日。如果距离这个时间已超过 6 个月，那么应该已经有更新和更好的版本了。要获取的话，请访问这个页面 http://www.linuxfromscratch.org/mirrors.html 里任意一个镜像站点。

下面是本书上一次发布之后的更新列表。

更新日志条目：

  • 2015-03-06

    • [krejzi] - LFS-7.7-systemd 发布。

  • 2015-03-03

    • [bdubbs] - 增加一个 sed 命令修复 e2fsprogs 中存在的一个上游安全问题。解决了#3759。

    • [bdubbs] - 增加一个 sed 命令修复 grep 中存在的一个上游安全问题。解决了#3760。

  • 2015-02-25

    • [bdubbs] - 在宿主机系统需求中增加 texinfo-4.7 或更新版本。解决了#3756。

  • 2015-02-23

    • [bdubbs] - 增加 glibc 在 32 位架构系统中的一个补丁。解决了#3755。

  • 2015-02-19

    • [bdubbs] - 更新到 util-linux-2.26。解决了#3734。

  • 2015-02-17

    • [krejzi] - 更新到 systemd-219。

  • 2015-02-16

    • [bdubbs] - 更新到 linux-3.19。解决了#3746。

    • [bdubbs] - 更新到 iproute2-3.19.0。解决了#3748。

    • [bdubbs] - 更新到 perl-5.20.2。解决了#3749。

    • [bdubbs] - 更新到 libtool-2.4.6。解决了#3750。

    • [bdubbs] - 为 glibc 增加了关于并行编译潜在问题的说明。解决了#3747。

  • 2015-02-10

    • [krejzi] - 更新到 dbus-1.8.16。

  • 2015-02-09

    • [Chris] - 第六章的 Bison 页中增加 --docdir 开关用于将文档保存到带版本的目录里。

  • 2015-02-08

    • [Chris] - 更新 FHS 的链接。

  • 2015-02-06

    • [bdubbs] - 更新 bash 补丁 patch-033。

    • [bdubbs] - 更新 mpfr 补丁 patch-11。

    • [bdubbs] - 更新到 util-linux-2.26-rc2。这是 util-linux-2.26 稳定版之前的一个中间补丁。

    • [bdubbs] - 更新到 man-pages-3.79。解决了#3743。

    • [bdubbs] - 更新到 dejagnu-1.5.2。解决了#3744。

    • [bdubbs] - 更新到 glibc-2.21。解决了#3745。

    • [krejzi] - 更新到 dbus-1.8.14。

  • 2015-01-31

    • [bdubbs] - 更新到 patch-2.7.4。解决了#3742。

    • [bdubbs] - 更新到 tzdata-2015a。解决了#3741。

  • 2015-01-29

    • [bdubbs] - 更新到 bison-3.0.4。解决了#3735。

    • [bdubbs] - 更新到 libtool-2.4.5。解决了#3737。

    • [bdubbs] - 更新到 patch-2.7.3。解决了#3738。

    • [bdubbs] - 更新到 linux-3.18.5。解决了#3739。

    • [bdubbs] - 更新到 man-pages-3.78。解决了#3740。

  • 2015-01-12

    • [bdubbs] - 更新到 XML-Parser-2.44。解决了#3733。

    • [bdubbs] - 更新到 man-pages-3.77。解决了#3732。

    • [bdubbs] - 更新到 linux-3.18.2。解决了#3731。

  • 2015-01-06

    • [bdubbs] - 更新到 file-5.22。解决了#3729。

    • [bdubbs] - 更新到 automake-1.15。解决了#3727。

  • 2015-01-02

    • [bdubbs] - 更新到 man-pages-3.76。解决了#3728。

    • [bdubbs] - 修正 CLFS 的链接。解决了#3727。

    • [bdubbs] - 更新版权信息中的年份。

    • [bdubbs] - 让版本检查脚本更可靠。

  • 2014-12-25

    • [bdubbs] - 更新到 iproute2-3.18.0。解决了#3726。

    • [bdubbs] - 更新到 gettext-0.19.4。解决了#3725。

  • 2014-12-24

    • [bdubbs] - 更新到 linux-3.18.1。解决了#3721。

    • [bdubbs] - 更新到 xz-5.2.0。解决了#3723。

    • [bdubbs] - 更新到 binutils-2.25。解决了#3724。

  • 2014-12-21

    • [krejzi] - 更新到 systemd-218。

  • 2014-12-13

    • [bdubbs] - 更新到 linux-3.18。解决了#3717。

    • [bdubbs] - 更新到 file-5.21。解决了#3718。

    • [bdubbs] - 更新到 XML-Parser-2.43。解决了#3720。

  • 2014-12-03

    • [bdubbs] - 更新致谢页面。解决了#3716。

    • [bdubbs] - 更新到 libtool-2.4.4。解决了#3715。

  • 2014-11-28

    • [krejzi] - 更新到 systemd-217。

    • [krejzi] - 更新到 dbus-1.8.12。

  • 2014-11-24

    • [bdubbs] - 更新到 linux-3.17.4。解决了#3712。

    • [bdubbs] - 更新到 kmod-19。解决了#3713。

    • [bdubbs] - 更新到 grep-2.21。解决了#3714。

  • 2014-11-13

    • [bdubbs] - 更新到 tzdata-2014j。解决了#3710。

    • [bdubbs] - 更新到 tcl-8.6.3。解决了#3711。

  • 2014-11-11

    • [bdubbs] - 更新到 bash-4.3.30。解决了#3708。

    • [bdubbs] - 更新到 man-db-2.7.1。解决了#3709。

    • [bdubbs] - 增加 binutils-2.24-multiple_plugins-1.patch。感谢 Miklos Karacsony 提供的补丁。解决了#3707。

  • 2014-11-05

    • [bdubbs] - 更新到 groff-1.22.3。解决了#3706。

  • 2014-11-03

    • [bdubbs] - 将 BLFS 里关于 /etc/shells 的页面移动到 LFS 第七章里。解决了#3705。

  • 2014-11-01

    • [bdubbs] - 更新到 linux-3.17.2。解决了#3704。

    • [bdubbs] - 更新到 iproute2-3.17.0。解决了#3703。

  • 2014-10-31

    • [bdubbs] - 更新到 gcc-4.9.2。解决了#3702。

  • 2014-10-30

    • [bdubbs] - 更新到 libtool-2.4.3。解决了#3699。

  • 2014-10-26

    • [bdubbs] - 更新到 libpipeline-1.4.0。解决了#3698。

  • 2014-10-25

    • [bdubbs] - 更新到 tzdata-2014i。解决了#3696。

    • [bdubbs] - 更新到 util-linux-2.25.2。解决了#3697。

  • 2014-10-19

    • [bdubbs] - 移除第五章 tcl 页中对 GMT 的引用。解决了#3692。

    • [bdubbs] - 更新到 linux-3.17.1。解决了#3693。

    • [bdubbs] - 更新到 gettext-0.19.3。解决了#3694。

    • [bdubbs] - 更新到 man-pages-3.75。解决了#3695。

  • 2014-10-11

    • [bdubbs] - 更新到 file-5.20。解决了#3691。

    • [krejzi] - 更新 bash 上游补丁以解决 CVE-2014-6278。

  • 2014-10-08

    • [bdubbs] - 更新到 man-pages-3.74。解决了#3685。

    • [bdubbs] - 更新到 linux-3.17。解决了#3688。

    • [bdubbs] - 更新到 make-4.1。解决了#3689。

  • 2014-09-26

    • [krejzi] - 更新了 bash 上游补丁以解决 CVE-2014-6277。解决了#3686。

    • [krejzi] - 更新 reaadline 上游补丁。解决了#3687。

  • 2014-10-02

    • [bdubbs] - 增加 perl 补丁以解决 CVE-2014-4330。避免 Date::Dumper 中的无限递归。解决了#3681。

    • [bdubbs] - 更新到 grub-2.02~beta2。它已经处于 beta 版本超过9个月了而仍然看不到一个'稳定'版。解决了#3450.

    • [bdubbs] - 更新 glibc 测试方式，之前经常会失败。

  • 2014-09-29

    • [bdubbs] - 更新 bash 上游补丁以解决 CVE-2014-6271，CVE-2014-7169 和 CVE-2014-7187（通过上游补丁 bash43-027）。

    • [bdubbs] - 更新到 tzdata-2014h。解决了#3682。

    • [bdubbs] - 更新到 man-db-2.7.0.2。解决了#3683。

    • [bdubbs] - 优化本书 3.1 中的 wget 命令行。解决了#3684。

  • 2014-09-26

    • [krejzi] - 更新 bash 上游补丁解决 CVE-2014-7169。解决了#3680。

  • 2014-09-24

    • [bdubbs] - 更新到 perl-5.20.1。解决了#3670。

    • [bdubbs] - 更新到 xz-5.0.7。解决了#3671。

    • [bdubbs] - 更新到 linux-3.16.3。解决了#3673。

    • [bdubbs] - 更新到 man-pages-3.73。解决了#3674。

    • [bdubbs] - 更新到 libpipeline-1.3.1。解决了#3675。

    • [bdubbs] - 更新到 man-db-2.7.0.1。解决了#3676。

    • [bdubbs] - 更新到 procps-ng-3.3.10。解决了#3677。

  • 2014-09-23

    • [krejzi] - LFS-7.6-systemd 发布。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    上次发布以来的更新

  • 下一页

    资源


1.4. 资源

第一章 介绍

    更新日志

  • 下一页

    帮助

  • 返回
  • 主页

1.4. 资源

1.4.1. FAQ

如果在构建 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。

1.4.3. IRC频道

有些 LFS 社区的成员会在 IRC 上提供帮助。在使用这种方式之前，请保证你的问题并没有已经在 LFS FAQ 或邮件列表中被回答过了。你可以在 irc.freenode.net 找到这个 IRC 网络。支持频道名字是 #LFS-support。

1.4.4. 镜像站点

LFS 项目在世界范围内有许多镜像站点，方便大家访问我们的网站以及下载所需文件。请访问 LFS 站点 http://www.linuxfromscratch.org/mirrors.html 查看最新的镜像站点列表。

1.4.5. 联系方式

请直接通过某个 LFS 邮件列表（上面已经列出）提出你的问题和评论。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    更新日志

  • 下一页

    帮助


1.5.帮助

第一章 介绍

    资源

  • 下一页

    准备构建

  • 返回
  • 主页

1.5. 帮助

如果在使用本书的过程中有疑问或碰到问题，可以先去看下 FAQ 页面 http://www.linuxfromscratch.org/faq/#generalfaq。那里已经解决了很多经常遇到的问题。如果你的问题在那里找不到答案，可以先尝试找出问题的原因。下面页面里的提示可以提供一些帮你定位问题的帮助：http://www.linuxfromscratch.org/hints/downloads/files/errors.txt。

如果在 FAQ 里找不到你遇到的问题，还可以在这个邮件列表里搜索一下：http://www.linuxfromscratch.org/search.html。

我们还有一个很棒的 LFS 社区，大家都很乐意通过邮件列表和 IRC 提供协助（参看本书章节 “1.4 资源”）。不过，我们每天收到的支持问题中有很多其实可以通过查看 FAQ 和搜索邮件列表轻松解决。所以，为了让我们能最大可能地提供更好的协助，希望你碰到问题能自己先研究一下。这样可以让我们有精力去关注更罕见的支持需求。如果你自己搜索不到解决方式，请在你的帮助请求里收集所有相关信息（下面提到的）。

1.5.1. 需要提供的信息

除了对你遇到的问题的一个简短描述外，任何帮助请求里都需要包含的一些关键信息：

  • 所用手册的版本（本手册是 7.7-systemd）

  • 用来构建 LFS 的宿主机器的 Linux 发行版以及版本

  • 本书章节 vii 所需宿主系统中的脚本打印信息

  • 出现问题的软件包或本书的章节

  • 精确的错误信息或表现形式

  • 注明你是否已经脱离了本书的内容

注意

脱离本书内容并不是说我们就一定不会帮你。毕竟，LFS 还是属于个人爱好。坦率地告知对已验证流程的任何改动，有助于我们评估和找到你问题的可能原因。

1.5.2. 配置脚本问题

如果在运行 configure 脚本时遇到问题，查看一下 config.log 文件。这个文件中会包含 configure 脚本运行时发生的没有输出到屏幕上的错误信息。如果你需要寻求帮助的话请包含相关行。

1.5.3. 编译问题

屏幕上的显示输出和各个文件的内容都有助于定位编译发生问题的原因。configure 脚本和 make 执行时的屏幕打印输出都有用。并不需要包含整个所有输出信息，但是一定要包含足够的相关信息。下面的例子是 make 出错后需要包含的屏幕显示的输出信息：

gcc -DALIASPATH=\"/mnt/lfs/usr/share/locale:.\"
-DLOCALEDIR=\"/mnt/lfs/usr/share/locale\"
-DLIBDIR=\"/mnt/lfs/usr/lib\"
-DINCLUDEDIR=\"/mnt/lfs/usr/include\" -DHAVE_CONFIG_H -I. -I.
-g -O2 -c getopt1.c
gcc -g -O2 -static -o make ar.o arscan.o commands.o dir.o
expand.o file.o function.o getopt.o implicit.o job.o main.o
misc.o read.o remake.o rule.o signame.o variable.o vpath.o
default.o remote-stub.o version.o opt1.o
-lutil job.o: In function `load_too_high':
/lfs/tmp/make-3.79.1/job.c:1565: undefined reference
to `getloadavg'
collect2: ld returned 1 exit status
make[2]: *** [make] Error 1
make[2]: Leaving directory `/lfs/tmp/make-3.79.1'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/lfs/tmp/make-3.79.1'
make: *** [all-recursive-am] Error 2

在这个例子里，很多人可能只包含了最后的部分：

make [2]: *** [make] Error 1

这并没有提供足够的信息来诊断问题，因为它只能说明出问题了，而没有指出哪儿出了问题。需要保留完整的打印信息，像上面例子中的，是因为它包含了所执行的命令以及相应的错误信息。

这个链接 http://catb.org/~esr/faqs/smart-questions.html是一篇关于如何在互联网上寻求帮助的很好的文章。去看一下并遵循文章中给出的提示，可以增加你能得到所想要的帮助的可能性。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    资源

  • 下一页

    准备构建


    帮助

  • 下一页

    准备新分区

  • .
  • 主页

第二部分 准备构建

目录

  • 2. 准备新分区

    • 介绍
    • 创建新分区
    • 在分区上创建文件系统
    • 挂载新分区
    • 设置 $LFS 变量

  • 3. 软件包和补丁

    • 简介
    • 所有软件包
    • 需要的补丁

  • 4. 最后的准备工作

    • 简介
    • 新建 $LFS/tools 文件夹
    • 添加 LFS 用户
    • 设置环境
    • 关于 SBU
    • 关于测试套件

  • 5. 构建临时系统

    • 简介
    • 工具链技术备注
    • 通用编译指南
    • Binutils-2.25 - 第一遍
    • GCC-4.9.2 - 第一遍
    • Linux-3.19 API Headers
    • Glibc-2.21
    • Libstdc++-4.9.2
    • Binutils-2.25 - 第二遍
    • GCC-4.9.2 - 第二遍
    • Tcl-8.6.3
    • Expect-5.45
    • DejaGNU-1.5.2
    • Check-0.9.14
    • Ncurses-5.9
    • Bash-4.3.30
    • Bzip2-1.0.6
    • Coreutils-8.23
    • Diffutils-3.3
    • File-5.22
    • Findutils-4.4.2
    • Gawk-4.1.1
    • Gettext-0.19.4
    • Grep-2.21
    • Gzip-1.6
    • M4-1.4.17
    • Make-4.1
    • Patch-2.7.4
    • Perl-5.20.2
    • Sed-4.2.2
    • Tar-1.28
    • Texinfo-5.2
    • Util-linux-2.26
    • Xz-5.2.0
    • 清理无用内容
    • 更改属主
翻译团队：LCTT 译者/校对：ictlyh,
  • 上一页

    帮助

  • 下一页

    准备新分区

  • .


第二章 准备新分区

第二部分 准备构建

    准备构建

  • 下一页

    介绍

  • 返回
  • 主页

2. 准备新分区

目录

  • 介绍
  • 创建新分区
  • 在分区上创建文件系统
  • 挂载新分区
  • 设置 $LFS 变量
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    准备构建

  • 下一页

    介绍


2.1. 介绍

第二章 准备新分区

    准备新分区

  • 下一页

    创建新分区

  • 返回
  • 主页

2.1. 介绍

在本章中，我们将会准备用于安装 LFS 的分区。包括建立分区、为分区设置文件系统，挂载分区。

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao
  • 上一页

    准备新分区

  • 下一页

    创建新分区


2.2. 创建新分区

第二章 准备新分区

    介绍

  • 下一页

    在分区上创建文件系统

  • 返回
  • 主页

2.2. 创建新分区

与绝大多数其它操作系统相同，安装 LFS 通常需要专门的分区。构建 LFS 系统比较推荐的方法是使用可用的空分区，或者如果条件允许，最好是在未分区的空间里新建分区。

最小化的系统需要大约 4 GB 的分区，这足以存储所有的源码包及满足编译的需求。但如果要将 LFS 作为主要的 Linux 系统，可能需要安装其它附加的软件，这将需要额外的空间。考虑到了日后所需的空间，一个 10 GB 的分区是比较合理的。LFS 系统本身并不会占用这么多的空间。但满足此要求的大分区将能提供足够大的临时储存空间。编译软件包可能需要较大的磁盘空间，但这些空间可以在软件包安装后回收。

由于编译过程中所需的内存（RAM）可能不足，需要使用一个小型的磁盘分区作为 swap 分区。内核会在此分区中储存较少使用的数据，从而为活动进程提供更多的内存。LFS 系统可以与宿主系统共用 swap 分区，这样就没有必要再新建一个了。

启动磁盘分区程序，如 cfdisk 或 fdisk，参数是新分区所在的磁盘名，例如 IDE 主硬盘叫做 /dev/sda。你需要创建一个 Linux 本地分区，并按需创建 swap 分区 。如果你还不知道如何使用这些程序，请参考 cfdisk(8) 或 fdisk(8)。

注意

对于有经验的用户，也可自行定制分区分案。新版 LFS 系统支持软 RAID 或 LVM 逻辑卷。然而，这些方案需要用到 initramfs ，而这涉及到比较复杂的话题。因此不建议首次尝试 LFS 的用户使用这样的分区方法。

请记住新分区的位置（例如，sda5 ）。本书中将称其为 LFS 分区。还需要记住 swap 分区的位置。这些名称将会在 /etc/fstab 文件中用到。

2.2.1. 其它分区问题

LFS 邮件列表中经常有人问到关于系统分区的建议。这一话题非常主观。大多数发行版默认情况下会使用整个磁盘，仅为交换分区保留一小部分空间，但由于种种原因，这并不适合 LFS。这样做会降低灵活性，使得多个发行版或几个 LFS 版本之间共享数据变得困难，也让备份更耗时，还会导致文件系统结构分配不合理而浪费磁盘空间。

2.2.1.1. 根分区

为 LFS 根分区（不要与 /root 目录混淆）分配 10 GB的空间是适用于大多数系统的折中方案。这为构建 LFS 和大多数 BLFS 提供了足够的空间，但也不是很大，因此能很容易的创建多个用于实验的分区。

2.2.1.2. 交换分区 （Swap）

大多数发行版会自动创建交换分区。一般来说，交换分区的推荐大小为物理内存的两倍左右，实际上并无此必要。若磁盘空间有限，可以将交换分区设置为 2 GB，并注意交换分区的使用情况。

（译者注：因为现代电脑大多拥有较大的内存，所以在大多数情况下，都不需要设置 swap 分区。但是，Fedora、Ubuntu 这样的操作系统，可能会在系统安装过程中提醒用户因为没有创建 swap 而导致一些问题。这样的“恐吓”也许会让不少用户选择重新设置 swap 分区。但是对于 LFS 或者是 Gentoo 总是编译源代码的发行版来说，swap 分区是极其有必要的。在编译过程中，编译系统会将那些不总是变化的文件寄存在 swap 分区中，而为软件编译过程提供更多的内存空间。）

发生内存交换其实并不好。通常，你只需要观察磁盘活动以及系统对命令的响应程度就能知道这个系统是否在进行交换。通常在使用非常不合理的命令时才会发生交换，如尝试编辑一个大小为 5 GB 的文件时。如果交换在你的系统上是常态，那最好的办法就是为你的系统添置更多的物理内存。

2.2.1.3. 常用分区

在分配磁盘时，有些分区不是必须的，但却值得你考虑。以下列表并不全面，仅供参考。

  • /boot 分区 - 强烈推荐。此分区用于存储内核和其它启动信息。为了减少大容量磁盘启动时的潜在问题，尽量将该分区设为磁盘驱动器上第一个物理分区。100 MB 的空间就十分充裕了。

  • /home 分区 - 强烈推荐。home 目录可用于跨发行版或多个 LFS 版本之间共享用户自定义内容。应该将尽量多的磁盘都分配给 home 分区。（译者注：home 分区尽量大的意义在于，传统的 Linux 哲学思想中 home 分区用于存储用户的个人文件。且即使系统重装，也无须格式化 home 分区。甚至，新的Linux 系统的用户名完全可以和之前的一样。不过，其实笔者建议用户再单独给出一个分区，用于存储那些“永恒”不变的内容，比如下载的系统镜像等。这样的分区可以挂载在 /mnt 目录下。）

  • /usr 分区 - 独立的 /usr 分区常见于服务器或无盘工作站。LFS 通常不需要。5 GB 大小足以应付大部分安装。

  • /opt 分区 - 这个分区在 BLFS 中比较有用，因为像 Gnome 或 KDE 这样的大型安装包可以装在此分区中，而不需要将文件塞到 /usr 分区。如果使用的话，5 到 10 GB 的空间就足够了。

  • /tmp 分区 - 独立的 /tmp 分区是比较少见的，但这在配置瘦客户端时会有用。如果使用的话，很少超过几 GB 。

  • /usr/src 分区 - 这个分区可用于存储 BLFS 源文件并在构建不同版本的 LFS 中共享。它也可用于构建 BLFS 软件包。30 - 50 GB 的分区可以提供足够的空间。

任何你需要在启动时自动挂载的单独分区都需要写入到 /etc/fstab 文件中。有关如何指定分区的细节将在 第8.2节，“创建 /etc/fstab 文件”中讨论 。

翻译团队：LCTT 译者/校对：kevinSJ,dongfengweixiao,wxy
  • 上一页

    介绍

  • 下一页

    在分区上创建文件系统


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

第二章 准备新分区

    创建新分区

  • 下一页

    挂载新分区

  • 返回
  • 主页

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

现在已经有了一个空的分区，可以创建文件系统了。LFS 可以使用 Linux 内核能识别的任何文件系统，但最常用的类型是 ext3 和 ext4。当然，至于具体采用哪种文件系统，应该取决于所要存储的文件特点和分区的大小。例如：

ext2

适用于那些分区容量不是太大，更新也不频繁的情况，例如 /boot 分区。

ext3

是 ext2 的改进版本，其支持日志功能，能够帮助系统从非正常关机导致的异常中恢复。它通常被用作通用的文件系统。

ext4

是 ext 文件系统的最新版。提供了很多新的特性，包括纳秒级时间戳、创建和使用巨型文件(16TB)、以及速度的提升。

其它文件系统，包括 FAT32、NTFS、ReiserFS、JFS 和 XFS 等都在专门领域有其独到的作用。关于这些文件系统更多的信息可以在 http://en.wikipedia.org/wiki/Comparison_of_file_systems 找到。

LFS 假定根文件系统(/)是 ext4 类型的。要在 LFS 分区上创建 ext4 文件系统，运行以下命令：

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

如果你已经有了现成的 swap 分区，不需要重新格式化。如果是新建 swap 分区，需要用下面的命令初始化：

mkswap /dev/<yyy>

其中，<xxx> 和 <yyy>都需要替换为实际的设备名称（形如 sda1，sdb2）。

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao,wxy
  • 上一页

    创建新分区

  • 下一页

    挂载新分区


2.4. 挂载新分区

第二章 准备新分区

    在分区上创建文件系统

  • 下一页

    设置 $LFS 变量

  • 返回
  • 主页

2.4. 挂载新分区

至此，文件系统已经创建妥当，下一步就是访问这些分区了。为此，需要将这些建立的分区挂载到选定的挂载点。本书假定的挂载点为 /mnt/lfs，这里，你可以根据喜好自行更改（译者注：这里强烈建议，看这本书的读者就将挂载点设置为 /mnt/lfs 吧，这样在运行后面的命令时，大多数命令都无需做任何的修改）。

运行以下命令，将欲选定的挂载点设置为 LFS 环境变量的值：

export LFS=/mnt/lfs

下一步，创建挂载点并用下面的命令挂载 LFS 文件系统：

mkdir -pv $LFS	# 建立挂载点
mount -v -t ext4 /dev/<xxx> $LFS	# 将 /dev/<xxx> 挂载到 $LFS

(译者注：如果重启设备，可能进入后发现 /mnt/lfs 目录下没有内容，这是只需要再次挂载 /dev/<xxx> 到 /mnt/lfs。 此处 <xxx> 用实际的设备名称代替 - 下同）。

如果 LFS 使用了多个分区，(比如：一个 /，一个 /usr)，用下面的命令挂载它们：

mkdir -pv $LFS	# 建立 / 分区的挂载点
mount -v -t ext4 /dev/<xxx> $LFS	# 将 /dev/<xxx> 挂载到 $LFS
mkdir -v $LFS/usr	# 建立 $LFS/usr 挂载点，用于挂载 /usr
mount -v -t ext4 /dev/<yyy> $LFS/usr	# 将 /dev/<yyy> 挂载到 $LFS/usr

（译者注：挂载是有顺序的！假如需要挂载以下分区：/、/usr、/usr/bin，在挂载的时候，只能按照这样的顺序挂载，假如先挂载 /，然后挂载 /usr/bin，再挂载 /usr 将会出错！）

需要注意的是挂载的时候请不要使用过于严格的权限参数(比如 nosuid 或 nodev 选项)。用不带任何参数的 mount 命令查看挂载的 LFS 分区具体使用了哪些参数。如果设置了 nosuid 及 nodev 参数，请重新挂载。

（译者注：使用不带任何参数的 mount 命令，可以得到类似如下的输出： devtmpfs on /dev type devtmpfs (rw,relatime,size=500896k,nr_inodes=125224,mode=755) 其中，括号内的内容为挂载的参数。）

如果你正在使用交换分区，用 swapon 命令确保它已经启用。

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

用 swap 分区的名字替换<zzz>。

到现在，所有的准备工作都做的差不多了，是时候下载软件包了。

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao,wxy
  • 上一页

    在分区上创建文件系统

  • 下一页

    设置 $LFS 变量


2.5. 设置 $LFS 变量

第二章 准备新分区

    挂载新分区

  • 下一页

    软件包和补丁

  • 返回
  • 主页

2.5.设置 $LFS 变量

在整本书里，会多次用到环境变量 LFS。你应该确保这个变量在整个 LFS 构建过程中总是定义了的。它应该被设置为你将要构建的 LFS 系统的目录名字——这里我们使用 /mnt/lfs 作为例子，但是选择哪一个目录是你的自由。如果你把 LFS 构建到一个单独的分区里，这个目录将成为那个分区的挂载点。选择一个目录并用以下命令设置该变量：

export LFS=/mnt/lfs

设置这个变量的好处在于当我们使用类似 mkdir -v $LFS/tools 的命令时可以直接这样简洁的输入。shell 在处理这条命令时，会自动替换 “$LFS” 为 “/mnt/lfs”（或任何这个变量所指向的地方）。

不论何时当你离开而又重新进入这个工作环境时都不要忘了检查 LFS 是否设置（比如当你使用 su 切换到 root 或是另一个用户时）。使用如下命令检查 LFS 变量是否正确设置:

echo $LFS

确保输出显示的是你构建 LFS 的那个目录的路径，如果你按照例子设置的，那就是 /mnt/lfs 。如果你输出的不是正确的路径，请使用本页前一部分提供的命令把 $LFS 重新设置到正确的目录。

注意

确保一直设置了 LFS 变量的一个方法是，同时编辑你的主目录下的 .bash_profile 和 /root/.bash_profile，把上方的导出命令输入进去。

翻译团队：LCTT 译者/校对：H-mudcup,wxy
  • 上一页

    挂载新系统

  • 下一页

    软件包和补丁


第三章 软件包与补丁

第二部分 准备构建

    设定 $LFS 环境变量

  • 下一页

    简介

  • 返回
  • 主页

3. 软件包与补丁

目录

  • 简介
  • 所有软件包
  • 需要的补丁
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    设定 $LFS 环境变量

  • 下一页

    简介


3.1. 简介

第三章 软件包与补丁

    软件包与补丁

  • 下一页

    所有软件包

  • 返回
  • 主页

3.1. 简介

本章列出了一个需要下载的软件包列表，它们用来构建一个基本的 Linux 系统。所列出来的版本号对应着该软件的确定可以正常工作的版本，本书是以它们为基础的。我们强烈反对使用更新一些的版本，因为某个版本能用的编译指令可能并不适用于新版本。最新的软件包也可能会有问题而需要做些修补。我们会在本书的开发版本中解决这些问题并固定下来。

下载位置可能不会一直有效。如果在本书发布后下载位置变了，Google（http://www.google.com/）提供的搜索引擎可以找到大多数软件包。如果搜不到，试试这里 http://www.linuxfromscratch.org/lfs/packages.html#packages 提到的其他下载地址。

下载好的软件包和补丁需要保存在某个地方，以方便在整个构建过程中都能有效访问。另外还需要一个工作目录用于解压源代码并执行编译。可以用目录 $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 开始，多了一个单独的文件 md5sums ，可以在正式开始前校验所有的文件是否都正确。将这个文件拷贝到 $LFS/sources 目录里并执行：

pushd $LFS/sources
md5sum -c md5sums
popd

（译者注：多数情况下校对会不成功，并不影响构建。）

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    软件包和补丁

  • 下一页

    所有软件包


3.2. 所有软件包

第三章 软件包与补丁

    简介

  • 下一页

    需要的补丁

  • 返回
  • 主页

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://www.gnu.org/software/attr/

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

MD5 校验： 84f58dec00b60f2dc8fd1c9709291cc7

Autoconf (2.69) - 1,186 KB:

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

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

MD5 校验： 50f97f4159805e374639a73e2636f22e

Automake (1.15) - 1,462 KB:

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

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

MD5 校验： 9a1ddb0e053474d9d1105cfe39b0c48d

Bash (4.3.30) - 7,7791 KB:

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

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

MD5 校验： a27b3ee9be83bd3ba448c0ff52b28447

Bc (1.06.95) - 288 KB:

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

下载： http://alpha.gnu.org/gnu/bc/bc-1.06.95.tar.bz2

MD5 校验： 5126a721b73f97d715bb72c13c889035

Binutils (2.25) - 23,486 KB:

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

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

MD5 校验： d9f3303f802a5b6b0bb73a335ab89d66

Bison (3.0.4) - 1,928 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

Check (0.9.14) - 741 KB:

主页： http://check.sourceforge.net/

下载： http://sourceforge.net/projects/check/files/check/0.9.14/check-0.9.14.tar.gz

MD5 校验： 38263d115d784c17aa3b959ce94be8b8

Coreutils (8.23) - 5,250 KB:

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

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

MD5 校验： abed135279f87ad6762ce57ff6d89c41

D-Bus (1.8.16) - 1,824 KB:

主页： http://www.freedesktop.org/wiki/Software/dbus

下载： http://dbus.freedesktop.org/releases/dbus/dbus-1.8.16.tar.gz

MD5 校验： 020824a38850501e7d6ba8307a7c5ac3

DejaGNU (1.5.2) - 583 KB:

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

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

MD5 校验： 97a86a21c92ac456641a97f712ea40ac

Diffutils (3.3) - 1,170 KB:

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

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

MD5 校验： 99180208ec2a82ce71f55b0d7389f1b3

E2fsprogs (1.42.12) - 6,233 KB:

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

下载： http://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.42.12/e2fsprogs-1.42.12.tar.gz

MD5 校验： 68255f51be017a93f2f6402fab06c2bf

Expat (2.1.0) - 552 KB:

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

下载： http://prdownloads.sourceforge.net/expat/expat-2.1.0.tar.gz

MD5 校验： dd7dab7a5fea97d2a6a43f511449b7cd

Expect (5.45) - 614 KB:

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

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

MD5 校验： 44e1a4f4c877e9ddc5a542dfa7ecc92b

File (5.22) - 716 KB:

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

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

MD5 校验： 8fb13e5259fe447e02c4a37bc7225add

注意

File (5.22)可能已经不能从列出来的位置下载了。该站点管理员在新版本发布后不小心删除了旧版本。一个正确版本的替代下载位置在： http://www.linuxfromscratch.org/lfs/download.html#ftp。

Findutils (4.4.2) - 2,100 KB:

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

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

MD5 校验： 351cc4adb07d54877fa15f75fb77d39f

Flex (2.5.39) - 1,575 KB:

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

下载： http://prdownloads.sourceforge.net/flex/flex-2.5.39.tar.bz2

MD5 校验： 77d44c6bb8c0705e0017ab9a84a1502b

Gawk (4.1.1) - 2,146 KB:

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

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

MD5 校验： a2a26543ce410eb74bc4a508349ed09a

GCC (4.9.2) - 87,832 KB:

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

下载： http://ftp.gnu.org/gnu/gcc/gcc-4.9.2/gcc-4.9.2.tar.bz2

MD5 校验： 4df8ee253b7f3863ad0b86359cd39c43

GDBM (1.11) - 796 KB:

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

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

MD5 校验： 72c832680cf0999caedbe5b265c8c1bd

Gettext (0.19.4) - 6,501 KB:

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

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

MD5 校验： 997c9070354eff5517115feaea6038f0

Glibc (2.21) - 12,034 KB:

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

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

MD5 校验： 9cb398828e8f84f57d1f7d5588cf40cd

GMP (6.0.0a) - 1,860 KB:

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

下载： http://ftp.gnu.org/gnu//gmp/gmp-6.0.0a.tar.xz

MD5 校验： 1e6da4e434553d2811437aa42c7f7c76

Gperf (3.0.4) - 960 KB:

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

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

MD5 校验： c1f1db32fb6598d6a93e6e88796a8632

Grep (2.21) - 1,232 KB:

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

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

MD5 校验： 43c48064d6409862b8a850db83c8038a

Groff (1.22.3) - 4,091 KB:

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

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

MD5 校验： cc825fa64bc7306a885f2fb2268d3ec5

GRUB (2.02~beta2) - 5,663 KB:

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

下载： http://alpha.gnu.org/gnu/grub/grub-2.02~beta2.tar.xz

MD5 校验： be62932eade308a364ea4bbc91295930

Gzip (1.6) - 712 KB:

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

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

MD5 校验： da981f86677d58a106496e68de6f8995

Iana-Etc (2.30) - 201 KB:

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

下载： http://anduin.linuxfromscratch.org/sources/LFS/lfs-packages/conglomeration/iana-etc/iana-etc-2.30.tar.bz2

MD5 校验： 3ba3afb1d1b261383d247f46cb135ee8

Inetutils (1.9.2) - 2,188 KB:

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

下载： http://ftp.gnu.org/gnu/inetutils/inetutils-1.9.2.tar.gz

MD5 校验： aa1a9a132259db83e66c1f3265065ba2

Intltool (0.50.2) - 185 KB:

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

下载： http://launchpad.net/intltool/trunk/0.50.2/+download/intltool-0.50.2.tar.gz

MD5 校验： 23fbd879118253cb99aeac067da5f591

IPRoute2 (3.19.0) - 445 KB:

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

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

MD5 校验： 237083a1e3c388cde7a115a5724dc72a

Kbd (2.0.2) - 2,105 KB:

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

下载： https://www.kernel.org/pub/linux/utils/kbd/kbd-2.0.2.tar.gz

MD5 校验： ba56fb5bfd44acea83fc5dac4a9b7f15

Kmod (19) - 1,440 KB:

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

MD5 校验： a08643f814aa4efc12211c6e5909f4d9

Less (458) - 308 KB:

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

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

MD5 校验： 935b38aa2e73c888c210dedf8fd94f49

Libcap (2.24) - 64 KB:

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

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

MD5 校验： d43ab9f680435a7fff35b4ace8d45b80

Libpipeline (1.4.0) - 787 KB:

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

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

MD5 校验： 660f4ac9340834a231d1516746d03d28

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 (3.19) - 79,775 KB:

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

下载： https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz

MD5 校验： d3fc8316d4d4d04b65cbc2d70799e763

注意

Linux内核更新相对比较频繁，大多数时候是因为发现了安全漏洞。当前最新的 3.19.x 版本内核都应该可以使用，除非在勘误页有其他说明。

对于网速较慢或带宽费用较高的用户如果希望更新 Linux 内核，可以分开下载基线版本的软件包及补丁。这样可以通过打上小版本发布中所附带的更新补丁的方式，节省一些时间或费用。

M4 (1.4.17) - 1,122 KB:

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

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

MD5 校验： 12a3c829301a4fd6586a57d3fcf196dc

Make (4.1) - 1,297 KB:

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

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

MD5 校验： 57a7a224a822f94789a587ccbcedff69

Man-DB (2.7.1) - 1,464 KB:

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

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

MD5 校验： 88d32360e2ed18e05de9b528ad336fd8

Man-pages (3.79) - 1,290 KB:

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

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

MD5 校验： 938950106f4483383dd367fe9e8aab9f

MPC (1.0.2) - 619 KB:

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

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

MD5 校验： 68fadff3358fb3e7976c7a398a0af4c3

MPFR (3.1.2) - 1,049 KB:

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

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

MD5 校验： e3d203d188b8fe60bb6578dd3152e05c

Ncurses (5.9) - 2,760 KB:

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

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

MD5 校验： 8cb9c412e5f2d96bc6f459aa8c6282a1

Patch (2.7.4) - 698 KB:

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

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

MD5 校验： abc59498fcdddd44e0d07764aa105fd2

Perl (5.20.2) - 13,396 KB:

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

下载： http://www.cpan.org/src/5.0/perl-5.20.2.tar.bz2

MD5 校验： 21062666f1c627aeb6dbff3c6952738b

Pkg-config (0.28) - 1,892 KB:

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

下载： http://pkgconfig.freedesktop.org/releases/pkg-config-0.28.tar.gz

MD5 校验： aa3c86e67551adc3ac865160e34a2a0d

Procps (3.3.10) - 801 KB:

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

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

MD5 校验： 1fb7f3f6bf92ce6c5c9ed9949ae858fe

Psmisc (22.21) - 447 KB:

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

下载： http://downloads.sourceforge.net/project/psmisc/psmisc/psmisc-22.21.tar.gz

MD5 校验： 935c0fd6eb208288262b385fa656f1bf

Readline (6.3) - 2,411 KB:

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

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

MD5 校验： 33c8fb279e981274f485fd91da77e94a

Sed (4.2.2) - 1,035 KB:

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

下载： http://ftp.gnu.org/gnu/sed/sed-4.2.2.tar.bz2

MD5 校验： 7ffe1c7cdc3233e1e0c4b502df253974

Shadow (4.2.1) - 1,558 KB:

下载： http://pkg-shadow.alioth.debian.org/releases/shadow-4.2.1.tar.xz

MD5 校验： 2bfafe7d4962682d31b5eba65dba4fc8

Systemd (219) - 3,848 KB:

主页： http://www.freedesktop.org/wiki/Software/systemd/

下载： http://www.freedesktop.org/software/systemd/systemd-219.tar.xz

MD5 校验： e0d6c9a4b4f69f66932d2230298c9a34

Tar (1.28) - 1,921 KB:

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

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

MD5 校验： 49b6306167724fe48f419a33a5beb857

Tcl (8.6.3) - 8,693 KB:

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

下载： http://downloads.sourceforge.net/project/tcl/Tcl/8.6.3/tcl8.6.3-src.tar.gz

MD5 校验： db382feca91754b7f93da16dc4cdad1f

Texinfo (5.2) - 3,724 KB:

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

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

MD5 校验： cb489df8a7ee9d10a236197aefdb32c5

Time Zone Data (2015a) - 286 KB:

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

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

MD5 校验： 4ed11c894a74a5ea64201b1c6dbb8831

Util-linux (2.26) - 3,758 KB:

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

下载： https://www.kernel.org/pub/linux/utils/util-linux/v2.26/util-linux-2.26.tar.xz

MD5 校验： 912c550a4e5c47c0ce9abd0733fa9a64

Vim (7.4) - 9,632 KB:

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

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

MD5 校验： 607e135c559be642f210094ad023dc65

XML::Parser (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 Utils (5.2.0) - 984 KB:

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

下载： http://tukaani.org/xz/xz-5.2.0.tar.xz

MD5 校验： d87c242778fcf5ce4598de80a55ded28

Zlib (1.2.8) - 441 KB:

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

下载： http://www.zlib.net/zlib-1.2.8.tar.xz

MD5 校验： 28f1205d8dd2001f26fec1e8c2cebe37

这些软件包总大小：大约 397 MB

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    简介

  • 下一页

    需要的补丁


3.3. 需要的补丁

第三章 软件包与补丁

    所有软件包

  • 下一页

    最后的准备工作

  • 返回
  • 主页

3.3. 需要的补丁

除了下载软件包外，还需要几个补丁。这些补丁修正了软件包中应该由维护者来解决的问题。补丁也会对软件包做一些小调整方便大家使用。构建 LFS 系统需要下面的补丁：

Bash 上游修复补丁 - 8.8 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/bash-4.3.30-upstream_fixes-1.patch

MD5 校验： e2571929a43fdf76ae1eb683fe86b5c0

Bc 内存泄漏补丁 - 1.4 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/bc-1.06.95-memory_leak-1.patch

MD5 校验： 877e81fba316fe487ec23501059d54b8

Bzip2 文档补丁 - 1.6 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/bzip2-1.0.6-install_docs-1.patch

MD5 校验： 6a5ac7e89b791aae556de0f745916f7f

Coreutils 国际化修复补丁 - 138 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/coreutils-8.23-i18n-1.patch

MD5 校验： 587051bc411e0da9b3bf8984b49b364e

Glibc FHS 补丁 - 2.8 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/glibc-2.21-fhs-1.patch

MD5 校验： 9a5997c3452909b1769918c759eff8a2

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

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/kbd-2.0.2-backspace-1.patch

MD5 校验： f75cca16a38da6caa7d52151f7136895

Mpfr 上游修复补丁 - 38 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/mpfr-3.1.2-upstream_fixes-3.patch

MD5 校验： 5ba8bafe42920d6e570567529629bc59

Readline 上游修复补丁 - 8 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/readline-6.3-upstream_fixes-3.patch

MD5 校验： 6b0d9f4e79319d56a7fee9b35e5cfd1b

Systemd 兼容性补丁 - 12 KB:

下载： http://www.linuxfromscratch.org/patches/lfs/7.7-systemd/systemd-219-compat-1.patch

MD5 校验： 5b629e00a1a501a103b5561df3ccf148

这些补丁文件总大小：大约 222.6 KB

除了以上所要求的补丁外，还有一些由 LFS 社区创建的可选补丁。这些可选补丁解决了一些小问题或者打开某个默认关闭的功能。请查阅补丁数据库 http://www.linuxfromscratch.org/patches/downloads/，获取适合你系统需求的额外补丁。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    所有软件包

  • 下一页

    最后的准备工作


第四章 最后的准备工作

第二部分 准备构建

    需要的补丁

  • 下一页

    简介

  • 返回
  • 主页

4. 最后的准备工作

目录

  • 简介
  • 创建 $LFS/tools 文件夹
  • 添加 LFS 用户
  • 设置环境
  • 关于 SBU
  • 关于测试套件
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    需要的补丁

  • 下一页

    简介


4.1. 简介

第四章 最后的准备工作

    最后的准备工作

  • 下一页

    创建 $LFS/tools 文件夹

  • 返回
  • 主页

4.1. 简介

在本章，我们还需要为构建临时系统做一些额外的准备工作。我们会在 $LFS 中新建一个文件夹用于临时工具的安装，增加一个非特权用户用于降低风险，并为该用户创建合适的构建环境。我们也会解释用于测量构建 LFS 软件包花费时间的单位，或者称为“标准编译单位（SBU）”，并给出一些关于软件包测试套件的信息。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    最后的准备工作

  • 下一页

    创建 $LFS/tools 文件夹


4.2. 创建 $LFS/tools 文件夹

第四章 最后的准备工作

    简介

  • 下一页

    添加 LFS 用户

  • 返回
  • 主页

4.2. 创建 $LFS/tools 文件夹

所有第五章中编译的软件都会安装到 $LFS/tools 文件夹，以确保和第六章中编译的软件相互分离。这里编译的软件是临时工具，不会成为最终 LFS 系统的一部分。将这些软件保存在单独的文件夹中，后面使用完之后就可以轻易的丢弃。这也可以防止这些程序在宿主机生成目录中突然停止工作（在第五章中很容易发生意外）。

以 root 用户运行以下的命令来创建需要的文件夹：

mkdir -v $LFS/tools

下一步是在宿主系统中创建 /tools 的符号链接，将其指向 LFS 分区中新建的文件夹。同样以 root 用户运行下面的命令：

ln -sv $LFS/tools /

注意

上面的命令是正确的。ln 命令有一些语法变种，所以在报告你觉得可能是一个错误之前检查一下info coreutils ln 以及 ln(1)。

创建的符号链接使得编译的工具链总是指向 /tools 文件夹,也就是说编译器、汇编器以及链接器在第五章中（我们仍然使用宿主机的一些工具的时候）和下一章中（当我们 “chrooted” 到 LFS 分区时）都可以工作。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    简介

  • 下一页

    添加 LFS 用户


4.3. 添加 LFS 用户

第四章 最后的准备工作

    创建 $LFS/tools 文件夹

  • 下一页

    设置环境

  • 返回
  • 主页

4.3. 添加 LFS 用户

当以 root 用户登录时，犯一个小错误可能会破坏或摧毁整个系统。因此，我们建议在本章中以非特权用户编译软件包。你可以使用你自己的用户名，但要容易的话，就建立一个干净的工作环境，创建一个名为 lfs 的新用户作为新组（名字也是 lfs ）的成员，并在安装过程中使用这个用户。以 root 用户运行以下命令来添加新用户：

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

命令行选项的意思：

-s /bin/bash

把 bash 设置为 lfs 用户的默认 shell。

-g lfs

这个选项将用户 lfs 添加到组 lfs 中。

-m

为 lfs 用户创建主目录。

-k /dev/null

这个参数通过改变输入位置为特殊的空（null）设备，以防止可能从一个模版目录中（默认是 /etc/skel）复制文件。

lfs

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

要以 lfs 用户身份登录（以 root 身份登录切换到 lfs 用户时不要求 lfs 用户设置了密码），需要给 lfs 用户一个密码：

passwd lfs

通过更改文件夹所有者为 lfs，为用户 lfs 赋予了访问 $LFS/tools 文件夹的所有权限：

chown -v lfs $LFS/tools

如果正如建议的一样创建了一个单独的工作目录，给 lfs 用户赋予这个文件夹的所有权：

chown -v lfs $LFS/sources

下一步，以 lfs 用户身份登录。可以能通过一个虚拟控制台、显示控制器，或者下面的切换用户命令完成：

su - lfs

这个 “-” 指示 su 启动登录 shell，而不是一个非登录 shell。关于这两种 shell 类型的区别，可以在 bash(1) 和 info bash 中查看详细信息。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    创建 $LFS/tools 文件夹

  • 下一页

    设置环境


4.4. 设置环境

第四章 最后的准备工作

    添加 LFS 用户

  • 下一页

    关于 SBU

  • 返回
  • 主页

4.4. 设置环境

通过为 bash shell 创建两个开机启动的文件设置好工作环境。当以 lfs 用户身份登录时，运行以下命令创建一个新的 .bash_profile 文件：

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

当以 lfs 用户身份登录时，初始 shell 通常是一个可登录的 shell，它先读取宿主机的 /etc/profile 文件（很可能包括一些设置和环境变量），然后是 .bash_profile 文件。.bash_profile 文件中的 exec env -i.../bin/bash 命令用一个除了 HOME、TERM 和 PS1 变量，完全空环境的 shell 代替运行中的 shell。这可以确保没有不必要的或者有潜在风险的环境变量从宿主机系统中泄露到构建环境。这里使用的技巧是为了有一个干净环境。

新的 shell 实例是一个非登录 shell，不会读取 /etc/profile 或者 .bash_profile 文件，而是读取 .bashrc 文件。 现在创建 .bashrc 文件：

cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL LFS_TGT PATH
EOF

set +h 命令关闭了 bash 的哈希功能。 哈希通常是一个有用的功能，bash 用一个哈希表来记录可执行文件的完整路径，以避免搜索 PATH 的时间和又找到一个相同的可执行文件。然而，新工具要一安装后就使用。通过关闭哈希功能，一个程序准备运行时 shell 总是会搜索 PATH 变量。如此，shell 能在新编译的工具可用时马上在文件夹 $LFS/tools 中找到，而不是记录相同程序在其它地方的之前版本。

设置用户文件新建掩码（umask）为 022 ，确保新建的文件和目录只有它们自己的所有者可写，任何人都可读和可执行(假定 open(2) 系统调用使用的默认模式是新文件使用 644 模式，文件夹使用 755 模式)。

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

LC_ALL 变量控制特定程序的本地化，使得它们的消息能遵循特定国家的惯例。设置 LC_ALL 为 “POSIX” 或 “C”（两者是等价的），确保 chroot 环境中一切如期望的那样进行。

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

把 /tools/bin 放在标准的 PATH 变量前面， 第五章中安装的软件一安装完成 shell 就可使用。这和关闭哈希功能一起，降低了在第五章环境中新程序可用时宿主机器使用旧程序的风险。

最后，启用刚才创建的用户配置文件，为编译临时工具完全准备好环境：

source ~/.bash_profile
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    添加 LFS 用户

  • 下一页

    关于 SBU


4.5. 关于 SBU

第四章 最后的准备工作

    设置环境

  • 下一页

    关于测试套件

  • 返回
  • 主页

4.5. 关于 SBU

不少人在开始做之前都想要知道，编译和安装一个软件包到底需要多长的时间。实在是抱歉，因为 Linux From Scratch 能够运行于众多的硬件上，所以具体的编译时间无法一概而论。举一个简单的例子：在最快的硬件设备上，编译那种非常巨大的软件包（如 Glibc）可能仅需要 20 分钟，在那种很慢很慢的硬件上呢，这个时间可能就变成 3 天了。所以，这里使用 SBU（标准编译单位）来指代具体的编译时间。

SBU 衡量方式如下。我们以第五章编译的第一个软件包 Binutils 所用时间作为一个标准编译单位（SBU），其它软件的生成时间都以其为标准进行比较。

例如，假如编译一个软件耗时 4.5 SBU，而编译安装初代 Binutils 用时 10 分钟的话，那么编译这个软件包大约耗时 45 分钟。当然啦，对于大多数人来说，编译 Binutils 可用不了 10 分钟那么久。

一般来说，SBU 的结果并不准确，因为影响编译的因素太多，例如宿主机的 GCC 版本的不同就会改变编译的时间。所以更多的时候，这仅仅是提供一个编译和安装时间的预估，有些情况下，预估时间和实际编译时间可能相差几十分钟。

注意

对于大多数带有多个处理器（或内核）的现代操作系统而言，可以通过设置环境变量或者是告知 make 程序具体可用的处理器数目，通过“并行编译”来减少编译的时间。例如，对于 Core2Duo 可以通过以下参数实现两个处理器同时编译：

export MAKEFLAGS='-j 2'

或者直接这样编译：

make -j2

当使用多处理器同时编译，SBU 的结果可能和本书提供的建议值有所不同。在一些情况下，使用多处理器同时编译可能失败，分析错误日志变得异常困难：因为不同处理器之间的执行路线是交错的。如果你在编译的时候遇到问题，那么请回过来使用单处理器编译，以正确地查看错误消息。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    设置环境

  • 下一页

    关于测试套件


4.6. 关于测试套件

第四章 最后的准备工作

    关于 SBU

  • 下一页

    构建临时系统

  • 返回
  • 主页

4.6. 关于测试套件

很多软件包都提供相应的测试套件。在新构建的系统上运行测试套件一直都是一个很好的习惯：它可以帮助我们“检查”软件编译是否正确。经由一系列的测试，套件往往能够检查出软件包的功能是否都如开发人员预想的那样正常。但是，它并不能总是保证所测试的软件包就一定没有问题。

有一些测试套件要比其它的更重要。例如，核心工具链软件包 GCC、Binutils 和 Glibc，对于一个系统的正常运转起到至关重要的作用。GCC 和 Glibc 的测试套件可能要花费很长的时间才能完成，尤其对于那些硬件性能不是很好的设备来说，但是还是强烈推荐完成它们！

注意

经验表明，在第五章中运行测试套件可不是什么好主意。一个无法回避的现实是宿主机系统或多或少的都会对实际测试产生一些影响。这往往会导致出现一起让人摸不着头脑的错误信息。第五章中提及的这些工具都是临时的，最终我们都不需要它们。所以，我们不建议一般用户在第五章中运行测试套件。运行这些测试套件可以给测试和开发人员提供一些有用的信息，但是这依旧是可选项。

运行 GCC 和 Binutils 测试套件，都可能会遇到这样的一个问题：伪终端（pseudo terminals，PTY）可能会耗尽。出现此问题的原因很多，但是一个主要的原因是因为宿主机没有正确的设置 devpts 文件系统。在此页面有对这一问题更加详尽的讨论： http://www.linuxfromscratch.org/lfs/faq.html#no-ptys。

还有一些测试套件运行错误，是开发人员已知且被视为不重要的。请访问 http://www.linuxfromscratch.org/lfs/build-logs/7.7-systemd/ 来查看你遇到的测试问题是否都是别人已经遇到或者预料到。此网址涉及的内容会贯穿全书所有的测试。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    关于 SBU

  • 下一页

    构建临时系统


第五章 构建临时系统

第二部分 准备构建

    关于测试套件

  • 下一页

    简介

  • 返回
  • 主页

5. 构建临时系统

目录

  • 简介
  • 工具链技术备注
  • 通用编译指南
  • Binutils-2.25 - 第一遍
  • GCC-4.9.2 - 第一遍
  • Linux-3.19 API 头文件
  • Glibc-2.21
  • Libstdc++-4.9.2
  • Binutils-2.25 - 第二遍
  • GCC-4.9.2 - 第二遍
  • Tcl-8.6.3
  • Expect-5.45
  • DejaGNU-1.5.2
  • Check-0.9.14
  • Ncurses-5.9
  • Bash-4.3.30
  • Bzip2-1.0.6
  • Coreutils-8.23
  • Diffutils-3.3
  • File-5.22
  • Findutils-4.4.2
  • Gawk-4.1.1
  • Gettext-0.19.4
  • Grep-2.21
  • Gzip-1.6
  • M4-1.4.17
  • Make-4.1
  • Patch-2.7.4
  • Perl-5.20.2
  • Sed-4.2.2
  • Tar-1.28
  • Texinfo-5.2
  • Util-linux-2.26
  • Xz-5.2.0
  • 清理无用内容
  • 改变属主
翻译团队：LCTT 译者/校对：Yuking-net,wxy
  • 上一页

    关于测试套件

  • 下一页

    简介


5.1. 简介

第五章 构建临时系统

    构建临时系统

  • 下一页

    工具链技术备注

  • 返回
  • 主页

5.1 简介

本章将向您展示如何构造一个最小的 Linux 系统。该系统将包含刚刚满足构建第六章中的最终 LFS 系统所需的工具，以及一个比最小环境具有更好用户便利性的工作环境。

构建该最小系统有两个步骤。第一步是构建一个宿主系统无关的新工具链（编译器、汇编器、链接器、库和一些有用的工具）。第二步则是使用该工具链构建其它的基础工具。

本章中编译得到的文件将被安装在目录 $LFS/tools 中，以使其与下一章中安装的文件和宿主系统生成的目录分开。这是因为此处编译的软件包都是临时性的，因此我们不愿意它们污染后面即将制作的 LFS 系统。

翻译团队：LCTT 译者/校对：Yuking-net,wxy
  • 上一页

    构建临时系统

  • 下一页

    工具链技术备注


5.2. 工具链技术备注

第五章 构建临时系统

  • 前一页

    简介

  • 下一页

    通用编译指南

  • 返回
  • 主页

5.2 工具链技术备注

本节解释总体构建方法之中的某些基本原理和技术细节。并不需要立即理解本节中的所有问题。在进行实际构建的过程中，绝大部分的信息将会变得愈加清晰。在该过程中可随时查阅本小节的内容。

第五章的总体目标是生成一个临时的系统，它包含一个已知的较好工具集，该工具集可与宿主系统分离。通过使用 chroot，其余各章中的命令将被包含在此环境中，以保证目标 LFS 系统能够洁净且无故障地生成。该构建过程的设计就是为了使得新读者有最少的风险，同时还能有最好的指导价值。

注意

在继续之前，请留意工作平台的名称，它通常称作目标系统三段式名称。目标系统三段式名称可通过运行脚本 config.guess 简单获得，许多软件的源码包都附带有该脚本（译者注：目标系统三段式名称描述了代码运行的平台，是GNU 构建系统中的一个核心概念，形如 i686-pc-gnu-linux。它包含三个字段：CPU家族/型号的名称（如 i686）、供应商（pc）和操作系统名称（如 gnu-linux）。更详细的信息请参阅 http://wiki.osdev.org/Target_Triplet）。解压 Binutils 源码包，执行其中的脚本：./config.guess 并查看其输出。例如，对于一个现代的 32 位英特尔处理器，其输出很可能为 i686-pc-linux-gnu。

还请留意平台的动态链接器的名称，它通常被称为动态加载器（不要与 Binutils 中的标准链接器 ld 混淆）。该动态链接器由 Glibc 提供，它寻找并加载程序所需的共享库，为程序运行作准备，并运行它。对于 32 位英特尔的机器，动态链接器的名称为 ld-linux.so.2。判断动态链接器的一个可靠方法是检查宿主系统中的任意一个二进制文件，执行：readelf -l <二进制文件名> | grep interpreter 且查看其输出。可在 Glibc 源码树的根目录下的 shlib-versions 文件中找到所有平台的权威参考。

下面是第五章构建方法的几个关键技术点：

  • 通过改变 LFS_TGT 变量的目标系统三段式中的 “供应商” 字段，从而稍微调整工作平台的名称，以保证第一遍构建 Binutils 和 GCC 时能够生成兼容的交叉链接器和交叉编译器。此处的交叉链接器和交叉编译器生成的二进制文件与当前的硬件兼容，而不是用于其它的硬件架构。

  • 临时库经交叉编译获得。由于交叉编译原本就不应该依赖于宿主系统，因此，通过降低宿主系统的头文件或库进入新工具的可能性，该方法可去除目标系统的可能污染。交叉编译的方式，还可以在 64 位硬件平台上同时构建出 32 位和 64 位库。

  • 谨慎操作 GCC 源码，以告诉编译器将使用哪个目标系统动态链接器。

Binutils 是首个安装的包，这是因为执行 GCC 和 Glibc 的 configure 时都将进行有关汇编器和链接器的多项特性测试，以判断允许或禁用哪些软件特性。其重要性可能更甚于最初的意识。对 GCC 或 Glibc 的错误配置可能导致工具链出现难以捉摸的问题，可能直到整个构建过程接近尾声时才会显现出这些问题。通常情况下，一次测试套件失败可在你进行太多其它工作前暴露出该错误。

Binutils 将其汇编器和链接器安装在两个位置，即 /tools/bin 和 /tools/$LFS_TGT/bin。一个位置的工具是硬链接到另一个位置的。链接器的一个重要方面是它的库搜索顺序。可给 ld 传递参数 --verbose 获得详细信息。如，ld --verbose | grep SEARCH 可得到当前的搜索路径及其顺序。通过编译一个模拟程序并向链接器传递 --verbose 开关，可显示 ld 都链接了哪些文件。例如，gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded 将显示链接过程中成功打开的所有文件。

下一个安装的包是 GCC。下面是运行 GCC 的 configure 的输出的一个例子：

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

基于前述原因，这很重要。它还说明了 GCC 的配置脚本并不会搜索 PATH 目录来寻找使用什么工具。不过，在 gcc 自身的实际运行中，并不需要使用同样的搜索路径。运行：gcc -print-prog-name=ld 可获知 gcc 使用是何种标准链接器（LCTT 译注：gcc -print-prog-name 这个命令是为了显示 gcc 使用的某些内部工具的绝对路径，但事实上，ld 并不是 GCC 的内部工具，因此这条命令实际上没什么用）。

在编译模拟程序时，向 gcc 传递命令行选项 -v 可获得详细信息。例如，gcc -v dummy.c 将显示预处理器、编译和汇编阶段的详细信息，包括 gcc 的 include 搜索路径及其顺序。

下一个安装的包是经过净化的 Linux API 头文件。这些头文件可使得标准 C 库（Glibc）与 Linux 内核提供的特性进行交行交互。

下一个安装的包是 Glibc。构建 Glibc 时，最重要的考量是编译器、二进制工具和内核头文件。由于 Glibc 总是使用传递给它的配置脚本的 --host 参数有关的编译器，如，在我们这个场景中是 i686-lfs-linux-gnu-gcc，因此编译器通常不是一个问题。二进制工具和内核头文件可能会更复杂一些。因此，请谨慎行事并利用可用的配置开关以强制使用正确的选择。configure 运行完毕，目录 glibc-build 下的文件 config.make 包含有所有的重要细节。需要注意的是，CC="i686-lfs-gnu-gcc" 用来控制使用哪个二进制工具，-nostdinc 和 -isystem 标志用来控制编译器的 include 搜索路径。这些条目强调了 Glibc 包的一个重要方面，即其构建机制是非常自给自足的，通常并不依赖默工具链的默认设置。

在第二遍编译 Binutils 过程中，我们能够利用配置开关 --with-lib-path 来控制 ld 的库搜索路径。

第二遍编译 GCC 时，也需要修改其源代码以告诉 GCC 使用新的动态链接器。如果不加修改，将会导致 GCC 自身的程序嵌入来自宿主系统目录 /lib 的动态链接器名称，这将破坏远离宿主系统的目标。正是基于前面的这个出发点，核心工具链是自包含和自托管的。第五章其它的软件包都将在 /tools 中的新 Glibc 的基础上进行构建。

在进入第六章中的 chroot 环境前，将安装的首个主要的软件包是 Glibc，这是因为它天生具有前面提及的自给自足特点。一旦将 Glibc 安装到 /usr 中，我们将快速改变工具链的默认设置，然后继续构建目标 LFS 系统的其余部分。

翻译团队：LCTT 译者/校对：Yuking-net,wxy
  • 前一页

    简介

  • 下一页

    通用编译指南


5.3. 通用编译指南

第五章 构建临时系统

    工具链技术备注

  • 下一页

    Binutils-2.25 - 第一遍

  • 返回
  • 主页

5.3. 通用编译指南

编译软件包时本指南中有几个假定：

  • 有几个软件包在编译之前需要打补丁来规避一些问题。有的补丁会在本章和下一章中都需要，但有时候只有其中一章会需要，因此，如果某章看起来缺少某个补丁的下载说明时不用担心。安装补丁的时候也许会遇到关于 offset 或者 fuzz 的警告信息。别担心这些警告，补丁还是会成功安装的。

  • 在大部分软件包的编译过程中，屏幕上都可能出现几个警告。这都很正常，可以安全地忽略。这些警告正如它们描述的那样，是对使用过时的 C 或 C++ 语法的警告，而不是这些语法不可用。C 语言的标准经常改变，一些软件包仍然在使用旧的标准。这并不是一个问题，虽然确实会弹出警告。

  • 最后确认一次是否正确设置了 LFS 环境变量：

    echo $LFS

    确认输出显示的是 LFS 分区挂载点的路径，在我们的例子中也就是 /mnt/lfs。

  • 最后，必须强调两个重要的点：

    重要

    编译指南假定你已经正确地设置了宿主系统需求和符号链接：

    • shell 使用的是 bash。

    • sh 是到 bash 的符号链接。

    • /usr/bin/awk 是到 gawk 的符号链接。

    • /usr/bin/yacc 是到 bison 的符号链接或者一个执行 bison 的小脚本。

    重要

    再次强调构建过程：

    1. 把所有源文件和补丁放到 chroot 环境可访问的目录，例如 /mnt/lfs/sources/。但是千万不能把源文件放在 /mnt/lfs/tools/ 中。

    2. 进入到源文件目录。

    3. 对于每个软件包:

      1. 用 tar 程序解压要编译的软件包。在第五章中，确保解压软件包时你使用的是 lfs 用户。

      2. 进入到解压后创建的目录中。

      3. 根据指南说明编译软件包。

      4. 回退到源文件目录。

      5. 除非特别说明，删除解压出来的目录和所有编译过程中生成的 <package>-build 目录。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    工具链技术备注

  • 下一页

    Binutils-2.25 - 第一遍


5.4. Binutils-2.25 - 第一遍

第五章 构建临时系统

    通用编译指南

  • 下一页

    GCC-4.9.2 - 第一遍

  • 返回
  • 主页

5.4. Binutils-2.25 - 第一遍

Binutils 软件包包括了一个链接器、汇编器和其它处理目标文件的工具。

大概编译时间: 1 SBU
所需磁盘空间: 545 MB

5.4.1. 安装交叉编译的 Binutils

注意

返回前面章节重新阅读注意事项。了解标记为重要的注意事项能在后面帮你节省很多问题。

第一个编译 Binutils 软件包很重要，因为 Glibc 和 GCC 会对可用的链接器和汇编器执行各种测试以决定启用它们自己的哪些功能。

Binutils 手册建议在源码目录之外一个专门的编译目录里面编译 Binutils：

mkdir -v ../binutils-build
cd ../binutils-build

注意

为了衡量在本书中其余部分所使用 SBU 值，我们要测量一下这个软件包从配置到包括第一次安装在内的编译时间。为了轻松的做到这点，用类似 time { ./configure ... &&... && make install; } 的方式将命令包装在 time 命令中。

注意

第五章中大概编译的 SBU 值和所需磁盘空间不包括测试套件数据。

现在准备编译 Binutils：

../binutils-2.25/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 脚本返回的值略有不同，这个选项会告诉 configure 脚本调整 Binutils 的编译系统来编译一个交叉链接器。

--disable-nls

这会禁止国际化（i18n），因为国际化对临时工具来说没有必要。

--disable-werror

这会防止来自宿主编译器的警告事件导致停止编译。

继续编译软件包：

        make

现在编译完成了。通常现在我们会运行测试套件，但在这个初期阶段，测试套件框架（Tcl、Expect 和 DejaGNU） 还没有就绪。在此进行测试的好处不多，因为第一遍编译的程序很快会被第二遍的代替。

如果是在 x86_64 上编译，创建符号链接，以确保工具链的完整性：

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

安装软件包:

make install

该软件包的详细信息在 6.13.2,“Binutils 软件包内容”中。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    通用编译指南

  • 下一页

    GCC-4.9.2 - 第一遍


5.5. GCC-4.9.2 - 第一遍

第五章 构建临时系统

    Binutils-2.25 - 第一遍

  • 下一页

    Linux-3.19 API 头文件

  • 返回
  • 主页

5.5. GCC-4.9.2 - 第一遍

GCC 软件包是 GNU 编译器集合的一部分，其中包括 C 和 C++ 的编译器。

大概编译时间: 5.9 SBU
所需磁盘空间: 2.0 GB

5.5.1. 安装交叉编译的 GCC

现在 GCC 需要 GMP、 MPFR 和 MPC 软件包。在你的主机发行版中可能并不包括这些软件包，它们将和 GCC 一起编译。解压每个软件包到 GCC 源文件夹并重命名解压后的文件夹，以便 GCC 编译过程中能自动使用这些软件：

注意

有些读者对本章节内容存在误解。和之前章节中介绍的（软件包编译指南）一样，过程都是相同的。首先从源文件夹中解压 gcc tar 包 然后进入到创建的文件夹中。然后才可以执行下面的指令。

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

下面的指令将会修改 GCC 默认的动态链接器为安装在 /tools 文件夹中的。它也会从 GCC 的 include 搜索路径中移除 /usr/include。执行：

for file in \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.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, linux64.h 或 sysv4.h 的文件。对于找到的每个文件，我们把它复制到相同名称的文件，但增加了后缀 “.orig”。然后第一个 sed 表达式在每个 “/lib/ld”, “/lib64/ld” 或 “/lib32/ld” 实例前面增加“/tools”，第二个 sed 表达式替换 “/usr” 的硬编码实例。然后，我们添加这改变默认 startfile 前缀到文件末尾的定义语句。注意 “/tools/lib/” 后面的 “/” 是必须的。最后，我们用 touch 更新复制文件的时间戳。当与 cp -u 一起使用时，可以防止命令被无意中运行两次造成对原始文件意外的更改。

GCC 不能正确检测栈保护，这会导致编译 Glibc-2.21 时出现问题，用下面的命令修复这个问题：

sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

GCC 手册建议在源文件夹之外一个专门的编译文件夹中编译 GCC：

mkdir -v ../gcc-build
cd ../gcc-build

准备编译 GCC:

../gcc-4.9.2/configure                             \
    --target=$LFS_TGT                              \
    --prefix=/tools                                \
    --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-libitm                               \
    --disable-libquadmath                          \
    --disable-libsanitizer                         \
    --disable-libssp                               \
    --disable-libvtv                               \
    --disable-libcilkrts                           \
    --disable-libstdc++-v3                         \
    --enable-languages=c,c++

配置选项的含义:

--with-newlib

由于还没有可用的 C 库，这确保编译 libgcc 时定义了常数 inhibit_libc。这可以防止编译任何需要 libc 支持的代码。

--without-headers

创建一个完成的交叉编译器的时候，GCC 要求标准头文件和目标系统兼容。对于我们的目的来说，不需要这些头文件。这个选项可以防止 GCC 查找它们。

--with-local-prefix=/tools

GCC 会查找本地已安装的 include 文件的系统位置。默认是 /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-libitm, --disable-libquadmath, --disable-libsanitizer, --disable-libssp, --disable-libvtv, --disable-libcilkrts, --disable-libstdc++-v3

这些选项取消了对十进制浮点数扩展、线程化、libatomic、 libgomp、 libitm、 libquadmath、 libsanitizer、 libssp、 libvtv、 libcilkrts 和 C++ 标准库的支持。这些功能在编译交叉编译器的时候会导致编译失败，对于交叉编译 临时 libc 来说也没有必要。

--disable-multilib

在 x86_64 机器上， LFS 还不支持 multilib 配置。这个选项对 x86 来说无害。

--enable-languages=c,c++

这个选项确保只编译 C 和 C++ 编译器。这些是现在唯一需要的语言。

运行命令编译 GCC:

make

现在编译完成了。在这里，通常会运行测试套件，但正如前面提到的，测试套件框架还没有准备好。在此进行测试的并没有太多好处，因为第一遍编译的程序很快会被取代。

安装软件包:

make install

该软件包的详细信息在 Section 6.17.2, “GCC 软件包内容”。

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao,
  • 上一页

    Binutils-2.25 - 第一遍

  • 下一页

    Linux-3.19 API 头文件


5.6. Linux-3.19 API 头文件

第五章 构建临时系统

    GCC-4.9.2 - 第1遍

  • 下一页

    Glibc-2.21

  • 返回
  • 主页

5.6. Linux-3.19 API 头文件

Linux API 头文件（在 linux-3.19.tar.xz 中）展示了供 Glibc 使用的内核 API。

大概编译时间: 0.1 SBU
所需磁盘空间: 653 MB

5.6.1. 安装 Linux API 头文件

Linux 内核需要展示供系统 C 库（在 LFS 中是 Glibc）使用的应用程序编程接口（API）。 这通过在 Linux 内核源代码 tar 包中包括一些 C 头文件来完成。

确认这里没有陈旧的文件且不依赖于之前的操作：

make mrproper

从源代码中提取用户可见的内核头文件。把他们保存在一个临时本地文件夹中然后复制到所需的位置， 因为解压过程会移除目标文件夹中任何已有的文件。

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

该软件包的详细信息在6.7.2, “Linux API 头文件 软件包内容。”

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao
  • 上一页

    GCC-4.9.2 - 第一遍

  • 下一页

    Glibc-2.21


5.7. Glibc-2.21

第五章 构建临时系统

    Linux-3.19 API 头文件

  • 下一页

    Libstdc++-4.9.2

  • 返回
  • 主页

5.7. Glibc-2.21

Glibc 软件包包括主要的 C 库。这个库提供了基本的内存分配、文件夹搜素、读写文件、字符串处理、模式匹配、算术等等例程。

大概编译时间: 3.9 SBU
所需磁盘空间: 670 MB

5.7.1. 安装 Glibc

在某些情况下，尤其是 LFS 7.1，rpc（译者注: Remote Procedure Calling, 远程过程调用）头文件并没有正确安装。测试查看是否安装在了主机系统中，如果没有的话安装它：

if [ ! -r /usr/include/rpc/types.h ]; then
  su -c 'mkdir -pv /usr/include/rpc'
  su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi

修复软件包中一个会影响 32 位架构的回滚：

sed -e '/ia32/s/^/1:/' \
    -e '/SSE2/s/^1://' \
    -i  sysdeps/i386/i686/multiarch/mempcpy_chk.S

Glibc 手册建议在源文件夹之外的一个专用文件夹中编译 Glibc：

mkdir -v ../glibc-build
cd ../glibc-build

下一步，准备编译 Glibc：

../glibc-2.21/configure                             \
      --prefix=/tools                               \
      --host=$LFS_TGT                               \
      --build=$(../glibc-2.21/scripts/config.guess) \
      --disable-profile                             \
      --enable-kernel=2.6.32                        \
      --with-headers=/tools/include                 \
      libc_cv_forced_unwind=yes                     \
      libc_cv_ctors_header=yes                      \
      libc_cv_c_cleanup=yes

配置选项的含义:

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

这些选项的组合效果是 Glibc 的构建系统配置它自己用 /tools 里面的交叉链接器和交叉编译器交叉编译自己。

--disable-profile

编译库但不包含分析信息。如果临时工具需要分析信息则忽略此选项。

--enable-kernel=2.6.32

这告诉 Glibc 编译能支持 Linux 2.6.32 以及之后的内核库。更早的内核版本不受支持。

--with-headers=/tools/include

告诉 Glibc 利用刚刚安装在 tools 文件夹中的头文件编译自身，此能够根据内核的具体特性提供更好的优化。

libc_cv_forced_unwind=yes

在 5.4,“Binutils-2.25 - 第1遍” 中安装的链接器是交叉编译的，在安装完 Glibc 之前不能使用。由于依赖于工作的链接器，这意味着 force-unwind 支持的配置测试会失败。将 libc_cv_forced_unwind=yes 变量传递进去告诉configure 命令 force-unwind 支持是可用的，不需要进行测试。

libc_cv_c_cleanup=yes

类似的，我们传递 libc_cv_c_cleanup=yes 到 configure 脚本跳过测试就完成了 C 清理支持的配置。

libc_cv_ctors_header=yes

类似的，我们传递 libc_cv_ctors_header=yes 到 configure 脚本跳过测试就完成了 gcc 构建器支持的配置。

在这个过程中，可能会出现下面的警告：

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 软件包的一部分，主机发行版应该提供了。

注意

有报告说用 "parallel make" 编译这个软件包的时候会失败。如果出现这种情况，用 "-j1" 选项重新运行 make 命令。

编译软件包:

make

安装软件包:

make install

警告

到了这里，必须停下来确认新工具链的基本功能(编译和链接)都是像预期的那样正常工作。运行下面的命令进行全面的检查：

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

如果一切工作正常的话，这里应该没有错误，最后一个命令的输出形式会是：

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

注意 /tools/lib、或者 64 位机器的 /tools/lib64 会以动态链接器的前缀出现。

如果输出不是像上面那样或者根本就没有输出，那么可能某些地方出错了。调查并回溯这些步骤，找出问题所在并改正它。在继续之前必须解决这个问题。

一旦一切都顺利，清理测试文件：

rm -v dummy.c a.out

注意

在后面的编译 Binutils 章节时会再一次检查工具链是否正确编译。如果 Binutils 编译失败，说明之前安装 Binutils、GCC、或者 Glibc 时某些地方出现了错误。

该软件包的详细信息在 6.9.4, “Glibc 软件包内容”

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao,
  • 上一页

    Linux-3.19 API 头文件

  • 下一页

    Libstdc++-4.9.2


5.8. Libstdc++-4.9.2

第五章 构建临时系统

    Glibc-2.21

  • 下一页

    Binutils-2.25 - 第2遍

  • 返回
  • 主页

5.8. Libstdc++-4.9.2

Libstdc++ 是标准的 C++ 库。g++ 编译器正确运行需要它。

大概编译时间: 0.3 SBU
所需磁盘空间: 798 MB

5.8.1. 安装目标 Libstdc++

注意

Libstdc++ 是 GCC 源文件的一部分。你首先应该解压 GCC 的压缩包，然后进入 gcc-4.9.2 文件夹。

为 Libstdc++ 创建一个文件夹并进入：

mkdir -pv ../gcc-build
cd ../gcc-build

准备编译 Libstdc++：

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

配置选项的含义:

--host=...

指示使用我们刚才编译的交叉编译器，而不是 /usr/bin 中的。

--disable-libstdcxx-threads

由于我们还没有编译 C 线程库，C++ 的也还不能编译。

--disable-libstdcxx-pch

此选项防止安装预编译文件，此步骤并不需要。

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

这是 C++ 编译器搜索标准 include 文件的位置。在一般的编译中，这个信息自动从顶层文件夹中传入 Libstdc++ configure 选项。在我们的例子中，必须明确给出这信息。

编译 libstdc++:

make

安装库:

make install

该软件包的详细信息在 6.17.2, “GCC 软件包内容”

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao,
  • 上一页

    Glibc-2.21

  • 下一页

    Binutils-2.25 - 第2遍


5.9. Binutils-2.25 - 第2遍

第五章 构建临时系统

    Libstdc++-4.9.2

  • 下一页

    GCC-4.9.2 - 第2遍

  • 返回
  • 主页

5.9. Binutils-2.25 - 第2遍

Binutils 软件包包括一个链接器，汇编器和其它处理目标文件的工具。

大概编译时间: 1.0 SBU
所需磁盘空间: 574 MB

5.9.1. 安装 Binutils

再次新建一个单独的编译文件夹：

mkdir -v ../binutils-build
cd ../binutils-build

准备编译 Binutils:

CC=$LFS_TGT-gcc                \
AR=$LFS_TGT-ar                 \
RANLIB=$LFS_TGT-ranlib         \
../binutils-2.25/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

make 参数的含义:

-C ld clean

告诉 make 程序移除所有 ld 子目录中编译过的文件。

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

这个选项重新编译 ld 子目录中的所有文件。在命令行中指定 Makefile 的 LIB_PATH 变量可以使我们能够重写临时工具的默认值并指向正确的最终路径。该变量的值指定链接器的默认库搜索路径。 下一章中会用到这个准备。

该软件包的详细信息在6.13.2, “Binutils 软件包内容”

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao
  • 上一页

    Libstdc++-4.9.2

  • 下一页

    GCC-4.9.2 - 第2遍


5.10. GCC-4.9.2 - 第2遍

第五章 构建临时系统

    Binutils-2.25 - 第2遍

  • 下一页

    Tcl-8.6.3

  • 返回
  • 主页

5.10. GCC-4.9.2 - 第2遍

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

大概编译时间: 7.7 SBU
所需磁盘空间: 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 \
 $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.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 一样，它要求 GMP、MPFR 和 MPC 软件包。 解压 tar 包并把它们重名为到所需的文件夹名称：

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

再次创建独立的编译文件夹：

mkdir -v ../gcc-build
cd ../gcc-build

在开始编译 GCC 之前，记住取消所有会覆盖默认优化选项的环境变量。

准备编译 GCC:

CC=$LFS_TGT-gcc                                    \
CXX=$LFS_TGT-g++                                   \
AR=$LFS_TGT-ar                                     \
RANLIB=$LFS_TGT-ranlib                             \
../gcc-4.9.2/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

不为 libstdc++ 编译预编译的头文件(PCH)。这会花费很多时间，却对我们没有用处。

--disable-bootstrap

对于原生编译的 GCC，默认是做一个“引导”构建。这不仅会编译 GCC，而且会多次编译。 它用第一次编译的程序去第二次编译自己，然后同样进行第三次。 比较第二次和第三次迭代确保它可以完美复制自身。这也意味着已经成功编译。 但是，LFS 的构建方法能够提供一个稳定的编译器，而不需要每次都重新引导。

编译软件包:

make

安装软件包:

make install

作为画龙点睛，这里创建一个符号链接。很多程序和脚本执行 cc 而不是 gcc来保持程序的通用性， 因而在所有并不总是安装了 GNU C 编译器的 Unix 类型的系统上都可以使用。 运行 cc 使得系统管理员不用考虑要安装那种 C 编译器：

ln -sv gcc /tools/bin/cc

注意

到了这里，必须停下来确认新工具链的基本功能(编译和链接)都是像预期的那样正常工作。运行下面的命令进行全面的检查：

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

如果一切工作正常的话，这里应该没有错误，最后一个命令的输出形式会是：

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

注意 /tools/lib、或者 64 位机器的 /tools/lib64 会以动态链接器的前缀出现。

如果输出不是像上面那样或者根本就没有输出，那么可能某些地方出错了。 调查并回溯这些步骤，找出问题所在并改正它。在继续之前必须解决这个问题。 首先，使用gcc 而不是 cc 再次进行全面的检查。 如果能运行，就丢失了 /tools/bin/cc 符号链接。 像上面介绍的那样新建符号链接。下一步，确认 PATH 是正常的。 这能通过运行 echo $PATH 检验，验证 /tools/bin 在列表的前面。如果 PATH 是错误的， 这意味着你可能不是以 lfs 用户的身份登录或者前面 4.4,“设置环境”中某些地方出现了错误。

一旦一切都顺利，清理测试文件：

rm -v dummy.c a.out

该软件包的详细信息在 Section 6.17.2, “GCC 软件包内容”

翻译团队：LCTT 译者/校对：ictlyh,dongfengweixiao
  • 上一页

    Binutils-2.25 - 第2遍

  • 下一页

    Tcl-8.6.3


5.11. Tcl-8.6.3

第五章 构建临时系统

    GCC-4.9.2 - 第2遍

  • 下一页

    Expect-5.45

  • 返回
  • 主页

5.11. Tcl-8.6.3

Tcl软件包包含工具命令语言（Tool Command Language）相关程序。

大概编译时间： 0.8 SBU
所需磁盘空间： 67 MB

5.11.1. 安装 Tcl

此软件包和后面三个包（Expect、DejaGNU 和 Check）用来为 GCC 和 Binutils 还有其他的一些软件包的测试套件提供运行支持。仅仅为了测试目的而安装 4 个软件包，看上去有点奢侈，虽然因为大部分重要的工具都能正常工作而并不需要去做测试。 尽管在本章中并没有执行测试套件（并不做要求），但是在第六章 中都要求执行这些软件包自带的测试套件。

配置 Tcl 准备编译：

cd unix
./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不强求为本章中所构建的临时工具运行测试套件。不过你仍然要测试Tcl的话可以用下面的命令：

TZ=UTC make test

Tcl 测试套件在宿主机某些特定条件下会失败，原因很难推测。 不过测试套件失败并不奇怪，也不是什么严重的错误。 参数TZ=UTC设定了时区和相应的世界标准时间（UTC）， 但是只在测试套件运行期间才有效。这个可以保证时钟测试能正常运行。 关于TZ环境变量的细节请参阅本书第7章。

安装软件包：

make install

让安装的库文件可写，这样之后可以删除调试符号。

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

安装Tcl的头文件。后面的Expect软件包在编译的时候要用到。

make install-private-headers

现在创建几个必要的软链接：

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

5.11.2. Tcl 软件包内容

安装的程序： tclsh (软链接到 tclsh8.6)和 tclsh8.6
安装的库： libtcl8.6.so, libtclstub8.6.a

简要介绍

tclsh8.6 | Tcl命令终端
tclsh | 软链接到 tclsh8.6
libtcl8.6.so | Tcl库
libtclstub8.6.a | Tcl Stub 库
翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    GCC-4.9.2 - 第2遍

  • 下一页

    Expect-5.45


5.12. Expect-5.45

第五章 构建临时系统

    Tcl-8.6.3

  • 下一页

    DejaGNU-1.5.2

  • 返回
  • 主页

5.12. Expect-5.45

Expect 软件包包含一个实现用脚本和其他交互式程序进行对话的程序。

大概编译时间： 0.1 SBU
所需磁盘空间： 4.6 MB

5.12.1. 安装 Expect

首先，强制 Expect 的 configure 配置脚本使用 /bin/stty 替代宿主机系统里可能存在的 /usr/local/bin/stty。这样可以保证我们的测试套件工具在工具链的最后一次构建能够正常。

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

现在配置 Expect 准备编译：

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

配置脚本参数的含义：

--with-tcl=/tools/lib

这个选项可以保证 configure 配置脚本会从临时工具目录里找 Tcl 的安装位置， 而不是在宿主机系统中寻找。

--with-tclinclude=/tools/include

这个选项会给 Expect 显式地指定 Tcl 内部头文件的位置。通过这个选项可以避免 configure 脚本不能自动发现 Tcl 头文件位置的情况。

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 Expect 的话可以用下面的命令：

make test

请注意 Expect 测试套件已知在某些宿主机特定情况下有过失败的情况， 我们还没有完全把握。不过，在这里测试套件运行失败并不奇怪，也不认为是关键问题。

安装软件包：

make SCRIPTS="" install

make参数的含义：

SCRIPTS=""

这个变量可以避免安装额外的 Expect 脚本，没有必要。

5.12.2. Expect 软件包内容

安装的程序： expect
安装的库： libexpect-5.45.so

简要介绍

expect | 基于脚本和其他交互式程序通信。
libexpect-5.45.so | 包含一些函数允许 Expect 用作 Tcl 扩展或直接用于 C/C++（不用 Tcl）。
翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Tcl-8.6.3

  • 下一页

    DejaGNU-1.5.2


5.13. DejaGNU-1.5.2

第五章 构建临时系统

    Expect-5.45

  • 下一页

    Check-0.9.14

  • 返回
  • 主页

5.13. DejaGNU-1.5.2

DejaGNU 软件包包含了测试其他程序的框架。

大概编译时间： 不到 0.1 SBU
所需磁盘空间： 4.6 MB

5.13.1. 安装 DejaGNU

配置 DejaGNU 准备编译：

./configure --prefix=/tools

编译安装软件包：

make install

要测试编译结果，执行：

make check

5.13.2. DejaGNU 软件包内容

安装的程序： runtest

简要介绍

runtest

一个封装脚本用于定位合适的 expect 终端然后执行 DejaGNU。

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Expect-5.45

  • 下一页

    Check-0.9.14


5.14. Check-0.9.14

第五章 构建临时系统

    DejaGNU-1.5.2

  • 下一页

    Ncurses-5.9

  • 返回
  • 主页

5.14. Check-0.9.14

Check 是一个 C 语言单元测试框架。

大概编译时间： 0.1 SBU
所需磁盘空间： 11 MB

5.14.1. 安装 Check

配置 Check 准备编译：

PKG_CONFIG= ./configure --prefix=/tools

配置脚本参数的含义：

PKG_CONFIG=

这个变量会告诉 configure 配置脚本忽略 pkg-config 里的任何选项， 这有可能会导致系统去链接 /tools 目录之外的库。

构建软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 Check 的话可以用下面的命令：

make check

注意一下Check的测试套件会消耗相对长一点（高达 4 SBU）时间。

安装软件包：

make install

5.14.2. Check 软件包内容

安装的程序： checkmk
安装的库： libcheck.{a,so}

简要介绍

checkmk | 用来生成 C 语言单元测试用例的 Awk 脚本，这些用例可以配合 Check 单元测试框架使用。
libcheck.{a,so} | 包含允许测试程序调用 Check 的函数。
翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    DejaGNU-1.5.2

  • 下一页

    Ncurses-5.9


5.15. Ncurses-5.9

第五章 构建临时系统

    Check-0.9.14

  • 下一页

    Bash-4.3.30

  • 返回
  • 主页

5.15. Ncurses-5.9

Ncurses 软件包包含与终端无关的处理字符界面的库。

大概编译时间： 0.5 SBU
所需磁盘空间： 45 MB

5.15.1. 安装 Ncurses

配置 Ncurses 准备编译：

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

配置脚本参数的含义：

--without-ada

这个选项会保证 Ncurse 不会编译对宿主机系统里可能存在的 Ada 编译器的支持， 而这在我们 chroot 切换环境后就不再可用。

--enable-overwrite

这个选项会告诉 Ncurses 安装它的头文件到 /tools/include 目录， 而不是 /tools/include/ncurses 目录， 保证其他软件包可以正常找到 Ncurses 的头文件。

--enable-widec

这个选项会控制编译宽字符库（比如，libncursesw.so.5.9） 而不是默认的普通库（比如，libncurses.so.5.9）。 这些宽字符库在多字节和传统的 8 位环境下使用，而普通库只能用于 8 位环境。 宽字符库和普通库的源代码是兼容的，但并不是二进制兼容。

编译软件包：

make

这个软件包有测试套件，但是只有在安装后才能执行。测试用例在 test/ 目录里。 查看该目录下的 README 文件了解更多细节。

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.20.2,“Ncurses 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Check-0.9.14

  • 下一页

    Bash-4.3.30


5.16. Bash-4.3.30

第五章 构建临时系统

    Ncurses-5.9

  • 下一页

    Bzip2-1.0.6

  • 返回
  • 主页

5.16. Bash-4.3.30

Bash 软件包包含 Bourne-Again SHell 终端程序。

大概编译时间： 0.4 SBU
所需磁盘空间： 63 MB

5.16.1. 安装 Bash

配置 Bash 准备编译：

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

配置脚本参数的含义：

--without-bash-malloc

这个选项会禁用 Bash 的内存分配功能（malloc）， 这个功能已知会导致段错误。而禁用这个功能后，Bash 将使用 Glibc 的 malloc 函数，这样会更稳定。

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 Bash 的话可以用下面的命令：

make tests

安装软件包：

make install

为使用 sh 终端的程序创建一个软链接：

ln -sv bash /tools/bin/sh

关于这个软件包的详细资料请查看本书章节：6.36.2,“Bash 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Ncurses-5.9

  • 下一页

    Bzip2-1.0.6


5.17. Bzip2-1.0.6

第五章 构建临时系统

    Bash-4.3.30

  • 下一页

    Coreutils-8.23

  • 返回
  • 主页

5.17. Bzip2-1.0.6

Bzip2 软件包包含压缩和解压文件的工具。 用 bzip2 压缩文本文件比传统的 gzip 压缩比高得多。

大概编译时间： 不到 0.1 SBU
所需磁盘空间： 6.4 MB

5.17.1. 安装 Bzip2

Bzip2 软件包里没有 configure 配置脚本。用下面的命令编译和测试：

make

安装软件包：

make PREFIX=/tools install

关于这个软件包的详细资料请查看本书章节：6.18.2, “Bzip2 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Bash-4.3.30

  • 下一页

    Coreutils-8.23


5.18. Coreutils-8.23

第五章 构建临时系统

    Bzip2-1.0.6

  • 下一页

    Diffutils-3.3

  • 返回
  • 主页

5.18. Coreutils-8.23

Coreutils 软件包包含一套用于显示和设定基本系统属性的工具。

大概编译时间： 0.6 SBU
所需磁盘空间： 162 MB

5.18.1. 安装 Coreutils

配置 Coreutils 准备编译：

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

配置脚本参数的含义：

--enable-install-program=hostname

这个选项会允许编译和安装 hostname 程序 – 默认是不安装的但是 Perl 测试套件需要它。

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 Coreutils 的话可以用下面的命令：

make RUN_EXPENSIVE_TESTS=yes check

参数 RUN_EXPENSIVE_TESTS=yes 会告诉测试套件额外运行对某些系统开销相对大一些 （主要是 CPU 运算能力和内存消耗）的测试用例，但是通常对 Linux 来说不是问题。

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.29.2, “Coreutils 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Bzip2-1.0.6

  • 下一页

    Diffutils-3.3


5.19. Diffutils-3.3

第五章 构建临时系统

    Coreutils-8.23

  • 下一页

    File-5.22

  • 返回
  • 主页

5.19. Diffutils-3.3

Diffutils软件包包含用来比较文件或目录之间差异的工具。

大概编译时间： 0.2 SBU
所需磁盘空间： 21 MB

5.19.1. 安装 Diffutils

配置 Diffutils 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 Diffutils 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.46.2, “Diffutils 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Coreutils-8.23

  • 下一页

    File-5.22


5.20. File-5.22

第五章 构建临时系统

    Diffutils-3.3

  • 下一页

    Findutils-4.4.2

  • 返回
  • 主页

5.20. File-5.22

File 软件包包含用来判断文件类型的工具。

大概编译时间： 0.1 SBU
所需磁盘空间： 16.9 MB

5.20.1. 安装 File

配置 File 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。 不过你仍然要测试 File 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.12.2, “File 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/dongfengweixiao
  • 上一页

    Diffutils-3.3

  • 下一页

    Findutils-4.4.2


5.21. Findutils-4.4.2

第五章 构建临时系统

    File-5.22

  • 下一页

    Gawk-4.1.1

  • 返回
  • 主页

5.21. Findutils-4.4.2

Findutils 软件包包含用来查找文件的工具。这些工具可以用来在目录树中递归查找，或者创建、维护和搜索数据库（一般会比递归查找快，但是如果不经常更新数据库的话结果不可靠）。

大概编译时间： 0.2 SBU
所需磁盘空间： 29 MB

5.21.1. 安装 Findutils

配置 Findutils 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Findutils 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.48.2, “Findutils 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    File-5.22

  • 下一页

    Gawk-4.1.1


5.22. Gawk-4.1.1

第五章 构建临时系统

    Findutils-4.4.2

  • 下一页

    Gettext-0.19.4

  • 返回
  • 主页

5.22. Gawk-4.1.1

Gawk 软件包包含处理文本文件的工具。

大概编译时间： 0.2 SBU
所需磁盘空间： 37 MB

5.22.1. 安装 Gawk

配置 Gawk 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Gawk 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.47.2, “Gawk 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Findutils-4.4.2

  • 下一页

    Gettext-0.19.4


5.23. Gettext-0.19.4

第五章 构建临时系统

    Gawk-4.1.1

  • 下一页

    Grep-2.21

  • 返回
  • 主页

5.23. Gettext-0.19.4

Gettext 软件包包含了国际化和本地化的相关应用。它支持程序使用 NLS（本地语言支持）编译，允许程序用用户本地语言输出信息。

大概编译时间： 1.0 SBU
所需磁盘空间： 153 MB

5.23.1. 安装 Gettext

对于我们这次用到的临时工具集，我们只需要编译安装 Gettext 软件包里的3个程序。

配置 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

因为只编译了3个程序，不编译 Gettext 的额外支持库的话测试套件不可能成功运行。所以在这个阶段不建议尝试运行测试套件。

安装msgfmt、msgmerge和xgettext程序：

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

关于这个软件包的详细资料请查看本书章节：6.49.2, “Gettext 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Gawk-4.1.1

  • 下一页

    Grep-2.21


5.24. Grep-2.21

第五章 构建临时系统

    Gettext-0.19.4

  • 下一页

    Gzip-1.6

  • 返回
  • 主页

5.24. Grep-2.21

Grep 软件包包含了在文件中搜索的工具。

大概编译时间： 0.2 SBU
所需磁盘空间： 20 MB

5.24.1. 安装 Grep

配置 Grep 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Grep 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.34.2, “Grep 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Gettext-0.19.4

  • 下一页

    Gzip-1.6


5.25. Gzip-1.6

第五章 构建临时系统

    Grep-2.21

  • 下一页

    M4-1.4.17

  • 返回
  • 主页

5.25. Gzip-1.6

Gzip 软件包包含压缩和解压缩文件的工具。

大概编译时间： 0.4 SBU
所需磁盘空间： 9.9 MB

5.25.1. 安装 Gzip

配置 Gzip 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Gzip 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.56.2, “Gzip 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Grep-2.21

  • 下一页

    M4-1.4.17


5.26. M4-1.4.17

第五章 构建临时系统

    Gzip-1.6

  • 下一页

    Make-4.1

  • 返回
  • 主页

5.26. M4-1.4.17

M4 软件包包含一个宏预处理器。

大概编译时间： 0.2 SBU
所需磁盘空间： 20 MB

5.26.1. 安装 M4

配置 M4 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 M4 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.31.2, “M4 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Gzip-1.6

  • 下一页

    Make-4.1


5.27. Make-4.1

第五章 构建临时系统

    M4-1.4.17

  • 下一页

    Patch-2.7.4

  • 返回
  • 主页

5.27. Make-4.1

Make 软件包包含了一个用来编译软件包的程序。

大概编译时间： 0.1 SBU
所需磁盘空间： 14.1 MB

5.27.1. 安装 Make

配置 Make 准备编译：

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

配置脚本参数的含义：

--without-guile

这个选项会保证 Make-4.1 不会链接宿主系统上可能存在的 Guile 库，而在下一章里通过 chroot 切换环境后就不再可用。

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Make 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.61.2, “Make 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    M4-1.4.17

  • 下一页

    Patch-2.7.4


5.28. Patch-2.7.4

第五章 构建临时系统

    Make-4.1

  • 下一页

    Perl-5.20.2

  • 返回
  • 主页

5.28. Patch-2.7.4

Patch 软件包包含一个可以通过应用“补丁”文件来修改或创建文件的程序，补丁文件通常由diff程序生成。

大概编译时间： 0.2 SBU
所需磁盘空间： 11.3 MB

5.28.1. 安装 Patch

配置 Patch 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Patch 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.62.2, “Patch 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Make-4.1

  • 下一页

    Perl-5.20.2


5.29. Perl-5.20.2

第五章 构建临时系统

    Patch-2.7.4

  • 下一页

    Sed-4.2.2

  • 返回
  • 主页

5.29. Perl-5.20.2

Perl 软件包包含了处理实用报表提取语言（Practical Extraction and Report Language）的程序。

大概编译时间： 1.2 SBU
所需磁盘空间： 298 MB

5.29.1. 安装 Perl

配置 Perl 准备编译：

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

编译软件包：

make

虽然 Perl 软件包自带测试套件，最好还是等下一章中它被完整安装之后再运行。

这次我们只需要安装一小部分应用和库。

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

关于这个软件包的详细资料请查看本书章节：6.42.2, “Perl 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Patch-2.7.4

  • 下一页

    Sed-4.2.2


5.30. Sed-4.2.2

第五章 构建临时系统

    Perl-5.20.2

  • 下一页

    Tar-1.28

  • 返回
  • 主页

5.30. Sed-4.2.2

Sed 软件包包含一个字符流编辑器。

大概编译时间： 0.1 SBU
所需磁盘空间： 10.7 MB

5.30.1. 安装 Sed

配置 Sed 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Sed 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.24.2, “Sed 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Perl-5.20.2

  • 下一页

    Tar-1.28


5.31. Tar-1.28

第五章 构建临时系统

    Sed-4.2.2

  • 下一页

    Texinfo-5.2

  • 返回
  • 主页

5.31. Tar-1.28

Tar 软件包包含了一个存档工具。

大概编译时间： 0.3 SBU
所需磁盘空间： 36 MB

5.31.1. 安装 Tar

配置 Tar 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Tar 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.67.2, “Tar 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Sed-4.2.2

  • 下一页

    Texinfo-5.2


5.32. Texinfo-5.2

第五章 构建临时系统

    Tar-1.28

  • 下一页

    Util-linux-2.26

  • 返回
  • 主页

5.32. Texinfo-5.2

Texinfo软件包包含了读写和转换info文档的工具。

大概编译时间： 0.2 SBU
所需磁盘空间： 100 MB

5.32.1. 安装 Texinfo

配置 Texinfo 准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试Texinfo的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.68.2, “Texinfo 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Tar-1.28

  • 下一页

    Util-linux-2.26


5.33. Util-linux-2.26

第五章 构建临时系统

    Texinfo-5.2

  • 下一页

    Xz-5.2.0

  • 返回
  • 主页

5.33. Util-linux-2.26

Util-linux 软件包包含了各种各样的小工具。

大概编译时间： 0.6 SBU
所需磁盘空间： 139 MB

5.33.1. 安装 Util-linux

配置 Util-linux 准备编译：

./configure --prefix=/tools                \
            --without-python               \
            --disable-makeinstall-chown    \
            --without-systemdsystemunitdir \
            PKG_CONFIG=""

配置脚本参数的含义：

--without-python

这个选项会禁止使用宿主系统中可能安装了的 Python。这样可以避免构建一些不必要的捆绑应用。

--disable-makeinstall-chown

这个选项会禁止在安装的时候使用 chown 命令。这对我们安装到 /tools 目录没有意义而且可以避免使用 root 用户安装。

--without-systemdsystemunitdir

对于使用 systemd 的系统，这个软件包会尝试安装 systemd 特定文件到 /tools 下一个不存在的目录里。这个选项可以避免这个不必要的动作。

PKG_CONFIG=""

设定这个环境变量可以避免增加一些宿主机上存在却不必要的功能。请注意这里设定环境变量的方式和 LFS 其他部分放在命令前面的方式不同。在这里是为了展示一下使用 configure 脚本配置时设定环境变量的另一种方式。

编译软件包：

make

安装软件包：

make install
翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Texinfo-5.2

  • 下一页

    Xz-5.2.0


5.34. Xz-5.2.0

第五章 构建临时系统

    Util-linux-2.26

  • 下一页

    清理无用内容

  • 返回
  • 主页

5.34. Xz-5.2.0

Xz 软件包包含了用于压缩和解压文件的程序。它提供了对 lzma 和更新的 xz 压缩格式的支持。使用 xz 压缩文本文件能比传统的 gzip 或 bzip2 命令有更高的压缩比。

大概编译时间： 0.3 SBU
所需磁盘空间： 21 MB

5.34.1. 安装Xz

配置Xz准备编译：

./configure --prefix=/tools

编译软件包：

make

现在编译已经完成。之前说过，不要求为本章中所构建的临时工具运行测试套件。不过你仍然要测试 Xz 的话可以用下面的命令：

make check

安装软件包：

make install

关于这个软件包的详细资料请查看本书章节：6.53.2, “Xz 软件包内容”

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Util-linux-2.26

  • 下一页

    清理无用内容


5.35. 清理无用内容

第五章 构建临时系统

    Xz-5.2.0

  • 下一页

    改变属主

  • 返回
  • 主页

5.35. 清理无用内容

本小节里的步骤是可选的，但如果你的 LFS 分区容量比较小，知道有些不必要的内容可以被删除也是挺好的。目前编译好的可执行文件和库大概会有 70MB 左右不需要的调试符号。可以通过下面的命令移除这些符号：

strip --strip-debug /tools/lib/*
/usr/bin/strip --strip-unneeded /tools/{,s}bin/*

这两个命令会跳过一些文件，并提示不可识别的文件格式。大多数是脚本文件而不是二进制文件。同样还可以用宿主系统里的 strip 命令为 /tools 目录下的 strip 二进制文件清理无用内容。

注意不要对库文件使用 --strip-unneeded 选项。静态库会被损坏导致整个工具链将会需要全部重新编译。

更节省更多空间，还可以删除帮助文档：

rm -rf /tools/{,share}/{info,man,doc}

这个时候，你应该在 $LFS 分区中为下个阶段编译安装 Glibc 和 Gcc 预留至少 3GB 剩余空间。如果你可以编译安装 Glibc，那其他的就不会有问题了。

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    Xz-5.2.0

  • 下一页

    改变属主


5.36. 改变属主

第五章 构建临时系统

    清理无用内容

  • 下一页

    构建 LFS 系统

  • 返回
  • 主页

5.36. 改变属主

注意

本书以后部分的命令都必须以 root 用户身份执行而不再是 lfs 用户。另外，再次确认下 $LFS 变量在 root 用户环境下也有定义。

当前，$LFS/tools 目录属于 lfs 用户，这是一个只存在于宿主系统上的帐号。如果继续保持 $LFS/tools 目录的现状，其中的文件将属于一个没有相关联帐号的用户ID。这很危险，因为随后创建的用户有可能会分配到相同的用户ID，从而变成 $LFS/tools 目录及其中所有文件的属主，以致留下恶意操作这些文件的可能。

为了解决这个问题，你可以在随后新的 LFS 系统里创建 /etc/passwd 文件时增加一个 lfs 用户，并注意给它分配和宿主系统里相同的用户和组ID。不过更好的方式是，通过下面的命令将 $LFS/tools 目录的属主改为 root 用户：

chown -R root:root $LFS/tools

尽管 $LFS/tools 目录可以在 LFS 系统构建完成后删除，但仍然可以保留下来用于构建额外的相同版本 LFS 系统。备份 $LFS/tools 目录到底有多少好处取决于你个人。

警告

如果你想保留临时工具用来构建新的 LFS 系统，现在就要备份好。本书随后第六章中的指令将对当前的工具做些调整，导致在构建新系统时会失效。

翻译团队：LCTT 译者/校对：zpl1025/ictlyh
  • 上一页

    清理无用内容

  • 下一页

    构建 LFS 系统


    改变属主

  • 下一页

    安装基本的系统软件

  • .
  • 主页

第三部分 构建 LFS 系统

目录

  • 6. 安装基本的系统软件

    • 简介
    • 准备虚拟内核文件系统
    • 软件包管理
    • 进入 Chroot 环境
    • 创建目录
    • 创建必须的文件和符号链接
    • Linux-3.19 API 头文件
    • Man-pages-3.79
    • Glibc-2.21
    • 调整工具链
    • Zlib-1.2.8
    • File-5.22
    • Binutils-2.25
    • GMP-6.0.0a
    • MPFR-3.1.2
    • MPC-1.0.2
    • GCC-4.9.2
    • Bzip2-1.0.6
    • Pkg-config-0.28
    • Ncurses-5.9
    • Attr-2.4.47
    • Acl-2.2.52
    • Libcap-2.24
    • Sed-4.2.2
    • Shadow-4.2.1
    • Psmisc-22.21
    • Procps-ng-3.3.10
    • E2fsprogs-1.42.12
    • Coreutils-8.23
    • Iana-Etc-2.30
    • M4-1.4.17
    • Flex-2.5.39
    • Bison-3.0.4
    • Grep-2.21
    • Readline-6.3
    • Bash-4.3.30
    • Bc-1.06.95
    • Libtool-2.4.6
    • GDBM-1.11
    • Expat-2.1.0
    • Inetutils-1.9.2
    • Perl-5.20.2
    • XML::Parser-2.44
    • Autoconf-2.69
    • Automake-1.15
    • Diffutils-3.3
    • Gawk-4.1.1
    • Findutils-4.4.2
    • Gettext-0.19.4
    • Intltool-0.50.2
    • Gperf-3.0.4
    • Groff-1.22.3
    • Xz-5.2.0
    • GRUB-2.02~beta2
    • Less-458
    • Gzip-1.6
    • IPRoute2-3.19.0
    • Kbd-2.0.2
    • Kmod-19
    • Libpipeline-1.4.0
    • Make-4.1
    • Patch-2.7.4
    • Systemd-219
    • D-Bus-1.8.16
    • Util-linux-2.26
    • Man-DB-2.7.1
    • Tar-1.28
    • Texinfo-5.2
    • Vim-7.4
    • 关于调试符号
    • 再次清理无用内容
    • 清理

  • 7. 基本系统配置

    • 简介
    • 通用网络配置
    • LFS 系统中的设备和模块控制
    • 定制设备的符号链接
    • 配置系统时钟
    • 配置 Linux 主控台
    • 配置系统本地化
    • 创建 /etc/inputrc 文件
    • 创建 /etc/shells 文件
    • 使用及配置 Systemd

  • 8. 让 LFS 系统可引导

    • 简介
    • 创建 /etc/fstab 文件
    • Linux-3.19
    • 用 GRUB 设置引导过程

  • 9. 尾声

    • 最后的最后
    • 为 LFS 用户数添砖加瓦
    • 重启系统
    • 接下来做什么呢？
翻译团队：LCTT 译者/校对：H-mudcup/ictlyh
  • 上一页

    改变属主

  • 下一页

    安装基本的系统软件

  • .


第六章 安装基本的系统软件

第三部分 构建 LFS 系统

    构建 LFS 系统

  • 下一页

    简介

  • 返回
  • 主页

第六章 安装基本的系统软件

目录

  • 简介
  • 准备虚拟内核文件系统
  • 管理软件包
  • 进入 Chroot 环境
  • 创建目录
  • 创建必需的文件和符号链接
  • Linux-3.19 API 头文件
  • Man-pages-3.79
  • Glibc-2.21
  • 调整工具链
  • Zlib-1.2.8
  • File-5.22
  • Binutils-2.25
  • GMP-6.0.0a
  • MPFR-3.1.2
  • MPC-1.0.2
  • GCC-4.9.2
  • Bzip2-1.0.6
  • Pkg-config-0.28
  • Ncurses-5.9
  • Attr-2.4.47
  • Acl-2.2.52
  • Libcap-2.24
  • Sed-4.2.2
  • Shadow-4.2.1
  • Psmisc-22.21
  • Procps-ng-3.3.10
  • E2fsprogs-1.42.12
  • Coreutils-8.23
  • Iana-Etc-2.30
  • M4-1.4.17
  • Flex-2.5.39
  • Bison-3.0.4
  • Grep-2.21
  • Readline-6.3
  • Bash-4.3.30
  • Bc-1.06.95
  • Libtool-2.4.6
  • GDBM-1.11
  • Expat-2.1.0
  • Inetutils-1.9.2
  • Perl-5.20.2
  • XML::Parser-2.44
  • Autoconf-2.69
  • Automake-1.15
  • Diffutils-3.3
  • Gawk-4.1.1
  • Findutils-4.4.2
  • Gettext-0.19.4
  • Intltool-0.50.2
  • Gperf-3.0.4
  • Groff-1.22.3
  • Xz-5.2.0
  • GRUB-2.02~beta2
  • Less-458
  • Gzip-1.6
  • IPRoute2-3.19.0
  • Kbd-2.0.2
  • Kmod-19
  • Libpipeline-1.4.0
  • Make-4.1
  • Patch-2.7.4
  • Systemd-219
  • D-Bus-1.8.16
  • Util-linux-2.26
  • Man-DB-2.7.1
  • Tar-1.28
  • Texinfo-5.2
  • Vim-7.4
  • 关于调试符号
  • 再次清理无用内容
  • 清理
翻译团队：LCTT 译者/校对：H-mudcup/ictlyh
  • 上一页

    构建 LFS 文件系统

  • 下一页

    简介


6.1. 简介

第六章 安装基本的系统软件

    安装基本的系统软件

  • 下一页

    准备虚拟内核文件系统

  • 返回
  • 主页

6.1. 简介

在本章里，我们会进入构建环境然后开始认真地构建 LFS 系统了。就是说，我们会 chroot 进入之前准备好的临时迷你 Linux 系统，做一些最后的准备工作，然后就开始安装软件包。

安装软件非常直观。尽管很多时候安装指令能更短而且更具通用性，但我们还是选择为每个软件包都提供完整的指令，以减小引起错误的可能性。了解 Linux 系统如何工作的关键就是知道每个软件包的作用以及为什么你（或系统）需要它。

我们不建议在编译时使用优化。这虽然可以让程序运行得快那么一点点，但是却也有可能增加编译难度以及在运行时出问题。如果在打开优化后编译失败，请试一下关闭优化编译看看行不行。就算打开优化通过了编译，考虑到源代码和编译工具之间的复杂交互，仍然存在编译不正确的风险。而且请注意 -march 和 -mtune 选项里使用的本书没有指定的值都是未经过测试的。这有可能引起工具链软件包（Binutils、GCC 和 Glibc）相关的问题。所以说，使用编译器优化选项带来的这一点点潜在好处通常不值得其所带来的风险。对于第一次构建 LFS 系统的新人，建议在构建时不要自己增加优化选项。这样构建出来的系统一样会运行得很快而且同时会很稳定。

本章里安装软件包的顺序需要严格遵守，这是为了保证不会有程序意外地依赖与 /tools 相关的目录。同样的理由，不要同时编译不同的软件包。并行地编译也许能节省一点时间（特别是在双 CPU 电脑上），但是它可能会导致程序里存在包含到 /tools目录的硬链接，这样的话在这个目录移除后程序就不能正常工作了。

在安装指令之前，每个页面都提供了关于软件包的信息，包括它所包含的内容的精确描述，大概需要多长时间，以及在构建过程中需要多少磁盘空间。在安装指令之后，有这个软件包将安装的程序和库文件列表（以及它们的简短描述）。

注意

第六章里软件包的 SBU 数值和所需磁盘空间包含了可能存在的测试套件数据。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    安装基本的系统软件

  • 下一页

    准备虚拟内核文件系统


6.2. 准备虚拟内核文件系统

第六章 安装基本的系统软件

    简介

  • 下一页

    软件包管理

  • 返回
  • 主页

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 目录下设备的方式是在 /dev目录挂载一个虚拟文件系统（比如 tmpfs），然后允许在检测到设备或打开设备时在这个虚拟文件系统里动态创建设备节点。这个通常是在启动过程中由 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

devpts 挂载选项的含义：

gid=5

这个选项会让 devpts 创建的所有设备节点属主的组 ID 都是 5。这是我们待会将要指定给 tty 组的 ID。现在我们先用 ID 代替组名，因为宿主机系统可能会为它的 tty 组分配了不同的 ID。

mode=0620

这个选项会让 devpts 创建的所有设备节点的属性是 0620（属主用户可读写，组成员可写）。和上一个选项同时使用，可以保证 devpts 所创建的设备节点能满足 grantpt() 函数的要求，这意味着不需要 Glibc 的 pt_chown 帮助程序（默认没有安装）了。

在某些宿主机系统里，/dev/shm 是一个指向 /run/shm 的软链接。这个 /run 下的 tmpfs 文件系统已经在之前挂载了，所以在这里只需要创建一个目录。

if [ -h $LFS/dev/shm ]; then
  mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    简介

  • 下一页

    软件包管理


6.3. 软件包管理

第六章 安装基本的系统软件

    准备虚拟内核文件系统

  • 下一页

    进入 Chroot 环境

  • 返回
  • 主页

6.3. 软件包管理

软件包管理是我们经常收到希望添加到 LFS 手册里的需求。一个软件包管理器可以追踪安装的文件，这样可以在移除或升级软件包时轻松地清理。不仅是二进制执行文件和库文件，包管理器还会处理配置文件的安装。在你遐想之前提醒一下，不！——本节不涉及也不建议任何一个特定的包管理器，而是关于软件包管理的更一般的技术的综合概述。最适合你的包管理器可能就在这些技术里，或者可能是两个或更多的组合。本节还会简要提到升级软件包可能碰到的问题。

关于为什么 LFS 或 BLFS 手册里不采用任何软件包管理器的一些原因：

  • 软件包管理偏离了本手册的主要目标——教大家 Linux 系统是如何构建出来的。

  • 存在很多软件包管理的解决方案，每一个都有自己的长处和缺点。很难选择一种适合所有人的方式。

关于软件包管理有很多资料，请访问 Hints Project 看看是否有一个能适合你的需求。

6.3.1. 升级问题

软件包管理器可以在软件新版本发布后轻松升级。一般来说 LFS 和 BLFS 手册里的指令可以用来升级到新版本。下面是一些在你准备升级软件包时需要注意的事情，特别是在一个运行中的系统。

  • 如果需要升级 Glibc 到新版本（比如，从 glibc-2.19 升级到 glibc-2.20），重新构建整个 LFS 会比较安全。虽然你也许能够按依赖关系重新编译所有的软件包，不过我们不建议这样做。

  • 如果某个包含的动态库的软件包升级了，而且库名字有改变，那么所有动态链接到这个库的软件包都需要重新链接新的库。（请注意软件包版本和库名字并不存在相关性。）举个例子，某个软件包 foo-1.2.3 安装了一个名叫 libfoo.so.1 的动态库。然后假设你把这个软件包升级到了新版本 foo-1.2.4，而新版本会安装名叫 libfoo.so.2的动态库。在这种情况下，所有动态链接到 libfoo.so.1 的软件包都需要重新编译链接到 libfoo.so.2。注意在所有依赖软件包重新编译完成之前，请不要删除旧版的库文件。

6.3.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、Graft 和 Depot。

这种安装方式需要伪装，这样软件包会认为自己被装到了 /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. 基于时间戳

在这种方式里，在安装之前会创建一个时间戳文件。在安装之后，用一行简单的 find 命令加上合适的参数就可以生成在时间戳文件创建之后所安装的所有文件列表。有一个采用这种方式的包管理器叫做 install-log。

这种方式的优点是非常简单，但是它有两个缺陷。比如，在安装过程中，所安装文件采用的是其它时间戳而不是当前时间，那这些文件将不能被软件包管理器跟踪到。还有，这种方式只能在一次安装一个软件包的情况下使用。如果在不同的终端里同时安装两个不同的软件包，此时的安装日志就不可靠了。

6.3.2.5. 追踪安装脚本

在这种方式里，安装脚本所使用的命令都会被记录下来。有两种技术，一种技术是：

设定环境变量 LD_PRELOAD 指向一个在安装前预加载的库。在安装过程中，这个库会追踪软件包安装脚本里所包含的各种执行文件比如 cp、install、mv，以及追踪会修改文件系统的系统调用。要让这种方式有效的话，所有的执行文件需要动态链接到没有 suid 或 sgid 标志位的库。预加载这个库可能会引起安装过程中一些意外的副作用。不过，建议做一些测试以保证软件包管理器不会造成破坏并且记录了所有适当的文件。

第二种技术是使用 strace 命令，它会记录下安装脚本执行过程中所有的系统调用。

6.3.2.6. 创建软件包存档

在这种方式里，像之前的软链接软件包管理方式里所描述的那样，软件包被伪装安装到一个独立的目录树里。在安装完成后，会将已安装文件打包成一个软件包存档。然后这个存档会用来在本地机器或其他机器上安装软件包。

这种方式为商业发行版中的大多数包管理器所采用。一些例子是 RPM（它顺便也是 Linux 标准规范 里所要求的）、pkg-utils、Debian 的 apt、以及 Gentoo 的 Portage 系统。该页面描述了如何在 LFS 系统里采用这种包管理方式： http://www.linuxfromscratch.org/hints/downloads/files/fakeroot.txt。

创建带有依赖关系的软件包存档非常复杂，已经超出 LFS 手册范围了。

Slackware 使用一个基于 tar 的系统来创建软件包存档。这套系统不像那些更复杂的包管理器，有意地不处理包依赖关系。关于 Slackware 包管理器的详细信息，请参看 http://www.slackbook.org/html/package-management.html。

6.3.2.7. 基于用户的软件包管理

在这种方式，是 LFS 特有的，由 Matthias Benkmann 所设计，可以在 Hints Project 里能找到。在这种方式里，每个软件包都由一个单独的用户安装到标准的位置。属于某个软件包的文件可以通过检查用户 ID 轻松识别出来。关于这种方式的特性和短处非常复杂，在本节里说不清楚。详细的信息请参看 http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt。

6.3.3. 在多个系统上布置 LFS

LFS 系统的一个优点是没有会依赖磁盘系统里文件位置的文件。克隆一份 LFS 到和宿主机器相似配置的机器上，简单到只要对包含根目录的 LFS 分区（对于一个基本的 LFS 构建不压缩的话大概有 250MB）使用 tar命令打包，然后通过网络传输或光盘拷贝到新机器上展开即可。在这之后，还需要调整一些配置文件，包括：/etc/hosts、/etc/fstab、/etc/passwd、/etc/group、/etc/shadow 和 /etc/ld.so.conf。

根据系统硬件和原始内核配置文件的差异，可能还需要重新编译一下内核。

最后，需要使用 8.4 “用 GRUB 设置引导过程”里所介绍的方法让新系统可引导。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    准备虚拟内核文件系统

  • 下一页

    进入 Chroot 环境


6.4. 进入 Chroot 环境

第六章 安装基本的系统软件

  • 下一页

    软件包管理

  • 下一页

    创建目录

  • 返回
  • 主页

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

给 env 命令传递 -i 选项会清除这个 chroot 切换进去的环境里所有变量。随后，只重新设定了 HOME、TERM、PS1 和 PATH 变量。TERM=$TERM 语句会设定 chroot 进入的环境里的 TERM 变量为进入前该变量同样的值。许多程序需要这个变量才能正常工作，比如 vim 和 less。如果还需要设定其他变量，比如 CFLAGS 或 CXXFLAGS，就在这里一起设定比较合适。

从这里以后，就不再需要 LFS 变量了，因为后面所有工作都将被限定在 LFS 文件系统里。这是因为我们已经告诉 Bash 终端 $LFS 就是当前的根目录（/）。

请注意 /tools/bin 放在了 PATH 变量的最后。意思是在每个软件的最后版本编译安装好后就不再使用临时工具了。这还需要让 shell 不要“记住”每个可执行文件的位置—这样的话，还要给 bash 加上 +h 选项来关闭其哈希功能。

注意一下 bash 的提示符是 I have no name!。这是正常的，因为这个时候 /etc/passwd 文件还没有被创建。

注意

非常重要，本章从这以后的命令，以及后续章节里的命令都要在 chroot 环境下运行。如果因为某种原因（比如说重启）离开了这个环境，请保证要按照 6.2.2,“挂载和激活 /dev” 和 6.2.3,“挂载虚拟内核文件系统”里所说的那样挂载虚拟内核文件系统，然后在继续构建之前重新运行 chroot 进入环境。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 下一页

    软件包管理

  • 下一页

    创建目录


6.5. 创建目录

第六章 安装基本的系统软件

    进入 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) ln -sv lib /lib64
         ln -sv lib /usr/lib64
         ln -sv lib /usr/local/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。还增加了一个所谓的 “粘滞位”的限制，即位掩码 0x1777 中最高位的比特(1)。

6.5.1. 关于 FHS 兼容性

这个目录树是基于文件系统目录结构标准（FHS）（参看 https://wiki.linuxfoundation.org/en/FHS）。FHS 标准还规定了要有 /usr/local/games 和 /usr/share/games 目录。另外 FHS 标准关于/usr/local/share 里子目录的结构要求并不清晰，所以我们只创建了我们需要的目录。不过，如果你更喜欢严格遵守 FHS 标准，创建这些目录也不会有问题。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    进入 Chroot 环境

  • 下一页

    创建必需的文件和符号链接


6.6. 创建必需的文件和符号链接

第六章 安装基本的系统软件

    创建目录

  • 下一页

    Linux-3.19 API 头文件

  • 返回
  • 主页

6.6. 创建必需的文件和符号链接

有些程序里会使用写死的路径调用其它暂时还未安装的程序。为了满足这种类型程序的需要，我们将创建一些符号链接，在完成本章内容后这些软件会安装好，并替代之前的符号链接：

ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.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/echo

这个是为了满足 Glibc 测试套件里的一个测试用例，它会检测 /bin/echo。

/bin/pwd

某些 configure 脚本，特别是 Glibc 的，写死了这个路径。

/bin/stty

这个路径在 Expect 软件中写死了，所以在 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 位置，在装好 GCC 后新的引用位置是 /usr/lib/libstdc++.la。

/bin/sh

许多 shell 脚本写死了位置 /bin/sh。

由于历史原因，Linux 在文件/etc/mtab中维护一个已挂载文件系统的列表。而现代内核改为在内部维护这个列表，并通过 /proc 文件系统输出给用户。为了满足一些依赖 /etc/mtab 文件的应用程序，我们要创建下面的符号链接：

ln -sv /proc/self/mounts /etc/mtab

为了让 root 用户能正常登录，而且 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
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/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:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
nogroup:x:99:
users:x:999:
EOF

这里创建的用户组没有参照任何标准 — 它们一部分是为了满足本章中配置 Udev 的需要，还有一部分来自一些现存 Linux 发行版的通用设定。另外，某些测试套件也依赖特定用户或组。而 Linux 标准规范 （LSB，参见http://www.linuxbase.org）只要求以组 ID（GID）为 0 创建用户组 root 以及以 GID 为 1 创建用户组 bin。系统管理员可以自由分配其它所有用户组名字和 GID，因为优秀的程序不会依赖 GID 数字，而是使用组名。

为了移除 “I have no name!” 的提示符，可以打开一个新 shell。由于完整的 Glibc 已经在 第五章 里装好了，而且已经创建好了 /etc/passwd 和 /etc/group 文件，用户名和组名就可以正常解析了：

exec /tools/bin/bash --login +h

注意这里使用了 +h 参数。这样会告诉 bash 不要使用它内建的路径哈希功能。而不加这个参数的话， bash 将会记住曾经执行过程序的路径。为了在新编译安装好程序后就能马上使用，参数 +h 将在本章中一直使用。

程序 login，agetty 和 init（还有一些其它的）会使用一些日志文件来记录信息，比如谁在什么时候登录了系统。不过，在日志文件不存在的时候这些程序一般不会写入。下面初始化一下日志文件并加上合适的权限：

touch /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664  /var/log/lastlog
chmod -v 600  /var/log/btmp

文件 /var/log/wtmp 会记录所有的登录和登出动作。文件 /var/log/btmp 会记录失败的登录尝试。

注意

文件 /run/utmp 会记录当前已登录的用户。这个文件会在启动脚本中动态创建。

注：下面的注意事项为译者根据第五章添加。

重要

再次强调构建过程：

  1. 把所有源文件和补丁放到 chroot 环境可访问的目录，例如 /mnt/lfs/sources/。但是千万不能把源文件放在 /mnt/lfs/tools/ 中。

  2. 进入到源文件目录。

  3. 对于每个软件包:

    1. 用 tar 程序解压要编译的软件包。

    2. 进入到解压后创建的目录中。

    3. 根据指南说明编译软件包。

    4. 回退到源文件目录。

    5. 除非特别说明，删除解压出来的目录和所有编译过程中生成的 <package>-build 目录。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    创建目录

  • 下一页

    Linux-3.19 API 头文件


6.7. Linux-3.19 API 头文件

第六章 安装基本的系统软件

    创建必需的文件和符号链接

  • 下一页

    Man-pages-3.79

  • 返回
  • 主页

6.7. Linux-3.19 API 头文件

Linux API 头文件（在 linux-3.19.tar.xz 里）会将内核 API 导出给 Glibc 使用。

大概编译时间： 少于 0.1 SBU
所需磁盘空间： 662 MB

6.7.1. Linux API 头文件的安装

Linux 内核需要提供一个应用编程接口（API）供系统的 C 库（LFS 中的 Glibc）调用。这通过整理 Linux 内核源码包中的多个 C 头文件来完成。

确保在之前的动作里没有留下旧文件和依赖关系：

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/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/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 头文件
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    创建必需的文件和符号链接

  • 下一页

    Man-pages-3.79


6.8. Man-pages-3.79

第六章 安装基本的系统软件

    Linux-3.19 API 头文件

  • 下一页

    Glibc-2.21

  • 返回
  • 主页

6.8. Man-pages-3.79

Man-pages 软件包里包含了超过 2,200 份 man 手册页面。

大概编译时间： 少于 0.1 SBU
所需磁盘空间： 35 MB

6.8.1. 安装 Man-pages

运行下面的命令安装 Man-pages：

make install

6.8.2. Man-pages 内容

安装的文件： 各种 man 手册页面

简短描述

man 手册

描述 C 编程语言函数，重要的设备文件，以及主要的配置文件

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    Linux-3.19 API 头文件

  • 下一页

    Glibc-2.21


6.9. Glibc-2.21

第六章 安装基本的系统软件

    Man-pages-3.79

  • 下一页

    调整工具链

  • 返回
  • 主页

6.9. Glibc-2.21

Glibc 软件包包含了主要的 C 函数库。这个库提供了分配内存、搜索目录、打开关闭文件、读写文件、操作字符串、模式匹配、基础算法等基本程序。

大概编译时间： 16.3 SBU
所需磁盘空间： 1.1 GB

6.9.1. 安装 Glibc

注意

有些 LFS 之外的软件包会建议安装 GNU libiconv 来转换不同编码的文字。根据项目主页（http://www.gnu.org/software/libiconv/）上的说法“这个库会提供函数 iconv() 的实现，应用于那些没有这个函数的系统，或者函数实现中不支持 Unicode 转换的系统。” Glibc 提供了函数 iconv() 的实现而且支持 Unicode 转换，所以对于 LFS 系统来说并不需要 libiconv 库。

有些 Glibc 程序会用到和 FHS 不兼容的 /var/db 目录来存储它们的运行时数据。打上如下的补丁让这些程序在 FHS 兼容的位置存储它们的运行时数据。

patch -Np1 -i ../glibc-2.21-fhs-1.patch

Glibc 的编译系统是自包含的，可以完美安装，尽管编译器的配置文件和链接器仍然指向 /tools。这在 Glibc 安装前没法调整，因为如果调整的话 Glibc 的 autoconf 测试将会提示错误，不符合我们实现一个干净构建的目标。

修正软件包里的一个会影响到 32 位架构系统的正则表达式：

sed -e '/ia32/s/^/1:/' \
    -e '/SSE2/s/^1://' \
    -i  sysdeps/i386/i686/multiarch/mempcpy_chk.S

Glibc 文档里建议在 Glibc 源代码目录之外的特定编译目录下编译：

mkdir -v ../glibc-build
cd ../glibc-build

配置 Glibc 准备编译：

../glibc-2.21/configure    \
    --prefix=/usr          \
    --disable-profile      \
    --enable-kernel=2.6.32 \
    --enable-obsolete-rpc

新出现的 configure 选项参数的含义：

--enable-obsolete-rpc

安装 NIS 和 RPC 相关的头文件，默认是不安装的；重新编译 Glibc 时以及一些 BLFS 软件包需要这些头文件。

编译软件包：

make

重要

在本小节里，运行 Glibc 的测试套件是很关键的。在任何情况下都不要跳过这个测试。

通常会有一些测试不能通过，但是一般你可以忽略任何下面列出来的失败项。现在开始测试编译结果：

make check

你可能会看到一些失败的测试项。Glibc 的测试套件对宿主系统有一定的依赖。下面是当前版本 LFS 里最常见的问题：

  • 测试项 tst/tst-cputimer1 和 rt/tst-cpuclock2 已知是通不过的。具体原因还不清楚，不过一些细微的时间问题可能导致这些测试失败。

  • 如果你系统的 CPU 不是相对较新的 Genuine Intel 或 Authentic AMD 处理器，数学运算测试有时候会失败。

  • 因为测试的时候还没有网络，测试项 posix/tst-getaddrinfo4 和 posix/tst-getaddrinfo5 将总是失败。

  • 其它已知的在某些架构平台上会失败的测试项是 malloc/tst-malloc-usable 和 nptl/tst-cleanupx4。

在安装 Glibc 时会抱怨找不到 /etc/ld.so.conf 文件，这只是无关紧要的输出信息。下面的方式可以避免这个警告：

touch /etc/ld.so.conf

安装软件包：

make install

为 nscd 安装配置文件并创建运行时目录：

cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

为 nscd 安装系统支持文件：

install -v -Dm644 ../glibc-2.21/nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../glibc-2.21/nscd/nscd.service /lib/systemd/system/nscd.service

上面的命令并没有安装可以让你的电脑用不同语言响应的语言环境。语言环境并不是必须的，只是如果有些语言环境缺失，后续的测试套件可能会跳过一些重要测试用例。

单独的语言环境可以用 localedef 程序安装。例如，下面第一个 localedef 命令将 /usr/share/i18n/locales/cs_CZ 字符无关的语言环境定义和 /usr/share/i18n/charmaps/UTF-8.gz 字符表定义组合在一起，并将结果附加到 /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.21/localedata/SUPPORTED 文件里列出的所有语言环境（包括以上列出的所有语言环境以及其它更多），执行下面这个非常耗时的命令：

make localedata/install-locales

你需要的语言环境几乎不大可能没列在 glibc-2.21/localedata/SUPPORTED 文件中，但如果真的没有可以使用 localedef 命令创建和安装。

6.9.2. 配置 Glibc

尽管 Glibc 在文件 /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 myhostname
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

安装时区数据：

tar -xf ../tzdata2015a.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 命令的含义：

zic -L /dev/null ...

这会创建没有时间补偿的 posix 时区数据。一般将它们同时放在 zoneinfo 和 zoneinfo/posix 目录下。另外需要将 POSIX 时区数据放到 zoneinfo 目录下，否则很多测试套件会报错。在嵌入式平台，如果存储空间紧张而且你也不准备更新时区，也可以不用 posix 目录从而节省 1.9MB，但是一些应用程序或测试套件也许会出错。

zic -L leapseconds ...

这会创建包含时间补偿的 right 时区数据。在嵌入式平台，空间比较紧张而且你也不打算更新时区或者不需要准确时间，你可以忽略 right 目录从而节省 1.9MB。

zic ... -p ...

这会创建 posixrules 文件。我们使用纽约是因为 POSIX 要求夏令时规则与 US 标准一致。

一种确定本地时区的方式是运行下面的脚本：

tzselect

在询问了几个关于位置的问题后，脚本会输出所在时区的名字（比如 America/Edmonton）。在 /usr/share/zoneinfo 文件中也有其它一些可用时区，比如 Canada/Eastern 或 EST5EDT，这些时区并没有被脚本列出来但也是可以使用的。

然后运行下面的命令创建 /etc/localtime 文件：

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

将命令中的 <xxx> 替换成你所在实际时区的名字（比如 Canada/Eastern）。

6.9.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.4. Glibc 软件包内容

安装的程序： catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, rpcgen, sln, sotruss, sprof, tzselect, xtrace, zdump, 和 zic
安装的库： ld-2.21.so, libBrokenLocale.{a,so}, libSegFault.so, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a, libm.{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so}, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.{a,so}, libpthread_nonshared.a, libresolv.{a,so}, librpcsvc.a, librt.{a,so}, libthread_db.so, 和 libutil.{a,so}
安装的目录： /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 | 创建 iconv 快速加载模块配置文件
ldconfig | 配置动态链接器的运行时环境
ldd | 报告某个程序或动态库所依赖的动态库。
lddlibc4 | 协助 ldd 处理某些目标文件。
locale | 输出当前语言环境的大量信息
localedef | 编译语言环境规格
makedb | 根据输入的文本创建简单数据库
mtrace | 读取并解析内存跟踪文件，然后用方便人阅读的格式显示一个摘要
nscd | 一个后台服务程序，提供最常用名字服务请求的缓存
pcprofiledump | 输出个人电脑分析时生成的信息
pldd | 列出运行中进程正在使用的动态共享目标
rpcgen | 生成实现远端进程调用（RPC）协议的 C 语言代码
sln | 一个静态链接的 ln 程序
sotruss | 跟踪指定命令里的动态库函数调用
sprof | 读取并显示共享目标分析数据
tzselect | 询问用户该系统的地理位置并给出相应的时区描述
xtrace | 跟踪程序执行过程并打印当前执行的函数
zdump | 时区数据输出工具
zic | 时区数据编译工具
ld-2.21.so | 用于动态库执行的辅助程序
libBrokenLocale | Glibc 内部的一个粗暴破解用来修复损坏程序（比如，一些 Motif 应用）。查看文件 glibc-2.21/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 | 名称服务切换函数库，包含了解析主机名、用户名、组名、别称、服务、协议等等的函数。
libpcprofile | 包含一些分析函数，用于跟踪特定源代码里的 CPU 时间占用情况
libpthread | POSIX 线程函数库
libresolv | 包含了创建、发送和解析互联网域名服务器封包的函数
librpcsvc | 包含了提供杂项 RPC 服务的函数
librt | 包含了实现 POSIX.1b 实时扩展里规定的大部分接口的函数
libthread_db | 包含了方便构建多线程程序调试工具的函数
libutil | 包含各种 Unix 应用程序中用到的“标准” 函数的代码
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    Man-pages-3.79

  • 下一页

    调整工具链


6.10. 调整工具链

第六章 安装基本的系统软件

    Glibc-2.21

  • 下一页

    Zlib-1.2.8

  • 返回
  • 主页

6.10. 调整工具链

现在最后的 C 语言库已经装好了，是时候调整工具链，让新编译的程序链接到这些新的库上。

首先,备份 /tools 链接器，然后用我们在第五章调整过的链接器代替它。我们还会创建一个链接，链接到 /tools/$(gcc -dumpmachine)/bin 的副本：

mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

接下来，修改 GCC 参数文件，让它指向新的动态连接器。只需删除所有 “/tools” 的实例，这样应该可以留下到达动态链接器的正确路径。还要调整参数文件，这样 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 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

如果没有任何错误，上条命令的输出应该是（不同的平台上的动态链接器可能名字不同）：

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

注意 /lib 现在是我们动态链接库的前缀。

现在确保我们已经设置好了启动文件：

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

上一条命令的输出应该是：

/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/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

上条命令的输出应该是（在 64 位主机上会有 lib64 目录）：

attempt to open /lib/libc.so.6 succeeded

最后，确保 GCC 使用的是正确的动态链接器：

grep found dummy.log

上条命令的结果应该是（不同的平台上链接器名字可以不同，64 位主机上是 lib64 目录）：

found ld-linux.so.2 at /lib/ld-linux.so.2

如果显示的结果不一样或者根本没有显示，那就出了大问题。检查并回溯之前的步骤，找到出错的地方并改正。最有可能的原因是参数文件的调整出了问题。在进行下一步之前所有的问题都要解决。

一旦所有的事情都正常了，清除测试文件：

rm -v dummy.c a.out dummy.log
翻译团队：LCTT 译者/校对：H-mudcup,wxy
  • 上一页

    Glibc-2.21

  • 下一页

    Zlib-1.2.8


6.11. Zlib-1.2.8

第六章 安装基本的系统软件

    调整工具链

  • 下一页

    File-5.22

  • 返回
  • 主页

6.11. Zlib-1.2.8

Zlib 软件包包括一些程序所使用的压缩和解压缩例程。

大概编译时间: 低于 0.1 SBU
需要磁盘空间: 4.1 MB

6.11.1. 安装 Zlib

准备编译 Zlib:

./configure --prefix=/usr

编译软件包:

make

输入命令查看结果：

make check

安装软件包:

make install

共享库需要移动到 /lib，因此需要重建 /usr/lib 里面的 .so 文件：

mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so

6.11.2. Zlib 软件包内容

安装的库： libz.{a,so}

简要介绍

libz

包括一些程序所使用的压缩和解压缩功能。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    调整工具链

  • 下一页

    File-5.22


6.12. File-5.22

第六章 安装基本的系统软件

    Zlib-1.2.8

  • 下一页

    Binutils-2.25

  • 返回
  • 主页

6.12. File-5.22

File 软件包包括一个判断给定的某个或某些文件文件类型的工具。

大概编译时间: 0.1 SBU
需要磁盘空间: 16 MB

6.12.1. 安装 File

准备编译 File:

./configure --prefix=/usr

编译软件包:

make

输入命令检查结果:

make check

安装软件包:

make install

6.12.2. File 软件包内容

安装的程序： file
安装的库： libmagic.so

简要介绍

file | 给指定的文件分类；通过进行一些测试实现—文件系统测试、 魔数测试、以及语言测试。
libmagic | 包含 file 程序 使用的魔数识别例程。
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Zlib-1.2.8

  • 下一页

    Binutils-2.25


6.13. Binutils-2.25

第六章 安装基本的系统软件

    File-5.22

  • 下一页

    GMP-6.0.0a

  • 返回
  • 主页

6.13. Binutils-2.25

Binutils 软件包包含一个链接器、一个汇编器、以及其它处理目标文件的工具。

大概编译时间: 2.2 SBU
需要磁盘空间: 473 MB

6.13.1. 安装 Binutils

通过一个简单测试验证在 chroot 环境下 PTY 工作正常：

expect -c "spawn ls"

这个命令应该输出以下内容：

spawn ls

假如输出包括下面的信息，那么表示没有为 PTY 操作设置好环境。在运行 Binutils 和 GCC 的测试套件之前需要解决这个问题：

The system has no more ptys.
Ask your system administrator to create more.

Binutils 的文档建议在源文件目录之外一个专用的编译目录编译 Binutils：

mkdir -v ../binutils-build
cd ../binutils-build

准备编译 Binutils：

../binutils-2.25/configure --prefix=/usr   \
                           --enable-shared \
                           --disable-werror

编译软件包：

make tooldir=/usr

make 参数的含义:

tooldir=/usr

一般来说，tooldir (最终存放可执行文件的目录) 设置为 $(exec_prefix)/$(target_alias)。例如，x86_64 机器会把它扩展为/usr/x86_64-unknown-linux-gnu。因为这是个自定制的系统，并不需要 /usr 中的特定目标目录。如果系统用于交叉编译（例如，在 Intel 机器上编译能生成在 PowerPC 机器上运行的代码的软件包）会使用 $(exec_prefix)/$(target_alias)。

重要

本章节中的 Binutils 测试套件至关重要，任何情况下都不能跳过。

查看结果：

make -k check

安装软件包：

make tooldir=/usr install

6.13.2.Binutils 内容

安装的程序： addr2line, ar, as, c++filt, elfedit, gprof, ld, ld.bfd, nm, objcopy, objdump, ranlib, readelf, size, strings, 和 strip
安装的库： libbfd.{a,so} 和 libopcodes.{a,so}
安装目录： /usr/lib/ldscripts

简要介绍

addr2line | 转换程序地址为文件名称和行号；给定一个地址和可执行文件的名称，它使用可执行文件中的调试信息来判断与该地址关联的源文件以及行号。
ar | 创建、更改以及抽取归档文件。
as | 一个将 gcc 的输出汇编到目标文件的汇编器。
c++filt | 链接器用来过滤 C++ 和 Java 符号以及防止重载函数冲突。
elfedit | 更新 ELF 文件的 ELF 文件头
gprof | 显示调用关系图配置数据
ld | 一个将多个目标文件和归档文件合并为单一文件，重定位数据及绑定符号引用的链接器。
ld.bfd | 到 ld 的硬链接。
nm | 列出指定目标文件中出现的符号
objcopy | 转换某种类型的目标文件到另一种类型
objdump | 显示给定目标文件的信息，用选项可以控制显示特定信息；显示的信息对于使用编译工具的程序员非常有用。
ranlib | 生成归档文件内容的索引并保存到归档文件；索引列出了所有归档文件成员——可重定位的目标文件定义的符号。
readelf | 显示 ELF 类型的二进制文件的信息
size | 列出所给目标文件各部分大小和总的大小
strings | 对每个给定文件，输出不低于指定长度（默认是4）的可打印字符序列；对于目标文件，它默认只打印初始化和引导部分的字符串，而对于其它类型的文件扫描整个文件。
strip | 从目标文件中去除符号
libbfd | 二进制文件描述库
libopcodes | 用于处理操作码—处理器指令的“可读文本”版本 的库；用于构建类似 objdump 的工具。
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    File-5.22

  • 下一页

    GMP-6.0.0a


6.14. GMP-6.0.0a

第六章 安装基本的系统软件

    Binutils-2.25

  • 下一页

    MPFR-3.1.2

  • 返回
  • 主页

6.14. GMP-6.0.0a

GMP 软件包包含一些数学库。这里有对任意精度数值计算很有用的函数。

大概编译时间: 1.3 SBU
需要磁盘空间: 65 MB

6.14.1. 安装 GMP

注意

如果你是为 32 位的 x86 系统编译，但是你的 CPU 可以运行 64 位代码 而且 环境中你有指定的 CFLAGS，那么配置脚本会尝试配置为 64 位并导致失败。用下面的 方式执行配置命令来避免这个问题：

ABI=32 ./configure ...

准备编译 GMP:

./configure --prefix=/usr \
            --enable-cxx  \
            --docdir=/usr/share/doc/gmp-6.0.0a

新配置选项的含义:

--enable-cxx

这个参数启用 C++ 支持

--docdir=/usr/share/doc/gmp-6.0.0a

这个变量指定保存文档的正确位置。

编译软件包并生成 HTML 文档：

make
make html

重要

该章节 GMP 的测试套件至关重要，任何情况下都不能跳过。

查看结果:

make check 2>&1 | tee gmp-check-log

确认测试套件中所有的 188 个测试都通过了。通过输入下面的命令检查结果：

awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log

安装软件包和文档：

make install
make install-html

6.14.2. GMP 内容

安装的库： libgmp.{a,so} 和 libgmpxx.{a,so}
安装目录： /usr/share/doc/gmp-6.0.0a

简要介绍

libgmp | 包括精度数学函数
libgmpxx | 包括 C++ 精度属性函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Binutils-2.25

  • 下一页

    MPFR-3.1.2


6.15. MPFR-3.1.2

第六章 安装基本的系统软件

    GMP-6.0.0a

  • 下一页

    MPC-1.0.2

  • 返回
  • 主页

6.15. MPFR-3.1.2

MPFR 软件包包含多精度数学函数。

大概编译时间: 0.7 SBU
需要磁盘空间: 30 MB

6.15.1. 安装 MPFR

首先，使用下面的补丁修复上游已解决的多个漏洞：

patch -Np1 -i ../mpfr-3.1.2-upstream_fixes-3.patch

准备编译 MPFR：

./configure --prefix=/usr        \
            --enable-thread-safe \
            --docdir=/usr/share/doc/mpfr-3.1.2

编译软件包并生成 HTML 文档：

make
make html

重要

该章节 MPFR 的测试套件至关重要，任何情况下都不能跳过。

检查结果确认通过了所有的测试：

make check

安装软件包以及文档：

make install
make install-html

6.15.2. MPFR 软件包内容

安装的库： libmpfr.{a,so}
安装目录： /usr/share/doc/mpfr-3.1.2

简要介绍

libmpfr

包含多精度数学函数

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    GMP-6.0.0a

  • 下一页

    MPC-1.0.2


6.16. MPC-1.0.2

第六章 安装基本的系统软件

    MPFR-3.1.2

  • 下一页

    GCC-4.9.2

  • 返回
  • 主页

6.16. MPC-1.0.2

MPC 软件包包含一个能以任意高精度进行复数数值计算和对结果进行正确四舍五入的库。

大概编译时间: 0.3 SBU
需要磁盘空间: 11.2 MB

6.16.1. 安装 MPC

准备编译 MPC：

./configure --prefix=/usr --docdir=/usr/share/doc/mpc-1.0.2

编译软件包并生成 HTML 文档：

make
make html

用以下命令检查结果：

make check

安装软件包以及它的帮助文档：

make install
make install-html

6.16.2. MPC 软件包内容

安装的库： libmpc.{a,so}
安装目录： /usr/share/doc/mpc-1.0.2

简要介绍

libmpc

包含复数数学函数

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    MPFR-3.1.2

  • 下一页

    GCC-4.9.2


6.17. GCC-4.9.2

第六章 安装基本的系统软件

    MPC-1.0.2

  • 下一页

    Bzip2-1.0.6

  • 返回
  • 主页

6.17. GCC-4.9.2

GCC 软件包包括 GNU 编译器集，其中有 C 和 C++ 的编译器。

大概编译时间: 63 SBU (包括测试)
需要磁盘空间: 2.9 GB

6.17.1. 安装 GCC

GCC 的文档建议在源代码目录之外一个专用的编译目录中编译 GCC：

mkdir -v ../gcc-build
cd ../gcc-build

准备编译 GCC：

SED=sed                       \
../gcc-4.9.2/configure        \
     --prefix=/usr            \
     --enable-languages=c,c++ \
     --disable-multilib       \
     --disable-bootstrap      \
     --with-system-zlib

注意，对于其它的编程语言，现在还有一些前提条件没有准备好。可以查看 BLFS Book 了解如何编译 GCC 支持的所有语言的指令。

新配置选项的含义：

SED=sed

设置环境变量防止访问到硬编码的 /tools/bin/sed 路径。

--with-system-zlib

这个选项告诉 GCC 链接系统安装的 Zlib 库，而不是它内部自带的库。

编译软件包：

make

重要

本章节中 GCC 的测试套件至关重要，任何情况下都不能跳过。

GCC 测试套件中一个测试集的会耗尽堆栈空间，因此运行测试之前要增加栈大小：

ulimit -s 32768

测试编译结果，但不要因为出现错误就停下来：

make -k check

要查看测试套件结果的概要，运行：

../gcc-4.9.2/contrib/test_summary

如果只是查看概要，可以将输出通过管道送到 grep -A7 Summ。

结果可以和 http://www.linuxfromscratch.org/lfs/build-logs/7.7-systemd/ 以及 http://gcc.gnu.org/ml/gcc-testresults/ 上的相比较。

一些意料之外的错误总是难以避免。GCC 开发者通常意识到了这些问题，但还没有解决。除非测试结果和上面 URL 中的相差很大，不然就可以安全继续。

安装软件包：

make install

一些软件包希望 GCC 安装在 /lib 目录。为了支持那些软件包，可以建立一个符号链接：

ln -sv ../usr/bin/cpp /lib
译者注：如果还在 gcc-build 目录，这里应该是 ln -sv ../../usr/bin/cpp /lib 。

很多软件包用命令 cc 调用 C 编译器。为了满足这些软件包，创建一个符号链接：

ln -sv gcc /usr/bin/cc

增加一个兼容符号链接启用编译程序时进行链接时间优化（Link Time Optimization，LTO）：

install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/

现在我们最终的工具链已经准备就绪了，再一次确认编译和链接都能像预期那样正常工作很重要。我们通过做和前面章节做过的相同的完整性检查做到这点：

echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

这应该没有错误，最后一个命令的输出应该是（允许平台相关的动态链接器名字有差异）：

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

现在确认我们设置了正确的启动文件：

grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log

最后一个命令的输出应该是：

/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.9.2/../../../crtn.o succeeded

取决于你机器的架构，上面的结果可能有稍微不同，差异通常是 /usr/lib/gcc 后目录的名称。如果你的是 64 位系统，你也许能看到后面有个 lib64 的目录名字。这里重要的一点是 gcc 能在 /usr/lib 目录下找到所有的三个 crt*.o 文件。

验证编译器能搜索正确的头文件：

grep -B4 '^ /usr/include' dummy.log

这个命令应该返回下面的的输出：

#include <...> search starts here:
 /usr/lib/gcc/i686-pc-linux-gnu/4.9.2/include
 /usr/local/include
 /usr/lib/gcc/i686-pc-linux-gnu/4.9.2/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/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");

64 位的系统可能有一些不同的目录。例如，下面是一台 x86_64 机器的输出：

SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");

然后确认我们使用了正确的 libc：

grep "/lib.*/libc.so.6 " dummy.log

最后一个命令的输出（64 位主机中应该是 lib64 目录）应该是：

attempt to open /lib/libc.so.6 succeeded

最后，确认 GCC 在使用正确的动态链接器：

grep found dummy.log

最后一个命令的输出应该是（平台相关的动态链接器是可以有所差异， 64 位系统中应该是 lib64 目录）：

found ld-linux.so.2 at /lib/ld-linux.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.17.2. GCC 软件包内容

安装的程序： c++, cc (链接到 gcc), cpp, g++, gcc, gcc-ar, gcc-nm, gcc-ranlib, 和 gcov
安装的库： libasan.{a,so}, libatomic.{a,so}, libgcc.a, libgcc_eh.a, libgcc_s.so, libgcov.a, libgomp.{a,so}, libiberty.a, libitm.{a,so}, liblto_plugin.so, libquadmath.{a,so}, libssp.{a,so}, libssp_nonshared.a, libstdc++.{a,so}, libsupc++.a, 和 libtsan.{a,so}
安装目录： /usr/include/c++, /usr/lib/gcc, /usr/libexec/gcc, 和 /usr/share/gcc-4.9.2

简要介绍

c++ | C++ 编译器
cc | C 编译器
cpp | C 预处理器；编译器用来扩展源文件中 #include、#define 以及类似语句
g++ | C++ 编译器
gcc | C 编译器
gcc-ar | 增加插件到命令行的 ar 的封装。这个程序只用于添加 "链接时间优化"，在使用默认编译选项时不起作用
gcc-nm | 增加插件到命令行的 nm 的封装。这个程序只用于添加 "链接时间优化"，在使用默认编译选项时不起作用
gcc-ranlib | 增加插件到命令行的 ranlib 的封装。这个程序只用于添加 "链接时间优化"，在使用默认编译选项时不起作用
gcov | 一个覆盖测试工具；用于分析程序以决定在哪里进行优化有最大的效果
libasan | Address Sanitizer（译者注：地址消毒剂，可以查看：Wiki）运行时库。
libgcc | 包含用于 gcc 的运行时支持
libgcov | 当指示 GCC 启用分析时该库会被链接到程序中
libgomp | 用于 C/C++、Fortran 语言的多平台共享内存并行编程的 OpenMP API 的 GNU 实现
libiberty | 包含多种 GNU 程序所使用的例程，包括 getopt, obstack, strerror, strtol, 和 strtoul
liblto_plugin | GCC 的链接时间优化插件，允许 GCC 跨编译单元进行优化
libquadmath | GCC 四精度数学库 API
libssp | 包含支持 GCC 堆栈溢出保护功能的例程
libstdc++ | 标准 C++ 库
libsupc++ | 为 C++ 编程语言提供支持例程
libtsan | Thread Sanitizer（译者注：数据速率检测工具，包括一个编译器指令模块和运行时库） 运行时库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    MPC-1.0.2

  • 下一页

    Bzip2-1.0.6


6.18. Bzip2-1.0.6

第六章 安装基本的系统软件

    GCC-4.9.2

  • 下一页

    Pkg-config-0.28

  • 返回
  • 主页

6.18. Bzip2-1.0.6

Bzip2 软件包包含压缩和解压缩的程序。用 bzip2 压缩文本文件能获得比传统的 gzip 更好的压缩比。

大概编译时间: 低于 0.1 SBU
需要磁盘空间: 6.9 MB

6.18.1. 安装 Bzip2

使用能为这个软件包安装帮助文档的补丁：

patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch

下面的命令确保安装的符号链接是相对链接：

sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

确认 man 页面安装到了正确的位置：

sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile

准备编译 Bzip：

make -f Makefile-libbz2_so
make clean

make 参数的含义:

-f Makefile-libbz2_so

这会使用不同的 Makefile 文件编译 Bzip2，在这里是 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.18.2. Bzip2 软件包内容

安装的程序： bunzip2 (链接到 bzip2), bzcat (链接到 bzip2), bzcmp (链接到 bzdiff), bzdiff, bzegrep (链接到 bzgrep), bzfgrep (链接到 bzgrep), bzgrep, bzip2, bzip2recover, bzless (链接到 bzmore), 和 bzmore
安装的库： libbz2.{a,so}
安装目录： /usr/share/doc/bzip2-1.0.6

简要介绍

bunzip2 | 解压 bzip 压缩的文件
bzcat | 解压到标准输出
bzcmp | 对 bzip 压缩的文件运行 cmp 命令
bzdiff | 对 bzip 压缩的文件运行 diff 命令
bzegrep | 对 bzip 压缩的文件运行 egrep 命令
bzfgrep | 对 bzip 压缩的文件运行 fgrep 命令
bzgrep | 对 bzip 压缩的文件运行 grep 命令
bzip2 | 使用哈夫曼编码的 Burrows-Wheeler 块排序文本压缩算法压缩文件；压缩率比传统的用 “Lempel-Ziv” 算法的压缩器要好，比如 gzip。
bzip2recover | 尝试从损坏的 bzip 压缩文件中恢复数据
bzless | 对 bzip 压缩的文件运行 less 命令
bzmore | 对 bzip 压缩的文件运行 more 命令
libbz2 | 用 Burrows-Wheeler 算法实现的无损的块排序数据压缩库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    GCC-4.9.2

  • 下一页

    Pkg-config-0.28


6.19. Pkg-config-0.28

第六章 安装基本的系统软件

    Bzip2-1.0.6

  • 下一页

    Ncurses-5.9

  • 返回
  • 主页

6.19. Pkg-config-0.28

pkg-config 软件包包含一个在配置和 make 文件运行时把 include 路径和库路径传递给编译工具的工具。

大概编译时间: 0.3 SBU
需要磁盘空间: 30 MB

6.19.1. 安装 Pkg-config

准备编译 Pkg-config:

./configure --prefix=/usr        \
            --with-internal-glib \
            --disable-host-tool  \
            --docdir=/usr/share/doc/pkg-config-0.28

新配置选项的含义:

--with-internal-glib

这会让 pkg-config 使用它自己内部版本的 Glib，因为在 LFS 中没有可用的外部版本。

--disable-host-tool

这个选项取消创建到 pkg-config 程序的不必要的硬链接。

编译软件包:

make

用以下命令检查结果：

make check

安装软件包：

make install

6.19.2. pkg-config 软件包内容

安装的软件： pkg-config
安装目录： /usr/share/doc/pkg-config-0.28

简要介绍

pkg-config

返回指定库或软件包的元信息

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Bzip2-1.0.6

  • 下一页

    Ncurses-5.9


6.20. Ncurses-5.9

第六章 安装基本的系统软件

    Pkg-config-0.28

  • 下一页

    Attr-2.4.47

  • 返回
  • 主页

6.20. Ncurses-5.9

Ncurses 软件包包含用于不依赖于特定终端的字符屏幕处理的库。

大概编译时间: 0.5 SBU
需要磁盘空间: 54 MB

6.20.1. 安装 Ncurses

准备编译 Ncurses:

./configure --prefix=/usr           \
            --mandir=/usr/share/man \
            --with-shared           \
            --without-debug         \
            --enable-pc-files       \
            --enable-widec

新配置选项的含义:

--enable-widec

这个选项会编译宽字符库（例如 libncursesw.so.5.9）而不是常规的）例如 libncurses.so.5.9）。宽字符库可用于多字节和传统的 8 位本地字符， 而常规的库只能用于 8 位本地字符。宽字符库和常规的库是源文件兼容的，而不是二进制文件兼容的。

--enable-pc-files

该选项为 pkg-config 生成和安装 .pc 文件。

编译软件包：

make

该软件包有个测试套件，但只能在安装完软件包后运行。测试程序在 test/ 目录中。查看该目录中的 README 文件获取更详细信息。

安装软件包：

make install

移动共享库到期望的 /lib 文件夹：

mv -v /usr/lib/libncursesw.so.5* /lib

由于库已经被移走了，符号链接指向了一个不存在的文件。重建符号链接：

ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so

很多应用程序仍然希望编辑器能找到非宽字符的 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${lib}w.a      /usr/lib/lib${lib}.a
    ln -sfv ${lib}w.pc        /usr/lib/pkgconfig/${lib}.pc
done

ln -sfv libncurses++w.a /usr/lib/libncurses++.a

最后，确保在编译时会查找 -lcurses 的旧应用程序仍然可以编译：

rm -vf                     /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so      /usr/lib/libcurses.so
ln -sfv libncursesw.a      /usr/lib/libcursesw.a
ln -sfv libncurses.a       /usr/lib/libcurses.a

如果需要的话，安装 Ncurses 的帮助文档：

mkdir -v       /usr/share/doc/ncurses-5.9
cp -v -R doc/* /usr/share/doc/ncurses-5.9

注意

上面的指令并不会创建非宽字符 Ncurses 库，因为没有从源文件中编译安装的软件包会在运行时链接它们。如果你由于一些仅有二进制的应用程序或要和 LSB 兼容而必须要有这样的库，用下面的命令重新编译软件包：

make distclean
./configure --prefix=/usr    \
            --with-shared    \
            --without-normal \
            --without-debug  \
            --without-cxx-binding
make sources libs
cp -av lib/lib*.so.5* /usr/lib

6.20.2. Ncurses 软件包内容

安装的程序： captoinfo (链接到 tic), clear, infocmp, infotocap (链接到 tic), ncursesw5-config, reset (链接到 tset), tabs, tic, toe, tput, and tset
安装的库： libcursesw.{a,so} (到 libncursesw.{a,so} 的符号链接和链接器脚本), libformw.{a,so}, libmenuw.{a,so}, libncurses++w.a, libncursesw.{a,so}, libpanelw.{a,so}, 以及库名称中没有 "w" 的对应的非宽字符部分
安装目录： /usr/share/tabset, /usr/share/terminfo, 和 /usr/share/doc/ncurses-5.9

简要介绍

captoinfo | 转换 termcap 描述为 terminfo 描述
clear | 如果可以的话清空屏幕
infocmp | 比较或输出 terminfo 描述
infotocap | 转换 terminfo 描述为 termcap 描述
ncursesw5-config | 为 ncurses 提供配置信息
reset | 重新初始化终端为默认设置
tabs | 清空终端并设置制表符长度
tic | 将 terminfo 文件从源文件格式转换到二进制格式的 terminfo 条目描述编译器需要 ncurses 例程 [terminfo 文件包含特定终端的功能信息]
toe | 列出所有可用的终端类型，给出每个主名称和描述
tput | 可以在 shell 中使用终端特定的功能值；也可用来重置或初始化终端或者报告它的完整名称
tset | 可以用来初始化终端
libcursesw | 到 libncursesw 的链接。
libncursesw | 包含在一个终端屏幕以多种复杂方式显示文本的函数；使用这些功能的一个好的例子是内核 make menuconfig 时的菜单显示
libformw | 包含实现表单的函数
libmenuw | 包含实现菜单的函数
libpanelw | 包含实现面板的函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Pkg-config-0.28

  • 下一页

    Attr-2.4.47


6.21. Attr-2.4.47

第六章 安装基本的系统软件

    Ncurses-5.9

  • 下一页

    Acl-2.2.52

  • 返回
  • 主页

6.21. Attr-2.4.47

attr 软件包包含管理文件系统对象的扩展属性的工具。

大概编译时间: 少于 0.1 SBU
需要磁盘空间: 4.2 MB

6.21.1. 安装 Attr

修改存放文档的目录，使它放在版本特定的目录：

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

防止再次安装已经由 Man-pages 软件包安装了的帮助手册：

sed -i -e "/SUBDIRS/s|man2||" man/Makefile

准备编译 Attr：

./configure --prefix=/usr

编译软件包：

make

测试需要在支持扩展属性的文件系统上运行，例如 ext2、ext3、或者 ext4。 如果同时运行多个测试会导致测试失败(-j 选项大于 1)。输入命令检查结果：

make -j1 tests root-tests

安装软件包：

make install install-dev install-lib
chmod -v 755 /usr/lib/libattr.so

需要移动共享库到 /lib，因此需要重建 /usr/lib 中的 .so 文件：

mv -v /usr/lib/libattr.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so

6.21.2. Attr 软件包内容

安装的程序： attr, getfattr, 以及 setattr
安装的库： libattr.{a,so}
安装目录： /usr/include/attr 以及 /usr/share/doc/attr-2.4.47

简要介绍

attr | 扩展文件系统对象的属性
getfattr | 获取文件系统对象的扩展属性
setattr | 设置文件系统对象的扩展属性
libattr | 包含管理扩展属性的库函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Ncurses-5.9

  • 下一页

    Acl-2.2.52


6.22. Acl-2.2.52

第六章 安装基本的系统软件

    Attr-2.4.47

  • 下一页

    Libcap-2.24

  • 返回
  • 主页

6.22. Acl-2.2.52

Acl 软件包包含管理访问控制列表的工具，访问控制列表用于定义文件和目录更细粒度的自定义访问权限。

大概编译时间: 0.1 SBU
需要磁盘空间: 7.7 MB

6.22.1. 安装 Acl

修改存放文档的目录，使它放在版本特定的目录：

sed -i -e 's|/@pkg_name@|&-@pkg_version@|' include/builddefs.in

修复一些损坏的测试：

sed -i "s:| sed.*::g" test/{sbits-restore,cp,misc}.test

另外，修复一个组名称超长时会使 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 --libexecdir=/usr/lib

编译软件包：

make

在用 Acl 库构建 Coreutils 后，Acl 测试才能在支持访问控制的文件系统上运行。如果需要的话，可以在本章后面构建完 Coreutils 之后回到这个软件包运行 make -j1 tests 进行测试。

安装软件包：

make install install-dev install-lib
chmod -v 755 /usr/lib/libacl.so

需要移动共享库到 /lib，因此需要重建 /usr/lib 中的 .so 文件：

mv -v /usr/lib/libacl.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so

6.22.2. Acl 软件包内容

安装的程序： chacl, getfacl, 和 setacl
安装的库： libacl.{a,so}
安装目录： /usr/include/acl 和 /usr/share/doc/acl-2.2.52

简要介绍

chacl | 更改文件或目录的访问控制列表
getfacl | 获取文件访问控制列表
setacl | 设置文件访问控制列表
libacl | 包括用于管理访问控制列表的库函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Attr-2.4.47

  • 下一页

    Libcap-2.24


6.23. Libcap-2.24

第六章 安装基本的系统软件

    Acl-2.2.52

  • 下一页

    Sed-4.2.2

  • 返回
  • 主页

6.23. Libcap-2.24

Libcap 软件包实现了可用在 Linux 内核上的对 POSIX 1003.1e 功能的用户空间接口。 这些功能将所有强大 root 权限划分为不同的权限组合。

大概编译时间: 少于 0.1 SBU
需要磁盘空间: 1.8 MB

6.23.1. 安装 Libcap

编译软件包

make

这个软件包没有测试套件。

安装软件包：

make RAISE_SETFCAP=no prefix=/usr install
chmod -v 755 /usr/lib/libcap.so

make 选项的含义：

RAISE_SETFCAP=no

这个选项跳过尝试对自身使用 setcap。这可以避免内核或文件系统不支持扩展功能时出现安装错误。

需要移动共享库到 /lib，因此需要重建 /usr/lib 中的 .so 文件：

mv -v /usr/lib/libcap.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so

6.23.2. Libcap 软件包内容

安装的程序： capsh, getcap, getpcaps, 和 setcap
安装的库： libcap.{a,so}

简要介绍

capsh | 使用和控制功能支持的 shell 封装
getcap | 检查文件功能
getpcaps | 显示查询进程的功能
libcap | 包括用于管理 POSIX 1003.1e 功能的库函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Acl-2.2.52

  • 下一页

    Sed-4.2.2


6.24. Sed-4.2.2

第六章 安装基本的系统软件

    Libcap-2.24

  • 下一页

    Shadow-4.2.1

  • 返回
  • 主页

6.24. Sed-4.2.2

Sed 软件包包含一个流编辑器。

大概编译时间: 0.2 SBU
需要磁盘空间: 12 MB

6.24.1. 安装 Sed

准备编译 Sed：

./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed-4.2.2

新配置选项的含义：

--htmldir

为 HTML 文档指定安装目录。

编译软件包并生成 HTML 文档：

make
make html

输入命令查看结果：

make check

安装软件包和它的文档：

make install
make -C doc install-html

6.24.2. Sed 软件包内容

安装的程序： sed
安装目录： /usr/share/doc/sed-4.2.2

简要介绍

sed

过滤器，一次性转换文本文件

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Libcap-2.24

  • 下一页

    Shadow-4.2.1


6.25. Shadow-4.2.1

第六章 安装基本的系统软件

    Sed-4.2.2

  • 下一页

    Psmisc-22.21

  • 返回
  • 主页

6.25. Shadow-4.2.1

Shadow 软件包包含以安全方式处理密码的程序。

大概编译时间: 0.2 SBU
需要磁盘空间: 52 MB

6.25.1. 安装 Shadow

注意

如果你喜欢强制使用更强的密码，在编译 Shadow 之前可以根据 http://www.linuxfromscratch.org/blfs/view/systemd/postlfs/cracklib.html 安装 CrackLib。然后在下面的 configure 命令中增加 --with-libcrack。

取消安装 groups 程序以及它的 man 文档，因为 Coreutils 提供了一个更好的版本：

sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;

比起默认的 crypt 方法，用更安全的 SHA-512 方法加密密码，它允许密码长度超过 8 个字符。也需要把 Shadow 默认使用的用户邮箱由陈旧的 /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 的 Shadow，运行下面的命令：

sed -i 's@DICTPATH.*@DICTPATH\t/lib/cracklib/pw_dict@' etc/login.defs

做个小的改动使 useradd 的默认设置和 LFS 的组文件一致：

sed -i 's/1000/999/' etc/useradd

准备编译 Shadow：

./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.25.2. 配置 Shadow

该软件包包含增加、更改、以及删除用户和组的工具；设置和修改密码；执行其它特权级任务。软件包解压后的 doc/HOWTO 文件有关于 password shadowing 的完整解释。如果使用 Shadow 支持，记住需要验证密码（显示管理器、FTP 程序、pop3 守护进程等）的程序必须和 Shadow 兼容。 也就是说，它们要能使用 Shadow 加密的密码。

运行下面的命令启用 shadow 密码；

pwconv

运行下面的命令启用 shadow 组密码：

grpconv

用于 useradd 工具的 Shadow 配置有一些需要解释的注意事项。首先，useradd 工具的默认操作是创建用户以及和用户名相同的组。默认情况下，用户 ID(UID) 和组 ID(GID) 的数字从 1000 开始。这意味着如果你不传递参数给 useradd，系统中的每个用户都会属于一个不同的组。如果不需要这样的结果，你需要传递参数 -g 到 useradd。默认参数保存在 /etc/default/useradd 文件中。你需要修改该文件中的两个参数来实现你的特定需求。

/etc/default/useradd 参数解释

GROUP=1000

该参数设定 /etc/group 文件中使用的起始组序号。你可以把它更改为任何你需要的数字。注意 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.25.3. 设置 root 密码

运行下面的命令为用户 root 设置密码：

passwd root

6.25.4. Shadow 软件包内容

安装的程序： chage, chfn, chgpasswd, chpasswd, chsh, expiry, faillog, gpasswd, groupadd, groupdel, groupmems, groupmod, grpck, grpconv, grpunconv, lastlog, login, logoutd, newgrp, newusers, nologin, passwd, pwck, pwconv, pwunconv, sg (链接到 newgrp), su, useradd, userdel, usermod, vigr (链接到 vipw), 和 vipw
安装目录： /etc/default

简要介绍

chage | 用来更改强制性密码更新的最大天数
chfn | 用来更改用户的全名以及其它信息
chgpasswd | 用来以批处理模式更新组密码
chpasswd | 用来以批处理模式更新用户密码
chsh | 用来更改用户登录时默认使用的 shell
expiry | 检查并强制执行当前密码过期策略
faillog | 用来检查登录失败的日志文件，设置锁定用户的最大失败次数，或者重置失败次数
gpasswd | 用来给组增加、删除成员以及管理员
groupadd | 用指定的名称创建组
groupdel | 用指定的名称删除组
groupmems | 允许用户管理他/她自己的组成员列表而不需要超级用户权限。
groupmod | 用于更改指定组的名称或 GID
grpck | 验证组文件 /etc/group 和 /etc/gshadow 的完整性
grpconv | 从普通组文件创建或升级为 shadow 组文件
grpunconv | 从 /etc/gshadow 更新到 /etc/group 然后删除前者
lastlog | 报告所有用户或指定用户的最近一次登录
login | 用于系统让用户登录进来
logoutd | 用于强制限制登录时间和端口的守护进程
newgrp | 用于在一次登录会话中更改当前 GID
newusers | 用于批量创建或更新用户账户
nologin | 显示一个账户不可用的信息；它用于来作为不可登录的账户的默认 shell
passwd | 用来更改用户或组账户的密码
pwck | 验证密码文件 /etc/passwd 和 /etc/shadow 的完整性
pwconv | 从普通密码文件创建或升级 shadow 密码文件
pwunconv | 从 /etc/shadow 更新到 /etc/passwd 然后删除前者
sg | 当用户的 GID 被设置为指定组的 GID 时执行一个特定命令
su | 用替换的用户和组 ID 运行 Shell
useradd | 用指定的名称新建用户或更新新用户的默认信息
userdel | 删除指定的用户账户
usermod | 用于更改指定用户的登录名称、UID、shell、初始组、home 目录，等
vigr | 编辑 /etc/group 或 /etc/gshadow 文件
vipw | 编辑 /etc/passwd 或 /etc/shadow 文件
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Sed-4.2.2

  • 下一页

    Psmisc-22.21


6.26. Psmisc-22.21

第六章 安装基本的系统软件

    Shadow-4.2.1

  • 下一页

    Procps-ng-3.3.10

  • 返回
  • 主页

6.26. Psmisc-22.21

Psmisc 软件包包含用于显示运行中进程信息的程序。

大概编译时间： 少于 0.1 SBU
需要磁盘空间： 4.7 MB

6.26.1. 安装 Psmisc

准备编译 Psmisc：

./configure --prefix=/usr

编译软件包：

make

该软件包没有测试套件。

安装软件包：

make install

最后，将程序 killall 和 fuser 移动到 FHS 指定的位置：

mv -v /usr/bin/fuser   /bin
mv -v /usr/bin/killall /bin

6.26.2. Psmisc 软件包内容

安装的程序： fuser, killall, peekfd, prtstat, pstree, 和 pstree.x11 （链接到 pstree）

简要介绍

fuser | 报告使用指定文件或文件系统的进程的进程 ID（PID）
killall | 根据名称杀死进程；它发送信号到所有的运行任何给定命令的进程
peekfd | 根据 PID 查看正在运行进程的文件描述符
prtstat | 打印关于某个进程的信息
pstree | 以树形结构显示运行中的进程
pstree.x11 | 和 pstree 命令相同，但退出时它会等待确认
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Shadow-4.2.1

  • 下一页

    Procps-ng-3.3.10


6.27. Procps-ng-3.3.10

第六章 安装基本的系统软件

    Psmisc-22.21

  • 下一页

    E2fsprogs-1.42.12

  • 返回
  • 主页

6.27. Procps-ng-3.3.10

Procps-ng 软件包包含监视进程的程序。

大概编译时间： 0.1 SBU
需要磁盘空间： 17 MB

6.27.1. 安装 Procps-ng

准备编译 procps-ng：

./configure --prefix=/usr                            \
            --exec-prefix=                           \
            --libdir=/usr/lib                        \
            --docdir=/usr/share/doc/procps-ng-3.3.10 \
            --disable-static                         \
            --disable-kill

配置选项的含义：

--disable-kill

该选项将不会编译已经由 Util-linux 软件包安装了的 kill 命令。

编译软件包：

make

对于 LFS，测试套件需要自定义某些更改。移除当脚本不使用 tty 设备时失败的测试。用下面的命令运行测试套件：

sed -i -r 's|(pmap_initname)\\\$|\1|' testsuite/pmap.test/pmap.exp
make check

安装软件包：

make install

最后，移动重要文件到一个可以找到的位置，如果 /usr 没有挂载的话。

mv -v /usr/bin/pidof /bin
mv -v /usr/lib/libprocps.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libprocps.so) /usr/lib/libprocps.so

6.27.2. Procps-ng 软件包内容

安装的程序： free, pgrep, pidof, pkill, pmap, ps, pwdx, slabtop, sysctl, tload, top, uptime, vmstat, w, 和 watch
安装的库： libprocps.so
安装目录： /usr/include/proc 和 /usr/share/doc/procps-ng-3.3.10

简要介绍

free | 报告系统中空闲和使用的内存容量（包括物理和交换内存）
pgrep | 根据名称和其它属性查找进程
pidof | 报告指定程序的 PID
pkill | 根据名称和其它属性给进程发送信号
pmap | 报告指定进程的内存映射情况
ps | 列出正在运行的进程
pwdx | 报告进程的当前工作目录
slabtop | 实时显示内核 slab 缓存信息（译者注，关于内核 slab 缓存，可以查看Wiki）
sysctl | 运行时修改内核参数
tload | 打印当前系统平均负荷曲线图
top | 显示最 CPU 密集型进程列表；它可以实时地连续查看处理器活动
uptime | 报告系统运行时长、登录用户数目以及系统平均负荷
vmstat | 报告虚拟内存统计信息、给出关于进程、内存、分页、块输入/输出(IO)、陷阱以及 CPU 活动的信息
w | 显示当前登录的用户、以及登录地点和时间
watch | 重复运行指定命令，显示输出的第一个整屏；这允许用户查看随着时间的输出变化
libprocps | 包含该软件包大部分程序使用的函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Psmisc-22.21

  • 下一页

    E2fsprogs-1.42.12


6.28. E2fsprogs-1.42.12

第六章 安装基本的系统软件

    Procps-ng-3.3.10

  • 下一页

    Coreutils-8.23

  • 返回
  • 主页

6.28. E2fsprogs-1.42.12

E2fsprogs 软件包包含用于处理 ext2 文件系统的工具。它也支持 ext3 和 ext4 日志文件系统。

大概编译时间： 2.7 SBU
需要磁盘空间： 52 MB

6.28.1. 安装 E2fsprogs

首先，修复上游找到的一个潜在安全问题：

sed -e '/int.*old_desc_blocks/s/int/blk64_t/' \
    -e '/if (old_desc_blocks/s/super->s_first_meta_bg/desc_blocks/' \
    -i lib/ext2fs/closefs.c

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

这些变量启用之前在 5.33, “Util-linux-2.26” 构建的软件包编译 e2fsprogs。

--with-root-prefix="" 和 --bindir=/bin

有些程序（例如 e2fsck) 属于重要程序。比如，当 /usr 没有挂载的时候，仍然要求这些程序可用。它们放在类似 /lib 和 /sbin 的目录中。如果没有传递这个参数到 E2fsprogs 的配置参数中，程序就会被安装在 /usr 目录。

--enable-elf-shlibs

创建该软件包中一些程序会使用的共享库。

--disable-*

这会阻止 E2fsprogs 编译和安装 libuuid 和 libblkid 库、uuidd 守护进程、以及 fsck 封装包。因为 Util-Linux 安装了更新的版本。

编译软件包：

make

要设置和运行测试套件，我们首先需要把 /tools/lib 中的一些库链接到测试程序查找的位置。输入命令运行测试：

ln -sfv /tools/lib/lib{blk,uu}id.so.1 lib
make LD_LIBRARY_PATH=/tools/lib check

E2fsprogs 的其中一个测试程序会试图分配 256M 的内存。如果你没有比这更多的 RAM，确保为测试启用了足够的交换空间。阅读 2.3, “在分区上创建文件系统” 以及 2.4, “挂载新分区” 查看创建和启用交换空间的详细信息。

安装二进制文件、文档以及共享库：

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.28.2. E2fsprogs 软件包内容

安装的程序： badblocks, chattr, compile_et, debugfs, 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.ext4dev, resize2fs, 以及 tune2fs
安装的库： libcom_err.{a,so}, libe2p.{a,so}, libext2fs.{a,so}, libquota.a, 和 libss.{a,so}
安装目录： /usr/include/e2p, /usr/include/et, /usr/include/ext2fs, /usr/include/quota, /usr/include/ss, /usr/share/et, 和 /usr/share/ss

简要介绍

badblocks | 搜索设备（通常是一个磁盘分区）的坏块
chattr | 更改 ext2 文件系统中文件的属性；它也可以更改 ext3 文件系统，这是ext2 文件系统的日志版本
compile_et | 错误表编译器；它将错误代码名称和信息对照表转换为适用于 com_err 库的 C 源文件。
debugfs | 文件系统调试器；可用于检查和更改 ext2 文件系统的状态
dumpe2fs | 对指定设备上的文件系统打印超级块和块组信息
e2freefrag | 报告空闲空间的碎片信息
e2fsck | 用于检查或者修复 ext2 文件系统和 ext3 文件系统
e2image | 用于将重要 ext2 文件系统数据保存到文件中
e2label | 显示或更改指定设备上的 ext2 文件系统的标签
e2undo | 对设备上发现的 ext2/ext3/ext4 文件系统重做撤销日志 undo_log [ 这可用于取消一个 e2fsprogs 程序的失败操作。]
e4defrag | ext4 文件系统的在线碎片整理器
filefrag | 报告一个文件可能的碎片化程度
fsck.ext2 | 默认检查 ext2 文件系统，是到 e2fsck 的硬链接
fsck.ext3 | 默认检查 ext3 文件系统，是到 e2fsck 的硬链接
fsck.ext4 | 默认检查 ext4 文件系统，是到 e2fsck 的硬链接
fsck.ext4dev | 默认检查 ext4 开发版文件系统，是到 e2fsck 的硬链接
logsave | 在日志文件中保存命令的输出
lsattr | 列出二级扩展文件系统中一个文件的属性
mk_cmds | 将命令名称和帮助信息的映射表转换为适用于 libss 子系统库的 C 源文件
mke2fs | 在指定设备上创建 ext2 或 ext3 文件系统
mkfs.ext2 | 默认创建 ext2 文件系统，是到 mke2fs 的硬链接
mkfs.ext3 | 默认创建 ext3 文件系统，是到 mke2fs 的硬链接
mkfs.ext4 | 默认创建 ext4 文件系统，是到 mke2fs 的硬链接
mkfs.ext4dev | 默认创建 ext4 开发版文件系统，是到 mke2fs 的硬链接
mklost+found | 用于在 ext2 文件系统上创建 lost+found 目录，它可以预先为目录分配磁盘块，以减轻 e2fsck 任务
resize2fs | 用于伸缩 ext2 文件系统的大小
tune2fs | 调整 ext2 文件系统上的可调文件系统参数
libcom_err | 常用错误显示例程
libe2p | 用于 dumpe2fs, chattr, 以及 lsattr
libext2fs | 包含使用户层程序可以操作 ext2 文件系统的例程
libquota | 提供一个创建和更新限额文件和 ext4 超级块字段的接口
libss | 用于 debugfs
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Procps-ng-3.3.10

  • 下一页

    Coreutils-8.23


6.29. Coreutils-8.23

第六章 安装基本的系统软件

    E2fsprogs-1.42.12

  • 下一页

    Iana-Etc-2.30

  • 返回
  • 主页

6.29. Coreutils-8.23

Coreutils 软件包包含用于显示和设置基本系统特性的工具。

大概编译时间： 2.5 SBU
需要磁盘空间： 193 MB

6.29.1. 安装 Coreutils

POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别字符边界。下面的补丁修复这个不兼容性以及其它一些和国际化相关的 错误。之后确保 Makefile.in 文件的时间戳比其它所有文件都晚以免出现 make 错误：

patch -Np1 -i ../coreutils-8.23-i18n-1.patch
touch Makefile.in

注意

之前在这个补丁中发现了很多错误。当向 Coreutils 维护者报告新错误的时候，请先检查没有该补丁是否可以重现该错误。

现在准备编译 Coreutils：

FORCE_UNSAFE_CONFIGURE=1 ./configure \
            --prefix=/usr            \
            --enable-no-install-program=kill,uptime

配置选项的含义：

FORCE_UNSAFE_CONFIGURE=1

该环境变量允许以 root 用户权限编译软件包。

--enable-no-install-program=kill,uptime

该选项的目的是防止 Coreutils 安装其它软件包后面会安装的二进制包。

编译软件包：

make

如果不运行测试套件的话跳到 “安装软件包”

现在可以运行测试套件了。首先，运行需要以 root 用户运行的测试：

make NON_ROOT_USERNAME=nobody check-root

我们会以 nobody 用户运行剩下的测试。但是，一些测试要求用户属于多个组。由于不跳过这些测试，我们会添加一个临时的组并添加用户 nobody 作为它的成员：

echo "dummy:x:1000:nobody" >> /etc/group

修复一些权限问题以便非 root 用户可以编译和运行测试：

chown -Rv nobody .

现在运行测试。确保 su 环境中的 PATH 环境变量包含了 /tools/bin。

su nobody -s /bin/bash \
          -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"

已知在虚拟主控台中 stty-pairs 测试会失败，而在 X 终端中则能通过。

移除临时组：

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

BLFS 以及上游中的一些软件包希望如下的程序放在 /bin 中，确保把它们放到了那里：

mv -v /usr/bin/{head,sleep,nice,test,[} /bin

6.29.2. Coreutils 软件包内容

安装的程序： [, base64, basename, cat, chcon, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mktemp, mv, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, realpath, rm, rmdir, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sleep, sort, split, stat, stdbuf, stty, sum, sync, tac, tail, tee, test, timeout, touch, tr, true, truncate, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami, 以及 yes
安装的库： libstdbuf.so
安装目录： /usr/libexec/coreutils

简要介绍

base64 | 根据 base64（RFC3548）规范编码和解码数据
basename | 从文件名称中抽取路径和后缀
cat | 将文件连接到标准输出
chcon | 改变文件和目录的安全上下文
chgrp | 更改文件和目录的组所有者
chmod | 更改每个文件为指定模式的权限；模式可以是要实现更改的符号表示 或者表示新权限的十进制数字
chown | 更改文件和目录的用户和/或组所有者
chroot | 使用指定目录作为 / 目录运行命令
cksum | 输出指定文件的循环冗余检验（CRC）校验码和字节数目
comm | 比较两个排序后的文件，以三列输出不用的行和相同的行
cp | 复制文件
csplit | 将指定文件分割为几个新的文件，根据指定的模式或者行数分割并 输出每个新文件的字节数
cut | 根据指定的域或位置，选择输出行的组成
date | 根据指定格式显示当前时间，或设置系统日期
dd | 用给定的块大小和数目复制文件，同时可以进行一些转换
df | 报告所有挂载的文件系统中可用（和已用）磁盘空间，或只是 含有指定文件的文件系统
dir | 列出指定目的的内容（和 ls 命令相同）
dircolors | 输出设置 LS_COLOR 环境变量的命令，用于更改 ls 使用的颜色模式
dirname | 从一个文件名称中抽取非目录后缀
du | 报告当前目录使用的磁盘空间，根据指定的每个文件夹（包括子文件夹） 或每个指定的文件
echo | 显示给定的字符串
env | 在更改后的环境中运行命令
expand | 把 tab 键转换为空格
expr | 计算表达式
factor | 输出所有指定整数的质数因子
false | 什么都不做；总是以指示失败的状态码退出
fmt | 重新格式化给定文件中的段落
fold | 折叠指定文件的行
groups | 报告一个用户的组成员
head | 输出指定文件的前十行（或指定数目行数）
hostid | 报告主机的数字标识符（以十六进制）
id | 报告当前用户或指定用户的有效 用户 ID、组 ID 以及组成员
install | 复制文件的同时设置权限模式，如果可以的话包括用户和组
join | 从两个单独的文件中连接有相同域的行
link | 用指定的名称创建到一个文件的硬链接
ln | 在文件之间建立硬链接或软（符号）链接
logname | 报告当前用户的登录名
ls | 列出给定目录的内容
md5sum | 报告或检查消息摘要 5（MD5） 校验码
mkdir | 用指定的名称新建目录
mkfifo | 用指定的名称在 UNIX 中创建先进先出（FIFOs） 的 “命名管道”
mknod | 用指定的名称创建设备结点；设备结点是一个特殊字符文件、特殊块文件或先进先出
mktemp | 以安全方式新建临时文件；在脚本中使用
mv | 移动或重命名文件或目录
nice | 以更改后的调度优先级运行程序
nl | 标记指定文件的行号
nohup | 以不能被挂起方式运行命令，输出重定向到一个日志文件
nproc | 输出进程可用的处理单元数目
numfmt | 转换数字为人可读字符串或者相反
od | 以十进制或其他格式转储文件
paste | 合并指定文件，用 tab 字符分隔，以行并列方式连续合并
pathchk | 检查文件名是否可用
pinky | 轻量级的 finger 客户端；报告指定用户的信息
pr | 对文件进行分页分行用于打印
printenv | 输出环境
printf | 根据指定格式打印指定参数，类似于 C 语言的 printf 函数
ptx | 用文中的每个关键字，根据文件的内容中建立重排索引
pwd | 报告当前工作目录的名称
readlink | 报告指定符号链接的值
realpath | 打印解释后路径
rm | 删除文件或目录
rmdir | 如果目录为空则删除
runcon | 以指定安全上下文运行命令
seq | 用指定的范围和增长步长输出一序列数字
sha1sum | 打印或检查 160-bit 安全哈希算法1（SHA1） 校验码
sha224sum | 打印或检查 224-bit 安全哈希算法校验码
sha256sum | 打印或检查 256-bit 安全哈希算法校验码
sha384sum | 打印或检查 384-bit 安全哈希算法校验码
sha512sum | 打印或检查 512-bit 安全哈希算法校验码
shred | 用复杂形式多次重写指定文件，使得难以恢复其中的数据
shuf | 打乱文本行
sleep | 暂停指定时间
sort | 排序给定文件的行
split | 根据大小或行数分割文件为多个块
stat | 显示文件或文件系统状态
stdbuf | 用改变后的缓冲操作在标准流上运行命令
stty | 设置或报告终端行设置
sum | 打印指定文件的校验码和块数目
sync | 清空文件系统缓存；强制更改块到磁盘并更新超级块
tac | 反向输出给定文件
tail | 输出每个给定文件的最后十行（或给定数目的行）
tee | 从标准输入读入并写出到标准输出和指定文件
test | 比较值并检查文件类型
timeout | 有限时间内运行命令
touch | 更改文件时间戳，设置指定文件的访问和修改时间为当前时间； 如果文件不存在则创建空文件
tr | 从标准输入转换、压缩并删除指定字符
true | 不做任何事情，总是成功；总是以表示成功的状态码退出
truncate | 压缩或扩展文件到特定大小
tsort | 进行拓扑排序；根据指定文件的部分排序写出完全有序列表
tty | 报告链接到标准输入的终端文件名称
uname | 报告系统信息
unexpand | 转换空格为 tab 键
uniq | 忽略所有除非出现连续相同的行
unlink | 移除指定文件
users | 报告当前登录的用户名
vdir | 和 ls -l 相同
wc | 报告给定文件的行数、单词数和字节数，以及给定多个文件时总的行数
who | 报告谁登录了
whoami | 报告和当前有效用户 ID 关联的用户名
yes | 重复输出 “y” 或指定的字符串直到被杀死
libstdbuf | stdbuf 使用的库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    E2fsprogs-1.42.12

  • 下一页

    Iana-Etc-2.30


6.30. Iana-Etc-2.30

第六章 安装基本的系统软件

    Coreutils-8.23

  • 下一页

    M4-1.4.17

  • 返回
  • 主页

6.30. Iana-Etc-2.30

Iana-Etc 软件包为网络服务和协议提供数据。

大概编译时间： 低于 0.1 SBU
需要磁盘空间： 3.0 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 | 描述 TCP/IP 子系统中可用的多种 DARPA 网络协议
/etc/services | 提供友好文本名称和背后分配的端口号以及协议类型之间的映射
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Coreutils-8.23

  • 下一页

    M4-1.4.17


6.31. M4-1.4.17

第六章 安装基本的系统软件

    Iana-Etc-2.30

  • 下一页

    Flex-2.5.39

  • 返回
  • 主页

6.31. M4-1.4.17

M4 软件包包含一个宏处理器。

大概编译时间： 0.4 SBU
需要磁盘空间： 31 MB

6.31.1. 安装 M4

准备编译 M4：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.31.2. M4 软件包内容

安装的程序： m4

简要介绍

m4

复制给定的文件并扩展其中包括的宏[这些宏或者是内建的或是 用户定义的，可以有任何数目的参数。除了进行宏扩展，m4 还有用于包含命名文件、运行 Unix 命令、进行整数运算、操作文本、 递归等内建函数。m4 程序可以作为一个编译器的前端，也可以作为一个宏处理器使用。]

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Iana-Etc-2.30

  • 下一页

    Flex-2.5.39


6.32. Flex-2.5.39

第六章 安装基本的系统软件

    M4-1.4.17

  • 下一页

    Bison-3.0.4

  • 返回
  • 主页

6.32. Flex-2.5.39

Flex 软件包包括一个用于生成识别文本模式的程序的工具。

大概编译时间： 0.3 SBU
需要磁盘空间： 38 MB

6.32.1. 安装 Flex

首先，跳过需要 Bison 的三个回归测试：

sed -i -e '/test-bison/d' tests/Makefile.in

准备编译 Flex：

./configure --prefix=/usr --docdir=/usr/share/doc/flex-2.5.39

编译软件包：

make

用以下命令测试结果（大约 0.5 SBU）：

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.{a,so} 和 libfl_pic.{a,so}
安装目录： /usr/share/doc/flex-2.5.39

简要介绍

flex | 一个用于生成能识别文本模式程序的工具；它允许指定多种用于模式发现的规则，从而消除了开发专门程序的需要
flex++ | flex 的扩展，用于生成 C++ 代码和类。是到flex 的符号链接
lex | 一个以 lex 仿真模式运行 flex 的脚本
libfl | flex 库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    M4-1.4.17

  • 下一页

    Bison-3.0.4


6.33. Bison-3.0.4

第六章 安装基本的系统软件

    Flex-2.5.39

  • 下一页

    Grep-2.21

  • 返回
  • 主页

6.33. Bison-3.0.4

Bison 软件包包含一个语法生成器。

大概编译时间： 2.3 SBU
需要磁盘空间： 40 MB

6.33.1. 安装 Bison

准备编译 Bison：

./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.0.4

编译软件包：

make

用以下命令测试结果（大约 0.5 SBU）：

make check

安装软件包：

make install

6.33.2. Bison 软件包内容

安装的程序： bison 和 yacc
安装的库： liby.a
安装目录： /usr/share/bison

简要介绍

bison | 根据一系列规则生成用于分析文本结构的程序；Bison 是 Yacc（Yet Another Compiler Compiler） 的替代品。
yacc | bison 的封装，用于仍然调用 yacc 而不是 bison 的程序；它用 -y 选项调用 bison
liby | Yacc 库包含和 Yacc 兼容的 yyerror 和 main 程序的实现；这个库并不是很有用，但是 POSIX 要求有它
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Flex-2.5.39

  • 下一页

    Grep-2.21


6.34. Grep-2.21

第六章 安装基本的系统软件

    Bison-3.0.4

  • 下一页

    Readline-6.3

  • 返回
  • 主页

6.34. Grep-2.21

Grep 软件包包含用于在文件中搜索的程序。

大概编译时间： 0.4 SBU
需要磁盘空间： 30 MB

6.34.1. 安装 Grep

首先修复上游标记的潜在安全问题：

sed -i -e '/tp++/a  if (ep <= tp) break;' src/kwset.c

准备编译 Grep ：

./configure --prefix=/usr --bindir=/bin

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.34.2. Grep 软件包内容

安装的程序： egrep, fgrep, 和 grep

简要介绍

egrep | 打印匹配扩展正则表达式的行
fgrep | 打印匹配固定字符串列表的行
grep | 打印匹配基本正则表达式的行
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Bison-3.0.4

  • 下一页

    Readline-6.3


6.35. Readline-6.3

第六章 安装基本的系统软件

    Grep-2.21

  • 下一页

    Bash-4.3.30

  • 返回
  • 主页

6.35. Readline-6.3

Readline 软件包是提供命令行编辑和历史功能的库的集合。

大概编译时间： 0.1 SBU
需要磁盘空间： 24 MB

6.35.1. 安装 Readline

首先安装补丁修复一些上游标记的 bug：

patch -Np1 -i ../readline-6.3-upstream_fixes-3.patch

重装 Readline 会使旧的库移动到 <libraryname>.old。通常来说这并不是什么问题，但一些情况下可能引起 ldconfig 链接错误。可以通过下面的两个 sed 命令避免这个问题：

sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install

准备编译 Readline：

./configure --prefix=/usr --docdir=/usr/share/doc/readline-6.3

编译软件包：

make SHLIB_LIBS=-lncurses

make 选项的含义：

SHLIB_LIBS=-lncurses

该选项强制 Readline 链接到 libncurses (实际上是 libncursesw) 库。

该软件包没有测试套件。

安装软件包：

make SHLIB_LIBS=-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-6.3

6.35.2. Readline 软件包内容

安装的库： libhistory.{a,so} 和 libreadline.{a,so}
安装目录： /usr/include/readline, /usr/share/readline, 和 /usr/share/doc/readline-6.3

简要介绍

libhistory | 为重新查看历史行提供一致的用户界面
libreadline | 在多种需要提供命令行接口的程序之间保持用户接口一致性
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Grep-2.21

  • 下一页

    Bash-4.3.30


6.36. Bash-4.3.30

第六章 安装基本的系统软件

    Readline-6.3

  • 下一页

    Bc-1.06.95

  • 返回
  • 主页

6.36. Bash-4.3.30

Bash 软件包包含 Bourne-Again Shell。

大概编译时间： 1.9 SBU
需要磁盘空间： 57 MB

6.36.1. 安装 Bash

首先，安装下面的补丁修复上游解决的一些 bug：

patch -Np1 -i ../bash-4.3.30-upstream_fixes-1.patch

准备编译 Bash：

./configure --prefix=/usr                       \
            --bindir=/bin                       \
            --docdir=/usr/share/doc/bash-4.3.30 \
            --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"

安装软件包：

make install

运行新编译的 bash 程序（替换正在运行的那个）：

exec /bin/bash --login +h

注意

参数使 bash 进程成为一个可交互的登录 shell 并停用散列使得新程序可用的时候就能发现。

6.36.2. Bash 软件包内容

安装的程序： bash, bashbug, 和 sh （链接到 bash）
安装目录： /usr/share/doc/bash-4.3.30

简要介绍

bash | 广泛使用的命令解释器；在执行一个命令之前进行多种扩展和替换，使得该解释器成为一个强大的工具
bashbug | 一个 shell 脚本，用于帮助用户撰写和发送标准格式的关于 bash 的 bug 报告邮件
sh | 到 bash 程序的符号链接；当以 sh 调用时，在符合 POSIX 标准的情况下，bash 尽可能地模仿历史版本的启动过程
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Readline-6.3

  • 下一页

    Bc-1.06.95


6.37. Bc-1.06.95

第六章 安装基本的系统软件

    Bash-4.3.30

  • 下一页

    Libtool-2.4.6

  • 返回
  • 主页

6.37. Bc-1.06.95

Bc 软件包包括一个任意精度数值处理的语言。

大概编译时间： 0.1 SBU
需要磁盘空间： 4.0 MB

6.37.1. 安装 Bc

首先，修复代码中一些会造成内存泄露的小问题：

patch -Np1 -i ../bc-1.06.95-memory_leak-1.patch

准备编译 Bc：

./configure --prefix=/usr           \
            --with-readline         \
            --mandir=/usr/share/man \
            --infodir=/usr/share/info

配置选项的含义：

--with-readline

该选项告诉 Bc 使用系统中已经安装的 readline 库而不是使用自带的 readline 版本。

编译软件包：

make

运行下面的命令来测试 bc。这会输出好多内容，因此你可能希望重定向到一个文件。测试中会有很小的比例(10 of 12,144)说最后一位数字有舍入误差。

echo "quit" | ./bc/bc -l Test/checklib.b

安装软件包：

make install

6.37.2. Bc 软件包内容

安装的程序 bc 和 dc

简要介绍

bc | 一个命令行计算器
dc | 逆波兰命令行计算器
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Bash-4.3.30

  • 下一页

    Libtool-2.4.6


6.38. Libtool-2.4.6

第六章 安装基本的系统软件

    Bc-1.06.95

  • 下一页

    GDBM-1.11

  • 返回
  • 主页

6.38. Libtool-2.4.6

Libtool 软件包包含 GNU 通用库支持脚本。它用一致的、可移植的接口封装复杂的共享库。

大概编译时间： 2.0 SBU
需要磁盘空间： 48 MB

6.38.1. 安装 Libtool

准备编译 Libtool：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果(大约 11.0 SBU)：

make check

在 LFS 构建环境中已知有 5 个测试由于循环依赖会失败，但如果安装完 automake 之后重新检查，所有测试就都能通过。

安装软件包：

make install

6.38.2. Libtool 软件包内容

安装的程序： libtool 和 libtoolize
安装的库： libltdl.{a,so}
安装目录： /usr/include/libltdl 和 /usr/share/libtool

简要介绍

libtool | 提供通用库编译支持服务
libtoolize | 提供添加 libtool 支持到软件包的一个标准方法
libltdl | 隐藏 dlopening 库的各种困难
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Bc-1.06.95

  • 下一页

    GDBM-1.11


6.39. GDBM-1.11

第六章 安装基本的系统软件

    Libtool-2.4.6

  • 下一页

    Expat-2.1.0

  • 返回
  • 主页

6.39. GDBM-1.11

GDBM 软件包包含 GNU 数据库管理器。是使用扩展散列，工作方法和标准 UNIX dbm 类似的数据库函数库。该库提供存储键/数据对、通过键搜索和检索数据、以及删除键和数据的原语。

大概编译时间： 0.1 SBU
需要磁盘空间： 12.6 MB

6.39.1. 安装 GDBM

准备编译 GDBM：

./configure --prefix=/usr --enable-libgdbm-compat

配置选项的含义：

--enable-libgdbm-compat

该选项启用编译 libgdbm 兼容性库，因为一些 LFS 之外的软件包可能需要它提供的旧的 DBM 例程。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.39.2. GDBM 软件包内容

安装的程序 gdbm_dump, gdbm_load, 和 gdbmtool
安装的库 libgdbm.{a,so} 和 libgdbm_compat.{a,so}

简要介绍

gdbm_dump | 转储 GDBM 数据库到文件
gdbm_load | 从转储文件重建一个 GDBM 数据库
gdbmtool | 测试和更改 GDBM 数据库
libgdbm | 包含操作散列数据库的函数
libgdbm_compat | 包含旧的 DBM 函数的兼容性库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Libtool-2.4.6

  • 下一页

    Expat-2.1.0


6.40. Expat-2.1.0

第六章 安装基本的系统软件

    GDBM-1.11

  • 下一页

    Inetutils-1.9.2

  • 返回
  • 主页

6.40. Expat-2.1.0

Expat 软件包包含一个用于解析 XML 的面向流的 C 库。

大概编译时间： 0.1 SBU
需要磁盘空间： 11 MB

6.40.1. 安装 Expat

准备编译 Expat：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

如果需要的话，安装帮助文档：

install -v -dm755 /usr/share/doc/expat-2.1.0
install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.1.0

6.40.2. Expat 软件包内容

安装的程序： xmlwf
安装的库 libexpat.{a,so}
安装目录： /usr/share/doc/expat-2.1.0

简要介绍

xmlwf | 用于检查 XML 文档是否格式良好的非验证工具
libexpat | 包含用于解析 XML 的 API 函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    GDBM-1.11

  • 下一页

    Inetutils-1.9.2


6.41. Inetutils-1.9.2

第六章 安装基本的系统软件

    Expat-2.1.0

  • 下一页

    Perl-5.20.2

  • 返回
  • 主页

6.41. Inetutils-1.9.2

Inetutils 软件包包含基本的网络程序。

大概编译时间： 0.4 SBU
需要磁盘空间： 34 MB

6.41.1. 安装 Inetutils

创建一个定义使 ifconfig 程序能正确编译：

echo '#define PATH_PROCNET_DEV "/proc/net/dev"' >> ifconfig/system/linux.h

准备编译 Inetutils：

./configure --prefix=/usr        \
            --localstatedir=/var \
            --disable-logger     \
            --disable-whois      \
            --disable-servers

配置选项的含义：

--disable-logger

该选项防止 Inetutils 安装 logger 程序，脚本使用该程序传递消息到系统日志守护进程。因为 Util-linux 安装了一个更新版本因此不能安装这个。

--disable-whois

该选项禁用编译过时的 Inetutils whois 客户端。BLFS 指南中有更好的 whois 客户端说明。

--disable-servers

禁用安装作为 Inetutils 软件包一部分的多种网络服务程序。这些服务程序被认为不适用于基础的 LFS 系统。一些本来就不安全，只在可信网络中才认为安全。注意这些服务程序有更好的可用替代品。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

移动一些程序使得 /usr 不可访问时仍保持可用：

mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
mv -v /usr/bin/ifconfig /sbin

6.41.2. Inetutils 软件包内容

安装的程序： ftp, ifconfig, hostname, ping, ping6, rcp, rexec, rlogin, rsh, talk, telnet, tftp, 和 traceroute

简要介绍

ftp | 文件传输协议程序
ifconfig | 管理网络接口
hostname | 报告或设置主机名称
ping | 发送请求应答包并报告响应用时
ping6 | 用于 IPv6 网络的 ping 版本
rcp | 进行远程文件复制
rexec | 在远程主机运行命令
rlogin | 进行远程登录
rsh | 运行远程 shell
talk | 用于和另一个用户交互
telnet | TELNET 协议接口
tftp | 简单文件传输程序
traceroute | 跟踪从你的工作主机发送到另一个网络上的主机的数据包通过的路径，显示中间通过的跳（网关）。
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Expat-2.1.0

  • 下一页

    Perl-5.20.2


6.42. Perl-5.20.2

第六章 安装基本的系统软件

    Inetutils-1.9.2

  • 下一页

    XML::Parser-2.44

  • 返回
  • 主页

6.42. Perl-5.20.2

Perl 软件包包含实用信息抽取与报告语言。

大概编译时间： 6.5 SBU
需要磁盘空间： 301 MB

6.42.1. 安装 Perl

首先创建其中一个 Perl 配置文件和可选测试套件引用的基本 /etc/hosts 文件：

echo "127.0.0.1 localhost $(hostname)" > /etc/hosts

该版本的 Perl 会编译 Compress::Raw::Zlib 和 Compress::Raw::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

配置选项的含义：

-Dvendorprefix=/usr

这确保 perl 知道如何通知软件包它们应该在哪里安装它们的 perl 模块。

-Dpager="/usr/bin/less -isR"

这确保使用 less 而不是 more。

-Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3

由于 Groff 还没有安装，Configure 会认为我们不希望为 Perl 安装 man 手册。用这些参数重写该决策。

-Duseshrplib

编译某些 perl 模块需要的共享 libperl。

编译软件包：

make

用以下命令测试结果（大概 2.5 SBU）：

make -k test

安装软件包并清理：

make install
unset BUILD_ZLIB BUILD_BZIP2

6.42.2. Perl 软件包内容

安装的程序： a2p, c2ph, config_data, corelist, cpan, cpan2dist, cpanp, cpanp-run-perl, enc2xs, find2perl, h2ph, h2xs, instmodsh, json_pp, libnetcfg, perl, perl5.20.2 （链接到 perl）, perlbug, perldoc, perlivp, perlthanks （链接到 perlbug）, piconv, pl2pm, pod2html, pod2latex, pod2man, pod2text, pod2usage, podchecker, podselect, prove, psed （链接到 s2p）, pstruct （链接到 c2ph）, ptar, ptardiff, ptargrep, s2p, shasum, splain, xsubpp, 和 zipdetails
安装的库： 几百个，不能在这完整列出
安装目录： /usr/lib/perl5

简要介绍

a2p | 转换 awk 到 Perl
c2ph | 转储正如 cc -g -S 生成的 C 结构体
config_data | Perl 模块查询或更改配置
corelist | Module::CoreList 的命令行前端
cpan | 用命令行与综合 Perl 归档网络（Comprehensive Perl Archive Network,CPAN）交互
cpan2dist | CPANPLUS 发行构建器
cpanp | CPANPLUS 启动器
cpanp-run-perl | 用于启用输出进程每次写后清空输出缓冲的 Perl 脚本
enc2xs | 从 Unicode 字符映射或 Tcl 编码文件为 Encode 模块编译 Perl 扩展
find2perl | 转换 find 命令到 Perl
h2ph | 转换 .h C 头文件为 .ph Perl 头文件
h2xs | 转换 .h C 头文件为 Perl 扩展
instmodsh | 用于检查安装的 Perl 模块的 shell 脚本，甚至能从一个安装的模块中创建 tar 包
json_pp | 在特定输入输出格式之间转换数据
libnetcfg | 可用于配置 libnet Perl 模块
perl | 将 C,sed,awk 以及 sh 一些最好的特性结合到一个单一的强大语言
perl5.20.2 | 到 perl 的硬链接
perlbug | 用于生成关于 Perl、或者一起发布的模块的 bug 报告，并用邮件通知
perldoc | 用嵌入到 Perl 安装目录或 Perl 脚本中的 pod 格式显示文档
perlivp | Perl安装验证程序；能用于验证 Perl 和它的库是否正确安装
perlthanks | 用于生成发送到 Perl 开发者的感谢邮件
piconv | Perl 版本的字符编码转换程序 iconv
pl2pm | 用于将 Perl4 .pl 文件转换为 Perl5 .pm 模块的工具
pod2html | 将文件从 pod 格式转换为 HTML 格式
pod2latex | 将文件从 pod 格式转换为 LaTeX 格式
pod2man | 将 pod 格式数据转换为格式化的 *roff 输入
pod2text | 将 pod 数据转换为格式化的 ASCII 文本
pod2usage | 从文件中嵌入的 pod 文档显示使用信息
podchecker | 检查 pod 格式的文档文件语法
podselect | 显示 pod 文档选中的章节
prove | 运行对 Test::Harness 模块测试的命令行工具
psed | Perl 版本的流编辑器 sed
pstruct | 转储正如 cc -g -S 生成的 C 结构体
ptar | 用 Perl 写的类似 tar 的程序
ptardiff | 用于比较提取的文档和未提取的 Perl 程序
ptargrep | 用于对 tar 归档文件中的内容进行模式匹配的 Perl 程序
s2p | 转换 sed 脚本到 Perl
shasum | 打印或检查 SHA 校验码
splain | 用于 Perl 中的强制冗长警告诊断
xsubpp | 转换 Perl XS 代码为 C 代码
zipdetails | 显示 Zip 文件内部结构的详细信息
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Inetutils-1.9.2

  • 下一页

    XML::Parser-2.44


6.43. XML::Parser-2.44

第六章 安装基本的系统软件

    Perl-5.20.2

  • 下一页

    Autoconf-2.69

  • 返回
  • 主页

6.43. XML::Parser-2.44

XML::Parser 模块是到 James Clark 的 XML 解析器的 Perl Expat 接口。

大概编译时间： 少于 0.1 SBU
需要磁盘空间： 2.4 MB

6.43.1. 安装 XML::Parser

准备编译 XML::Parser：

perl Makefile.PL

编译软件包：

make

用以下命令测试结果：

make test

安装软件包：

make install

6.43.2. XML::Parser 软件包内容

安装的模块： Expat.so

简要介绍

Expat

提供 Perl Expat 接口

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Perl-5.20.2

  • 下一页

    Autoconf-2.69


6.44. Autoconf-2.69

第六章 安装基本的系统软件

    XML::Parser-2.44

  • 下一页

    Automake-1.15

  • 返回
  • 主页

6.44. Autoconf-2.69

Autoconf 软件包包含用于生成自动配置源代码的 shell 脚本的程序。

大概编译时间： 3.6 SBU
需要磁盘空间： 20 MB

6.44.1. 安装 Autoconf

准备编译 Autoconf：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

这需要很长一段时间，大概 4.7 SBUs。另外，跳过了需要 Automake 的 6 个测试。为了全面测试，Automake 安装完成后可以重新测试 Autoconf。另外，由于 libtool-2.4.3 及之后版本的变化，一个测试失败了。

安装软件包：

make install

6.44.2. Autoconf 软件包内容

安装的程序： autoconf, autoheader, autom4te, autoreconf, autoscan, autoupdate, 和 ifnames
安装目录： /usr/share/autoconf

简要介绍

autoconf | 生成能为多种类 Unix 系统自动配置软件源码包的 shell 脚本；它生成的配置脚本是独立的—运行脚本不需要 autoconf 程序
autoheader | 一个能生成给配置脚本使用的 C #define 语句模板文件的工具
autom4te | M4 宏处理器的封装
autoreconf | 对 autoconf 和 automake 模板文件作了更改后能以正确顺序自动运行 autoconf, autoheader, aclocal, automake, gettextize, 以及 libtoolize 以节省时间
autoscan | 为软件包帮助生成 configure.in 文件；它检查目录树中的源文件，查找常见移植问题，生成作为软件包的初步 configure.in 文件的 configure.scan 文件
autoupdate | 更改 configure.in 文件，仍然通过旧名称调用 autoconf 宏来使用当前宏名称
ifnames | 帮助为软件包写 configure.in 文件；打印软件包在 C 预处理器中使用的标识符[如果已经设置软件包具有某些可移植性， 该程序能帮助决定需要检查哪些 configure。还能填充 autoscan 生成的 configure.in 文件中的空格。]
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    XML::Parser-2.44

  • 下一页

    Automake-1.15


6.45. Automake-1.15

第六章 安装基本的系统软件

    Autoconf-2.69

  • 下一页

    Diffutils-3.3

  • 返回
  • 主页

6.45. Automake-1.15

软件包包含了生成可与 Autoconf 一同使用的 Makefile 的程序。

大概编译时间： 小于 0.1 SBU （加上测试大概有 8.4 SBU）
所需磁盘空间： 109 MB

6.45.1. Automake 的安装

准备编译 Automake：

./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.15

编译软件包：

make

有些测试会错误的链接到 flex 库的错误版本，所以我们暂时先解决这个问题。还有，由于每个单独的测试之间会有延迟，即使是在只有一个处理器的系统上也要使用 -j4 编译选项提高测试的速度。用以下命令测试结果：

sed -i "s:./configure:LEXLIB=/usr/lib/libfl.a &:" t/lex-{clean,depend}-cxx.sh
make -j4 check

安装软件包：

make install

6.45.2. 关于 Automake 软件包内容

安装的程序： aclocal, aclocal-1.15, automake, automake-1.15, compile, config.guess, config.sub, depcomp, install-sh, mdate-sh, missing, mkinstalldirs, py-compile, 和 ylwrap
安装的目录： /usr/share/aclocal-1.15, /usr/share/automake-1.15, 和 /usr/share/doc/automake-1.15

简要介绍

aclocal | 基于 configure.in 文件的内容生成 aclocal.m4 文件
aclocal-1.15 | 到 aclocal 的硬链接
automake | 一个从 Makefile.am 文件自动生成 Makefile.in 文件的工具 [要生成一个软件包里所有的 Makefile.in 文件，在最上层的目录运行这个程序。 通过扫描 configure.in 文件，它能自动找到每个对应的 Makefile.am 文件， 并生成对应的 Makefile.in 文件。]
automake-1.15 | 到 automake 的硬链接
compile | 包含了一些编译器
config.guess | 试图估计已给出的构建、宿主或目标的结构的三段式命名的脚本
config.sub | 一个配置确认子程序脚本
depcomp | 一个在编译程序时除了输出必要信息还生成依赖信息的脚本
install-sh | 一个安装程序、脚本或数据文件的脚本
mdate-sh | 一个打印文件或目录被修改时间的脚本
missing | 一个在安装过程中表现为丢失 GNU 程序通用的存根的脚本
mkinstalldirs | 一个创建目录树的脚本
py-compile | 编译一个 Python 程序
ylwrap | 包含lex 和 yacc
翻译团队：LCTT 译者/校对：H-mudcup/ictlyh
  • 上一页

    Autoconf-2.69

  • 下一页

    Diffutils-3.3


6.46. Diffutils-3.3

第六章 安装基本的系统软件

    Automake-1.15

  • 下一页

    Gawk-4.1.1

  • 返回
  • 主页

6.46. Diffutils-3.3

Diffutils 软件包包含显示文件和目录差异的程序。

大概编译时间： 0.4 SBU
需要磁盘空间： 30 MB

6.46.1. 安装 Diffutils

首先修复文件安装区域文件：

sed -i 's:= @mkdir_p@:= /bin/mkdir -p:' po/Makefile.in.in

准备编译 Diffutils：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.46.2. Diffutils 软件包内容

安装的程序： cmp, diff, diff3, 和 sdiff

简要介绍

cmp | 比较两个文件并报告字节差异
diff | 比较两个文件或目录并报告文件中的行差异
diff3 | 逐行比较三个文件
sdiff | 比较两个文件并交互式输出结果
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Automake-1.15

  • 下一页

    Gawk-4.1.1


6.47. Gawk-4.1.1

第六章 安装基本的系统软件

    Diffutils-3.3

  • 下一页

    Findutils-4.4.2

  • 返回
  • 主页

6.47. Gawk-4.1.1

Gawk 软件包包含用于操作文本文件的程序。

大概编译时间： 0.3 SBU
需要磁盘空间： 39 MB

6.47.1. 安装 Gawk

准备编译 Gawk：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

如果需要的话，安装帮助文档：

mkdir -v /usr/share/doc/gawk-4.1.1
cp    -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.1

6.47.2. Gawk 软件包内容

安装的程序： awk（链接到 gawk）, gawk, gawk-4.1.1, 和 igawk
安装的库： filefuncs.so, fnmatch.so, fork.so, inplace.so, ordchr.so, readdir.so, readfile.so, revoutput.so, revtwoway.so, rwarray.so, testext.so, 和 time.so
安装目录 /usr/lib/gawk, /usr/libexec/awk, /usr/share/awk, 和 /usr/share/doc/gawk-4.1.1

简要介绍

awk | 到 gawk 的链接
gawk | 用于操作文本文件的程序；awk 的 GNU 实现
gawk-4.1.1 | 到 gawk 的硬链接
igawk | 使 gawk 具有包含文件的能力
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Diffutils-3.3

  • 下一页

    Findutils-4.4.2


6.48. Findutils-4.4.2

第六章 安装基本的系统软件

    Gawk-4.1.1

  • 下一页

    Gettext-0.19.4

  • 返回
  • 主页

6.48. Findutils-4.4.2

Findutils 软件包包含查找文件的程序。这些程序提供递归搜索目录树、创建、管理以及搜索数据库（通常比递归式的 find 要快，但如果数据库最近没有更新的话结果不可靠）。

大概编译时间： 0.4 SBU
需要磁盘空间： 32 MB

6.48.1. 安装 Findutils

准备编译 Findutils：

./configure --prefix=/usr --localstatedir=/var/lib/locate

配置选项的含义：

--localstatedir

该选项改变 区域 数据库的位置为 FHS 兼容的 /var/lib/locate。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

一些 BLFS 及之上的软件包希望 find 程序在 /bin，因此确保位置正确：

mv -v /usr/bin/find /bin
sed -i 's|find:=${BINDIR}|find:=/bin|' /usr/bin/updatedb

6.48.2. Findutils 软件包内容

安装的程序： bigram, code, find, frcode, locate, oldfind, updatedb, 和 xargs

简要介绍

bigram | 之前用于生成 区域 数据库
code | 之前用于生成 区域 数据库； 是 frcode 的祖先版本
find | 查找指定目录树中匹配特定要求的文件
frcode | updatedb 调用来压缩文件名称列表； 它使用前向压缩，能压缩数据库为原来的四分之一到五分之一
locate | 搜索文件名称数据库并报告包含给定字符串或匹配给定模式的文件名称
oldfind | 老版本的 find，使用一个不同的算法
updatedb | 更新 区域 数据库； 它搜索整个文件系统（包括已挂载的其它文件系统，除非指定排除） 并把找到的每个文件名插入到数据库
xargs | 对一系列文件运行给定命令
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Gawk-4.1.1

  • 下一页

    Gettext-0.19.4


6.49. Gettext-0.19.4

第六章 安装基本的系统软件

    Findutils-4.4.2

  • 下一页

    Intltool-0.50.2

  • 返回
  • 主页

6.49. Gettext-0.19.4

Gettext 软件包包含用于国际化和地区化的工具。这允许用 NLS（Native Language Support,本地语言支持） 编译程序，使得能以用户的本地语言输出信息。

大概编译时间： 4.9 SBU
需要磁盘空间： 229 MB

6.49.1. 安装 Gettext

准备编译 Gettext：

./configure --prefix=/usr --docdir=/usr/share/doc/gettext-0.19.4

编译软件包：

make

用以下命令测试结果（需要较长一段时间，大概 3 SBUs）：

make check

安装软件包：

make install

6.49.2. Gettext 软件包内容

安装的程序： autopoint, config.charset, config.rpath, envsubst, gettext, gettext.sh, gettextize, hostname, msgattrib, msgcat, msgcmp, msgcomm, msgconv, msgen, msgexec, msgfilter, msgfmt, msggrep, msginit, msgmerge, msgunfmt, msguniq, ngettext, recode-sr-latin, 和 xgettext
安装的库： libasprintf.{a,so}, libgettextlib.so, libgettextpo.{a,so}, libgettextsrc.so, 和 preloadable_libintl.so
安装目录： /usr/lib/gettext, /usr/share/doc/gettext-0.19.4, 和 /usr/share/gettext

简要介绍

autopoint | 复制标准 Gettext 基础文件到源码包
config.charset | 输出系统依赖的字符编码别名表
config.rpath | 输出系统依赖的变量集、变量描述了如何在可执行文件运行时设置共享库的搜索路径
envsubst | shell 格式字符串的替代环境变量
gettext | 通过查看信息目录中的转换将原来语言信息转换为用户语言
gettext.sh | 主要作为 gettext 的一个 shell 函数库
gettextize | 复制所有标准 Gettext 文件到指定软件包的顶层目录以开始国际化
hostname | 以多种形式显示网络主机名称
msgattrib | 根据属性过滤翻译目录的信息并操作属性
msgcat | 连接和合并给定 .po 文件
msgcmp | 比较两个 .po 文件以检查两者是否包含相同的 msgid 字符串集合
msgcomm | 查找给定 .po 文件共同的信息
msgconv | 转换翻译目录到不同的字符编码
msgen | 创建一个英语翻译目录
msgexec | 对翻译目录的所有翻译运行命令
msgfilter | 对翻译目录的所有翻译应用过滤器
msgfmt | 从翻译目录生成一个二进制信息目录
msggrep | 从翻译目录中抽取所有符合指定模式或属于特定源文件的信息
msginit | 创建一个新的 .po 文件，根据用户环境中的值初始化元信息
msgmerge | 合并两个原译到一个单独的文件
msgunfmt | 反向编译一个二进制信息目录为原译文本
msguniq | 统一重复翻译为一个翻译目录
ngettext | 显示语法形式取决于多种母语翻译的文本信息的本地语言翻译
recode-sr-latin | 对 Serbian 文本从 Cyrillic 重新编码为 Latin 脚本
xgettext | 从指定源文件中抽取可翻译信息行用于生成第一个翻译模板
libasprintf | 定义 autosprintf 类，该类使 C 格式化输出在 C++程序中能和 <string> 字符串以及 <iostream> 流一起使用
libgettextlib | 包括多种 Gettext 程序使用的常用例程的私有库；并不用于一般用途
libgettextpo | 用来写处理 .po 文件的特殊程序；当 Gettext 附带的标准应用（例如 msgcomm, msgcmp, msgattrib, 以及 msgen）不足够时会使用这个库
libgettextsrc | 包括多种 Gettext 程序使用的常用例程的私有库；并不用于一般用途
preloadable_libintl | LD_PRELOAD 帮助 libintl 记录未翻译信息时使用的库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Findutils-4.4.2

  • 下一页

    Intltool-0.50.2


6.50. Intltool-0.50.2

第六章 安装基本的系统软件

    Gettext-0.19.4

  • 下一页

    Gperf-3.0.4

  • 返回
  • 主页

6.50. Intltool-0.50.2

Intltool 是一个用于从源文件中抽取可翻译字符串的国际化工具。

大概编译时间： 少于 0.1 SBU
需要磁盘空间： 1.3 MB

6.50.1. 安装 Intltool

准备编译 Intltool：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.50.2/I18N-HOWTO

6.50.2. Intltool 软件包内容

安装的程序 intltool-extract, intltool-merge, intltool-prepare, intltool-update, 和 intltoolize
安装目录： /usr/share/doc/intltool-0.50.2 和 /usr/share/intltool

简要介绍

intltoolize | 准备使用 intltool 的软件包
intltool-extract | 生成 gettext 能读取的头文件
intltool-merge | 合并翻译后的字符串到多种文件格式
intltool-prepare | 更新 pot 文件并把它们和翻译文件合并
intltool-update | 更新 po 模板文件并把它们和翻译文件合并
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Gettext-0.19.4

  • 下一页

    Gperf-3.0.4


6.51. Gperf-3.0.4

第六章 安装基本的系统软件

    Intltool-0.50.2

  • 下一页

    Groff-1.22.3

  • 返回
  • 主页

6.51. Gperf-3.0.4

Gperf 为键集合生成完美的哈希函数。

大概编译时间： 少于 0.1 SBU
需要磁盘空间： 6.0 MB

6.51.1. 安装 Gperf

准备编译 Gperf：

./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.0.4

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.51.2. Gperf 软件包内容

安装的程序： gperf

简要介绍

gperf

为键集合生成完美哈希

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Intltool-0.50.2

  • 下一页

    Groff-1.22.3


6.52. Groff-1.22.3

第六章 安装基本的系统软件

    Gperf-3.0.4

  • 下一页

    Xz-5.2.0

  • 返回
  • 主页

6.52. Groff-1.22.3

Groff 软件包包含用于处理和格式化文本的程序。

大概编译时间： 0.5 SBU
需要磁盘空间： 111 MB

6.52.1. 安装 Groff

Groff 希望环境变量 PAGE 包含默认的页面大小，对于美国的用户，为 PAGE=letter，对于其它地方，PAGE=A4 更合适。尽管在编译的时候配置了默认页面大小，后面通过 echo “A4” 或 “letter” 到 /etc/papersize 文件仍然可以修改。

准备编译 Groff：

PAGE=<paper_size> ./configure --prefix=/usr

编译软件包：

make

该软件包没有测试套具。

安装软件包：

make install

6.52.2. Groff 软件包内容

安装的程序： addftinfo, afmtodit, chem, eqn, eqn2graph, gdiffmk, geqn （链接到 eqn）, grap2graph, grn, grodvi, groff, groffer, grog, grolbp, grolj4, grops, grotty, gtbl （链接到 tbl）, hpftodit, indxbib, lkbib, lookbib, mmroff, neqn, nroff, pdfroff, pfbtops, pic, pic2graph, post-grohtml, preconv, pre-grohtml, refer, roff2dvi, roff2html, roff2pdf, roff2ps, roff2text, roff2x, soelim, tbl, tfmtodit, 和 troff
安装目录： /usr/lib/groff 和 /usr/share/doc/groff-1.22.3, /usr/share/groff

简要介绍

addftinfo | 读 troff 字体文件并添加一些额外的 groff 系统使用的字体信息
afmtodit | 创建用于和 groff 以及 grops 一起使用的字体文件
chem | Gorff 预处理生成化学结构图
eqn | 编译嵌入了 troff 输入文件的方程的描述为 troff 能理解的命令
eqn2graph | 转换 troff 方程为裁剪图像
gdiffmk | 标记 groff/nroff/troff 文件的差异
geqn | 到 eqn 的链接
grap2graph | 转换 grap 图为裁剪位图图像
grn | 用于 gremlin 文件的 groff 预处理器
grodvi | 生成 TeX dvi 格式的 groff 驱动
groff | groff 文档格式化系统前端；一般运行 troff 程序和适合选定文件的后处理器
groffer | 在 X 和 tty 终端显示 groff 文件以及 man 页面
grog | 读文件并猜测打印文件需要的 groff 选项 -e, -man, -me, -mm, -ms, -p, -s, 以及 -t， 并报告包含这些选项的 groff 命令
grolbp | 用于 Canon CAPSL 打印机（LBP-4 和 LBP-8 系列激光打印机） 的 groff 驱动
grolj4 | 生成适合于 HP LaserJet 4 打印机的 PCL5 格式输出的 groff 驱动
grops | 转换 GNU troff 输出为 PostScript
grotty | 转换 GNU troff 输出为适合于打字机设备的格式
gtbl | 到 tbl 的链接
hpftodit | 从 HP标签字体规格文件创建和 groff -Tlj4 一起使用的字体文件
indxbib | 用和 refer, lookbib, 以及 lkbib 一起使用的指定文件为文献数据库创建倒排索引
lkbib | 搜索文献数据库中包含指定键的引用并报告找到的任何引用
lookbib | 在标准错误中输出提示（除非标准输入不是终端），从标准输入读取包含一系列关键字的行，在指定的文件中搜索文献数据库中包含那些关键字的引用，在标准输出中打印找到的任何引用，循环这些过程直到输入结束
mmroff | groff 的简单预处理器
neqn | 为美国标准信息交换码（ASCII） 输出格式化方程
nroff | 用 groff 模仿 nroff 命令的脚本
pdfroff | 用 groff 创建 pdf 文档
pfbtops | 转换 .pfb 格式中的 PostScript 字体为 ASCII
pic | 编译嵌入了 troff 或 TeX 输入文件的图像的描述为 TeX 或 troff 能理解的命令
pic2graph | 转换 PIC 图为裁剪图像
post-grohtml | 转换 GNU troff 输出为 HTML
preconv | 转换输入文件编码为 GNU troff 能理解的编码
pre-grohtml | 转换 GNU troff 的输出为 HTML
refer | 复制文件内容到标准输出，其中 .[ 和 .] 之间的行解释为引用， .R1 和 .R2 之间的行解释为如何处理引用的命令
roff2dvi | 转化 roff 文件到 DVI 格式
roff2html | 转换 roff 文件到 HTML 格式
roff2pdf | 转换 roff 文件到 PDFs
roff2ps | 转换 roff 文件为 ps 文件
roff2text | 转换 roff 文件为文本文件
roff2x | 转换 roff 文件到其它格式
soelim | 读文件并用相应的 file 内容替换 .so file 格式的行
tbl | 编译嵌入了 troff 输入文件的表的描述为 troff 能理解的命令
tfmtodit | 创建和 groff -Tdvi 一起使用的字体文件
troff | 和 Unix troff 高度兼容；通常应该使用 groff 命令调用，它也会以恰当的顺序和选项运行预处理器和后处理器
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Gperf-3.0.4

  • 下一页

    Xz-5.2.0


6.53. Xz-5.2.0

第六章 安装基本的系统软件

    Groff-1.22.3

  • 下一页

    GRUB-2.02~beta2

  • 返回
  • 主页

6.53. Xz-5.2.0

Xz 软件包包含用于压缩和解压文件的程序。它提供 lzma 和更新的 xz 压缩格式功能。和传统的 gzip 或 bzip2 命令相比，用 xz 压缩文本文件能获得更好的压缩率。

大概编译时间： 0.4 SBU
需要磁盘空间： 22 MB

6.53.1. 安装 Xz

准备编译 Xz：

./configure --prefix=/usr --docdir=/usr/share/doc/xz-5.2.0

编译软件包：

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.53.2. Xz 软件包内容

安装的程序： lzcat （链接到 xz）, lzcmp （链接到 xzdiff）, lzdiff （链接到 xzdiff）, lzegrep （链接到 xzgrep）, lzfgrep （链接到 xzgrep）, lzgrep （链接到 xzgrep）, lzless （link to xzless）, lzma （链接到 xz）, lzmadec, lzmainfo, lzmore （link to xzmore）, unlzma （链接到 xz）, unxz, （链接到 xz）, xz, xzcat （链接到 xz）, xzcmp （链接到 xzdiff）, xzdec, xzdiff, xzegrep （链接到 xzgrep）, xzfgrep （链接到 xzgrep）, xzgrep, xzless, 和 xzmore
安装的库： liblzma.{a,so}
安装目录： /usr/include/lzma 和 /usr/share/doc/xz-5.2.0

简要介绍

lzcat | 解压标准输出
lzcmp | 对 LZMA 压缩文件运行 cmp 命令
lzdiff | 对 LZMA 压缩文件运行 diff 命令
lzegrep | 对 LZMA 压缩文件运行 egrep 命令
lzfgrep | 对 LZMA 压缩文件运行 fgrep 命令
lzgrep | 对 LZMA 压缩文件运行 grep 命令
lzless | 对 LZMA 压缩文件运行 less 命令
lzma | 用 LZMA 格式压缩或解压文件
lzmadec | 用于 LZMA 压缩文件的轻便解码器
lzmainfo | 显示存储在 LZMA 压缩文件头部的信息
lzmore | 对 LZMA 压缩文件运行 more 命令
unlzma | 用 LZMA 格式解压文件
unxz | 用 XZ 格式解压文件
xz | 用 xz 格式压缩或解压文件
xzcat | 解压到标准输出
xzcmp | 对 XZ 压缩文件运行 cmp 命令
xzdec | 用于 XZ 压缩文件的轻便解码器
xzdiff | 对 XZ 压缩文件运行 diff 命令
xzegrep | 对 XZ 压缩文件运行 egrep 命令
xzfgrep | 对 XZ 压缩文件运行 fgrep 命令
xzgrep | 对 XZ 压缩文件运行 grep 命令
xzless | 对 XZ 压缩文件运行 less 命令
xzmore | 对 XZ 压缩文件运行 more 命令
liblzma | 用 Lempel-Ziv-Markov 链算法实现无损块排序数据压缩的库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Groff-1.22.3

  • 下一页

    GRUB-2.02~beta2


6.54. GRUB-2.02~beta2

第六章 安装基本的系统软件

    Xz-5.2.0

  • 下一页

    Less-458

  • 返回
  • 主页

6.54. GRUB-2.02~beta2

GRUB 软件包包含多重启动管理器（GRand Unified Bootloader）。

大概编译时间： 0.8 SBU
需要磁盘空间 170 MB

6.54.1. 安装 GRUB

准备编译 GRUB：

./configure --prefix=/usr          \
            --sbindir=/sbin        \
            --sysconfdir=/etc      \
            --disable-grub-emu-usb \
            --disable-efiemu       \
            --disable-werror

新配置选项的含义：

--disable-werror

允许忽视有更新 Flex 版本提示的警告以完成构建。

--disable-grub-emu-usb --disable-efiemu

这些选项通过停用 LFS 不需要的功能和测试程序最小化构建。

编译软件包：

make

该软件包没有测试套件。

安装软件包：

make install

会在 章节 8.4, “使用 GRUB 设置启动过程” 介绍通过 GRUB 启动你的 LFS 系统。

6.54.2. GRUB 软件包内容

安装的程序： grub-bios-setup, grub-editenv, grub-fstest, grub-install, grub-kbdcomp, 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-script-check, grub-set-default, grub-sparc64-setup
安装目录 /usr/lib/grub, /etc/grub.d, /usr/share/grub, /boot/grub

简要介绍

grub-bios-setup | grub-install 的帮助程序
grub-editenv | 编辑环境块的工具
grub-fstest | 调试文件系统驱动的工具
grub-install | 在你的驱动器上安装 GRUB
grub-kbdcomp | 转换 xkb 布局为 GRUB 可识别样式的脚本
grub-menulst2cfg | 为和 GRUB 2 一起使用，转换引导装载程序（GRUB Legacy） menu.lst 为 grub.cfg
grub-mkconfig | 生成 grub 配置文件
grub-mkimage | 创建 GRUB 可启动镜像
grub-mklayout | 生成 GRUB 键盘布局文件
grub-mknetdir | 准备一个 GRUB 网络启动目录
grub-mkpasswd-pbkdf2 | 生成一个用于启动菜单的加密 PBKDF2 密码
grub-mkrelpath | 生成相对于根目录的系统路径名称
grub-mkrescue | 创建适用于软盘或 CDROM/DVD 的可启动 GRUB 镜像
grub-mkstandalone | 生成一个单独镜像
grub-ofpathname | 打印 GRUB 设备路径的帮助程序
grub-probe | 对指定路径或设备检测设备信息
grub-reboot | 只为下次启动设置默认 GRUB 启动选项
grub-script-check | 检查 GRUB 配置脚本是否有语法错误
grub-set-default | 为 GRUB 设置默认启动选项
grub-sparc64-setup | grub-setup 的帮助程序
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Xz-5.2.0

  • 下一页

    Less-458


6.55. Less-458

第六章 安装基本的系统软件

    GRUB-2.02~beta2

  • 下一页

    Gzip-1.6

  • 返回
  • 主页

6.55. Less-458

Less 软件包包含一个文本文件查看器。

大概编译时间： 少于 0.1 SBU
需要磁盘空间： 4.1 MB

6.55.1. 安装 Less

准备编译 Less：

./configure --prefix=/usr --sysconfdir=/etc

配置选项的含义：

--sysconfdir=/etc

该选项告诉软件包创建的程序在 /etc 中查找配置文件。

编译软件包：

make

该软件包没有测试套件：

安装软件包：

make install

6.55.2. Less 软件包内容

安装的程序： less, lessecho, 和 lesskey

简要介绍

less | 文件查看器或分页器；显示指定文件的内容，允许用户滚动、查找字符串以及跳转到标记。
lessecho | 在 Unix 系统文件名中扩展元字符，例如* 和 ?
lesskey | 用于指定绑定到 less 的键
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    GRUB-2.02~beta2

  • 下一页

    Gzip-1.6


6.56. Gzip-1.6

第六章 安装基本的系统软件

    Less-458

  • 下一页

    IPRoute2-3.19.0

  • 返回
  • 主页

6.56. Gzip-1.6

Gzip 软件包包含用于压缩和解压文件的程序。

大概编译时间： 0.1 SBU
需要磁盘空间： 20 MB

6.56.1. 安装 Gzip

准备编译 Gzip：

./configure --prefix=/usr --bindir=/bin

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

移动不需要在根文件系统的程序：

mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin

6.56.2. Gzip 软件包内容

安装的程序： gunzip, gzexe, gzip, uncompress, zcat, zcmp, zdiff, zegrep, zfgrep, zforce, zgrep, zless, zmore, 和 znew

简要介绍

gunzip | 解压 gzip 压缩的文件
gzexe | 创建自解压可执行文件
gzip | 用 Lempel-Ziv(LZ77) 编码压缩指定文件
uncompress | 解压压缩文件
zcat | 解压指定 gzip 压缩的文件到标准输出
zcmp | 对 gzip 压缩的文件运行 cmp 命令
zdiff | 对 gzip 压缩的文件运行 diff 命令
zegrep | 对 gzip 压缩的文件运行 egrep 命令
zfgrep | 对 gzip 压缩的文件运行 fgrep 命令
zforce | 强制所有指定的 gzip 压缩文件的扩展名为 .gz， 这样 gzip 就不会对它们再次压缩；这在文件传输中文件名被截断时非常有用
zgrep | 对 gzip 压缩的文件运行 egrep 命令
zless | 对 gzip 压缩的文件运行 less 命令
zmore | 对 gzip 压缩的文件运行 more 命令
znew | 从 compress 格式到 gzip 格式重新压缩文件—.Z 到 .gz
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Less-458

  • 下一页

    IPRoute2-3.19.0


6.57. IPRoute2-3.19.0

第六章 安装基本的系统软件

    Gzip-1.6

  • 下一页

    Kbd-2.0.2

  • 返回
  • 主页

6.57. IPRoute2-3.19.0

IPRoute2 软件包包含基于 IPV4 网络的基本和高级程序。

大概编译时间： 0.1 SBU
需要磁盘空间： 10.6 MB

6.57.1. 安装 IPRoute2

该软件包包含的二进制程序 arpd 依赖于 Berkeley DB。由于 arpd 在基础 Linux 系统中通常并不需要，因此可以用以下命令移除对 Berkeley DB 的依赖。 如果确实需要 arpd， 可以在 BLFS 指南的 http://www.linuxfromscratch.org/blfs/view/systemd/server/databases.html#db 找到编译 Berkeley DB 的说明。

sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
sed -i /ARPD/d Makefile
sed -i 's/arpd.8//' man/man8/Makefile

编译软件包：

make

该软件包有测试套件，由于它的前置要求，一般不可能在 chroot 环境中运行这些测试。如果你希望在进入你的 LFS 系统后再运行这些测试，确保在你的的内核（"常规设置 " -> "通过 /proc/config.gz 启用到 .config 的访问" [CONFIG_IKCONFIG_PROC]） 中启用了 /proc/config.gz 支持，然后在 testsuite/ 子目录运行 'make alltests' 命令。

安装软件包：

make DOCDIR=/usr/share/doc/iproute2-3.19.0 install

6.57.2. IPRoute2 软件包内容

安装的程序： bridge, ctstat （链接到 lnstat）, genl, ifcfg, ifstat, ip, lnstat, nstat, routef, routel, rtacct, rtmon, rtpr, rtstat （链接到 lnstat）, ss, 和 tc
安装目录： /etc/iproute2, /usr/lib/tc, /usr/share/doc/iproute2-3.19.0, 和 /usr/lib/tc

简要介绍

bridge | 配置网桥
ctstat | 连接状态工具
genl |
ifcfg | ip 命令的 shell 脚本封装 [注意它需要 iputils 软件包中的 arping 和 rdisk 程序，可以在 http://www.skbuff.net/iputils/ 找到 iputils 软件包。]
ifstat | 显示接口统计信息，包括接口发送和接收的包的数目
ip | 主要的可执行程序。它有多种不同功能： ip link <device> 允许用户查看设备状态或更改 ip addr 允许用户查看地址和属性、增加新地址、删除旧地址 ip neighbor 允许用户查看邻居和它们的特性、增加新邻居、删除旧邻居 ip rule 允许用户查看路由策略并更改 ip route 允许用户查看路由表并更改路由表规则 ip tunnel 允许用户查看 IP 隧道及其特性、并进行更改 ip maddr 允许用户查看多播地址及其特性、并进行更改 ip mroute 允许用户设置、更改或删除多播路由 ip monitor 允许用户持续监视设置、地址和路由状态
lnstat | 提供 Linux 网络统计信息；是更通用、功能更完备的替代旧 rtstat 的程序
nstat | 显示网络统计信息
routef | ip route 的组件。用于清空路由表
routel | ip route 的组件。用于列出路由表
rtacct | 显示 /proc/net/rt_acct 的内容
rtmon | 路由监视工具
rtpr | 转换 ip -o 输出为可读形式
rtstat | 路由状态工具
ss | 类似于 netstat 命令；显示活动连接
tc | 拥塞控制可执行程序；用于实现服务质量（Quality Of Service,QOS）和服务等级（Class Of Service,COS） tc qdisc 允许用户设置排队规则 tc class 允许用户基于排队规则调度策略设置等级 tc estimator 允许用户估计到一个网络的网络流量 tc filter 允许用户设置 QOS/COS 包过滤 tc policy 允许用户设置 QOS/COS 策略
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Gzip-1.6

  • 下一页

    Kbd-2.0.2


6.58. Kbd-2.0.2

第六章 安装基本的系统软件

    IPRoute2-3.19.0

  • 下一页

    Kmod-19

  • 返回
  • 主页

6.58. Kbd-2.0.2

Kbd 软件包包含键表文件、控制台字体和键盘工具。

大概编译时间： 0.1 SBU
需要磁盘空间： 34 MB

6.58.1. 安装 Kbd

在 Kbd 软件包中退格键（Backspace）和删除键（Delete）的行为和键映射并不一致。 下面的补丁修复了 i386 键映射中的这个问题：

patch -Np1 -i ../kbd-2.0.2-backspace-1.patch

打补丁后，退格键生成编码为 127 的字符，删除键会生成一个著名的转义序列。

移除冗余的 resizecons 程序（它要求功能不全的 svglib 提供视频模式文件 - 用于正常使用 setfont 设置控制台字体大小）以及帮助手册。

sed -i 's/\（RESIZECONS_PROGS=\）yes/\1no/g' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in

准备编译 Kbd：

PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr --disable-vlock

配置选项的含义：

--disable-vlock

该选项防止编译 vlock 工具，因为它要求 chroot 环境中不可用的 PAM 库。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

注意

由于通常使用的 CP1251 键映射假设使用 ISO-8859-5 编码，Kbd 软件包不能为某些语言（例如 Belarusian） 提供可用的键映射。 使用这样的语言需要单独下载能工作的键映射。

如果需要的话，安装帮助文档：

mkdir -v       /usr/share/doc/kbd-2.0.2
cp -R -v docs/doc/* /usr/share/doc/kbd-2.0.2

6.58.2. Kbd 软件包内容

安装的程序： chvt, deallocvt, dumpkeys, fgconsole, getkeycodes, kbdinfo, kbd_mode, kbdrate, loadkeys, loadunimap, mapscrn, openvt, psfaddtable （链接到 psfxtable）, psfgettable （链接到 psfxtable）, psfstriptable （链接到 psfxtable）, psfxtable, setfont, setkeycodes, setleds, setmetamode, showconsolefont, showkey, unicode_start, 和 unicode_stop
安装目录： /usr/share/consolefonts, /usr/share/consoletrans, /usr/share/keymaps, 和 /usr/share/unimaps

简要介绍

chvt | 更改前台虚拟终端
deallocvt | 重新分配未使用的虚拟终端
dumpkeys | 转储键盘转换表
fgconsole | 输出活动虚拟终端的数目
getkeycodes | 输出内核扫描码到键码的映射表
kbdinfo | 获取关于某个终端的状态信息
kbd_mode | 报告或设置键盘模式
kbdrate | 设置键盘重复和延迟速度
loadkeys | 加载键盘转换表
loadunimap | 加载内核 Unicode 到字体映射表
mapscrn | 用于加载用户定义的输出字符映射表到控制台驱动的过时程序；现在通过 setfont 完成
openvt | 在一个新的虚拟终端（VT）启动程序
psfaddtable | 添加 Unicode 字符表到控制台字体
psfgettable | 从控制台字体抽取嵌入的 Unicode 字符表
psfstriptable | 从控制台字体移除嵌入的 Unicode 字符表
psfxtable | 为控制台字体处理 Unicode 字符表
setfont | 更改控制台的增强图形适配器（Enhanced Graphic Adapter,EGA）和视频图形阵列（Video Graphics Array,VGA）的字体
setkeycodes | 加载内核扫描码到键码映射表条目；键盘上有异常键时非常有用
setleds | 设置键盘标记和发光二极管（Light Emitting Diodes,LEDs）
setmetamode | 定义键盘元键处理
showconsolefont | 显示当前 EGA/VGA 控制台屏幕字体
showkey | 报告键盘上按键的扫描码、键码以及 ASCII 码
unicode_start | 设置键盘和控制台为 UNICODE 模式[别用该程序，除非你的键映射文件是 ISO-8859-1 编码。对于其它编码，该工具会输出错误结果。]
unicode_stop | 从 UNICODE 模式恢复键盘和控制台为原来模式
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    IPRoute2-3.19.0

  • 下一页

    Kmod-19


6.59. Kmod-19

第六章 安装基本的系统软件

    Kbd-2.0.2

  • 下一页

    Libpipeline-1.4.0

  • 返回
  • 主页

6.59. Kmod-19

Kmod 软件包包含用于加载内核模块的库和工具

大概编译时间： 0.1 SBU
需要磁盘空间： 37 MB

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

用以下命令测试结果：

make check

安装软件包并创建符号链接使兼容 Module-Init-Tools(之前处理 Linux 内核模块的软件包)：

make install

for target in depmod insmod lsmod modinfo modprobe rmmod; do
  ln -sv ../bin/kmod /sbin/$target
done

ln -sv kmod /bin/lsmod

6.59.2. Kmod 软件包内容

安装的程序： depmod (链接到 kmod), insmod (链接到 kmod), kmod, lsmod (链接到 kmod), modinfo (链接到 kmod), modprobe (链接到 kmod), 和 rmmod (链接到 kmod)
安装的库： libkmod.so

简要介绍

depmod | 基于从已有的模块集上发现的符号创建依赖文件；modprobe 用该依赖文件自动加载所需模块
insmod | 在运行的内核上安装可加载模块
kmod | 加载或卸载内核模块
lsmod | 列出当前已加载模块
modinfo | 检查和内核模块相关联的目标文件并显示搜索到的任何信息
modprobe | 用 depmod 创建的依赖文件自动加载相关模块
rmmod | 从运行中的内核卸载模块
libkmod | 其它程序使用该库加载或卸载内核模块
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Kbd-2.0.2

  • 下一页

    Libpipeline-1.4.0


6.60. Libpipeline-1.4.0

第六章 安装基本的系统软件

    Kmod-19

  • 下一页

    Make-4.1

  • 返回
  • 主页

6.60. Libpipeline-1.4.0

Libpipeline 软件包包含以灵活方便方式管理管道和子进程的库。

大概编译时间： 0.1 SBU
需要磁盘空间： 8.2 MB

6.60.1. 安装 Libpipeline

准备编译 Libpipeline：

PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr

配置选项的含义：

PKG_CONFIG_PATH

用 pkg-config 获取 章节 5.14, “Check-0.9.14” 编译的测试库元数据的位置。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.60.2. Libpipeline 软件包内容

安装的库： libpipeline.so

简要介绍

libpipeline

该库用于在子进程之间安全地建立管道

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Kmod-19

  • 下一页

    Make-4.1


6.61. Make-4.1

第六章 安装基本的系统软件

    Libpipeline-1.4.0

  • 下一页

    Patch-2.7.4

  • 返回
  • 主页

6.61. Make-4.1

Make 软件包包含一个用于编译软件的程序。

大概编译时间： 0.6 SBU
需要磁盘空间 14.2 MB

6.61.1. 安装 Make

准备编译 Make：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.61.2. Make 软件包内容

安装的程序： make

简要介绍

make

自动检测软件包的哪些部分需要（重新）编译，然后运行相应命令

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Libpipeline-1.4.0

  • 下一页

    Patch-2.7.4


6.62. Patch-2.7.4

第六章 安装基本的系统软件

    Make-4.1

  • 下一页

    Systemd-219

  • 返回
  • 主页

6.62. Patch-2.7.4

Patch 软件包包含一个通过打“补丁”创建或修改文件的程序，补丁文件通常由 diff 程序生成。

大概编译时间： 0.2 SBU
需要磁盘空间 11.6 MB

6.62.1. 安装 Patch

准备编译 Patch：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

6.62.2. Patch 软件包内容

安装的程序： patch

简要介绍

patch

根据补丁文件修改文件[补丁文件通常是由 diff 程序产生的差异列表。通过对源文件应用这些差异生成打补丁后的版本。]

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Make-4.1

  • 下一页

    Systemd-219


6.63. Systemd-219

第六章 安装基本的系统软件

    Patch-2.7.4

  • 下一页

    D-Bus-1.8.16

  • 返回
  • 主页

6.63. Systemd-219

systemd 软件包包含用于控制启动、运行和关闭系统的程序。

大概编译时间： 2.1 SBU
需要磁盘空间 815 MB

6.63.1.安装 systemd

首先创建文件使得当使用第五章中编译的 Util-Linux 以及停用默认的 LTO（链接时优化） 时能顺利编译 systemd：

cat > config.cache << "EOF"
KILL=/bin/kill
HAVE_BLKID=1
BLKID_LIBS="-lblkid"
BLKID_CFLAGS="-I/tools/include/blkid"
HAVE_LIBMOUNT=1
MOUNT_LIBS="-lmount"
MOUNT_CFLAGS="-I/tools/include/libmount"
cc_cv_CFLAGS__flto=no
EOF

默认要停用 LTO 是因为它会使 systemd 以及其它辅助程序链接到 libgcc_s.so、导致编译速度下降以及编译后代码量更大。

另外，修复一个使用第五章中编译的 Util-Linux 时的编译错误：

sed -i "s:blkid/::" $（grep -rl "blkid/blkid.h"）

应用下面的补丁使得安装 compat pkg-config 文件但不安装在 LFS 中没有用的 compat 库：

patch -Np1 -i ../systemd-219-compat-1.patch

停用一个总是失败的测试例程：

sed -i "s:test/udev-test.pl ::g" Makefile.in

准备编译 systemd：

./configure --prefix=/usr                                           \
            --sysconfdir=/etc                                       \
            --localstatedir=/var                                    \
            --config-cache                                          \
            --with-rootprefix=                                      \
            --with-rootlibdir=/lib                                  \
            --enable-split-usr                                      \
            --disable-gudev                                         \
            --disable-firstboot                                     \
            --disable-ldconfig                                      \
            --disable-sysusers                                      \
            --without-python                                        \
            --docdir=/usr/share/doc/systemd-219                     \
            --with-dbuspolicydir=/etc/dbus-1/system.d               \
            --with-dbussessionservicedir=/usr/share/dbus-1/services \
            --with-dbussystemservicedir=/usr/share/dbus-1/system-services

配置选项的含义：

--config-cache

该选项告诉编译系统使用之前创建的 config.cache 文件。

--with-root*

这些选项确保核心程序以及共享库安装到根目录的子目录中。

--enable-split-usr

该选项确保系统中 /bin、/lib 和 /sbin 目录没有到 /usr 对应位置的符号链接时 systemd 仍能正常工作。

--disable-gudev --without-python

这些选项停用 LFS 没有提供所需依赖的可用功能。

--disable-firstboot

该选项防止安装系统初次启动时会进行设置的 systemd 服务。由于 LFS 中所有都要手动设置，它们并无用处。

--disable-ldconfig

该选项防止安装启动时会运行 ldconfig 而导致启动时间过长的 systemd 单元。尽管对于类似 LFS 之类的源发行版并无用处，如果需要该功能的话可以移除这个选项。

--disable-sysusers

该选项防止安装设置 /etc/group 和 /etc/passwd 文件的 systemd 服务。本章前面章节中已经创建了这两个文件。

--with-dbus*

这些选项确保 D-Bus 配置文件安装到了正确的位置。

编译软件包：

make LIBRARY_PATH=/tools/lib

该软件包有个测试套件，但只能在安装后运行。

安装软件包：

make LD_LIBRARY_PATH=/tools/lib install

移动 NSS 库到 /lib：

mv -v /usr/lib/libnss_{myhostname,mymachines,resolve}.so.2 /lib

移除一个不必要的目录：

rm -rfv /usr/lib/rpm

创建和 Sysvinit 兼容的符号链接，使得 systemd 作为默认的启动系统：

for tool in runlevel reboot shutdown poweroff halt telinit; do
     ln -sfv ../bin/systemctl /sbin/${tool}
done
ln -sfv ../lib/systemd/systemd /sbin/init

移除一个到不存在组的引用并修复一个配置文件使得启动时不会导致 systemd-tmpfiles 失败：

sed -i "s:0775 root lock:0755 root root:g" /usr/lib/tmpfiles.d/legacy.conf
sed -i "/pam.d/d" /usr/lib/tmpfiles.d/etc.conf

创建 systemd-journald 需要的 /etc/machine-id 文件：

systemd-machine-id-setup

由于测试套件高度依赖于宿主系统的内核配置，一些测试很可能失败。另外还需要做些更改使得不会查找本章后面 Util-Linux 软件包安装的一个程序。用以下命令测试结果：

sed -i "s:minix:ext4:g" src/test/test-path-util.c
make LD_LIBRARY_PATH=/tools/lib -k check

6.63.2. systemd 软件包内容

安装的程序： bootctl, busctl, coredumpctl, halt, hostnamectl, init, journalctl, kernel-install, localectl, loginctl, machinectl, networkctl, poweroff, reboot, runlevel, shutdown, systemctl, systemd-analyze, systemd-ask-password, systemd-cat, systemd-cgls, systemd-cgtop, systemd-delta, systemd-detect-virt, systemd-escape, systemd-hwdb, systemd-inhibit, systemd-machine-id-setup, systemd-notify, systemd-nspawn, systemd-path, systemd-run, systemd-stdio-bridge, systemd-tmpfiles, systemd-tty-ask-password-agent, telinit, timedatectl, 和 udevadm
安装的库： libnss_myhostname.so.2, libnss_mymachines.so.2, libnss_resolve.so.2, libsystemd.so, 和 libudev.so
安装目录： /etc/binfmt.d, /etc/init.d, /etc/kernel, /etc/modules-load.d, /etc/sysctl.d, /etc/systemd, /etc/tmpfiles.d, /etc/udev, /etc/xdg/systemd, /lib/systemd, /lib/udev, /usr/include/systemd, /usr/lib/binfmt.d, /usr/lib/kernel, /usr/lib/modules-load.d, /usr/lib/sysctl.d, /usr/lib/systemd, /usr/lib/tmpfiles.d, /usr/share/doc/systemd-219, /usr/share/factory, /usr/share/systemd, /var/lib/systemd, 和 /var/log/journal

简要介绍

bootctl | 用于查询固件和启动管理设置
busctl | 用于自检和监控 D-Bus 总线
coredumpctl | 用于检索 systemd 日志生成的核心转储
halt | 通常调用带 -h 参数的 shutdown 命令，除非已经是运行等级 0，然后告诉内核暂停系统；它会在 /var/log/wtmp 文件中标记正准备关闭系统。
hostnamectl | 用于查询或更改系统名称以及相关的设置
init | 内核初始化硬件后接管引导程序而启动的第一个进程，它会启动设置的其它进程。
journalctl | 用于查询 systemd 日志的内容
kernel-install | 用于向 / 从 /boot 中添加或移除内核以及 initramfs 镜像
localectl | 用于查询和更改系统地区和键盘布局设置
loginctl | 用于自检和控制 systemd 登录管理器的状态
machinectl | 用于自检和控制 systemd 虚拟机和容器注册管理器的状态
networkctl | 用于检查 systemd-networkd 所看到的网络链接状态
poweroff | 告诉内核暂停系统并关闭计算机 （查看 halt）
reboot | 告诉内核重启系统 （查看 halt）
runlevel | 报告之前和当期的运行等级、即 /var/run/utmp 文件中的最后一个运行等级记录
shutdown | 以安全的方式关闭系统、向所有进程发送信号并通知所有登录的用户
systemctl | 用于自检和控制 systemd 系统和服务管理器的状态
systemd-analyze | 用于确定当前引导中的系统启动性能
systemd-ask-password | 通过命令行中的问题消息用于向用户查询系统密码或口令
systemd-cat | 用于连接进程日志的 STDOUT 和 STDERR
systemd-cgls | 以树的形式递归显示指定 Linux 控制组层次结构的内容
systemd-cgtop | 按照 CPU、内存和磁盘 I/O 负载的顺序显示本地 Linux 控制组层次结构的顶层控制组
systemd-delta | 用于识别和比较 /etc 中覆盖 /usr 对应部分的配置文件
systemd-detect-virt | 在虚拟化环境中检测执行情况
systemd-escape | 用于在 systemd 单元名称中包含转义字符串
systemd-hwdb | 用户管理硬件数据库（hwdb）
systemd-inhibit | 用于在关机、睡眠或空闲休眠锁时执行程序
systemd-machine-id-setup | 启动时系统安装程序用随机生成的 ID 初始化保存到 /etc/machine-id 的机器 ID
systemd-notify | 守护进程脚本用于通知 init 系统状态更改
systemd-nspawn | 用于在轻量级容器空间中运行命令或操作系统
systemd-path | 用于查询系统和用户路径
systemd-run | 用于创建并运行一个临时 .service 或 .scope 单元并在其中运行指定命令
systemd-tmpfiles | 基于配置文件格式和 tmpfiles.d 指定的位置创建、删除以及清理易变的和临时文件和目录
systemd-tty-ask-password-agent | 用于列出或执行正在等待的 systemd 密码请求
telinit | 告诉 init 要更改的运行等级
timedatectl | 用于查询和更改系统时间和设置
udevadm | 通用 Udev 管理工具：控制 udevd 守护进程、从 Udev 数据库提供信息、 监控 uevent、等待 uevent 完成、检测 Udev 配置、为指定设备触发 uevents
libsystemd | systemd 工具库
libudev | 用于获取 Udev 设备信息的库
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Patch-2.7.4

  • 下一页

    D-Bus-1.8.16


6.64. D-Bus-1.8.16

第六章 安装基本的系统软件

    Systemd-219

  • 下一页

    Util-linux-2.26

  • 返回
  • 主页

6.64. D-Bus-1.8.16

D-Bus 是一个消息总线系统，应用之间相互通信的简单方式。D-Bus 支持系统守护进程（例如添加新硬件设备或打印队列更改事件）和每个用户的登录会话守护进程 （例如用户应用程序之间的一般进程间通信）。另外，消息总线在通用一对一消息传递框架之上构建， 该框架使得任意两个应用可以直接通信（而不需要通过消息总线守护进程）。

大概编译时间： 0.4 SBU
需要磁盘空间： 43 MB

6.64.1. 安装 D-Bus

准备编译 D-Bus：

./configure --prefix=/usr                       \
            --sysconfdir=/etc                   \
            --localstatedir=/var                \
            --docdir=/usr/share/doc/dbus-1.8.16 \
            --with-console-auth-dir=/run/console

配置选项的含义：

--with-console-auth-dir=/run/console

该选项指定 ConsoleKit 验证目录的位置。

编译软件包：

make

该软件包没有测试套件，但要求 LFS 中没有的几个软件包。运行测试套件的命令可以在 BLFS 指南 http://www.linuxfromscratch.org/blfs/view/systemd/general/dbus.html 中找到。

安装软件包：

make install

需要移动共享库到 /lib，因此需要重建 /usr/lib 中的 .so 文件：

mv -v /usr/lib/libdbus-1.so.* /lib
ln -sfv ../../lib/$（readlink /usr/lib/libdbus-1.so） /usr/lib/libdbus-1.so

创建符号链接，使得 D-Bus 和 systemd 可以使用相同的 machine-id 文件：

ln -sfv /etc/machine-id /var/lib/dbus

6.64.2. D-Bus 软件包内容

安装的程序： dbus-cleanup-sockets, dbus-daemon, dbus-launch, dbus-monitor, dbus-run-session, dbus-send, 和 dbus-uuidgen
安装的库： libdbus-1.{a,so}
安装目录： /etc/dbus-1, /usr/include/dbus-1.0, /usr/lib/dbus-1.0, /usr/share/dbus-1, /usr/share/doc/dbus-1.8.16, 和 /var/lib/dbus

简要介绍

dbus-cleanup-sockets | 用于清理目录中残留的套接字
dbus-daemon | D-Bus 消息总线守护进程
dbus-launch | 从 shell 脚本启动 dbus-daemon
dbus-monitor | 监控 D-Bus 消息总线中传送的消息
dbus-run-session | 从 shell 脚本中启动一个 dbus-daemon 会话总线实例并在会话中启动指定程序
dbus-send | 发送消息到 D-Bus 消息总线
dbus-uuidgen | 生成一个通用唯一 ID
libdbus-1 | 包含用于和 D-Bus 消息总线交互的 API 函数
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Systemd-219

  • 下一页

    Util-linux-2.26


6.65. Util-linux-2.26

第六章 安装基本的系统软件

    D-Bus-1.8.16

  • 下一页

    Man-DB-2.7.1

  • 返回
  • 主页

6.65. Util-linux-2.26

Util-linux 软件包其它实用程序。包括处理文件系统、控制台、分区以及消息等工具。

大概编译时间： 1.3 SBU
需要磁盘空间： 137 MB

6.65.1. FHS 兼容性注意事项

FHS 推荐使用 /var/lib/hwclock 目录而不是通常的 /etc 目录作为 adjtime 文件的位置。首先新建目录用于存储 hwclock 程序：

mkdir -pv /var/lib/hwclock

6.65.2. 安装 Util-linux

准备编译 Util-linux：

./configure ADJTIME_PATH=/var/lib/hwclock/adjtime   \
            --docdir=/usr/share/doc/util-linux-2.26 \
            --disable-chfn-chsh  \
            --disable-login      \
            --disable-nologin    \
            --disable-su         \
            --disable-setpriv    \
            --disable-runuser    \
            --disable-pylibmount \
            --without-python

--disable 和 --without 选项用于防止出现关于 LFS 中缺少构建组件需要的软件包或和其它软件包安装的程序不一致的警告。

编译软件包：

make

如果需要的话，以非 root 用户运行测试套件：

警告

以 root 用户运行测试套件会对系统有害。为了运行测试套件，必须保证当前运行 的系统中用于内核的 CONFIG_SCSI_DEBUG 选项可用，还必须保证以一个模块的方式编译。 把它构建到内核中可以防止启动。为了全面覆盖，还必须安装其它的 BLFS 软件包。 如果需要的话，可以在重启进入完整的 LFS 系统后用以下命令运行该测试：

bash tests/run.sh --srcdir=$PWD --builddir=$PWD

chown -Rv nobody .
su nobody -s /bin/bash -c "PATH=$PATH make -k check"

注意

在上面的测试中，如果用最新的内核，tests/ts/ipcs/limits2 会失败。可以安全地忽略该失败。

安装软件包：

make install

6.65.3. Contents of Util-linux

安装的程序： addpart, agetty, blkdiscard, blkid, blockdev, cal, cfdisk, chcpu, chrt, col, colcrt, colrm, column, ctrlaltdel, delpart, dmesg, eject, fallocate, fdformat, fdisk, findfs, findmnt, flock, fsck, fsck.cramfs, fsck.minix, fsfreeze, fstrim, getopt, hexdump, hwclock, i386, ionice, ipcmk, ipcrm, ipcs, isosize, kill, last, lastb （link to last）, ldattach, linux32, linux64, logger, look, losetup, lsblk, lscpu, lslocks, lslogins, mcookie, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.minix, mkswap, more, mount, mountpoint, namei, partx, pg, pivot_root, prlimit, raw, readprofile, rename, renice, resizepart, rev, rtcwake, script, scriptreplay, setarch, setsid, setterm, sfdisk, sulogin, swaplabel, swapoff （link to swapon）, swapon, switch_root, tailf, taskset, ul, umount, unshare, utmpdump, uuidd, uuidgen, wall, wdctl, whereis, wipefs, x86_64, 和 zramctl
安装的库： libblkid.{a,so}, libfdisk.{a,so}, libmount.{a,so}, libsmartcols.{a,so}, 和 libuuid.{a,so}
安装目录： /etc/terminal-colors.d, /usr/include/blkid, /usr/include/libmount, /usr/include/uuid, /usr/share/doc/util-linux-2.26/getopt, 和 /var/lib/hwclock

简要介绍

addpart | 通知 Linux 内核有新的分区
agetty | 打开一个 tty 端口，提示输入登录名，然后调用 login 程序
blkdiscard | 丢弃设备上的扇区
blkid | 用于定位和打印块设备属性的命令行工具
blockdev | 允许用户在命令行中调用块设备的 ioctls
cal | 显示一个简单的日历
cfdisk | 管理指定设备的分区表
chcpu | 更改 CPU 的状态
chrt | 管理进程的的实时属性
col | 过滤掉反向换行符
colcrt | 为终端过滤缺少某些功能，例如加粗和半行的 nroff 输出
colrm | 过滤掉指定的列
column | 格式化指定文件为多列
ctrlaltdel | 设置 Ctrl+Alt+Del 组合键的功能为硬或软复位
delpart | 请求 Linux 内核移除一个分区
dmesg | 转储内核启动信息
eject | 弹出可移除媒体
fallocate | 为文件预分配空间
fdformat | 低级别格式化软盘
fdisk | 管理指定设备的分区表
findfs | 通过标签或通用唯一标识符（UUID）查找文件系统
findmnt | libmount 库中用于和 mountinfo、fstab 和 mtab 文件工作的命令行接口
flock | 请求一个文件锁，然后用所持有的锁执行命令
fsck | 用于检查或者修复文件系统
fsck.cramfs | 在指定设备的 Cramfs 文件系统上进行一致性检查
fsck.minix | 在指定设备的 Minix 文件系统上进行一致性检查
fsfreeze | FIFREEZE/FITHAW ioctl 内核驱动操作的简单封装
fstrim | 丢弃已挂载的文件系统中未使用的块
getopt | 解析给定命令行中的选项
hexdump | 以十六进制或其它指定格式转储给定文件
hwclock | 读取或设置系统硬件时钟，也称为实时时钟（RTC）或基本输入输出系统（BIOS）时钟
i386 | 到 setarch 的符号链接
ionice | 为某个程序获取或设置 io 调度类和优先级
ipcmk | 创建多种 IPC（进程间通信） 资源
ipcrm | 移除指定的进程间通信（IPC）资源
ipcs | 提供 IPC 状态信息
isosize | 报告 iso9660 文件系统的大小
kill | 向进程发送信号
last | 通过反向查找 /var/log/wtmp 文件显示上次登录（注销）的用户；同时还显示系统启动、关闭以及运行时级别更改
lastb | 根据 /var/log/btmp 中的日志显示失败的登录尝试
ldattach | 向行中添加行规则
linux32 | 到 setarch 的符号链接
linux64 | 到 setarch 的符号链接
logger | 输入给定的信息到系统日志
look | 显示以指定字符串开头的行
losetup | 设置和控制环路设备
lsblk | 以类似树的形式列出所有或指定块设备的信息
lscpu | 打印 CPU 架构信息
lslocks | 列出本地系统锁
lslogins | 列出关于用户、组和系统账号的信息
mcookie | 为 xauth 生成 magic cookies（128位随机十六进制数）
mesg | 控制其它用户是否可以向当前用户终端发送信息
mkfs | 在设备上构建文件系统（通常是一个硬盘分区）
mkfs.bfs | 创建 Santa Cruz Operations（SCO） bfs 文件系统
mkfs.cramfs | 创建 cramfs 文件系统
mkfs.minix | 创建 Minix 文件系统
mkswap | 初始化指定设备或文件作为交换空间使用
more | 用于每次显示文本一页的过滤器
mount | 在文件系统树中挂载文件系统到给定设备的指定目录
mountpoint | 检查目录是否是一个挂载点
namei | 显示给定路径名称的符号链接
nsenter | 在其他进程的命名空间中运行程序
partx | 告诉内核磁盘上存在的分区和编号
pg | 每次显示一屏文本文件
pivot_root | 使指定文件系统作为当前进程的新的根文件系统
prlimit | 获取或设置进程资源限制
raw | 绑定 Linux 原始字符设备到一个块设备
readprofile | 读取内核分析信息
rename | 重命名指定文件，用另一个字符串替换指定字符串
renice | 更改运行中进程的优先级
resizepart | 请求 Linux 内核重新设置分区大小
rev | 反转指定文件的行
rtcwake | 用于进入系统睡眠状态知道指定的唤醒时间
script | 生成终端会话的打字稿
scriptreplay | 用定时信息播放打字稿
setarch | 在新程序环境中更改报告架构并设置个性标签
setsid | 在新会话中运行指定程序
setterm | 设置终端属性
sfdisk | 磁盘分区表管理器
sulogin | 允许 root 登录；通常当系统进入单用户模式时由 init 调用
swaplabel | 允许更改交换空间 UUID 和标签
swapoff | 停用设备和文件的分页和交换机制
swapon | 启用设备和文件的分页和交换机制并列出当前使用的设备和文件
switch_root | 切换到另一个文件系统并把当前路径作为挂载树的根
tailf | 跟踪日志文件的的增长；显示日志文件的最后 10 行然后继续显示日志文件中 添加的任何新条目
taskset | 检索或设置一个进程的 CPU 亲和性
ul | 将强调转换为转义序列以表示强调正在使用的终端的过滤器
umount | 断开文件系统到系统文件树的连接
unshare | 用一些父进程非共享的名字空间运行程序
utmpdump | 以更友好的格式显示指定登录文件的内容
uuidd | UUID 库用于生成基于时间的安全和保证唯一的 UUID 的守护进程
uuidgen | 创建新的 UUID。在所有创建的 UUID 中，在本地系统或其它系统， 在之前和以后，每个新的 UUID 都可以被认为是唯一的
wall | 在终端上显示所有当前登录用户的文件内容，或者默认的标准输出
wdctl | 显示硬件看门狗状态
whereis | 报告指定命令的二进制文件、源代码或者 man 手册的位置
wipefs | 从设备中擦除文件系统签名
x86_64 | 到 setarch 的符号链接
zramctl | 用于设置和控制 zram（压缩后的 ram 磁盘）的程序
libblkid | 包含用于设备识别和标记提取的例程
libfdisk | 包含操作分区表的例程
libmount | 包含用于块设备挂载和卸载的例程
libsmartcols | 包含以表格形式进行屏幕输出的例程
libuuid | 包含用于生成在本地系统之上可访问对象的唯一标识符的例程
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    D-Bus-1.8.16

  • 下一页

    Man-DB-2.7.1


6.66. Man-DB-2.7.1

第六章 安装基本的系统软件

    Util-linux-2.26

  • 下一页

    Tar-1.28

  • 返回
  • 主页

6.66. Man-DB-2.7.1

Man-DB 软件包包含用于查找和查看 man 页面的程序。

大概编译时间： 0.4 SBU
需要磁盘空间： 33 MB

6.66.1. 安装 Man-DB

准备编译 Man-DB：

./configure --prefix=/usr                        \
            --docdir=/usr/share/doc/man-db-2.7.1 \
            --sysconfdir=/etc                    \
            --disable-setuid                     \
            --with-browser=/usr/bin/lynx         \
            --with-vgrind=/usr/bin/vgrind        \
            --with-grap=/usr/bin/grap

配置选项的含义：

--disable-setuid

为用户 man 禁止 man 程序调用 setuid。

--with-...

这些参数用于设置一些默认程序。lynx 是一个基于文本的网络浏览器（查看 BLFS 获取安装指令），vgrind 将程序源码转换为 Groff 输入，grap 在 Groof 文档排版图中非常有用。查看手册页通常并不需要 vgrind 和 grap 程序。它们并不是 LFS 或 BLFS 的一部分，但是如果需要的话你自己应该能够在完成 LFS 之后安装它们。

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

移除到不存在用户的引用：

sed -i "s:man root:root root:g" /usr/lib/tmpfiles.d/man-db.conf

6.66.2. LFS 中的非英语手册页

下面的表格显示了 Man-DB 假定手册页安装到 /usr/share/man/<ll> 会使用的字符编码。除此之外，Man-DB 能正确判断安装到该目录的手册页是否采用 UTF-8 编码。

Table 6.1. 传统 8 位手册页预期字符编码

语言 (代码) | 编码 | 语言 (代码) | 编码
Danish (da) | ISO-8859-1 | Croatian (hr) | ISO-8859-2
German (de) | ISO-8859-1 | Hungarian (hu) | ISO-8859-2
English (en) | ISO-8859-1 | Japanese (ja) | EUC-JP
Spanish (es) | ISO-8859-1 | Korean (ko) | EUC-KR
Estonian (et) | ISO-8859-1 | Lithuanian (lt) | ISO-8859-13
Finnish (fi) | ISO-8859-1 | Latvian (lv) | ISO-8859-13
French (fr) | ISO-8859-1 | Macedonian (mk) | ISO-8859-5
Irish (ga) | ISO-8859-1 | Polish (pl) | ISO-8859-2
Galician (gl) | ISO-8859-1 | Romanian (ro) | ISO-8859-2
Indonesian (id) | ISO-8859-1 | Russian (ru) | KOI8-R
Icelandic (is) | ISO-8859-1 | Slovak (sk) | ISO-8859-2
Italian (it) | ISO-8859-1 | Slovenian (sl) | ISO-8859-2
Norwegian Bokmal (nb) | ISO-8859-1 | Serbian Latin (sr@latin) | ISO-8859-2
Dutch (nl) | ISO-8859-1 | Serbian (sr) | ISO-8859-5
Norwegian Nynorsk (nn) | ISO-8859-1 | Turkish (tr) | ISO-8859-9
Norwegian (no) | ISO-8859-1 | Ukrainian (uk) | KOI8-U
Portuguese (pt) | ISO-8859-1 | Vietnamese (vi) | TCVN5712-1
Swedish (sv) | ISO-8859-1 | Simplified Chinese (zh_CN) | GBK
Belarusian (be) | CP1251 | Simplified Chinese, Singapore (zh_SG) | GBK
Bulgarian (bg) | CP1251 | Traditional Chinese, Hong Kong (zh_HK) | BIG5HKSCS
Czech (cs) | ISO-8859-2 | Traditional Chinese (zh_TW) | BIG5
Greek (el) | ISO-8859-7 |  |

注意

手册页不支持不在列表中的语言。

6.66.3. Man-DB 软件包内容

安装的程序： accessdb, apropos (链接到 whatis), catman, lexgrog, man, mandb, manpath, whatis, 和 zsoelim
安装的库： libman.so 和 libmandb.so
安装目录： /usr/lib/man-db, /usr/libexec/man-db, 和 /usr/share/doc/man-db-2.7.1

简要介绍

accessdb | 以人类可读形式转储 whatis 数据库
apropos | 查询 whatis 数据库并显示包含指定字符串的系统命令的简要介绍
catman | 创建或更新预格式化手册页
lexgrog | 显示指定手册页的一行概要信息
man | 格式化并显示要求的手册页
mandb | 创建或更新 whatis 数据库
manpath | 基于 man.conf 中的设置和用户环境显示 $MANPATH 或 (如果没有设置 $MANPATH) 合适的搜索路径的内容
whatis | 查询 whatis 数据库并显示包含以给定关键字为独立字的系统命令的简要介绍
zsoelim | 读取文件并用提到的 file 的内容替换 .so file 格式的行
libman | 包含 man 的运行时支持
libmandb | 包含 man 的运行时支持
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Util-linux-2.26

  • 下一页

    Tar-1.28


6.67. Tar-1.28

第六章 安装基本的系统软件

    Man-DB-2.7.1

  • 下一页

    Texinfo-5.2

  • 返回
  • 主页

6.67. Tar-1.28

Tar 软件包包含一个归档程序。

大概编译时间： 2.3 SBU
需要磁盘空间： 46 MB

6.67.1. 安装 Tar

准备编译 Tar：

FORCE_UNSAFE_CONFIGURE=1  \
./configure --prefix=/usr \
            --bindir=/bin

配置选项的含义：

FORCE_UNSAFE_CONFIGURE=1

强制以 root 用户运行 mknod 的测试。通常认为以 root 用户运行该测试是危险的，但由于是在部分构建的系统上运行，这样并没有问题。

编译软件包：

make

用以下命令测试结果(大概 1 SBU)：

make check

安装软件包：

make install
make -C doc install-html docdir=/usr/share/doc/tar-1.28

6.67.2. Tar 软件包内容

安装的程序： rmt 和 tar
安装目录： /usr/share/doc/tar-1.28

简要介绍

rmt | 通过进程间通信连接远程操作磁带驱动器
tar | 创建归档文件，从归档文件提取文件，列出归档文件的内容，归档文件也被成为 tar 包
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Man-DB-2.7.1

  • 下一页

    Texinfo-5.2


6.68. Texinfo-5.2

第六章 安装基本的系统软件

    Tar-1.28

  • 下一页

    Vim-7.4

  • 返回
  • 主页

6.68. Texinfo-5.2

Texinfo 软件包包含用于读、写以及转换信息页的程序。

大概编译时间： 0.5 SBU
需要磁盘空间： 109 MB

6.68.1. 安装 Texinfo

准备编译 Texinfo：

./configure --prefix=/usr

编译软件包：

make

用以下命令测试结果：

make check

安装软件包：

make install

可选地安装 TeX 中的组件：

make TEXMF=/usr/share/texmf install-tex

make 参数的含义：

TEXMF=/usr/share/texmf

如果后面会安装 TeX 软件包， TEXMF makefile 变量保存了作为 TeX 树根的位置

该信息文档系统使用一个纯文本文件来存放菜单条目清单。文件保存在 /usr/share/info/dir。不幸的是，由于不同软件包 Makefile 的偶然问题，有时候会和系统中安装的信息页不同步。如果需要重建 /usr/share/info/dir 文件，下面的可选命令能完成任务：

pushd /usr/share/info
rm -v dir
for f in *
  do install-info $f dir 2>/dev/null
done
popd

6.68.2. Texinfo 软件包内容

安装的程序： info, infokey, install-info, makeinfo (链接到 texi2any), pdftexi2dvi, pod2texi, texi2any, texi2dvi, texi2pdf, 和 texindex
安装目录： /usr/share/texinfo

简要介绍

info | 用于读取和 man 页面相似的信息页，但和只是解释所有可用命令行选项相比更加深入， [例如比较 man bison 和 info bison]
infokey | 编译包含自定义 Info 的源文件为二进制格式
install-info | 用于安装信息页；它会更新 info 索引文件中的条目
makeinfo | 翻译给定的 Texinfo 源文档为信息页、纯文本或 HTML
pdftexi2dvi | 用于格式化给定的 Texinfo 文档为 PDF 文件
pod2texi | 转换 Pod 为 Texinfo 格式
texi2any | 翻译 Texinfo 源文档为多种其它格式
texi2dvi | 用于格式化给定 Texinfo 文档为可打印的设备无关文件
texi2pdf | 用于格式化给定 Texinfo 文档为 PDF 文件
texindex | 用于对 Texinfo 索引文件进行排序
翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    Tar-1.28

  • 下一页

    Vim-7.4


6.69. Vim-7.4

第六章 安装基本的系统软件

    Texinfo-5.2

  • 下一页

    关于调试符号

  • 返回
  • 主页

6.69. Vim-7.4

Vim 软件包包含了一个强大的文本编辑器。

大概构建时间： 1.0 SBU
需要磁盘空间： 139 MB

Vim 的替代品

如果你钟情于其它的编辑器 —比如 Emacs、Joe， 或 Nano—请参考 http://www.linuxfromscratch.org/blfs/view/systemd/postlfs/editors.html 里的安装指导。

6.69.1. Vim 的安装

首先，把配置文件 vimrc 从默认位置移动到 /etc:

echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h

让 Vim 做好编译准备：

./configure --prefix=/usr

编译安装包：

make

检验结果：

make -j1 test

然而，这个测试会输出一堆二进制数据到屏幕上，这会导致当前设置下的终端出现问题。把输出重定向到一个日志文件就可以解决这个问题。测试成功的话就会输出 “ALL DONE”。

安装软件包:

make install

许多用户习惯于使用 vi 而不是 vim。为了当人们在习惯性的输入 vi 时能执行 vim， 需要给二进制文件和 man 页建立符号连接：

ln -sv vim /usr/bin/vi
for L in  /usr/share/man/{,*/}man1/vim.1; do
    ln -sv vim.1 $(dirname $L)/vi.1
done

默认情况下，Vim 的说明文档被安装在 /usr/share/vim 里。 下面的这个符号链接使得可以通过 /usr/share/doc/vim-7.4 访问该文档，让它的位置与其它软件包的文档位置保持一致：

ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4

如果要把一个 X Window 系统安装在 LFS 系统上，可能得在安装完 X 系统后再重新编译 Vim。Vim 带有一个 GUI 版本，这个版本需要安装 X 和一些额外的库。 想了解更多信息，请参考 Vim 文档和 BLFS（ http://www.linuxfromscratch.org/blfs/view/systemd/postlfs/vim.html） 中 Vim 安装指导页。

6.69.2. 设置 Vim

默认情况下，vim 是以不兼容 vi 的模式运行的。这对于过去使用其它编辑器的用户可能是个新问题。下面列出了 “非兼容性”设置以突出显示使用的新特性。它也提醒着那些想换成 “兼容” 模式的人，这是配置文件里第一个该被设置的地方。这非常有必要，因为它会改变其它的设置，而且覆写必须在这个设置之后。以下面的方式，创建一个默认的 vim 配置文件：

cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc

set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
  set background=dark
endif

" End /etc/vimrc
EOF

set nocompatible 设置让 vim 比 vi 兼容模式更有用。删掉 “no” 以保留旧的 vi 特性。set backspace=2 设置让退格跨越换行、自动缩进和插入的开始。syntax on 参数使 vim 能高亮显示语法。最后，带有 set background=dark 的 if 语句矫正了 vim 对于某些终端模拟器的背景颜色的估算。这让某些写在黑色背景上的程序的高亮色能有更好的调色方案。

用下面的命令可以获得其它选项的文档：

vim -c ':options'

注意

默认情况下，Vim 只安装了英文的拼写检查文件。要想安装你想要的语言的拼写检查文件， 请从 ftp://ftp.vim.org/pub/vim/runtime/spell/ 下载你所用语言的 *.spl 文件，可下也可不下的 *.sug 文件以及文字编码。并把它们保存到 /usr/share/vim/vim74/spell/。

要使用这些文件，需要设置 /etc/vimrc 里的某些项，例如：

set spelllang=en,ru
set spell

想要了解更多信息，请阅读上方 URL 里对应 README 文件。

6.69.3. Vim 软件包内容

安装的软件： ex （链接到 vim），rview （链接到 vim）， rvim （链接到 vim），vi （链接到 vim），view （链接到 vim），vim， vimdiff （链接到 vim），vimtutor，和 xxd
安装目录： /usr/share/vim

简要介绍

ex | 以 ex 模式启动 vim
rview | 是 view 的一个受限版本；不能启动 shell 命令，而且 view 无法暂停
rvim | 是 vim 的一个受限版本；不能启动 shell 命令，而且 vim 无法暂停
vi | 链接到 vim
view | 以只读模式启动 vim
vim | 就是这个编辑器
vimdiff | 用 vim 编辑一个文件的两到三个版本并显示它们的区别
vimtutor | vim基本热键和命令的教学
xxd | 将给定文件进行十六进制转储，还可以还原；所以它可以被用于打二进制补丁
翻译团队：LCTT 译者/校对：H-mudcup,ictlyh
  • 上一页

    Texinfo-5.2

  • 下一页

    关于调试符号


6.70. 关于调试符号

第六章 安装基本的系统软件

    Vim-7.4

  • 下一页

    再次清理无用内容

  • 返回
  • 主页

6.70. 关于调试符号

默认情况下大多数程序和库的编译带有调试符号。（类似 gcc 的 -g 选项。）这意味着当你调试一个包含调试信息的已编译的程序或库时，调试程序不仅能提供内存地址，还能提供变量和实例的名字。

然而，包含这些调试符号明显的增大了程序或库。下面这个例子说明了这些符号有多么占地方：

  • 一个有调试符号的二进制 bash : 1200 KB

  • 一个无调试符号的二进制 bash : 480 KB

  • 有调试符号的 Glibc 和 GCC 文件 (/lib 和 /usr/lib): 87 MB

  • 无调试符号的 Glibc 和 GCC 文件: 16 MB

大小可能会因为所使用的编译器和 C 语言库的不同而改变，但是当比较有无调试符号的程序时，大小可能相差 2 到 5 倍。

因为大多数用户从来不会在他们的系统软件上使用调试器，没了这些调试符号可以省下很多磁盘空间。下一页将会告诉你如何剥离程序和库中所有的调试符号。

翻译团队：LCTT 译者/校对：H-mudcup,wxy
  • 上一页

    Vim-7.4

  • 下一页

    再次清理无用内容


6.71. 再次清理无用内容

第六章 安装基本的系统软件

    关于调试符号

  • 下一页

    清理

  • 返回
  • 主页

6.71. 再次清理无用内容

如果预期的用户不是一个程序员或者不打算对系统软件进行任何调试，通过从二进制文件和库中删除调试符号能减少 90MB 的系统大小。除了不能完全调试软件，这不会导致任何不便。

大部分人使用下面提到的命令并不会感到任何困难。然而，很容易出现错误并导致新的系统不可用，因此在运行 strip 命令之前，对当前状态的 LFS 系统进行备份是个好主意。

在进行清理无用内容之前，格外注意确保要删除的二进制文件没有正在运行。如果用 章节 6.4, “进入 Chroot 环境,” 的命令不确定用户是否进入了 chroot，首先从 chroot 退出：

logout

然后用下面的命令重新进入：

chroot $LFS /tools/bin/env -i            \
    HOME=/root TERM=$TERM PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin   \
    /tools/bin/bash --login

然后可以安全地清除二进制文件和库：

/tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
    -exec /tools/bin/strip --strip-debug '{}' ';'

该命令会报告有很大数目的文件不能识别它们的格式。你可以安全地忽略这些警告。这些警告表示这些文件是脚本而不是二进制文件。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    关于调试符号

  • 下一页

    清理


6.72. 清理

第六章 安装基本的系统软件

    再次清理无用内容

  • 下一页

    基本系统配置

  • 返回
  • 主页

6.72. 清理

最后，清除运行测试留下来的多余文件：

rm -rf /tmp/*

从现在开始，要在退出后重新进入 chroot 环境，用下面更改后的 chroot 命令：

chroot "$LFS" /usr/bin/env -i              \
    HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
    PATH=/bin:/usr/bin:/sbin:/usr/sbin     \
    /bin/bash --login

这样做的原因是不再需要 /tools 中的程序。由于不再需要，你可以删除 /tools 目录。

注意

移除 /tools 也会删除用于运行工具链测试的 Tcl、 Expect、 和 DejaGNU 的临时复制。如果你在后面还需要这些程序，需要重新编译并安装它们。BLFS 手册有关于这些的指令(请查看 http://www.linuxfromscratch.org/blfs/)。

rm -rf /tools

如果通过手动或者重启卸载了虚拟内核文件系统，重新进入 chroot 的时候确保挂载了虚拟内核文件系统。在 Section 6.2.2, “挂载和激活 /dev” 和 Section 6.2.3, “挂载虚拟内核文件系统” 中介绍了该过程。

翻译团队：LCTT 译者/校对：ictlyh,wxy
  • 上一页

    再次清理无用内容

  • 下一页

    基本系统配置


第七章 基本系统配置

第三部分 构建 LFS 系统

    清理

  • 下一页

    简介

  • 返回
  • 主页

7. 基本系统配置

目录

  • 简介
  • 通用网络配置
  • LFS 系统中的设备和模块管理
  • 创建自定义符号链接到设备
  • 配置系统时间
  • 配置 Linux 控制台
  • 系统区域设置
  • 创建 /etc/inputrc 文件
  • 创建 /etc/shells 文件
  • Systemd 的用法与配置
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    清理

  • 下一页

    简介


7.1. 简介

第七章 基本系统配置

    基本系统配置

  • 下一页

    通用网络配置

  • 返回
  • 主页

7.1. 简介

这一章将会讲解配置文件和 systemd 服务。首先，给出了设置网络需要的通用配置文件。

  • 7.2 节, “通用网络配置”

  • 7.2.3 节, “配置系统主机名称”

  • 7.2.4 节, “自定义 /etc/hosts 文件”

然后，讨论可能影响正确的设备配置的问题。

  • Section 7.3, “LFS 系统中的设备和模块管理”

  • Section 7.4, “创建自定义符号链接到设备”

第三步，配置系统时间和键盘布局。

  • Section 7.5, “配置系统时间”

  • Section 7.6, “配置 Linux 控制台”

第四步，简单介绍当用户登录系统时用到的脚本和配置文件。

  • 7.7 节, “系统区域设置”

  • 7.8 节, “创建 /etc/inputrc 文件”

  • 7.9 节, “创建 /etc/shells 文件”

最后，配置 systemd。

  • 7.10 节, “Systemd 的用法和配置”

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    基本系统配置

  • 下一页

    通用网络配置


7.2. 通用网络配置

第七章 基本系统配置

    简介

  • 下一页

    LFS 系统中的设备和模块管理

  • 返回
  • 主页

7.2. 通用网络配置

本节仅在需要配置网卡时参考。

7.2.1. 网络接口配置文件

从版本 209 开始，systemd 提供了一个名为 systemd-networkd 命令用于处理基本的网络配置。

systemd-networkd 的配置文件可能在 /usr/lib/systemd/network 或 /etc/systemd/network 中，其中 /etc/systemd/network 中的配置文件优先级更高。

有三种配置文的类型：.link，.netdev 和 .network 。可以通过查阅 man 手册的 systemd-link(5)，systemd-netdev(5) 和 systemd-network(5) 可以获得更多关于这些配置文件的详细介绍。

注意

udev 可能根据你电脑的物理设备特性将网卡接口设置为不同的名称，比如 enp2s1。如果你不能确定你的网卡名称，可以在系统启动后执行 ip link 命令查看。

译者注：通过执行 ip link 命令，你应该能够取得类似以下的输出：

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT
   group default qlen 1000
    link/ether fc:aa:14:2d:db:a1 brd ff:ff:ff:ff:ff:ff
3: wlp0s20u9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group
   default qlen 1000
    link/ether 0c:82:68:52:85:57 brd ff:ff:ff:ff:ff:ff

其中斜体的部分就是物理网卡的名称。

以下内容摘录于 ArchLinux wiki：

对于有多块网卡的电脑，固定设备名称很重要。许多配置问题都是由于网络接口名称变化引起的。

udev 负责给设备命名。Systemd v197 引入了可预测的网络接口名称自动给网络设备分配静态名称，网络接口现在是以前缀 en（以太网）、wl（WLAN）、或者 ww（WWAN）附上一个自动生成的标识符，产生了一个类似于 enp2s1 的条目。

7.2.1.1. 静态 IP 配置

通过以下的命令创建静态 IP 的基本配置文件：

cat > /etc/systemd/network/10-static-eth0.network << "EOF"
[Match]
Name=eth0

[Network]
Address=192.168.0.2/24
Gateway=192.168.0.1
DNS=192.168.0.1
EOF

在配置文件中，可以指定多个 DNS 条目。

7.2.1.2. DHCP 配置

通过以下的命令创建 DHCP 的基本配置文件：

cat > /etc/systemd/network/10-dhcp-eth0.network << "EOF"
[Match]
Name=eth0

[Network]
DHCP=yes
EOF

需要注意的是，当前 systemd-networkd 仅能够处理 DHCPv4。DHCPv6 的支持正在快马加鞭的筹划中。

7.2.2. 创建 /etc/resolv.conf 文件

如果你的系统需要连接到互联网，它需要利用 DNS 服务将互联网域名解析为实际的 IP 地址，反之亦然。最好的方法是将从 ISP 或者是网络管理员那里取得的 DNS 服务器地址填入 /etc/resolv.conf。

如果需要静态的 /etc/resolv.conf 文件，请使用以下命令：

cat > /etc/resolv.conf << "EOF"
# Begin /etc/resolv.conf

domain <Your Domain Name>
nameserver <IP address of your primary nameserver>
nameserver <IP address of your secondary nameserver>

# End /etc/resolv.conf
EOF

domain 声明可以忽略或者以 search 声明替换。参考 man 手册的 resolv.conf 部分获得更多信息。

其中，<IP address of the nameserver> 替换为最合适的 DNS 的 IP 地址。通常会有多个条目（需要备选服务器具有相关兼容性）。如果你只需要一台 DNS 服务器，请不要输入第二行 nameserver 的内容。该 IP 地址也可以是本地网络中的一台路由。

注意

Google 公开 IPv4 DNS 解析服务器地址为 8.8.8.8 和 8.8.4.4。
（译者注：国内也有一些 IT 公司提供公开可用的 DNS 解析服务：
114 DNS：114.114.114.114 和 114.114.115.115
阿里 DNS：223.5.5.5 和 223.6.6.6
百度 DNS：180.76.76.76
OpenDNS：208.67.220.220）

当使用 systemd-networkd 配置网络，另一个守护进程 systemd-resolved 将会创建 /etc/resolv.conf 文件。然后在早先版本中此文件的路径并不标准，因此你需要使用以下的命令创建到标准位置的链接：

ln -sfv /run/systemd/resolve/resolv.conf /etc/resolv.conf

对于在 .network 文件中指定了 DNS 或者使用内置 DHCP 客户端获得 DNS 这两种情况，必须要做如上操作。

7.2.3. 配置系统主机名称

在系统启动过程中，/etc/hostname 文件用于创建系统的主机名称。

通过以下命令创建 /etc/hostname 文件：

echo "<lfs>" > /etc/hostname

<lfs> 替换为你想要设置的名称。请不要输入完整域名（Fully Qualified Domain Name，FQDN），它应该在 /etc/hosts 文件中。

7.2.4. 自定义 /etc/hosts 文件

将确定IP地址、完整域名（Fully-Qualified Domain Name，FQDN）和可能的别名填入/etc/hosts 文件中。语法是：

IP_address myhost.example.org aliases

除非当前电脑对互联网可见（即已经注册有域名且分配有效的 IP 段——放心吧，大多数用户都没有），否则请确保 IP 地址位于专有网络 IP 段。有效的范围是：

私人网络地址范围     		正常前缀
10.0.0.1 - 10.255.255.254           8
172.x.0.1 - 172.x.255.254           16
192.168.y.1 - 192.168.y.254         24

x 为 16-31 之间的任意值。Y 为 0-255 之间的任意值。

有效的专有 IP 地址形如 192.168.1.1，有效的完整域名形如 lfs.example.org。

就算没有网卡，也应该提供有效的完整域名，否则某些软件可能无法正常运行。

通过以下命令创建 /etc/hosts 文件：

cat > /etc/hosts << "EOF"
# Begin /etc/hosts (network card version)

127.0.0.1 localhost
::1       localhost
<192.168.0.2> <HOSTNAME.example.org> [alias1] [alias2] ...

# End /etc/hosts (network card version)
EOF

<192.168.0.2> 和 <HOSTNAME.example.org> 应该更改为需要设置的值（如果此 IP 地址是由网络/系统管理员分配的且电脑可以连接到存在的网络）。别名可以省略。

如果暂时不打算进行以上的配置，那直接运行下面的命令创建最通用的 /etc/hosts 文件：

cat > /etc/hosts << "EOF"
# Begin /etc/hosts (no network card version)

127.0.0.1 <HOSTNAME.example.org> <HOSTNAME> localhost
::1       localhost

# End /etc/hosts (no network card version)
EOF

::1 为 IPv6 对应的 127.0.0.1，且为 IPv6 的回环接口。

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    简介

  • 下一页

    LFS 系统中的设备和模块管理


7.3. LFS 系统中的设备和模块管理

第七章 基本系统配置

    通用网络设置

  • 下一页

    创建自定义符号链接到设备

  • 返回
  • 主页

7.3. LFS 系统中的设备和模块管理

在 第六章, 我们通过 systemd 的源码包安装好了 udev。在开始了解它是如何工作之前，我们先来简要的回顾下以前处理设备的方法。

传统的 Linux 不管硬件是否真实存在，都以创建静态设备的方法来处理硬件，因此需要在 /dev 目录下创建大量的设备节点文件(有时会有上千个)。这通常由 MAKEDEV 脚本完成，它通过大量调用 mknod 程序为这个世界上可能存在的每一个设备建立对应的主设备号和次设备号。

而使用 udev 方法，只有当内核检测到硬件接入，才会建立对应的节点文件。因为需要在系统启动的时候重新建立设备节点文件，所以将它存储在 devtmpfs 文件系统中（完全存在于内存中的虚拟文件系统）。设备节点文件无需太多的空间，所以占用的内存也很小。

7.3.1. 历史

2000 年 2 月，一种名叫 devfs 的文件系统被合并到 2.3.46 内核版本，2.4 系列的稳定内核中基本可用。尽管它存在于内核的源代码中，但是这种动态创建设备的方法却从来都得不到核心内核开发者的大力支持。

问题存在于它处理设备的检测、创建和命令的方式，其中最大的问题莫过于它对设备节点的命名方式。大部分开发者的观点是，设备的命名应该由系统的所有者决定，而不是开发者。 devfs 存在一个严重的设计缺陷：它存在严重的 race conditions 问题，如不对内核做大量的修改就无法修正这一问题。最终，因为缺乏有效的维护，在 2006 年 6 月终被移出内核源代码。

再后来，随着非稳定的 2.5 版本的内核开发，到稳定的 2.6 内核，又出现了一种全新的虚拟文件系统 sysfs。sysfs 的工作是将系统的硬件配置导入到用户空间进程。通过对用户空间可视化的改善，代替devfs 变得更加现实。

7.3.2. Udev 实现

7.3.2.1. Sysfs

上文简单的提及了 sysfs 文件系统。有些人可能会问，sysfs 到底是如何知道当前系统有哪些设备，这些设备又该使用什么设备号呢。对于那些已经编译进内核的设备，会在内核检测到时直接注册为 sysfs 对象（devtmpfs 内建）。对于编译为内核模块的设备，将会在模块载入的时候注册。一旦 sysfs 文件系统挂载到 /sys，已经在 sysfs 注册的硬件数据就可以被用户空间的进程使用， udevd 也就能够处理了（包括对设备节点进行修改）。

7.3.2.2. 设备节点的创建

设备文件是通过内核中的 devtmpfs 文件系统创建的。任何想要注册的设备都需要通过 devtmpfs （通过驱动程序核心）实现。每当一个 devtmpfs 实例挂载到 /dev，就会建立一个设备节点文件，它拥有固定 的名称、权限、所有者。

很短的时间之后，内核将给 udevd 一个 uevent。基于 /etc/udev/rules.d，/lib/udev/rules.d 和 /run/udev/rules.d 目录内文件指定的规则，udevd 将会建立到设备节点文件的额外符号链接，这有可能更改其权限，所有者，所在组，或者是更改 udevd 内建接口（名称）。

这三个目录下的规则都像 LFS-Bootscripts 包那样标有数字，所有三个目录都会统一到一起。如果 udevd 找不到和所创建设备相应的规则，它会保留 devtmpfs 里初始化时使用过的权限和属主。

7.3.2.3. 加载模块

编译成模块的设备驱动可能会包含别名。别名可以通过 modinfo 打印出来查看，一般是模块支持的特定总线的设备描述符。举个例子，驱动 snd-fm801 支持厂商 ID 为 0x1319 以及设备 ID 为 0x0801 的设备，它包含一个 “pci:v00001319d00000801sv*sd*bc04sc01i*” 的别名，总线驱动导出该驱动别名并通过 sysfs 处理相关设备。例如，文件 /sys/bus/pci/devices/0000:00:0d.0/modalias 应该会包含字符串 “pci:v00001319d00000801sv00001319sd00001319bc04sc01i00”。Udev 采用的默认规则会让 udevd 根据 uevent 环境变量 MODALIAS 的内容（它应该和 sysfs 里的 modalias 文件内容一样）调用 /sbin/modprobe，这样就可以加载在通配符扩展后能和这个字符串一致的所有模块。

在这个例子里，意味着，除了 snd-fm801 之外，一个已经废弃的（不是我们所希望的）驱动 forte 如果存在的话也会被加载。下面有几种可以避免加载多余驱动的方式。

内核本身也能够根据需要加载网络协议，文件系统以及 NLS 支持模块。

7.3.2.4. 处理热插拔/动态设备

在你插入一个设备时，例如一个通用串行总线（USB）MP3 播放器，内核检测到设备已连接就会生成一个 uevent。这个 uevent 随后会被上面所说的 udevd 处理。

7.3.3. 加载模块和创建设备时可能碰到的问题

在自动创建设备节点时可能会碰到一些问题。

7.3.3.1. 内核模块没有自动加载

Udev 只会加载包含有特定总线别名而且已经被总线驱动导出到 sysfs 下的模块。在其它情况下，你应该考虑用其它方式加载模块。采用 Linux-3.19，Udev 可以加载编写合适的 INPUT、IDE、PCI、USB、SCSI、SERIO 和 FireWire 设备驱动。

要确定你希望加载的驱动是否支持 Udev，可以用模块名字作为参数运行 modinfo。然后查看 /sys/bus 下的设备目录里是否有个 modalias 文件。

如果在 sysfs 下能找到 modalias 文件，那么就能驱动这个设备并可以直接操作它，但是如果该文件里没有包含设备别名，那意味着这个驱动有问题。我们可以先尝试不依靠 Udev 直接加载驱动，等这个问题以后解决。

如果在 /sys/bus 下的相应目录里没有 modalias 的话，意味着内核开发人员还没有为这个总线类型增加 modalias 支持。使用 Linux-3.19 内核，应该是 ISA 总线的问题。希望这个可以在后面的内核版本里得到解决。

Udev 不会尝试加载类似 snd-pcm-oss 这样的“封装”驱动，也不会加载类似 loop 这样的非硬件驱动。

7.3.3.2. 内核驱动没有自动加载，Udev 也没有尝试加载

如果是 “封装” 模块只是强化其它模块的功能（比如，snd-pcm-oss 模块通过允许 OSS 应用直接访问声卡的方式加强了 snd-pcm 模块的功能），需要配置 modprobe 在 Udev 加载硬件驱动模块后再加载相应的封装模块。可以在任意 /etc/modprobe.d/<filename>.conf文件里增加一行 “softdep”，例如：

softdep snd-pcm post: snd-pcm-oss

请注意 “softdep” 也支持 pre: 的依赖方式，或者混合 pre: 和 post:。查看 modprobe.d(5) 手册了解更多关于 “softdep” 语法和功能的信息。

如果问题模块不是一个封装而且也是有用的，配置 modules 开机脚本在引导系统的时候加载模块。这样需要把模块名字添加到 /etc/sysconfig/modules 文件里的单独一行。这个也可以用于封装模块，但是只是备用方式。

7.3.3.3. Udev 加载了一些无用模块

要么不要编译该模块，或者把它加入到模块黑名单 /etc/modprobe.d/blacklist.conf 里，像下面的例子里屏蔽了 forte 模块：

blacklist forte

被屏蔽的模块仍然可以用 modprobe 强行加载。

7.3.3.4. Udev 创建了错误的设备节点，或错误的软链接

这个情况通常是因为设备匹配错误。例如，一条写的不好的规则可能同时匹配到 SCSI 磁盘（希望加载的）和对应厂商的 SCSI 通用设备（错误的）。找出这条问题规则，并通过 udevadm info 命令的帮助改得更具体一些。

7.3.3.5. Udev 规则工作不可靠

这可能是上个问题的另一种表现形式。如果不是，而且你的规则使用了 sysfs 特性，那可能是内核时序问题，希望在后面版本内核里能解决。目前的话，你可以暂时建立一条规则等待使用的 sysfs 特性，并附加到 /etc/udev/rules.d/10-wait_for_sysfs.rules 文件里（如果没有这个文件就创建一个）。如果你碰到这种情形请通知 LFS 开发邮件列表，这个对我们有帮助。

7.3.3.6. Udev 没有创建设备

后面的内容会假设驱动已经静态编译进内核或已经作为模块加载，而且你也已经确认 Udev 没有创建相应的设备节点。

如果内核驱动没有将自己的数据导出到 sysfs 里，Udev 就没有相关信息来创建设备节点。这通常发生在内核树之外的第三方驱动里。我们可以使用合适的主/副设备数字 ID（查看内核文档里或第三方驱动厂商提供的文档里的 devices.txt 文件） 在 /lib/udev/devices 目录里创建一个静态设备节点。这个静态设备节点随后会被 udev 引导脚本复制到 /dev 里。

7.3.3.7. 设备名称顺序在重启后随机改变

这是因为 Udev 被设计成并行处理 uevents 并加载模块，所以是不可预期的顺序。这个不会“修复”。你不应该依赖稳定的内核模块名称。而是，在检测到设备的稳定特征，比如序列号或 Udev 安装的一些 *_id 应用的输出，来判断设备的稳定名称，之后创建自己的规则生成相应的软链接。可以参考 7.4, “创建自定义符号链接到设备”和7.2, “通用网络设置”。

7.3.4. 有用的读物

点击以下链接可以获得一些额外的帮助文档：

  • devfs 的用户空间实现：http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf

  • sysfs 文件系统： http://www.kernel.org/pub/linux/kernel/people/mochel/doc/papers/ols-2005/mochel.pdf

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    通用网络设置

  • 下一页

    创建自定义符号链接到设备


7.4. 创建自定义符号链接到设备

第七章 基本系统配置

    LFS 系统中的设备和模块处理

  • 下一页

    配置系统时间

  • 返回
  • 主页

7.4. 创建自定义符号链接到设备

7.4.1. 处理相似性质的设备

正如 章节 7.3, “LFS 系统中的设备和模块管理 ” 中解释的，具有相同功能的设备出现在 /dev 目录下的顺序是随机的。假如你有一个 USB 摄像头和一个电视调谐器，/dev/video0 有可能是 USB 摄像头，/dev/video1 是电视调谐器，有时候又可能是反过来的。对于除声卡和网卡外的设备，都可以通过创建自定义持久性符号链接的 udev 规则来固定。网卡如何设置请看 7.2, “通用网络配置”，网卡的相关设置请看 BLFS。

对于你所有的硬件，都有可能遇到此问题（尽管此问题可能在你当前的 Linux 发行版上不存在），在 /sys/class 或 /sys/block 目录下找到对应目录，比如，显卡可能的路径为 /sys/class/video4linux/videoX。找到该设备的唯一设备标识（通常，厂商和产品 ID 以及/或 序列号会有用）：

udevadm info -a -p /sys/class/video4linux/video0

然后通过写入规则建立符号链接：

cat > /etc/udev/rules.d/83-duplicate_devs.rules << "EOF"

# Persistent symlinks for webcam and tuner
KERNEL=="video*", ATTRS{idProduct}=="1910", ATTRS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", ATTRS{device}=="0x036f", ATTRS{vendor}=="0x109e", \
    SYMLINK+="tvtuner"

EOF

最终，/dev/video0 和 /dev/video1 依旧会随机分配给 USB 摄像头和电视调谐器，但是 /dev/tvtuner 和 /dev/webcam 将会固定的分配给正确的设备。

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    LFS 系统中的设备和模块管理

  • 下一页

    配置系统时间


7.5. 配置系统时间

第七章 基本系统配置

    创建自定义符号链接到设备

  • 下一页

    配置 Linux 控制台

  • 返回
  • 主页

7.5. 配置系统时间

本节将会讨论如何配置 systemd-timedated 系统服务，包括配置系统时间和时区。

如果你不确定是否将硬件时钟设置为 UTC，可以通过 hwclock --localtime --show 来查看。这将根据硬件时钟显示当前的时间。如果实现和手表的时间相同，应该是设置为本地时间了；如果时间不一致，应该是设置为 UTC 了。通过增减数小时，可以确定你所在时区。

systemd-timedated 读取 /etc/adjtime，且取决于该文件的内容是本地时间还是 UTC。

如果想要将硬件时钟设置为本地时间，使用以下命令建立 /etc/adjtime ：

cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF

如果第一次启动时 /etc/adjtime 文件不存在，systemd-timedated 会认为硬件时钟设置成 UTC 并且以此调整该文件。

你也可以使用 timedatectl 程序来告诉 systemd-timedated 你的硬件时钟是 UTC 还是本地时间：

timedatectl set-local-rtc 1

timedatectl 也可以用来更改系统时间和时区。

要更改当前系统时间，使用下面的命令：

timedatectl set-time YYYY-MM-DD HH:MM:SS

硬件时钟也会相应更新。

要更改当前时区，使用下面命令：

timedatectl set-timezone TIMEZONE

你可以通过运行下面命令查看可用时区列表：

timedatectl list-timezones

注意

请注意 timedatectl 命令只能用于通过 systemd 引导的系统。

7.5.1. 网络时间同步

从版本号 213 的 systemd 开始，包括了一个名为systemd-timesyncd 的守护进程，将能够和远程的 NTP 服务器同步时间。

此守护进程并不是为了取代已有的 NTP 服务，而是作为 SNTP 协议的实现客户端，它可用于更高级的任务和资源有限的系统。

从版本号 216 的 systemd 开始，systemd-timesyncd 守护进程默认启用，如果需要禁用，执行以下命令：

systemctl disable systemd-timesyncd

/etc/systemd/timesyncd.conf 文件也可以通过 systemd-timesyncd 同步来更改 NTP 服务。

需要注意的是，当使用本地时间作为系统时间时，systemd-timesyncd 无法更新硬件时钟。

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    创建自定义符号链接到设备

  • 下一页

    配置 Linux 控制台


7.6. 配置 Linux 控制台

第七章 基本系统配置

    配置系统时间

  • 下一页

    系统区域设置

  • 返回
  • 主页

7.6. 配置 Linux 控制台

（译者注：对于中文用户，因为大部分用户的键盘布局都是标准 us 键盘，所以大可忽略此文件的配置）

本节将会讨论如何配置 systemd-vconsole-setup 系统服务，包括配置控制台字体和控制台的键盘映射。

systemd-vconsole-setup 服务读取 /etc/vconsole.conf 中的配置信息，确定使用的键盘类型和屏幕的字体。http://www.tldp.org/HOWTO/HOWTO-INDEX/other-lang.html 页面有很多其它语言的 “HOWTO” 内容可以给你很多帮助。 localectl list-keymaps 可以列举出所有可用的终端键盘布局。/usr/share/consolefonts 目录提供了所有可用的字体。

/etc/vconsole.conf 的每一行都应该形如：VARIABLE="value"。以下列举了可用的 VARIABLE：

KEYMAP

此变量指定了键盘的按键映射表。如未设置，默认为 us。

KEYMAP_TOGGLE

此变量指定配置第二个切换键盘映射，默认不设置。

FONT

此变量指定虚拟控制台的字体。

FONT_MAP

此变量指定要使用的控制台映射。

FONT_UNIMAP

此变量指定 unicode 字体映射。

以下为德语键盘和和控制台的实例：

cat > /etc/vconsole.conf << "EOF"
KEYMAP=de-latin1
FONT=Lat2-Terminus16
EOF

你可以使用 localectl 实 用程序更改 KEYMAP 值：

localectl set-keymap MAP

注意

localectl 仅可用于 systemd 环境（译者注：你要是用 SysVinit 什么的就别用这个命令瞎捣乱了）。

localectl 实用程序跟随相应的参数也可以更改 X11 的键盘布局、模型、变形和选项：

localectl set-x11-keymap LAYOUT [MODEL] [VARIANT] [OPTIONS]

列出 localectl set-x11-keymap 参数的所有可能值，以下面列出的参数运行 localectl 命令（下面的 localectl set-x11-keymap 这个命令不能正确执行，所以到底是做什么的不知道）

list-x11-keymap-models

显示所有已知的 X11 键盘映射模型。

list-x11-keymap-layouts

显示所有已知的 X11 键盘映射布局。

list-x11-keymap-variants

显示所有已知的 X11 键盘映射变形。

list-x11-keymap-options

显示所有已知的 X11 键盘映射选项。

注意

想要使用以上的参数，你需要从 BLFS 中安装 Xkeyboard 软件包。

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    配置系统时间

  • 下一页

    系统区域设置


7.7. 系统区域设置

第七章 基本系统配置

    配置 Linux 控制台

  • 下一页

    创建 /etc/inputrc 文件

  • 返回
  • 主页

7.7. 系统区域设置

本地语言的支持依赖于 /etc/locale.conf，/etc/locale.conf 包含不少于此相关的环境变量。更改此文件后，可能会出现以下的变化：

  • 大量的程序界面语言的本地化

  • 修正字符在字母、数字和其它类的分类。对于非英语区域设置来说，只有这样，bash 才能正常显示非 ASCII 字符

  • 国家顺序可以按照字母顺序正常排序（译者注：这里所谓的正常排序，应该是首先将国家名称转换成本地语言的国家名称，比如中国的开头字母是 Z，那么显示就很靠后了。但是假如显示为英文，就是 C 开头，那么将会靠前显示。）

  • 默认纸张尺寸

  • 货币、时间和日期值的格式

/etc/locale.conf 中 <ll> 使用语言代码代替（比如中文是 zh，英文是 en），<CC> 使用国家代码代替（比如中国是 CN，中国香港是 HK，中国台湾是 TW，美国是 US），<charmap> 使用选定字符集指定的标准字符映射表替换。诸如 “@euro” 这样的可选修饰符也可使用。

运行以下命令可以获得当前 Glibc 支持的本地字符集。

locale -a

字符映射表可能存在很多的别名，比如 “ISO-8859-1” 可以写作 “iso8859-1” 或 “iso88591”。但是有一些程序不支持这些乱七八糟的写法（比如 UTF-8 只能写作 UTF-8，utf8 它就不认识了）。所以，为了安全起见，在设置的时候还是尽量的使用特定区域设置的规范名称。可以通过以下命令，查询在特定区域下的 字符映射表标准名称，<locale name> 为运行 locale -a 输 出的首选区域设置（这里以 zh_CN.utf8 为例）。

LC_ALL=<locale name> locale charmap

对于 “zh_CN.utf8” 以上命令将会如下输出：

UTF-8

根据以上输出，我们再次修改 /etc/locale.conf， 将字符映射表设置为标准形式（zh_CN.utf8 变为 zh_CN.UTF-8）。同理，也可一并查询以下设置的标准命令，然后将其添加到 bash 的启动文件中（译者注：对于 bash 来说，启动文件为 .bashrc）。

LC_ALL=<locale name> locale language
LC_ALL=<locale name> locale charmap
LC_ALL=<locale name> locale int_curr_symbol
LC_ALL=<locale name> locale int_prefix

以上的命令将会打印当前区域设置的语言、字符编码、本地货币单位以及电话国际编码。如果出现类似下文的错误输出，可能是你没有严格按照第六章指导的方法操作或者是你当前所用的 Glibc 不支持。

locale: Cannot set LC_* to default locale: No such file or directory

如果这种情况真的发生，你应该使用 localedef 命令安装对应的系统区域，或者是考虑更改为其它的区域。假如没有出现错误提示，我们就可以继续进行下一步操作了！

有一些 LFS 之外的包可能出现对你设置的区域支持很差劲的情况。比如 X 的库（X Windows System 的一部份），就可能在内部文件中输出以下消息：

Warning: locale not supported by Xlib, locale set to C

在若干情况下，Xlib 希望以带规范破折号的大写形式列出字符映射表。比如 "ISO-8859-1" 而不应该写作 "iso88591"。不过，也可以通过去除区域规范中的字符映射部分找到合适的规范。这可以通过运行 locale charmap 命令来检查。例如，需要更改 "de_DE.ISO-8859-15@euro" 为 "de_DE@euro" 以便 Xlib 能识别区域。

即便如此，也可能遇到某些程序因为区域设置和它们预置的不同而导致功能异常（可能不会显示任何的错误消息）。如果出现这样的情况，可以通过查看其它的发行版是如何进行设置区域，从而得到启发。

一旦确定了到底该使用哪个区域设置，就可以创建 /etc/locale.conf 文件了：

cat > /etc/locale.conf << "EOF"
LANG=<ll>_<CC>.<charmap><@modifiers>
EOF

也可以通过 systemd 提供的实用程序 localectl 修改 /etc/locale.conf：

localectl set-locale LANG="<ll>_<CC>.<charmap><@modifiers>"

此处，也可以指定其它和语言相关的环境变量，例如 LANG，LC_CTYPE，LC_NUMERIC 或任何其它 locale 输出的环境变量，只需要用一个空格分开它们就可以了。以下示例中，LANG 设置为 en_US.UTF-8，但 LC_CTYPE 设置为 en_US：

localectl set-locale LANG="en_US.UTF-8" LC_CTYPE="en_US"

注意

localectl 仅可用于 systemd 环境（译者注：你要是用 SysVinit 什么的就别用这个命令瞎捣乱了）。

“C” （默认）和 “en_US” （推荐美国英语用户使用）这两种区域设置有所不同。“C” 使用 US-ASCII 7 位字符集，并把设置了最高位的字节作为无效字符。这就是为什么类似 ls 的命令本地化时会用疑问号代替。 同样，如果你想要使用 Mutt 或 Pine 发送包含有类似字符的邮件，将会得到如下消息：非 RFC 兼容字符（发送邮件中的字符集为 “unknown 8-bit”）。 所以，如果你一定以及肯定一定不会用到 8 位的字符，那你可以仅使用“C”。

不少程序还不支持 UTF-8 区域设置。我们正在完善文档并修复类似问题，可以查看 http://www.linuxfromscratch.org/blfs/view/systemd/introduction/locale-issues.html。

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    配置 Linux 控制台

  • 下一页

    创建 /etc/inputrc 文件


7.8. 创建 /etc/inputrc 文件

第七章 基本系统配置

    系统区域设置

  • 下一页

    创建 /etc/shells 文件

  • 返回
  • 主页

7.8. 创建 /etc/inputrc 文件

inputrc 文件的作用是告知系统应该以怎样的键盘布局处理键盘。此文件对于 readline（readline： GNU readline library，和输入紧密相关的库）或者是一些 shell （例如 bash 等）来说十分重要。

对于大部分用户来说，都不使用那些奇奇怪怪的键盘映射，所以，可以通过以下的命令建立一个全局的 /etc/inputrc 以供所有用户使用。如果需要更改某一个用户的键盘映射，仅需要在那个用户的 HOME 目录下建立一个 .inputrc 文件，然后修改对应的键盘映射就可以了。

如果需要了解更多有关如何编辑 inputrc 文件的信息，可以查看 info bash 中 Readline Init File 一节。其实查看 info readline 也可以获得不少有用的东西啦。

下面显示的就是通用的 inputrc 文件，其中包含有 “#” 的都是注释行（需要注意的是，此文件不支持在设置后跟随注释）。使用以下命令创建此文件：

cat > /etc/inputrc << "EOF"
# Begin /etc/inputrc
# Modified by Chris Lynn <roryo@roryo.dynup.net>

# Allow the command prompt to wrap to the next line
set horizontal-scroll-mode Off

# Enable 8bit input
set meta-flag On
set input-meta On

# Turns off 8th bit stripping
set convert-meta Off

# Keep the 8th bit for display
set output-meta On

# none, visible or audible
set bell-style none

# All of the following map the escape sequence of the value
# contained in the 1st argument to the readline specific functions
"\eOd": backward-word
"\eOc": forward-word

# for linux console
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[3~": delete-char
"\e[2~": quoted-insert

# for xterm
"\eOH": beginning-of-line
"\eOF": end-of-line

# for Konsole
"\e[H": beginning-of-line
"\e[F": end-of-line

# End /etc/inputrc
EOF
翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    系统区域设置

  • 下一页

    创建 /etc/shells 文件


7.9. 创建 /etc/shells 文件

第七章 基本系统配置

    创建 /etc/inputrc 文件

  • 下一页

    Systemd 的用法与配置

  • 返回
  • 主页

7.9. 创建 /etc/shells 文件

shells 文件是当前系统所有可用 shell 的列表文件。应用程序通过读取它可以知道需要使用的 shell 是否有效。每行指定一个可用的 shell，且需要为绝对路径。

例如，当非特权用户想要使用chsh 命令更改自己登录所用的 shell 时。如果命令没有在 /etc/shell 中找到，那么将会拒绝更改。

这个文件对于某些程序来说是必需的，比如 GDM 在找不到 /etc/shells 时就不会放置浏览器，还有 FTP 守护进程通常会禁止使用不在这个文件里列出终端的用户登录。

cat > /etc/shells << "EOF"
# Begin /etc/shells

/bin/sh
/bin/bash

# End /etc/shells
EOF

最近一次更新 2007-04-04 14:42:53 -0500

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    创建 /etc/inputrc 文件

  • 下一页

    Systemd 的用法与配置


7.10. Systemd 的用法与配置

第七章 基本系统配置

    建立 /etc/shells 文件

  • 下一页

    让 LFS 可以启动

  • 返回
  • 主页

7.10. Systemd 的用法与配置

7.10.1. 基本配置

/etc/systemd/system.conf 文件包含了大量的 systemd 控制命令。假如未作任何的更改，文件中的所有行应该都是注释掉的，这代表了 systemd 正使用默认的运行方式。这个文件中可以设置日志级别，可以修改日志的基本设置。所有设置项都可以在 man 手册的 systemd-system.conf(5) 中查看。

7.10.2. 禁用启动时清屏

默认情况下，systemd 将会在系统启动快要结束的时候清屏。如不需要，使用以下操作禁用：

mkdir -pv /etc/systemd/system/getty@tty1.service.d

cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
[Service]
TTYVTDisallocate=no
EOF

拥有 root 权限的账户总是可以通过 journalctl -b 查看启动信息。

7.10.3. 禁止 /tmp 使用 tmpfs

默认情况下，/tmp 使用 tmpfs 文件系统。如不需要，使用以下操作禁用：

ln -sfv /dev/null /etc/systemd/system/tmp.mount

如果已经为 /tmp 在 /etc/fstab 中指定了专门的分区，那么此操作是多余的。

7.10.4. 配置自动创建和删除文件

有这样几个服务可以建立或删除文件/目录：

  • systemd-tmpfiles-clean.service

  • systemd-tmpfiles-setup-dev.service

  • systemd-tmpfiles-setup.service

系统配置文件在 /usr/lib/tmpfiles.d/*.conf 中。本地配置文件在 /etc/tmpfiles.d 中。 /etc/tmpfiles.d 中的文件会覆盖 /usr/lib/tmpfiles.d 中相同名称的文件。 （译者注：首先读取系统范围配置文件，再读取用户范围配置文件，用户范围配置文件会覆盖系统范围配置文件的相同部分。）可以在 man 手册的 tmpfiles.d(5) 中获取文件格式详情。

7.10.5. 覆盖默认服务的行为

可以通过在 /etc/systemd/system 下新建配置文件的方法改变 systemd 服务的默认行为。例如：

mkdir -pv /etc/systemd/system/foobar.service.d

cat > /etc/systemd/system/foobar.service.d/foobar.conf << EOF
[Service]
Restart=always
RestartSec=30
EOF

可以在 man 手册的 systemd.unit(5) 中查询更多信息。创建好文件之后，请运行 systemctl daemon-reload 和 systemctl restart foobar 激活所做更改。

7.10.6.调试启动顺序

有一些命令可以帮助分析 systemd 启动进程，例如：

  • systemctl list-units -t service [--all]

  • systemctl list-units -t target [--all]

  • systemctl show -p Wants multi-user.target

  • systemctl status sshd.service

翻译团队：LCTT 译者/校对：zpl1025,wxy,dongfengweixiao,ictlyh
  • 上一页

    创建 /etc/shells 文件

  • 下一页

    让 LFS 可以启动


第八章 让 LFS 系统可引导

第三部分 构建 LFS 系统

    Systemd 的用法与配置

  • 下一页

    简介

  • 返回
  • 主页

第八章 让 LFS 系统可引导

目录

  • 简介
  • 创建 /etc/fstab 文件
  • Linux-3.19
  • 使用 GRUB 设置启动过程
翻译团队：LCTT 译者/校对：zpl1025,wxy,ictlyh
  • 上一页

    Systemd 的用法与配置

  • 下一页

    简介


8.1. 简介

第八章 让 LFS 系统可引导

    让 LFS 系统可引导

  • 下一页

    创建 /etc/fstab 文件

  • 返回
  • 主页

8.1. 简介

是时候该让 LFS 系统可以启动了。本章节将讨论以下内容：创建 fstab 文件、为新的 LFS 系统编译内核、安装 GRUB 引导器。如此，就可以在电脑启动的时候选择启动 LFS 系统了。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy,ictlyh,zpl1025
  • 上一页

    让 LFS 系统可引导

  • 下一页

    创建 /etc/fstab 文件


8.2. 创建 /etc/fstab 文件

第八章 让 LFS 系统可引导

    简介

  • 下一页

    Linux-3.19

  • 返回
  • 主页

8.2. 创建 /etc/fstab 文件

/etc/fstab 文件的作用是让其它程序确定存储设备的默认挂载点、挂载参数和检查信息（例如完整性检测）。仿照以下格式新建一个 file system table（fstab）文件：

cat > /etc/fstab << "EOF"
# Begin /etc/fstab

# 文件系统  挂载点  文件类型     挂载选项             dump  fsck
#                                                              order

/dev/<xxx>     /            <fff>    defaults            1     1
/dev/<yyy>     swap         swap     pri=1               0     0

# End /etc/fstab
EOF

其中，<xxx>， <yyy> 和 <fff> 请使用适当的值替换。例如 sda2，sda5 和 ext4。关于文件中六个字段的含义，请查看 man 5 fstab（译者注：fsck 列的数值来决定需要检查的文件系统的检查顺序。允许的数字是0, 1, 和2。根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为 2。0 表示设备不会被 fsck 所检查。）。

基于 MS-DOS 或者是来源于 Windows 的文件系统（例如：vfat，ntfs，smbfs，cifs，iso9660，udf）需要在挂载选项中添加 “ iocharset”，才能让非 ASCII 字符的文件名正确解析。此选项的值应该与语言区域设置的值相同，以便让内核能正确处理。此选项在相关字符集定义已为内核内建或是编译为模块时生效（在文件系统 -> 本地语言支持中查看）。此外，vfat 和 smbfs 还需启用 “codepage” 支持。例如，想要挂载 USB 闪存设备，zh-CN.GBK 用户需要在 /etc/fstab 中添加以下的挂载选项：

noauto,user,quiet,showexec,iocharset=gbk,codepage=936

对于 zh_CN.UTF-8 用户的对应选项是：

noauto,user,quiet,showexec,iocharset=utf8,codepage=936

注意

在后一种情况下，内核将会输出以下的信息：

FAT: utf8 is not a recommended IO charset for FAT filesystems,
    filesystem will be case sensitive! （FAT: 对于 FAT 文件系统而言并不推荐将 utf8 作为 IO 字符集参数，需要小心文件系统出错！）

此提示信息其实是错误的，忽略它就好，因为在 UTF-8 模式下， “iocharset” 的任何其它选项都会导致错误的文件名显示。

此外，还有可能在内核的配置过程中就指定一些文件系统的默认代码页和 iocharset 值。相关参数有 “默认 NLS 选项” (CONFIG_NLS_DEFAULT)，“默认远程 NLS 选项” (CONFIG_SMB_NLS_DEFAULT)，“ FAT 默认代码页” (CONFIG_FAT_DEFAULT_CODEPAGE)，和 “ FAT 默认 IO 字符集” (CONFIG_FAT_DEFAULT_IOCHARSET)。不过，无法在内核编译阶段指定 ntfs 文件系统的设置。

另外，一些硬盘类型在遇到电源故障时，假如在 /etc/fstab 中使用 barrier=1 这个挂载选项，则会让 ext3 文件系统的数据更加安全。如需检查磁盘是否支持此选项，请运行 hdparm。例如：

hdparm -I /dev/sda | grep NCQ

如果有输出内容，则代表选项可用。

注意：基于 Logical Volume Management (LVM) 的分区不可使用 barrier 选项。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy,ictlyh,zpl1025
  • 上一页

    简介

  • 下一页

    Linux-3.19


8.3. Linux-3.19

第八章 让 LFS 系统可引导

    创建 /etc/fstab 文件

  • 下一页

    使用 GRUB 设置启动过程

  • 返回
  • 主页

8.3. Linux-3.19

Linux 软件包包含 Linux 内核。

大概编译时间：3.0 - 49.0 SBU (一般 6 SBU)
所需磁盘空间：700 - 6800 MB (一般 800-900 MB)

8.3.1. 安装内核

编译内核包括以下步骤—配置、编译和安装。阅读内核源码树中的 README 可以获得替代本手册配置的方法。

注意

本章节里的命令都要在 chroot 环境下运行。如果因为某种原因（比如说重启）离开了这个环境，请保证要按照 6.2.2,“挂载和激活/dev” 和 6.2.3,“挂载虚拟内核文件系统” 里所说的那样挂载虚拟内核文件系统，然后按照 6.72. 清理 介绍的方法重新进入 chroot 环境。否则运行下面的 make 命令会提示段错误。并进入源码目录（sources），解压 Linux-3.19.tar.gz 文件并进入解压后的目录。

运行以下命令准备编译：

make mrproper

这将保证内核树的绝对干净。内核小组建议在每次编译之前都执行此命令，无用的代码将会在解压后删除。

通过菜单界面配置内核。配置内核的一般信息请查看：http://www.linuxfromscratch.org/hints/downloads/files/kernel-configuration.txt。BLFS 包含有一些内核的特殊配置，可以查看：http://www.linuxfromscratch.org/blfs/view/systemd/longindex.html#kernel-config-index. 内核配置和编译的附加信息可查看：http://www.kroah.com/lkn/

注意

配置内核的一个好的起点是运行 make defconfig。这样会参考你的机器架构生成一份基本能用的基础配置。

注意要确保打开或关闭下面这些特性，否则系统也许不能正常工作甚至根本无法启动：

General setup  --->
  [*] open by fhandle syscalls [CONFIG_FHANDLE]
  [ ] Auditing support [CONFIG_AUDIT]
  [*] Control Group support [CONFIG_CGROUPS]
Processor type and features  --->
  [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP]
Networking support  --->
  Networking options  --->
    <*> The IPv6 protocol [CONFIG_IPV6]
Device Drivers  --->
  Generic Driver Options  --->
    [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
    [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
    [ ] Fallback user-helper invocation for firmware loading [CONFIG_FW_LOADER_USER_HELPER]
Firmware Drivers  --->
    [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID]
File systems  --->
  [*] Inotify support for userspace [CONFIG_INOTIFY_USER]
  <*> Kernel automounter version 4 support (also supports v3) [CONFIG_AUTOFS4_FS]
  Pseudo filesystems  --->
    [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL]
    [*] Tmpfs extended attributes [CONFIG_TMPFS_XATTR]

注意

尽管 "The IPv6 Protocol" 不是必须打开，但它是 systemd 开发人员强烈推荐的。

上述配置项的一些原理说明：

Support for uevent helper

打开这个选项会影响 Udev/Eudev 设备管理。

Maintain a devtmpfs

这个选项允许内核在 Udev 运行之前就创建自动设备节点。之后 Udev 在这个基础上运行，管理权限以及增加软链接。对于所有 Udev/Eudev 用户，这个配置项是必须的。

make LANG=<host_LANG_value> LC_ALL= menuconfig

make 参数的含义：

LANG=<host_LANG_value> LC_ALL=

使用主机的语言环境。这样就方便在使用 menuconfig 时显示合适的 ncurse 界面，它在 linux 字符终端里显示 UTF-8 字符。

注意把 <host_LANG_value> 替换为自己主机上环境变量 $LANG 的值。如果这个变量没有设定，你可以使用变量 $LC_ALL 或 $LC_CTYPE 的值代替。

另外，make oldconfig 在某些情况下可能更合适。查看 README 文件了解更多信息。

想偷懒的话，可以拷贝主机系统的内核配置文件 .config（如果有的话）到解压后的 linux-3.19 目录下来跳过内核配置。不过，我们不建议这样做。最好是探索一下整个内核配置菜单，从最开始配置内核。

编译内核映像和模块：

make

如果使用内核模块，需要 /etc/modprobe.d 文件里的模块配置。关于模块和内核配置的信息可以查看 7.3, “LFS 系统中的设备和模块控制” 以及 linux-3.19/Documentation 目录下的内核文档。 还有，modprobe.d(5) 也可以看一下。

如果内核配置里用到，需要安装模块：

make modules_install

在内核编译完成后，还需要一个额外步骤来完成安装。有些文件需要拷贝到 /boot 目录下。

内核映像文件所在的实际目录根据主机系统架构可能会不一样。下面的文件名你也可以改成你喜欢的，不过开头最好是 vmlinuz 才可以兼容下一节要讲的配置引导过程的自动设定。下面的命令假设主机是 x86 架构：

cp -v arch/x86/boot/bzImage /boot/vmlinuz-3.19-lfs-7.7-systemd

System.map 是内核的符号文件。它映射了每一个内核 API 函数的入口，以及内核运行时的数据结构地址。是调试内核问题时的资源。运行下面的命令安装映射文件：

cp -v System.map /boot/System.map-3.19

在之前命令 make menuconfig 里生成的内核配置文件 .config 包含了当前编译的内核的所有配置。最好能保存下来留作参考：

cp -v .config /boot/config-3.19

安装 Linux 内核文档：

install -d /usr/share/doc/linux-3.19
cp -r Documentation/* /usr/share/doc/linux-3.19

需要注意一下内核源代码目录下的文件属主并不是 root。在以 root 用户解压包的时候（我们在 chroot 环境里做的），解压出来的文件会拥有生成这个包的电脑里用户和组。在安装其他包的时候这并不是问题，因为它们的源代码在安装完后就删除了。不过，Linux 内核的源代码经常会保留比较长时间。这样的话，就有可能会把软件包作者的用户 ID 对应到本机的某个用户上。从而这个用户就会拥有内核源代码的写权限。

如果要保留内核源代码的虎啊，对目录 linux-3.19 运行 chown -R 0:0 命令来保证所有文件属主更改为 root。

警告

一些内核文档里建议创建软链接 /usr/src/linux 指向内核源代码目录。这是 2.6 及以前版本内核的特定要求，而在 LFS 系统里 一定不要 创建这个链接，因为这样的话，在你的基础 LFS 系统完成后安装某些软件包时可能引起问题。

警告

系统 include 目录（/usr/include）下的头文件应该 总是 和编译 Glibc 时用到的头文件保持一致，就是，在 6.7, “Linux-3.19 API 头文件” 里整理过的头文件。因此，它们 不能 替换成原始内核头文件或任何清理过的内核头文件。

8.3.2. 配置 Linux 模块加载顺序

虽然大多数情况下，Linux 模块自动加载就好，但是有时候需要特别指定加载顺序。modprobe 或 insmod 在加载模块时会读取 /etc/modprobe.d/usb.conf 。如果将 USB 设备（ehci_hcd、ohci_hcd 和 uhci_hcd） 编译为模块，则需要此文件，这样它们就会以正确的顺序加载。ehci_hcd 需要在 ohci_hcd 和 uhci_hcd 之前加载，否则在系统启动过程中将会输出警告。

运行以下命令建立 /etc/modprobe.d/usb.conf 文件：

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF

8.3.3. Linux 的内容

安装的文件：config-3.19, vmlinuz-3.19-lfs-7.7-systemd, and System.map-3.19
安装的目录：/lib/modules, /usr/share/doc/linux-3.19

简要说明

config-3.19 | 包含内核的所有配置选项
vmlinuz-3.19-lfs-7.7-systemd | Linux 系统的引擎。当电脑启动时，内核作为整个系统的第一部分载入。它首先检测和初始化所有的电脑硬件，然后将这些硬件模块抽象成文件树让软件访问，并把单个 CPU 转换成多任务系统，可以看上去同时地运行多个程序。
System.map-3.19 | 地址和符号列表；包含有入口点的映射以及所有函数和内核数据结构的地址
翻译团队：LCTT 译者/校对：zpl1025,dongfengweixiao,wxy,ictlyh
  • 上一页

    创建 /etc/fstab 文件

  • 下一页

    使用 GRUB 设置启动过程


8.4. 使用 GRUB 设置启动过程

第八章 让 LFS 系统可引导

    Linux-3.19

  • 下一页

    尾声

  • 返回
  • 主页

8.4. 使用 GRUB 设置启动过程

8.4.1. 简介

警告

对 GRUB 进行错误的配置可能会导致在没有外置启动设备（某些USB设备，某些 CD-ROM 等）的情况下无法正常的启动。你可能仅仅需要修改当前正在使用的引导器（比如：Grub-Legacy，GRUB2 或 LILO 等）的配置。

一定要确保你有一个可以引导的光盘或者是 U 盘以备不时之需，否则万一电脑真的不能启动谁都救不了你。如果你需要建立可引导的设备，可以按照以下方法操作（跳转到 BLFS 从 libisoburn 软件包安装 xorriso）。
（译者注：其实你手头可以备一个其它发行版的 LiveCD 制作的可引导 U盘，以备不时之需。Ubuntu、Fedora之类的都是上佳之选。）

cd /tmp
grub-mkrescue --output=grub-img.iso
xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso

8.4.2. GRUB 命名约定

GRUB 对于硬盘和分区自有一套命名规则（hdN,M），其中 N 是硬盘数，M 是分区号。硬盘数 N 从 0 开始计数，分区数需要区别对待——主分区从 1 开始计数而扩展分区从 5 开始计数。需要注意的是，和早期版本相比，计数方式都有所变化。例如，分区 sda1 是 (hd0,1)，sdb3 是 (hd1,3)。Linux 下，并不将 CD-ROM 设备假想为硬盘。例如，就算已有 CD 设备挂载为hdb，第二块硬盘挂载为 hdc，GRUB 依旧将第二块硬盘称为(hd1)。
（译者注：为什么这里扩展分区从 5 计数，可以查看 mbr 的相关知识。早期版本的 GRUB 是什么计算磁盘和分区数，我忘记了，不过，大家就记住新的就好啦。）

8.4.3. 配置配置文件

GRUB 会将一些数据写入硬盘的第一个物理扇区。这一部分不属于任何一个操作系统，在启动时，该部分数据激活，然后寻找 Grub 的模块，Grub 模块的默认位置为 /boot/grub/。

一种建议是使用一个独立的小分区（建议大小 100MB）专用于引导信息。那样的话，每一个发行版，不论是 LFS 还是其他的商业发行版，都能访问相同的引导文件而且任何已经启动的系统都能访问它。如果你选择这么做，你需要挂载这个独立分区，移动所有的文件从当前的 /boot 目录(比如说你上一节刚编译的 Linux 内核)到新的分区。你然后要卸载这个新分区，重新挂载它为 /boot。如果你这么做，一定要更新 /etc/fstab。

使用当前的 lfs 分区也没有什么问题，但是在配置多系统启动的时候有些不同。

从以上信息可知，需要确定根分区的磁盘位置（如果使用单独的分区，则需要知道引导分区的磁盘位置），以下假定根分区（或者是磁盘分区）是 sda2。

将 GRUB 文件安装到 /boot/grub 然后设置启动扇区：

警告

以下命令将会覆盖已有的引导器。如无需要，请勿运行（比如已经有第三方引导器管理 MBR）。

grub-install /dev/sda

8.4.4. 创建 GRUB 配置文件

注意

（译者注：如果实在不知道怎么编写 grub.cfg 文件，或者担心误操作导致系统遭到破坏，可以在宿主系统中安装旧版本的内核，如果有新版本内核也可以直接更新，安装内核的时候它会自动寻找可启动的操作系统，并把它们添加到 fstab 文件中，这样，如果 LFS 配置都正确的话就会找到这个 LFS 系统并添加到 fstab 文件中，重启之后就可以发现 GRUB 菜单中已有 LFS 条目。之后可以再删除这里安装的内核。）

创建 /boot/grub/grub.cfg:

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,2)

menuentry "GNU/Linux, Linux 3.19-lfs-7.7-systemd" {
        linux   /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda2 ro
}
EOF

注意

从 GRUB 的角度看，内核文件相当于一个分区，所以，假如你使用单独的 /boot 分区，请不要在 linux 行添加 /boot。此外，还需要将 root 行指向 /boot 所在的实际分区。

GRUB 功能十分强大，它提供了大量的用于从种类繁多的设备和操作系统以及不同的分区类型启动的选项。此外还可以定制溅射屏幕、播放声音或者是鼠标等。很遗憾的是，这些功能超出本文的范畴，我们一概不予讨论。

慎重

grub-mkconfig 命令可以自动建立配置文件。它使用位于 /etc/grub.d/ 下的一组脚本且将会忽略用户的设置。这些命令主要用于那些非源码编译的发行版，所以不建议 LFS 用户使用此命令。如果你使用商业发行版，你可以试着运行这个命令（运行之前记得备份原来的 grub.cfg文件）。

翻译团队：LCTT 译者/校对：zpl1025,dongfengweixiao,wxy,ictlyh
  • 上一页

    Linux-3.19

  • 下一页

    尾声


第九章 尾声

第三部分 构建 LFS 系统

    用 GRUB 设置启动过程

  • 下一页

    最后的最后

  • 返回
  • 主页

9. 尾声

目录

  • 最后的最后
  • 为 LFS 用户数添砖加瓦
  • 重启系统
  • 接下来做什么呢？
翻译团队：LCTT 译者/校对：wxy,zpl1025,ictlyh
  • 上一页

    用 GRUB 设置启动过程

  • 下一页

    最后的最后


9.1. 最后的最后

第九章 尾声

    尾声

  • 下一页

    为 LFS 用户数添砖加瓦

  • 返回
  • 主页

9.1. 最后的最后

哈哈，干的很不错！到这里，全新的 LFS 系统就已经安装完成了！我们也很期待你那闪闪发光的定制 Linux 系统呐。

创建一个 systemd 所需的 /etc/os-release 文件：

cat > /etc/os-release << "EOF"
NAME="Linux From Scratch"
VERSION="7.7-systemd"
ID=lfs
PRETTY_NAME="Linux From Scratch 7.7-systemd"
EOF

建立 /etc/lfs-release 文件十分明智。当你需要寻求帮助，这个文件可以立即帮助我们确定你当前使用的 LFS 版本。运行以下命令新建此文件：

echo 7.7-systemd > /etc/lfs-release

为向 Linux Standards Base (LSB) 致敬，你可以建立文件来显示当前系统的完整信息. 运行以下命令新建此文件：

cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="7.7-systemd"
DISTRIB_CODENAME="<your name here>"
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF

你可以在 'DISTRIB_CODENAME' 字段填写一些特别的字符来彰显“你的” 系统的与众不同！

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    尾声

  • 下一页

    为 LFS 用户数添砖加瓦


9.2. 为 LFS 用户数添砖加瓦

第九章 尾声

    最后

  • 下一页

    重启系统

  • 返回
  • 主页

9.2. 为 LFS 用户数添砖加瓦

截至此刻，你已经读完了这本书。你想要为 LFS 用户数添砖加瓦吗？赶快点击鼠标访问 http://www.linuxfromscratch.org/cgi-bin/lfscounter.php 输入用户名和第一次使用的 LFS 版本注册成为 LFS 用户吧。

赶快重启到 LFS 吧！

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    最后

  • 下一页

    重启系统


9.3. 重启系统

第九章 尾声

    为 LFS 用户数添砖加瓦

  • 下一页

    接下来做什么呢？

  • 返回
  • 主页

9.3. 重启系统

至此，所有的软件都已安装完毕，是时候重启你的电脑了。然而，你也应该注意一些事情。通过学习本书建立起来的系统属于最小系统，这也就意味着可能会缺失一些你需要的功能。就是说你还需要做些事情。当重启进入你的新 LFS 中时，这是一个在当前的 chroot 环境中安装一些 BLFS 书中的额外软件包的好时机。 以下给出了一些建议：

  • 文本模式的浏览器，例如 Lynx，可以在虚拟终端中访问这本 BLFS 书，以进行后续的编译打包工作。

  • GPM（GPM：一个支持控制台和 xterm 的鼠标服务） 软件包可以让你在虚拟终端中更方便的执行复制/粘贴工作。

  • 如果静态 IP 配置不能很好的适用于你当前环境的网络配置，可以安装 dhcpcd 或者是 dhcp 的客户端部分来解决。

  • 安装 sudo，以便在非 root 用户环境下编译软件包，且可以很轻松的在新系统中安装编译出来的软件。

  • 如果你想要在舒适的 GUI 环境远程访问新系统，请安装 openssh 及其依赖包 openssl。

  • 为了更加便利的从网络中下载文件，请安装 wget。

  • 如果你有 GUID 分区表（GPT） 类型的磁盘，你也许需要 gptfdisk 或是 parted。

  • 最后，检查以下的配置文件是不是都是正确的吧。

    • /etc/bashrc

    • /etc/dircolors

    • /etc/fstab

    • /etc/hosts

    • /etc/inputrc

    • /etc/profile

    • /etc/resolv.conf

    • /etc/vimrc

    • /root/.bash_profile

    • /root/.bashrc

哎呀，劳累了那么久，赶快重启到我们那闪闪发亮的全新的 LFS 系统吧！首先，请退出 chroot 环境：

logout

然后卸载虚拟文件系统：

umount -v $LFS/dev/pts
umount -v $LFS/dev
umount -v $LFS/run
umount -v $LFS/proc
umount -v $LFS/sys

卸载 LFS 文件系统本身：

umount -v $LFS

如果还建立了其它的挂载点，请在卸载 LFS 文件系统之前先卸载它们：

umount -v $LFS/usr
umount -v $LFS/home
umount -v $LFS

至此，重启系统吧：

shutdown -r now

这里假设 GRUB 引导器已经如前文所述安装完毕且配置正确，启动项也已经自动设置为 LFS 7.7-systemd。

重启后，LFS 便已经可以使用了，你可以安装一些其它的软件以满足自己的需求。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    为 LFS 用户数添砖加瓦

  • 下一页

    接下来做什么呢？


9.4. 接下来做什么呢？

第九章 尾声

    重启系统

  • 下一页

    附录

  • 返回
  • 主页

9.4. 接下来做什么呢？

十分感谢你耐心的阅读这本 LFS 书，我们十分期待本书能够为你构建系统带来一点点的帮助。

我猜，你现在一定很开心——LFS 系统已经安装完成。但是，下面该作些什么呢？不用担心，我们早已经帮你准备好以下这些有益的信息了！

  • 维护

    定期检查软件的 bug 和安全公告。因为在从源码构建出 LFS 之后，你便应该养成经常去查看这些报告的好习惯。有关查询的去处，网上倒是有一些不错的资源，这里列举几个：

    • CERT (计算机应急响应小组)

      CERT 有一个邮件列表，专门公示各种操作系统和应用程序的安全警报。订阅信息请点击此链接查看：http://www.us-cert.gov/cas/signup.html.

    • Bugtraq

      Bugtraq 是一个专门公示计算机安全的邮件列表。它公示新发现的安全问题，偶尔还会尽可能的提出修补方案。订阅信息请点击此链接查看： http://www.securityfocus.com/archive.

  • Beyond Linux From Scratch

    Beyond Linux From Scratch（BLFS）涵盖了比 LFS 书多得多的应用程序。BLFS 项目主页是： http://www.linuxfromscratch.org/blfs/.

  • LFS Hints

    LFS Hints 是由 LFS 社区的志愿者提交的教育文集。有关信息访问以下网址取得： http://www.linuxfromscratch.org/hints/list.html.

  • 邮件列表

    有几个 LFS 相关的邮件列表，在你需要的时候可以订阅，也可通过它获得最新的发展动态，对项目作出力所能及的贡献等等。查看 第一章 邮件列表 可以获得更多的信息。

  • The Linux Documentation Project（TLDP，Linux 文档项目）

    Linux 文档项目（TLDP）的目标是通过协作来完善 Linux 文档中的所有不足。TLDP 已经完成了大量的 HOWTO、指南和 man 帮助页。它的网站是：http://www.tldp.org/。

翻译团队：LCTT 译者/校对：dongfengweixiao,wxy
  • 上一页

    重启系统

  • 下一页

    附录


    接下来做什么呢？

  • 下一页

    缩略词和术语

  • .
  • 主页

第四部分 附录

目录

  • 附录 A. 缩略词和术语
  • 附录 B. 致谢
  • 附录 C. 依赖关系
  • 附录 D. LFS 许可协议
    • creative commons license创作共用许可
    • MIT 许可
翻译团队：LCTT 译者/校对：zpl1025,H-mudcup,wxy
  • 上一页

    接下来做什么呢？

  • 下一页

    缩略词和术语

  • .


附录 A. 缩略词和术语

第四部分 附录

    附录

  • 下一页

    致谢

  • 返回
  • 主页

附录 A. 缩略词和术语

ABI

Application Binary Interface
应用程序二进制接口
ALFS

Automated Linux From Scratch
自动化 LFS

API

Application Programming Interface
应用程序设计接口
ASCII

American Standard Code for Information Interchange
美国信息交换标准代码
BIOS

Basic Input/Output System
基本输入/输出系统
BLFS

Beyond Linux From Scratch

BSD

Berkeley Software Distribution
伯克利软件发行版
chroot

change root
更改根目录
CMOS

Complementary Metal Oxide Semiconductor
互补金属氧化物半导体
COS

Class Of Service
服务等级

CPU

Central Processing Unit
中央处理单元
CRC

Cyclic Redundancy Check
循环冗余码校验
CVS

Concurrent Versions System
并发版本系统
DHCP

Dynamic Host Configuration Protocol
动态主机配置协议
DNS

Domain Name Service
域名服务
EGA

Enhanced Graphics Adapter
增强型图形适配器
ELF

Executable and Linkable Format
可执行和可链接格式
EOF

End of File
文件或数据流结束标志
EQN

equation
相等
ext2

second extended file system
第二代可扩展文件系统
ext3

third extended file system
第三代可扩展文件系统
ext4

fourth extended file system
第四代可扩展文件系统
FAQ

Frequently Asked Questions
常见问题
FHS

Filesystem Hierarchy Standard
文件系统层次结构标准
FIFO

First-In, First Out
先进先出
FQDN

Fully Qualified Domain Name
完全合格的域名
FTP

File Transfer Protocol
文件传输协议
GB

Gigabytes
千兆字节
GCC

GNU Compiler Collection
GNU 编译器集合

GID

Group Identifier
组标志符
GMT

Greenwich Mean Time
格林尼治标准时间
HTML

Hypertext Markup Language
超文本标记语言
IDE

Integrated Drive Electronics
智能磁盘设备，集成电路设备
IEEE

Institute of Electrical and Electronic Engineers
电气与电子工程师学会
IO

Input/Output
输入/输出
IP

Internet Protocol
互联网协议
IPC

Inter-Process Communication
进程间通信
IRC

Internet Relay Chat
互联网中继聊天
ISO

International Organization for Standardization
国际标准化组织
ISP

Internet Service Provider
因特网服务提供者
KB

Kilobytes
千字节
LED

Light Emitting Diode
发光二极管
LFS

Linux From Scratch

LSB

Linux Standard Base

MB

Megabytes
兆字节
MBR

Master Boot Record
主引导记录
MD5

Message Digest 5
信息摘要算法第五版
NIC

Network Interface Card
网络接口卡
NLS

Native Language Support
本地语言支持
NNTP

Network News Transport Protocol
网络新闻传输协议
NPTL

Native POSIX Threading Library
本地 POSIX 线程库
OSS

Open Sound System
开放声音系统
PCH

Pre-Compiled Headers
预编译头文件
PCRE

Perl Compatible Regular Expression
Perl 兼容正则表达式
PID

Process Identifier
进程标志符
PTY

pseudo terminal
伪终端
QOS

Quality Of Service
服务质量
RAM

Random Access Memory
随机存取存储器
RPC

Remote Procedure Call
远程程序调用
RTC

Real Time Clock
实时时钟
SBU

Standard Build Unit
标准编译单位
SCO

The Santa Cruz Operation
圣克鲁斯操作
SHA1

Secure-Hash Algorithm 1
安全哈希算法1
TLDP

The Linux Documentation Project
Linux 文档项目
TFTP

Trivial File Transfer Protocol
简单文件传输协议
TLS

Thread-Local Storage
线性本地存储
UID

User Identifier
用户标志符
umask

user file-creation mask
用户文件创建掩码
USB

Universal Serial Bus
通用串行接口
UTC

Coordinated Universal Time
通用协调时间
UUID

Universally Unique Identifier
通用唯一标识符
VC

Virtual Console
虚拟控制台
VGA

Video Graphics Array
视频图形阵列
VT

Virtual Terminal
虚拟终端
翻译团队：LCTT 译者/校对：zpl1025,dongfengweixiao,wxy
  • 上一页

    附录

  • 下一页

    致谢


附录 B. 致谢

第四部分 附录

    缩略词和术语

  • 下一页

    依赖关系

  • 返回
  • 主页

附录 B. 致谢

我们想感谢下面这些人和组织，他们为 Linux From Scratch 项目做出了贡献。

  • Gerard Beekmans <gerard AT linuxfromscratch D0T org> – LFS 创始人，LFS 项目负责人

  • Matthew Burgess <matthew AT linuxfromscratch D0T org> – LFS 项目负责人，LFS 技术作家/编辑

  • Bruce Dubbs <bdubbs AT linuxfromscratch D0T org> – LFS 发布经理，LFS 技术作家/编辑

  • Jim Gifford <jim AT linuxfromscratch D0T org> – CLFS 项目共同负责人

  • Bryan Kadzban <bryan AT linuxfromscratch D0T org> – LFS 技术作家

  • Randy McMurchy <randy AT linuxfromscratch D0T org> – BLFS 项目负责人，LFS 编辑

  • DJ Lucas <dj AT linuxfromscratch D0T org> – LFS 和 BLFS 编辑

  • Ken Moffat <ken AT linuxfromscratch D0T org> – LFS 和 CLFS 编辑

  • Ryan Oliver <ryan AT linuxfromscratch D0T org> – CLFS 项目共同负责人

  • 在 LFS 和 BLFS 的邮件列表里还有无数同志为本书的发布帮过忙，他们提供建议，帮忙测试，提交问题报告和指令，以及分享他们安装各种软件包的经验。

翻译

  • Manuel Canales Esparcia <macana AT macana-es D0T com> – LFS 西班牙语翻译项目

  • Johan Lenglet <johan AT linuxfromscratch D0T org> – 2008年以前的 LFS 法语翻译项目

  • Jean-Philippe Mengual <jmengual AT linuxfromscratch D0T org> – 2008年至今的 LFS 法语翻译项目

  • Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – LFS 葡萄牙语翻译项目

  • Thomas Reitelbach <tr AT erdfunkstelle D0T de> – LFS 德语翻译项目

镜像维护管理员

北美镜像

  • Scott Kveton <scott AT osuosl D0T org> – lfs.oregonstate.edu 镜像

  • William Astle <lost AT l-w D0T net> – ca.linuxfromscratch.org 镜像

  • Eujon Sellers <jpolen@rackspace.com> – lfs.introspeed.com 镜像

  • Justin Knierim <tim@idge.net> – lfs-matrix.net 镜像

南美镜像

  • Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – lfsmirror.lfs-es.info 镜像

  • Luis Falcon <Luis Falcon> – torredehanoi.org 镜像

欧洲镜像

  • Guido Passet <guido AT primerelay D0T net> – nl.linuxfromscratch.org 镜像

  • Bastiaan Jacques <baafie AT planet D0T nl> – lfs.pagefault.net 镜像

  • Sven Cranshoff <sven D0T cranshoff AT lineo D0T be> – lfs.lineo.be 镜像

  • Scarlet Belgium – lfs.scarlet.be 镜像

  • Sebastian Faulborn <info AT aliensoft D0T org> – lfs.aliensoft.org 镜像

  • Stuart Fox <stuart AT dontuse D0T ms> – lfs.dontuse.ms 镜像

  • Ralf Uhlemann <admin AT realhost D0T de> – lfs.oss-mirror.org 镜像

  • Antonin Sprinzl <Antonin D0T Sprinzl AT tuwien D0T ac D0T at> – at.linuxfromscratch.org 镜像

  • Fredrik Danerklint <fredan-lfs AT fredan D0T org> – se.linuxfromscratch.org 镜像

  • Franck <franck AT linuxpourtous D0T com> – lfs.linuxpourtous.com 镜像

  • Philippe Baqu? <baque AT cict D0T fr> – lfs.cict.fr 镜像

  • Vitaly Chekasin <gyouja AT pilgrims D0T ru> – lfs.pilgrims.ru 镜像

  • Benjamin Heil <kontakt AT wankoo D0T org> – lfs.wankoo.org 镜像

亚洲镜像

  • Satit Phermsawang <satit AT wbac D0T ac D0T th> – lfs.phayoune.org 镜像

  • Shizunet Co.,Ltd. <info AT shizu-net D0T jp> – lfs.mirror.shizu-net.jp 镜像

  • Init World <http://www.initworld.com/> – lfs.initworld.com 镜像

澳大利亚镜像

  • Jason Andrade <jason AT dstc D0T edu D0T au> – au.linuxfromscratch.org 镜像

前项目组成员

  • Christine Barczak <theladyskye AT linuxfromscratch D0T org> – LFS 手册编辑

  • Archaic <archaic@linuxfromscratch.org> – LFS 技术作家/编辑，HLFS 项目负责人，BLFS 编辑，Hints and Patches 项目维护者

  • Nathan Coulson <nathan AT linuxfromscratch D0T org> – LFS-Bootscripts 维护者

  • Timothy Bauscher

  • Robert Briggs

  • Ian Chilton

  • Jeroen Coumans <jeroen AT linuxfromscratch D0T org> – 网站开发者，FAQ 维护者

  • Manuel Canales Esparcia <manuel AT linuxfromscratch D0T org> – LFS/BLFS/HLFS XML 和 XSL 版本维护者

  • Alex Groenewoud – LFS 技术作家

  • Marc Heerdink

  • Jeremy Huntwork <jhuntwork AT linuxfromscratch D0T org> – LFS 技术作家，LFS LiveCD 维护者

  • Mark Hymers

  • Seth W. Klein – FAQ 维护者

  • Nicholas Leippe <nicholas AT linuxfromscratch D0T org> – Wiki 维护者

  • Anderson Lizardo <lizardo AT linuxfromscratch D0T org> – 网站 Backend-Scripts 维护者

  • Dan Nicholson <dnicholson AT linuxfromscratch D0T org> – LFS 和 BLFS 编辑

  • Alexander E. Patrakov <alexander AT linuxfromscratch D0T org> – LFS 技术作家，LFS 国际化编辑，LFS LiveCD 维护者

  • Simon Perreault

  • Scot Mc Pherson <scot AT linuxfromscratch D0T org> – LFS NNTP Gateway 维护者

  • Greg Schafer <gschafer AT zip D0T com D0T au> – LFS 技术作家，下一代64位模式构建模型架构师

  • Jesse Tie-Ten-Quee – LFS 技术作家

  • James Robertson <jwrober AT linuxfromscratch D0T org> – Bugzilla 维护者

  • Tushar Teredesai <tushar AT linuxfromscratch D0T org> – BLFS 手册编辑，Hints and Patches 项目负责人

  • Jeremy Utley <jeremy AT linuxfromscratch D0T org> – LFS 技术作家，Bugzilla 维护者，LFS-Bootscripts 维护者

  • Zack Winkles <zwinkles AT gmail D0T com> – LFS 技术作家

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    缩略词和术语

  • 下一页

    依赖关系


附录 C. 依赖关系

第四部分 附录

    致谢

  • 下一页

    LFS 许可协议

  • 返回
  • 主页

附录 C. 依赖关系

LFS 中构建或安装的每一个包或多或少都会依赖于其它的包，甚至有些包甚至是循环依赖关系：第一个包依赖于第二个包，反过来，第二个包的生成或者是安装又需要第 一个包。因为存在这些依赖关系，所以在构建 LFS 系统的时候，软件包的编译或安装的顺序是十分重要的。本章的目的就是告知用户在构建 LFS 时每一个包的依赖项。

对于所有需要编译的软件包，我们列举出三种或者四种类型的依赖。第一种类型是 “安装必选依赖”，否则在编译和安装的时候会出现问题。第二类是 “测试套件依赖”，假如运行一些测试套件，除了第一类的必须安装外，第二类也需要安装。第三类是 “必须之前安装”，此类需要在编译和安装之前就安装。在大多数情况下，是因为它们软件包中的脚本包含有到二进制文件的硬编码。如果不按照顺序编译它们，将会导致 /tools/bin/[binary] 路径变为真实路径写入脚本，然后安装到最终系统中去，这显然是不合适的。 （译者注：这句话写的不是太清楚，大概解释一下：在真实系统中，可能会在某些脚本 中出现这样的路径信息：/usr/bin/vi，但是假如因为安装顺序的问题，这个路径就有可能变成 /tools/usr/bin/vi，最终导致脚本不能正常的运行，这显然是错误的。）

最后一类提及的 “可供选择依赖”，安装方法在此文档类并没有提及，但是这些程序往往对用户来说又都是极其有用。这些软件包可能又有属于自己的 “安装必选依赖” 或者是 “可用选择依赖”。对于这些依赖关系，推荐的做法是在学习完本书之后回到重建 LFS 包。在大多数情况下，重新安装的问题都记录在 BLFS 中。

acl

安装必选依赖： Attr, Bash, Binutils, Coreutils, GCC, Gettext, Grep, M4, Make, Perl, Sed 和 Texinfo
测试套件依赖： Automake, Diffutils, Findutils 和 Libtool
必须之前安装：Coreutils, Sed, Systemd, Tar, Vim
可供选择依赖：无

attr

安装必选依赖：Bash, Binutils, Coreutils, GCC, Gettext, Grep, M4, Make, Perl, Sed 和 Texinfo
测试套件依赖：Automake, Diffutils, Findutils 和 Libtool
必须之前安装：Acl, Libcap, Systemd
可供选择依赖：无

Autoconf

安装必选依赖： Bash, Coreutils, Grep, M4, Make, Perl, Sed 和 Texinfo
测试套件依赖：Automake, Diffutils, Findutils, GCC 和 Libtool
必须之前安装： Automake
可供选择依赖：Emacs

Automake

安装必选依赖： Autoconf, Bash, Coreutils, Gettext, Grep, M4, Make, Perl, Sed 和 Texinfo
测试套件依赖： Binutils, Bison, Bzip2, DejaGNU, Diffutils, Expect, Findutils, Flex, GCC, Gettext, Gzip, Libtool 和 Tar.
必须之前安装： 无
可供选择依赖： 无

Bash

安装必选依赖： Bash, Binutils, Bison, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Patch, Readline, Sed 和 Texinfo
测试套件依赖： Shadow
必须之前安装： 无
可供选择依赖： Xorg

Bc

安装必选依赖： Bash, Binutils, Bison, Coreutils, GCC, Glibc, Grep, Make 和 Readline
测试套件依赖： Gawk
必须之前安装： Linux Kernel
可供选择依赖： 无

Binutils

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, File, Gawk, GCC, Glibc, Grep, Make, Perl, Sed, Texinfo 和 Zlib
测试套件依赖： DejaGNU 和 Expect
必须之前安装： 无
可供选择依赖： 无

Bison

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, M4, Make, Perl 和 Sed
测试套件依赖： Diffutils, Findutils 和 Flex
必须之前安装： Kbd 和 Tar
可供选择依赖： Doxygen (测试套件)

Bzip2

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Make 和 Patch
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Check

安装必选依赖： GCC, Grep, Make, Sed 和 Texinfo
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Coreutils

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, GMP, Grep, Make, Patch, Perl, Sed 和 Texinfo
测试套件依赖： Diffutils, E2fsprogs, Findutils, Shadow 和 Util-linux
必须之前安装： Bash, Diffutils, Findutils, Man-DB 和 Udev
可供选择依赖： Perl Expect 和 IO:Tty 模块 (测试套件要用)

D-Bus

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed 和 Util-linux
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： Xorg Libs

DejaGNU

安装必选依赖： Bash, Coreutils, Diffutils, GCC, Grep, Make 和 Sed
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Diffutils

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Diffutils, Perl
必须之前安装： 无
可供选择依赖： 无

Expat

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make 和 Sed
测试套件依赖： 无
必须之前安装： XML::Parser
可供选择依赖： 无

Expect

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Patch, Sed 和 Tcl
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

E2fsprogs

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Gzip, Make, Sed, Texinfo 和 Util-linux
测试套件依赖： Procps-ng,Psmisc
必须之前安装： 无
可供选择依赖： 无

File

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed 和 Zlib
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Findutils

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： DejaGNU, Diffutils 和 Expect
必须之前安装： 无
可供选择依赖： 无

Flex

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, M4, Make, Patch, Sed 和 Texinfo
测试套件依赖： Bison (suppressed) 和 Gawk
必须之前安装： IPRoute2, Kbd 和 Man-DB
可供选择依赖： 无

Gawk

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Patch, Sed 和 Texinfo
测试套件依赖： Diffutils
必须之前安装： 无
可供选择依赖： 无

Gcc

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, GCC, Gettext, Glibc, GMP, Grep, M4, Make, MPC, MPFR, Patch, Perl, Sed, Tar 和 Texinfo
测试套件依赖： DejaGNU 和 Expect
必须之前安装： 无
可供选择依赖： CLooG-PPL, GNAT 和 PPL

GDBM

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Grep, Make 和 Sed
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Gettext

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Diffutils, Perl 和 Tcl
必须之前安装： Automake
可供选择依赖： 无

Glibc

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Gzip, Linux API Headers, Make, Perl, Sed 和 Texinfo
测试套件依赖： File
必须之前安装： 无
可供选择依赖： 无

GMP

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, M4, Make, Sed 和 Texinfo
测试套件依赖： 无
必须之前安装： MPFR, GCC
可供选择依赖： 无

Gperf

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Make
测试套件依赖： Diffutils, Expect
必须之前安装： 无
可供选择依赖： 无

Grep

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Patch, Sed 和 Texinfo
测试套件依赖： Gawk
必须之前安装： Man-DB
可供选择依赖： Pcre, Xorg 和 CUPS

Groff

安装必选依赖： Bash, Binutils, Bison, Coreutils, Gawk, GCC, Glibc, Grep, Make, Patch, Sed 和 Texinfo
测试套件依赖： 没有可用的测试套件
必须之前安装： Man-DB 和 Perl
可供选择依赖： GPL Ghostscript

GRUB

安装必选依赖： Bash, Binutils, Bison, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed, Texinfo 和 Xz
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Gzip

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Diffutils, Less
必须之前安装： Man-DB
可供选择依赖： 无

Iana-Etc

安装必选依赖： Coreutils, Gawk 和 Make
测试套件依赖： 没有可用的测试套件
必须之前安装： Perl
可供选择依赖： 无

Inetutils

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Ncurses, Patch, Sed, Texinfo 和 Zlib
测试套件依赖： 没有可用的测试套件
必须之前安装： Tar
可供选择依赖： 无

Intltool

安装必选依赖： Bash, Gawk, Glibc, Make, Perl, Sed 和 XML::Parser
测试套件依赖： Perl
必须之前安装： 无
可供选择依赖： 无

IProute2

安装必选依赖： Bash, Bison, Coreutils, Flex, GCC, Glibc, Make 和 Linux API Headers
测试套件依赖： 没有可用的测试套件
必须之前安装： 无
可供选择依赖： 无

Kbd

安装必选依赖： Bash, Binutils, Bison, Check, Coreutils, Flex, GCC, Gettext, Glibc, Gzip, Make, Patch 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： 无
可供选择依赖： 无

Kmod

安装必选依赖： Bash, Binutils, Bison, Coreutils, Flex, GCC, Gettext, Glibc, Gzip, Make, Sed, Xz-Utils, Zlib
测试套件依赖： 没有可用的测试套件
必须之前安装： Udev
可供选择依赖： 无

Less

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： Gzip
可供选择依赖： Pcre

Libcap

安装必选依赖： Attr, Bash, Binutils, Coreutils, GCC, Glibc, Perl, Make 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： Systemd
可供选择依赖： Linux-PAM

Libpipeline

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Check
必须之前安装： Man-DB
可供选择依赖： 无

Libtool

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Autoconf, Automake, Findutils
必须之前安装： 无
可供选择依赖： 无

Linux Kernel

安装必选依赖： Bash, Bc, Binutils, Coreutils, Diffutils, Findutils, GCC, Glibc, Grep, Gzip, Kmod, Make, Ncurses, Perl 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： 无
可供选择依赖： 无

M4

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Diffutils
必须之前安装： Autoconf 和 Bison
可供选择依赖： libsigsegv

Make

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Perl 和 Procps-ng
必须之前安装： 无
可供选择依赖： 无

Man-DB

安装必选依赖： Bash, Binutils, Bzip2, Coreutils, Flex, GCC, GDBM, Gettext, Glibc, Grep, Groff, Gzip, Less, Libpipeline, Make, Sed 和 Xz
测试套件依赖： Util-linux
必须之前安装： 无
可供选择依赖： 无

Man-Pages

安装必选依赖： Bash, Coreutils 和 Make
测试套件依赖： 没有可用的测试套件
必须之前安装： 无
可供选择依赖： 无

MPC

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, GMP, Make, MPFR, Sed 和 Texinfo
测试套件依赖： 无
必须之前安装： GCC
可供选择依赖： 无

MPFR

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, GMP, Make, Sed 和 Texinfo
测试套件依赖： 无
必须之前安装： GCC
可供选择依赖： 无

Ncurses

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Glibc, Grep, Make, Patch 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： Bash, GRUB, Inetutils, Less, Procps-ng, Psmisc, Readline, Texinfo, Util-linux 和 Vim
可供选择依赖： 无

Patch

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Grep, Make 和 Sed
测试套件依赖： Diffutils
必须之前安装： 无
可供选择依赖： Ed

Perl

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, GDBM, Glibc, Grep, Groff, Make, Sed 和 Zlib
测试套件依赖： Iana-Etc 和 Procps-ng
必须之前安装： Autoconf
可供选择依赖： 无

Pkg-config

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, Popt 和 Sed
测试套件依赖： 无
必须之前安装： Kmod
可供选择依赖： 无

Popt

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make
测试套件依赖： Diffutils 和 Sed
必须之前安装： Pkg-config
可供选择依赖： 无

Procps-ng

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Make 和 Ncurses
测试套件依赖： DejaGNU
必须之前安装： 无
可供选择依赖： 无

Psmisc

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Ncurses 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： 无
可供选择依赖： 无

Readline

安装必选依赖： Bash, Binutils, Coreutils, Gawk, GCC, Glibc, Grep, Make, Ncurses, Patch, Sed 和 Texinfo
测试套件依赖： 没有可用的测试套件
必须之前安装： Bash
可供选择依赖： 无

Sed

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Sed 和 Texinfo
测试套件依赖： Diffutils 和 Gawk
必须之前安装： E2fsprogs, File, Libtool 和 Shadow
可供选择依赖： Cracklib

Shadow

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, GCC, Gettext, Glibc, Grep, Make 和 Sed
测试套件依赖： 没有可用的测试套件
必须之前安装： Coreutils
可供选择依赖： Acl, Attr, Cracklib, PAM

Systemd

安装必选依赖： Acl, Attr, Bash, Binutils, Coreutils, Diffutils, Expat, Gawk, GCC, Glibc, Gperf, Grep, Intltool, Libcap, Make, Sed 和 Util-linux
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Tar

安装必选依赖： Acl, Attr, Bash, Binutils, Bison, Coreutils, GCC, Gettext, Glibc, Grep, Inetutils, Make, Sed 和 Texinfo
测试套件依赖： Autoconf, Diffutils, Findutils, Gawk 和 Gzip
必须之前安装： 无
可供选择依赖： 无

Tcl

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make 和 Sed
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Texinfo

安装必选依赖： Bash, Binutils, Coreutils, GCC, Gettext, Glibc, Grep, Make, Ncurses, Patch 和 Sed
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： 无

Util-linux

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, Findutils, Gawk, GCC, Gettext, Glibc, Grep, Make, Ncurses, Sed, Udev 和 Zlib
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： libcap-ng

Vim

安装必选依赖： Acl, Attr, Bash, Binutils, Coreutils, Diffutils, GCC, Glibc, Grep, Make, Ncurses 和 Sed
测试套件依赖： 无
必须之前安装： 无
可供选择依赖： Xorg, GTK+2, LessTif, Python, Tcl, Ruby 和 GPM

XML::Parser

安装必选依赖： Bash, Binutils, Coreutils, Expat, GCC, Glibc, Make 和 Perl
测试套件依赖： Perl
必须之前安装： Intltool
可供选择依赖： 无

Xz

安装必选依赖： Bash, Binutils, Coreutils, Diffutils, GCC, Glibc 和 Make.
测试套件依赖： 无
必须之前安装： GRUB, Kmod, Man-DB, Udev
可供选择依赖： 无

Zlib

安装必选依赖： Bash, Binutils, Coreutils, GCC, Glibc, Make 和 Sed
测试套件依赖： 无
必须之前安装： File, Kmod, Perl 和 Util-linux
可供选择依赖： 无
翻译团队：LCTT 译者/校对：zpl1025,dongfengweixiao,wxy,ictlyh
  • 上一页

    致谢

  • 下一页

    LFS 许可协议


附录 D. LFS 许可协议

第四部分 附录

    依赖关系

  • 下一页

    Creative Commons License

  • 返回
  • 主页

附录 D. LFS 许可协议

本手册基于 Creative Commons Attribution-NonCommercial-ShareAlike 2.0 License 授权。

本手册中包含的计算机指令可以基于 MIT License 授权使用。

翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    依赖关系

  • 下一页

    Creative Commons License


附录 D.1. Creative Commons License

附录 D. LFS 许可协议

    LFS 许可协议

  • 下一页

    The MIT License

  • 返回
  • 主页

附录 D.1. Creative Commons License

Creative Commons Legal Code

Attribution-NonCommercial-ShareAlike 2.0

Important

CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.

License

THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

  1. Definitions

    1. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.

    2. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.

    3. "Licensor" means the individual or entity that offers the Work under the terms of this License.

    4. "Original Author" means the individual or entity who created the Work.

    5. "Work" means the copyrightable work of authorship offered under the terms of this License.

    6. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.

    7. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, Noncommercial, ShareAlike.

  2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.

  3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

    1. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;

    2. to create and reproduce Derivative Works;

    3. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;

    4. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works;

    The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Sections 4(e) and 4(f).

  4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

    1. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any reference to such Licensor or the Original Author, as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any reference to such Licensor or the Original Author, as requested.

    2. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-NonCommercial-ShareAlike 2.0 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.

    3. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.

    4. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and give the Original Author credit reasonable to the medium or means You are utilizing by conveying the name (or pseudonym if applicable) of the Original Author if supplied; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.

    5. For the avoidance of doubt, where the Work is a musical composition:

      1. Performance Royalties Under Blanket Licenses. Licensor reserves the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work if that performance is primarily intended for or directed toward commercial advantage or private monetary compensation.

      2. Mechanical Rights and Statutory Royalties. Licensor reserves the exclusive right to collect, whether individually or via a music rights agency or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions), if Your distribution of such cover version is primarily intended for or directed toward commercial advantage or private monetary compensation. 6. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.

    6. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor reserves the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions), if Your public digital performance is primarily intended for or directed toward commercial advantage or private monetary compensation.

  5. Representations, Warranties and Disclaimer

    UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

  6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  7. Termination

    1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.

    2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

  8. Miscellaneous

    1. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.

    2. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.

    3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

    4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.

    5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.

Important

Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.

Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.

Creative Commons may be contacted at http://creativecommons.org/.

  • 上一页

    LFS 许可协议

  • 下一页

    The MIT License


附录 D.2. The MIT License

附录 D. LFS 许可协议

    Creative Commons License

  • 下一页

    索引

  • 返回
  • 主页

附录 D.2. The MIT License

Copyright ? 1999-2015 Gerard Beekmans

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

  • 上一页

    Creative Commons License

  • 下一页

    索引


    The MIT License

  • .
  • 主页

索引

软件包

  • Acl: Acl-2.2.52
  • Attr: Attr-2.4.47
  • Autoconf: Autoconf-2.69
  • Automake: Automake-1.15
  • Bash: Bash-4.3.30
    • 工具： Bash-4.3.30
  • Bc: Bc-1.06.95
  • Binutils: Binutils-2.25
    • 工具，第一遍： Binutils-2.25 - Pass 1
    • 工具，第二遍： Binutils-2.25 - Pass 2
  • Bison: Bison-3.0.4
  • Bzip2: Bzip2-1.0.6
    • 工具： Bzip2-1.0.6
  • Check: Check-0.9.14
  • Coreutils: Coreutils-8.23
    • 工具： Coreutils-8.23
  • D-Bus: D-Bus-1.8.16
  • DejaGNU: DejaGNU-1.5.2
  • Diffutils: Diffutils-3.3
    • 工具： Diffutils-3.3
  • E2fsprogs: E2fsprogs-1.42.12
  • Expat: Expat-2.1.0
  • Expect: Expect-5.45
  • File: File-5.22
    • 工具： File-5.22
  • Findutils: Findutils-4.4.2
    • 工具： Findutils-4.4.2
  • Flex: Flex-2.5.39
  • Gawk: Gawk-4.1.1
    • 工具： Gawk-4.1.1
  • GCC: GCC-4.9.2
    • 工具，libstdc++: Libstdc++-4.9.2
    • 工具，第一遍： GCC-4.9.2 - Pass 1
    • 工具，第二遍： GCC-4.9.2 - Pass 2
  • GDBM: GDBM-1.11
  • Gettext: Gettext-0.19.4
    • 工具： Gettext-0.19.4
  • Glibc: Glibc-2.21
    • 工具： Glibc-2.21
  • GMP: GMP-6.0.0a
  • Gperf: Gperf-3.0.4
  • Grep: Grep-2.21
    • 工具： Grep-2.21
  • Groff: Groff-1.22.3
  • GRUB: GRUB-2.02~beta2
  • Gzip: Gzip-1.6
    • 工具： Gzip-1.6
  • Iana-Etc: Iana-Etc-2.30
  • Inetutils: Inetutils-1.9.2
  • Intltool: Intltool-0.50.2
  • IPRoute2: IPRoute2-3.19.0
  • Kbd: Kbd-2.0.2
  • Kmod: Kmod-19
  • Less: Less-458
  • Libcap: Libcap-2.24
  • Libpipeline: Libpipeline-1.4.0
  • Libtool: Libtool-2.4.6
  • Linux: Linux-3.19
    • API 头文件： Linux-3.19 API Headers
    • 工具，API 头文件： Linux-3.19 API Headers
  • M4: M4-1.4.17
    • 工具： M4-1.4.17
  • Make: Make-4.1
    • 工具： Make-4.1
  • Man-DB: Man-DB-2.7.1
  • Man-pages: Man-pages-3.79
  • MPC: MPC-1.0.2
  • MPFR: MPFR-3.1.2
  • Ncurses: Ncurses-5.9
    • 工具： Ncurses-5.9
  • Patch: Patch-2.7.4
    • 工具： Patch-2.7.4
  • Perl: Perl-5.20.2
    • 工具： Perl-5.20.2
  • Pkgconfig: Pkg-config-0.28
  • Procps-ng: Procps-ng-3.3.10
  • Psmisc: Psmisc-22.21
  • Readline: Readline-6.3
  • Sed: Sed-4.2.2
    • 工具： Sed-4.2.2
  • Shadow: Shadow-4.2.1
    • 配置： 配置 Shadow
  • systemd: Systemd-219
  • Tar: Tar-1.28
    • 工具： Tar-1.28
  • Tcl: Tcl-8.6.3
  • Texinfo: Texinfo-5.2
    • 工具： Texinfo-5.2
  • Udev:
    • 使用： Device and Module Handling on an LFS System
  • Util-linux: Util-linux-2.26
    • 工具： Util-linux-2.26
  • Vim: Vim-7.4
  • XML::Parser: XML::Parser-2.44
  • Xz: Xz-5.2.0
    • 工具： Xz-5.2.0
  • Zlib: Zlib-1.2.8

可执行程序

  • a2p: Perl-5.20.2 -- 介绍
  • accessdb: Man-DB-2.7.1 -- 介绍
  • aclocal: Automake-1.15 -- 介绍
  • aclocal-1.15: Automake-1.15 -- 介绍
  • addftinfo: Groff-1.22.3 -- 介绍
  • addpart: Util-linux-2.26 -- 介绍
  • addr2line: Binutils-2.25 -- 介绍
  • afmtodit: Groff-1.22.3 -- 介绍
  • agetty: Util-linux-2.26 -- 介绍
  • apropos: Man-DB-2.7.1 -- 介绍
  • ar: Binutils-2.25 -- 介绍
  • as: Binutils-2.25 -- 介绍
  • attr: Attr-2.4.47 -- 介绍
  • autoconf: Autoconf-2.69 -- 介绍
  • autoheader: Autoconf-2.69 -- 介绍
  • autom4te: Autoconf-2.69 -- 介绍
  • automake: Automake-1.15 -- 介绍
  • automake-1.15: Automake-1.15 -- 介绍
  • autopoint: Gettext-0.19.4 -- 介绍
  • autoreconf: Autoconf-2.69 -- 介绍
  • autoscan: Autoconf-2.69 -- 介绍
  • autoupdate: Autoconf-2.69 -- 介绍
  • awk: Gawk-4.1.1 -- 介绍
  • badblocks: E2fsprogs-1.42.12 -- 介绍
  • base64: Coreutils-8.23 -- 介绍
  • basename: Coreutils-8.23 -- 介绍
  • bash: Bash-4.3.30 -- 介绍
  • bashbug: Bash-4.3.30 -- 介绍
  • bc: Bc-1.06.95 -- 介绍
  • bigram: Findutils-4.4.2 -- 介绍
  • bison: Bison-3.0.4 -- 介绍
  • blkdiscard: Util-linux-2.26 -- 介绍
  • blkid: Util-linux-2.26 -- 介绍
  • blockdev: Util-linux-2.26 -- 介绍
  • bootctl: Systemd-219 -- 介绍
  • bridge: IPRoute2-3.19.0 -- 介绍
  • bunzip2: Bzip2-1.0.6 -- 介绍
  • busctl: Systemd-219 -- 介绍
  • bzcat: Bzip2-1.0.6 -- 介绍
  • bzcmp: Bzip2-1.0.6 -- 介绍
  • bzdiff: Bzip2-1.0.6 -- 介绍
  • bzegrep: Bzip2-1.0.6 -- 介绍
  • bzfgrep: Bzip2-1.0.6 -- 介绍
  • bzgrep: Bzip2-1.0.6 -- 介绍
  • bzip2: Bzip2-1.0.6 -- 介绍
  • bzip2recover: Bzip2-1.0.6 -- 介绍
  • bzless: Bzip2-1.0.6 -- 介绍
  • bzmore: Bzip2-1.0.6 -- 介绍
  • c++: GCC-4.9.2 -- 介绍
  • c++filt: Binutils-2.25 -- 介绍
  • c2ph: Perl-5.20.2 -- 介绍
  • cal: Util-linux-2.26 -- 介绍
  • capsh: Libcap-2.24 -- 介绍
  • captoinfo: Ncurses-5.9 -- 介绍
  • cat: Coreutils-8.23 -- 介绍
  • catchsegv: Glibc-2.21 -- 介绍
  • catman: Man-DB-2.7.1 -- 介绍
  • cc: GCC-4.9.2 -- 介绍
  • cfdisk: Util-linux-2.26 -- 介绍
  • chacl: Acl-2.2.52 -- 介绍
  • chage: Shadow-4.2.1 -- 介绍
  • chattr: E2fsprogs-1.42.12 -- 介绍
  • chcon: Coreutils-8.23 -- 介绍
  • chcpu: Util-linux-2.26 -- 介绍
  • checkmk: Check-0.9.14 -- 介绍
  • chem: Groff-1.22.3 -- 介绍
  • chfn: Shadow-4.2.1 -- 介绍
  • chgpasswd: Shadow-4.2.1 -- 介绍
  • chgrp: Coreutils-8.23 -- 介绍
  • chmod: Coreutils-8.23 -- 介绍
  • chown: Coreutils-8.23 -- 介绍
  • chpasswd: Shadow-4.2.1 -- 介绍
  • chroot: Coreutils-8.23 -- 介绍
  • chrt: Util-linux-2.26 -- 介绍
  • chsh: Shadow-4.2.1 -- 介绍
  • chvt: Kbd-2.0.2 -- 介绍
  • cksum: Coreutils-8.23 -- 介绍
  • clear: Ncurses-5.9 -- 介绍
  • cmp: Diffutils-3.3 -- 介绍
  • code: Findutils-4.4.2 -- 介绍
  • col: Util-linux-2.26 -- 介绍
  • colcrt: Util-linux-2.26 -- 介绍
  • colrm: Util-linux-2.26 -- 介绍
  • column: Util-linux-2.26 -- 介绍
  • comm: Coreutils-8.23 -- 介绍
  • compile: Automake-1.15 -- 介绍
  • compile_et: E2fsprogs-1.42.12 -- 介绍
  • config.charset: Gettext-0.19.4 -- 介绍
  • config.guess: Automake-1.15 -- 介绍
  • config.rpath: Gettext-0.19.4 -- 介绍
  • config.sub: Automake-1.15 -- 介绍
  • config_data: Perl-5.20.2 -- 介绍
  • coredumpctl: Systemd-219 -- 介绍
  • corelist: Perl-5.20.2 -- 介绍
  • cp: Coreutils-8.23 -- 介绍
  • cpan: Perl-5.20.2 -- 介绍
  • cpan2dist: Perl-5.20.2 -- 介绍
  • cpanp: Perl-5.20.2 -- 介绍
  • cpanp-run-perl: Perl-5.20.2 -- 介绍
  • cpp: GCC-4.9.2 -- 介绍
  • csplit: Coreutils-8.23 -- 介绍
  • ctrlaltdel: Util-linux-2.26 -- 介绍
  • ctstat: IPRoute2-3.19.0 -- 介绍
  • cut: Coreutils-8.23 -- 介绍
  • date: Coreutils-8.23 -- 介绍
  • dbus-cleanup-sockets: D-Bus-1.8.16 -- 介绍
  • dbus-daemon: D-Bus-1.8.16 -- 介绍
  • dbus-launch: D-Bus-1.8.16 -- 介绍
  • dbus-monitor: D-Bus-1.8.16 -- 介绍
  • dbus-run-session: D-Bus-1.8.16 -- 介绍
  • dbus-send: D-Bus-1.8.16 -- 介绍
  • dbus-uuidgen: D-Bus-1.8.16 -- 介绍
  • dc: Bc-1.06.95 -- 介绍
  • dd: Coreutils-8.23 -- 介绍
  • deallocvt: Kbd-2.0.2 -- 介绍
  • debugfs: E2fsprogs-1.42.12 -- 介绍
  • delpart: Util-linux-2.26 -- 介绍
  • depcomp: Automake-1.15 -- 介绍
  • depmod: Kmod-19 -- 介绍
  • df: Coreutils-8.23 -- 介绍
  • diff: Diffutils-3.3 -- 介绍
  • diff3: Diffutils-3.3 -- 介绍
  • dir: Coreutils-8.23 -- 介绍
  • dircolors: Coreutils-8.23 -- 介绍
  • dirname: Coreutils-8.23 -- 介绍
  • dmesg: Util-linux-2.26 -- 介绍
  • du: Coreutils-8.23 -- 介绍
  • dumpe2fs: E2fsprogs-1.42.12 -- 介绍
  • dumpkeys: Kbd-2.0.2 -- 介绍
  • e2freefrag: E2fsprogs-1.42.12 -- 介绍
  • e2fsck: E2fsprogs-1.42.12 -- 介绍
  • e2image: E2fsprogs-1.42.12 -- 介绍
  • e2label: E2fsprogs-1.42.12 -- 介绍
  • e2undo: E2fsprogs-1.42.12 -- 介绍
  • e4defrag: E2fsprogs-1.42.12 -- 介绍
  • echo: Coreutils-8.23 -- 介绍
  • egrep: Grep-2.21 -- 介绍
  • eject: Util-linux-2.26 -- 介绍
  • elfedit: Binutils-2.25 -- 介绍
  • enc2xs: Perl-5.20.2 -- 介绍
  • env: Coreutils-8.23 -- 介绍
  • envsubst: Gettext-0.19.4 -- 介绍
  • eqn: Groff-1.22.3 -- 介绍
  • eqn2graph: Groff-1.22.3 -- 介绍
  • ex: Vim-7.4 -- 介绍
  • expand: Coreutils-8.23 -- 介绍
  • expect: Expect-5.45 -- 介绍
  • expiry: Shadow-4.2.1 -- 介绍
  • expr: Coreutils-8.23 -- 介绍
  • factor: Coreutils-8.23 -- 介绍
  • faillog: Shadow-4.2.1 -- 介绍
  • fallocate: Util-linux-2.26 -- 介绍
  • false: Coreutils-8.23 -- 介绍
  • fdformat: Util-linux-2.26 -- 介绍
  • fdisk: Util-linux-2.26 -- 介绍
  • fgconsole: Kbd-2.0.2 -- 介绍
  • fgrep: Grep-2.21 -- 介绍
  • file: File-5.22 -- 介绍
  • filefrag: E2fsprogs-1.42.12 -- 介绍
  • find: Findutils-4.4.2 -- 介绍
  • find2perl: Perl-5.20.2 -- 介绍
  • findfs: Util-linux-2.26 -- 介绍
  • findmnt: Util-linux-2.26 -- 介绍
  • flex: Flex-2.5.39 -- 介绍
  • flex++: Flex-2.5.39 -- 介绍
  • flock: Util-linux-2.26 -- 介绍
  • fmt: Coreutils-8.23 -- 介绍
  • fold: Coreutils-8.23 -- 介绍
  • frcode: Findutils-4.4.2 -- 介绍
  • free: Procps-ng-3.3.10 -- 介绍
  • fsck: Util-linux-2.26 -- 介绍
  • fsck.cramfs: Util-linux-2.26 -- 介绍
  • fsck.ext2: E2fsprogs-1.42.12 -- 介绍
  • fsck.ext3: E2fsprogs-1.42.12 -- 介绍
  • fsck.ext4: E2fsprogs-1.42.12 -- 介绍
  • fsck.ext4dev: E2fsprogs-1.42.12 -- 介绍
  • fsck.minix: Util-linux-2.26 -- 介绍
  • fsfreeze: Util-linux-2.26 -- 介绍
  • fstrim: Util-linux-2.26 -- 介绍
  • ftp: Inetutils-1.9.2 -- 介绍
  • fuser: Psmisc-22.21 -- 介绍
  • g++: GCC-4.9.2 -- 介绍
  • gawk: Gawk-4.1.1 -- 介绍
  • gawk-4.1.1: Gawk-4.1.1 -- 介绍
  • gcc: GCC-4.9.2 -- 介绍
  • gc-ar: GCC-4.9.2 -- 介绍
  • gc-nm: GCC-4.9.2 -- 介绍
  • gc-ranlib: GCC-4.9.2 -- 介绍
  • gcov: GCC-4.9.2 -- 介绍
  • gdbmtool: GDBM-1.11 -- 介绍
  • gdbm_dump: GDBM-1.11 -- 介绍
  • gdbm_load: GDBM-1.11 -- 介绍
  • gdiffmk: Groff-1.22.3 -- 介绍
  • gencat: Glibc-2.21 -- 介绍
  • genl: IPRoute2-3.19.0 -- 介绍
  • geqn: Groff-1.22.3 -- 介绍
  • getcap: Libcap-2.24 -- 介绍
  • getconf: Glibc-2.21 -- 介绍
  • getent: Glibc-2.21 -- 介绍
  • getfacl: Acl-2.2.52 -- 介绍
  • getfattr: Attr-2.4.47 -- 介绍
  • getkeycodes: Kbd-2.0.2 -- 介绍
  • getopt: Util-linux-2.26 -- 介绍
  • getpcaps: Libcap-2.24 -- 介绍
  • gettext: Gettext-0.19.4 -- 介绍
  • gettext.sh: Gettext-0.19.4 -- 介绍
  • gettextize: Gettext-0.19.4 -- 介绍
  • gpasswd: Shadow-4.2.1 -- 介绍
  • gperf: Gperf-3.0.4 -- 介绍
  • gprof: Binutils-2.25 -- 介绍
  • grap2graph: Groff-1.22.3 -- 介绍
  • grep: Grep-2.21 -- 介绍
  • grn: Groff-1.22.3 -- 介绍
  • grodvi: Groff-1.22.3 -- 介绍
  • groff: Groff-1.22.3 -- 介绍
  • groffer: Groff-1.22.3 -- 介绍
  • grog: Groff-1.22.3 -- 介绍
  • grolbp: Groff-1.22.3 -- 介绍
  • grolj4: Groff-1.22.3 -- 介绍
  • grops: Groff-1.22.3 -- 介绍
  • grotty: Groff-1.22.3 -- 介绍
  • groupadd: Shadow-4.2.1 -- 介绍
  • groupdel: Shadow-4.2.1 -- 介绍
  • groupmems: Shadow-4.2.1 -- 介绍
  • groupmod: Shadow-4.2.1 -- 介绍
  • groups: Coreutils-8.23 -- 介绍
  • grpck: Shadow-4.2.1 -- 介绍
  • grpconv: Shadow-4.2.1 -- 介绍
  • grpunconv: Shadow-4.2.1 -- 介绍
  • grub-bios-setup: GRUB-2.02~beta2 -- 介绍
  • grub-editenv: GRUB-2.02~beta2 -- 介绍
  • grub-fstest: GRUB-2.02~beta2 -- 介绍
  • grub-install: GRUB-2.02~beta2 -- 介绍
  • grub-kbdcomp: GRUB-2.02~beta2 -- 介绍
  • grub-menulst2cfg: GRUB-2.02~beta2 -- 介绍
  • grub-mkconfig: GRUB-2.02~beta2 -- 介绍
  • grub-mkimage: GRUB-2.02~beta2 -- 介绍
  • grub-mklayout: GRUB-2.02~beta2 -- 介绍
  • grub-mknetdir: GRUB-2.02~beta2 -- 介绍
  • grub-mkpasswd-pbkdf2: GRUB-2.02~beta2 -- 介绍
  • grub-mkrelpath: GRUB-2.02~beta2 -- 介绍
  • grub-mkrescue: GRUB-2.02~beta2 -- 介绍
  • grub-mkstandalone: GRUB-2.02~beta2 -- 介绍
  • grub-ofpathname: GRUB-2.02~beta2 -- 介绍
  • grub-probe: GRUB-2.02~beta2 -- 介绍
  • grub-reboot: GRUB-2.02~beta2 -- 介绍
  • grub-script-check: GRUB-2.02~beta2 -- 介绍
  • grub-set-default: GRUB-2.02~beta2 -- 介绍
  • grub-setup: GRUB-2.02~beta2 -- 介绍
  • gtbl: Groff-1.22.3 -- 介绍
  • gunzip: Gzip-1.6 -- 介绍
  • gzexe: Gzip-1.6 -- 介绍
  • gzip: Gzip-1.6 -- 介绍
  • h2ph: Perl-5.20.2 -- 介绍
  • h2xs: Perl-5.20.2 -- 介绍
  • halt: Systemd-219 -- 介绍
  • head: Coreutils-8.23 -- 介绍
  • hexdump: Util-linux-2.26 -- 介绍
  • hostid: Coreutils-8.23 -- 介绍
  • hostname: Inetutils-1.9.2 -- 介绍
  • hostname: Gettext-0.19.4 -- 介绍
  • hostnamectl: Systemd-219 -- 介绍
  • hpftodit: Groff-1.22.3 -- 介绍
  • hwclock: Util-linux-2.26 -- 介绍
  • i386: Util-linux-2.26 -- 介绍
  • iconv: Glibc-2.21 -- 介绍
  • iconvconfig: Glibc-2.21 -- 介绍
  • id: Coreutils-8.23 -- 介绍
  • ifcfg: IPRoute2-3.19.0 -- 介绍
  • ifconfig: Inetutils-1.9.2 -- 介绍
  • ifnames: Autoconf-2.69 -- 介绍
  • ifstat: IPRoute2-3.19.0 -- 介绍
  • igawk: Gawk-4.1.1 -- 介绍
  • indxbib: Groff-1.22.3 -- 介绍
  • info: Texinfo-5.2 -- 介绍
  • infocmp: Ncurses-5.9 -- 介绍
  • infokey: Texinfo-5.2 -- 介绍
  • infotocap: Ncurses-5.9 -- 介绍
  • init: Systemd-219 -- 介绍
  • insmod: Kmod-19 -- 介绍
  • install: Coreutils-8.23 -- 介绍
  • install-info: Texinfo-5.2 -- 介绍
  • install-sh: Automake-1.15 -- 介绍
  • instmodsh: Perl-5.20.2 -- 介绍
  • intltool-extract: Intltool-0.50.2 -- 介绍
  • intltool-merge: Intltool-0.50.2 -- 介绍
  • intltool-prepare: Intltool-0.50.2 -- 介绍
  • intltool-update: Intltool-0.50.2 -- 介绍
  • intltoolize: Intltool-0.50.2 -- 介绍
  • ionice: Util-linux-2.26 -- 介绍
  • ip: IPRoute2-3.19.0 -- 介绍
  • ipcmk: Util-linux-2.26 -- 介绍
  • ipcrm: Util-linux-2.26 -- 介绍
  • ipcs: Util-linux-2.26 -- 介绍
  • isosize: Util-linux-2.26 -- 介绍
  • join: Coreutils-8.23 -- 介绍
  • journalctl: Systemd-219 -- 介绍
  • json_pp: Perl-5.20.2 -- 介绍
  • kbdinfo: Kbd-2.0.2 -- 介绍
  • kbdrate: Kbd-2.0.2 -- 介绍
  • kbd_mode: Kbd-2.0.2 -- 介绍
  • kernel-install: Systemd-219 -- 介绍
  • kill: Util-linux-2.26 -- 介绍
  • killall: Psmisc-22.21 -- 介绍
  • kmod: Kmod-19 -- 介绍
  • last: Util-linux-2.26 -- 介绍
  • lastb: Util-linux-2.26 -- 介绍
  • lastlog: Shadow-4.2.1 -- 介绍
  • ld: Binutils-2.25 -- 介绍
  • ld.bfd: Binutils-2.25 -- 介绍
  • ldattach: Util-linux-2.26 -- 介绍
  • ldconfig: Glibc-2.21 -- 介绍
  • ldd: Glibc-2.21 -- 介绍
  • lddlibc4: Glibc-2.21 -- 介绍
  • less: Less-458 -- 介绍
  • lessecho: Less-458 -- 介绍
  • lesskey: Less-458 -- 介绍
  • lex: Flex-2.5.39 -- 介绍
  • lexgrog: Man-DB-2.7.1 -- 介绍
  • lfskernel-3.19: Linux-3.19 -- 介绍
  • libasan: GCC-4.9.2 -- 介绍
  • libnetcfg: Perl-5.20.2 -- 介绍
  • libtool: Libtool-2.4.6 -- 介绍
  • libtoolize: Libtool-2.4.6 -- 介绍
  • link: Coreutils-8.23 -- 介绍
  • linux32: Util-linux-2.26 -- 介绍
  • linux64: Util-linux-2.26 -- 介绍
  • lkbib: Groff-1.22.3 -- 介绍
  • ln: Coreutils-8.23 -- 介绍
  • lnstat: IPRoute2-3.19.0 -- 介绍
  • loadkeys: Kbd-2.0.2 -- 介绍
  • loadunimap: Kbd-2.0.2 -- 介绍
  • locale: Glibc-2.21 -- 介绍
  • localectl: Systemd-219 -- 介绍
  • localedef: Glibc-2.21 -- 介绍
  • locate: Findutils-4.4.2 -- 介绍
  • logger: Util-linux-2.26 -- 介绍
  • login: Shadow-4.2.1 -- 介绍
  • loginctl: Systemd-219 -- 介绍
  • logname: Coreutils-8.23 -- 介绍
  • logoutd: Shadow-4.2.1 -- 介绍
  • logsave: E2fsprogs-1.42.12 -- 介绍
  • look: Util-linux-2.26 -- 介绍
  • lookbib: Groff-1.22.3 -- 介绍
  • losetup: Util-linux-2.26 -- 介绍
  • ls: Coreutils-8.23 -- 介绍
  • lsattr: E2fsprogs-1.42.12 -- 介绍
  • lsblk: Util-linux-2.26 -- 介绍
  • lscpu: Util-linux-2.26 -- 介绍
  • lslocks: Util-linux-2.26 -- 介绍
  • lslogins: Util-linux-2.26 -- 介绍
  • lsmod: Kmod-19 -- 介绍
  • lzcat: Xz-5.2.0 -- 介绍
  • lzcmp: Xz-5.2.0 -- 介绍
  • lzdiff: Xz-5.2.0 -- 介绍
  • lzegrep: Xz-5.2.0 -- 介绍
  • lzfgrep: Xz-5.2.0 -- 介绍
  • lzgrep: Xz-5.2.0 -- 介绍
  • lzless: Xz-5.2.0 -- 介绍
  • lzma: Xz-5.2.0 -- 介绍
  • lzmadec: Xz-5.2.0 -- 介绍
  • lzmainfo: Xz-5.2.0 -- 介绍
  • lzmore: Xz-5.2.0 -- 介绍
  • m4: M4-1.4.17 -- 介绍
  • machinectl: Systemd-219 -- 介绍
  • make: Make-4.1 -- 介绍
  • makedb: Glibc-2.21 -- 介绍
  • makeinfo: Texinfo-5.2 -- 介绍
  • man: Man-DB-2.7.1 -- 介绍
  • mandb: Man-DB-2.7.1 -- 介绍
  • manpath: Man-DB-2.7.1 -- 介绍
  • mapscrn: Kbd-2.0.2 -- 介绍
  • mcookie: Util-linux-2.26 -- 介绍
  • md5sum: Coreutils-8.23 -- 介绍
  • mdate-sh: Automake-1.15 -- 介绍
  • mesg: Util-linux-2.26 -- 介绍
  • missing: Automake-1.15 -- 介绍
  • mkdir: Coreutils-8.23 -- 介绍
  • mke2fs: E2fsprogs-1.42.12 -- 介绍
  • mkfifo: Coreutils-8.23 -- 介绍
  • mkfs: Util-linux-2.26 -- 介绍
  • mkfs.bfs: Util-linux-2.26 -- 介绍
  • mkfs.cramfs: Util-linux-2.26 -- 介绍
  • mkfs.ext2: E2fsprogs-1.42.12 -- 介绍
  • mkfs.ext3: E2fsprogs-1.42.12 -- 介绍
  • mkfs.ext4: E2fsprogs-1.42.12 -- 介绍
  • mkfs.ext4dev: E2fsprogs-1.42.12 -- 介绍
  • mkfs.minix: Util-linux-2.26 -- 介绍
  • mkinstalldirs: Automake-1.15 -- 介绍
  • mklost+found: E2fsprogs-1.42.12 -- 介绍
  • mknod: Coreutils-8.23 -- 介绍
  • mkswap: Util-linux-2.26 -- 介绍
  • mktemp: Coreutils-8.23 -- 介绍
  • mk_cmds: E2fsprogs-1.42.12 -- 介绍
  • mmroff: Groff-1.22.3 -- 介绍
  • modinfo: Kmod-19 -- 介绍
  • modprobe: Kmod-19 -- 介绍
  • more: Util-linux-2.26 -- 介绍
  • mount: Util-linux-2.26 -- 介绍
  • mountpoint: Util-linux-2.26 -- 介绍
  • msgattrib: Gettext-0.19.4 -- 介绍
  • msgcat: Gettext-0.19.4 -- 介绍
  • msgcmp: Gettext-0.19.4 -- 介绍
  • msgcomm: Gettext-0.19.4 -- 介绍
  • msgconv: Gettext-0.19.4 -- 介绍
  • msgen: Gettext-0.19.4 -- 介绍
  • msgexec: Gettext-0.19.4 -- 介绍
  • msgfilter: Gettext-0.19.4 -- 介绍
  • msgfmt: Gettext-0.19.4 -- 介绍
  • msggrep: Gettext-0.19.4 -- 介绍
  • msginit: Gettext-0.19.4 -- 介绍
  • msgmerge: Gettext-0.19.4 -- 介绍
  • msgunfmt: Gettext-0.19.4 -- 介绍
  • msguniq: Gettext-0.19.4 -- 介绍
  • mtrace: Glibc-2.21 -- 介绍
  • mv: Coreutils-8.23 -- 介绍
  • namei: Util-linux-2.26 -- 介绍
  • ncursesw5-config: Ncurses-5.9 -- 介绍
  • neqn: Groff-1.22.3 -- 介绍
  • networkctl: Systemd-219 -- 介绍
  • newgrp: Shadow-4.2.1 -- 介绍
  • newusers: Shadow-4.2.1 -- 介绍
  • ngettext: Gettext-0.19.4 -- 介绍
  • nice: Coreutils-8.23 -- 介绍
  • nl: Coreutils-8.23 -- 介绍
  • nm: Binutils-2.25 -- 介绍
  • nohup: Coreutils-8.23 -- 介绍
  • nologin: Shadow-4.2.1 -- 介绍
  • nproc: Coreutils-8.23 -- 介绍
  • nroff: Groff-1.22.3 -- 介绍
  • nscd: Glibc-2.21 -- 介绍
  • nsenter: Util-linux-2.26 -- 介绍
  • nstat: IPRoute2-3.19.0 -- 介绍
  • numfmt: Coreutils-8.23 -- 介绍
  • objcopy: Binutils-2.25 -- 介绍
  • objdump: Binutils-2.25 -- 介绍
  • od: Coreutils-8.23 -- 介绍
  • oldfind: Findutils-4.4.2 -- 介绍
  • openvt: Kbd-2.0.2 -- 介绍
  • partx: Util-linux-2.26 -- 介绍
  • passwd: Shadow-4.2.1 -- 介绍
  • paste: Coreutils-8.23 -- 介绍
  • patch: Patch-2.7.4 -- 介绍
  • pathchk: Coreutils-8.23 -- 介绍
  • pcprofiledump: Glibc-2.21 -- 介绍
  • pdfroff: Groff-1.22.3 -- 介绍
  • pdftexi2dvi: Texinfo-5.2 -- 介绍
  • peekfd: Psmisc-22.21 -- 介绍
  • perl: Perl-5.20.2 -- 介绍
  • perl5.20.2: Perl-5.20.2 -- 介绍
  • perlbug: Perl-5.20.2 -- 介绍
  • perldoc: Perl-5.20.2 -- 介绍
  • perlivp: Perl-5.20.2 -- 介绍
  • perlthanks: Perl-5.20.2 -- 介绍
  • pfbtops: Groff-1.22.3 -- 介绍
  • pg: Util-linux-2.26 -- 介绍
  • pgrep: Procps-ng-3.3.10 -- 介绍
  • pic: Groff-1.22.3 -- 介绍
  • pic2graph: Groff-1.22.3 -- 介绍
  • piconv: Perl-5.20.2 -- 介绍
  • pidof: Procps-ng-3.3.10 -- 介绍
  • ping: Inetutils-1.9.2 -- 介绍
  • ping6: Inetutils-1.9.2 -- 介绍
  • pinky: Coreutils-8.23 -- 介绍
  • pivot_root: Util-linux-2.26 -- 介绍
  • pkg-config: Pkg-config-0.28 -- 介绍
  • pkill: Procps-ng-3.3.10 -- 介绍
  • pl2pm: Perl-5.20.2 -- 介绍
  • pldd: Glibc-2.21 -- 介绍
  • pmap: Procps-ng-3.3.10 -- 介绍
  • pod2html: Perl-5.20.2 -- 介绍
  • pod2latex: Perl-5.20.2 -- 介绍
  • pod2man: Perl-5.20.2 -- 介绍
  • pod2texi: Texinfo-5.2 -- 介绍
  • pod2text: Perl-5.20.2 -- 介绍
  • pod2usage: Perl-5.20.2 -- 介绍
  • podchecker: Perl-5.20.2 -- 介绍
  • podselect: Perl-5.20.2 -- 介绍
  • post-grohtml: Groff-1.22.3 -- 介绍
  • poweroff: Systemd-219 -- 介绍
  • pr: Coreutils-8.23 -- 介绍
  • pre-grohtml: Groff-1.22.3 -- 介绍
  • preconv: Groff-1.22.3 -- 介绍
  • printenv: Coreutils-8.23 -- 介绍
  • printf: Coreutils-8.23 -- 介绍
  • prlimit: Util-linux-2.26 -- 介绍
  • prove: Perl-5.20.2 -- 介绍
  • prtstat: Psmisc-22.21 -- 介绍
  • ps: Procps-ng-3.3.10 -- 介绍
  • psed: Perl-5.20.2 -- 介绍
  • psfaddtable: Kbd-2.0.2 -- 介绍
  • psfgettable: Kbd-2.0.2 -- 介绍
  • psfstriptable: Kbd-2.0.2 -- 介绍
  • psfxtable: Kbd-2.0.2 -- 介绍
  • pstree: Psmisc-22.21 -- 介绍
  • pstree.x11: Psmisc-22.21 -- 介绍
  • pstruct: Perl-5.20.2 -- 介绍
  • ptar: Perl-5.20.2 -- 介绍
  • ptardiff: Perl-5.20.2 -- 介绍
  • ptargrep: Perl-5.20.2 -- 介绍
  • ptx: Coreutils-8.23 -- 介绍
  • pwck: Shadow-4.2.1 -- 介绍
  • pwconv: Shadow-4.2.1 -- 介绍
  • pwd: Coreutils-8.23 -- 介绍
  • pwdx: Procps-ng-3.3.10 -- 介绍
  • pwunconv: Shadow-4.2.1 -- 介绍
  • py-compile: Automake-1.15 -- 介绍
  • ranlib: Binutils-2.25 -- 介绍
  • raw: Util-linux-2.26 -- 介绍
  • rcp: Inetutils-1.9.2 -- 介绍
  • readelf: Binutils-2.25 -- 介绍
  • readlink: Coreutils-8.23 -- 介绍
  • readprofile: Util-linux-2.26 -- 介绍
  • realpath: Coreutils-8.23 -- 介绍
  • reboot: Systemd-219 -- 介绍
  • recode-sr-latin: Gettext-0.19.4 -- 介绍
  • refer: Groff-1.22.3 -- 介绍
  • rename: Util-linux-2.26 -- 介绍
  • renice: Util-linux-2.26 -- 介绍
  • reset: Ncurses-5.9 -- 介绍
  • resize2fs: E2fsprogs-1.42.12 -- 介绍
  • resizepart: Util-linux-2.26 -- 介绍
  • rev: Util-linux-2.26 -- 介绍
  • rexec: Inetutils-1.9.2 -- 介绍
  • rlogin: Inetutils-1.9.2 -- 介绍
  • rm: Coreutils-8.23 -- 介绍
  • rmdir: Coreutils-8.23 -- 介绍
  • rmmod: Kmod-19 -- 介绍
  • rmt: Tar-1.28 -- 介绍
  • roff2dvi: Groff-1.22.3 -- 介绍
  • roff2html: Groff-1.22.3 -- 介绍
  • roff2pdf: Groff-1.22.3 -- 介绍
  • roff2ps: Groff-1.22.3 -- 介绍
  • roff2text: Groff-1.22.3 -- 介绍
  • roff2x: Groff-1.22.3 -- 介绍
  • routef: IPRoute2-3.19.0 -- 介绍
  • routel: IPRoute2-3.19.0 -- 介绍
  • rpcgen: Glibc-2.21 -- 介绍
  • rsh: Inetutils-1.9.2 -- 介绍
  • rtacct: IPRoute2-3.19.0 -- 介绍
  • rtcwake: Util-linux-2.26 -- 介绍
  • rtmon: IPRoute2-3.19.0 -- 介绍
  • rtpr: IPRoute2-3.19.0 -- 介绍
  • rtstat: IPRoute2-3.19.0 -- 介绍
  • runcon: Coreutils-8.23 -- 介绍
  • runlevel: Systemd-219 -- 介绍
  • runtest: DejaGNU-1.5.2 -- 介绍
  • rview: Vim-7.4 -- 介绍
  • rvim: Vim-7.4 -- 介绍
  • s2p: Perl-5.20.2 -- 介绍
  • script: Util-linux-2.26 -- 介绍
  • scriptreplay: Util-linux-2.26 -- 介绍
  • sdiff: Diffutils-3.3 -- 介绍
  • sed: Sed-4.2.2 -- 介绍
  • seq: Coreutils-8.23 -- 介绍
  • setacl: Acl-2.2.52 -- 介绍
  • setarch: Util-linux-2.26 -- 介绍
  • setattr: Attr-2.4.47 -- 介绍
  • setfont: Kbd-2.0.2 -- 介绍
  • setkeycodes: Kbd-2.0.2 -- 介绍
  • setleds: Kbd-2.0.2 -- 介绍
  • setmetamode: Kbd-2.0.2 -- 介绍
  • setsid: Util-linux-2.26 -- 介绍
  • setterm: Util-linux-2.26 -- 介绍
  • sfdisk: Util-linux-2.26 -- 介绍
  • sg: Shadow-4.2.1 -- 介绍
  • sh: Bash-4.3.30 -- 介绍
  • sha1sum: Coreutils-8.23 -- 介绍
  • sha224sum: Coreutils-8.23 -- 介绍
  • sha256sum: Coreutils-8.23 -- 介绍
  • sha384sum: Coreutils-8.23 -- 介绍
  • sha512sum: Coreutils-8.23 -- 介绍
  • shasum: Perl-5.20.2 -- 介绍
  • showconsolefont: Kbd-2.0.2 -- 介绍
  • showkey: Kbd-2.0.2 -- 介绍
  • shred: Coreutils-8.23 -- 介绍
  • shuf: Coreutils-8.23 -- 介绍
  • shutdown: Systemd-219 -- 介绍
  • size: Binutils-2.25 -- 介绍
  • slabtop: Procps-ng-3.3.10 -- 介绍
  • sleep: Coreutils-8.23 -- 介绍
  • sln: Glibc-2.21 -- 介绍
  • soelim: Groff-1.22.3 -- 介绍
  • sort: Coreutils-8.23 -- 介绍
  • sotruss: Glibc-2.21 -- 介绍
  • splain: Perl-5.20.2 -- 介绍
  • split: Coreutils-8.23 -- 介绍
  • sprof: Glibc-2.21 -- 介绍
  • ss: IPRoute2-3.19.0 -- 介绍
  • stat: Coreutils-8.23 -- 介绍
  • stdbuf: Coreutils-8.23 -- 介绍
  • strings: Binutils-2.25 -- 介绍
  • strip: Binutils-2.25 -- 介绍
  • stty: Coreutils-8.23 -- 介绍
  • su: Shadow-4.2.1 -- 介绍
  • sulogin: Util-linux-2.26 -- 介绍
  • sum: Coreutils-8.23 -- 介绍
  • swaplabel: Util-linux-2.26 -- 介绍
  • swapoff: Util-linux-2.26 -- 介绍
  • swapon: Util-linux-2.26 -- 介绍
  • switch_root: Util-linux-2.26 -- 介绍
  • sync: Coreutils-8.23 -- 介绍
  • sysctl: Procps-ng-3.3.10 -- 介绍
  • systemctl: Systemd-219 -- 介绍
  • systemd-analyze: Systemd-219 -- 介绍
  • systemd-ask-password: Systemd-219 -- 介绍
  • systemd-cat: Systemd-219 -- 介绍
  • systemd-cgls: Systemd-219 -- 介绍
  • systemd-cgtop: Systemd-219 -- 介绍
  • systemd-delta: Systemd-219 -- 介绍
  • systemd-detect-virt: Systemd-219 -- 介绍
  • systemd-escape: Systemd-219 -- 介绍
  • systemd-hwdb: Systemd-219 -- 介绍
  • systemd-inhibit: Systemd-219 -- 介绍
  • systemd-machine-id-setup: Systemd-219 -- 介绍
  • systemd-notify: Systemd-219 -- 介绍
  • systemd-nspawn: Systemd-219 -- 介绍
  • systemd-path: Systemd-219 -- 介绍
  • systemd-run: Systemd-219 -- 介绍
  • systemd-tmpfiles: Systemd-219 -- 介绍
  • systemd-tty-ask-password-agent: Systemd-219 -- 介绍
  • tabs: Ncurses-5.9 -- 介绍
  • tac: Coreutils-8.23 -- 介绍
  • tail: Coreutils-8.23 -- 介绍
  • tailf: Util-linux-2.26 -- 介绍
  • talk: Inetutils-1.9.2 -- 介绍
  • tar: Tar-1.28 -- 介绍
  • taskset: Util-linux-2.26 -- 介绍
  • tbl: Groff-1.22.3 -- 介绍
  • tc: IPRoute2-3.19.0 -- 介绍
  • tclsh: Tcl-8.6.3 -- 介绍
  • tclsh8.6: Tcl-8.6.3 -- 介绍
  • tee: Coreutils-8.23 -- 介绍
  • telinit: Systemd-219 -- 介绍
  • telnet: Inetutils-1.9.2 -- 介绍
  • test: Coreutils-8.23 -- 介绍
  • texi2dvi: Texinfo-5.2 -- 介绍
  • texi2pdf: Texinfo-5.2 -- 介绍
  • texi2any: Texinfo-5.2 -- 介绍
  • texindex: Texinfo-5.2 -- 介绍
  • tfmtodit: Groff-1.22.3 -- 介绍
  • tftp: Inetutils-1.9.2 -- 介绍
  • tic: Ncurses-5.9 -- 介绍
  • timedatectl: Systemd-219 -- 介绍
  • timeout: Coreutils-8.23 -- 介绍
  • tload: Procps-ng-3.3.10 -- 介绍
  • toe: Ncurses-5.9 -- 介绍
  • top: Procps-ng-3.3.10 -- 介绍
  • touch: Coreutils-8.23 -- 介绍
  • tput: Ncurses-5.9 -- 介绍
  • tr: Coreutils-8.23 -- 介绍
  • traceroute: Inetutils-1.9.2 -- 介绍
  • troff: Groff-1.22.3 -- 介绍
  • true: Coreutils-8.23 -- 介绍
  • truncate: Coreutils-8.23 -- 介绍
  • tset: Ncurses-5.9 -- 介绍
  • tsort: Coreutils-8.23 -- 介绍
  • tty: Coreutils-8.23 -- 介绍
  • tune2fs: E2fsprogs-1.42.12 -- 介绍
  • tzselect: Glibc-2.21 -- 介绍
  • udevadm: Systemd-219 -- 介绍
  • ul: Util-linux-2.26 -- 介绍
  • umount: Util-linux-2.26 -- 介绍
  • uname: Coreutils-8.23 -- 介绍
  • uncompress: Gzip-1.6 -- 介绍
  • unexpand: Coreutils-8.23 -- 介绍
  • unicode_start: Kbd-2.0.2 -- 介绍
  • unicode_stop: Kbd-2.0.2 -- 介绍
  • uniq: Coreutils-8.23 -- 介绍
  • unlink: Coreutils-8.23 -- 介绍
  • unlzma: Xz-5.2.0 -- 介绍
  • unshare: Util-linux-2.26 -- 介绍
  • unxz: Xz-5.2.0 -- 介绍
  • updatedb: Findutils-4.4.2 -- 介绍
  • uptime: Procps-ng-3.3.10 -- 介绍
  • useradd: Shadow-4.2.1 -- 介绍
  • userdel: Shadow-4.2.1 -- 介绍
  • usermod: Shadow-4.2.1 -- 介绍
  • users: Coreutils-8.23 -- 介绍
  • utmpdump: Util-linux-2.26 -- 介绍
  • uuidd: Util-linux-2.26 -- 介绍
  • uuidgen: Util-linux-2.26 -- 介绍
  • vdir: Coreutils-8.23 -- 介绍
  • vi: Vim-7.4 -- 介绍
  • view: Vim-7.4 -- 介绍
  • vigr: Shadow-4.2.1 -- 介绍
  • vim: Vim-7.4 -- 介绍
  • vimdiff: Vim-7.4 -- 介绍
  • vimtutor: Vim-7.4 -- 介绍
  • vipw: Shadow-4.2.1 -- 介绍
  • vmstat: Procps-ng-3.3.10 -- 介绍
  • w: Procps-ng-3.3.10 -- 介绍
  • wall: Util-linux-2.26 -- 介绍
  • watch: Procps-ng-3.3.10 -- 介绍
  • wc: Coreutils-8.23 -- 介绍
  • wdctl: Util-linux-2.26 -- 介绍
  • whatis: Man-DB-2.7.1 -- 介绍
  • whereis: Util-linux-2.26 -- 介绍
  • who: Coreutils-8.23 -- 介绍
  • whoami: Coreutils-8.23 -- 介绍
  • wipefs: Util-linux-2.26 -- 介绍
  • x86_64: Util-linux-2.26 -- 介绍
  • xargs: Findutils-4.4.2 -- 介绍
  • xgettext: Gettext-0.19.4 -- 介绍
  • xmlwf: Expat-2.1.0 -- 介绍
  • xsubpp: Perl-5.20.2 -- 介绍
  • xtrace: Glibc-2.21 -- 介绍
  • xxd: Vim-7.4 -- 介绍
  • xz: Xz-5.2.0 -- 介绍
  • xzcat: Xz-5.2.0 -- 介绍
  • xzcmp: Xz-5.2.0 -- 介绍
  • xzdec: Xz-5.2.0 -- 介绍
  • xzdiff: Xz-5.2.0 -- 介绍
  • xzegrep: Xz-5.2.0 -- 介绍
  • xzfgrep: Xz-5.2.0 -- 介绍
  • xzgrep: Xz-5.2.0 -- 介绍
  • xzless: Xz-5.2.0 -- 介绍
  • xzmore: Xz-5.2.0 -- 介绍
  • yacc: Bison-3.0.4 -- 介绍
  • yes: Coreutils-8.23 -- 介绍
  • ylwrap: Automake-1.15 -- 介绍
  • zcat: Gzip-1.6 -- 介绍
  • zcmp: Gzip-1.6 -- 介绍
  • zdiff: Gzip-1.6 -- 介绍
  • zdump: Glibc-2.21 -- 介绍
  • zegrep: Gzip-1.6 -- 介绍
  • zfgrep: Gzip-1.6 -- 介绍
  • zforce: Gzip-1.6 -- 介绍
  • zgrep: Gzip-1.6 -- 介绍
  • zic: Glibc-2.21 -- 介绍
  • zipdetails: Perl-5.20.2 -- 介绍
  • zless: Gzip-1.6 -- 介绍
  • zmore: Gzip-1.6 -- 介绍
  • znew: Gzip-1.6 -- 介绍
  • zramctl: Util-linux-2.26 -- 介绍
  • zsoelim: Man-DB-2.7.1 -- 介绍

库

  • Expat: XML::Parser-2.44 -- 介绍
  • ld-2.21.so: Glibc-2.21 -- 介绍
  • libacl: Acl-2.2.52 -- 介绍
  • libanl: Glibc-2.21 -- 介绍
  • libasprintf: Gettext-0.19.4 -- 介绍
  • libattr: Attr-2.4.47 -- 介绍
  • libbfd: Binutils-2.25 -- 介绍
  • libblkid: Util-linux-2.26 -- 介绍
  • libBrokenLocale: Glibc-2.21 -- 介绍
  • libbz2: Bzip2-1.0.6 -- 介绍
  • libc: Glibc-2.21 -- 介绍
  • libcap: Libcap-2.24 -- 介绍
  • libcheck: Check-0.9.14 -- 介绍
  • libcidn: Glibc-2.21 -- 介绍
  • libcom_err: E2fsprogs-1.42.12 -- 介绍
  • libcrypt: Glibc-2.21 -- 介绍
  • libcursesw: Ncurses-5.9 -- 介绍
  • libdbus-1: D-Bus-1.8.16 -- 介绍
  • libdl: Glibc-2.21 -- 介绍
  • libe2p: E2fsprogs-1.42.12 -- 介绍
  • libexpat: Expat-2.1.0 -- 介绍
  • libexpect-5.45: Expect-5.45 -- 介绍
  • libext2fs: E2fsprogs-1.42.12 -- 介绍
  • libfdisk: Util-linux-2.26 -- 介绍
  • libfl: Flex-2.5.39 -- 介绍
  • libformw: Ncurses-5.9 -- 介绍
  • libg: Glibc-2.21 -- 介绍
  • libgcc: GCC-4.9.2 -- 介绍
  • libgcov: GCC-4.9.2 -- 介绍
  • libgdbm: GDBM-1.11 -- 介绍
  • libgdbm_compat: GDBM-1.11 -- 介绍
  • libgettextlib: Gettext-0.19.4 -- 介绍
  • libgettextpo: Gettext-0.19.4 -- 介绍
  • libgettextsrc: Gettext-0.19.4 -- 介绍
  • libgmp: GMP-6.0.0a -- 介绍
  • libgmpxx: GMP-6.0.0a -- 介绍
  • libgomp: GCC-4.9.2 -- 介绍
  • libhistory: Readline-6.3 -- 介绍
  • libiberty: GCC-4.9.2 -- 介绍
  • libieee: Glibc-2.21 -- 介绍
  • libkmod: Kmod-19
  • libltdl: Libtool-2.4.6 -- 介绍
  • liblto_plugin: GCC-4.9.2 -- 介绍
  • liblzma: Xz-5.2.0 -- 介绍
  • libm: Glibc-2.21 -- 介绍
  • libmagic: File-5.22 -- 介绍
  • libman: Man-DB-2.7.1 -- 介绍
  • libmandb: Man-DB-2.7.1 -- 介绍
  • libmcheck: Glibc-2.21 -- 介绍
  • libmemusage: Glibc-2.21 -- 介绍
  • libmenuw: Ncurses-5.9 -- 介绍
  • libmount: Util-linux-2.26 -- 介绍
  • libmpc: MPC-1.0.2 -- 介绍
  • libmpfr: MPFR-3.1.2 -- 介绍
  • libncursesw: Ncurses-5.9 -- 介绍
  • libnsl: Glibc-2.21 -- 介绍
  • libnss: Glibc-2.21 -- 介绍
  • libopcodes: Binutils-2.25 -- 介绍
  • libpanelw: Ncurses-5.9 -- 介绍
  • libpcprofile: Glibc-2.21 -- 介绍
  • libpipeline: Libpipeline-1.4.0
  • libprocps: Procps-ng-3.3.10 -- 介绍
  • libpthread: Glibc-2.21 -- 介绍
  • libquadmath: GCC-4.9.2 -- 介绍
  • libquota: E2fsprogs-1.42.12 -- 介绍
  • libreadline: Readline-6.3 -- 介绍
  • libresolv: Glibc-2.21 -- 介绍
  • librpcsvc: Glibc-2.21 -- 介绍
  • librt: Glibc-2.21 -- 介绍
  • libSegFault: Glibc-2.21 -- 介绍
  • libsmartcols: Util-linux-2.26 -- 介绍
  • libss: E2fsprogs-1.42.12 -- 介绍
  • libssp: GCC-4.9.2 -- 介绍
  • libstdbuf: Coreutils-8.23 -- 介绍
  • libstdc++: GCC-4.9.2 -- 介绍
  • libsupc++: GCC-4.9.2 -- 介绍
  • libsystemd: Systemd-219 -- 介绍
  • libtcl8.6.so: Tcl-8.6.3 -- 介绍
  • libtclstub8.6.a: Tcl-8.6.3 -- 介绍
  • libthread_db: Glibc-2.21 -- 介绍
  • libtsan: GCC-4.9.2 -- 介绍
  • libudev: Systemd-219 -- 介绍
  • libutil: Glibc-2.21 -- 介绍
  • libuuid: Util-linux-2.26 -- 介绍
  • liby: Bison-3.0.4 -- 介绍
  • libz: Zlib-1.2.8 -- 介绍
  • preloadable_libintl: Gettext-0.19.4 -- 介绍

脚本

  • clock:
    • 配置： 配置系统时钟
  • console:
    • 配置： 配置 Linux 终端
  • hostname:
    • 配置： 配置系统主机名
  • localnet:
    • /etc/hosts: 定制 /etc/hosts 文件
  • network:
    • /etc/hosts: 定制 /etc/hosts 文件
    • 配置： 通用网络配置

其他

  • /boot/config-3.19: Linux-3.19 -- 介绍
  • /boot/System.map-3.19: Linux-3.19 -- 介绍
  • /dev/*: 准备虚拟内核文件系统
  • /etc/fstab: 创建 /etc/fstab 文件
  • /etc/group: 创建必需的文件和链接
  • /etc/hosts: 定制 /etc/hosts 文件
  • /etc/inputrc: 创建 /etc/inputrc 文件
  • /etc/ld.so.conf: 配置动态库加载器
  • /etc/lfs-release: 尾声
  • /etc/localtime: 配置 Glibc
  • /etc/lsb-release: 尾声
  • /etc/modprobe.d/usb.conf: 配置 Linux 模块加载顺序
  • /etc/nsswitch.conf: 配置 Glibc
  • /etc/os-release: 尾声
  • /etc/passwd: 创建必需的文件和链接
  • /etc/protocols: Iana-Etc-2.30
  • /etc/resolv.conf: 创建 /etc/resolv.conf 文件
  • /etc/services: Iana-Etc-2.30
  • /etc/vimrc: 配置 Vim
  • /usr/include/asm-generic/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/asm/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/drm/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/linux/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/mtd/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/rdma/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/scsi/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/sound/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/video/*.h: Linux-3.19 API 头文件 -- 介绍
  • /usr/include/xen/*.h: Linux-3.19 API 头文件 -- 介绍
  • /var/log/btmp: 创建必需的文件和链接
  • /var/log/lastlog: 创建必需的文件和链接
  • /var/log/wtmp: 创建必需的文件和链接
  • /var/run/utmp: 创建必需的文件和链接
  • /etc/locale.conf: 配置系统语言环境
  • /etc/shells: 创建 /etc/shells 文件
  • man 手册: Man-pages-3.79 -- 介绍
  • Systemd 定制: Systemd 使用和配置
翻译团队：LCTT 译者/校对：zpl1025,wxy
  • 上一页

    The MIT License

  • .


Legal Notice

Copyright @1999-2015, Gerard Beekmans

All rights reserved.

This book is licensed under a Creative Commons License.

Computer instructions may be extracted from the book under the MIT License.

Linux@is a registered trademark of Linus Torvalds.

  • Home