一,什么是BabyLinux
二,为什么要做这样一个linux
三,什么人合适读这篇文档
四,应该具有的常识
五,linux体系引导进程简介
六,编译内核
七,编译busybox
八,制造根文件体系
九,制造ramdisk映象文件
十,内核与busybox的整合
十一,装置测验和内容调整
十二,babylinux中的BUG
十三,接下来要做的作业
十四,参考文献
一,什么是BabyLinux
BabyLinux不是一个完好的发行版,他是运用原有的一套完好的linux体系的内核原代码和编译东西,运用busybox内建的强壮功用,在一张软盘上做的一个很小的linux体系.他具有一个linux体系的底子特征,支撑linux体系最常用的一百多个指令,支撑多种文件体系,支撑网络等等,你能够把他作为一张linux起动盘和修正盘来用,你也能够把他作为一个静态路由的路由器软件,当然,你也能够把他作为一个linux玩具,向你的朋友夸耀 linux能够做的多么小.我把他叫做BabyLinux由于他很细巧,小的很心爱,像一个刚刚出世的小baby.
二,为什么要作这样一个linux
先说说我一开端的主意,当我一开端触摸linux的时分,看到书上说,linux一般装置只需求60M左右的空间,可是我发现装在我硬盘上的Redhat 6.0确要占有好几百M的空间.为什么我的linux这么大呢? 后来我发现,装在我机器上的那么多东西只需不到30%是我平常常用的,还有30%是我很少用到的,别的的40%底子上是不必的.所以,我和大多数初学者相同,开端诉苦,为什么linux不能做的精简一点呢?所以,我萌发了自己削减体系的主意.惋惜那个时分我还没有听说过有LFS和Debain.比及我积累了满意的linux常识后,我开端制造这样一个小体系.
制造这样一个小体系最大的含义在于,你能够经过制造体系了解linux的发动进程,学会ramdisk的运用,让你在短时刻内学到更多的linux常识. 当然,你会得到很大的趣味.这个项目仅仅做一个具有底子特征的linux体系,假如你想自己做一个具有完好功用的linux,请阅览Linux From Scratch (LFS)文档.
三,什么人合适读这篇文档
假如你是一个linux爱好者,并且很想了解linux的发动进程和体系的底子结构,并且是一个喜爱着手研讨小玩意的人,那么这个文档能够满意你的需求. 假如你仅仅是用linux来做一些一般的日常作业,而不在乎你的linux究竟怎样作业,那么这份文档或许不太合适你.别的,假如你是linux爱好者, 可是现在仍是一个刚刚入门的newbi,我主张你先把linux指令学好.不过我想我会尽或许的把这份文档写具体一些,假如你有满意的意志,或许一个 newbi也能成功做一个babylinux.或许,你遇到一件很不巧的作业,比方你的老婆来例假了,你的这个周末就落空了,那么阅览这篇文档并做一个 linux小玩具能够打发你的时刻.
四,应该具有的常识
在做一个babylinux之前,你应当现已会使用linux最常用的指令.并且至少有一次成功编译并装置体系内核的阅历,会经过编译源代码来装置软件. 假如你具有了这些条件,那么做这样一个小体系会很顺畅,假如你还没有把握这些常识,你或许会遇到一些困难.可是只需有意志,也能够成功.你不需求具有编程的常识,由于我的方针是:让具有中等以上linux水平的爱好者能够经过阅览文档轻松完结这个项目.关于一张软盘上的linux还有一个很闻名的 linux叫LOAP (Linux On A
Floppy) 可是他是由比较专业的人员需求编写许多程序完结的.并且没有关于他制造进程的文档.
五,linux体系引导进程简介
首要,主板的BIOS会读取硬盘的主引导记载(MBR),MBR中寄存的是一段很小的程序,他的功用是从硬盘读取操作体系中心文件并运转,由于这个小程序太小了,因而一般这个小程序不具有直接引导体系内核的才能,他先去引导另一个略微大一点的小程序,再由这个大一点的小程序去引导体系内核.在linux体系中这样的小程序有LILO和GRUB.在这个项目中,我决议用LILO来做体系引导程序.在软盘上发动linux体系的进程和在硬盘上发动的进程相似.
Linux体系内核被引导程序装入内核并运转后,linux内核会检测体系中的各种硬件.并做好各种硬件的初始化作业,使他们在体系正式运转后能正常作业.之后内核做的最终一个作业是运转
/sbin 下的init程序,init是英文单词initialization(初始化)的简称,init程序的作业是读取/etc/inittab文件中描绘的指令,对体系的各种软硬件环境做开始化设定.最终运转mingetty等候用户输入用户名登录体系.一切的作业就这么简略,尽管linux发动的时分有许多内容,看上去十分深邃,可是都不过是对这个进程的扩大.理解了这个道理,你能够写一些脚本程序让他在体系发动的特定时刻运转完结任务.事实上体系内核并不关怀/sbin下的init是不是真的init,只需是放在/sbin下名叫init的可履行程序他都能够履行.能够做以下试验:
编写一个十分简略的C程序:
main()
{
printf(“hello,world!\n”);
}
保存后以init.c保存他,并用gcc编译.
#gcc –-static -o init init.c
这儿的–static 参数告知gcc把这个程序静态联接,这样这个程序不倚赖任何库就能运转.把编译好的init程序拷贝到/sbin下,备份好本来的那个.重新发动体系最终体系的输出结果是: hello,world!
然后停在那里.做这个试验以前先确认你知道怎么把体系康复到本来的状况,有一个简略的办法,在内核发动前给他加上init=参数,比方你原先的init被你改成了init.bak 只需在发动的时分给内核加上init=/sbin/init.bak就能够用本来的init程序发动体系.
做完以上试验,就理解了内核和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里只能编译进去很少的指令.