構造嵌入式Linux的文件系統 摘要:文件系統是Linux系統最基本的資源。本文介紹了一種嵌入式Linux文件系統的構造過(guò)程,較為詳細地講解了如何選擇和配置所需的系統文件,以及如何設置文件系統的用戶(hù)和屬組來(lái)使系統達到一定的安全性能。該文件系統已成功應用于一款手持電腦產(chǎn)品中。
關(guān)鍵詞:嵌入式系統;Linux;文件系統
1.引言
在數字信息技術(shù)和網(wǎng)絡(luò )技術(shù)高速發(fā)展的今天,手持信息產(chǎn)品正拓展著(zhù)一片越來(lái)越大的市場(chǎng),PDA、手機、掌上電腦、信息家電等各式手持產(chǎn)品已擁有了龐大的用戶(hù)群。手持信息產(chǎn)品所運用的最關(guān)鍵的核心技術(shù)就是嵌入式操作系統。而其中,Linux以其開(kāi)源的內核和免費的應用程序、能夠自由地移植和開(kāi)發(fā)的優(yōu)勢,更迎合嵌入式市場(chǎng)。
嵌入式Linux的開(kāi)發(fā)大致可分為三個(gè)層次:引導裝載內核、構造文件系統和圖形用戶(hù)界面。本文基于一款手持電腦的實(shí)際開(kāi)發(fā),介紹嵌入式Linux操作系統中文件系統的構造。
2.簡(jiǎn)介文件系統
文件系統是指在一個(gè)物理設備上的任何文件組織和目錄,它構成了Linux系統上所有數據的基礎,Linux程序、庫、系統文件和用戶(hù)文件都駐留其中,因此,它是系統中龐大復雜且又是最為基本和重要的資源。值得提出的是,Linux系統中的文件不僅包括普通的文件和目錄,每個(gè)和設備相關(guān)的實(shí)際實(shí)體也都被映射為一個(gè)文件,例如磁盤(pán)、打印機、終端等等,這樣的設備文件又稱(chēng)為特殊文件。所以,Linux下的文件是操作系統服務(wù)和設備的簡(jiǎn)單而又統一的接口,從某種意義上可以說(shuō),Linux里的一切事物都是文件。
在Linux中,文件系統的結構是基于樹(shù)狀的,根在頂部,各個(gè)目錄和文件從樹(shù)根向下分支,目錄樹(shù)的最頂端被稱(chēng)為根目錄(/)。在后面介紹的所構造文件系統結構圖(圖1)即顯示了樹(shù)狀的文件系統。Linux操作系統由一些目錄和許多文件組成,例如,圖中的/bin目錄包含二進(jìn)制文件的可執行程序,/sbin目錄用于存儲管理系統的二進(jìn)制文件,/etc目錄包含絕大部分的Linux系統配置文件,/lib目錄存儲程序運行時(shí)使用的共享庫,/dev目錄包含稱(chēng)為設備文件的特殊文件,/proc目錄實(shí)際上是一個(gè)虛擬文件系統,/tmp目錄用于存儲程序運行時(shí)生成的臨時(shí)文件,/home目錄是用戶(hù)起始目錄的基礎目錄,/var目錄保存要隨時(shí)改變大小的文件,/usr目錄及其子目錄對 Linux系統的操作非常重要,它保存著(zhù)系統上的一些最重要的程序以及包含你安裝的大型軟件包。
由于Linux是一個(gè)多任務(wù)、多用戶(hù)的操作系統,因此它里面的文件還都被賦予了一定的權限,權限決定誰(shuí)能讀、寫(xiě)或執行一個(gè)文件,以及這個(gè)文件的類(lèi)型和如何執行。例如下面的文件列表:
-rw-r--r-- 1 root root 1756 Sep 4 2002 inittab
就表示:這個(gè)名為inittab的文件是普通文件,所有者有讀寫(xiě)的權限,所在組和其他人都只有讀的權限,它的連接數為1,所有者及文件所屬的組都是root,文件中字節數為1756,文件創(chuàng )建日期是2002年9月4日。我們可以通過(guò)對文件屬性的設置,來(lái)滿(mǎn)足文件在不同用戶(hù)組、不同用戶(hù)操作下的不同狀態(tài)。
這是有關(guān)文件系統的基本知識,下面就結合實(shí)際開(kāi)發(fā)過(guò)程分析文件系統的構造。
3.構造嵌入式Linux的文件系統
3.1 開(kāi)發(fā)環(huán)境及要求
本文所構造的文件系統是基于一款手持電腦的嵌入式操作系統的開(kāi)發(fā)。該款手持電腦的硬件環(huán)境是:Intel的面向PDA設備的PXA262處理器,32MB的SDRAM,32MB的NOR Flash。開(kāi)發(fā)板上只有串口,沒(méi)有網(wǎng)口,開(kāi)發(fā)調試過(guò)程需進(jìn)行串口通訊。系統運行的Linux內核是2.4.19-rmk7-pxa1,使用的嵌入式開(kāi)發(fā)工具是3.2版本的toolchain。運行于這個(gè)環(huán)境之上的文件系統必須要滿(mǎn)足嵌入式的精小的要求,即裝載在NOR Flash之內的文件系統必須精簡(jiǎn)到大小在32MB以?xún)取?div style="height:15px;">
3.2 構造文件系統
1)構造基本目錄
首先建立一個(gè)文件系統的工作空間。創(chuàng )建目錄/home/work,我們所構造的文件系統就在work這個(gè)目錄中。建立基本目錄,如:bin,dev,etc,lib,mnt,proc,sbin,tmp,usr,var,tools。具體結構圖見(jiàn)圖1(圖中所顯示的文件都是目錄文件)。其中,tools是便于開(kāi)發(fā)而創(chuàng )建的目錄,因為整個(gè)系統要求盡量小,所以應只包含一些必須的二進(jìn)制程序,而開(kāi)發(fā)過(guò)程中需要用到的命令就放在tools中,將PATH包含tools即可。/etc目錄下只包含了一些啟動(dòng)過(guò)程的配置文件,/lib目錄下的modules子目錄包含了可動(dòng)態(tài)加載到核心的各種模塊。另外,目錄var下還應創(chuàng )建兩個(gè)子目錄log和run,負責記錄系統的日志和運行狀態(tài)。整個(gè)文件系統中除了tmp和var目錄放在SDRAM內以外,其他所有目錄都放在Flash中,因為tmp和var中的內容需要經(jīng)常寫(xiě)入,所以放在可讀寫(xiě)的RAM里。
2)配置啟動(dòng)過(guò)程所必須的文件
構造文件系統最基本的要求就是系統能夠在此基礎上啟動(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)的必須部分,所以inittab的內容被根據需要重新寫(xiě)入,具體內容如圖2。
id:S:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
b::S:respawn:/bin/bash
c:S:once:/tools/telnetd -debug
d:S:respawn:/sbin/pppd /dev/ttyS0
圖2 配置文件inittab的內容
這個(gè)系統運行單用戶(hù)模式啟動(dòng);啟動(dòng)后立即運行rc.sysinit腳本,進(jìn)行系統初始化動(dòng)作。rc.sysinit腳本也進(jìn)行了精簡(jiǎn),只保留了以讀寫(xiě)的方式重新加載(mount)根文件系統的操作(內核啟動(dòng)時(shí)只以只讀的方式加載了根文件系統),具體rc.sysinit腳本中的內容如圖3。Inittab中的后三排是根據開(kāi)發(fā)需要新加入的。為了開(kāi)發(fā)過(guò)程用戶(hù)與系統能進(jìn)行交互,啟動(dòng)了/bin/bash這個(gè)命令解釋器,用戶(hù)在鍵盤(pán)上輸入某些命令,bash將讀取輸入加以解析然后執行該程序。/tools中的telnetd和/sbin中的pppd分別是遠程登陸和串口通訊的后臺程序,加入它們也是為了方便開(kāi)發(fā)。
# Remount the root filesystem read-write.
#mount –n –o remount,rw /
mount –o remount,rw –n /dev/mtdblock2 /
mount –a
圖3 腳本rc.sysinit的內容
另外,為了盡量精簡(jiǎn)內核,程序都以動(dòng)態(tài)鏈接庫文件的方式編譯,即當程序運行到所需庫文件時(shí)才動(dòng)態(tài)加載,所以保證庫文件的完整性就顯得相當重要。為確保運行各種程序都能在/lib目錄中找到合適的庫文件,就干脆對/lib中的庫文件不作任何刪減,而完整的/lib目錄(含子目錄及全部庫文件)也不過(guò)2MB大小。
3)配置文件系統用戶(hù)
這一步驟的實(shí)現,體現了該款嵌入式產(chǎn)品操作系統的一大特色——安全性。為了防止系統中的文件被誤改或被惡意破壞,我們設置組和用戶(hù),讓只有隸屬于特定組的特定用戶(hù)才能對特定的程序進(jìn)行合法操作。
根據需要,我們定義了5個(gè)組和5個(gè)用戶(hù),具體設置及其說(shuō)明見(jiàn)表1和表2。
group id
Group name
說(shuō) 明
0
root
root用戶(hù)所在的組
1
general
一般用戶(hù)所在的組
2
network
網(wǎng)絡(luò )用戶(hù)所在的組
3
security
安全用戶(hù)所在的組
4
module
模塊用戶(hù)所在組
表1 系統中g(shù)roup id的設置
user id
group id
User name
說(shuō) 明
0
0
root
root 用戶(hù),只有命令文件init、bash的用戶(hù)是root
1
1
general
普通用戶(hù),一般執行文件的用戶(hù)
2
2
network
網(wǎng)絡(luò )程序的用戶(hù)
3
3
security
安全文件的用戶(hù)
4
4
module
模塊相關(guān)文件的用戶(hù)
表2 系統中user id的設置
我們的/etc目錄中沒(méi)有列入管理組的group文件和管理用戶(hù)的passwd文件,所以在設置文件或目錄的所有權時(shí),全部用id號來(lái)代替組名和用戶(hù)名。用chown命令來(lái)改變文件的所有權,如chown 0.0 inittab(前一個(gè)“0”代表屬組,后一個(gè)“0”代表用戶(hù)),修改后的inittab文件的詳細信息為:
-rw-r--r-- 1 0 0 237 Jul 26 10:30 inittab
將系統中所有的文件和目錄按照其具體類(lèi)型和要求,為其設定特定的組和用戶(hù)對它的所有權,例如,/etc中的module.conf配置文件的所有權是module組和module用戶(hù),那么只有組和用戶(hù)同為module的程序(比如/lib/modules/中的程序)才有權查看module.conf文件,其他非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ú)機可乘。
4)根據需要,在基本文件系統上添加應用程序
基本文件系統完成后,再根據產(chǎn)品和開(kāi)發(fā)的實(shí)際要求,在上面再構筑一些應用和服務(wù)。針對本款產(chǎn)品,對于所需求的網(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)足系統和產(chǎn)品需求的嵌入式Linux文件系統就基本構造完成。為了系統能在特定的嵌入式硬件設備上運行,系統中所有的二進(jìn)制文件都必須是經(jīng)過(guò)特定的嵌入式開(kāi)發(fā)編譯工具編譯,此次開(kāi)發(fā)用到的嵌入式開(kāi)發(fā)工具是3.2版本的arm gcc。將編譯好的文件系統燒至嵌入式系統的開(kāi)發(fā)板中,調通串口,就可以進(jìn)行調試和進(jìn)一步的開(kāi)發(fā)了。
4.結束語(yǔ)
在這次產(chǎn)品的實(shí)際開(kāi)發(fā)中,我們構造了一個(gè)嵌入式版本的Linux文件系統,它使得內核在系統盡量精簡(jiǎn)的情況下能夠運行起來(lái),并滿(mǎn)足產(chǎn)品和系統各方面的要求,其中,為文件系統配置用戶(hù)和屬組以達到一定的安全性更是系統的一大特色。
Linux的文件系統事實(shí)上非常的龐大,構造一個(gè)嵌入式的Linux文件系統是一個(gè)很復雜的過(guò)程。如何讓文件系統在保證安全的前提下精簡(jiǎn)得更緊湊、運行得更有效率,是需要深入探索的一個(gè)課題。
參考文獻:
[1]Bird T. Right-sizing Linux Selective Reduction of Linux for Embedded Devices. Embedded System Conference, Chicago. 1999
[2]張晶,曾獻云. 嵌入式系統概述. 電測與儀表, 2002:4:42~44
[3]周德新,張向利. Linux與嵌入式操作系統[DB/OL]. 桂林電子工業(yè)學(xué)院學(xué)報,2000:4:21~23
[4]金西,黃汪. 嵌入式Linux技術(shù)及其應用[DB/OL]. 計算機應用, 2000:7:4~6
[5]劉森,何希順,慕春棣. 掌上電腦研制中的關(guān)鍵技術(shù)[J]. 電子技術(shù)世界, 2001:4