总的来分,Linux文件系统分为两类,基于Flash和基于RAM的文件系统。两者的特点是,基于Flash的文件系统是掉电可保存的,但对于RAM的文件系统掉电是会丢失的。
一、基于Flash的日志型的文件系统
1、只读的CramFS文件系统简介
CramFS是一个压缩式的文件系统,它并不需要一次性的将文件系统中的所有内容都解压缩到内存之中,而是在系统需要访问某个位置的数据时,首先计算出该数据在CramFS文件系统中的位置,将这段数据实时地解压缩到内存中,而不是所有的数据。
A、特点:
a. 采用实时解压缩方式;
b. CramFS的数据都是经过处理、打包之后的,所以其通常不支持写操作(通常tmp目录是可以写的,这个目录应该是默认挂载成了RamFS),这个特性刚好适合嵌入式应用中ROM类型的只读存储设备使用;
c. 在CramFS中的文件大小不能超过16MB;
(根据网友
MicrochipEmbed
的提醒,源码之中是可以修改这个大小的cramfs_fs.h
#define CRAMFS_MODE_WIDTH 16)
d. 当前版本的CramFS只支持PAGE_CACHE_SIZE为4096的内核,因此要特别注意内核的配置。
B、制作方法
准备好一个根文件系统rootfs,利用工具mkcramfs生成镜像文件cram.img(本文环境为ubuntu10.04,有些镜像制作工具如果没有的话,可以自行安装)
- $mkfs.cramfs /rootfs cram.img
- 可以挂载测试一下,采用虚拟的loopback的块设备
- $mount -o loop -t cramfs /cram.img /mnt
- $ls /mnt
- 查看一下,是否有/rootfs中的例如bin、sbin、usr等目录
- 可以将其下载到nand MTD的root分区,设置好uboot的启动参数,例如
- $set bootargs noinitrd root=/dev/mtdblock4 console=ttyS0,115200 rootfstype=cramfs mem=64mb
2、基于NAND Flash的yaffs文件系统简介
yaffs文件系统是专门为NAND Flash设计的文件系统,是一种日志型的文件系统。
A、特点:
a. 源码公开,具有很好的移植性,可以在Linux、uClinux和WinCE等平台运行,甚至于没有操作系统的环境也能够使用;
b. yaffs利用NAND闪存提供的每个页面16字节的备用空间类存放ECC和文件系统的组织信息,能够实现错误检测和坏块处理;
c. 对于小页面(512B+16B/页)通常采用yaffs,而对于大页面(2KB+64B/页)或者总量超过512MB的NAND Flash则采用yaffs2。
B、制作
关于yaffs镜像的制作工具应该根据具体的NAND flash的页大小有所区分
- $mkyaffsimage /rootfs yaffs.img
C、使用
烧写yaffs镜像到NAND分区也是很有讲究的,因为该镜像的文件里面除了以512字节为单位的一个页面的数据外,还有16字节的NAND Flash备份数据,应该如以下方法烧写
- $usbload
- DNW下载镜像 //注意下载地址
- $nand erase 0x2000000 0x3E000000
- $nand write.yaffs 0x41000000 0x2000000 $(filesize)
可以有两种方法使用,在uboot启动参数的时候就指定好根文件系统采用yaffs(从延长nand寿命角度和运行速度来讲不赞同这么使用)
- $set bootargs root=/dev/mtdblock2 console=ttyS0,115200 rootfstype=yaffs mem=208mb
或者采用其他文件系统(如cramfs、ramdisk、initramfs或者tmpfs等)作为根文件系统,在系统和根文件系统起来之后,在运行
- $mount -t yaffs /dev/mtdblock3 /mnt
- 在/mnt目录下建一个文件
- $touch /mnt/test
- 卸载之后重新挂载该文件系统
- $umount /mnt
- $mount -t yaffs /dev/mtdblock3 /mnt
- 在看一下刚才的test文件还是存在的
- $ls /mnt
或者建一个专门的system目录,以用作QT等较大型的图形界面的镜像的挂载点。
3、基于NOR Flash的jffs文件系统简介
JFFS日志闪存文件系统最早是由瑞典Axis Communications公司基于Linux 2.0的内核未嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统。JFFS基于MTD驱动层,主要用于NOR型闪存。JFFS3还处于设计阶段,主要为了解决JFFS2的不可扩展性,其设计目标是支持大容量闪存(>1TB)的文件系统。
A、特点:
a. 可读写;
b. 支持数据压缩(YAFFS不支持压缩,适合存储容量较大的文件系统);
c. 基于哈希表的日志型文件系统;
d. 提供了崩溃/掉电安全保护;
e. 提供“写平衡”支持等;
B、制作和使用
- $mkfs.jffs2 -d /rootfs -o jffs2.img
- 在ubuntu上直接挂载测试
- $mount -t jffs2 jffs2.img /mnt -o loop
- $ls /mnt
能正确显示之前准备的根文件系统,则说明制作成功。
4、UBI/UBIFS文件系统简介
UBIFS是由Thomas Gleixner,Artem Bityutskiy等人于2006发起的,致力于开发性能卓越、扩展性高的Flash专用文件系统。UBI是一种类似于LVM的逻辑卷管理层,主要实现损益均衡,逻辑擦除块、卷管理和坏块管理等,而UBIFS则是基于UBI的Flash日志文件系统。UBI并不直接工作于MTD之上而是工作于UBI卷之上,这是它与JFFS2、YAFFS2的一个显著区别。
使用UBIFS时,内核选项配置
- Device Drivers --->
- *> Memory Technology Device (MTD) support --->
- UBI - Unsorted block images --->
- *> Enable UBI
- *> MTD devices emulation driver (gluebi)
- File systems --->
- [*] Miscellaneous filesystems --->
- *> UBIFS file system support
在ubuntu上使用mtd-utils制作UBI镜像,例如
- $mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 4096 -o ubifs.img
- $ubinize -o ubi.img -m 2048 -s 512 -p 128KiB ubifs.conf
关于ubifs文件系统的相关知识,可以参考
http://blog.chinaunix.net/uid-15706699-id-2670964.html
让uboot支持ubi
这些文章对uboot和内核中如何烧写和支持ubifs给出了详细的描述,引用之,在此谢过。
这些文章对uboot和内核中如何烧写和支持ubifs给出了详细的描述,引用之,在此谢过。
相关参考:
《ARM嵌入式Linux系统开发技术详解》杨水清等
《LINUX设备驱动开发详解》宋宝华等