嵌入式Linux文件系統的構建

插圖2: 文件系統體系結構
構建文件系統最基本的要求就是系統能夠在此基礎上啟動(dòng)運行起來(lái),所以,/sbin下的init程序必不可少。init程序是引導過(guò)程完成后內核運行的第一個(gè)程序,它能啟動(dòng)全部其他程序。只要init完成運行全部必要的程序,系統就開(kāi)始建立并開(kāi)始運行。當程序開(kāi)始啟動(dòng)時(shí),init讀取一個(gè)配置文件inittab,這個(gè)文件位于/etc下,它確定了init在啟動(dòng)和關(guān)機時(shí)的工作特性。在我們開(kāi)發(fā)的這個(gè)嵌入式系統中,所有的文件內容只需保留與開(kāi)發(fā)要求有關(guān)的必須部分。
這個(gè)系統運行單用戶(hù)模式啟動(dòng):?jiǎn)?dòng)后立即運行rc.sysinit腳本,進(jìn)行系統初始化動(dòng)作。rc.sysinit腳本也進(jìn)行了精簡(jiǎn),只保留了以讀寫(xiě)的方式重新加載(mount)根文件系統的操作(內核啟動(dòng)時(shí)只以只讀的方式加載了根文件系統),具體rc.sysinit腳本中的內容 如下:
# Remount the root filesystem read-write
# mount -n -o remount.rw / mount -o remount.rw -n/dev/mtdblock2/mount -a
為了開(kāi)發(fā)過(guò)程用戶(hù)與系統能進(jìn)行交互,啟動(dòng)了/bin/bash這個(gè)命令解釋器。用戶(hù)在鍵盤(pán)上輸入某些命令,bash將讀取輸入加以解析然后執行該程序。/tools中的telnetd和/sbin中的pppd分別是遠程登陸和串口通訊的后臺程序,加入它們也是為了方便開(kāi)發(fā)。
另外,為了盡量精簡(jiǎn)內核,程序都以動(dòng)態(tài)鏈接庫文件的方式編譯,即當程序運行到所需庫文件時(shí)才動(dòng)態(tài)加載。所以保證庫文件的完整性就顯得相當重要。為確保運行各種程序都能在/lib目錄中找到合適的庫文件,就干脆對/lib中的庫文件不作任何刪減,而完整的/lib目錄(含子目錄及全部庫文件)也不過(guò)2MB 大小。
● 配置文件系統用戶(hù)
這一步驟的實(shí)現,體現了該嵌入式操作系統的一大特色---安全性。為了防止系統中的文件被誤改或被惡意破壞,我們設置組和用戶(hù),讓只有隸屬于特定組的特定用戶(hù)才能對特定的程序進(jìn)行合法操作。/etc目錄中沒(méi)有列入管理組的group文件和管理用戶(hù)的pass wd文件,所以在設置文件或目錄的所有權時(shí),全部用id號來(lái)代替組名和用戶(hù)名。用chown命令來(lái)改變文件的所有權,如chown 0.0 i nittab(前一個(gè)“0”代表屬組,后一個(gè)“0”代表用戶(hù)),修改后的inittab文件的詳細信息為:-rw-r-r-- 1 0 0 237 Jul 26 l0:30 inittab
將系統中所有的文件和目錄按照其具體類(lèi)型和要求,為其設定特定的組和用戶(hù)對它的所有權。例如,/etc中的module.conf配置文件的所有權是module組和module用戶(hù)。那么只有組和用戶(hù)同為module的程序(比如/lib/modules/中的程序)才有權查看module.c onf文件,其他非root用戶(hù)的程序都打不開(kāi)這個(gè)文件。這樣,除了root用戶(hù),其他不具有操作權限的用戶(hù)就不可能對那些特殊文件, 如有關(guān)網(wǎng)絡(luò )、安全等重要信息進(jìn)行執行和修改。而擁有root用戶(hù)權限的文件只有init和bash兩個(gè)。init用于完成系統的初始化過(guò)程,并不涉及對其他文件和程序的操作;bash是開(kāi)發(fā)過(guò)程中用戶(hù)與系統交互的需要,便于對文件系統進(jìn)行修改,開(kāi)發(fā)完成后的實(shí)際系統并不需要bash,可刪除。這樣,各個(gè)文件和程序均在自己所屬的組和用戶(hù)中運行,不會(huì )互相干擾。使得整個(gè)系統有條不紊,不會(huì )發(fā)生程序越權誤操作的現象。保證了操作系統本身的安全性,也讓試圖竊取或破壞數據的攻擊者無(wú)機可乘。
根據需要,在基本文件系統上添加應用程序基本文件系統完成后,再根據開(kāi)發(fā)的實(shí)際要求,在上面再構筑一些應用和服務(wù)。例如,對于所需求的網(wǎng)絡(luò )功能,我們在/bin 中加入netstat、ping,在/sbin中加入ifconfig、route、xinetd等網(wǎng)絡(luò )程序:為了將一些服務(wù)以模塊的方式加載,以緩解內核的負擔 ,我們在/sbin中加入了insmod、lsmod、modprobe、depmod、rmmod等有關(guān)操作模塊的命令。還有,為了搭建開(kāi)發(fā)過(guò)程的交叉編譯的環(huán)境,需要用到串口通訊,所以在/sbin中加入pppd的命令,在/etc中加入PPP目錄及其配置文件等等。
到此,一個(gè)滿(mǎn)足系統需求的嵌入式Linux文件系統就基本構造完成。為了系統能在特定的嵌入式硬件設備上運行,系統中所有的二進(jìn)制文件都必須是經(jīng)過(guò)特定的嵌入式開(kāi)發(fā)編譯工具編譯,將編譯好的文件系統燒至嵌入式系統的開(kāi)發(fā)板中,調通串口,就可以進(jìn)行調試和進(jìn)一步的開(kāi)發(fā)了。
嵌入式Linux 文件系統的進(jìn)一步開(kāi)發(fā)
按照上一部份給出的文件系統體系結構,文件系統的實(shí)現主要在VFS層、物理文件系統層和MTD層。在Linux 2.4以后的版本中,JFFS2已經(jīng)作為一種標準的文件系統被支持,所以使得Linux的VFS支持JFFS2并不是一件難事,在源代碼中也不用做修改。下面給出在MTD層,Linux的源代碼做的一些修改。另外,敘述JFFS2物理文件系統映像文件的生成。
支持MTD設備
對MTD設備的支持要經(jīng)過(guò)配置內核、編寫(xiě)設備驅動(dòng)程序和建立MTD設備這幾個(gè)步驟。
第一步,配置內核參數,選中Memory Technology Devices(MTD)support,下面的子項中至少要選擇MTD partitioning support、Direct char device access to MTD devices和Caching block device access to MTD devices這三項。其他的有關(guān)NFTL,CFI的支持根據需要選取。
第二步,編寫(xiě)針對目標平臺Flash設備的MTD驅動(dòng)程序,主要實(shí)現創(chuàng )建MTD分區和刪除MTD分區的函數。創(chuàng )建分區的流程見(jiàn)圖3所示。刪除分區的函數比較簡(jiǎn)單,如果存在MTD分區,就調用del_mtd_partitions(struct mtd info*)刪除分區,并且刪除為MTD設備創(chuàng )建的映射表。

插圖3: 創(chuàng )建MTD分區
第三步,將修改過(guò)的MTD驅動(dòng)文件作為內核文件的補丁,并給內核文件打上這個(gè)補丁,最后,編譯生成內核文件。
第四步,使用mknod命令建立MTD設備。
JFFS2映象文件的生成
首先,需要內核支持JFFS2,因此在配置內核參數時(shí),選中File Systems下的Journaling Flash File System v2(JFFS2)support。假設從一個(gè)RAMDISK的文件系統中得到建立根文件系統所需的全部文件和系統所有的設備等信息。制作步驟如下:
評論