BabyLinux制作过程详解.docx

上传人:b****5 文档编号:7904979 上传时间:2023-01-27 格式:DOCX 页数:26 大小:37.17KB
下载 相关 举报
BabyLinux制作过程详解.docx_第1页
第1页 / 共26页
BabyLinux制作过程详解.docx_第2页
第2页 / 共26页
BabyLinux制作过程详解.docx_第3页
第3页 / 共26页
BabyLinux制作过程详解.docx_第4页
第4页 / 共26页
BabyLinux制作过程详解.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

BabyLinux制作过程详解.docx

《BabyLinux制作过程详解.docx》由会员分享,可在线阅读,更多相关《BabyLinux制作过程详解.docx(26页珍藏版)》请在冰豆网上搜索。

BabyLinux制作过程详解.docx

BabyLinux制作过程详解

BabyLinux制作过程详解

作者:

GuCuiwenemail:

win2linux@

版权声明:

本文档可以在网络上在非商业范围内自由转载,转载请注明出处

如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费

以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费

一,什么是BabyLinux

二,为什么要做这样一个linux

三,什么人适合读这篇文档

四,应该具备的知识

五,linux系统引导过程简介

六,编译内核

七,编译busybox

八,制作根文件系统

九,制作ramdisk映象文件

十,内核与busybox的整合

十一,安装测试和内容调整

十二,babylinux中的BUG

十三,接下来要做的事情

十四,参考文献

一,什么是BabyLinux

BabyLinux不是一个完整的发行版,他是利用原有的一套完整的linux系统的内核原代码和编译工具,利用busybox内建的强大功能,在一张软盘上做的一个很小的linux系统.他具备一个linux系统的基本特征,支持linux系统最常用的一百多个命令,支持多种文件系统,支持网络等等,你可以把他当做一张linux起动盘和修复盘来用,你也可以把他当做一个静态路由的路由器软件,当然,你也可以把他当做一个linux玩具,向你的朋友炫耀linux可以做的多么小.我把他叫做BabyLinux因为他很小巧,小的很可爱,像一个刚刚出生的小baby.

二,为什么要作这样一个linux

先说说我一开始的想法,当我一开始接触linux的时候,看到书上说,linux通常安装只需要60M左右的空间,但是我发现装在我硬盘上的Redhat6.0确要占据好几百M的空间.为什么我的linux这么大呢?

后来我发现,装在我机器上的那么多东西只有不到30%是我平时常用的,还有30%是我极少用到的,另外的40%基本上是不用的.于是,我和大多数初学者一样,开始抱怨,为什么linux不能做的精简一点呢?

于是,我萌发了自己裁减系统的想法.可惜那个时候我还没有听说过有LFS和Debain.等到我积累了足够的linux知识后,我开始制作这样一个小系统.

制作这样一个小系统最大的意义在于,你可以通过制作系统了解linux的启动过程,学会ramdisk的使用,让你在短时间内学到更多的linux知识.当然,你会得到很大的乐趣.这个项目只是做一个具有基本特征的linux系统,如果你想自己做一个具有完整功能的linux,请阅读LinuxFromScratch(LFS)文档.

三,什么人适合读这篇文档

如果你是一个linux爱好者,并且很想了解linux的启动过程和系统的基本结构,而且是一个喜欢动手研究小玩意的人,那么这个文档可以满足你的需求.如果你仅仅是用linux来做一些普通的日常工作,而不在乎你的linux到底怎么工作,那么这份文档也许不太适合你.另外,如果你是linux爱好者,但是目前还是一个刚刚入门的newbi,我建议你先把linux命令学好.不过我想我会尽可能的把这份文档写详细一些,如果你有足够的毅力,或许一个newbi也能成功做一个babylinux.或者,你遇到一件很不巧的事情,比如你的老婆来例假了,你的这个周末就泡汤了,那么阅读这篇文档并做一个linux小玩具可以打发你的时间.

四,应该具备的知识

在做一个babylinux之前,你应当已经会应用linux最常用的命令.并且至少有一次成功编译并安装系统内核的经历,会通过编译源代码来安装软件.如果你具备了这些条件,那么做这样一个小系统会很顺利,如果你还没有掌握这些知识,你可能会遇到一些困难.但是只要有毅力,也可以成功.你不需要具备编程的知识,因为我的目标是:

让具有中等以上linux水平的爱好者可以通过阅读文档轻松完成这个项目.关于一张软盘上的linux还有一个很著名的linux叫LOAP(LinuxOnA

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!

”);

}

保存后以init.c保存他,并用gcc编译.

#gcc–-static-oinitinit.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里只能编译进去很少的命令.

在我编译的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

另外一点需要说明的是:

以上所罗列的文件系统模块大小是察看我现在使用的Redhat9的

/lib/modules下的模块文件得到的,实际编译进内核大小会小一点,因为我们用makebzImage

在内核源代码目录树下生成的内核是经过压缩过的.

如果你对以上说的内容不太明白也没有关系,我会在下面的内容中做详细的说明.

2,必需编译进内核的内容

首先,我们制作的这个小系统是基于一张软盘的,因此,你的内核必需支持软盘.另外对IDE硬盘和cdrom的支持也是不可少的,否则做出来的babylinux就没有实用价值,因为他不能访问硬盘和光盘上的内容这样的linux虽然可以做的更小,但是制造一个完全没有用的东西是浪费时间.其他的包括framebuffer等,如果你需要支持在字符界面下以高分辨率显示,以看到更多的屏幕内容,那么就必需把framebuffer支持编译进内核,此外在高分辨率下使用的8x8字体也必需编译进去.否则即使你给内核传递了vga=参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体.这里我先大致提一下需要注意的事情.在下一小节具体编译时,我会继续就某些细节问题说明.

3,关于内核的版本

我是在Redhat9linux系统下打造的babylinux小系统.使用的是Redhat9自带的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版的内核,http:

//www.kernel.org/有各个时期的内核可以下载.

4,内核的配置

如果你对linux内核的配置和编译已经很熟悉了,请跳过这一段,直接看busybox的编译.

以root身份登录系统

进入/usr/src/linux目录

[root@gucuiwenroot]#cd/usr/src/linux

如果你下载了一个2.4版本的内核,为了避免麻烦,请将他拷贝到/usr/src下,然后接压缩,再做一个指向他的名为linux的链接.虽然这并不是必需的,但是根据我以往的经验,如果我把linux源代码放在其他目录下解开并编译,偶然会有一些莫名其妙的小问题发生.

#cplinux-2.4.20.bz2/usr/src/

#cd/usr/src

#tarxfvjlinux-2.4.20.bz2

如果是tar.gz格式,可以这样解开

#tarxfvzlinux-2.4.20.tar.gz

为了方便,做一个到目录linux-2.4.20的连接:

#ln-slinux-2.4.20linux

进入linux源代码目录:

#cdlinux

清理源代码树:

#makemrproper

运行配置程序:

#makexconfig

codematurityleveloptions

先选择N,当我们配置好常规的东西,要加入framebuffer支持时再将这一项选择Y,因为在2.4.20中,framebuffer支持尚属于实验性代码.

如果不在codematurityleveloptions选择为Y,将不能配置framebuffer.

Loadablemodulesupport

选择N,为了简化系统的制作,我在这个项目中不选择可加载内核模块的支持.

processortypeandfeatures

processorfamily中选择你需要的CPU类型,如果你想让老至386,新到P4的CPU都能运行babaylinux那么请选择386CPU,否则请按自己的实际情况选择.

其他选项都选择N.这些在babylinux中都是不需要的.

Generalsetup

networkingsupport选择Y

PCIsupport选择Y除非你不用PCI设备,不过一般人都是需要的,因为现在网卡大部分是PCI的.

SystemVipc选择Y

systrlsupport选择Y

kernelsupportforELF选择Y

其余内容都可以选择N,如果有特殊需求,比如的网卡是ISA的,那么请将相应的内容选上.但是不能贪心,时刻牢记,我们能利用的空间只有1440K,内核的大小绝不能超过900K,任何不必要的东西都应该从内核中去除.

memorytechnologydevices(MTD)

Parallelportsupport

PlugandPlayconfiguration

以上三个大项中的所有内容选择N

blockdevices

Normalfloppydisksupport

Loopbackdevicesupport

RAMdisksupport

initialRAMdisk(initrd)support

Perpartitionstaticsin/proc/partitions

以上几项选择Y,其余全部选择N.

这里的选项比较重要,我想重点说明一下.对于软盘的支持,那是不必说的,那是必备的.

loopbackdevice即回环设备,我们平时用命令

#mount-oloopsomecd.ISO/mnt/cdrom

挂装光盘映象文件,或者其他文件系统映象文件时就用到了内核中的loopback模块,如果没有编译进这个模块,你将不能用上面的命令挂装光盘映象和文件系统映象.

个人认为这个功能是非常重要的,所以编译了进去.

RAMdisksupport即内存磁盘(比较贴切的说法是虚拟磁盘,即拨出一部分内存当做磁盘用).这是制作babylinux项目中的核心内容,由于一张软盘的空间有限,babylinux的根文件系统是用gzip压缩法高度压缩的,在运行时,将解压缩后的文件拷贝到一个RAMdisk运行,所以在运行时,你在根文件系统上的所有操作实际上是在内存上进行的.但是在形式上和在真正的磁盘上运行一样.只不过放在RAMdisk上的所有内容会在系统关机后全部消失.

不仅在运行babylinux时用到ramdisk,我们在制作压缩的根文件系统时也要用到ramdisk,学习ramdisk的使用是做一个babylinux的重要目的之一.在linux中,还支持另外一种虚拟磁盘,叫做shm,

(sharedmemory),这种虚拟磁盘机制比ramdisk更加先进,ramdisk的大小是固定的,由编译内核时候的defaultramdisksize决定.默认为4096K(4M),也可以在内核装载前加上ramdisk_size=参数来决定他的大小,但是系统一旦启动,ramdisk的大小是不能改变的,而shm的大小却动态的改变.默认情况下为物理内存的一半,当系统需要更多内存的时,他就自动缩小.系统内存富余时,他自动增大,这样可以充分灵活的利用内存空间,shm通常用来作为系统的磁盘高速缓存,存放系统运行中的临时文件等.redaht的linux在默认情况下都有shm的支持,可以用mount和df察看他的挂装点和大小,如下命令:

[root@gucuiwenlinux]#mount

/dev/hda1on/typeext3(rw)

noneon/proctypeproc(rw)

usbdevfson/proc/bus/usbtypeusbdevfs(rw)

noneon/dev/ptstypedevpts(rw,gid=5,mode=620)

/dev/hda6on/hometypeext3(rw)

/dev/hda5on/oracletypeext3(rw)

noneon/dev/shmtypetmpfs(rw)

/dev/hda7on/vartypeext3(rw)

[root@gucuiwenlinux]#df-h

文件系统容量已用可用已用%挂载点

/dev/hda12.9G2.7G26M100%/

/dev/hda63.8G1.8G1.8G50%/home

/dev/hda55.7G677M4.8G13%/oracle

none125M0125M0%/dev/shm

/dev/hda7711M91M584M14%/var

虽然shm有这么多的优点,我还是选择了ramdisk,因为ramdisk可以很方便地在系统启动的时候加载,而shm却没那么容易,下面就来讲一下关于内核启动时加载ramdisk映象的相关内容.

initialRAMdisk(initrd)support

即初始化ramdisk支持,这个选项让内核有能力在内核加载阶段就能装入RAMDISK,并运行其中的内容,否则只能在系统运行阶段用ramdisk,我们平时在编译了一个新内核后,如果你的根文件系统用的是ext3,而你没有把ext3编译进内核,而只作为一个模块编译了,那么就需要用mkinitrd命令做一个initrd(initializtionramdisk),这个ramdisk里放了ext3的模块,这样内核在加载根文件系统前就能正确识别ext3文件系统.否则,内核加载的最后一步就会出现kernelpaniccantnotfindinit....的错误.

在babylinux项目中,这个选项是必需的,这里的作用是把解压的根文件系统映象装入ramdisk.

Perpartitionstaticsin/proc/partitions

这个选项不是必需的,但是我发现如果我不把这个功能编译进内核,那么当我在挂装文件系统的时候会有些小问题,比如我不能以简写的挂装命令来挂装文件系统.我不确定到底是不是这个选项的关系,但是把这个选项编译进内核只增大一点点内核空间,所以为了避免麻烦,我把他编译了进去.

Multi-devicesupport(RAIDandLVM)

Cryptographysupport(CryptoAPI)

这两个大项全部选择N,因为在个人用PC上,及少牵涉到这两项,如果你真的有RAID设备或者LVM,那么就自己摸索着配置一下吧.

Networkingoptions

这一大项中,只需要把下列项目编译进内核:

Packetsocket:

mmappedIO

TCP/IPnetworking

对于IP:

advancedrouter这项,如果你想重点把babylinux用做静态路由软件,那么把这项编译进去,而对于networkpacketfiltering(replacesipchains)这一项,没有必要编译进去了,因为busybox没有提供iptables工具来设置包过滤防火墙.同样,unixdomainsockets这项也不必选择,只有运行X的情况下才需要选这项.

TelephonySupport选择N

ATA/IDE/MFM/RLLsupport

选择Y,然后下面的'IDE,ATAandATAPIBlockDevices'按钮就被激活

下面几项请选择Y,其余都可以是N.

EnhancedIDE/MFM/RLLdisk/cdrom/tape/floppysupport

IncludeIDE/ATA-2DISKsupport

Auto-GeometryResizingsupport

IncludeIDE/ATACDROMsupport

如果你的内核要运行在一台很老的pentium或486上,请把CMD640chipsetbugfix/support编译进去,因为那时候主板的CMD640IDE控制芯片大多有莫名其妙的BUG,把这项编译进去会修复这个bug.

下面几个大项:

SCSIsupport

FusionMPTdevicesupport

IEEE1394(FireWire)support

I2Odevicesupport

全部选择N,这里可能有你想要的好东西,比如1394接口驱动,但是在babylinux上意义不大,而且我们的空间只有1440K.

下面一个大项:

Networkdevicesupport

选择Y,这样就可以支持网卡了,其余都选择N.然后点Ethernet(10or100Mbit)按钮选择你需要的网卡驱动,你可以把最常见的几种Reltek8139,NE2000,3COM等网卡编译进内核.虽然网卡的驱动通常都很小,但是不要太贪心,选2~3个就足够了,否则你的内核就会一下子多出几十K.在我先前编译的babylinux内核中,我把via-rhine网卡编译了进去,是因为我打造babylinux的机器上只有一块那个芯片的网

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1