学习lfs 项目 随机制作一个简易的系统
tip:这个小系统慢慢补充从开始的基础文件到,启动之后initramfs 更换根之后的系统,也就是呈现在用户面前的最终系统环境
首先需要概略讲解下linux 启动:
开机-------------->ROM--------------->BIOS------------------>boot
就是开机自检之后设备将ROM的代码运行起来,更具bios的设置找到启动盘的位置;接下来就是启动盘分区表,找到启动程序
启动程序加载linux 内核,内核加载完毕后会有一个initramfs 小的系统,这个可以动态加载linux 内核需要的驱动模块,因为不是很多驱动都编译到了内核。然后根据initramfs 的init 进行初始化,初始化完成后将控制权交给正真的根系统文件,chroot 到new_root 之后就执行init 初始化程序,系统启动,启动服务进程
这个是启动项没有设置root启动后报错,linux内核加载后没有找到root 设备;不能挂载/new_root; 可以看出内核初始化后会chroot 到new_root(就是正真的系统文件)
然后就是启动后正常看到的大量日志输出
lfs项目地址:https://linuxfromscratch.org/lfs/view/stable/
1、格式化一块硬盘然后挂载到目录(挂载到/mnt)
2、创建基本文件:
mkdir -pv usr/{bin,sbin,lib,lib64}
mkdir -pv {dev,proc}
for i in `ls usr`;do
ln -s /usr/$i $i;
done
基本文件结构
现在需要在文件结构添加基本程序和库文件,复制目前系统的基本程序到/mnt 文件系统
首先添加/sbin/bash 文件到 /mnt/usr/bin
然后chroot /mnt 可能提示没有bash这个文件,有可能是 bash 程序需要的其他依赖项 :执行 ldd /sbin/bash 可以看到bash程序正常执行需要那些lib 文件
cp -dp /usr/lib/libc.so.6 /mnt/usr/lib
添加需要的库文件之后
chroot /mnt 可以看到切换到了 以/mnt 为根的环境
====================================================================================================
系统初始化阶段是从 init开始的 init 找到inittab 文件 si::sysinit:/etc/rc.d/init.d/rc S
然后执行 启动脚本进行其他设置
===================================================================================================
一个简易的系统 包括 /etc , /root , /usr ,/bin , /lib ,/sbin , /sys ,/dev ,/proc ,/run
etc 需要的文件 inittab ,profile ,passwd ,group, fstab,mtab
bin,sbin 需要的程序:bash , agetty ,passwd ,login,
然后就可以修改grub.cfg root=新的盘分区
启动之后就可以到简易的文件系统了