如图所示,这就是LINUX操作系统启动的具体步骤
下面我们就来具体了解一下它的具体启动过程
1.开机自检需要post程序(BIOS)
2.然后进入MBR,在硬盘上有MBR即是主引导记录,共有三个部分bootloader、分区表和magic,bootloader是grub的第一个阶段,grub的第二个阶段是出现grub菜单。grub的第一段放在bootloader下,第二段放在/boot/grub下,通过MBR引导的时候出现菜单就是grub菜单,让用户选择需要加载操作系统,然后找到对应的操作系统的内核kernel进行加载。
3 接着启动第一个进程init。init的启动有需要一个表格即是inittab然后读取/etc/inittab的配置文件,接着执行/etc/rc.d/rc.sysinit,sysinit是一个初始化脚本,有0-6共 7个级别,分别包括对主机名 udev 设置时钟 网络功能 键盘等的设置,通过sysinit对应的脚本级别选择所对应的rc.d脚本,最后执行开机脚本/etc/rc.d/rc.local 然后启动mingetty进程来开启终端。
了解了LINUX操作系统的具体开机步骤,我们该去考虑怎么样创建一个简单的linux操作系统?
思路:首先创建一块硬盘,在宿主机上编写一个LINUX操作系统启动所必须的相关内核和软件,使这个微型操作系统能够正常的运行起来。再把移植的硬盘放到机器上测试并启动运行,这是DIY一个微型LINUX内核的大体思路。必须条例清晰,明确思路才能一步步的编写出一个小LINUX。
1.首先看新的硬盘的标识 添加一块硬盘 为新的硬盘建立分区(/boot /swap /root)三个必须的分区
宿主机开机过后新加的硬盘显示的是sdb 当放到另一台空的机器上时就会是sda
对新分区进行分区
格式化分区
构建MBR
需要把grub第二段写到第二个硬盘的引导分区上(/mnt/boot/grub 自动创建)自动的寻找boot目 录不需要写路径
查看grub目录自动创建的文件 想要启动LINUX在grub目录下还缺少一个菜单即是grub.conf,grub.conf文件并没有被创建,我们可以移植宿主机或手动编写,如果想要练习编写LINUX还是自己看源代码自己学习编写的好。
在/mnt/boot/grub目录下创建一个grub.conf文件
先把宿主机的内核和必须的驱动镜像拷到正在编写的boot目录下
拷到boot目录下后需要改写驱动镜像,不同机器里面的文件系统可能有差别,可以先把镜像文件移到其他文件夹下进行改写并重新打包
Init是第一个启动的进程,需要打开init进行修改,找到mkrootdev看是否对应相应分区和文件系统,更改过后重新打包需要删去initrd-2.6镜像
编辑grub.conf
在sysroot下创建和宿主机root目录下相同的目录
在根目录下 mkdir usr/lib etc/rc.d
把刚才宿主机的东西拷贝到硬盘中 cp /sbin/init sbin/
init是源代码编译的二进制指令,变异过程中调用各种库所以也要把库文件拷过去,不然没有办法调用。因为init文件会依赖于很多库文件用ldd查看在sbin目录下的init依赖于哪些库并且把root/lib库文件放到现在硬盘中的sysroot/lib 用脚本拷比较方便,首先把lib下的文件拷到硬盘中
init拷好后
缺少inittab目录 需要创建 先看宿主机的inittab
先把sysint写出来(无论哪个级别都需要)
底行模式下21 w /mnt/sysroot/etc/inittab si表示系统初始化 空白表示任意一个 级别 sysinit表示一个动作 目录表示运行的脚本 rc.sysinit 文件没有 需 要先创建 先看宿主机的文件怎么写的
#!/bin/bash (命令解释器还没有)
echo -e "\033[31m LINUX \033[0m"
/bin/bash(要启动才能进入shell)
可执行的 chmod a+x rc.sysinit
没有shell解释器 需要编写设置 先找出宿主机的bash which bash
把宿主机的拷到硬盘中 cp /bin/bash /mnt/sysroot/bin 然后需要链接库
ldd /bin/bash 对宿主机的进行拷贝 把模块拷贝到硬盘中(也可以用指令拷贝)
sync 把文件同步到磁盘上 把宿主机停下 加载到新的机器上
当执行的时候 会报错 是因为init进程所以出错了 此时文件夹下的init 先看下 init的链接库 which init ldd 查看一下宿主机的和当前的有什么区别是文件
打开init文件进行编辑 没有问题 究其原因是bin目录下的少了bash文件现在bin是 文件 先建立bin目录 然后拷贝 cp /bin/bash /mntsysroot/bin/ 然后同步sync
现在内核制作成功 但是缺少很多指令 需要再去编写
命令制作
which ls ldd查看 cp/bin/ls bin/ 需要链接库文件 bash开始拷贝 sync
init指令 init 0 关机指令没有 init 0 是0级别 进入这个级别
cd /etc/rc.d/rc0.d ll 查看文件k开头的是杀掉进程
执行init0 表示进入0级别 先打开宿主机的inittab 看下0级别怎么写
制作的硬盘上不需要那么麻烦 可以写成一个脚本执行
再手工编译一个关机脚本
bash cp.sh 拷贝 halt
同步 sync 就可以了
主机名的编写
vim /etc/rc.sysinit 查看宿主机的
cd /mnt/sysroot/etc/rc.d/
vim rc.sysinit 修改
现在还缺少bin下的hostname
cp /bin/hostname /mnt/sysroot/bin/
接下来拷链接库
bash cp.sh hostname
sync
init 6的制作
init6在 /etc/inittab
cd /etc/rc.d/rc6.d/
ll 查看文件
vim s01reboot
添加一行代码
l6:6:wait:/etc/rc.d/rc.sysreboot
在rc.d下 再编写一个脚本
vim rc.sysreboot
把shutdown 脚本移到硬盘上,再拷贝链接库 bash cp.sh , chmod a+x rc.sysreboot 显示的是run出错, 先创建目录 mkdir /mnt/sysroot/var/run
更改开机图片
linux系统里自带的图形处理软件gimp
有依赖关系使用yum yum很好的解决了依赖关系
vim /etc/yum.repos.d/rhel-debuginfo.repo
有两个依赖关系的gimp软件包进行安装 ,完毕之后把图片传到linux下 利用gimp编辑图片分辨率
image>scale
image>mode》index修改大小 14 xmp格式的
压缩图片 gzip 1.xpm, 在grub中调用图片挂载硬盘, 打开宿主机中的/etc/grub.conf查看怎么设置图片
增加网络功能
查看系统中加载哪些模块 lsmod demsg查看硬件信息 demsg |grep eth0
lsmod |grep -i pcnet
需要网络功能 加载驱动
加载网络模块的时候放到modules即可 mkdir -pv /mnt/sysroot/lib/modules
cp dmesg pcnet32 所在的位置 /mnt/sysroot/lib/modules/ ,而且pcnet32依赖于mii,需要把它也拷过去,cp mii所在的文件位置 /mnt/sysroot/lib/modules查看模块是否存在,调用模块 可以做到initrd里,也可以做到 sysinit里。 然后移植指令 , 在rc.d 下 修改脚本 3.jpg 寻找命令的路径
查看已经生效的都有哪些指令 sync进行同步 注意网卡是桥接模式,重启网卡即可重新工作