延續綠色工廠核心改造計畫。Embedded...

進度有點緩慢的說,而且寫篇不算專業的技術性文章代價還頗高,因為通常寫這樣的文章我需要喝茶或是咖啡,剛剛出去買哩茶,看到東山鴨頭順便買哩,代價70元+油炸食物傷身+嘴饞變胖,這樣的代價還真是大=.=

我自己先建置哩一個 Linux 作業環境,kernel 為2.6的版本,之後去 http://www.kernel.org/ 下載 kernel,下載  kernel 應該不用教學吧!那麼解壓縮下載下來的檔案應該也不用教學吧!那麼編譯 kernel 就順便一起省吧^^
其實怎樣編譯 kernel 算是一個很大的關卡,我也不太會,但是基本原則是留下該有的就好,留下需要的就好,這就是最小化核心的原則,這部分其實要爭對用途和主機硬體規格下去調整,我也不能說太多啦。

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/root/images/main) Initramfs source file(s)

比較特別的是我做哩以上的部分,kernel 和 initrd 做在一起,開機只要一個檔案就可以哩,也就是說在開機管理員的部分,只需要 kernel 一個選項就足夠完成開機到 init 跑完的部分。/root/images/main 這個設定主要就是 Embedded 的所有內容,在編譯核心過後整個目錄將會打包到 vmlinuz 的檔案內,若能順利利用 vmlinuz 開機成功,那就是在記憶體內 run 的 Embedded System 哩。

所以 /root/images/main 這個目錄就很重要哩,du 一下這個目錄的檔案大小就可以知道之後的系統所會佔據的記憶體有多少了,那我這個目錄內到底該有些甚麼呢?你覺得系統內該有的目錄是哪些呢?不要跟我說 C 槽和 Windows 目錄唷=.=,基本上還是遵守 FHS (Filesystem Hierarchy Standard) 的原則,這部分已經算是很基本了,若不知道就多讀點書吧,恩...我去讀書哩...=.=a

其實我建立的目錄也沒有算是很完整啦,但是基本的有 /bin /dev /lib /sbin /tmp /var /boot /etc /proc /sys /usr,然後建立完這些目錄我就開始編譯核心了,因為現階段對我來說把核心縮小比這什麼東西在這些目錄內更重要,先把核心縮小在來煩惱目錄內的東西吧。

其實我也對編譯核心很害怕,因為大多累積的經驗的是 kernel panic,但是大家也都知道 kernel panic 就是開不起來,恩...懂 linux 的人都知道好哩。2.6的編譯算是簡單,因為少哩編譯 2.4 make dep 這個步驟哩,我的大致步驟如下:

設定核心
# make menuconfig
編譯
# make -j4
export INSTALL_PATH 到我創建的目錄
# export INSTALL_PATH=/root/images/main/boot/
安裝到我創建的目錄
# make install
export INSTALL_MOD_PATH 到我創建的目錄,放 modules 啦~
# export INSTALL_MOD_PATH=/root/images/main/
安裝 modules 到我創建的目錄
# make modules_install
接下來要再把 /root/images/main/boot/ 內的東西砍掉,因為安裝完 modules 後我要再把 /root/images/main/boot/ 打包一次,這樣 vmlinuz 內才會有剛剛所安裝的 modules 啊~而 boot 內的東西是沒有必要再打包一次的,因為 boot 內的 vmlinuz 拿來開機就好,沒必要在系統內存在。
# rm -f /root/images/main/boot/*
再次編譯打包
# make -j4
一樣再安裝到我創建的目錄
# make install

來看看 /root/images/main/boot/vmlinuz 有多大吧,我第一次做出來的核心有 83MB,幾次修正後少哩一半到 41MB,但是還是太大,和預期的 10MB 以內差距太大,於是就一再一再的重複上面的步驟,核心越小編譯越快<-廢話一句,此時此刻我已經剩下 16MB,雖然還不到標準但是我先站停繼續縮小核心的動作,因為要先確定可以開機啊~不然再編下不能開機也是枉然。

所以要開始籌備開機必須的 init,一切就是交給 busybox 來解決,網路上相當多資源,大家可以搜尋一下,譬如網路農夫一文,其實我的做法跟他有相同的地方也有差異的地方,我目前的進度也已經完成,但是下回揭曉^^

p.s.我有把 L7 的防火牆加到 kernel 內,這就簡單說一下
# patch -p1 < ../netfilter-layer7-v2.14/iptables-for-kernel-pre2.6.20-layer7-2.14.patch
然後 [*] Prompt for development and/or incomplete code/drivers 要勾選才能看到 L7 的選項唷!


更多資訊請參考:
最新超值旗艦機開箱
比螺旋燈泡還省電的迷你 NAS
26800mAh筆電行動電源