做完以上实验,就明白了内核和init程式之间的关系.此外,init程式不一定是个二进制可执行程式,他能够是个bash脚本,一个指向 另一个程式的联接,他的位置也并不一定要在/sbin下,只要在启动内核时,给内核加上init参数就能被运行,比如,开始时给内核加上init= /bin/bash参数,内核在最后一步就直接运行bash给出提示符,不用登录系统就能够输入命令了.其功能类似单用户模式启动系统. /sbin/init 程式只是内核默认运行的第一个程式.
六,编译一个linux系统内核
1,编译前的规划和准备
在编译内核前,请先确定您的需求,把您的需求罗列成一张周详的表格.您需要让内核支持什么硬件,支持多少种分区类型和文档系统,支持哪些网卡,支 持哪些网络协议.等等.请尽可能周详的罗列这些内容,但是您也不要太贪心,因为您任何能利用的空间只有1440K,假如您编译出一个大于1440K或很接 近这个数字的内核,您的这个项目就不能完成了,您已没有空间再放ramdisk映象文档,除非您原意再多出一张软盘,做一个两张软盘的小linux系 统.对于声卡驱动之类,我劝您还是放弃吧,因为一个声卡驱动也许只让您的内核增大了十多K,但是您有了一个声卡驱动就务必要有一个播放器吧,否则声卡驱动 就没有意义,可一个播放器的大小可不是一张软盘能够装得下的.在我先前制作的babylinux内核有900多K,其中,文档系统部分站了大部分,因为我 的目标是把他做成一个系统修复盘.因此我在内核中编译7种文档系统的支持,每减少一个文档系统就能够减小几十甚至200多K的内核大小.越是复杂,越是安 全的文档系统,其支持模块也越大,比如在linux下FAT模块只有32K,VFAT只有17K,但是ext3的模块就有86K,JFS达到216K, reiserfs模块是224K,能够想像,编译一个支持7个文档系统的900多K的内核,文档系统部分就占了600K以上的空间,所以假如某一个文档系 统是您根本不用的,那么还是不要编译进内核把,这样至少能够省下100多K的空间.对于其他的驱动,比如网卡,通常大小只有8,9K,最大的也但是10多 K,因此能够把常用的网卡芯片的驱动都编译进去.另外假如您想让您的babylinux支持U盘,那么scsi的驱动模块也是不可小看的,他通常要接近 150K,因为U盘是被当做scsi设备来驱动的.另外您还需要让您的内核支持即插即用,这些都是不小的空间开销,我的建议是您放弃一两个您不用的文档系 统.总之,您最后编译出来的内核大小最好不要超过900K,否则您在busybox里只能编译进去很少的命令.
在我编译的busybox中,我编译进去120多个命令,基本上把busybox支持的命令都包括进去了.加上小系统所必需的文档系统目录, /dev下的设备文档,连同/etc下几个必需的配置文档,做成ramdisk压缩后的大小是440多K, 加上900K左右的内核刚好能够放入一张1440K软盘,请注意,您应该留下至少50K的空间,因为我们要在软盘上创建一个ext2文档系统,而文档系统 本生需要占据大概25K的磁盘空间.另外lilo的引导文档boot.b的大小是5.7K,更有装上lilo后自动产生的map文档也要10多K的空间, map文档的具体大小由内核安装的实际大小决定,通常不会超过30K.
综上所述,请遵循下面的公式:
内核大小 文档系统压缩印象文档 50K <= 1440K
另外一点需要说明的是:以上所罗列的文档系统模块大小是察看我现在使用的Redhat 9 的
/lib/modules下的模块文档得到的,实际编译进内核大小会小一点,因为我们用make bzImage
在内核源代码目录树下生成的内核是经过压缩过的.
假如您对以上说的内容不太明白也没有关系,我会在下面的内容中做周详的说明.
2,必需编译进内核的内容
首先,我们制作的这个小系统是基于一张软盘的,因此,您的内核必需支持软盘.另外对IDE硬盘和cdrom的支持也是不可少的,否则做出来的 babylinux就没有实用价值,因为他不能访问硬盘和光盘上的内容这样的linux虽然能够做的更小,但是制造一个完全没有用的东西是浪费时间.其他 的包括framebuffer等,假如您需要支持在字符界面下以高分辨率显示,以看到更多的屏幕内容,那么就必需把framebuffer支持编译进内 核,此外在高分辨率下使用的8x8字体也必需编译进去.否则即使您给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体.这里 我先大致提一下需要注意的事情.在下一小节具体编译时,我会继续就某些细节问题说明.
3,关于内核的版本
我是在Redhat 9 linux系统下打造的babylinux小系统.使用的是Redhat 9 自带的2.4.20版的内核.
为什么我不用最新的2.6的内核?
一开始我也企图用最新的内核,但是通过试验我发现,在用最新的2.6.9内核的情况下,我编译一个all-no的(即任何内容都选N,不支持任何 硬件,只有一个最基本的内核)最小化内核就要460K左右,假如我在这个基础上再加入几种文档系统和必要的驱动,那么内核的大小就不能装下一张1440K
的软盘,而我用2.4.20的内核编译一个最小化的内核只需要217K,的大小.假如优化了gcc参数他还能再小些.这样我就立即省下了200多K的空 间,在平时,200多K的内容微不足道,但是在babylinux里,这个数目是整个空间的 1/7,相当于一个reiserfs文档系统模块的大小.当然,我也尝试了2.2连同更老的内核,但是他们缺少我需要的东西,因此最后权衡下来用2.4的 内核是比较合理的.假如您用的是2.6内核的FC系统,那么最好还是去下载一个2.4版的内核,www.kernel.org 有各个时期的内核能够下载.
4, 内核的配置
假如您对linux内核的配置和编译已很熟悉了,请跳过这一段,直接看busybox的编译.
以root身份登录系统
进入/usr/src/linux目录
[root@gucuiwen root]# cd /usr/src/linux
假如您下载了一个2.4版本的内核,为了避免麻烦,请将他拷贝到/usr/src下,然后接压缩,再做一个指向他的名为linux的链接.虽然这并不是必需的,但是根据我以往的经验,假如我把linux源代码放在其他目录下解开并编译,偶然会有一些莫名其妙的小问题发生.
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




