汪祖民,張紅梅
(大連大學(xué)信息工程學(xué)院,遼寧 大連 116622)
嵌入式Linux中Yaffs文件系統(tǒng)的構(gòu)建與優(yōu)化
汪祖民,張紅梅
(大連大學(xué)信息工程學(xué)院,遼寧 大連 116622)
針對(duì)嵌入式Linux開發(fā)中文件系統(tǒng)的重要作用,詳細(xì)介紹了如何利用busybox構(gòu)造一個(gè)最小的Yaffs日志型文件系統(tǒng),并配置、優(yōu)化文件系統(tǒng)的物理布局和各級(jí)子目錄文件,使制作的文件系統(tǒng)在滿足開發(fā)功能的條件下最大限度地減小所占內(nèi)存空間。設(shè)置文件系統(tǒng)用戶和所屬組來提高系統(tǒng)安全性,使該文件系統(tǒng)更好地應(yīng)用于嵌入式開發(fā)。并針對(duì)基于NandFlash的Yaffs在損耗均衡和垃圾回收方面的不足,提出了優(yōu)化策略,延長NandFlash的使用壽命。
文件系統(tǒng),嵌入式,Linux,Yaffs
目前,嵌入式系統(tǒng)已被廣泛應(yīng)用,其軟硬件都需高效設(shè)計(jì),去除冗余,以最小的系統(tǒng)、最低的成本實(shí)現(xiàn)目標(biāo)功能。NandFlash以其容量大、成本低等優(yōu)勢(shì)成為嵌入式領(lǐng)域的主流存儲(chǔ)器[1]。Yaffs是專門為NandFlash設(shè)計(jì)的日志文件系統(tǒng)。通常默認(rèn)的文件系統(tǒng)包括許多功能,其大小有幾百兆,在嵌入式開發(fā)中無法使用如此大的文件系統(tǒng),因此,針對(duì)NandFlash存儲(chǔ)介質(zhì),構(gòu)造一個(gè)精簡高效的嵌入式Linux文件系統(tǒng)成為嵌入式開發(fā)重要的一部分。另外,針對(duì)Yaffs在損耗均衡和垃圾回收機(jī)制上存在的缺陷,現(xiàn)有的典型損耗均衡算法有Cost-Benefit算法、CAT算法等。但一般存在兩大局限:一是不能解決因擦除塊中數(shù)據(jù)頻繁更新造成的部分擦除塊磨損次數(shù)過多的問題,二是不能有效管理長期不更新的靜態(tài)數(shù)據(jù)塊,以至部分擦除次數(shù)過少,不能實(shí)現(xiàn)擦除塊中冷熱數(shù)據(jù)的搬移,降低了NandFlash使用壽命。因此,需要優(yōu)化損耗均衡算法提高NandFlash使用壽命。
文件系統(tǒng)是操作系統(tǒng)中文件存儲(chǔ)的物理空間和數(shù)據(jù)基礎(chǔ),包括文件、存儲(chǔ)和目錄[2]。Yaffs以頁為存儲(chǔ)單位,每頁分為16 bit的OOB區(qū)和512 bit的data區(qū),32頁為一個(gè)擦除塊。Yaffs需要建立物理頁與文件的映射表,把映射表分成若干份組織成節(jié)點(diǎn)數(shù)型的層次索引目錄[3]。NandFlash的擦除次數(shù)一般為10萬~100萬次。因此,優(yōu)化Yaffs均衡損耗算法使每個(gè)塊的擦除次數(shù)接近平均值時(shí),F(xiàn)lash使用壽命才會(huì)達(dá)到最長時(shí)間。
2.1 開發(fā)環(huán)境
硬件平臺(tái)采用PXA270-RP試驗(yàn)箱,宿主機(jī)是利用虛擬機(jī)安裝Red Hat 9.0 Linux,使用交叉編譯。PXA270-RP是英特爾公司生產(chǎn)的32位嵌入式處理器,采用Xscale架構(gòu)。設(shè)計(jì)中使用串口線連接宿主機(jī)和PXA270-RP,用交叉網(wǎng)線將宿主機(jī)與目標(biāo)機(jī)的網(wǎng)口相連,使用JTAG下載線。系統(tǒng)主要硬件組成如圖1所示。
圖1 系統(tǒng)硬件結(jié)構(gòu)
2.2 構(gòu)造文件系統(tǒng)
在嵌入式系統(tǒng)開發(fā)中,一個(gè)最小的文件系統(tǒng)必須包含:init進(jìn)程、配置文件inittab、c庫、設(shè)備文件/dev以及配置文件中所指定的應(yīng)用程序。設(shè)計(jì)中利用busybox和mkyaffs2image工具制作一個(gè)精簡高效的適合嵌入式開發(fā)的文件系統(tǒng)OFS。首先創(chuàng)建根目錄/OFS,在其中建立系統(tǒng)運(yùn)行、啟動(dòng)所必須的目錄:/bin、/dev、/etc、/lib、/proc、/sbin、/usr等。
2.2.1 編譯安裝busybox
busybox是一個(gè)遵循GPL v2協(xié)議的開源項(xiàng)目,為各種小型嵌入式系統(tǒng)提供較完整的工具集[4]。busybox在編寫過程中考慮系統(tǒng)資源有限情況,優(yōu)化文件大小,可根據(jù)開發(fā)需要通過執(zhí)行命令進(jìn)入busybox的配置界面進(jìn)行配置。編譯安裝busybox后自動(dòng)生成文件系統(tǒng)所需的/bin、/sbin、/usr、linuxrc目錄。在此,安裝編譯busybox-1.18.0.tar.bz2壓縮包,執(zhí)行以下命令:
配置完成后,修改busybox-1.18.0下的Makefile文件,將208行和209行修改為:
ARCH?=arm
CROSS_COMPILE?=arm-linux-
最后安裝busybox,在/OFS目錄下執(zhí)行命令:
#make CONFIG_PREFIX=/work/OFS install
成功安裝后就會(huì)在 /OFS目錄下生成 /bin、/sbin、/usr、linuxrc文件目錄及其各級(jí)子文件。
此時(shí),構(gòu)造出Linux文件系統(tǒng)最重要init文件,它是系統(tǒng)所有進(jìn)程的發(fā)起者和控制者,當(dāng)系統(tǒng)啟動(dòng)完成內(nèi)核引導(dǎo)后便會(huì)加載init進(jìn)程進(jìn)行初始化,讀取并解析inittab配置文件,根據(jù)inittab中的內(nèi)容依次啟動(dòng)其他用戶程序。inittab會(huì)指導(dǎo)init調(diào)用一個(gè)重要的系統(tǒng)初始化程序rc.sysinit,完成文件掛載、環(huán)境變量配置等。init程序執(zhí)行流程圖如2所示。
圖2 init進(jìn)程
2.2.2 創(chuàng)建/etc目錄
(1)創(chuàng)建/etc/inittab文件
依據(jù) busybox-1.18.0/examples/inttab文件和已建立的init程序中內(nèi)容,創(chuàng)建inittab文件。inittab文件為初始化表,格式:id:runlevels:action:process,其中,id指終端,即標(biāo)準(zhǔn)輸入、輸出;runlevel指系統(tǒng)啟動(dòng)級(jí)別;action指何時(shí)執(zhí)行;process表示執(zhí)行進(jìn)程。編寫如下代碼:
默認(rèn)的文件系統(tǒng)/etc/init.d中存放眾多服務(wù)器腳本,實(shí)際中只需保留3個(gè)服務(wù)啟動(dòng)腳本:network、iptables、NFS。相應(yīng)的在/etc/sysconfig系統(tǒng)配置文件中,也只設(shè)置了network、iptables、NFS系統(tǒng)配置。在/etc/init.d下,rcS為腳本文件,在里面添加自動(dòng)執(zhí)行命令如下:
(4)創(chuàng)建/etc/fstab文件,完成掛載
設(shè)置/etc/fstab文件內(nèi)容,把臨時(shí)文件/tmp大小設(shè)置為5 M,日志文件的空間為50 K,相應(yīng)地把/etc/mtab內(nèi)容中的/tmp和/var也分別設(shè)置為5 M和50 K,權(quán)限為“rw”,編寫fstab內(nèi)容如下:
2.2.3 構(gòu)造/lib目錄文件
lib目錄中存放共享庫和驅(qū)動(dòng)程序,共享庫用來啟動(dòng)系統(tǒng)、運(yùn)行根文件系統(tǒng)中的可執(zhí)行程序[5]。使用交叉編譯生成的glibc庫中的文件構(gòu)成OFS的/lib目錄。glibc庫中共有8類文件,在嵌入式開發(fā)中只需其中的動(dòng)態(tài)庫和加載器,從原文件系統(tǒng)復(fù)制這兩種文件到/lib目錄下(表1是原lib庫和新建lib庫大小對(duì)比),執(zhí)行以下命令完成/lib創(chuàng)建:
表1 lib庫大小對(duì)比
2.2.4 構(gòu)造/dev目錄
使用busybox中自帶的mdev建立console、null、ttySAC0設(shè)備文件,執(zhí)行以下命令創(chuàng)建設(shè)備文件:
2.2.5 構(gòu)造其他目錄
一個(gè)最小的文件系統(tǒng)除了上述構(gòu)造的文件外,還包括/proc、/mnt、/tmp、/sys、/root等,這些目錄可根據(jù)以后具體開發(fā)寫入相應(yīng)內(nèi)容。在根目錄下執(zhí)行命令“mkdir mnt sys root proc tmp tools”。其中,/tmp是臨時(shí)文件,之前已經(jīng)設(shè)置為5 M,系統(tǒng)運(yùn)行時(shí)可掛載5 M的虛擬內(nèi)存文件系統(tǒng),/tools目錄用來放置開發(fā)過程中用到的文件,用完后可自行刪除,釋放系統(tǒng)空間。
2.3 配置文件系統(tǒng)權(quán)限
由于文件較多,單個(gè)配置麻煩,對(duì)此編寫一個(gè)腳本access,將其放在主目錄/OFS下,方便系統(tǒng)執(zhí)行、管理和修改,開發(fā)完成后可將其自行刪除。根據(jù)開發(fā)需要定義好權(quán)限后寫入腳本access,執(zhí)行以下命令完成配置:
2.4 制作文件系統(tǒng)的映像文件
使用mkyaffs2image工具制作映像文件。將mkyaffs2image.tgz壓縮包拷貝到/work下,解壓縮后生成mkyaffs2image和mkyaffs2image-128 M,編譯安裝后就可以使用mkyaffs2image工具來生成文件系統(tǒng)映像文件。制作完成以后,將映像文件放到tftp目錄或者nfs目錄下將其下載、燒寫入開發(fā)板中。執(zhí)行以下命令完成文件系統(tǒng)的映像文件制作:
至此,完成了一個(gè)最小嵌入式Linux文件系統(tǒng)的構(gòu)建,新構(gòu)造的文件系統(tǒng)僅有19.3 M,大大縮小了所占內(nèi)存空間,只需在具體應(yīng)用開發(fā)時(shí)加入所需應(yīng)用程序即可,總體結(jié)構(gòu)如下頁圖3所示。
圖3 文件系統(tǒng)結(jié)構(gòu)圖
基于NandFlash的Yaffs文件系統(tǒng)存在著兩大局限:損耗均衡和垃圾回收。垃圾回收的目的是獲取可用的存儲(chǔ)塊,它實(shí)現(xiàn)的代價(jià)是很高的,需要進(jìn)行多次擦除與讀寫操作[5]。因此,在設(shè)計(jì)損耗均衡算法的同時(shí)必須考慮垃圾回收過程對(duì)系統(tǒng)造成的影響,這兩者之間是不可分隔的。
3.1 YAFFS均衡損耗算法的優(yōu)化
針對(duì)目前Yaffs損耗均衡性較差的情況,在分析了現(xiàn)有策略的基礎(chǔ)上,提出了一種基于邏輯塊與物理塊優(yōu)化區(qū)分策略。將邏輯塊區(qū)分為冷、熱邏輯塊,寫入頻率高的為熱邏輯塊,寫入頻率低的為冷邏輯塊,使用多維哈希表來存儲(chǔ)邏輯塊操作次數(shù),并設(shè)定閾值t和T界定冷熱邏輯塊,t和T可根據(jù)實(shí)際情況調(diào)整。物理塊分為低齡區(qū)、高齡區(qū),即擦除次數(shù)少的為低齡物理塊,擦除次數(shù)多的為高齡物理塊,為了減小低齡與高齡物理塊之間的差值,在這里引入“超齡區(qū)”。當(dāng)觸發(fā)損耗均衡條件時(shí),通過空閑塊分配策略把熱邏輯塊映射到低齡物理塊,冷邏輯塊映射到高齡物理塊,而超齡區(qū)凍結(jié)。但是為了避免可用物理塊減少,不能一直凍結(jié)超齡物理塊,因此,采用動(dòng)態(tài)凍結(jié),即設(shè)定一個(gè)高齡與低齡物理塊的差值a,當(dāng)超齡塊達(dá)到閾值A(chǔ)(A為物理塊年齡最小值與a的和)時(shí)凍結(jié)超齡區(qū),每當(dāng)系統(tǒng)進(jìn)行一次數(shù)據(jù)遷移后,清空超齡區(qū)數(shù)據(jù)塊,使閾值A(chǔ)可以根據(jù)系統(tǒng)的具體情況而動(dòng)態(tài)變化。均衡損耗算法的核心是空閑塊分配策略,該算法中使用雙向鏈表的循環(huán)隊(duì)列來管理空閑塊的分配。優(yōu)化后算法基本流程如圖4所示。
圖4 算法基本流程圖
3.2 垃圾回收
垃圾回收目的是回收無效的臟塊并處理壞塊,操作對(duì)象主要是臟塊和無效塊,對(duì)于無效塊可直接擦除,而對(duì)于臟塊的操作比較復(fù)雜,首先需要從臟塊中取出有效數(shù)據(jù)頁,將其寫入其他塊中,然后才能擦除[6]。這里,用臟度來表示臟塊中臟頁和有效頁的比例,臟頁越多臟度就越大。
從垃圾回收的目的方面考慮應(yīng)首選最臟的塊進(jìn)行擦除,而從損耗均衡方面考慮應(yīng)選擇低齡物理塊進(jìn)行擦除,因此,如何選擇合適的塊進(jìn)行垃圾回收是損耗均衡算法的關(guān)鍵。該算法中采用貪心算法和隨機(jī)算法相結(jié)合的方式進(jìn)行垃圾回收,以期達(dá)到最佳效果。首先,設(shè)定一個(gè)閾值Na,當(dāng)空閑塊小于該閾值Na時(shí),采用貪心算法,將臟塊按臟度從大到小排列后,每次都選取最臟的塊進(jìn)行回收,并記錄每塊的擦除次數(shù)n。當(dāng)空閑塊數(shù)量超過閾值Na后,就可以隨機(jī)地回收臟塊,并記錄每個(gè)物理塊擦除次數(shù)n。并設(shè)定閾值Nc表示一個(gè)塊被擦除的次數(shù),當(dāng)一個(gè)塊記錄的擦除次數(shù)n達(dá)到Nc,就將該塊上的數(shù)據(jù)與擦除次數(shù)最小的塊進(jìn)行交換,避免頻繁擦除一個(gè)物理塊縮短N(yùn)andFlash的壽命。改進(jìn)后垃圾回收策略的詳細(xì)步驟如流程圖5所示。
圖5 Yaffs垃圾回收算法優(yōu)化流程圖
Yaffs損耗均衡算法經(jīng)過優(yōu)化后改善了各物理塊之間擦除次數(shù)的差值,使每個(gè)物理塊擦出次數(shù)更加接近平均數(shù),將優(yōu)化后算法與原算法擦除次數(shù)標(biāo)準(zhǔn)差與內(nèi)存耗費(fèi)進(jìn)行對(duì)比如表2所示。
表2 擦出次數(shù)與耗費(fèi)內(nèi)存對(duì)比
基于目前流行的NandFlash存儲(chǔ)器構(gòu)建Yaffs日志型最小文件系統(tǒng)OFS,其大小僅有19.3 M。給出了利用busybox和mkyaffs2image工具制作文件系統(tǒng)的一般方法,對(duì)于大多數(shù)嵌入式開發(fā)中文件系統(tǒng)的制作具有一定的參考價(jià)值。另外,針對(duì)基于NandFlash存儲(chǔ)器上Yaffs磨損均衡性差的缺陷,對(duì)損耗均衡算法進(jìn)行優(yōu)化,綜合貪心算法的高效性和隨機(jī)算法的平衡性改進(jìn)垃圾回收策略,改善Yaffs磨損均衡性差的缺陷,延長NandFlash使用壽命。
[1]余柏山.Linux系統(tǒng)管理與網(wǎng)絡(luò)管理[M].北京:清華大學(xué)出版社,2010.
[2]韋東山.嵌入式Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2008.
[3]俞輝,李永,劉凱,等.ARM嵌入式Linux系統(tǒng)設(shè)計(jì)與開發(fā)[M].北京:機(jī)械工業(yè)出版社,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]胡 永.嵌入式設(shè)備中基于NAND Flash的文件系統(tǒng)設(shè)計(jì)和優(yōu)化[D].北京:北京交通大學(xué),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- ),男,河南信陽人,副教授,博士。研究方向:嵌入式系統(tǒng)技術(shù)、物聯(lián)網(wǎng)技術(shù)。