Linux基本功杂记——[017]——LFS构建逻辑理解

  严格来说,LFS只能称为“pseudo LFS”,WHY?

  因为LFS归根结底,还是基于已有的操作系统平台构建而来,并非真正的从0开始,它没有突破所谓“鸡与蛋”的死循环;但它确实有助于理解Linux的运行机理,通过刻意营造一个尽可能接近于原始状态的最小运行环境,给用户一种“接近从0开始”的系统DIY体验。

  一、必须理解的概念

  C的编译与链接,是一个将源代码转换成可在硬件上运行的程序的过程,从源代码到程序执行,通常需要5步:预编译、编译、汇编、链接、动态加载(动态链接)。编译是把人类编写的程序代码“翻译”成机器可理解的二进制代码的过程,但此时生成的结果通常不能独立运行,需要链接器将二进制文件与必要的库文件链接在一起,才能生成最终的可执行程序。

  pre-compilier:通常用于清理源代码中的仅为迎合人类逻辑而添加的,但对机器无用的部分;

  compilier:将预编译器处理过的人类代码转换成二进制或汇编代码;

  assembler:将原始或经编译器转换生成的汇编代码,转换成二进制机器代码;

  linker/loader:将编译器或汇编器生成的二进制文件链接在一起,形成最终的可执行代码;

  动态加载器:将可执行程序加载到内存并进行执行。

  二、系统构造思路

  首先,基于一个现有的Linux系统,制造出可用于后续逐层向上制造“新Linux组件“的最小的工具集——Linux系统基本四件套“Gcc+Binutils+Glibc+Kernel”,因为初始的Kernel可以借HOST机的一用,这有助于营造尽可能接近于0的原始环境,因此,只需要构造出一套经过最大“阉割”但仍保有最基本“繁衍”能力的剩下的那“三件套”即可。

  当然,“四件套”并不能独立生成所有软件,往往还需要其它一些附加组件,可是刚开始没有怎么办?跟“四件套“的产生逻辑一样,先借用HOST机的组件,生产出一套中间半成品,继而生产出想要的产品。

  为了有助于理解,这里讲一个简短的故事。

  有个人想要一个已经成年的孙子,怎么办?要生孙子,必须要先有儿子啊!但这个儿子只是个过渡品,生完孙子之后他就挂了(故事情节比较残忍。。。)。

  LFS就是孙子,HOST机就是爷爷,中间的那个临时的简陋工具链(toolchain)就是儿子。等这个孙子长大了,这个爷爷对外声称,孙子是他用最先进的技术,用一堆“自然界最基本单位”一个一个拼装而成的。这显然对人形成了误导!确实是爷爷把孙子从婴儿养大成人的,但孙子从“自然界最基本单位”到婴儿这个过程,爷爷是没参与的,也就是说这个爷爷是不知道孙子在分子、原子层面的组成结构的。

  看到这里,相信大家都理解LFS是怎么回事了。

  三、系统构造过程

  以前我一直没想通的一个问题:“为什么各个Linux发行版的文件布局都不同”?

  学习了LFS之后,知道这是在各个软件“制造”的过程中,通过GNUMakefile(或Makefile或makefile)按照“统一的逻辑”指定的,这“统一的逻辑”是由发行版各自的软件包管理机制或架构(如yum、apt、portage、yast等)决定的,这就是为什么几乎每个Linux发行版都有一个软件仓库,却互相不能直接通用的原因。

  学习LFS确实有助于加深对Linux的理解,但远远不足以达成所谓“了解Linux系统底层”的境界。

时间: 2024-12-25 07:25:35

Linux基本功杂记——[017]——LFS构建逻辑理解的相关文章

LFS构建逻辑理解

严格来说,LFS只能称为“pseudo LFS”,WHY? 因为LFS归根结底,还是基于已有的操作系统平台构建而来,并非真正的从0开始,它没有突破所谓“鸡与蛋”的死循环:但它确实有助于理解Linux的运行机理,通过刻意营造一个尽可能接近于原始状态的最小运行环境,给用户一种“接近从0开始”的系统DIY体验. 一.必须理解的概念 C的编译与链接,是一个将源代码转换成可在硬件上运行的程序的过程,从源代码到程序执行,通常需要5步:预编译.编译.汇编.链接.动态加载(动态链接).编译是把人类编写的程序代码

Linux基本功杂记——[018]——『Network Bonding』

EtherChannel最初是由cisco提出,通过聚合多条物理链路为单条逻辑链路,从而实现高可用及提高吞吐量等目的.AgP(Port Aggregation Protocol,Cisco专有协议).LACP(IEEE 802.3ad)是应用最广泛的两种实现.Linux中的实现称为Bonding,HA的实现需要系统层面Bonding和物理层面switch紧密配合. http://www.mjmwired.net/kernel/Documentation/networking/bonding.tx

Linux基本功杂记——[007]——8月10日课后作业

/*答案不止一个,仅列出自认为最优雅的存在*/ 作业要求:编写BASH脚本实现题目要求的内容. 一.显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 1 #!/usr/bin/bash 2 printf 3 " Hostname: $(hostname)\n \ 4 IPv4: $(ip addr | grep -oP '(\d+\.){3}\d+/\d+' | awk 'BEGIN{ORS=" "}{print}')\n

Linux基本功杂记——[013]——『mdadm Raid & LVM』

>FOR FREEDOM!< {A} Introduction Here's a short description of what is supported in the Linux RAID drivers. RAID is not a guarantee for data integrity, it just allows you to keep your data if a disk dies. The current RAID drivers in Linux support the

Linux基本功杂记——[001]

a.vi查找文本 N,反方向搜索 b.查看外网ip curl ifconfig.me b.更改到上一次访问的目录 cd - d.在组中删除用户: gpasswd -d 用户名 组名 e.查看网卡速率 cat /sys/class/net/eth0/speed f.host与guest之间的文件互传 rcp -r /localdir/ [email protected]:/remotedir rcp -r [email protected]:/remotedir /localdir g.find

Linux基本功杂记——[023]——「OpenSSH tunneling」

SSH tunneling 相关 参考資料:http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 本地端口转发: 适用场景:发起端可以连接 SSH_server_host 端的 ssh 服务,但无法与最终目标 goal_host 的程序直接通信,而 SSH_server_host 可以 命令格式:ssh [-g] -L <local_port>:<goal_host>:<goal_port> [email

Linux基本功杂记——[020]——『Linux Capability』

『Linux Capability』 For the purpose of performing permission checks, traditional UNIX implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged proc

Linux基本功杂记——[010]——{rpm、yum及源码方式管理软件包}

一.yum配置文件位置 /etc/yum.conf /etc/yum.repos.d/*.repo 二.yum常用命令 install pkgs reinstall pkgs update pkgs update-to check-update erase pkgs list installed/updates info pkgs provides pkgs deplist pkgs repolist all/enabled/disabled history [info num] clean a

Linux基本功杂记——[002]——7月29日课后作业

1.file1文件的内容为:”1 2 3 4 5 6 7 8 9 10” 计算出所有数字的总和 方法一:[[email protected]7 fh]# echo $(tr ' ' '+' <file1) | bc 55 方法二:[[email protected]7 fh]# x=$(($(tr ' ' '+' <file1))) && echo $x 55 方法三:[[email protected]7 fh]# x=$(tr ' ' '+' <file1) | py