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日志并进行多维度分析。
目录
相关文章
|
13天前
|
安全 网络协议 Linux
Linux网络名称空间概述
Linux网络名称空间是操作系统级别的一种虚拟化技术🔄,它允许创建隔离的网络环境🌐,使得每个环境拥有自己独立的网络资源,如IP地址📍、路由表🗺️、防火墙规则🔥等。这种技术是Linux内核功能的一部分,为不同的用户空间进程提供了一种创建和使用独立网络协议栈的方式。本文旨在全方面、多维度解释Linux网络名称空间的概念、必要性和作用。
Linux网络名称空间概述
|
1月前
|
存储 监控 Shell
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
【Shell 命令集合 备份压缩 】Linux 备份文件系统 dump命令 使用指南
36 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建DOS文件系统 mkdosfs命令使用指南
【Shell 命令集合 磁盘维护 】Linux 创建DOS文件系统 mkdosfs命令使用指南
31 2
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 文件系统维护工具 ext2ed命令使用教程
【Shell 命令集合 磁盘维护 】Linux 文件系统维护工具 ext2ed命令使用教程
26 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建Minix文件系统 mkfs.minix 命令使用教程
33 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 建立ext2文件系统 mke2fs命令使用教程
30 2
|
1月前
|
安全 Shell Linux
【Shell 命令集合 磁盘维护】Linux 检查和修复Minix文件系统 fsck.minix命令使用教程
【Shell 命令集合 磁盘维护】Linux 检查和修复Minix文件系统 fsck.minix命令使用教程
13 0
|
1月前
|
Shell Linux C语言
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
【Shell 命令集合 磁盘维护 】Linux 查和修复ext2文件系统 fsck.ext2命令使用教程
28 0
|
1月前
|
存储 Linux Shell
【Shell 命令集合 磁盘维护 】Linux 创建MS-DOS文件系统 mkfs.msdos命令使用教程
【Shell 命令集合 磁盘维护 】Linux 创建MS-DOS文件系统 mkfs.msdos命令使用教程
29 0
|
1月前
|
存储 安全 Linux
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
【Shell 命令集合 磁盘维护 】Linux 在特定的分区上建立 linux 文件系统 mkfs命令使用教程
27 0