第5章构建SLFS发行版 本章学习目标: .掌握基本系统软件的构建。 .掌握系统的基本配置方法。 .理解initramfs文件的作用。 .理解dracut命令的作用。 .掌握内核的配置、编译、安装。 本章真正开始构造SLFS系统。在现代Linux系统中,多数静态库已经失去存在的意 义。另外,将静态库链接到程序中可能是有害的。如果需要更新这个库以解决安全问题,所 有使用该静态库的程序都要重新链接到新版本的库。因此本章及后续各章给出的安装过程 删除或者禁止安装多数静态库。一般来说,传递 - disable-static选项给configure即可。然 而,某些情况下需要使用其他方法。在极个别情况下,特别是对于Glibc和GCC,静态库在 一般软件包的构建过程中仍然很关键,就不能禁用静态库。 一定要执行echo$SRC命令确认环境变量SRC的值为/mnt/tmp/slfsbuild。 5.安装基本系统软件 1 1.Manpags6. -e-03 Man-pages软件包包含2400多个man页面。执行以下命令安装Man-pages。 2.Iana-Etc-20230202 Iana-Etc软件包包含网络服务和协议的数据,只需将文件复制到正确的位置。 安装的文件:/etc/protocols和/etc/services。/etc/protocols描述TCP/IP子系统中 可用的各种DARPAInternet协议。/etc/services提供Internet服务的可读文本名称、底层 的分配端口号以及协议类型之间的对应关系。 3.Glic2.第2次构建) b-37( Glibc软件包包含主要的C语言库。它提供用于分配内存、检索目录、打开和关闭文 件、读写文件、字符串处理、模式匹配、算术等用途的基本子程序。执行以下命令安装Glibc。 一些Glibc程序使用与FHS不兼容的/var/db目录存放它们的运行时数据。第1行的 patch命令应用一个补丁,使得这些程序在FHS兼容的位置存放运行时数据。第2行的 sed命令修复上游发现的安全问题。Glibc文档推荐在一个新建的目录(build)中构建 Glibc。第3行的echo命令确保将ldconfig和sln工具安装到/usr/sbin目录中。 . /configure配置选项的含义: - disable-weror禁用GCC的-Weror选项。这对于运行测 试套件来说是必需的;g通过加入额外代码,对栈溢出攻击等导 - enable-stack-protector=stron 致的缓冲区溢出进行检查,以提高系统安全性;ihhaes/s/nld - wt-edr=uricue指定构建系统搜 libccvslibdir=usrli 索内核API头文件的位置;__//b这个变量纠正库文件安装位置,而不是使 用lib64目录。第4行的make命令编译该软件包。在安装Glibc时,会警告文件/etc/ld.so. conf不存在,执行第4行的touch命令可防止这个警告。第5行的sed命令修改Makefile,跳过 一个在SLFS的不完整环境中会失败的完整性检查。执行makeinstal 安装该软件包,安装了 多个程序和库。第6行的sed命令改正ldd脚本中硬编码的可执行文件加载器路径。然后安 装nscd的配置文件和运行时目录,并且安装nscd的systemd支持文件。执行第9~15行的命 令安装一些locale,它们可以使得系统用不同语言响应用户请求。这些locale都不是必需的。 可以用localedef程序安装单独的适合自己国家、语言和字符集的locale。 由于Glib需要创建配置文件/t/ swthcn c的默认值在网络环境下不能很好地工作, ecnic.of。 执行以下命令安装时区数据。 执行如下第1~7行的命令设置时区。确定时区后,执行第8行的命令创建/etc/ localtime 。 58 执行以下命令配置动态加载器。默认情况下,动态加载器/b/l-ius2在/ur/i lidlnx.o.slb 中搜索程序运行时需要的动态库。然而,如果在除了/usr/lib以外的其他目录中有动态库, 为了使动态加载器能够找到它们,需要把这些目录添加到文件/et/lscnf中。有两个 cd.o.o 目录/usr/local/lib和/opt/lib经常包含附加的共享库,所以现在将它们添加到动态加载器 的搜索目录中。动态加载器也可以搜索一个目录,并将其中的文件包含在ld.so.of中。 cn 通常包含文件目录中的文件只有一行,指定一个期望的库文件目录。 4.Zlb1.13 i-2. Zlib软件包包含一些程序使用的压缩和解压缩子程序。执行如下命令安装Zlib。安装 的库是lib.o,包含一些程序使用的压缩和解压缩函数。 zs 5.Bzp2-0. i1.8 Bzip2软件包包含用于压缩和解压缩文件的程序。使用bzip2压缩文本文件可以获得 比传统的gzip优秀许多的压缩比。执行如下命令安装Bzip2。安装的程序是bunzip2、 bzat、zcmp等。安装的库是lbb2.o。 cbizs 6.Xz5.1 -4. Xz软件包包含文件压缩和解压缩工具,它能够处理lzma和新的xz压缩文件格式。使 用xz压缩文本文件,可以得到比传统的gzip或bzip2更好的压缩比。执行如下命令安装 Xz。安装的程序是lzat、zcmp、ldif 等。安装的库是lbzma.o。 clzils 7.Zsd1.4 t-5. Zstandard是一种实时压缩算法,提供了较高的压缩比。它具有很宽的压缩比/速度权 衡范围,同时支持具有非常快速的解压缩。执行如下命令安装Zstd。安装的程序是zstd、 zsdge、ztls 等。安装的库是lbsd.o。 trpsdeizts 59 8.Fl-44 ie5. File软件包包含用于确定给定文件类型的工具。执行如下命令安装File。 9.Redie8. aln- 2 Readline软件包包含一些提供命令行编辑和历史记录功能的库。执行如下命令安装 Readline。安装的库是libhistorso和libreadlineso。libhistory提供一个查询之前输入行 y. 的一致用户接口。libreadline提供一组在程序的会话中操纵输入的文本的命令。交互(.) 10.M4-4. 1.19 M4 软件包包含一个宏处理器。执行如下命令安装M4 。 11.B-2. c6.4 Bc软件包包含一个任意精度数值处理语言。执行如下命令安装Bc。 12.Fe-6. lx2.4 Flex软件包包含一个工具,用于生成在文本中识别模式的程序。执行如下命令安装 x。安装的程序是flx、f+以及lx。安装的库是lbso。 Fleelex+eifl. 13.Tl8.13 c-6. Tcl软件包包含工具命令语言,是一种通用脚本语言。执行如下命令安装Tcl。安装的 程序是tclh和tcs6。安装的库是litl6.o和litltb8.a。 slh8.bc8.sbcsu6. 60 14.Expc-45. et5.4 Expect是一种自动化工具,通常用于与交互式程序进行交互。它允许用户编写脚本来 控制交互式程序的行为和响应。Except软件包是用Tcl编写的。执行如下命令安装 Expet。安装的程序是expct。安装的库是lbxpc-45.so。 ceieet5.4. 15.DejGNU1.3 a-6. DejaGNU 包含使用GNU 工具运行测试套件的框架。DejaGNU 框架是使用Expect编 写的。执行如下命令安装DejaGNU 。安装的程序是dejagnu和runtest。 16.Binutils-2.40(第3次构建) Binutils包含汇编器、链接器以及其他用于处理目标文件的工具。执行如下命令安装 Bintls。安装的程序是arlne、ar、as、+flt、dwp、efdt、gprf、gprfg、ld、d.fd、d. uidd2ic+ileioonlblgold、nm 、bjopy 、bjump、alb、raef、sze、trigs以及stip。安装的库是lbbd.o、 ocodrniedlisnrifslicfso、icfnbd.o、lbpoe.o以及lisr.o。 bt.lbt-ofsiocdssbfames 17.GMP-2. 6.1 GMP 软件包包含提供任意精度算术函数的数学库。执行如下命令安装GMP 。安装的 61 库是lbgmp.o和lbgmpx.o。lbgmp包含任意精度数学函数;ibgmpx包含C++任意 isixsilx 精度数学函数。 18.MPFR-2. 4.0 MPFR软件包包含多精度数学函数。执行如下命令安装MPFR 。安装的库是libmprso, f. 包含多精度数学函数。 19.MPC-3. 1.1 MPC软件包包含一个任意高精度,且舍入正确的复数算术库。执行如下命令安装 MPC 。安装的库是libmp.o,包含复数数学运算函数。 cs 20.Atr2.1 -5. Atr软件包包含管理文件系统对象扩展属性的工具。执行如下命令安装Atr 。安装 的程序是atr 、getatr以及statr 。安装的库是lbtrso,包含处理扩展属性的库函数。 fefia. 21.Ac-3. l2.1 Acl软件包包含管理访问控制列表的工具,访问控制列表能够细致地自由定义文件和 目录的访问权限。执行如下命令安装Acl。安装的程序是cl、l以及sl。安装 的库是libc.o,包含操作访问控制列表的库函数。 hacgetfacetfac als 22.Licp-67(第1次构建) ba2. p软件包为Lix内核提供的POSIX1003.e权能字实现用户接口。这些权能 Libcanu1 字是root用户的最高特权分割成的一组不同权限。执行如下命令安装Libcap。安装的程 序是caph、gta、gtcps以及sta。安装的库是licp.o和lisso。 secpepaecp basbpx. 62 23.Shdw4.第1次构建) ao-13( Shadow软件包包含安全地处理密码的程序。执行如下命令安装Shadow 。 第5~6行的命令把过时的用户邮箱位置/var/spool/mail改为当前普遍使用的/var/ mail目录。另外,从默认的PATH中删除/bin和/sbin,因为它们只是指向/usr中对应目录 的符号链接。第7行的touch命令要保证/usr/bin/paswd存在,因为它的位置会被硬编码 到一些程序中,如果它不存在,安装脚本会在错误的位置创建它。第8行的pwconv和 grpconv命令对用户密码和组密码启用Shadow加密。第9行的paswd命令为root用户 设置密码。 12.0(第3次构建) 24.GCC-2. GCC软件包包含GNU编译器集合,其中有C和C+ + 编译器。执行如下命令安 装GCC 。 . /configure配置选项的含义:①LD=ld使得配置脚本使用之前在本章中构建的 Binutils提供的ld程序,而不是交叉编译构建的版本;② - with-system-zlib使得GCC链接 到系统安装的Zlib库,而不是它自带的Zlib副本;③ - enable-default-pie,PIE(位置无关可 执行文件)是能加载到内存中任意位置的二进制程序。在不使用PIE时,称为ASLR(地址 空间布局随机化)的安全特性能被用于共享库,但不能被用于可执行程序本身。启用PIE 使得ASLR在作用于共享库的同时,同样作用于可执行程序,以预防一些基于可执行程序 中关键代码或数据的固定地址的攻击;④ - enable-default- sp,SSP(栈溢出防护)是保证程 序的调用栈不被破坏的技术。在调用栈被破坏时可能导致安全问题,例如,子程序的返回地 址可能被修改,进而执行一些危险代码,这些危险代码可能已经存在于程序或共享库中,或 被攻击者用某种方式注入。 安装的程序是c++、 c(到gc 的链接)、cpp 、g++、gc 、gc-ar、gc-nm 、gc-ranlib、gcov、 gcov-dump、gcov-tool以及lto-dump。 ibsnsiaomcsisic.ich.ics 安装的库是laa.{a,o}、lbti.{a,o}、lbc1.o、lbga、lbg_ea、lbg_so、 licv.iomp.slbtsilasilouisiudmah. bgoa、lbg{a,o}、iim.{a,o}、lbsn.{a,o}、lbt_plgn.o、lbqat{a(.) , slibsp.a,slibsp_nonshared.libstdc++.a,slibstdc++fs.libsupc++. o}、{o}、a、{o}、a、a、 63 {a,o}以及l{a,o}。libtsan.sibubsan.s 25.Pkgcnig0.2 -of-29. Pkg-config软件包提供一个在软件包安装的配置和编译阶段,向构建工具传递头文件 和/或库文件路径的工具。执行如下命令安装Pkg-config。 安装的程序是Pkg-config,用于帮助开发者获取编译和链接软件包所需的参数。使用 Pkg-config可以查询已安装的软件包的详细信息,例如,版本号、安装路径、依赖关系等;可 以返回编译源代码所需的参数,例如,头文件路径和编译选项;还可以返回链接源代码所需 的参数,例如,库文件路径和链接选项。 26.Ncre-4 uss6. Ncurses软件包包含使用时不需要考虑终端特性的字符屏幕处理函数库。执行如下命 令安装Ncures。安装的程序是cpono、cer、ifcmp等。安装的库是licrew.o、 satiflanobussslioso、inso、inussso、inuss+w.o、lbpnlso等。 bfrmw.lbmeuw.lbcrew.lbcre+siaew. 27.Sd4. e- 9 Sed软件包包含一个流编辑器。执行如下命令安装Sed。 28.Pms-6 sic23. Psmisc软件包包含显示正在运行的进程信息的程序。执行如下命令安装Psmisc。安 装的程序是fuser、kilal 、pekfd 、prtstat、pstre 等。 29.Gex-21. tet0.1 Getext软件包包含国际化和本地化工具,它们允许程序在编译时加入NLS(本地语言 64 支持)功能,使它们能够以用户的本地语言输出消息。执行如下命令安装Getext。 30.Bsn3.2 io-8. Bison软件包包含语法分析器生成器。执行如下命令安装Bison。安装的程序是bison 和yac 。安装的库是liby. a。 31.Grp-8 e3. Grep软件包包含在文件内容中进行搜索的程序。执行如下命令安装Grep。安装的程 序是egrep、fgrep以及grep。 32.Bs-2. ah5.15 Bash软件包包含Bourne-AgainShel 。执行如下命令安装Bash。 33.Lito-4. bol2.7 Libtool软件包包含GNU通用库支持脚本。它提供一致、可移植的接口,以简化共享 库的使用。执行如下命令安装Libtool。 34.GDBM-23 1. GDBM软件包包含GNU数据库管理器。它是一个使用可扩展散列的数据库函数库, 功能类似于标准的UNIXdbm 。该库提供用于存储键值对、通过键搜索和获取数据,以及删 除键和对应数据的原语。执行如下命令安装GDBM 。 35.Gpef3. r- 1 Gperf根据一组键值,生成完美的散列函数。执行如下命令安装Gperf。 65 36.Expt2.0 a-5. Expat软件包包含用于解析XML文件的面向流的C语言库。执行如下命令安装 Expat。 ntl4 37.Ieutis-2. Inetutils软件包包含基本网络程序。执行如下命令安装Inetutils。安装的程序是ftp、 ifconfig、hostname 、ping、ping6、talk、telnet、tftp、traceroute以及dnsdomainname 。 38.Les-608 Les 软件包包含一个文本文件查看器。执行如下命令安装Les 。 39.Pr-36. el5.0 Perl软件包包含实用报表提取语言。执行如下命令安装Perl。安装了多个程序和库。 40.XML∷Pasr2. re-46 XML∷Parser模块是JamesClark的XML解析器Expat的Perl接口。执行如下命令 安装XML∷Parer。安装的模块是Eptso,提供Expat的Pel接口。 sxa.r 41.Itt-51. nlol0.0 Intltool是一个从源代码文件中提取可翻译字符串的国际化工具。执行如下命令安装 Intltool。安装的程序是intltool-extract、intltool-merge、intltool-prepare、intltool-update、 66