星期三, 6月 06, 2007

嵌入式Linux文件系统的构建

http://www.sinklow.com/blog/article.asp?id=159
busybox的配置及编译
#make menuconfig
配置参数
#make

文件结构
/dev -- 里面存放设备档 (Devices) ,为达成 I/O 工作所需
/proc -- Directory stub required by the proc filesystem
/etc -- 里面存放系统组态设定档
/sbin -- 重要的 (critical) 系统二进位执行档 (binaries)
/bin -- 被认为是系统一部分的基本二进位执行档
/lib -- 提供 run-time 支持的共享函式库
/mnt -- 维护其它磁盘所用的磁盘挂入点 (mount point)
/usr -- 额外的工具程序与应用程序

文件说明
/bin /sbin 已经由busybox构建
/proc /mnt /usr 三个目录为空
/lib 将所需要的库都复制进来,可用ldd命令进行查看
/etc /dev 比较复杂,可参考《Building a root filesystem》

最后用mkfs.jffs2做成JFFS2文件系统映像
#mkdir jffsfile
#cd jffsfile

/* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries that are needed for the filesystem here */

/* Type the following command under jffsfile directory to create the JFFS2 Image */

#./mkfs.jffs2 -e 0x40000 -p -o ../jffs.image
Quote
以下内容转载自《Building a root filesystem》

/dev
/dev 目錄包含一群特別的檔案,這些檔案是給系統上所有設備使用的,這樣的 /dev 目錄每個 Linux 系統都一定會有。這個目錄本身是一個普通目錄,可以以一般的方法用 mkdir 造出來。然而,這些特別的檔案必須以特別的方法用 mknod 指令造出來。

但還是有一條捷徑 -- 直接 copy 你現有 /dev 目錄的內容,然後再清除你不想要的設備檔。唯一的要求是 copy 這些特別的設備檔時,要用 -R 選項。這個選項會 copy 整個目錄中的檔案,但是不會 copy 這些檔案的內容。請確定使用 大寫字母 R 。這個指令是:

cp -dpR /dev /mnt

在此我們假設磁片是被掛在 /mnt 底下。 dp 選項 (switches) 確保 symbolic links 是以 links 的方式來 copy ,而不是 copy 鏈結檔所指向的 target file ,同時原本的檔案屬性也被保留,因此保留了檔案的所有權資訊。

如果你想要用高難度技巧完成這個任務,就利用 ls -l 列出你想要的設備檔之 major 與 minor device numbers ,然後再用 mknod 在磁片上造出它們。

無論如何 copy 這些設備檔,還是要檢查任何你所需之設備檔 (device special file) 是否已放入這張救援磁片中。舉例來說, ftape 使用磁帶設備,如果你想要從 bootdisk 存取軟式磁帶機,你就需要 copy 所有有關的設備檔。

請注意,每一個設備檔需要一個 inode ,但 inodes 一直都是稀少的資源,特別是在磁片 filesystems 上。因此,從磁片上的 /dev 目錄移除任何你所不需要的設備檔是有意義的。舉例來說,如果你沒有 SCSI 磁碟,你可以放心地移除所有以 sd 開頭的設備檔。同樣地,如果你並不想使用你的序列埠 (serial port) ,那麼你也可以移除所有以 cua 開頭的設備檔。

請確定從這個目錄放入了以下檔案的: console, kmem, mem, null, ram0 and tty1.

/etc
這個目錄包含了重要的組態設定檔。在大部分的系統上,這些檔案被分為三個群組:

一直都是必備的, e.g. rc, fstab, passwd 。
可能是必備的,但是沒有人能十分確定。
偷跑進來的垃報。
通常可以用以下指令識出哪些是非基本的檔案:

ls -ltru

這個指令將檔案依據上次被存取的日期,以先早後晚 (reverse) 的順序列出,所以如果有任何檔案不會被存取,那麼它們就可以從 root 磁片中刪去。

在我的 root 磁片上,我的組態檔數目已減至 15 個。這可減少我處理以下三種檔案的工作:

我必須為 boot/root 系統進行組態設定的檔案:
rc.d/* -- 系統啟動與改變 run level 的 scripts
fstab -- 要被掛上的 file systems 清單
inittab -- 給 init process 的參數,於開機時啟動的第一個 process 。
我們應該為 boot/root 系統整理的檔案:
passwd -- 重要的使用者、 home 目錄等其它項目的清單。
group -- 使用者群組。
shadow -- 使用者的密碼。你可能沒有這個檔。
termcap -- the terminal capability database.
如果系統安全 (security) 對你很重要,那麼 passwd 與 shadow 應該被刪減,以避免將使用者密碼 copy 出系統,這樣當你從磁片開機時,不想要的 logins 會被拒絕。 請確定 passwd 至少包含了 root 。如果你要讓其他的使用者 login ,請確定他們的 home 目錄與 shells 都存在。 termcap ,終端機資料庫,一般而言有幾百個 kilobytes 。你 boot/root 磁片的版本應該被刪減到只包含你所使用的終端機,這通常就是 linux 或 linux-console 項目 (entry) 。
The rest. They work at the moment, so I leave them alone.
Out of this, 我實際上只必須設定兩個檔,而它們所應包含的項目驚人地少。

rc 應該包含:
#!/bin/sh
/bin/mount -av
/bin/hostname Kangaroo

請確定上述的目錄都是正確的。你並不需要真地去執行 hostname -- 如果你執行只是讓系統比較好看 (譯註:如此系統會有個名字) 。
fstab 應該至少要包含:
/dev/ram0 / ext2 defaults
/dev/fd0 / ext2 defaults
/proc /proc proc defaults

你可以從你現存的 fstab copy 你想要的項目,但是你並不應該自動地掛上你硬碟任何的 partitions ;請對這些項目使用 noauto 關鍵字 (譯註:用 noauto 代替 default ) 。當使用 bootdisk 時,你的硬碟可能是早已損壞或掛了。
你的 inittab 應該被改變,以使其中 sysinit 這行能執行 rc 或無論什麼將被執行的基本開機 script 。同時,如果你想要確保不可從序列埠 login ,請在所有行尾包括 ttys 或 ttyS 的 getty 項目前加上「#」符號 (comment out) 。請保留 tty 埠以讓你可以在 console 前 login 。

一個最起碼的 inittab 檔看起來樣這樣:

id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2

inittab 檔定義了系統在各種不同的情況中將執行什麼項目,包括 startup 、切換至多使用者模式等等。請仔細地檢查在 inittab 中被提及的檔案名稱 (filenames) ;如果 init 不能找到所提及的程式,那麼 bootdisk 將會停止運作,而你甚至不會得到錯誤訊息。

請注意,某些程式不能被移到其它地方,因為其它程式已在撰寫時,就把它們的檔案位置寫死了 (hardcode) 。舉例來說在我的系統上, /etc/shutdown 已把 /etc/reboot 的位置寫死在其中。如果我移動了 reboot 到 /bin/reboot,然後下達一個 shutdown 指令,將會因為找不到 reboot 檔而發生錯誤。

剩下來的,就是 copy 在你 /etc 目錄中的所有文字檔 (text files) ,再加上在你 /etc 目錄中,你無法確定你需不需要的所有可執行檔。需要指示 (guide) 者,請參考在 Sample roodisk directory listings 的樣本清單。也許只要 copy 這些檔案就足夠了,但是系統差異會有很大的影響,所以你無法確定你系統上相同的檔案組合,就一定等於清單中的檔案。唯一確定的方法就是從 inittab 著手,並找出需要什麼。

現在大部分的系統使用 /etc/rc.d/ 目錄,其中包含給不同 run levels 的shell scripts 。最起碼會有一個單一的 rc script,但是僅從你現存的系統 copy inittab 與 /etc/rc.d 這兩個目錄,然後刪減 rc.d 目錄中的 shell scripts 以移除和磁片系統環境無關的 processing ,會是較為簡單的做法。

沒有留言: