嵌入式Linux中Yaffs文件系统的构建与优化
2015-06-15汪祖民张红梅
汪祖民,张红梅
(大连大学信息工程学院,辽宁 大连 116622)
嵌入式Linux中Yaffs文件系统的构建与优化
汪祖民,张红梅
(大连大学信息工程学院,辽宁 大连 116622)
针对嵌入式Linux开发中文件系统的重要作用,详细介绍了如何利用busybox构造一个最小的Yaffs日志型文件系统,并配置、优化文件系统的物理布局和各级子目录文件,使制作的文件系统在满足开发功能的条件下最大限度地减小所占内存空间。设置文件系统用户和所属组来提高系统安全性,使该文件系统更好地应用于嵌入式开发。并针对基于NandFlash的Yaffs在损耗均衡和垃圾回收方面的不足,提出了优化策略,延长NandFlash的使用寿命。
文件系统,嵌入式,Linux,Yaffs
0 引言
目前,嵌入式系统已被广泛应用,其软硬件都需高效设计,去除冗余,以最小的系统、最低的成本实现目标功能。NandFlash以其容量大、成本低等优势成为嵌入式领域的主流存储器[1]。Yaffs是专门为NandFlash设计的日志文件系统。通常默认的文件系统包括许多功能,其大小有几百兆,在嵌入式开发中无法使用如此大的文件系统,因此,针对NandFlash存储介质,构造一个精简高效的嵌入式Linux文件系统成为嵌入式开发重要的一部分。另外,针对Yaffs在损耗均衡和垃圾回收机制上存在的缺陷,现有的典型损耗均衡算法有Cost-Benefit算法、CAT算法等。但一般存在两大局限:一是不能解决因擦除块中数据频繁更新造成的部分擦除块磨损次数过多的问题,二是不能有效管理长期不更新的静态数据块,以至部分擦除次数过少,不能实现擦除块中冷热数据的搬移,降低了NandFlash使用寿命。因此,需要优化损耗均衡算法提高NandFlash使用寿命。
1 嵌入式文件系统简介
文件系统是操作系统中文件存储的物理空间和数据基础,包括文件、存储和目录[2]。Yaffs以页为存储单位,每页分为16 bit的OOB区和512 bit的data区,32页为一个擦除块。Yaffs需要建立物理页与文件的映射表,把映射表分成若干份组织成节点数型的层次索引目录[3]。NandFlash的擦除次数一般为10万~100万次。因此,优化Yaffs均衡损耗算法使每个块的擦除次数接近平均值时,Flash使用寿命才会达到最长时间。
2 构造嵌入式Linux文件系统
2.1 开发环境
硬件平台采用PXA270-RP试验箱,宿主机是利用虚拟机安装Red Hat 9.0 Linux,使用交叉编译。PXA270-RP是英特尔公司生产的32位嵌入式处理器,采用Xscale架构。设计中使用串口线连接宿主机和PXA270-RP,用交叉网线将宿主机与目标机的网口相连,使用JTAG下载线。系统主要硬件组成如图1所示。
图1 系统硬件结构
2.2 构造文件系统
在嵌入式系统开发中,一个最小的文件系统必须包含:init进程、配置文件inittab、c库、设备文件/dev以及配置文件中所指定的应用程序。设计中利用busybox和mkyaffs2image工具制作一个精简高效的适合嵌入式开发的文件系统OFS。首先创建根目录/OFS,在其中建立系统运行、启动所必须的目录:/bin、/dev、/etc、/lib、/proc、/sbin、/usr等。
2.2.1 编译安装busybox
busybox是一个遵循GPL v2协议的开源项目,为各种小型嵌入式系统提供较完整的工具集[4]。busybox在编写过程中考虑系统资源有限情况,优化文件大小,可根据开发需要通过执行命令进入busybox的配置界面进行配置。编译安装busybox后自动生成文件系统所需的/bin、/sbin、/usr、linuxrc目录。在此,安装编译busybox-1.18.0.tar.bz2压缩包,执行以下命令:
配置完成后,修改busybox-1.18.0下的Makefile文件,将208行和209行修改为:
ARCH?=arm
CROSS_COMPILE?=arm-linux-
最后安装busybox,在/OFS目录下执行命令:
#make CONFIG_PREFIX=/work/OFS install
成功安装后就会在 /OFS目录下生成 /bin、/sbin、/usr、linuxrc文件目录及其各级子文件。
此时,构造出Linux文件系统最重要init文件,它是系统所有进程的发起者和控制者,当系统启动完成内核引导后便会加载init进程进行初始化,读取并解析inittab配置文件,根据inittab中的内容依次启动其他用户程序。inittab会指导init调用一个重要的系统初始化程序rc.sysinit,完成文件挂载、环境变量配置等。init程序执行流程图如2所示。
图2 init进程
2.2.2 创建/etc目录
(1)创建/etc/inittab文件
依据 busybox-1.18.0/examples/inttab文件和已建立的init程序中内容,创建inittab文件。inittab文件为初始化表,格式:id:runlevels:action:process,其中,id指终端,即标准输入、输出;runlevel指系统启动级别;action指何时执行;process表示执行进程。编写如下代码:
默认的文件系统/etc/init.d中存放众多服务器脚本,实际中只需保留3个服务启动脚本:network、iptables、NFS。相应的在/etc/sysconfig系统配置文件中,也只设置了network、iptables、NFS系统配置。在/etc/init.d下,rcS为脚本文件,在里面添加自动执行命令如下:
(4)创建/etc/fstab文件,完成挂载
设置/etc/fstab文件内容,把临时文件/tmp大小设置为5 M,日志文件的空间为50 K,相应地把/etc/mtab内容中的/tmp和/var也分别设置为5 M和50 K,权限为“rw”,编写fstab内容如下:
2.2.3 构造/lib目录文件
lib目录中存放共享库和驱动程序,共享库用来启动系统、运行根文件系统中的可执行程序[5]。使用交叉编译生成的glibc库中的文件构成OFS的/lib目录。glibc库中共有8类文件,在嵌入式开发中只需其中的动态库和加载器,从原文件系统复制这两种文件到/lib目录下(表1是原lib库和新建lib库大小对比),执行以下命令完成/lib创建:
表1 lib库大小对比
2.2.4 构造/dev目录
使用busybox中自带的mdev建立console、null、ttySAC0设备文件,执行以下命令创建设备文件:
2.2.5 构造其他目录
一个最小的文件系统除了上述构造的文件外,还包括/proc、/mnt、/tmp、/sys、/root等,这些目录可根据以后具体开发写入相应内容。在根目录下执行命令“mkdir mnt sys root proc tmp tools”。其中,/tmp是临时文件,之前已经设置为5 M,系统运行时可挂载5 M的虚拟内存文件系统,/tools目录用来放置开发过程中用到的文件,用完后可自行删除,释放系统空间。
2.3 配置文件系统权限
由于文件较多,单个配置麻烦,对此编写一个脚本access,将其放在主目录/OFS下,方便系统执行、管理和修改,开发完成后可将其自行删除。根据开发需要定义好权限后写入脚本access,执行以下命令完成配置:
2.4 制作文件系统的映像文件
使用mkyaffs2image工具制作映像文件。将mkyaffs2image.tgz压缩包拷贝到/work下,解压缩后生成mkyaffs2image和mkyaffs2image-128 M,编译安装后就可以使用mkyaffs2image工具来生成文件系统映像文件。制作完成以后,将映像文件放到tftp目录或者nfs目录下将其下载、烧写入开发板中。执行以下命令完成文件系统的映像文件制作:
至此,完成了一个最小嵌入式Linux文件系统的构建,新构造的文件系统仅有19.3 M,大大缩小了所占内存空间,只需在具体应用开发时加入所需应用程序即可,总体结构如下页图3所示。
图3 文件系统结构图
3 Yaffs优化
基于NandFlash的Yaffs文件系统存在着两大局限:损耗均衡和垃圾回收。垃圾回收的目的是获取可用的存储块,它实现的代价是很高的,需要进行多次擦除与读写操作[5]。因此,在设计损耗均衡算法的同时必须考虑垃圾回收过程对系统造成的影响,这两者之间是不可分隔的。
3.1 YAFFS均衡损耗算法的优化
针对目前Yaffs损耗均衡性较差的情况,在分析了现有策略的基础上,提出了一种基于逻辑块与物理块优化区分策略。将逻辑块区分为冷、热逻辑块,写入频率高的为热逻辑块,写入频率低的为冷逻辑块,使用多维哈希表来存储逻辑块操作次数,并设定阈值t和T界定冷热逻辑块,t和T可根据实际情况调整。物理块分为低龄区、高龄区,即擦除次数少的为低龄物理块,擦除次数多的为高龄物理块,为了减小低龄与高龄物理块之间的差值,在这里引入“超龄区”。当触发损耗均衡条件时,通过空闲块分配策略把热逻辑块映射到低龄物理块,冷逻辑块映射到高龄物理块,而超龄区冻结。但是为了避免可用物理块减少,不能一直冻结超龄物理块,因此,采用动态冻结,即设定一个高龄与低龄物理块的差值a,当超龄块达到阈值A(A为物理块年龄最小值与a的和)时冻结超龄区,每当系统进行一次数据迁移后,清空超龄区数据块,使阈值A可以根据系统的具体情况而动态变化。均衡损耗算法的核心是空闲块分配策略,该算法中使用双向链表的循环队列来管理空闲块的分配。优化后算法基本流程如图4所示。
图4 算法基本流程图
3.2 垃圾回收
垃圾回收目的是回收无效的脏块并处理坏块,操作对象主要是脏块和无效块,对于无效块可直接擦除,而对于脏块的操作比较复杂,首先需要从脏块中取出有效数据页,将其写入其他块中,然后才能擦除[6]。这里,用脏度来表示脏块中脏页和有效页的比例,脏页越多脏度就越大。
从垃圾回收的目的方面考虑应首选最脏的块进行擦除,而从损耗均衡方面考虑应选择低龄物理块进行擦除,因此,如何选择合适的块进行垃圾回收是损耗均衡算法的关键。该算法中采用贪心算法和随机算法相结合的方式进行垃圾回收,以期达到最佳效果。首先,设定一个阈值Na,当空闲块小于该阈值Na时,采用贪心算法,将脏块按脏度从大到小排列后,每次都选取最脏的块进行回收,并记录每块的擦除次数n。当空闲块数量超过阈值Na后,就可以随机地回收脏块,并记录每个物理块擦除次数n。并设定阈值Nc表示一个块被擦除的次数,当一个块记录的擦除次数n达到Nc,就将该块上的数据与擦除次数最小的块进行交换,避免频繁擦除一个物理块缩短NandFlash的寿命。改进后垃圾回收策略的详细步骤如流程图5所示。
图5 Yaffs垃圾回收算法优化流程图
Yaffs损耗均衡算法经过优化后改善了各物理块之间擦除次数的差值,使每个物理块擦出次数更加接近平均数,将优化后算法与原算法擦除次数标准差与内存耗费进行对比如表2所示。
表2 擦出次数与耗费内存对比
4 总结
基于目前流行的NandFlash存储器构建Yaffs日志型最小文件系统OFS,其大小仅有19.3 M。给出了利用busybox和mkyaffs2image工具制作文件系统的一般方法,对于大多数嵌入式开发中文件系统的制作具有一定的参考价值。另外,针对基于NandFlash存储器上Yaffs磨损均衡性差的缺陷,对损耗均衡算法进行优化,综合贪心算法的高效性和随机算法的平衡性改进垃圾回收策略,改善Yaffs磨损均衡性差的缺陷,延长NandFlash使用寿命。
[1]余柏山.Linux系统管理与网络管理[M].北京:清华大学出版社,2010.
[2]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.
[3]俞辉,李永,刘凯,等.ARM嵌入式Linux系统设计与开发[M].北京:机械工业出版社,2010.
[4]Cao L,Shao S.A fast Mounting Method for NAND Flash File System.Computer Research and Development(ICCRD)[C]//2011 3rd International Conference,2011.
[5]胡 永.嵌入式设备中基于NAND Flash的文件系统设计和优化[D].北京:北京交通大学,2013.
[6]Chan S P,Tae H H.Fast Mounting Method for NAND Flash Memory,Advanced Communication Technology(ICACT)[C]//The 12th International Conference,2011.
Construction and Optimization of Yaffs File System in Embedded Linux
WANG Zu-min,ZHANG Hong-mei
(Institute of Information Engineering,Dalian University,Dalian 116622,China)
To important role of file system in embedded Linux,introduces how to use busybox constructs a minimal Yaffs log file system,configuration and optimization of the file system's physical layout and subdirectories at all levels,making the file system under the condition of satisfying development function maximum decrease of memory space.Settings the user and group of the file system to improve system security,in order to better apply to embedded development.And for the lack of Yaffs based on NandFlash wear leveling and garbage collection in terms of proposed optimization strategies to extend the life of NandFlash.
file system,embedded system,Linux,Yaffs
TP316
A
1002-0640(2015)03-0146-04
2014-01-05
2014-03-07
汪祖民(1975- ),男,河南信阳人,副教授,博士。研究方向:嵌入式系统技术、物联网技术。