前言

一个基本的文件系统应该包括:

           busybox(提供shell命令集)、

      配置文件(用来初始化和布局你的文件系统)、

      设备文件(如果是用devfs的话这个就免了,当然现在都是udev,之后介绍)、

      必要的库文件系统(如果busybox是静态编译的话,那根本不用为busybox用到的库文件而烦。

 

在我制作的文件系统里,只是为了用户程序和qt的运行才放置了一些库文件)。

  

正文

一、 首先说一下busybox的配置和编译问题

其实搞好busybox后,可以说你的文件系统已经完成了一半了。要注意busybox和交叉编译工具的版本搭配问题

在这里我推荐一个搭配:

     busybox-1.1.3 arm-linux-gcc-3.3.2(在文坛上看到过有人说busybox-1.0.1+arm-linux-gcc-3.4.1也可以正常编译通过,你自己看着办吧)。

 

Busybox的配置很简单,详细过程可以参考《基于S3C2410Linux全线移植文档》的文件系统部分,我刚开始的时候就是按照这个来做出一个很简单的文件系统的。

  

不过有一点要特别注意的(shell的配置问题)

1、要这样配置:
  │ │              Shells  --->     
  │ │              Choose your default shell (ash)  --->       

2、如果是这样配置的话,虽然可以生成ash,但不能生成sh:
  │ │      Choose your default shell (none)  --->  

  │ │      [*] ash  

另外,按照他的这种方法做出来的文件系统,运行的时候shell并不好有,没有历史记录、自动补全、删除字符的功能,下面介绍如何为它添加这些功能:

               Shells  ---> 

---   Bourne Shell Options                                        

   [ ]   Hide message on interactive shell startup                  

   [ ]   Standalone shell                                           

   [*]   command line editing                                       

   [*]     vi-style line editing commands                            

       (15)    history size                                             

   [*]     history saving                                           

   [*]     tab completion                                           

   [*]       username completion                                

   [ ]     Fancy shell prompts

  

这是我自己试验出来的,网上没有看到过这方面的介绍,在此奉献给大家。

  

二、 再来说一下配置文件的问题

在文件系统中,配置文件主要存放在/etc目录里面。

《基于S3C2410Linux全线移植文档》里面介绍的文件系统由于需要加载文件系统的时候/mnt/etc目录拷贝到/etc,所以不得不使用/linuxrc脚本,不过如果是这样的话需要在内核传递参数里设置init=/linuxrc。

因为默认是启动/sbin/init初始化脚本的busybox编译安装以后生成的  linuxrc文件  ---> /bin/busybox的符号文件,应该把它删掉,自己重写脚本)。在我做的文件系统里不采用这种方法,所以不用设置init=/linuxrc

  

Busybox init的流程在《构建嵌入式linux系统》这本书里面有介绍,我在这简单的说一下:

 如果不采用linuxrc的话就会执行/sbin/init脚本(busybox init),

        它会去分析/etc/inittab脚本(如果没有的话就使用它默认的来代替,一般没必要自己为它编写这个脚本,用它默认的就行),

                  然后会执行/etc/init.d/rcS命令(在我制作的文件系统里就把配置都写入了这个文件)。

  

至于rcS这个目录的编写主要是安排哪些目录挂载哪些次级文件系统,

     比如/proc要挂载proc文件系统、

                 /sys要挂载sysfs

         /dev/shm要挂载tmpfs

         /tmp要挂载ramfs等等。

 

此外,还可以让内核重新挂载根文件系统也行,具体可以参考rcS这个脚本里面的内容,我的是参考友善的那个来写的。另外,可以在这个脚本里执行一些命令,比如设置ip地址、建立符号链接(我为usb设备的挂载特意建立了/dev/sda1的符号链接)、设置主机名等等。Busybox init还会调用/etc/profile来设置PATH,具体请看文件。

  

在《构建嵌入式linux系统》提到了怎样建立和建立哪些设备文件,但因为devfs这个东西的存在,我们可以不再为这些设备文件而费心了。因为内核在申请设备的同时会向devfs申请相应的设备文件,然后devfs会帮我们在/dev目录建立相应的设备文件,做到内核使用多少设备就建立多少设备文件,不像以前那样要预先建立一大堆可以你不会用到的设备文件(不过从2.6.12内核开始,这个devfs选项从内核配置中删除,好像是用udevfs之类来代替了,不过很多人还是喜欢用回devfs,而且按现在看来起码它用得还挺不错的)。

  

好像没什么好讲了,至于/lib目录应该放哪些库文件,我也没有底。

我在自己的文件系统中存放了helloworld应用程序和模块,另外还有一个led模块,是用ioctl来控制led灯的亮和灭的,所以我才加载了一些库,而且是从原来友善的文件系统里面拷过来的。以后如果要运行qt的话,还要把qt用到的库文件也放进去,这样文件系统就变得挺大的了。

  

总结

好了,一个简单的文件系统就是如此简单的就可以做出来。不过要做出一个合理的文件系统的话相信还有很多东西要注意,比如:

        根文件系统各目录应该使用什么次级文件系统、

        配置文件的设计、

        选用哪些库文件、

        如何增加用户管理和网络功能(boa)等等。

 

网上关于文件系统制作的介绍很少,不过有个不错的方法就是参考人家文件系统的做法来做,我就是参考友善文件系统的做法来做的。在这里提供一个下载文件系统的好地方,里面有很多的文件系统可以给你参考:
http://husaberg.toby-churchill.com/balloon/releases/v0.7/roots/ 

好了,总结如此,希望对你有帮助。