要编写一个简单的linux操作系统 必须了解linux启动的步骤

如图所示,这就是LINUX操作系统启动的具体步骤


下面我们就来具体了解一下它的具体启动过程

1.开机自检需要post程序(BIOS

2.然后进入MBR,在硬盘上有MBR即是主引导记录,共有三个部分bootloader、分区表和magicbootloadergrub的第一个阶段,grub的第二个阶段是出现grub菜单。grub的第一段放在bootloader下,第二段放在/boot/grub下,通过MBR引导的时候出现菜单就是grub菜单,让用户选择需要加载操作系统,然后找到对应的操作系统的内核kernel进行加载。 

接着启动第一个进程initinit的启动有需要一个表格即是inittab然后读取/etc/inittab的配置文件,接着执行/etc/rc.d/rc.sysinitsysinit是一个初始化脚本,有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 编辑图片分辨率

   p_w_picpath>scale

   p_w_picpath>modeindex修改大小  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进行同步 

注意 网卡是桥接模式, 重启网卡即可重新工作