出于linux是开源的,因此我们可以随便内核中的参数,这次制作一个最基本的操作系统且带网络功能,所有步骤都是用脚本实用。
1,先解释下Linux启动的流程:
开机自检post-->bios--> bootloader(mbr)-->kernel(initrd)-->init进程
(1)bios是一个软件嵌套在coms芯片上,通过bios去调整coms一些参数。
(2)bootloader:是一个引导程序,目的在有多个系统时,可以选择进入哪个系统。这里以grub为主。
(3)kernel:内核,linux的内核里面已经编译里许多常用的硬件驱动。而(initrd)的作用是辅助kernel,因有些硬件的驱动程序在kernel没有,这时就要依靠initrd。当然如果kernel能够驱动init进程所在的硬件,initrd也没存在的必要。
(4)init:init进程并不完成具体的工作,只是协调其它进程,也就是其他进程的父进程。这时用户并不能直接操作kernel,因此必须提供一个接口给用户,而linux默认是bash。init二进制程序要能够运行,必须依赖于某些共享动态库。因此必须给程序提供库文件,而库文件根据FHS的规定,一般主要放置在/lib ,/usr/lib这两个目录下。当然bash也是二进制程序,也必须依赖动态共享库。程序当然会提供配置文件。
2,根据上面的解释:当我们自己制作一个linux时,必须包括
(1)bootloader(grub),kernel(initrd),init,bash。
(2)配置文件:grub.conf,/etc/inittab
(3)库文件:用ldd查看二进制程序依赖的库,并复制到对应的目标目录下。
(4)脚本:/etc/rc.d/rc.sysinit(这个脚本对系统做基本的初始化,也是给用户提供一个可操作的环境)
3,实验步骤:
(1)此实验基于redhat 5.8 enterprise,虚拟机virtualbox。
(2)在已经正常运行的虚拟机中添加一块新硬盘,并分好区。
(3)由于initrd-2.6.18-308.el5里面的设置,sdb1必须挂载在某目录下/boot目录下,而/可以自由决定,在这里我分别挂载在/mnt/boot /mnt/sysroot下
(4)在sdb上创建目录,这些目录在原系统上也存在,当然有些是可以不用创建,但是为了统一,/sys /proc /dev这三个目录是必须要存在。
(5)安装grub
(6)提供kernel与initrd
修改init文件
(7)提供应用程序
bash,ls,mkdir,cp命令的移值完全一样
(8)切换到/mnt/sysroot测试是否正常
(9)建立配置文件
建立grub.conf在/mnt/boot/grub/grub.conf
建立inittab 在/mnt/sysroot/etc/inittab
建立脚本/mnt/sysroot/etc/rc.d/rc.sysinit
建立脚本/mnt/sysroot/etc/rc.d/shutdown
到此已经结束,附件为脚本,全程自动化。
本文出自 “bingo” 博客,请务必保留此出处http://bingodeng.blog.51cto.com/1038075/905056