全部博文(610)
分类: LINUX
2008-03-23 10:49:26
前言
:
文件系统的制作其实并没有想像中那么难。一个基本的文件系统应该包括:
busybox
(提供
shell
命令集)、配置文件(用来初始化和布局你的文件系统)、设备文件(如果是用
devfs
的话这个就免了)、必要的库文件系统(如果
busybox
是静态编译的话,那根本不用为
busybox
用到的库文件而烦。在我制作的文件系统里,只是为了用户程序和
qt
的运行才放置了一些库文件)。
正文
:
一、
首先说一下
busybox
的配置和编译问题
其实搞好
busybox
后,可以说你的文件系统已经完成了一半了。
Busybox
之所以比较难编译,主要是
busybox
和交叉编译工具的版本搭配问题。在文坛上不乏因为
busybox
某些命令不能编译通过而烦的人,在这里我推荐一个搭配:
busybox-
Busybox
的配置很简单,详细过程可以参考《基于
S
不过有一点要特别注意的
(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
目录里面。《基于
S
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
目录建立相应的设备文件,做到内核使用多少设备就建立多少设备文件,不像以前那样要预先建立一大堆可以你不会用到的设备文件(不过从
好像没什么好讲了,至于
/lib
目录应该放哪些库文件,我也没有底。如果不运行应用程序,只是运行
busybox
的话根本不用放任何的库,因为我们的
busybox
是静态链接的还记得吧?我在自己的文件系统中存放了
helloworld
应用程序和模块,另外还有一个
led
模块,是用
ioctl
来控制
led
灯的亮和灭的,所以我才加载了一些库,而且是从原来友善的文件系统里面拷过来的。以后如果要运行
qt
的话,还要把
qt
用到的库文件也放进去,这样文件系统就变得挺大的了。
总结
: