當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式Linux 的Cramfs 根文件系統(tǒng)配置的解決方案

 1 引言

  隨著電子產(chǎn)業(yè)的不斷發(fā)展,基于 ARM 技術(shù)的系統(tǒng)設(shè)計(jì)和開發(fā)平臺越來越多地在控制 類、消費(fèi)類、通信類等電子產(chǎn)品中廣泛應(yīng)用。從軟件角度上看,構(gòu)建基于ARM 技術(shù)的linux 系統(tǒng)要涉及到引導(dǎo)加載程序、Linux 內(nèi)核、文件系統(tǒng)、用戶應(yīng)用程序幾部分的設(shè)計(jì)。 文件系統(tǒng)是操作系統(tǒng)中用來管理用戶文件的內(nèi)核軟件層。文件可能存在于磁盤、網(wǎng)絡(luò)或 者是一些虛擬的文件。文件系統(tǒng)包括根文件系統(tǒng)和建立于內(nèi)存設(shè)備之上文件系統(tǒng)。根文件系 統(tǒng)是linux 系統(tǒng)的核心部分,包含系統(tǒng)使用的軟件和庫,以及所有用來為用戶提供支持架構(gòu) 和用戶使用的應(yīng)用軟件,并作為存儲數(shù)據(jù)讀寫結(jié)果的區(qū)域。由于嵌入式設(shè)備中Flash 資源很 緊張,如何有效地使用有限的存儲空間是嵌入式開發(fā)者必須考慮的,合適的文件系統(tǒng)格式是 解決這一問題的關(guān)鍵所在。本文討論了只讀型壓縮Cramfs 根文件系統(tǒng)的特點(diǎn),并詳細(xì)的說 明了NAND FLASH 上建立一個(gè)可讀可寫型嵌嵌入式Linux 的Cramfs 根文件系統(tǒng)的新方法。

  2 Linux 根文件系統(tǒng)概述

  2.1 Linux根文件系統(tǒng)

  根文件系統(tǒng)不同于普通文件系統(tǒng),它是在內(nèi)核啟動(dòng)時(shí)掛載(mount)的第一個(gè)文件系統(tǒng), 內(nèi)核代碼映像文件保存在根文件系統(tǒng)中,而系統(tǒng)引導(dǎo)啟動(dòng)程序會在根文件系統(tǒng)掛載之后把一 些基本的初始化腳本和服務(wù)程序等加載到內(nèi)存中。

  Linux 根文件系統(tǒng)是樹型結(jié)構(gòu)組織[1,3],它包含了內(nèi)核和系統(tǒng)管理所需要的各種文檔和程序等。一般來說,根目錄“/”下頂層目錄都有一些比較固定命名和用途,下面列出一

  個(gè)Linux 根文件系統(tǒng)中的比較常見的目錄結(jié)構(gòu)。

  /bin:存放二進(jìn)制可執(zhí)行命令的目錄。

  /dev:存放設(shè)備文件和目錄。

  /etc:存放系統(tǒng)管理和配置文件和目錄。

  /home:用戶主目錄,比如用戶user 的主目錄就是/home/user,可以用~user 來表示。

  /lib:存放動(dòng)態(tài)鏈接共享庫的目錄。

  /sbin:存放系統(tǒng)管理員使用的管理程序的目錄。

  /tmp:公用的臨時(shí)文件存儲點(diǎn)。

  /root:系統(tǒng)管理員的主目錄。

  /mnt:用以臨時(shí)掛載其他的文件系統(tǒng)。

  /proc:虛擬文件系統(tǒng),可直接訪問這個(gè)目錄來獲取系統(tǒng)信息。

  /var:某些大文件溢出區(qū)。

  /usr:存放應(yīng)用程序和文件。

  對于嵌入式 Linux 系統(tǒng)的根文件系統(tǒng)來說,由于受系統(tǒng)資源的限制,一般沒有上述 那么復(fù)雜,僅保留一些常用的目錄即可。如/bin、/dev、/etc、/lib、/proc、/var、/tmp、/usr、 /mnt 等[2]。 由于嵌入式系統(tǒng)的設(shè)計(jì)冗余度小、系統(tǒng)緊湊,通常存儲容量有限,因此,必須選擇 一個(gè)合適的根文件系統(tǒng)以使系統(tǒng)運(yùn)行最佳。目前,嵌入式Linux 根文件系統(tǒng)主要的根文件系 統(tǒng)類型有:Romfs, JFFS2, RAMDISK, YAFFS/YAFFS2, Cramfs, Squashfs 等[1]。本文主要對 Cramfs 根文件系統(tǒng)進(jìn)行討論。

  2.2 Cramfs根文件系統(tǒng)及其在實(shí)際應(yīng)用中存在的問題

  Cramfs 是Linux 的創(chuàng)始人 Linus Torvalds 參與開發(fā)的一種只讀的壓縮文件系統(tǒng),它基于 MTD(Memory Technology Device,存儲技術(shù)設(shè)備)驅(qū)動(dòng)程序。在cramfs 文件系統(tǒng)中,每一頁 (4KB)被單獨(dú)壓縮,可以隨機(jī)頁訪問,其壓縮比高達(dá)2:1,為嵌入式系統(tǒng)節(jié)省大量的FLASH 存儲 空間,使系統(tǒng)可通過更低容量的FLASH 存儲相同的文件,從而降低系統(tǒng)成本。

  Cramfs 并不 需要一次性地將文件系統(tǒng)中的所有內(nèi)容都解壓到內(nèi)存中,而只是在系統(tǒng)需要訪問某個(gè)位置的 數(shù)據(jù)時(shí),立即計(jì)算出該數(shù)據(jù)在Cramfs 中的位置,將其實(shí)時(shí)地解壓縮到內(nèi)存中,然后通過對 內(nèi)存的訪問來獲取文件系統(tǒng)中需要讀取的數(shù)據(jù)。Cramfs 中的解壓縮以及解壓縮之后內(nèi)存中 的數(shù)據(jù)存放位置都是由Cramfs 文件系統(tǒng)本身進(jìn)行維護(hù)的,用戶并不需要了解具體實(shí)現(xiàn)過程, 因此這種方式增強(qiáng)了透明度,對開發(fā)人員來說,既方便又節(jié)省了存儲空間。

  由于 Cramfs 是只讀型文件系統(tǒng),而大多嵌入式應(yīng)用程序需要在臨時(shí)目錄/tmp 進(jìn)行創(chuàng)建 臨時(shí)文件等寫操作,如不對Cramfs 進(jìn)行配置,則應(yīng)用程序?qū)⒉荒苷_\(yùn)行,導(dǎo)致系統(tǒng)崩潰。 目前,解決些問題的方法是復(fù)合文件系統(tǒng)法,即使用YAFFS/YAFFS2 等可寫型文件系統(tǒng)與 Cramfs 復(fù)合而成的文件系統(tǒng)作為嵌入式系統(tǒng)的根文件系統(tǒng),使Cramfs 根文件系統(tǒng)啟動(dòng)時(shí)掛 載YAFFS/YAFFS2 文件系統(tǒng),同時(shí)將應(yīng)用程序存放在YAFFS/YAFFS2 文件系統(tǒng)中。這種方 法解決了應(yīng)用程序?qū)Ω募到y(tǒng)的寫操作問題,但由于在通常的根文件系統(tǒng)之外還增加了一 個(gè)額外的可寫型文件系統(tǒng),必然會增大整個(gè)根文件系統(tǒng)所占的存儲空間,造成嵌入式系統(tǒng)存 儲資源緊張。本文在實(shí)踐的基礎(chǔ)上,通過對Linux Cramfs 根文件系統(tǒng)的研究,發(fā)現(xiàn)了一種通 過修改根文件系統(tǒng)啟動(dòng)腳本和配置文件來實(shí)現(xiàn)根文件系統(tǒng)的可讀、可寫性的新方法,它不需 要新增額外的文件系統(tǒng)來支持應(yīng)用程序的讀、寫要求,而是利用根文件系統(tǒng)本身的特性來構(gòu) 造一個(gè)局部可寫的根文件系統(tǒng)。

  3 嵌入式Linux 根文件系統(tǒng)的配置

  3.1 Cramfs根文件系統(tǒng)配置文件的分析

  Cramfs 根文件系統(tǒng)中的配置文件存放在/etc 目錄下,有22 個(gè)文件及文件夾,可分為以 下幾類:

  引導(dǎo)和登錄/注銷類,包括/etc/issue、/etc/issue.net、/etc/rc.d/rc、/etc/rc.d/rc.local、 /etc/rc.d/rc.sysinit、/etc/rc.d/rc/rcX.d 等文件,它們主要記錄系統(tǒng)的啟動(dòng)信息及運(yùn)行級別等。

  文件系統(tǒng)類,包括/etc/mtab、/etc/fstab、/etc/mtools.conf 文件等,它們記錄著系統(tǒng)文 件系統(tǒng)的安裝、卸載信息,系統(tǒng)啟動(dòng)時(shí)可以被安裝的文件系統(tǒng)以及在這些文件系統(tǒng)上所定 義的操作。

  系統(tǒng)管理類,包括/etc/group、/etc/nologin、/etc/passwd、/etc/rpmrc、/etc/securetty、 /etc/usertty、/etc/shadow、/etc/shells、/etc/motd 等文件,它們記錄著系統(tǒng)用戶和用戶組的登 錄信息、加密后的用戶帳號密碼信息、用戶組的權(quán)限信息等。

  網(wǎng)絡(luò)類,包括/etc/gated.conf、/etc/networks、/etc/protocols、/etc/gateway、/etc/services、 /etc/inetd.conf、/etc/sysconfig/netword、/etc/recolv.conf、/etc/rpc、/etc/exports 等文件,它們 記錄著系統(tǒng)對網(wǎng)絡(luò)接口的配置信息、網(wǎng)絡(luò)服務(wù)程序、網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)文件系統(tǒng)配置等信息。

  系統(tǒng)命令類,包括/etc/lilo.conf、/etc/logrotate.conf、/et/identd.conf、/etc/ld.so.conf、 /etc/inittab、/etc/termcp 等文件,這些文件記錄著要獨(dú)占地控制系統(tǒng)的系統(tǒng)命令及動(dòng)態(tài)鏈接 程序配置等信息等。[!--empirenews.page--]

  系統(tǒng)初始化腳本類,包括/etc/init.d 和/etc/rc/init.d 等文件,它們包含一些系統(tǒng)服務(wù)類 程序及系統(tǒng)啟動(dòng)腳本。

  根文件系統(tǒng)對掛載文件系統(tǒng)的配置主要由兩個(gè)文件決定,即fstab、init.d/rcS[3],fstab 描述了當(dāng)前系統(tǒng)中已被定義好的可以被系統(tǒng)掛載的文件系統(tǒng),init.d/rcS 文件描述了系統(tǒng)啟 動(dòng)時(shí)將啟動(dòng)的命令、服務(wù)程序及將要掛載的的文件系統(tǒng)。

  由此可見,要使 Cramfs 根文件系統(tǒng)能滿足應(yīng)用程序的讀寫要求,必須在系統(tǒng)啟動(dòng) 時(shí)為應(yīng)用程序掛載一個(gè)可寫型的文件系統(tǒng),即配置/etc/fstab 及/etc/init.d/rcS 文件來掛載可寫 型的文件系統(tǒng)。

  3.2 為Crmafs文件系統(tǒng)添加應(yīng)用程序

  要發(fā)布應(yīng)用程序到嵌入式系統(tǒng)中,須將應(yīng)用程序及應(yīng)用程序所需要的共享庫文件一起 添加到根文件系統(tǒng)中。根文件系統(tǒng)可以根據(jù)需要定制,但這樣需要花費(fèi)大量時(shí)間且工作量 大;也可以修改已有的根文件系統(tǒng),這樣可以節(jié)省大量的時(shí)間和精力,且不易出錯(cuò)[4]。

  以下 是以藍(lán)海微芯LJD-2410DVK-I 嵌入式開發(fā)板所提供的root.cramfs 根文件系統(tǒng)為基礎(chǔ)進(jìn)行修 改和配置的,root.cramfs 是只讀型的文件系統(tǒng),為了能向里邊加入用戶應(yīng)用程序,需要將其 重新掛載、壓縮及解壓縮成新的目錄,步驟如下:

  在root.cramfs 的相同目錄下新建立一個(gè)目錄,如myroot。

  在終端中執(zhí)行命令:mount -o loop root.cramfs myroot, tar –cvf myroot.tar myroot。這兩條 命令的功能分別是將已有的root.cramfs 以塊設(shè)備的方式掛載到myroot 并將myroot 壓縮為 myroot.tar。

  為不出現(xiàn)目錄重名,將 myroot.tar 拷貝到另一目錄進(jìn)行解壓:tar –xvf myroot.tar,解壓 出來的文件夾myroot 即是即將作為根文件系統(tǒng)的目錄,它是可讀可寫的。

  將已經(jīng)交叉編譯并調(diào)試過的用戶目標(biāo)程序拷貝到myroot 目錄下的/usr/bin 目錄下,此目 錄為根文件系統(tǒng)中為用戶程序準(zhǔn)備的目錄。同時(shí)將用戶程序所需要用到的關(guān)聯(lián)庫文件拷貝到 myroot 目錄下的/usr/lib 目錄下,用戶程序的關(guān)聯(lián)庫文件可通過ldd 命令查看,ldd 命令格式 如下:

  Ldd [選項(xiàng)] 文件

  選項(xiàng)有-v:打印ldd 的版本號;-d:執(zhí)行符號重部署,并報(bào)告缺少的目標(biāo)對象(只對ELF 格式適用);-r:對目標(biāo)對象和函數(shù)執(zhí)行重新部署,并報(bào)告缺少的目標(biāo)對象和函數(shù)(只對ELF 格式適用);-h:幫助信息。

  執(zhí)行如下命令來查看應(yīng)用程序所關(guān)聯(lián)的庫:

  Ldd –v 程序名

  將交叉編譯工具目錄下的/3.4.1/arm-linux/lib 下的libgcc-s.so.*,libstdc++.so.6 復(fù)制到 myroot 目錄下的/root/lib 目錄下。

  3.3 配置Cramfs根文件系統(tǒng)

  為使Cramfs 能支持應(yīng)用程序的寫操作,需要修改文件系統(tǒng)的配置文件,即/etc 目錄下的 文件。

  (1) 修改/etc/init.d/rcS 文件

  /etc/init.d/rcS 是Linux 的系統(tǒng)初始化腳本,修改步驟如下:

  用 vi 或其它文本工具打開myroot 目錄下的/etc/init.d/rcS 文件;

  在文件中增加:

  /bin/mount –n –t ramfs ramfs /mnt/yaffs(yaffs 是文件系統(tǒng)的一個(gè)目錄);

  /bin/mkdir /mnt/yaffs/Qtopia;

  /bin/mkdir /mnt/yaffs/Qtopia/tmp。

  保存并退出 vi 或文本工具。

  根文件系統(tǒng)的配置如圖 1 所示。
 


 

  圖1 根文件系統(tǒng)的配置[!--empirenews.page--]

  當(dāng)系統(tǒng)啟動(dòng)并執(zhí)行到系統(tǒng)初始化腳本/etc/init.d/rcS 時(shí),mount 命令將/mnt/yaffs 目錄掛載 為ramfs 類型的隨機(jī)存儲文件系統(tǒng),并在此文件系統(tǒng)上建立Qtopia 和Qtopia/tmp 目錄[5], /Qtopia/tmp 目錄即為應(yīng)用程序可能對文件系統(tǒng)進(jìn)行寫操作的臨時(shí)文件目錄,故應(yīng)用程序便可 對/mnt/yaffs 目錄進(jìn)行讀寫操作,保障有讀寫操作要求的應(yīng)用程序的正常執(zhí)行。

  (2) 修改/etc/profile 文件

  用 vi 或其它文本工具打開myroot 目錄下的/etc/profile 文件;

  將 PATH 改為:PATH=/bin: /sbin: /usr/sbin: /用戶程序目錄名

  在文件中新增以下語句:

  LD_LIBRARY_PATH=/lib: /usr/lib: /用戶庫目錄名

  export PATH LD_LIBRARY_PATH

  保存并退出 vi 或文本工具。

  其中,修改環(huán)境變量 PATH 的目的是使系統(tǒng)命令/程序目錄擴(kuò)展到用戶程序目錄,這樣, 當(dāng)執(zhí)行用戶應(yīng)用程序時(shí),系統(tǒng)才能找到相應(yīng)的共享文件等;修改LD_LIBRARY_PATH 的目的是將系統(tǒng)的共享庫路徑擴(kuò)展為包含系統(tǒng)程序和用戶程序庫文件路徑的庫文件路徑,以便在 運(yùn)行用戶程序時(shí)能使系統(tǒng)找到應(yīng)用程序所使用的庫文件。

  4 制做Cramfs 根文件系統(tǒng)

  制做Cramfs 根文件系統(tǒng),即是把上述配置好的myroot 目錄文件夾壓縮成為能夠讓Linux 內(nèi)核支持的Cramfs 格式的映像文件[6]。

  制做 Cramfs 根文件系統(tǒng)需要用到mkcramfs 工具,mkcramfs 工具用來創(chuàng)建Cramfs 文件系統(tǒng),它能把配置好的根文件系統(tǒng)壓縮成Cramfs 格式的根文件系統(tǒng),壓縮比可達(dá)到2:

  1,下面是mkcramfs 命令的格式:

  mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile

  其中參數(shù)含義分別是-h:顯示幫助信息;-e edition:設(shè)置生成的文件系統(tǒng)中的版本 號;-i file:將一個(gè)文件映象插入到文件系統(tǒng)中(只能在Linux2.4.0 以后的內(nèi)核版本中使用); -n name:設(shè)定Cramfs 文件系統(tǒng)的名稱;dirname:指明需要被壓縮的整個(gè)目錄樹;outfile: 最終輸出的文件。

  將mkcramfs 工具拷貝到myroot 相同目錄下,在終端中執(zhí)行:

  mkcramfs myroot myroot.cramfs

  此命令所生成的myroot.cramfs 即為可下載到開發(fā)板上的根文件系統(tǒng)。

  5 結(jié)束語

  通過對嵌入式Linux 根文件系統(tǒng)結(jié)構(gòu)特點(diǎn)的分析,提出了基于Cramfs 根文件系統(tǒng)配置 的新方法,使嵌入式根文件系統(tǒng)具有了可讀、可寫的功能,同時(shí)也減小了根文件系統(tǒng)所占的 存儲空間。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動(dòng)現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動(dòng)力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉