Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198076
  • 博文数量: 28
  • 博客积分: 197
  • 博客等级: 入伍新兵
  • 技术积分: 291
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-18 14:10
文章分类

全部博文(28)

文章存档

2013年(11)

2012年(17)

分类:

2012-06-20 09:00:38

     总的来分,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,有些镜像制作工具如果没有的话,可以自行安装)
    
  1. $mkfs.cramfs /rootfs cram.img
  2. 可以挂载测试一下,采用虚拟的loopback的块设备
  3. $mount -o loop -t cramfs /cram.img /mnt
  4. $ls /mnt
  5. 查看一下,是否有/rootfs中的例如bin、sbin、usr等目录
  6. 可以将其下载到nand MTD的root分区,设置好uboot的启动参数,例如
  7. $set bootargs noinitrd root=/dev/mtdblock4 console=ttyS0,115200 rootfstype=cramfs mem=64mb
  8.  
    并且特别注意内核配置时要选上
    File systems  --->[*] Miscellaneous filesystems  ---> <*>   Compressed ROM file system support (cramfs)
    以支持cramfs文件系统,同时还应该将MTD相关的块设备和分区选上,那么,系统正常挂载cramfs之后会出现
    VFS: Mounted root (cramfs filesystem) readonly.
     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的页大小有所区分

  1. $mkyaffsimage /rootfs yaffs.img

     C、使用
     烧写yaffs镜像到NAND分区也是很有讲究的因为该镜像的文件里面除了以512字节为单位的一个页面的数据外,还有16字节的NAND Flash备份数据,应该如以下方法烧写

  1. $usbload
  2. DNW下载镜像 //注意下载地址
  3. $nand erase 0x2000000 0x3E000000
  4. $nand write.yaffs 0x41000000 0x2000000 $(filesize)
可以有两种方法使用,在uboot启动参数的时候就指定好根文件系统采用yaffs(从延长nand寿命角度和运行速度来讲不赞同这么使用)

  1. $set bootargs root=/dev/mtdblock2 console=ttyS0,115200 rootfstype=yaffs mem=208mb

或者采用其他文件系统(如cramfs、ramdisk、initramfs或者tmpfs等)作为根文件系统,在系统和根文件系统起来之后,在运行
 
  1. $mount -t yaffs /dev/mtdblock3 /mnt
  2. 在/mnt目录下建一个文件
  3. $touch /mnt/test
  4. 卸载之后重新挂载该文件系统
  5. $umount /mnt
  6. $mount -t yaffs /dev/mtdblock3 /mnt
  7. 在看一下刚才的test文件还是存在的
  8. $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、制作和使用
  1. $mkfs.jffs2 -d /rootfs -o jffs2.img
  2. 在ubuntu上直接挂载测试
  3. $mount -t jffs2 jffs2.img /mnt -o loop
  4. $ls /mnt
能正确显示之前准备的根文件系统,则说明制作成功。

 
     4、UBI/UBIFS文件系统简介
 
     UBIFS是由Thomas Gleixner,Artem Bityutskiy等人于2006发起的,致力于开发性能卓越、扩展性高的Flash专用文件系统。UBI是一种类似于LVM的逻辑卷管理层,主要实现损益均衡,逻辑擦除块、卷管理和坏块管理等,而UBIFS则是基于UBI的Flash日志文件系统。UBI并不直接工作于MTD之上而是工作于UBI卷之上,这是它与JFFS2、YAFFS2的一个显著区别。
     使用UBIFS时,内核选项配置
 
  1. Device Drivers --->
  2.   <*> Memory Technology Device (MTD) support --->
  3.     UBI - Unsorted block images --->
  4.      <*> Enable UBI
  5.      <*> MTD devices emulation driver (gluebi)
  6. File systems --->
  7.   [*] Miscellaneous filesystems --->
  8.     <*> UBIFS file system support
     在ubuntu上使用mtd-utils制作UBI镜像,例如

  1. $mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 4096 -o ubifs.img
  2. $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给出了详细的描述,引用之,在此谢过。

 

相关参考:

《ARM嵌入式Linux系统开发技术详解》杨水清等

《LINUX设备驱动开发详解》宋宝华等


阅读(3975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~