歡迎您光臨本站 登入註冊首頁

嵌入式Linux文件系統的構建

admin @ 2014-03-25 , reply:0

概述

   嵌入式產品已經滲透到人們生活的方方面面,特別是在數字信息技術和網路技術高速發展的今天,手持信息產品正拓展著一片越來越大的市場,PDA、手機、掌上電腦、信息家電等各式……

    嵌入式產品已經滲透到人們生活的方方面面,特別是在數字信息技術和網路技術高速發展的今天,手持信息產品正拓展著一片越來越大的市場,PDA、手機、掌上電腦、信息家電等各式手持產品已擁有了龐大的用戶群。手持信息產品所運用的最關鍵的核心技術就是嵌入式操作系統。人們對嵌入式產品的需求也不再僅僅是功能單一的電子詞典類產品,嵌入式操作系統逐步成為嵌入式產品的核心。而其中,Linux以其開源的內核和免費的應用程序、能夠自由地移植和開發的優勢,更迎合嵌入式市場。嵌入式Linux的開發大致可分為三個層次:引導裝載內核、構造文件系統和圖形用戶界面。作為操作系統重要組成部分的文件系統,決定了操作系統本身的信息和用戶的數據在存儲設備上的組織形式。對嵌入式文件系統的研究、設計和開發也逐漸成為嵌入式系 統研究領域的一個方向。

嵌入式Linux 文件系統
    文件系統是指在一個物理設備上的任何文件組織和目錄,它構成了Linux系統上所有數據的基礎,Linux程序、庫、系統文件和用戶 文件都駐留其中,因此,它是系統中龐大複雜且又是最為基本和重要的資源。值得提出的是,Linux系統中的文件不僅包括普通的 文件和目錄,每個和設備相關的實際實體也都被映射為一個文件,例如磁碟、印表機、終端等等。這樣的設備文件又稱為特殊文件 。所以,Linux下的文件是操作系統服務和設備的簡單而又統一的介面,從某種意義上可以說,Linux里的一切事物都是文件。
    在Linux中,文件系統的結構是基於樹狀的,根在頂部,各個目錄和文件從樹根向下分支。目錄樹的最頂端被稱為根目錄(/)。在後面介紹的所構造文件系統結構圖(圖1)即顯示了樹狀的文件系統。Linux操作系統由一些目錄和許多文件組成,例如,圖中的/bi n目錄包含二進位文件的可執行程序,/sbin目錄用於存儲管理系統的二進位文件,/etc目錄包含絕大部分的Linux系統配置文件 ,/lib目錄存儲程序運行時使用的共享庫,/dev目錄包含稱為設備文件的特殊文件,/proc目錄實際上是一個虛擬文件系統,/tmp目錄用於存儲程序運行時生成的臨時文件,/home目錄是用戶起始目錄的基礎目錄,/var目錄保存要隨時改變大小的文件,/usr目錄及其子目錄對Linux系統的操作非常重要,它保存著系統上的一些最重要的程序以及包含你安裝的大型軟體包。
    由於Linux是一個多任務、多用戶的操作系統,因此它裡面的文件還都被賦予了一定的許可權,許可權決定誰能讀、寫或執行一個文件,以及這個文件的類型和如何執行。例如下面的文件列表:
-rw-r-r-- 1 root root 1756 Sep 9 2005 inittab
    其表示:這個名為inittab的文件是普通文件,所有者有讀寫的許可權,所在組和其他人都只有讀的許可權,它的連接數為1,所有者及 文件所屬的組都是root,文件中位元組數為1756,文件創建日期是2005年9月9日。我們可以通過對文件屬性的設置,來滿足文件在不同用戶組、不同用戶操作下的不同狀態。
    由於嵌入式設備的一些特殊性,使得嵌入式文件系統除了滿足一般文件系統的基本要求外,還有一些自身的特性:

  1. 文件系統面對的存儲介質特殊;
  2. 文件系統有快速恢復的特殊要求;
  3. 物理文件系統的多樣性和動態可裝配性;
  4. 需要文件系統具有跨操作平台的安全性;
  5. 文件系統要能滿足整個系統的實時性要求。

    嵌入式文件系統有安全性和均衡負載這樣的要求,而日誌型文件系統可以很好地解決安全性的問題。經過幾年來的發展。日誌型的嵌入式文件系統已成為嵌入式文件系統的主流。1999年。Axis
Communications AB發布了JFFS(JournalingFlash File System)的 第一個版本。這是一個專門為嵌入式系統的Flash設備而設計的文件系統,同時它也是一個日誌型的文件系統。JFFS2是JFFS的第二 個版本,於2001年發布,並得到了Red Hat的支持,成為Red Hat嵌入式操作系統eCos的文件系統。Flash存儲容量的有限性決定了J FFS是一個小尺寸的文件系統。因而在文件系統的內部設計上採用了許多簡化處理。同時,它們結合了Flash設備的讀寫特性和嵌入式文件系統的防斷電特性,使得JFFS成為適合於嵌入式系統上針對Flash設備的文件系統的理想選擇。

嵌入式Linux 文件系統的設計
實驗主機和目標平台的連接
    實驗主機和目標平台的連接有兩種方法。一種是乙太網連接,這種連接方式可以進行內核文件、根文件系統映像文件的下載。另一 種是串口連接,這樣的連接方式可以供調試之用。對於乙太網連接,作者使用一根普通網線,將實驗主機和目標平台都連接在Hub 上。這樣做既簡單,也不妨礙實驗主機與外部網路的通訊。對於串口連接,用一根串口線連接目標平台的Ful Function UART(FFUA RT)串口和實驗主機的串口。主要是在調試階段使用這種連接方式,在目標平台的標準輸入還未被驅動的情況下。用實驗主機的標準輸入控制目標平台,向目標平台發控制命令。

構建文件系統
    首先建立一個文件系統的工作空間。創建目錄/bome/work,我們所構造的文件系統就在work這個目錄中。建立基本目錄,如:bin,dev,etc,lib,mnt,proc,sbin,tmp,usr,vat,tools具體結構圖見圖1(圖中所顯示的文件都是目錄文件)。其中,tools是便於開發而創建的目錄。因為整個系統要求盡量小,所以應只包含一些必須的二進位程序。而開發過程中需要用到的命令就放在 tools中,將PATH 包含tools即可。/etc目錄下只包含了一些啟動過程的配置文件,/lib目錄下的modules於目錄包含了可動態載入到核心的各種模塊。另外,目錄var下還應創建兩個子目錄log和run,負責記錄系統的日誌和運行狀態。整個文件系統中除了tmp 和var目錄放在SDRAM內以外,其他所有目錄都放在Flash中,因為trap和var中的內容需要經常寫入,所以放在可讀寫的RAM里。
 
插圖1: 構建文件系統的樹狀結構
    當在目標平台實現了一個嵌入式Linux之後,為了很好地管理操作系統和用戶的數據文件,引入了文件系統。物理文件系統是JFFS2 ,考慮到擴充物理文件系統的要求,保留了Linux的VFS層次。考慮到存儲設備擴充的要求,在Linux內核中加入了對MTD設備的支持。根據上面的敘述,可給出整個文件系統的體系結構圖,見圖2所示。
 
插圖2: 文件系統體系結構
    構建文件系統最基本的要求就是系統能夠在此基礎上啟動運行起來,所以,/sbin下的init程序必不可少。init程序是引導過程完成後內核運行的第一個程序,它能啟動全部其他程序。只要init完成運行全部必要的程序,系統就開始建立並開始運行。當程序開始啟動時,init讀取一個配置文件inittab,這個文件位於/etc下,它確定了init在啟動和關機時的工作特性。在我們開發的這個嵌入式系統中,所有的文件內容只需保留與開發要求有關的必須部分。
    這個系統運行單用戶模式啟動:啟動后立即運行rc.sysinit腳本,進行系統初始化動作。rc.sysinit腳本也進行了精簡,只保留了以讀寫的方式重新載入(mount)根文件系統的操作(內核啟動時只以只讀的方式載入了根文件系統),具體rc.sysinit腳本中的內容 如下:
# Remount the root filesystem read-write
# mount -n -o remount.rw / mount -o remount.rw -n/dev/mtdblock2/mount -a
    為了開發過程用戶與系統能進行交互,啟動了/bin/bash這個命令解釋器。用戶在鍵盤上輸入某些命令,bash將讀取輸入加以解析然後執行該程序。/tools中的telnetd和/sbin中的pppd分別是遠程登陸和串口通訊的後台程序,加入它們也是為了方便開發。
    另外,為了盡量精簡內核,程序都以動態鏈接庫文件的方式編譯,即當程序運行到所需庫文件時才動態載入。所以保證庫文件的完整性就顯得相當重要。為確保運行各種程序都能在/lib目錄中找到合適的庫文件,就乾脆對/lib中的庫文件不作任何刪減,而完整的/lib目錄(含子目錄及全部庫文件)也不過2MB 大小。

配置文件系統用戶
    這一步驟的實現,體現了該嵌入式操作系統的一大特色---安全性。為了防止系統中的文件被誤改或被惡意破壞,我們設置組和用戶,讓只有隸屬於特定組的特定用戶才能對特定的程序進行合法操作。/etc目錄中沒有列入管理組的group文件和管理用戶的pass wd文件,所以在設置文件或目錄的所有權時,全部用id號來代替組名和用戶名。用chown命令來改變文件的所有權,如chown 0.0 i nittab(前一個“0”代表屬組,后一個“0”代表用戶),修改後的inittab文件的詳細信息為:-rw-r-r-- 1 0 0 237 Jul 26 l0:30 inittab
    將系統中所有的文件和目錄按照其具體類型和要求,為其設定特定的組和用戶對它的所有權。例如,/etc中的module.conf配置文件的所有權是module組和module用戶。那麼只有組和用戶同為module的程序(比如/lib/modules/中的程序)才有權查看module.c onf文件,其他非root用戶的程序都打不開這個文件。這樣,除了root用戶,其他不具有操作許可權的用戶就不可能對那些特殊文件, 如有關網路、安全等重要信息進行執行和修改。而擁有root用戶許可權的文件只有init和bash兩個。init用於完成系統的初始化過程,並不涉及對其他文件和程序的操作;bash是開發過程中用戶與系統交互的需要,便於對文件系統進行修改,開發完成後的實際系統並不需要bash,可刪除。這樣,各個文件和程序均在自己所屬的組和用戶中運行,不會互相干擾。使得整個系統有條不紊,不會發生程序越權誤操作的現象。保證了操作系統本身的安全性,也讓試圖竊取或破壞數據的攻擊者無機可乘。
    根據需要,在基本文件系統上添加應用程序基本文件系統完成後,再根據開發的實際要求,在上面再構築一些應用和服務。例如,對於所需求的網路功能,我們在/bin 中加入netstat、ping,在/sbin中加入ifconfig、route、xinetd等網路程序:為了將一些服務以模塊的方式載入,以緩解內核的負擔 ,我們在/sbin中加入了insmod、lsmod、modprobe、depmod、rmmod等有關操作模塊的命令。還有,為了搭建開發過程的交叉編譯的環境,需要用到串口通訊,所以在/sbin中加入pppd的命令,在/etc中加入PPP目錄及其配置文件等等。
    到此,一個滿足系統需求的嵌入式Linux文件系統就基本構造完成。為了系統能在特定的嵌入式硬體設備上運行,系統中所有的二進位文件都必須是經過特定的嵌入式開發編譯工具編譯,將編譯好的文件系統燒至嵌入式系統的開發板中,調通串口,就可以進行調試和進一步的開發了。

嵌入式Linux 文件系統的進一步開發
    按照上一部份給出的文件系統體系結構,文件系統的實現主要在VFS層、物理文件系統層和MTD層。在Linux 2.4以後的版本中,JFFS2已經作為一種標準的文件系統被支持,所以使得Linux的VFS支持JFFS2並不是一件難事,在源代碼中也不用做修改。下面給出在MTD層,Linux的源代碼做的一些修改。另外,敘述JFFS2物理文件系統映像文件的生成。

支持MTD設備
    對MTD設備的支持要經過配置內核、編寫設備驅動程序和建立MTD設備這幾個步驟。
    第一步,配置內核參數,選中Memory Technology Devices(MTD)support,下面的子項中至少要選擇MTD partitioning support、Direct char device access to MTD devices和Caching block device access to MTD devices這三項。其他的有關NFTL,CFI的支持根據需要選取。
    第二步,編寫針對目標平台Flash設備的MTD驅動程序,主要實現創建MTD分區和刪除MTD分區的函數。創建分區的流程見圖3所示。刪除分區的函數比較簡單,如果存在MTD分區,就調用del_mtd_partitions(struct mtd info*)刪除分區,並且刪除為MTD設備創建的映射表。
 
插圖3: 創建MTD分區
    第三步,將修改過的MTD驅動文件作為內核文件的補丁,並給內核文件打上這個補丁,最後,編譯生成內核文件。
    第四步,使用mknod命令建立MTD設備。

JFFS2映象文件的生成
    首先,需要內核支持JFFS2,因此在配置內核參數時,選中File Systems下的Journaling Flash File System v2(JFFS2)support。假設從一個RAMDISK的文件系統中得到建立根文件系統所需的全部文件和系統所有的設備等信息。製作步驟如下:
    第一步,在開發主機上將這個Ramdisk以loop的方式掛接到某個臨時目錄下。在這個目錄下就出現了一些文件系統的基本文件和信息,可以做增刪以達到定製的目的。
    第二步,修改/etc/rc.d/rc.sysinit文件,使得文件系統在remount時不會出現只讀的情況。具體修改如下:
Mount -n -o remount.rw//加入這一行
Mount -n -t proc/proc rw//在這一行中加入-n
    第三步,使用mkfs.jffs2生成JFFFS2的映像文件。具體的命令格式如下:
Mkfs.jffs2 -d<文件系統所在目錄>-o<映像文件名>
    這時,就得到了一個JFFS2的映像文件,將它下載到目標平台。最後就是如何掛載它,使它成為一個根文件系統了。在調試階段和最終系統成型之後,掛載的方式有所不同,而具體的掛載方法在前面已敘述,這裡不再重複說明。

結語
    我們構造了一個嵌入式版本的Linux文件系統,它使得內核在系統盡量精簡的情況下能夠運行起來,並滿足產品和系統各方面的要求。其中,為文件系統配置用戶和屬組以達到一定的安全性更是系統的一大特色。另外,在這個嵌入式文件系統中,引入了VFS的支持,雖然犧牲了一些空間,但是大大方便了今後各種物理文件系統的動態載入。Linux的文件系統事實上非常的龐大,構造一個嵌入式的Linux文件系統是一個很複雜的過程。如何讓文件系統在保證安全的前提下精簡得更緊湊、運行得更有效率,是需要深入探索的一個課題。


[admin via 研發互助社區 ] 嵌入式Linux文件系統的構建已經有2737次圍觀

http://cocdig.com/docs/show-post-42118.html