Tuesday, April 5, 2011

Embedded System 修課紀錄(4)

上一次建立 Linux Kernel 並且燒錄到開發板上面,本次的步驟是將上次開發板上面的 Linux 之檔案系統更換。這裡會用到的知識大概就是哪些東西是位於那個記憶體區段,這些似乎是會隨著廠商的資訊來的,在此也一併將這個整理表格紀錄。


何謂 File System (檔案系統)

打開檔案總管,一層一層的目錄以及這些目錄所形成的宏偉的樹狀結構就是 File System 檔案系統,每一個作業系統的架構規劃又有不同。Windows 的 "Documents and Settings" 是不是長得很像 Linux 的 "/home",嵌入式課程幾乎都會採用到 Linux 作業系統,而大致上了解一下它的架構及可,例如: /bin: 放 command 的 binaries code, /etc: 設定檔, /home: 系統上的家目錄以及使用者設定, /lib: 函式和核心的 modules, /root: ROOT 的家目錄...。然而在這些目錄的最上面也是大家常常 cd / 去的地方,就是 Root File System 根目錄。甚麼時候見過它?


(圖片來自於 http://ylin77.blogspot.com/ 網站的擷取圖案)

Root FileSystem

沒錯就是安裝 Linux 時選擇自訂分割的話,可以看到的畫面。大部分是設定 / 以及 swap 空間,其餘的架構則共用剩下的磁碟空間來做建置。Root FileSystem 大致上包含三部份: 各種常用的工具、一些關於系統組態的設定檔、基本的資料夾結構。我們可以在裡面加入開機就馬上執行的一些執行程式,也就是製作符合我們需求的 Linux 檔案架構。

檔案目錄架構

假設我們要再 /home/sn/lab5_project/ 底下完成操作,檔案或是編譯的路徑必須小心處理。

操作流程
  • 下載 BusyBox
cd /home/sn/lab5_project/

// 以序建立所缺的 filesystem 以及 busybox 兩個目錄
mkdir -p /home/sn/lab5_project/filesystem/busybox

// 下載 Busybox 原始碼
wget http://busybox.net/downloads/busybox-1.15.2.tar.bz2

// 解壓縮到前面建立的資料夾
tar -jxvf busybox-1.15.2.tar.bz2 -C /home/sn/lab5_project/filesystem/busybox

  • 下載 Patch 檔案
檔案全部都在 http://busybox.net/downloads/fixes-1.15.2/ 這個網址
patch -p0 < busybox-1.15.2-ash.patch
patch -p0 < busybox-1.15.2-awk.patch 
patch -p0 < busybox-1.15.2-buildsys.patch 
patch -p0 < busybox-1.15.2-flash.patch 
patch -p0 < busybox-1.15.2-grep.patch 
patch -p0 < busybox-1.15.2-ping.patch 
patch -p0 < busybox-1.15.2-split.patch 
編譯 Busybox
cd /home/sn/lab5_project/filesystem/busybox/busybox-1.15.2

// 類似文字介面的導引,輔助邊益資訊
make menuconfig

1. [Busybox Settings] > [Build Options] > [Cross Compiler prefix]
/home/sn/lab5_project/filesystem/toolchain/bin/arm-unknown-linux-gnu-
要用絕對路徑,以及最後面要記得 '-' 一槓。

2. [Busybox Settings] > [Installation Options] > BusyBox installation prefix (./tmp) 因此之後建立的檔案系統都會擺在 tmp 中喔。 3. [Miscellaneous Utilities] > [ ] ionice, [ ] inotifyd 不要勾選
// 修改
vim coreutils/fsync.c

// 在前面新增以下幾行
# ifndef O_NOATIME 
#     define O_NOATIME 01000000 
# endif

// 三部曲的後兩部
make && make install
  • 建立檔案系統目錄
cd tmp

// 建立以下目錄即可(P.S 已經很多了...)
mkdir etc lib var proc mnt dev tmp

// 建立裝置點(黑洞?!)
// 實際上應用程式是透過 devices nodes 存取 kernel 的資源
cd ../dev
sudo mknod console c 5 1
sudo mknod tty c 5 0
sudo mknod tty0 c 4 0
sudo mknod tty1 c 4 1
sudo mknod fb0 c 29 0
sudo mknod fb1 c 29 1
sudo mknod null c 1 3
sudo mknod mem c 1 1
sudo mknod zero c 1 5
sudo mknod random c 1 8
sudo mknod ttyS0 c 4 64
sudo mknod ram0 b 1 0
sudo ln -s fb0 fb
助教的文件中是補充說明了 http://www.kernel.org/pub/linux/docs/device-list/devices.txt,越看越霧煞煞...
// 建立系統預設執行的程式
cd ../etc
vim inittab

// 填寫
console:: sysinit:/etc/rcS 
ttyS0::respawn:-/bin/sh 

vim rcS

// 填寫
#!/bin/sh
mount -t proc proc /proc
export LD_LIBRARY_PATH=/lib

// 更改權限
chmod 777 inittab rcS
到此已經打檔案系統的環境建議完畢,下一步是要把這樣的環境給製作出映像檔(Image)。

  • 製作 Image 檔案
// 安裝工具
sudo apt-get install mtd-tools

// 切換目錄
cd /home/sn/lab5_project//filesystem/busybox/busybox-1.15.2

// 製作 
mkfs.jffs2 -v -e 131072 --pad=0xF00000 -r tmp -o rootfs.jffs2
Compression errors:0 就是完成製作囉。 燒錄新的檔案系統
setenv serverip 192.168.0.1
setenv ipaddr 192.168.0.2
printenv serverip ipaddr

// 設定開發板 IP
sudo ifconfig eth0 192.168.0.1

// 開始下載與燒錄
tftp A1480000 rootfs.jffs2
protect off 480000 1FFFFFF
erase 480000 1FFFFFF
cp.b A1480000 480000 F00000

// 儲存設定
setenv bootcmd run linux
saveenv

// 重開
boot
大致上就是完成囉,可以進去開啟後的 Linux, command line 前面得部分似乎跟之前得有所不同呢~

Reference

[1.] opencsl.openfoundry.org::Lab 3 製作 root filesystem
[2.] Device nodes

No comments:

Post a Comment