檔案系統是Linux不可缺少的一部份,不過在Embedded System上資源有限,不可能建立像PC那麼大的檔案系統,

因此系統工具程式必須經過精簡化將檔案縮小這樣才可節省Embedded System資源。

 

現在在Embedded Linux上最常用的檔案系統為Busybox。

Busybox 整合各種系統工具程式(ex:ls,mkdir,mount,ifconfig...)成為一個單一執行檔,大大縮減了系統使用容量。

 

以下介紹使用"Busybox"來建立檔案系統。

busybox可以在官方網站(http://www.busybox.net/)下載。

依照以下步驟建立Linux檔案系統

 

1. 解壓縮並編譯 busybox

#tar jxf busybox-1.13.1.tar.bz2

#export PATH=/usr/local/arm/3.4.1/bin:$PATH
(將arm-linux-gcc的路徑加入PATH環境變數)

#make menuconfig
(設定busybox組態,指定Cross Compiler prefix使用arm-linux-來編譯出ARM的執行檔)
(由於考慮到nand flash大小的限制,所以在此只選擇必要且重要的選項)
重要選項:
Busybox Settings--->
  Build Options --->
  [*] Build BusyBox as a static binary (no shared libs)
  [ ] Build with Large File Support (for accessing files > 2 GB)
      (arm-linux-) Cross Compiler prefix
(其他選項可依據需求增加或刪減)

#make#make install PREFIX=安裝資料夾
(編譯完成的檔案如果沒有透過PREFIX設定,基本上會放在 _install 目錄下)
(這幾乎就是我們要的檔案系統了,不過還需要建立一些目錄與檔案)

#mkdir _install/proc
#mkdir _install/sys
#mkdir _install/lib
(複製共用函式庫,本例使用的ARM cross compiler安裝於 /usr/local/arm/3.4.1)
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so _install/lib (複製C函式庫)
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/libc.* _install/lib
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/libm-2.3.2.so _install/lib (複製數學函式庫)
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/libm.* _install/lib
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/ld-* _install/lib (複製linux程式載入函式庫)
#cp -ax /usr/local/arm/3.4.1/arm-linux/lib/libthread_db* _install/lib (複製thread函式庫)
#rm -f _install/lib/*a (刪除連結檔 ".a" 與 ".la",這些檔只有在連結時才會用到,執行時不用)
#mkdir _install/tmp
#chmod 777 _install/tmp
#mkdir _install/var (建立裝置檔)
#mkdir _install/dev
#mknod _install/dev/console c 5 1
#mknod _install/dev/ttyS0 c 204 64
#mknod _install/dev/ttySAC0 c 204 64
#mkdir _install/etc


2. 啟動命令稿編輯
可依需求再加上啟動時要執行的指令,ex:網路設定,啟動畫面顯示等。

inittab用來規劃軟體的執行環境,
包括系統的主機名稱、網路設定、語系處理、檔案系統格式及其他服務的啟動等。

#vi _install/etc/inittab      (編輯內容如下)
::sysinit:/etc/init.d/rcS     //準備系統執行環境的腳本執行檔
::askfirst:-/bin/sh           //開啟一個無需登入驗證的shell
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot     //當按下CRTL+ALT+DEL時執行命令reboot
::shutdown:/bin/umount -a –r  //指定關機時執行的操作
::shutdown:/sbin/swapoff –a   //指定關機時執行的操作


rcS為系統執行環境的腳本執行檔。

#mkdir _install/etc/init.d

#vi _install/etc/init.d/rcS   (編輯內容如下)
#/bin/sh
echo "-----------Run rcS-----------"
ifconfig lo 127.0.0.1
echo "Set IP 192.168.0.10"
ifconfig eth0 192.168.0.10
mount -t proc proc /proc
mount -t sysfs sysfs /sys

 


profile是每個使用者登入取得bash時一定會讀取的設定檔。
#cd _install/etc
#vi _install/etc/profile
echo "Set search library path in /etc/profile"
export LD_LIBRARY_PATH=/lib:/usr/lib:/opt/Qtopia/lib

# Set user path
echo "Set user path in /etc/profile"
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/Qtopia/bin:/usr/local/bin
export PATH


3. 掛載Linux檔案系統
掛載檔案系統通常有兩種常用的方法,
一個是建立成映像檔,另一個方法是透過網路建立NFS檔案系統。

以開發階段而言,透過NFS連線方式建立起來的檔案系統,無疑能夠節省很多的時間,
編寫好的程式或是修改過的檔案系統都能夠即時的做測試,而不需等待重複燒寫到flash中。

3-1. 製作映像檔
在嵌入式LINUX中,根檔案系統至關重要,
它是所有文件和設備節點的起始點,決定了系統能否正常啟動的關鍵。

選擇檔案系統
為根檔案系統選擇檔案系統是個困難的過程。最後通常是檔案系統的能力與目標板的用途之間折衷的結果。
舉例來說,如果目標版根本不需要永久性的儲存任何資料,那麼選擇可以提供永久性寫入儲存的檔案系統毫無用處。
對這類目標板來說,一個不具永久性儲存功能的檔案系統,例如CRAMFS,是比較好的選擇。

檔案系統特性
要為特定的應用選擇最佳的檔案系統或最佳的檔案系統組合,我們需要一組可用來比較檔案系統的特性。
透過下面幾個問題,可以描繪出每種檔案系統的特性:

可被寫入
這個檔案系統可以被寫入嗎?

具永久性
重開機之後這個檔案系統可以保存修改過的內容嗎?

具斷電可靠度
經變動的檔案系統可以在斷電之後恢復過來嗎?

經過壓縮
經掛載的檔案系統,其內容有經過壓縮嗎?

存在於RAM中
檔案系統的內容再被掛載之前會先從儲存裝置取珠並放在RAM中嗎?

Root Files System 其類型相當的多,
如:romfs、ext2、ext3、ext4、cramfs、cromfs、initrd、initramfs、yaffs2…等等。

對於目標版所要燒入的映像檔還需要注意到,Linux kernel是否有支援相對應的格式,若無,啟動時將會出問題。

在此我們所需要的檔案格式為yaffs2,執行命令如下:

#mkyaffs2image 目標資料夾 映像檔名稱

製作好的映像檔可以透過 Bootload 寫入Flash中,之後設定Linux啟動時掛載Flash為根目錄即可。


3-2. NFS 掛載
NFS(Network FileSystem)是實現兩機間進行通訊訪問的一種簡單方法。

在嵌入式Linux實驗中,我們通過配置NFS實現個人電腦和開發平台之間的溝通。

原理是在個人電腦的Linux中開啟NFS服務,設定一個共享目錄,所有的源碼編輯改動都可以在個人電腦中進行方便的修改。

在實驗環境中,將個人電腦的目錄遠程mount到本地,實現兩機間的同步讀寫訪問,這樣程式就可以方便的在PC中運作測試。

簡單說來,目的就是設定一個共享目錄,在個人電腦中進行編輯,在開發板中進行運作測試。

在開發的過程中,因為僅只有個人電腦與開發板的連接,無須考慮到共享資料夾的安全與權限問題。

因此,在這裡只需要做一些簡單的設定即可。

NFS掛載目錄及權限由/etc/exports檔案定義,開發板啟動時所要掛載個人電腦上的開機的根目錄就必須在此作設定。

#vi /etc/exports (在檔案中加入下面這一行)
資料夾完整路徑 *(rw,sync,no_root_squash)

Bootloader的啟動參數也需要設定連接的IP與目標資料夾才能正確啟動。

我所使用的Bootloader是U-boot,設定方式如下:

setenv bootargs console=ttySAC0 root=/dev/nfs rw nfsroot=NFS主機的IP:欲掛載的資料夾完整路徑 ip=開發板IP: NFS主機的IP: Gateway IP:255.255.255.0


4. 啟動Root File System

當一切都設定完成之後,啟動開發板進入系統。


參考資料:
[1]http://linux.vbird.org/linux_basic/0510osloader.php
[2]http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script
[3]http://www.study-area.org/cyril/scripts/scripts/node6.html
[4]http://www.mgt.ncu.edu.tw/~dino/script/
[5]http://linux.vbird.org/linux_basic/0320bash.php#settings_bashrc_profile
[6]http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_0
[7]建構式嵌入式LINUX系統8.1.1

參考來源
http://flykof.pixnet.net/blog/post/24242728

arrow
arrow
    全站熱搜

    BB 發表在 痞客邦 留言(0) 人氣()