一、什么是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。
四、应该具备的知识
在做一个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() |
保存后以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里只能编译进去很少的命令。
在我编译的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支持编译进内核,此外在高分辨率下使用的8×8字体也必需编译进去。否则即使你给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体。这里我先大致提一下需要注意的事情。在下一小节具体编译时,我会继续就某些细节问题说明。
一、什么是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。
四、应该具备的知识
在做一个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() |
保存后以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里只能编译进去很少的命令。
在我编译的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支持编译进内核,此外在高分辨率下使用的8×8字体也必需编译进去。否则即使你给内核传递了vga= 参数,内核会因为没有可用的小字体而自动转跳到低分辨率模式下,这是以前困扰我好几天想不明白的事情,后来通过反复试验才明白原来是缺少字体的文体。这里我先大致提一下需要注意的事情。在下一小节具体编译时,我会继续就某些细节问题说明。
接下来的Charcter devices是很重要的一项,他和Bloack devices一样重要,我将重点讲述。
除了Virtual terminal和Support for console on terminal两项,其他全选N。Virtual terminal 即虚拟终端,这是一般Linux必备选项。否则你的Linux启动后,在屏幕看不到任何东西。另外还负责键盘输入信息等等。只有在某些嵌入式Linux应用场合才会不要这个选项,因为这些Linux通常都不用操作。 Support for console on terminal 在虚拟终端上的控制台。他支持在终端上各种信息的输出,这也是必备的。接下来的几个大项:
Multimedia devices |
全部选择N。
再接下来的那部分File sytems可是重头戏喔。这部分不用我太罗嗦了吧,自己需要支持什么就选什么。但是其中有三个是你必需选的:
/proc file system support 缺了他,很多命令和软件就不能运行。
Second extended fs support BabyLinux的基本文件系统。
ISO 9660 CDROM filesytem support 除非你不想用光盘。
另外,诸如磁盘限额(Quota support),Reiserfs的DEBUG模式(Enable reiserfs debug mode)
等就不用编译进去了。这些东西意义不大,确要无端的增大内核大小。请牢记一点:编译出来的内核大小不要超过900K。 最后一个Console drivers,这是支持Linux在字符模式下高分辨率显示的内核模块。前面三个全部选择Y,Frame-buffer support按钮是灰色的不能选,别急,回到第一个大选项:
Code maturity level options 选择Y,就可以激活这个按钮了。
下面几个选项需要选择Y:
Support for framebuffer devices |
你也可以选择其他的显卡驱动,比如nVidia的,但是VESA和VGA是通用性最好的,只要不是几十年前的黑白显卡(我只听说过,没见过),都兼容VESA和VGA,因此,为了制作好的BabyLinux的通用性,请选择这个驱动。
Support only 8 pixels wide fonts,这个一定要选,否当你给内核传递vga=788参数,让Linux在字符界面下高分辨率显示的时候,系统会因为找不到合适的小字体而返回到低分辨率模式。 好了!所有内核的配置工作到这里就全部完成了,剩下的几个大项全部选N就行了。保存后退出,配置程序会自动生成一个隐藏的配置文件。config 下面是我配置好的。config文件内容。如果你懒的自己去配置,那么直接把这个。config拷贝到你的源代码目录下就能直接用了。(已经去掉了#开头的注释行)
CONFIG_X86=y |
5 编译内核
#make dep |
下面是最后编译结果:
Boot sector 512 bytes |
我用上面的配置得到了一个845k的内核。编译好的内核放在/usr/src/Linux-2.4。20-8/arch/i386/boot下。将他拷贝在一个安全的地方备用。建立一个专放babyLinux材料的目录:
#mkdir /babyLinux |
建立一个做babyLinux根文件系统的目录:
#mkdir /babyLinux/rootfs |
备份内核:
#cp /usr/src/Linux-2.4.20-8/arch/i386/boot/bzImage /babyLinux/ |
七、编译busybox
1 busybox简介
busybox是一个集成了一百多个最常用Linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小。我们平时用的那些Linux命令就好比是分力式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,在嵌入式Linux应用中,busybox有非常广的应用,另外,大多数Linux发行版的安装程序中都有busybox的身影,安装Linux的时候案ctrl+alt+F2就能得到一个控制台,而这个控制台中的所有命令都是指向busybox的链接。
Busybox的小身材大作用的特性,给制作一张软盘的Linux带来了及大方便。
2 busybox的用法
可以这样用busybox
#busybox ls
他的功能就相当运行ls命令。
最常用的用法是建立指向busybox的链接,不同的链接名完成不同的功能。
#ln -s busybox ls |
然后分别运行这三个链接:
#./ls |
就可以分别完成了ls rm 和mkdir命令的功能。虽然他们都指向同一个可执行程序busybox。但是只要链接名不同,完成的功能就不同,busybox就是这么的神奇。很多Linux网站都提供busybox的源代码下载。目前版本是busybox1。0正式版。
3 配置busybox
busybox的配置程序和Linux内核菜单配置方式简直一模一样。熟悉用make menuconfig方式配置Linux内核的朋友很容易上手。
#cp busybox-1.00.tar.gz /babyLinux |
下面是需要编译进busybox的功能选项,其他的可以根据需要自选,但是同样不要太贪心。
General Configuration应该选的选项:
Show verbose applet usage messages |
这个选项是一定要选择的,这样才能把busybox编译成静态链接的可执行文件,运行时才独立于其他函数库。否则必需要其他库文件才能运行,在单一个Linux内核不能使他正常工作。
Installation Options |
这个选项也一定要选,否则make install 后busybox将安装在原系统的/usr下,这将覆盖掉系统原有的命令。选择这个选项后,make install后会在busybox目录下生成一个叫_install的目录,里面有busybox和指向他的链接。 其他选项都是一些Linux基本命令选项,自己需要哪些命令就编译进去,一般用默认的就可以了。配置好后退出并保存。
4 编译并安装busybox
#make |
编译好后在busybox目录下生成子目录_install,里面的内容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin |
其中可执行文件busybox在bin目录下,其他的都是指向他的符号链接。我编译出来的busybox可执行文件是935K,加上符号链接,整个_install目录是952K。加上845K的内核不是已经超过1440K了吗?别担心,我们将对整个根文件系统做大幅度的压缩。
八、制作根文件系统
1 基本目录结构
#cd /babyLinux/rootfs |
其中etc,proc和dev是一定要建的,bin和sbin不用建,因为busybox中已经有了。其他的可以象征性的建几个就可以了。拷贝busybox:
#cp -R /babyLinux/busybox-1.00/_install/* /babyLinux/rootfs/ |
2 建立设备文件名
#cd /babyLinux/rootfs/dev |
你可以用mknod手工建立,也可以直接从原系统的/dev目录下拷贝过来。
手工建立的方法:
#ls -l /dev/console |
这样就查看到了console设备的主设备号是5,辅设备号是1,是一个标记为C的字符设备。于是,我们可以用mknod建立一个同样的设备文件:
#mknod console c 5 1 |
但是手工方法建立太麻烦了,通常直接从/dev下把需要的设备文件拷贝过来。这些设备文件是特殊文件,在拷贝时一定要加上-R参数才能拷贝。
#cp -R /dev/console ./ |
以下是我认为需要的设备名:
cdrom fd0 hda14 hda4 hdb11 hdb19 hdc hdc16 hdc6 hdd13 hdd3 loop2 ram2 |
其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb等是必备的。其它的hda,hda1,hdb等可以根据实际需要决定。但是上表中的选择是比较合理的,即能满足大部分的需要,有没有不用的设备浪费空间。注意,千万不要把/dev下的设备全拷贝过来,那将产生大约420K的/dev目录,这对babyLinux来说太大了。
3 建立etc目录下的配置文件
busybox.conf group inittab motd passwd resolv.conf shadow- |
其中init。d是一个目录,从busybox-1。00源代码目录下拷贝过来。
#cp -R /babyLinux/busybox-1.00/examples/bootflopyp |
Busybox.conf是一个空文件。其他文件的内容如下:
fstab |
其中有很多是从原系统的/etc下拷贝过来修改的,如果你是一个具有中等以上水平的Linux爱好者,那么应该一看就明白了,当然,你也可以根据自己的需要修改这些文件。其中最重要的是fstab和inittab,busybox内建的init程序用到的inittab文件的语法和一般的不一样,不能直接把原系统/etc下inittab文件拷贝过来。可以把busybox-1.00目录下的示例文件拷贝过来修改用。具体请看busybox的文档。busybox的init也可以不用inittab。但是在我制作babyLinux过程中有一个非常奇怪的bug。所有/sbin下的busybox链接在做成压缩的根文件系统,解压后都不能正常运行,显示找不到该命令。只有当我在/bin下做这些链接时才能运行。具体原因还不太清除,所以你需要做下面的工作:
#cd /babyLinux/rootfs/sbin |
查看到sbin下有上述链接,转到bin下:
#cd /babyLinux/rootfs/bin |
重新做这些链接:
#ln -s busybox chroot |
然后把sbin下的链接删除,以节省空间:
#rm -rf /babyLinux/rootfs/sbin/* |
再把原先inittab中所有的sbin改成bin ,Init.d下的文件:rcS。请确保这个文件是可执行的,否则请改成可执行的:
#chmod u+x rcS |
rcS的内容:
#! /bin/sh |
可以自己作相应的修改。
以上是babyLinux根文件系统的所有内容,他的总大小应该在1M左右。
我还计划做一个live CD,但是目前已经有很多live CD了,而且都做的非常好。但是我会自己做一个作为学习Linux的一种手段。如果有时间,可能写一个做U盘Linux和live CD的教程。但是,我想不会写的和这个文档一样详细了,我的时间有限。可能大概讲一下原理和步骤。有经验的Linux爱好者应该可以通过阅读文档完成制作。