专题: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系统底层”的境界。
专题:LFS构建逻辑理解的更多相关文章
- 【MM系列】SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP库龄报表逻辑理解 第一篇 ...
- 【MM系列】SAP SAP库龄报表逻辑理解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解 ...
- [C# 基础知识系列]专题七: 泛型深入理解(一) (转载)
引言: 在上一个专题中介绍了C#2.0 中引入泛型的原因以及有了泛型后所带来的好处,然而上一专题相当于是介绍了泛型的一些基本知识的,对于泛型的性能为什么会比非泛型的性能高却没有给出理由,所以在这个专题 ...
- LVS专题-(3) 虚拟ip理解
1.虚拟IP是什么? 要是单讲解虚拟 IP,理解起来很困难,所以干脆把 动态 IP .固定 IP .实体 IP 与虚拟 IP都讲解一下,加深理解和知识扩展 实体 IP:在网络的世界里,为了要辨识每一部 ...
- docker 镜像构建上下文理解
原文 写得贼好,特别鸣谢,哈哈 如果注意,会看到 docker build 命令最后有一个 . . . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dock ...
- 数据分析 | 数据可视化图表,BI工具构建逻辑
本文源码:GitHub·点这里 || GitEE·点这里 一.数据可视化 1.基础概念 数据可视化,是关于数据视觉表现形式的科学技术研究.其中,这种数据的视觉表现形式被定义为,一种以某种概要形式抽取出 ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
- 【WPF学习】第五十八章 理解逻辑树和可视化树
在前面章节中,花费大量时间分析了窗口的内容模型——换句话说,研究了如何在其他元素中嵌套元素,进而构建完整的窗口. 例如,考虑下图中显示的一个非常简单的窗口,该窗口包含两个按钮.为创建该按钮,在窗口中嵌 ...
- 安卓开发经验分享:资源、UI、函数库、测试、构建一个都不能少(转)
除了高超的武艺,每位黑忍者还需要装备最好的武器.在软件开发的世界里,好的工具能让我们的生活变得更轻松,在更短的时间里写出更棒的代码. 时光回到2008年,那时安卓还很年轻.只有几个相关的博客和谷歌官方 ...
随机推荐
- jsp+js完成用户一定时间未操作就跳到登录页面
<% String path = request.getContextPath(); String basePath = request.getScheme() + "://" ...
- java的继承 和super关键字 构造器
面向对象的特性二继承: 继承的好处: 1.减少代码的冗余.提高了代码的复用性 2.便于功能的扩展 3.为之后多态的使用,提供了前提 继承的格式: class A extends B{} A:子类.派生 ...
- 用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
#目录 前文列表 扩展阅读 Jinja 变量名 注释 控制语句 if 语句 循环 过滤器 无参数调用 带参数调用 宏 定义宏 调用宏 结果 兼容 JavaScript 前文列表 用 Flask 来写个 ...
- VTemplate模板引擎的使用--进阶篇
1.<vt:template>与<vt:include>标签的不同 <vt:template>和<vt:include> 标签都包含file属性,如果这 ...
- Rust <8>:lifetime 高级语法与 trait 关联绑定
一.生命周期关联:如下声明表示,'s >= 'c struct Parser<'c, 's: 'c> { context: &'c Context<'s>, } ...
- 搭建RAID10(5块硬盘)过程并模拟其中一块硬盘损坏
首先:RAID 10,实际是将RAID 0和RAID 1标准结合的产物,在连续地以位或字节为单位分割数据并且并行读/写多个磁盘的同时,为每一块磁盘作磁盘镜像进行冗余.它的优点是同时拥有RAID 0的超 ...
- apache2.2.25+tomcat7.0.47集群方案
因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...
- 一篇不一样的Android屏幕适配具体做法(原创)
转载请注明出处(http://www.cnblogs.com/weizhxa/p/7568090.html ) 有不正确,还请大家留言修正! 1.何谓屏幕适配:在任何设备上看起来布局都是近似的,细分也 ...
- Windows 获取windows密码
#include <iostream> #define Main main #define COLOR_GREEN system("color 2"); #includ ...
- 【Jenkins、sonar】
1.Jenkins入门(一)安装Jenkins 2.Jenkins入门(二)部署java项目 3.Jenkins远程部署SpringBoot应用 4.配置sonar.jenkins进行持续审查 5.S ...