Linux常用文件系统概述-Flash篇

简介:      总的来分,Linux文件系统分为两类,基于Flash和基于RAM的文件系统。两者的特点是,基于Flash的文件系统是掉电可保存的,但对于RAM的文件系统掉电是会丢失的。        一、基于Flash的日志型的文件系统        1、只读的CramFS文件系统简介        CramFS是一个压缩式的文件系统,它并不需要一次性的将文件系统中的所有内容都解压缩到内存之中,而是在系统需要访问某个位置的数据时,首先计算出该数据在CramFS文件系统中的位置,将这段数据实时地解压缩到内存中,而不是所有的数据。
     总的来分,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
  并且特别注意内核配置时要选上 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设备驱动开发详解》宋宝华等


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
18天前
|
存储 监控 安全
《Linux 简易速速上手小册》第6章: 磁盘管理与文件系统(2024 最新版)
《Linux 简易速速上手小册》第6章: 磁盘管理与文件系统(2024 最新版)
34 1
|
18天前
|
Unix Linux
Linux 常用命令汇总(六):磁盘与文件系统命令
Linux 常用命令汇总(六):磁盘与文件系统命令
|
10月前
|
Linux
第七章、Linux磁盘与文件系统管理
第七章、Linux磁盘与文件系统管理
54 0
|
9月前
|
IDE Linux 开发工具
Linux磁盘管理与文件系统
Linux磁盘管理与文件系统
59 0
|
10月前
|
Linux 数据安全/隐私保护
第十四章、【Linux】磁盘配额与进阶文件系统管理
第十四章、【Linux】磁盘配额与进阶文件系统管理
89 0
|
10月前
|
Linux
7.3.6 【Linux】磁盘/文件系统参数修订
7.3.6 【Linux】磁盘/文件系统参数修订
52 0
|
12月前
|
存储 缓存 算法
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(下)
142 1
|
12月前
|
存储 Linux 编译器
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
【Linux】基础IO(二)--- 理解内核级和用户级缓冲区、磁盘与ext系列文件系统、inode与软硬连接(上)
158 0
|
12月前
|
存储 Linux 云计算
Linux云计算——磁盘和文件系统管理(二)
Linux云计算——磁盘和文件系统管理(二)
93 0
|
12月前
|
前端开发 Linux 云计算
Linux云计算—— 磁盘和文件系统管理(一)
Linux云计算—— 磁盘和文件系统管理(一)
141 0