文件系统
简介
大多数的嵌入式设备使用闪存作为存储的媒介。同时,在很多客制化的电子产品中大小和启动的时间也非常重要
。因此选择特殊的文件系统来满足所需的某种特性,如强大的压缩能力,或直接从闪存中执行文件的能力。
MTD Memory Technology Devices
注意,闪存可以由Linux的Memory Technology Devices(MTD)系统管理。更多信息请参见MTD/闪存常见问题。这里提到的大多数文件系统都是建立在MTD系统之上的。
UBI Unsorted Block Images
linux内核中的未分配的块映像系统管理者在单个闪存设备上的多个逻辑卷。他在MTD层通过提供一个映射表将逻辑块与物理块进行映射。UBI提出复杂的分区概念,它允许在整个闪存设备上使用 wear-leveling 算法
分区
内核需要至少一个“root”文件系统,在此基础上,其他的文件系统才能被挂载。在非嵌入式系统中,经常只需要一个文件系统。但是为了优化有限的资源(闪存,内存,处理器速度,启动时间),很多嵌入式系统将文件系统拆分为很多块,并将其分别放入到各自的分区(通常用不同的存储。例如,一个开发者可能希望把系统中所有的只读文件,放到闪存中的一个压缩的只读文件系统中。这将在闪存上消耗最少的空间,代价是一些读时性能(用于解压)。
另外配置可能让可执行文件非压缩的存储在闪存上,以至于他们可以被“就地”执行,这可以节省内存和启动时间(以潜在的少量性能损失为代价)
对于可写的数据,如果数据不需要持久保存,一般会用ram磁盘。依赖于性能需要和内存限制,文件数据可能会被压缩。
对于文件系统的只读和读写部分的交错,没有单一的标准。他依赖于使用在该项目上的嵌入式应用程序集。
嵌入式文件系统
AXFS
Advanced XIP File System
这个文件系统是专门为支持就地执行操作而设计的。它使用了一个两阶段的方法。第一阶段是将文件系统放在闪存中,并运行它来收集配置文件数据,说明哪些页面被使用。在第二阶段,你用这些资料数据建立一个文件系统。这个文件系统把配置文件中提到的所有页面作为XIP数据,然后在挂载时可以加载到RAM中(并作为XIP执行)。也可以把XIP页放在NOR闪存中并从那里运行它们。
Btrfs
btrfs是一个新的写时拷贝文件系统,首次出现在2.6.29-rc1的内核中,并在2.6.30中被合并。
截至2011年4月,许多流行的Linux文件系统工具还不支持Btrfs,如gparted。
Btrfs已经被采纳为MeeGo平台的文件系统。
CramFS
Compressed read-only file system for linux 最大的容量是256MB
Linear Cramfs 是一个特殊功能的名称,用于使用未压缩的文件,在Cramfs文件系统的线性块布局中。这对于存储可以就地执行的文件很有用。
F2FS
flash-friendly file system for linux
InitRAMFS
一个Linux 2.6的功能,它使初始根文件系统和init程序驻留在内核的内存缓存中,而不是在RAM磁盘上(如initrd文件系统)。作者说,与initrd相比,intramfs可以提高启动时的灵活性、内存效率和简易性。对嵌入式Linux开发者来说,一个特别有趣的特点是,相对简单的深度嵌入式系统可以使用initramfs作为其唯一的文件系统。
JFFS2
Journalling Flash File System, version 2.这是最常用的闪存文件系统。日志结构的文件
可压缩
LogFS
目前已经弃用
NFS
Network File System
由于嵌入式设备的空间限制,在开发过程中,使用网络文件系统作为目标的根文件系统是很常见的。这使得目标可以有一个非常大的区域,在开发过程中可以放置全尺寸的二进制文件和许多开发工具。这种方法的一个缺点是,在开发周期的某个时候,系统需要重新配置本地文件系统(很可能需要重新测试),以便最终产品出版。
NFS客户端可以内置到Linux内核中,并且内核可以配置为使用NFS作为根文件系统。这需要对网络的支持,以及指定目标的IP地址和NFS主机上文件系统的路径的机制。此外,必须将主机配置为运行NFS服务器。通常,主机还通过运行DHCP服务器向目标板提供所需的地址和路径信息。
请参阅Linux内核源代码中的Documentation/nfsroot.txt文件,以获取有关随内核安装NFS根文件系统的更多信息。
PRAMFS
Persistent and protected RAM File System
持久/受保护的 RAM 特殊文件系统 (PRAMFS) 是一个功能齐全的读/写文件系统,旨在使用快速 I/O 内存,如果内存是非易失性的,则文件系统将是持久的。此外,它还具有就地执行支持。
RomFS
小型节省空间的只读文件系统
SquashFS
压缩的只读文件系统。他的压缩能力比jffs2,cramfs还要强。
在运行mksquashfs时,有可能调整压缩量。-b选项允许你指定块的大小。一个较小的块大小通常会带来较少的压缩,而一个较大的-b选项会带来更多的压缩。然而,这也有一个缺点。数据是用块从闪存中读取的。因此,如果你使用128k的块大小,而你需要4k的页面,仍然会从闪存中读取相当于128k的压缩数据。由于128k包括32个页面,它将导致32个页面被读入缓冲区缓存,尽管在读取的时候你只需要一个。通常其他的31页也是需要的,但如果不是,你就浪费了一些时间来读取和解压未使用的数据。同时,你在缓冲区的缓存中也得到了一些不需要的数据(可能系统甚至不得不从缓存中踢出已经使用过的页面,以便为这31页腾出空间)。
如果你关心的是最小的文件系统,你可能想用最大的块大小。然而,如果你主要关心的是性能问题,你可能想试验一下,看看什么对你来说是最好的(这甚至可能是根本不应用压缩!)!Mksquashfs有一些选项: -noInodeCompression, -noDataCompression 和 -noFragmentCompression来控制这个)。如果你也应用了函数重排(见Boot Time#User-space and application speedups),一个大的块大小可能会对你有好处。
UBIFS
基于闪存的文件系统,建立在未分配块映射UBI接口之上
对于JFFS2和YAFFS来说有良好的性能
YAFFS2
Yet Another File System 一个文件系统专门为NAND闪存设计
YAFFS2是一个简单,便携,可靠,自足的文件系统。被广泛用在基于非linux系统的嵌入式系统上,也可以在没有操作系统的情况下独立使用,例如在bootloader中使用。当与Linux一起使用时,它可以使用MTD或它自己的闪存驱动器。同样,它也可以使用VFS或它自己的posix层。它是日志结构的,并且是单线程的。它本身不做压缩--要么自己压缩数据,要么在YAFFS2之上使用squashfs。
YAFFS2旨在快速启动(就必须扫描闪存的日志结构的FS而言)。它使用检查点,因此,如果一个分区被干净地卸载,那么在开机时就不需要重新扫描闪存。FS的所有功能都是可配置的,所以你可以权衡诸如最大文件/分区大小、闪存块大小、文件粒度等。除了缓存以确保有效地使用块之外,数据是直接写入闪存的。YAFFS2通常使用闪存中的OOB作为其元数据,允许更快地启动,因为只有OOB需要被读取以进行闪存扫描。它可以在牺牲一些速度的情况下将元数据保留在主页面区域内。
挂载根文件系统
根文件系统是由内核挂载的,使用内核命令行选项。其他文件系统由用户空间挂载,通常由init脚本或init程序使用 "mount "命令挂载。
下面是在Linux下挂载根文件系统的命令行的例子:
使用第一个IDE接口硬盘上的第一个分区:
root=/dev/hda1
或在后来的内核中(sata接口):
root=/dev/sda1
使用NFS根文件系统(内核配置必须支持这个)。
root=/dev/nfs
(通常你需要添加一些其他参数来确保内核的IP地址被配置,或者指定主机的NFS路径)。
使用闪存设备分区2:
root=/dev/mtdblock2
使用mtdram挂载jffs2镜像在pc上
因为不能用回环设备来挂载jffs2的镜像,所以需要使用mtdram来代替,通常情况下需要三个模块来让其工作
- mtdram:在RAM中提供一个MTD分区,尺寸可以被total_size参数来定义 以KB为单位
- mtdblock:他将创建一个块设备用来联系分区
- jffs2:因为jffs2通常不用来作为PC的文件系统,需要手动的加载该模块
modprobe mtdram total_size=16384
modprobe mtdblock
modprobe jffs2
modprobe是linux内核的模块加载命令
依赖于目标机的大小端,镜像文件需要转换为PC的大小端。MTD工具中的jffs2dump可以用来归档
jffs2dump -b -c -e <output-filename> <input-filename>
最后镜像可以被复制到块设备中 通过dd命令
dd if=<image-file> of=/dev/mtdblock0
挂载
mount /dev/mtdblock0 /tmp/jffs2 -t jffs2
使用nandsim挂载UBI镜像到PC上
首先创建一个模拟nand设备
sudo modprobe nandsim first_id_byte = 0x20 second_id_byte=0xaa third_id_byte=0x00 fourth_id_byte = 0x15
检查是否被创建成功
cat /proc/mtd
将其附加到一个mtd设备
sudo modprobe ubi mtd=0
在格式化之前将其分离
sudo ubidetach /dev/ubi_ctrl -m 0
sudo ubiformat /dev/mtd0 -f <image>.ubi
sudo ubiattach /dev/ubi_ctrl -m 0
mkdir temp
sudo mount -t ubifs ubi0 temp
通用问题
MMC和SD卡是闪存设备,为其主机提供面向块的接口。通常,这些设备被用于嵌入式设备,并具有使用FAT文件系统进行块访问的特性。但它们是以 "黑盒 "的形式出现的,其内部逻辑和算法没有暴露给主机。
一些工作正在进行中,以调查这些属性,并使Linux能够更有效地使用这些设备。
特殊目的的文件系统
ABISS
Active Block I/O Scheduling System是一个文件系统,旨在能够为文件系统I/O活动提供实时功能。
分层文件系统
分层文件系统让你在挂载只读的媒介中仍然可写。至少,写的部分会在其他地方结束,这由分层文件系统透明地处理。它已经存在了相当长的时间,下面是一些文件系统的例子,已经可以在(嵌入式)Linux系统上开箱即用。
UnionFS
有时,能够将文件系统叠加在彼此之上是很方便的。例如,在嵌入式产品中,使用压缩的只读文件系统,安装在读/写文件系统的 "下面 "是很有用的。这给了一个完整的读写文件系统的外观,同时仍然保留了压缩文件系统的空间节约,用于那些在产品生命周期内不会改变的文件。
UnionFS是一个提供这种系统的项目(提供多个文件系统的 "联合")。
aufs
another union fs
mini_fo
小扇区叠加文件系统
标签:闪存,常见,文件系统,嵌入式,内核,使用,挂载 From: https://www.cnblogs.com/BMK-RE/p/17374844.html