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

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