1. 程式人生 > >Linux核心驅動學習(二)----根檔案系統的構成 (root filesystem)

Linux核心驅動學習(二)----根檔案系統的構成 (root filesystem)

1、建立根檔案系統目錄和檔案

1.1建立目錄
1.2建立裝置檔案(命令mknod);必須建立裝置檔案---consle\null
1.3建立配置檔案---複製已有的/etc目錄下的檔案 1.4新增核心模組 進入Linux核心目錄下,(注意,應該先編譯核心,即命令make uImage ARCH=arm  CROSS_COMPILE=arm-linux-) 1.4.1、編譯核心模組---命令 make modules ARCH=arm CROSS_COMPILE=arm-linux- 1.4.2、將編譯好的核心模組集中到一起,並將其放置到新建檔案系統目錄下/rootfs-->
命令 make modules_install ARCH=arm INSTALL_MOD_PATH=.../rootfs
1.5編譯/安裝busybox(含有Linux下的執行命令) 1.5.1、配置busybox make menuconfig  主要配置的選項有 **Busybox Settings ->build Options-> 選中 “build busybox as a static binary”,靜態連結 cross compiler prefix (arm-linux-)  ,編譯交叉工具鏈
**Busybox Settings ->Installation Options -> 
選中“donot use /usr”,,選中該項可以避免busybox被安裝到宿主系統的/usr目錄下,破壞宿主系統 busybox installation prefix(/xxx/rootfs)  該選項表明編譯後的busybox的安裝位置
1.5.2、編譯、安裝 編譯命令: make 安裝: make install 安裝後的效果 /xxx/rootfs/bin目錄下多出了許多命令

2、掛載根檔案系統到核心

2.1關於檔案系統介紹及分類

根據儲存裝置的硬體特性(NOR Flash? nandflash?)、系統需求(可讀可寫? 只讀?),且不同的檔案系統型別有不同的應用場合。 2.1.1、
基於nandflash的檔案系統
a>yaffs2主要用於nand型flash,支援跨平臺。 b>ubifs 以上兩種均為可讀可寫的檔案系統 2.1.2、基於norflash的檔案系統 a>Jffs2(可讀可寫) 主要用於nor型flash,特點是可讀寫,支援資料壓縮的日誌型檔案系統。 2.1.3、基於記憶體的檔案系統 a>Ramdisk 基於ram的檔案系統。是將一部分固定大小的記憶體當做塊裝置來用。它並非是一個實際的檔案系統,而是一種將實際的檔案系統裝入記憶體的機制。將一些經常訪問而又無需更改的檔案通過ramdisk放在記憶體中,可以明顯的提高系統的效能。 b>Initramfs(現在多使用,啟動系統非常快,缺點:不可儲存使用者資料) 基於ram的檔案系統。initramfs出現在2.6核心中,它類似於tmpfs,是一種基於記憶體的檔案系統,它的使用不需要建立記憶體塊裝置。增加檔案到ramfs會自動配置更多的記憶體,並刪除或截去檔案以釋放記憶體。(若ramdisk沒有滿,已被佔用的額外的記憶體也不能用來做其它事情,若ramdisk滿了,但其它仍有閒置的記憶體,也必須重新格式化以後才能擴充套件使用) 2.1.4、基於網路的檔案系統 a>NFS(主要在開發階段使用) 是由sun開發的一種在不同機器之間通過網路共享檔案的技術。在嵌入式linux系統的開發除錯階段,可以利用該技術在主機上建立基於nfs的根檔案系統,掛載到嵌入式裝置,可以很方便的修改根檔案系統的內容。 實際使用時可使用混合作業系統。。利用各個檔案系統的優勢。

2.2使用Initramfs 檔案系統

Initramfs 檔案系統是與核心固定在一起的,修改檔案系統中的內容後不會立即生效,需重新編譯核心。(在建立好的檔案系統下操作 /xxx/rootfs/) 2.2.1、執行命令(建立軟連結的原因:initramfs檔案系統啟動時會在根檔案系統中執行第一個init程式,它對uboot傳過來的引數init=/linuxrc不予理睬,所以需要在製作的根檔案系統裡的根目錄加入init程式,否則無法啟動。init程式和linuxrc程式一樣都是符號連結檔案,它們都是指向/bin/busybox程式。) ln -s ./bin/busybox init 2.2.2、配置Linux核心,支援initramfs   如下圖
2.2.3編譯核心 2.2.4、設定uboot環境變數(傳給核心的啟動引數) setenv bootargs noinitrd console=ttySAC0,115200 2.2.5、在uboot命令列下可以檢視其檔案系統的內容,如下

2.3使用NFS檔案系統

(相對於Initram檔案系統,在nfs伺服器上修改檔案系統內容時,在開發版會立即生效。。而Initramfs檔案系統需要重新編譯核心,即靜態編譯) 2.3.1、取消在製作Initram檔案系統的以下選項
2.3.2、**file systems-->Network File Systems--->Root file system on nfs選中該選項
2.3.3、編譯核心 2.3.4、啟動引數配置(uboot 中) setenv bootargs noinitrd console=ttySAC0,115200 init=/init root=/dev/nfs rw nfsroot=192.168.1.112:/home/kindlyde/Desktop/arm-5/lesson4/rootfs ip=192.168.1.130:192.168.1.112:192.168.1.1:255.255.255.0:  :eth0:off
noinitrd : console=ttySAC0,115200 :串列埠,波特率//錯誤:console寫成了consoles,,造成資訊出現在開發版上。。串列埠中沒出現 init=/init  root=/dev/nfs :nfs作為根目錄:----》但在Linux系統中或製作的檔案系統中均未發現此根目錄?? rw :可讀可寫 nfsroot=192.168.1.112:虛擬機器IP(NFS伺服器地址) :/home/kindlyde/Desktop/arm-5/lesson4/rootfs 建立的檔案系統路徑 ip=192.168.1.130:(開發板的IP) 192.168.1.112(NFS伺服器地址) :192.168.1.1(閘道器地址) :255.255.255.0(掩碼地址) :(開發板的主機名,未取名,所以為空) :eth0:off 2.3.5、將核心通過tftp下載到開發板中,之後啟動開發板。結果如下圖所示

注意事項以及實現系統掛載時出現的錯誤:

需同時設定NFS伺服器的主目錄地址(/etc/exports)---設計詳見筆記--《配置NFS伺服器》
使用NFS伺服器掛載檔案系統時; 出現如下錯誤:Unable to mount root fs via NFS, trying floppy.
出錯原因: 1、在下載核心的後啟動核心而出現的這個問題,那麼就是下載核心之前設定引導引數的時候沒有設定正確,可能是nfs的解壓路徑不正確,
2、NFS的目錄內容改變了。。解決方法:重啟NFS服務 3、檢視nfs伺服器是否配置正確。。如下