制作LFS之后的总结

LFS是什么

LFS是Linux From Scratch
译为:从头开始构建自己的linux系统
就是从网上下载源码再根据手册
从头编译linux安装方式,可以任意选择安装那些功能和移除那些功能

linux的组成

Linux内核

linux内核是宏内核,设备驱动程序可以完全的访问硬件,它可以设置为模块的形式。模块形式也就是内核模块,它可以在系统运行期间直接装载或者卸载内核,在编译之前配置确定内核包含什么功能,增加功能的时候可以通过配置装载功能,不需要的时候就可以卸载掉。内核模块机制可以使内核使用更加的灵活。

C库及各类功能库

C函数库是将标准的C语言中的各种函数功能进行实现的库程序文件。因为在linux中许多程序都是采用C语言来进行编写的,所以C函数库是一个比较重要的函数库。

函数库它包含了大量的函数,程序在运行的过程中可以调用所包含的函数来实现设计好的功能,函数库中的函数也可以使用自己或者其他库中的函数,函数库包含了静态库和共享库两种,程序运行时共享库必须存在于系统且能被系统找到,静态库在程序运行时,即使静态库不在也可正常调用。

静态库缺点:运行多个程序并且都使用一个静态库中的函数时,内存中就会有同一个函数的多个副本,程序自身也会有对个同样的副本,会消耗大量的内存和磁盘空间。
除了C库,还有一些实现特定功能的,也被组织成了函数库存在于系统中。

交互环境

交互环境分为,命令行交互(CLI)和图形化交互(GUI)交互环境的存在就是为了能够方便的控制计算机运行,让计算机明白操作者表达的含义。

常用命令

用一些命令来于系统进行交互。
这些命令包括:复制文件(cp),显示文件列表(ls),显示文件内容(cat)等等,,,,

应用程序

应用程序是指为针对使用者的某种应用目的所撰写的软件。
应用程序是linux系统的主体,任何一个系统的存在都是为了满足应用的需求。如wps,火狐、谷歌浏览器

目录及配置文件

目录用于存放各种文件,配置文件则是帮助用户控制那些功能丰富的程序。
在LSB规则中包含了目录,文件和函数库等命名存放及一系列要求
通过配置文件,程序能明白用户的需求

启动和登录控制程序

启动程序是对计算机系统的环境进行处理。准备好各种软硬件使用的环境,装载运行过程中需要的各种程序
登录控制程序是通过用户名和密码来判断用户是否合法。

软件管理方式

一个专门用于管理安装软件的软件,称为“包管理器”。
比如Debian系统中的apt,RedHat系统中的yum。

LInux系统的架构

在这里插入图片描述

Linux系统的启动过程

在这里插入图片描述

BIOS

BIOS是一组固化到计算机内主板上的一个ROM芯片的程序,它保存着计算机最重要的输入输出的程序,开机后自检程序和系统自启动程序。所以系统想要启动必须先加载BIOS
在这里插入图片描述
然后BIOS加载CMOS的信息,借助它取得主机的各项硬件配置,然后进行加电自检,检查计算机中各种硬件信息,发现错误则会报错。然后BIOS对硬件进行初始化

在这里插入图片描述

搜索可引导设备

“Boot menu”意思为“启动菜单”意思是指系统启动过程中按对应热键,调出对应可启动设备的启动选择菜单,然后根据配置选择储存介质,如硬盘、CD-ROM或者USB启动。

MBR

搜索可引导存储设备之后,
在这里插入图片描述
MBR载入内存后,BIOS将控制权转交给MBR(准确的说应该是MBR中的boot loader ),然后MBR接管任务开始执行

启动MBR,MBR中的boot loader就要读取所在磁盘的操作系统核心文件,boot loader再将控制权交给对应操作系统的loader,让它负责去启动对应的操作系统。
在这里插入图片描述
这张图解释了boot loader的作用

MBR中的boot loader就要读取所在磁盘的操作系统核心文件,boot loader再将控制权交给对应操作系统的loader,让它负责去启动对应的操作系统。

一个硬盘的每个分区的第一个扇区叫做boot sector,这个扇区存放的就是操作系统的loader,如上图,第一个分区的boot sector存放着windows的loader,第二个分区放着Linux的loader,第三个第四个由于没有安装操作系统所以空着。

提供选单就是给用户提供一张选项单,让用户选择进入哪个操作系统;

当用户选择其他操作系统启动的时候,boot loader会将控制权转交给对应的loader,让它负责操作系统的启动。

我们知道系统会有一个默认启动的操作系统,这个操作系统的loader在所在分区的boot sector有一份,除此之外,也会将这个默认启动的操作系统的loader复制一份到MBR的boot loader中,这样一来MBR就会直接读取boot loader中的loader了,然后就是启动默认的操作系统
MBR 的boot loader有三个功能:提供选单,读取内核文件,转交给其他loader

启动器

MBR完成了主程序的引导后,会把控制权交给GRUB,主引导程序开始加载配置文件。

Grub启动有三个阶段;
第一阶段:引导安装在MBR中的引导程序。( Linux的loader就是这个文件)
第1-5阶段:MBR之后的扇区,让阶段一中的boot loader能识别阶段2所在的分区上的文件系统,GRUB的内置文件系统其实是依靠1-5阶段那些文件定义的,让grub在不依赖Linux内核
情况下具有读取配置文件与内核映像的能力。
第2阶段:读取存放在磁盘上的grub配置文件/boot/grub/grub.conf,把选定的内核装载到RAM中的特定空间中载入,加载/boot/initrd.img(Initrd)虚拟文件系统
Grub 阶段2功能有:
提供菜单、并提供交互式接口
加载用户选择的内核或操作系统
为菜单提供了保护机制

linux内核

将内核文件载入物理内存中执行,内核就是boot目录下的vmlinuz。然后将控制权转交给内核。
在这里插入图片描述
Initrd:
它是一个最小化的Linux根文件系统。
该文件装载了必要的驱动模块,内核就是先把这个文件展开,形成一个虚拟文件系统,内核借虚拟文件系统装载必要的模块,直到挂载真正的rootfs,然后将initrd从内存中移除。
内核上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,所以就产生了initrd这个文件.

启动控制程序

内核以只读方式挂载根文件系统当根文件系统被挂载后,开始装载第一个进程,执行/sbin/init,之后就将控制权交接给了init程序。
在这里插入图片描述

  1. 其实/etc/inittab文件它主要的作用就是设定Linux的启动过程进行配置(一共有7各等级),还有就是准备软件执行的环境,

  2. 其实/etc/inittab文件它主要的作用就是设定Linux的启动过程进行配置(一共有7各等级),还有就是准备软件执行的环境,

  3. 设置主机名,挂载/etc/fstab中的文件系统,修改/etc/sysctl.conf 的内核参数等各项系统环境。

  4. 根据运行级别,进入相应的/etc/rc.d/rcN.d目录,启动和关闭相关的系统服务。里边存放着一堆以K和S开头的软链接文件,其中K开头表示该运行级别下需要把该服务杀死,S开头表示该运行级别下需要把该服务开启。

  5. 可以自定义启动时需要执行的文件。

登录控制程序

接下来会由/sbin/mingetty指令启动终端,进入系统登陆界面。输入用户名与密码进行验证,验证成功后,登陆控制程序会根据相关的设置为用户启动需要的程序。

交互环境

当系统启动后,会为用户创建一个交互环境,不同的用户可以启动不同的环境
在这里插入图片描述
Bash首先去/etc中执行profile,该文件包含了所有用户共用的设置脚本,之后执行用户目录下的.bashrc隐藏文件,可以为不同用户提供不同的环境

文本形式的登录界面有login程序,在图形界面中有xdm,kdm等等

源代码编译

在这里插入图片描述
首先获得软件包的源代码

.configure阶段会生成makefile文件,为下一步的编译做准备,我们可以通过在configure后加上参数来对安装进行控制。如,选择安装的位置,指定链接库的路径

Make阶段会调用目录中的makefile来执行系列的工作,其中包括创建必要的文件,以及调用Gcc和Binutils来编译源代码和链接目标文件,最终生成可执行文件与附属文件。

Make install 阶段安装程序,把程序安装至系统预设的可执行文件存放路径。
在这里插入图片描述
运行的系统是由该系统之外的编译环境生成的,

并且软件包之间存在依赖关系,在编译某个软件包是它所依赖的软件包必须先被编译和安装。如编译工具,Glibc

为啥安装依赖的软件:
  • 源代码编译需要用到头文件,不同源代码头文件不同,程序运行时需要依赖到某个共享库,在编译过程中就会需要用到该共享库对应的头文件。
    在之前在函数库的时候说过共享库在程序运行时必须存在系统中且能被系统找到和使用。
  • 生成共享库或者程序文件的时候链接器会去链接所提供的函数库,如果没有则无法完胜编译

工具链介绍

工具链是由编译器,汇编器,链接器及其函数库组成的
Linux中通常是:Gcc,Binutils,Glibc组成

工具链原则:由某一个工具链编译出来的二进制程序或函数库文件必然连接该工具链中的函数库,无论是静态链接还是动态链接方式

LFS系统制作过程中工具链的转换

在这里插入图片描述
Glibc-B生成时调整工具链:修改GCC编译配置与Binutils中的ld命令的函数库查询目录,使它们依赖于自身的函数库

在这里插入图片描述
在这里插入图片描述

制作流程图

在这里插入图片描述

制作过程中的目录结构变化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体制作步骤

在这里插入图片描述
在这里插入图片描述

遇到的问题

  1. 宿主机环境配置
    在这里插入图片描述
  2. 分区的挂载:目标系统最终独立于主系统运行,需要把目标系统安装在一个分区上,而不是主系统的某个目录下。
  3. 内核配置
    在这里插入图片描述

感谢孙海勇老师的《手把手教你构建自己的Linux系统》
感谢lfs9.0中文档翻译手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值