FreezeJ' Blog

LFS 搭建笔记

2020-04-14

LFS 搭建笔记

版本:SVN-20200401
文档链接:http://www.linuxfromscratch.org/lfs/view/development/index.html
软件镜像源:http://mirrors.ustc.edu.cn/lfs/lfs-packages/9.1/

简介

本书共4部分,分为9章节,以下为每一章节的介绍。

第1章为本书的介绍和说明部分。

第2章介绍了如何创建新的Linux本机分区和文件系统。在这里将编译和安装新的LFS系统。

第3章介绍了构建LFS系统需要下载哪些软件包和修补程序以及如何将它们存储在新文件系统中。

第4章讨论了合适的工作环境的设置,以及如何搭建工作环境。

第5章说明了许多软件包的安装,这些软件包将构成第6章中用于构建实际系统的基本开发套件(或工具链)。

第6章构建了完整的LFS系统。在chroot环境(改变root)程序用来进入一个虚拟环境,并开始一个新的shell,其根目录被设置为LFS分区。

第7章为设置基本的系统配置。

第8章为设置内核和引导加载程序。

第9章包含有关在本书之外继续LFS经验的信息。实施本书中的步骤之后,计算机将准备好重新启动进入新的LFS系统。

核心

第二部分的总体目标 是创建一个临时区域,其中包含可以与主机系统隔离的一组已知良好的工具。通过使用 chroot,其余各章中的命令将包含在该环境中,从而确保目标LFS系统的构建干净无误。
包括的工具链有:

Binutils-2.34 # Binutils程序包包含一个链接器,一个汇编器和其他用于处理目标文件的工具。
GCC-9.3.0 # GCC软件包包含GNU编译器集合,其中包括C和C ++编译器。
Linux-5.5.9 API Headers  # 内核的API,供Glibc使用。
Glibc-2.31  # Glibc软件包包含主要的C库。该库提供了用于分配内存,搜索目录,打开和关闭文件,读取和写入文件,字符串处理,模式匹配,算术等等的基本例程。
Libstdc++  # 标准的C++库
Tcl-8.6.10  # 工具命令语言,强大的通用脚本语言。
Expect-5.45.4  # 自动化工具,通过脚本对话框,交互式应用,如远程登录, FTP,passwd,fsck的,远程登录并提示。DejaGnu依赖Expect
DejaGNU-1.6.2  # GNU工具的运行测试套件的框架
M4-1.4.18  # 宏处理器
Ncurses-6.2  # 终端独立处理字符屏幕的库
Bash-5.0  # Bourne-Again SHell
Bison-3.5.3  # 解析器生成器
Bzip2-1.0.8  # 压缩和解压缩文件的程序
Coreutils-8.32  # 显示和设置基本系统特征的实用程序
Diffutils-3.7  # 显示文件或目录之间差异的程序
File-5.38  # 查看文件或多个文件类型的实用程序
Findutils-4.7.0  # 查找文件的程序
Gawk-5.0.1  # 处理文本文件的程序
Gettext-0.20.1  # 国际化和本地化的实用程序
Grep-3.4  # 搜索、过滤文件的程序
Gzip-1.10  # 压缩和解压缩文件
Make-4.3  # 编译软件包的程序
Patch-2.7.6  # 通常由diff程序创建的“补丁程序”文件 来修改或创建文件
Perl-5.30.2  # 实用的提取和报告语言
Python-3.8.2  # Python开发环境
Sed-4.8  # 流编辑器
Tar-1.32  # 归档程序
Texinfo-6.7  # 用于读取,写入和转换信息页面的程序
Xz-5.2.5  # 压缩和解压缩文件的程序

第三部分为使用第二部分建立的与主机系统隔离的工具来建立LFS系统,安装基本系统软件与系统配置文件介绍。
包括的工具链有:

Linux-5.5.9 API Headers
Man-pages-5.05  # 帮助手册
Glibc-2.31  # Glibc软件包包含主要的C库。该库提供了用于分配内存,搜索目录,打开和关闭文件,读取和写入文件,字符串处理,模式匹配,算术等等的基本例程。
Zlib-1.2.11  # 程序使用的压缩和解压缩库
Bzip2-1.0.8  # # 程序使用的压缩和解压缩库
Xz-5.2.5  # # 程序使用的压缩和解压缩库
File-5.38  # 查看文件或多个文件类型的实用程序
Readline-8.0  # 提供命令行编辑和历史记录功能的库。
M4-1.4.18  # 宏处理器
Bc-2.6.0  # 算数运算
Binutils-2.34 # Binutils程序包包含一个链接器,一个汇编器和其他用于处理目标文件的工具。
GMP-6.2.0  # 精密数学函数
MPFR-4.0.2  # 多精度数学的函数
MPC-1.1.0  # 复数算术运算
Attr-2.4.48  # 管理文件系统对象上的扩展属性
Acl-2.2.53  # 为文件和目录定义更细粒度的自由访问权限
Shadow-4.8.1  # 以安全方式处理密码的程序
GCC-9.3.0 # GCC软件包包含GNU编译器集合,其中包括C和C ++编译器
Pkg-config-0.29.2  # 用于在配置和执行文件期间传递包含路径和/或库路径以构建工具
Ncurses-6.2  # 用于终端独立处理字符屏幕的库
Libcap-2.33  # 将所有强大的root特权划分为一组不同的特权
Sed-4.8  # 流编辑器
Psmisc-23.3  # 显示有关正在运行的进程的信息的程序
Iana-Etc-2.30  # 为网络服务和协议提供数据
Bison-3.5.3  # 解析器生成器
Flex-2.6.4  # 生成识别文本模式的程序
Grep-3.4  # 搜索、过滤文件的程序
Bash-5.0  # Bourne-Again SHell
Libtool-2.4.6  # GNU通用库支持脚本
GDBM-1.18.1  # GNU数据库管理器
Gperf-3.1  # 从密钥集生成哈希函数
Expat-2.2.9  # 面向流的C库,用于解析XML
Inetutils-1.9.4  # 基本联网的程序
Perl-5.30.2  # 提取和报告语言
XML::Parser-2.46  # James Clark的XML解析器Expat的Perl接口
Intltool-0.51.0  # 一种国际化工具,用于从源文件中提取可翻译字符串
Autoconf-2.69  # 用于生成可自动配置源代码的Shell脚本的程序
Automake-1.16.2  # 用于生成与Autoconf一起使用的Makefile的程序
Kmod-27  # 用于加载内核模块的库和实用程序
Gettext-0.20.1  # 用于国际化和本地化的实用程序
Libelf from Elfutils-0.179  # 用于处理ELF(可执行和可链接格式)文件的库
Libffi-3.3  # 为各种调用约定提供了一个可移植的高级编程接口。这允许程序员在运行时调用由调用接口描述指定的任何函数
OpenSSL-1.1.1f  # 与加密有关的管理工具和库
Python-3.8.2  # Python开发环境
Ninja-1.10.0  # 注重速度的小型构建系统
Meson-0.54.0  # 高生产率的构建系统
Coreutils-8.32  # 显示和设置基本系统特征的实用程序
Check-0.14.0  # C的单元测试框架
Diffutils-3.7  # 显示文件或目录之间差异的程序
Gawk-5.0.1  # 处理文本文件的程序
Findutils-4.7.0  # 查找文件的程序
Groff-1.22.4  # 处理和格式化文本的程序
GRUB-2.04  # GRand Unified Bootloader
Less-551  # 文本文件查看器
Gzip-1.10  # 压缩和解压缩文件的程序
Zstd-1.4.4  # 实时压缩算法,可提供高压缩率。
IPRoute2-5.5.0  # 基本和高级基于IPV4的网络的程序
Kbd-2.2.0  # 键表文件,控制台字体和键盘实用程序
Libpipeline-1.5.2  # 用于以灵活方便的方式操纵子流程的管道
Make-4.3  # 编译软件包的程序
Patch-2.7.6  # 通常由diff程序创建的“补丁程序”文件 来修改或创建文件
Man-DB-2.9.1  # 手册数据库
Tar-1.32  # 归档程序
Texinfo-6.7  # 用于读取,写入和转换信息页面的程序
Vim-8.2.0486  # 文本编辑器
Procps-ng-3.3.16  # 用于监视过程的程序
Util-linux-2.35.1  # 其他实用程序。其中包括用于处理文件系统,控制台,分区和消息的实用程序
Eudev-3.2.9  # 动态创建设备节点的程序
E2fsprogs-1.45.6  # 处理ext2文件系统的实用程序 。它还支持ext3和ext4日志文件系统
Sysklogd-1.5.1  # 记录系统消息的程序
Sysvinit-2.96  # 控制系统的启动,运行和关闭的程序

系统配置文件:

/etc/sysconfig/ifconfig.eth0  # 网络接口配置
/etc/resolv.conf  # 域名解析配置
/etc/hostname  # 主机名配置
/etc/hosts  # 主机名ip映射配置
/etc/inittab  # 内核初始化文件
/etc/rc.d/  # 启动级别配置
/etc/sysconfig/clock  # 系统时钟配置
/etc/sysconfig/console  # 控制台样式配置
/etc/profile  # profile配置
~/.bash_profile  # bash配置
/etc/inputrc  # 键盘输入映射配置
/etc/shells  # 登录Shell列表
/etc/fstab  # 启动挂载配置

随笔

交叉编译是在一个平台上生成另一个平台上的可执行代码。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

LSB(Linux Standard Base
)有五个独立的标准:内核、C++、桌面、运行时语言和输出。

一般来说,交换分区的推荐大小为物理内存的两倍左右,实际上并无此必要。
对于 LFS 或者是 Gentoo 总是编译源代码的发行版来说,swap 分区是极其有必要的。在编译过程中,编译系统会将那些不总是变化的文件寄存在 swap 分区中,而为软件编译过程提供更多的内存空间。

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

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

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

strip
简单的说就是给文件脱掉外衣,具体就是从特定文件中剥掉一些符号信息和调试信息,使文件变小。
其实, strip不仅仅可以针对可执行文件, 还能针对目标文件和动态库等. 在实际的开发中, 经常需要对动态库.so进行strip操作, 减少占地空间。 而在调试的时候(比如用addr2line), 就需要符号了。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。

使用多个CPU核心来加速编译速度
对于具有多个处理器(或内核)的许多现代系统,可以通过设置环境变量或告知make 程序有多少个处理器来执行“并行make”来减少程序包的编译时间。例如,Core2Duo可以同时支持两个进程:

export MAKEFLAGS=’-j 2’
或仅通过以下方式进行构建:

make -j2

构建此最小系统需要两个步骤。第一步是构建一个新的且独立于主机的工具链(编译器,汇编器,链接器,库和一些有用的实用程序)。第二步使用此工具链构建其他基本工具。

动态链接库查找顺序和路径

ld --verbose | grep SEARCH
SEARCH_DIR("=/usr/x86_64-redhat-linux/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib64"); SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/x86_64-redhat-linux/lib"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib");

静态库和动态库
静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。

静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

sys和proc文件系统
1、sys文件系统本质上和proc文件系统是一样的,都是虚拟文件系统。都在根目录下有个目录(一个是/proc目录,另一个是/sys目录),因此都不是硬盘中的文件,都是内核中的数据结构的可视化接口。

2、不同的是/proc中的文件只能读,但是/sys中的文件可以读写。读/sys中的文件就是获取内核中数据结构的值,而写入/sys中的文件就是设置内核中的数据结构的元素的值。

3、历史上刚开始先有/proc文件系统,后来人们希望通过这种技术来调试内核。实际做出来的时候确实是很有用,所以很多内核开发者都去内核添加代码向/proc目录中写文件,而且刚开始的时候内核管理者对proc目录的使用也没有什么经验也没有什么统一规划,后来导致的结果就是proc里边的内容又多又杂乱。

4、后来觉得proc中的内容太多太乱缺乏统一规划,于是乎又添加了sys目录。sys文件系统一开始就做了很好的规划和约定,所以后来使用sys目录时有了规矩。

临时文件/var/log/wtmp文件记录所有登录和注销。该/var/log/lastlog文件记录每个用户上次登录的时间。该/var/log/faillog文件记录失败的登录尝试。该/var/log/btmp文件记录错误的登录尝试。

编译动态链接库 ld指定动态库链接,除了修改/etc/ld.so.conf文件还要使用ldconfig刷新/etc/ld.so.cache缓存才能生效。
动态链接库查找顺序和路径:ld –verbose | grep SEARCH

理解

LFS 从零开始学Linux,目标是以一个linux环境为基础,从零开始构建一个可用的Linux系统,这个Linux系统并不是最小的系统,而是包含了许多常用的软件,以及基本的开发、编译环境,可以从这个系统按需求繁衍出更为复杂的系统。

通过搭建LFS可以让我对Linux的基本组件有更深刻的认识,包括它们的依赖关系
、伴生关系、配置目录位置等,超过100个常用软件和库的编译让我更加熟悉系统的软件编译安装,各种配置参数的作用。从零开始构建让我了解了Linux的每一个细微的构成,每一个配置文件的作用以及目录位置,GRUB引导Linux的启动过程,

Tags: Linux