2008年5月25日 星期日

Linux系統最小化

目標是利用initrd的機制,使用ramdisk當作root filesystem,看看kernel可以裁減到多小,root filesystem 至少需要哪些檔案

工作平台: x86, Red Hat 9

Linux Kernel 2.4.20
必要選項:
General setup --->Kernel support for ELF binaries(CONFIG_BINFMT_ELF)
註:因為所有linux的binary執行檔都用這種格式,以前是用a.out的格式,
例如windows的執行檔是用PE的格式

Character devices --->Virtual terminal(CONFIG_VT)

Character devices --->Support for console on virtual terminal(CONFIG_VT_CONSOLE)

File systems --->/proc file system support(CONFIG_PROC_FS)
註:很多工具命令需要,像是 ps.reboot....

Console drivers --->VGA text console(CONFIG_VGA_CONSOLE)
註:在 make menuconfig 環境下,Character devices -->Virtual terminal(CONFIG_VT)勾選之後,才能看到

root filesystem:
/bin /dev /etc /lib /mnt /proc /sbin /usr
mknod /dev/console c 5 1
mknod /dev/tty1 c 4 1


BusyBox工具集:(版本-0.60.5)
/bin/busybox
/linuxrc
註:若kernel傳參數時,有加入root=/dev/ram0,這個連結檔可以砍掉
/sbin/init
其他工具...

若使用靜態連結,可以不用考慮shared library的相依性
若使用動態連結,可以用ldd指令來查binary執行檔的相依性,不過只要檢查busybox檔的相依性,因為其它的都是連結檔!!!


GNU工具集:(直接從Red Hat 9.0 複製過去)
/sbin/init
/bin/bash
/bin/nash
/linuxrc
註:若kernel傳參數時,有加入root=/dev/ram0,這個檔就不需要,若無法傳遞參數給kernel,可以寫成如下:

#!/bin/nash
echo Mounting /porc filesystem
mount -t proc /proc /proc
echo 0x0100 > /proc/sys/kernel/real-root-dev

這樣算是等同於busybox自動產生的linuxrc連結檔!!!

nash 是個命令解譯器,有很多特殊的內建命令,用來適合initrd的任務,細節請參考man或者相關連結,雖然這個命令稿有用到echo. mount的指令,不過這些都是nash內建的,建議就用nash當作指令稿的解析器,
若用bash會有其它要解決的問題,例如mount,除了是外部命令,還有函式庫相依性,還有 ...

還有kernel的核心設定要多加一項
General setup --->sysctl support(CONFIG_SYSCTL)
這樣子,/proc下才有/sys這個子目錄

其他工具...

由於都是從Red Hat 9.0複製過來,所以一定要考慮執行檔相依性,像是moount. echo. bash. ...
可以用 type '命令',知道命令的位置,也可以用ldd '命令', 知道命令相依哪些函式庫:-)

相關連結
雲上的老鼠 西莎雜記
酷!學園 簡單日誌 skywalker_nick的技術專欄 Checko's Blog
Jamyy's Weblog
IT技術-賽迪網 資安論壇

2008年5月13日 星期二

initrd 的建立方式

Linux2.6 内核的 Initrd 机制解析
這裡面講解了Linux2.6 & Linux2.4 initrd 的不同,有一個地方,以為是錯誤,結果卻不是,

之前以為目錄之間的複製,如果包含了裝置檔,是不能用cp的指令,因為如果裝置檔的major & minor, 如果剛好match系統中的某個裝置檔的major & minor,則cp指令會觸發系統裝置的驅動程式,而不是在複製裝置檔,所以會有很多奇怪的現象

結論是,如果只複製一個裝置檔會有問題,如果使用cp -r 就可以...
註: -r 是遞迴的拷貝,包括目錄和次目錄下的所有檔案

紀錄一下之前覺得安心的做法:
(cd initrd; tar -cf - *) | (cd ram0; tar -xf -)

(cd initrd; find . | cpio -p ../ram0)

相關連結:
Hangle的學習筆記
[藍森林-自由軟件]