嵌入式根文件系統(tǒng)的構(gòu)建
JustDo
我將從一個初學(xué)者的視角,全面的介紹根文件系統(tǒng)的構(gòu)建,力求最通俗,最易懂,最簡潔。
首先我們來了解一下什么叫做根文件系統(tǒng)
一,什么叫根文件系統(tǒng)
用一句話來講就是"操作系統(tǒng)提供給用戶的一個接口",比如說windows,你要是沒有C盤,D盤之類的構(gòu)架,你程序怎么存入硬盤?你如何操作硬盤數(shù)據(jù)?進程如何從硬盤讀取數(shù)據(jù)?
Linux操作系統(tǒng)更能體驗接口這個概念,因為他把所有的設(shè)備都虛擬成一個文件,對設(shè)備的操作就是對文件的操作。在Linux中如果沒有文件系統(tǒng)的話,用戶就和操作系統(tǒng)的交互就斷開了,我們無法通過shell要求操作系統(tǒng)執(zhí)行各種命令,也無法運行各種程序。
更細(xì)致的來說根文件系統(tǒng),它其實包括管理目錄和數(shù)據(jù)的方法和文件?目錄的組織方法,及所有文件和目錄構(gòu)成一個根文件系統(tǒng)
根文件系統(tǒng)有很多種種類,最常用的有
MS-DOS的FAT32
Linux發(fā)行版經(jīng)常用的ext3 etx4
嵌入式經(jīng)常用的ramfs yaffs
不同的種類的根文件系統(tǒng)有不同組織文件的方法和數(shù)據(jù)的組織方法。如想了解的更深入點,去查百度百科。
二linux根文件目錄結(jié)構(gòu)
所有Linux的遵循一個文件系統(tǒng)標(biāo)準(zhǔn)叫"FHS"(filesystem hierarchy standrad), http://www.pathname/該網(wǎng)站可以看
通常一個Linux文件系統(tǒng)應(yīng)該如下
/dev device的簡寫,意思是這個目錄存放的全部是設(shè)備文件,linux將所有設(shè)備都抽象成文件放在這個目錄,通過對文件的操作就可以控制設(shè)備,比如說硬盤,一般是sda打頭的,可以通過 mount /dev/sda /mnt來掛載硬盤
/root 這個是系統(tǒng)管理員專用的目錄,這里存放了一些引導(dǎo)系統(tǒng)的備份文件,文件系統(tǒng)掛載信息,系統(tǒng)修復(fù)工具備份工具等
/usr 這個目錄存放的是共享、只讀的程序和數(shù)據(jù)。
/var variable的簡寫,存放的是一些可變的數(shù)據(jù),日志文件,臨時文件什么的
/home 家目錄,大家用過Linux應(yīng)該都知道這個目錄是干嘛的,這個目錄相當(dāng)于windows的我的文檔,一般工作都在這個目錄里進行。
/proc這是一個空目錄,不過系統(tǒng)跑起來之后就不是空的了,里面的目錄文件都是由系統(tǒng)生成的,但他并不在物理存儲設(shè)備上有數(shù)據(jù),是系統(tǒng)在內(nèi)存上構(gòu)建的,所有是個虛擬的家伙。里面包含了一些系統(tǒng)信息,cpu信息什么的
/bin 存放的普通命令的可執(zhí)行文件
/sbin 存放的是系統(tǒng)命令的可執(zhí)行文件
/etc 存放了很多配置文件,比如系統(tǒng)初始化腳本,掛載文件的配置文件等等
/boot 存放的是系統(tǒng)的bootloader和內(nèi)核及其配置文件,一般嵌入式系統(tǒng)不需要這個目錄,因為嵌入式bootloder都是單獨放的一個分區(qū)
/lib 系統(tǒng)的庫文件
/initrd 這個目錄是空的,用來啟動時掛載initrd.img鏡像的,initrd.img鏡像也是一種根文件系統(tǒng),一般發(fā)行版得linux使用兩階段掛載根文件系統(tǒng),第一次階段使用initrd.img根文件系統(tǒng),根文件直接在內(nèi)存里運行,速度快,然后掛載硬盤上的根文件系統(tǒng),這樣可以加快速度,嵌入式一般不需要這個目錄。
/tmp 臨時文件目錄
/mnt 臨時掛載點
三,yaffs2文件系統(tǒng)的構(gòu)建
Yaffs2能很好的支持flash,在嵌入式領(lǐng)域應(yīng)用廣泛,所以我們選擇yaffs2
1 首先我們要根據(jù)需要創(chuàng)建一個根文件系統(tǒng)框架
參考上面的目錄結(jié)構(gòu),我們不需要的是boot,initrd這兩個目錄,并增加一個sys目錄,這個sys目錄是busyBox的一個支持熱拔插的程序mdev需要的目錄
首先建一個總目錄我命名為root_fs,然后建立好子目錄
mkdir root_fs
cd root_fs
mkdir bin dev etc home lib mnt proc root sbin sys tmp
2 安裝好busybox
進入busybox目錄
Make menuconfig
進入busybox setting->
Build options->
選中 build busybox as a static binary和bulid with lager file support選項
表示使用靜態(tài)庫編譯,支持大文件
再進入 busybox library tuning
選中vi-style line editing commands和fancy shell prompts設(shè)置命令行風(fēng)格
然后編譯,
Make
安裝 make install
然后拷貝安裝目錄 _install下的所有文件 到我們先前建的root_fs目錄下
cp _install/* ../root_fs -rf
3 在dev目錄下創(chuàng)建兩個設(shè)備節(jié)點
mknod console c 5 1
mknod null c 1 3
這兩個是系統(tǒng)運行第一個初始化進程必需要使用的使用的倆個設(shè)備
C表示字符設(shè)備 再后面是主設(shè)備號和次設(shè)備號 用來指示操作系統(tǒng)找到驅(qū)動的
拷貝busybox的實例配置文件到etc下面
Cp ../busybox-1.15/examples/bootfloopy/etc/* ./
這里面有四個文件
Fstab init.d inittab profile
Busybox構(gòu)建的根文件系統(tǒng)啟動流程是這樣的,先根據(jù)命令行參數(shù)init=linuxrc
啟動linuxrc程序
Linurc根據(jù)inittab配置文件來啟動相應(yīng)的腳本或進程
Inittab格式:<id>::<runlevels>:<action>:<process>
現(xiàn)在我們修改inittab如下
這表示
運行的rcS腳本,運行級別為sysinit,該腳本要使用使用控制臺
運行shell解釋器,運行級別為askfirst,該進程要使用串口一
這個名字是由busybody產(chǎn)生的,s3c2410 s3c2440都是這個名
運行umount -a -r當(dāng)按下ctr alt del組合鍵的時候
這里可以看到linuxrc通過inittab啟動了rcS腳本
現(xiàn)在我們修改init.d目錄下的rcS文件為
這文件是先設(shè)置PATH變量
再設(shè)置runlevel 和 prelevel變量
Mount -a會根據(jù)fstab掛載目錄,修改fstab如下
掛載所需的文件系統(tǒng)
然后設(shè)置文件默認(rèn)屬性
然后掛載devpts文件系統(tǒng) 這個是用來支持外部網(wǎng)絡(luò)鏈接虛擬中端得
重定向mdev輸出到內(nèi)核的hotplug文件來支持熱拔插
運行mdev -s在/dev目錄下生成內(nèi)核支持的所有設(shè)備文件
從HOSTNAME文件讀取主機名
所以
在/dev/下創(chuàng)建sysconfig目錄再在此目錄下創(chuàng)建HOSTNAME文件
修改HOSTNAME文件為JustDo
最好
修改profile
這是你登陸命令解釋器的配置文件,他能夠改變你命令行前面顯示的內(nèi)容
/W是當(dāng)前目錄名
最后一步:將所需的庫文件全部拷貝到lib目錄下,這個庫文件在你所使用的交叉工具鏈中
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* ./lib
好了 完成上面所有的步驟之后
使用mkyaffs2image工具編譯好之后下載到開發(fā)板的根文件分區(qū)就可以跑了
如果出現(xiàn)
"Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel. "
有可能是你使用的mkyaffs2image工具不支持128M的flash
我的另外一篇博客已經(jīng)提到怎么解決了
綜上 系統(tǒng)啟動的流程大概是這個樣子的到處必要的環(huán)境變量,Mount上所需的分區(qū),最后運行腳本解釋器
PS:如有錯誤,還請指正:JustDo,QQ:843308498
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
