文件系统是用来做什么的?
存储设备(块设备,像硬盘、flash等)是分块(扇区)的,物理上底层去访问存储设备时是按照块号(扇区号)来访问的。文件系统是一些代码,是一套软件,这套软件的功能就是对存储设备的扇区进行管理,将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时,文件系统会将这个目录+文件名转换成对扇区号的访问。最后,不同的文件系统的差异就在于对这些扇区的管理策略和方法不同,譬如坏块管理、碎片管理。
busybox
busybox 是一个集成了三百多个最常用Linux命令和工具的软件,是一个非常好用的根文件系统制作工具,下载地址http://www.busybox.net/downloads/。下面将介绍下通过busybox制作文件系统的过程。
(1)首先需要下载busybox安装包,进入目录修改Makefile,修改本地交叉编译器的地址。
ARCH =arm
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
(2)然后根据自己的情况配置busybox,配置程序和linux内核菜单配置方式很像,输入命令make menuconfig。
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary (no shared libs)
//这个选项是一定要选上,这样才能把BusyBox编译成静态链接的可执行文件,运行时才独立于其他函数库,否则
//需要其他库文件才能运行BusyBox。
Busybox Library Tuning --->
[*] vi-style line editing commands //选上VI风格的行编辑器命令。
[*] Fancy shell prompts
Linux Module Utilities --->
[ ] Simplified modutils
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
[*] depmod
//取消选中Simplified modutils,使用完整的模块工具命令:insmod、rmmod…
(3)输入命令make编译,然后再输入make install生成_install目录
(4)然后进入_install文件目录下,创建dev目录、lib目录、proc和sys目录。
- 创建dev目录,进入dev目录下要创建两个文件null和console(控制台终端)
sudo mknod console c 5 1
sudo mknod null c 1 3
// 命令 设备文件名 当前设备类型 主设备号 次设备号
上面命令的c代表字符设备,块设备为b。
-
创建lib目录,输入arm-linux-readelf命令查看需要加载哪些库,arm-linux-readelf -a XXX 可查看文件运行架构、大小端、共享库等信息。针对编译时加上"-static"选项的应用程序。arm-linux-readelf -d XXX 可查看应用程序的动态链接库
arm-linux-readelf -d bin/busybox
通过命令可以知道有几个库是必须要加的,然后从交叉编译工具中找到下面几个库拷贝到lib目录下
libm.so.6 -> libm-2.10.1.so(数学库)
libc.so.6 -> libc-2.10.1.so(标准C库)
ld-linux.so.3 -> ld-2.10.1.so(链接库)
- 如果我们要文件系统执行我们自身的init程序,则需要提供配置文件,配置文件是在etc目录下的inittab文件,内容如下所示
其格式如下所示
<id>:<runlevels>:<action>:<process>
<id>:控制台,省略
<runlevels>:运行级别,省略
<action>:表示控制这个子程序的方式,8种方式,如下图所示
<process>:要执行的程序,可以是程序,也可以是脚本,如果前面加-,表示是可交互的程序
-
修改etc下的fstab配置文件,mount -a会自动挂载fstab的内容
# device mount-point type options dump fsck order proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0
device:设备文件,要挂载的设备
mount-point:挂载点
type:文件系统类型
options:挂载的参数
dump和fsck order:忽略
-
创建proc和sys目录,fstab挂载需要。
- 最后,使用mkyaffs2image生成根文件系统镜像,执行命令:mkyaffs2image _install rootfs.yaffs。
(5)将获得的文件系统镜像通过命令烧到开发板上,输入命令:
tftp 30008000 rootfs.yaffs
nand erase e00000 1f200000
nand write.yaffs 30008000 e00000 $filesize
(5)设置U-Boot启动参数,进入uboot,将bootargs 环境变量设置为'console=ttySAC0,115200 root=/dev/mtdblock4 rootfstype=yaffs rw'
到此,文件系统的制作已经完成了。