|  | |
| 嵌入式文件系統構建 | |
| Linux支(zhi)持多(duo)種(zhong)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong),同樣,嵌入(ru)式(shi)Linux也支(zhi)持多(duo)種(zhong)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)。雖然在嵌入(ru)式(shi)系(xi)(xi)(xi)統(tong)(tong)(tong)中,由于資源受限的(de)(de)(de)(de)(de)(de)原(yuan)因(yin)(yin),它的(de)(de)(de)(de)(de)(de)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)和PC上的(de)(de)(de)(de)(de)(de)Linux的(de)(de)(de)(de)(de)(de)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)有較大的(de)(de)(de)(de)(de)(de)區別,但是(shi)(shi)(shi),它們(men)的(de)(de)(de)(de)(de)(de)總(zong)體架構是(shi)(shi)(shi)一樣的(de)(de)(de)(de)(de)(de),都是(shi)(shi)(shi)采(cai)用目錄樹的(de)(de)(de)(de)(de)(de)結構。在嵌入(ru)式(shi)系(xi)(xi)(xi)統(tong)(tong)(tong)中常(chang)(chang)見的(de)(de)(de)(de)(de)(de)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)有cramfs、romfs、jffs、yaffs等,這里(li)就以制作cramfs文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)為例進行講解。cramfs文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)是(shi)(shi)(shi)一種(zhong)經過壓縮的(de)(de)(de)(de)(de)(de)、極(ji)為簡單的(de)(de)(de)(de)(de)(de)只(zhi)讀文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong),因(yin)(yin)此非常(chang)(chang)適合(he)嵌入(ru)式(shi)系(xi)(xi)(xi)統(tong)(tong)(tong)。要注意的(de)(de)(de)(de)(de)(de)是(shi)(shi)(shi),不(bu)同的(de)(de)(de)(de)(de)(de)文(wen)(wen)件(jian)(jian)系(xi)(xi)(xi)統(tong)(tong)(tong)都有相應的(de)(de)(de)(de)(de)(de)制作工具(ju),但是(shi)(shi)(shi)其(qi)主(zhu)要的(de)(de)(de)(de)(de)(de)原(yuan)理(li)和制作方法(fa)是(shi)(shi)(shi)類似的(de)(de)(de)(de)(de)(de)。 在嵌入(ru)式(shi)Linux中(zhong),busybox是構造文(wen)件(jian)系(xi)(xi)統常用的(de)(de)軟件(jian)工(gong)(gong)具(ju)包(bao),它(ta)(ta)被非(fei)常形象(xiang)地稱為(wei)嵌入(ru)式(shi)Linux系(xi)(xi)統中(zhong)的(de)(de)“瑞士軍刀”,因為(wei)它(ta)(ta)將許多常用的(de)(de)Linux命令和(he)(he)工(gong)(gong)具(ju)結(jie)合到了(le)一個單獨的(de)(de)可執行程序(busybox)中(zhong)。雖然與相(xiang)應的(de)(de)GNU工(gong)(gong)具(ju)比(bi)較(jiao),busybox所(suo)提供的(de)(de)功能(neng)和(he)(he)參數(shu)略少,但在比(bi)較(jiao)小的(de)(de)系(xi)(xi)統(如啟動盤)或(huo)者嵌入(ru)式(shi)系(xi)(xi)統中(zhong)已經足夠了(le)。 busybox在設計上就(jiu)充分考慮了(le)(le)硬(ying)件(jian)(jian)資源(yuan)受限(xian)(xian)的(de)(de)(de)(de)(de)特殊工(gong)作環境。它(ta)(ta)采(cai)用(yong)一(yi)種很巧妙(miao)的(de)(de)(de)(de)(de)辦法減少自(zi)己的(de)(de)(de)(de)(de)體(ti)積:所有的(de)(de)(de)(de)(de)命令(ling)都(dou)通過(guo)(guo)“插(cha)(cha)件(jian)(jian)”的(de)(de)(de)(de)(de)方(fang)式(shi)(shi)集中(zhong)到(dao)一(yi)個可(ke)(ke)執(zhi)行(xing)文(wen)(wen)件(jian)(jian)中(zhong),在實(shi)際應用(yong)過(guo)(guo)程(cheng)中(zhong)通過(guo)(guo)不同(tong)的(de)(de)(de)(de)(de)符(fu)(fu)號鏈接(jie)(jie)來(lai)確(que)定到(dao)底要執(zhi)行(xing)哪個操作。例如,終生(sheng)成(cheng)的(de)(de)(de)(de)(de)可(ke)(ke)執(zhi)行(xing)文(wen)(wen)件(jian)(jian)為busybox,當為它(ta)(ta)建立一(yi)個符(fu)(fu)號鏈接(jie)(jie)ls時,就(jiu)可(ke)(ke)以通過(guo)(guo)執(zhi)行(xing)這(zhe)個新命令(ling)實(shi)現列出目錄的(de)(de)(de)(de)(de)功能(neng)。采(cai)用(yong)單一(yi)執(zhi)行(xing)文(wen)(wen)件(jian)(jian)的(de)(de)(de)(de)(de)方(fang)式(shi)(shi)大限(xian)(xian)度地(di)共享(xiang)了(le)(le)程(cheng)序代碼,甚至連文(wen)(wen)件(jian)(jian)頭、內存(cun)中(zhong)的(de)(de)(de)(de)(de)程(cheng)序控制塊等其(qi)他系(xi)(xi)統資源(yuan)都(dou)共享(xiang)了(le)(le),對于資源(yuan)比較(jiao)緊張的(de)(de)(de)(de)(de)系(xi)(xi)統來(lai)說,真是合適不過(guo)(guo)了(le)(le)。在busybox的(de)(de)(de)(de)(de)編(bian)(bian)譯過(guo)(guo)程(cheng)中(zhong),可(ke)(ke)以非(fei)常方(fang)便地(di)加減它(ta)(ta)的(de)(de)(de)(de)(de)“插(cha)(cha)件(jian)(jian)”,后的(de)(de)(de)(de)(de)符(fu)(fu)號鏈接(jie)(jie)也(ye)可(ke)(ke)以由(you)編(bian)(bian)譯系(xi)(xi)統自(zi)動生(sheng)成(cheng)。 下面用busybox構建(jian)FS2410開(kai)發板的cramfs文件系統。 (1)從busybox網站下載busybox源碼(本實例采用(yong)busybox-1.00)并解壓,接下來,根據實際需要(yao)進行(xing)busybox的配(pei)置。     $ tar jxvf busybox-1.00.tar.bz2 此時,需要設(she)(she)置與平臺相(xiang)關的(de)(de)(de)交(jiao)叉編譯選項(xiang),操作步驟(zou)為:先(xian)選中“Build Options”項(xiang)的(de)(de)(de)“Do you want to build BusyBox with a Cross Complier?”選項(xiang),然后(hou)將“Cross Compiler prefix”設(she)(she)置為“/usr/local/arm/3.3.2/bin/arm-linux-”(這是在實驗主機中的(de)(de)(de)交(jiao)叉編譯器的(de)(de)(de)安裝路徑),如圖(tu)1.7所示(shi)。      (2)編譯并安(an)裝busybox。     $ make  其中(zhong),PREFIX用于指定安裝目(mu)錄,如果不設置該選(xuan)項(xiang),則默認在當前目(mu)錄下創建_install目(mu)錄。創建的安裝目(mu)錄的內(nei)容如下:     $ ls   (3)由此可知(zhi),使(shi)用busybox軟件包(bao)所創建(jian)的文件系統(tong)還缺(que)少(shao)很多東(dong)西。   (4)通過創建系統所需的(de)目錄和文(wen)件(jian)來完善文(wen)件(jian)系統的(de)內容(rong)。     $ mkdir mnt root var tmp proc boot etc lib (5)將(jiang)所(suo)需的(de)(de)(de)交叉編譯鏈接庫(ku)復制到lib目錄(lu)(lu)中,這(zhe)些(xie)庫(ku)文件(jian)位于/usr/local/arm/3.3.2/lib下。在復制時應該注(zhu)意(yi)采用打包后解(jie)包的(de)(de)(de)方(fang)式,以保證符號(hao)鏈接的(de)(de)(de)正確性和完整性。刪除所(suo)有目錄(lu)(lu)和靜態庫(ku)文件(jian),并使用arm-linux-strip工具(ju)剝除庫(ku)文件(jian)中的(de)(de)(de)調試段信息,從(cong)而減(jian)少庫(ku)的(de)(de)(de)體積。 (6)創建(jian)一(yi)些重要文件(jian)。inittab是(shi)Linux啟動(dong)之后第一(yi)個被訪問的腳(jiao)本(ben)文件(jian)。     # This is run first except when booting   建(jian)立(li)init.d目錄,進(jin)入init.d目錄,建(jian)立(li)rcS文件,文件內容如(ru)下:     #!/bin/sh 建立/etc/profile文(wen)件:     # /etc/profile 其中,profile用于設置shell的環境變(bian)量,shell啟動時(shi)會讀取/etc/profile文件(jian)來設置環境變(bian)量。以下是/etc/rc.local文件(jian):     #!/bin/sh fstab文件(jian)定義了文件(jian)系統的各個“掛接點”,需要與(yu)實際的系統相配合。     none         /proc           proc         defaults        0 0   后(hou)要(yao)創建(jian)用戶和用戶組文件(jian)等其他文件(jian),以上(shang)用busybox構造了文件(jian)系統的內容。 下(xia)面(mian)創建cramfs文(wen)件系統(tong)映像(xiang)(xiang)文(wen)件,制作cramfs映像(xiang)(xiang)文(wen)件需要用到的(de)(de)工具(ju)是(shi)mkcramfs。此時可(ke)以(yi)采(cai)用兩種(zhong)(zhong)方(fang)(fang)(fang)法,一(yi)種(zhong)(zhong)方(fang)(fang)(fang)法是(shi)使用我們所(suo)構建的(de)(de)文(wen)件系統(tong)(在目錄“/home/david/fs2410/cramfs”中),另一(yi)種(zhong)(zhong)方(fang)(fang)(fang)法是(shi)在已(yi)經做(zuo)好的(de)(de)cramfs映像(xiang)(xiang)文(wen)件的(de)(de)基礎上進行(xing)適(shi)當的(de)(de)改動。下(xia)面(mian)的(de)(de)示例使用第二種(zhong)(zhong)方(fang)(fang)(fang)法,因為(wei)這個方(fang)(fang)(fang)法包含了第一(yi)種(zhong)(zhong)方(fang)(fang)(fang)法的(de)(de)所(suo)有步驟(zou)(假設已(yi)經做(zuo)好的(de)(de)映像(xiang)(xiang)文(wen)件名(ming)為(wei)“fs2410.cramfs”)。 首(shou)先用mount命令將映像文(wen)件掛(gua)載(zai)到一(yi)個目(mu)錄(lu)下,打(da)開該目(mu)錄(lu)并查看其內(nei)容。     $ mkdir cramfs  因(yin)為cramfs文(wen)件系統是只(zhi)讀的,所(suo)以不能(neng)在(zai)這個掛載目錄下直接進行修改,因(yin)此需要(yao)將文(wen)件系統中(zhong)的內容復(fu)制到另一個目錄中(zhong),具體操作如下所(suo)示:     $ mkdir backup_cramfs  此(ci)時就像用(yong)busybox所構建的文件系統一樣,可(ke)以(yi)在backup_cramfs的cramfs子目(mu)錄中(zhong)任意進行修改。例如,可(ke)以(yi)添加用(yong)戶自(zi)己的程(cheng)序: $ cp ~/hello backup_cramfs/cramfs/   在用戶的(de)修改工作(zuo)結束之后,用下面的(de)命令可以創(chuang)建cramfs映像文件: $ mkcramfs backup_cramfs/cramfs/ new.cramfs   接下來,就可以將(jiang)新創建的(de)(de)new.cramfs映像文(wen)件燒入到開發(fa)板的(de)(de)相應位置(zhi)了。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈(lian)接:      
         1、Linux內核移植的簡介 |