当前位置: 首页 > 工具软件 > CLFS > 使用案例 >

制作CLFS过程

秦博延
2023-12-01

clfs

整个制作过程参考《手把手教你如何建立自己的Linux系统》

交叉编译

在一个系统平台生成另一个系统平台的程序,本次是在X86 Linux平台使用交叉编译工具链生成MIPS Linux平台的系统。交叉编译可以用来生成裁剪过的嵌入式系统或者不相同的平台。

字节序

大端,数据存放顺序和地址增长顺序相同;小端,数据存放顺序和地址增长顺序相反。

Build、Host和Target

在configure配置时,需要使用这三个参数,build表示编译软件使用的平台,host表示编译出来的软件运行的平台,target是软件处理的平台。当编译平台(build参数)和运行平台(host参数)不一致时,称为交叉编译。有些软件的target的参数可以不指定。在参数配置的是平台名称,比如i686-pc-linux-gnu,i686是指架构名称,pc是计算机类型,linux-gnu是操作系统,可以通过uname命令得到系统信息。

交叉工具链的制作

交叉工具链里的binutils和gcc用来生成目标平台的代码,在软件包的最开始要下载安装这两个软件。首先就是利用主系统的gcc和binutils编译生成binutils和gcc(此时的版本只是c语言版本,并不完整),再编译出交叉版本的binutil和gcc,与LFS不同,交叉版本的binutil和gcc使用的还是主系统的glibc。

sysroot

在configure配置过程中,使用—with-sysroot参数制定目录,然后编译链接的时候,在制定目录寻找头文件和函数库。DESTDIR设置和—with-sysroot参数作用一样。

虚拟根目录

Linux系统可以存在多个运行环境,每个运行环境都有自己的根目录。

平台参数

平台参数如果在配置过程中不指定则会进行自动探测,探测一般是由软件包中的config.guess脚本进行,该脚本会根据当前系统的uname等命令的返回值来进行判断,并最终返回猜测结果。通常猜测结果是准确的,但如果计算机或系统十分特别,则可能判断错误,这时就必须使用手工指定的方式。
例子:

i686-pc-linux-gnu

i686
架构名称,主要描述CPU的指令集,常用的还有个"pentinum"、“x86_64”、“mips”等。64位MIPS小端指令集,表示为“mips64el”
pc
运行计算机的类型,“pc”指个人计算机,不确定类型的计算机可以使用“unknown”来表示“未知”。
linux-gnu
“linux”和“gnu”合起来表示操作系统。

部分软件包

Linux-Header
原因:
比如glibc安装需要使用到linux的内核头文件,把头文件安装在dest目录下,然后使用cp命令复制到/loongson/usr/include目录下
Binutils
原因:
Binutils中有汇编、链接的命令工具,在glibc中会使用到binutils中的命令、头文件和动态链接库
使用sysroot制定安装目录为${TARGET_DIR},打上binutils-2.20-branch_update-1.patch补丁,因为是3A3000平台,所以不打上binutils-2.20-loongson2f-1.patch补丁
gcc(仅支持c语言)
原因:
安装编译器gcc,glibc需要使用gcc提供支持。在configure配置中有—enable-languages=c,本次仅支持glibc的编译,还不是完整的gcc,安装目录是在在目标系统
它是一个编译器集合,包括gcc
正确性检查:
在${TARGET_DIR}/cross-tools/bin 目录下查找gcc命令,比如mips64el-unknown-linux-gcc
glibc
原因:
建立目标系统的glibc:gcc目前仅对C语言的支持,如果需要完成交叉工具链中的GCC,还需要目标系统的Glibc才能完成GCC的编译。
–with-__thread参数:
强制Glibc打开线程支持功能,防止配置脚本对目标平台错误的判断
gcc-4.4.2-64-specs-1.patch:
该补丁将64位共享函数库文件链接目录改为标准的/lib目录,默认
gcc(支持c语言和c++语言)
原因:
目标系统的glibc已安装完毕,glibc为基础的交叉工具链。编译GCC,以Newlib为基础进行编译,编译“自给自足”的软件包。仅将GCC制作为支持C语言和C++语言。之前第一遍安装gcc仅支持c语言,现在再次安装gcc为完整版的gcc,支持c和c++语言。
正确性检查:
在${TARGET_DIR}/cross-tools/bin目录下安装g++命令,如mips64el-unknown-linux-gnu-g++
shadow
原因:
处理用户密码,在/etc目录下passwd和group文件。
binutils
原因:
目标系统需要具有编译程序的能力,这次安装的binutils是目标系统工具链的组件。
安装过程中使用DESDIR参数,确定安装的基础目录。还有修改la文件,删除掉里面编译binutils的路径信息。
GMP
原因:
在后面编译GCC会使用到GMP软件包,在编译过程中添加变量ABI=32,就可以使用64位的CPU编译32位的用户空间。编译GMP要使用到cxx(C++)支持。
MPFR
原因:
修改连接过程中的绝对路径进行连接,将-rpath参数取消,在后面编译GCC会使用到MPFR软件包
在制作的过程中可能会用到LDFLAGS="-Wl,-rpath,/cross-tools/lib",告知在configure阶段搜索库文件的时候使用/cross-tools/lib目录下的文件。
GCC
原因:
提供编译程序的能力。
修改libiberty.a,禁止GCC安装它自己的libiberty.a。
Sed
原因:
linux的文本流编辑器,作为Bash脚本文件中的重要命令。
GPM
原因:
GPM是在文本模式下使用鼠标进行操作程序及相关函数库。
Ncurses
原因:
字符终端下制作界面化的软件提供支持,程序员可以通过调用这些函数在字符终端下制作窗口、按钮等的界面元素。
参数—enable-widec:
使ncurses支持宽字符集,建立链接文件。
正确性检查:
在/usr/bin目录下安装了clear及reset命令
util-linux-ng
原因:
包含linux系统下的专用工具,比如文件系统、管理硬盘、分区
调整adjtime文件的存放位置,util-linux-ng默认将adjtime文件存放在/etc中,为与FHS兼容,将默认存放位置修改为/var/lib/hwclock,建立该目录。uuid命令创建存放进程文件。
正确性调整:
arch在/bin目录
fdisk在/sbin目录
hwclock在/sbin目录
mount在/bin目录
umount在/bin目录
logger在/bin目录
E2fsprogs
原因:
处理EXT系列的文件系统相关命令工具
正确性检查:
fsck.ext3在/sbin目录
mkfs.ext3在/sbin目录
mk_cmds在/usr/bin目录
coreutils
Linux系统下的常用命令,如ls、cp命令
Iana-Etc
原因:
各种网络服务协议及端口使用的数据文件。
M4
原因:
宏处理工具
bison
原因:
语法分析程序生成器,替代yacc语法分析命令
procps
原因:
内核proc文件系统来查询和控制各进程运行情况的命令
正确性检查:
free在/usr/bin目录
killall在usr/bin目录
ps在/bin目录
top在/usr/bin目录
libtool
原因:
处理通用函数库的命令
正确性检查:
检查libtool是否在/usr/bin目录下
readline
原因:
对命令行进行编辑并有历史记录功能的函数库
正确性检查:
在/lib和/usr/lib目录中是否安装libhistoryhe libreadline的函数库文件
autoconf
原因:
生成自动配置源代码的shell脚本
正确性检查:
autoconf命令是否正确地安装在目标系统的/usr/bin目录中
automake
原因:
automake和autoconf配合使用,产生Makefile文件
正确性检查:
检查automake是否在/urs/bin目录中
bash
原因:
终端用户交互环境程序
正确性检查:
检查/bin是否有bash命令,在/bin目录下是否有sh链接命令
bzip2
原因:
对文件进行文件说个事bzip2格式的解压缩工具,文件的后缀名为bz2
正确性检查:
bzip2在/bin目录
bunzip2在/bin目录
bzcat在/bin目录
bzless在/usr/bin目录
DHCPCD
原因:
自动从网络获取IP设置的命令
正确性检查:
检查dhcpcd命令是否被安装在目标系统的/sbin目录中
diffutils
原因:
提供diff命令,用于比较两个文件或目录的不同,制作源代码的补丁文件。
正确性检查:
检查diff命令是否被正确地安装在目标系统的/usr/bin目录中
file
原因:
判断文件类型的命令工具
正确性检查:
检查file命令是否被正确地安装在目标系统的/usr/bin目录下
findutils
原因:
根据条件进行文件查找的命令find
正确性检查:
检查find命令是否被正确地安装在目标系统的/bin目录中
flex
原因:
按照模式化的文本生成相应程序的工具flex
正确性检查:
检查flex及lex命令是否被正确的安装在目标系统的/usr/bin目录中
gawk
原因:
文本处理命令,awk, 目标系统的启动脚本会用到它。
正确性检查:
安装在目标系统的/usr/bin目录中
gettext
原因:
提供系统的国际化和本地化支持,程序可使用它方便地实现本地化支持(NLS)
正确性检查:
检查gettext和msgfmt命令是否被正确地安装在目标系统的/usr/bin目录中
grep
原因:
搜索文件内容和对文本内容进行筛选
正确性检查:
检查grep、egrep和fgrep命令是否被正确地安装在目标系统的/bin目录中
groff
原因:
处理和格式化文本的程序
正确性检查:
检查groff命令是否安装在目标系统的/usr/bin目录下
gzip
原因:
gzip软件包中包含了压缩和解压gzip格式文件的一组程序,gzip格式压缩文件以”.gz”为后缀。
正确性检查:
gzip在/bin目录
gunzip在/bin目录
uncompress在/usr/bin目录
zdiff在/usr/bin目录
IPutils
原因:
网络相关的命令,如ping
正确性检查:
ping在/bin目录
arping在/usr/bin目录
tracepath在/usr/bin目录
IPRoute2
原因:
IPv4网络的命令工具
正确性检查:
ip在/sbin目录
ifcfg在/sbin目录
ss在/sbin目录
kbd
原因:
键盘映射表和键盘设置工具,使用其中的命令来设置键盘映射。
正确性检查:
chvt在/usr/bin目录
loadkeys在/bin目录
setfont在/bin目录
less
原因:
文本分页查看器
正确性检查:
less命令在目标系统的/bin目录中
make
原因:
make软件包中包含了用于处理Makefile格式文件的命令-make。Makefile格式的文件中包含各种控制流程,可使任务的处理过程自动化。
正确性检查:
make命令是否安装在目标系统的/usr/bin目录中
man
原因:
用于显示man手册页内容的命令-man
正确性检查:
man命令在目标系统的/usr/bin目录下
module-init-tools
原因:
内核模块管理工具,为之后要安装内核需要该软件包
正确性检查:
depmod在/sbin目录
lsmod在/bin目录
modprobe在/sbin目录
patch
原因:
根据“补丁”文件的内容来修改或创建文件的程序,编译软件包都会为软件包应用补丁文件。
正确性检查:
patch命令在目标系统的/usr/bin目录下
psmisc
原因:
用于显示进程信息,对系统内运行的进程进行控制
正确性检查:
pstree在/usr/bin目录
killall在/bin目录
shadow
原因:
用户密码安全处理的相关命令
正确性检查:
lastlog在/usr/bin目录
passwd在/bin目录
nologin在/sbin目录
useradd在/usr/sbin目录
rsyslog
原因:
记录系统日志信息的相关程序
正确性检查:
rsyslogd命令安装在目标系统的/sbin目录中
/etc/rsyslog.conf文件是否正确生成
sysvinit
原因:
控制系统启动、运行、关闭的程序
正确性检查:
init在/sbin/目录
last在/usr/bin/目录
pidof在/bin/目录
tar
原因:
常用的打包或解包命令
正确性检查:
tar命令是否被正确地安装在目标系统的/bin目录中

命令解释

make
CC: make编译中的环境变量,使用什么命令来编译C程序。
make: –C 参数,指定要处理的目录,后面可以跟操作命令,比如clean, 还可以目录名,做变量的传递工作。-k参数,在发生错误时仍然继续后面的步骤直到结束。可以在Makefile文件中定义的变量进行外部赋值。
make AR=”${AR} rc” zlib软件包编译脚本出现错误,如果出现zlib.h头文件的问题,可以直接使用gcc源代码包中的zlib文件夹下的zlib.h头文件。
ln
ln: 参数s,表示建立目录或文件的软链接,第一个是目标文件(可以是相对路径或绝对路径),第二个是链接文件名。如果没有指定软连接的名字,将直接使用对应的目录名。
find
find:第一个是搜索的目录,-maxdepth <最大搜索目录深度>,-xtype<搜索文件类型>,-exec<命令>,搜索到文件后进行处理的命令。
tar
tar: 解包命令,对tar格式的文件包进行还原工作
x,进行解压缩操作
v,进行校验输出
f,解包的对象是指定文件,文件在f参数中紧跟着
C,指定解压缩的目录。C参数指定的目录是生成解压包后的目录或文件。
patch
patch –Np1 –i <包含路径的补丁文件名>
N,指补丁内容,如果使用R参数,则时将补丁内容删除
p,补丁内容中目录部分省略的目录数量,数量是后面的数字
i,补丁的来源是文件,文件名在参数之后
sed
sed::i参数的作用是修改原文件,原文件和新文件可以使用diff命令就行对比的作用,比如diff –Nurp gcc/Makefile.in{,org}
strip
strip:–strip-all:删除所有符号和定位信息(可对执行程序和共享函数库,不能是静态函数库);–strip-debug:删除所有格调试符号和调试片段(二进制文件);–strip-unneeded:删除所有符号及不需要的定位信息(可对执行程序和共享函数库)。
chroot
chroot : 切换到指定目录中的系统,然后成为运行环境的根目录。
chroot “ KaTeX parse error: Undefined control sequence: \ at position 33: …ols/bin/env -i \̲ ̲HOME=/root TERM…TERM” PS1=’\u:\w$ ’
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin
/tools/bin/bash --login +h
${TARGET_DIR}:指定切换目录,切换后的该目录成为根目录。
/tools/bin/env –i: 设置切换后的用户
/tools/bin/bash –login +h: 使bash以登录方式启动,登录方式会执行/etc/profile和~/.bash_profile文件,+h参数将强制关闭PATH中的顺序搜索。
{}
{}:大括号表示列举项,{1…8}:对应{1,2,3,4,5,6,7,8}
umask 022:目录创建的权限减去022得到的结果
install
install:复制文件、创建目录,同类型的文件包括(cp,mkdir),参数d:创建目录,参数m,对建立的文件或目录设置访问权限,参数v,显示install命令完成的结果。
ls
ls –l: 列出目录内容,显示文件的访问权限设置
-:一般文件
d:目录
l:链接文件
c:字符设备文件
b:块设备文件
p:管道文件
第一列是文件的类型及访问权限,第三列是用户名,第四列是文件所属组的名称。
exec
exec:运行程序
touch:生成空文件或者修改文件的时间戳。
ldd
ldd:将指定命令所依赖的共享函数库显示出来,查看动态链接的文件,确定命令的依赖共享库。
tee:将标准输入复制到指定文件中并同时显示到标准输出上。
man
man:手册文档,1 8类文档,对应的man1man8目录:
1,标准命令
2,系统调用
3,库函数
4,设备说明
5,文件格式
6,游戏和娱乐
7,杂项
8,管理员命令
mkfs
mkfs: mkfs.xfs 格式的设备文件
dd: dd if=/dev/zero of=/tmp/ters.img bs=10M,count=10
mkfs.ext2 /tmp/test.img
创建100MB的文件,并格式化EXT2的文件系统。
mount –o loop /tmp/test.img /mnt 使用loop循环挂载img这样的块设备。
sysvinit
sysvinit: 不同的运行级的任务描述,linux设置的7中启动方式。
0,关闭计算机
1,启动到单用户模式
2,启动到无网络的多用户模式
3,启动到有网络的多用户模式
4,保留的启动级别,可用作自定义,默认同运行级3
5,图形界面(GUI)登录任务
6,重新启动计算机
服务参数描述
start,启动服务
stop,停止服务
restart,重启服务
reload,更新配置
status,查看服务状态
编译
动态编译,程序使用外部函数采用链接到外部共享库的方式,程序运行期间从共享函数库中运行其中的函数;静态编译,将程序和程序所涉及到的函数实现一起编译到同一个可执行文件中。
文件权限设置
(u) | (g) | (o)
rwx | rwx | rwx

.lzma文件
.lzma文件是数据文件,是以LZMA文件格式存储的压缩文件。

AS、AR工具
ar工具:将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将频繁调用的函数放入到函数库文件中。ar支持ELF格式的函数库文件。
tar打包

tar -zcvf *.tar.gz *(文件和目录) 

总结

第一次使用源代码包制作linux系统,一步一步跟着《手把手教你搭建linux系统》敲命令。

 类似资料: