随笔-118  评论-133  文章-4  trackbacks-0

文件系统的制作

前言

  文件系统的制作其实并没有想像中那么难。一个基本的文件系统应该包括: busybox (提供 shell 命令集)、配置文件(用来初始化和布局你的文件系统)、设备文件(如果是用 devfs 的话这个就免了)、必要的库文件系统(如果 busybox 是静态编译的话,那根本不用为 busybox 用到的库文件而烦。在我制作的文件系统里,只是为了用户程序和 qt 的运行才放置了一些库文件)。

 

正文

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

其实搞好 busybox 后,可以说你的文件系统已经完成了一半了。 Busybox 之所以比较难编译,主要是 busybox 和交叉编译工具的版本搭配问题。在文坛上不乏因为 busybox 某些命令不能编译通过而烦的人,在这里我推荐一个搭配: busybox-1.1.3+arm-linux-gcc-3.3.2 (在文坛上看到过有人说 busybox-1.0.1+arm-linux-gcc-3.4.1 也可以正常编译通过,你自己看着办吧)。

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

 

不过有一点要特别注意的 (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 目录里面。《基于 S3C2410 Linux 全线移植文档》里面介绍的文件系统由于需要加载文件系统的时候把 /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 目录应该放哪些库文件,我也没有底。如果不运行应用程序,只是运行 busybox 的话根本不用放任何的库,因为我们的 busybox 是静态链接的还记得吧?我在自己的文件系统中存放了 helloworld 应用程序和模块,另外还有一个 led 模块,是用 ioctl 来控制 led 灯的亮和灭的,所以我才加载了一些库,而且是从原来友善的文件系统里面拷过来的。以后如果要运行 qt 的话,还要把 qt 用到的库文件也放进去,这样文件系统就变得挺大的了。

 

总结

好了,一个简单的文件系统就是如此简单的就可以做出来。不过要做出一个合理的文件系统的话相信还有很多东西要注意,比如根文件系统各目录应该使用什么次级文件系统、配置文件的设计、选用哪些库文件、如何增加用户管理和网络功能 (boa) 等等。网上关于文件系统制作的介绍很少,不过有个不错的方法就是参考人家文件系统的做法来做,我就是参考友善文件系统的做法来做的。在这里提供一个下载文件系统的好地方,里面有很多的文件系统可以给你参考:
http://husaberg.toby-churchill.com/balloon/releases/v0.7/roots/

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

 

posted on 2007-01-10 11:09 lfc 阅读(16983) 评论(11)  编辑 收藏 引用

评论:
# re: 根文件系统的制作 2007-01-14 18:34 | todaygood
喜欢你的文笔!  回复  更多评论
  
# re: 根文件系统的制作 2007-01-26 17:31 | ua
写得挺详细的。大佬,你用的是友善之臂的2410开发板吗  回复  更多评论
  
# re: 根文件系统的制作 2007-07-26 10:59 | fangzheng
您有《构建嵌入式 linux 系统》的中文版本吗?
我下的电子书是英文的  回复  更多评论
  
# re: 根文件系统的制作 2007-07-29 09:44 | dg322
多去锐极论坛灌水呀!
http://www.ruijitek.com/bbs
:)  回复  更多评论
  
# re: 根文件系统的制作 2007-12-19 10:30 | 搬场
谢谢,学习中  回复  更多评论
  
# re: 根文件系统的制作 2008-04-22 08:35 | wwlhz
thanks very much!  回复  更多评论
  
# re: 根文件系统的制作 2008-07-04 23:58 | dgy
LZ,我在移植根文件系统的时候出现一个疑惑:mtd分区的挂载。通过bootloader传递根文件系统的mtd分区能够挂载/上,为什么我在fstab中挂载q其他的mtd分区瘸不行呢?我看见网上的资料没见着有挂载成功过的,局部信息如下:
Creating 5 MTD partitions on "NAND 64MiB 3,3V 8-bit":
0x00000000-0x00020000 : "vivi"
0x00020000-0x00030000 : "param
0x00030000-0x001f0000 : "kernel"
0x00200000-0x00600000 : "root"
0x00600000-0x04000000 : "usr"
。。。。。。。
mount: Mounting /dev/mtdblock/4 on /usr failed: No such device

不知道是什么原因?开发板带的文件系统好像也没有挂载成功过。
有没有方法将其他mtd分区像硬盘一样挂载到文件系统中呢?
谢谢!
  回复  更多评论
  
# re: 根文件系统的制作 2008-08-05 15:32 | xxx
mount: Mounting /dev/mtdblock/4 on /usr failed: No such device

改为/dev/mtdblock3
  回复  更多评论
  
只有注册用户登录后才能发表评论。