前面写的一篇文章
我们可能做不到从零开始写一个Linux,或者说我们可以做到写一个十分简单的Linux系统但是后续的驱动,以及软件编译会遇到诸多的问题,此时我们可以基于debian,redhat等等系的linux系统去编写另外一个系统。
诸如Ubuntu(乌班图),centos,pve,都是基于上面的debian或者是redhat系进行编写而来,他们也在市场上或多或少取得了很大的成功以及名气
当然我们没必要做的像他这么好我们只需要复制一个最简单的debian系统,之后在它的基础上装上我们所需要的软件。并且把它打包为iso镜像即可。
在上一篇的文章中我们已经可以编写一个debian的系统并且把它打包为一个ISO的镜像,但是问题是在那个镜像中我们里面的Linux系统是全部加载到内存中的。
isolinux引导模式启动流程
这里我要讲一讲在isolinux引导模式中linux的启动流程
- 首先主机的主板启动,电脑会先加载系统主板的bios文件,读取硬盘或者是iso镜像文件
- 主板bios从主板的硬盘或者是iso镜像中读取0磁道1扇区的 512 字节,把它加载到内存中的某一个位置,这就是硬盘或者是镜像的MBR
- 那512字节所能存储和做到的事情很少,所以它一般不会去做什么事情,他的主要工作就是去磁盘(镜像)读取另一段代码,这里我们把这一段代码叫做bootloader,而真正加载系统的是bootloader
- 在bootloader中会把内核中的代码加载到内存中,之后再加载根文件系统,因为再Linux中一切皆文件,文件系统都是要挂载到某个目录上的。
- 注意,现在由于没有指定根目录文件,此时需要把iso镜像中的一个压缩包/镜像(这个需要自己创建)解压到内存中运行,也就是initramdisk(或 initramfs),这里的文件全部存储在你的内存中,本质是把你的内存当作硬盘来用,一但重启,内存中的改动不做保存。
- 如果不需要安装系统——在initramdisk中系统根目录找到init文件,加载所需要的驱动:比如sata驱动,网卡驱动,显卡驱动……之后把根目录切换到硬盘目录中即可
- 如果需要安装系统——在initramdisk中系统根目录找到init文件,加载所需要的驱动:比如sata驱动,网卡驱动,显卡驱动……以及后续的把另外一个iso镜像写入到硬盘之中。
为什么要initramdisk操作而不直接加载文件系统
因为在内核中所拥有的驱动十分少,甚至没有nvme,sata驱动,如果直接启动会找不到硬盘或者是网卡…
而如果把所有驱动编入内核的话内核会十分的臃肿而且有一些硬件或者使用场景(比如嵌入式系统)根本用不上一些启动,而这些更大的内核会占用更多宝贵的存储空间,并且把一些驱动(诸如显卡驱动)写入内核会不方便驱动更新
这时候我们给出的办法是只需要在内核加载少量可以保证linux开机的驱动,之后后续在initramfs中加载驱动,你也可以自定义在initramfs中的脚本。
编写系统的思想
我想的步骤首先是利用initramfs加载一些必要的驱动,比如硬盘驱动和其他驱动之类的,之后把需要备份的系统给打包为iso镜像,然后在initramfs执行写入到硬盘之中。
只需要在initramfs中加载网络驱动,然后编写一个脚本运行,在网络上下载所需要的文件即可。
可以把最小化的debian,centos或者redhat系统作为initramfs,之后安装一些你想要的驱动然后打包为third.img作为initramfs
木木em哈哈想说的话(与本博文无光)
博主马上大四了,现在准备考研,csdn目前暂时随缘更新,偶尔回答一些问题。半年之后搞毕设看看能不能搞个好玩的东西(滑稽.jpg)