最近学习了下制作根文件系统,其实就是创建各种目录,并且在里面创建你需要的各种文件,比如在/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放各种配置文件,在/lib目录下存放库文件,等等。
linux系统下比较流行的文件系统如下:
jffs文件系统:jffs文件系统最早有瑞典Axis Communications公司开发,目前已经大量被RedHat公司基于其开发的jffs2取代,该类文件系统主要用于nor型闪存。
yaffs文件系统:YAFFS是第一个在GPL协议下发布的、基于日志的、专门为NAND Flash存储器设计的、适用于大容量的存储设备的嵌入式文件系统。
yaffs2文件系统:YAFFS2 是Aleph1的工程师Charles Manning 开发的NAND Flash 文件系统。YAFFS1和YAFFS2 主要差异还是在于PAGE 读写 size的大小,YAFFS2可支持到2K per page, 远高于YAFFS的512 Bytes, 因此对大容量NAND flash更具优势。其他与YAFFS1不同的是, YAFFS2不再写spare area, sequenceNumber 用29 bits 表示。Yaffs2还拥有YAFFS1所缺乏的SuperBlock, 因此YAFFS1严重依赖文件系统的read_super。目前YAFFS 和YAFFS2 皆遵守GNU GPL开放原始码。Android 采用yaffs2作为MTD NAND flash文件系统,位于fs/yaffs2/目录下。
cramfs文件系统:CRAMFS文件系统是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩,文件系统类型可以是EXT2或EXT3
nfs网络文件系统:NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
VFS虚拟文件系统:VFS的作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。
在嵌入式系统中,一般选择使用busybox开源工程去制作最小根文件系统。
第一步:下载busybox源码:
busybox-1.7.0.tar.bz2
第二步:解压busybox源码
tar jxvf busybox-1.7.0.tar.bz2
第三步:编译busybox工程
make menuconfig ==> 配置编译
vim makefile ==> 修改CROSS_COMPILE=arm-linux-
make
make CONFIG_PREFIX=存放的目录 install ==> 安装到指定目录
好了到了这步已经完成了busybox的编译,它会生成以下几个目录和程序:/bin、/sbin、/usr、linuxrc,,它里面已经有了各种命令的可执行程序和init进程,但是光有这些还是不够,还需要一些目录。
第四步:制作/dev目录
mkdir dev && cd dev
mknod console c 5 1
mknod null c 1 3
第五步:构建/etc目录
mkdir etc && cd etc && vim inittab ==> 输入:console::askfirst:-/bin/sh
第六步:安装C库,放在/lib目录下
mkdir lib
cd ../../u-boot工程/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
cp *.so* ../../../../busybox工程/rootfs/lib/ -d
(注:-d表示将链接文件同样拷贝成链接文件)
第七步:生成文件系统对应的镜像文件
tar jxvf yaffs_source_util_larger_small_page_nand.tar.bz2
cd Development_util_ok/yaffs2/utils/
make
cp mkyaffs2image /usr/local/bin/
chmod +x /usr/local/bin/mkyaffs2image
mkyaffs2image rootfs/ rootfs.yaffs2
chmod +rwx rootfs.yaffs2
将制作好的文件系统镜像烧录到开发板,效果如下:
注:这个最小根文件系统还很不善,比如连proc目录都没有,进一步完善请看下一篇博文之初学JZ2440之编译最小根文件系统(下)