一,什麼是BabyLinux
本文引用地址:http://www.eepw.com.cn/article/201610/305671.htm二,為什麼要做這樣一個linux
三,什麼人適合讀這篇文檔
四,應該具備的知識
五,linux系統引導過程簡介
六,編譯內核
七,編譯busybox
八,製作根文件系統
九,製作ramdisk映象文件
十,內核與busybox的整合
十一,安裝測試和內容調整
十二,babylinux中的BUG
十三,接下來要做的事情
十四,參考文獻
一,什麼是BabyLinux
BabyLinux不是一個完整的發行版,他是利用原有的一套完整的linux系統的內核原代碼和編譯工具,利用busybox內建的強大功能,在一張軟盤上做的一個很小的linux系統.他具備一個linux系統的基本特徵,支持linux系統最常用的一百多個命令,支持多種文件系統,支持網絡等等,你可以把他當做一張linux起動盤和修復盤來用,你也可以把他當做一個靜態路由的路由器軟體,當然,你也可以把他當做一個linux玩具,向你的朋友炫耀 linux可以做的多麼小.我把他叫做BabyLinux因為他很小巧,小的很可愛,像一個剛剛出生的小baby.
二,為什麼要作這樣一個linux
先說說我一開始的想法,當我一開始接觸linux的時候,看到書上說,linux通常安裝只需要60M左右的空間,但是我發現裝在我硬碟上的Redhat 6.0確要佔據好幾百M的空間.為什麼我的linux這麼大呢? 後來我發現,裝在我機器上的那麼多東西只有不到30%是我平時常用的,還有30%是我極少用到的,另外的40%基本上是不用的.於是,我和大多數初學者一樣,開始抱怨,為什麼linux不能做的精簡一點呢?於是,我萌發了自己裁減系統的想法.可惜那個時候我還沒有聽說過有LFS和Debain.等到我積累了足夠的linux知識後,我開始製作這樣一個小系統.
製作這樣一個小系統最大的意義在於,你可以通過製作系統了解linux的啟動過程,學會ramdisk的使用,讓你在短時間內學到更多的linux知識. 當然,你會得到很大的樂趣.這個項目只是做一個具有基本特徵的linux系統,如果你想自己做一個具有完整功能的linux,請閱讀Linux From Scratch (LFS)文檔.
三,什麼人適合讀這篇文檔
如果你是一個linux愛好者,並且很想了解linux的啟動過程和系統的基本結構,而且是一個喜歡動手研究小玩意的人,那麼這個文檔可以滿足你的需求. 如果你僅僅是用linux來做一些普通的日常工作,而不在乎你的linux到底怎麼工作,那麼這份文檔也許不太適合你.另外,如果你是linux愛好者, 但是目前還是一個剛剛入門的newbi,我建議你先把linux命令學好.不過我想我會儘可能的把這份文檔寫詳細一些,如果你有足夠的毅力,或許一個 newbi也能成功做一個babylinux.或者,你遇到一件很不巧的事情,比如你的老婆來例假了,你的這個周末就泡湯了,那麼閱讀這篇文檔並做一個 linux小玩具可以打發你的時間.
四,應該具備的知識
在做一個babylinux之前,你應當已經會應用linux最常用的命令.並且至少有一次成功編譯並安裝系統內核的經歷,會通過編譯原始碼來安裝軟體. 如果你具備了這些條件,那麼做這樣一個小系統會很順利,如果你還沒有掌握這些知識,你可能會遇到一些困難.但是只要有毅力,也可以成功.你不需要具備編程的知識,因為我的目標是:讓具有中等以上linux水平的愛好者可以通過閱讀文檔輕鬆完成這個項目.關於一張軟盤上的linux還有一個很著名的 linux叫LOAP (Linux On A
Floppy) 但是他是由比較專業的人員需要編寫很多程序完成的.而且沒有關於他製作過程的文檔.
五,linux系統引導過程簡介
首先,主板的BIOS會讀取硬碟的主引導記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬碟讀取作業系統核心文件並運行,因為這個小程序太小了,因此通常這個小程序不具備直接引導系統內核的能力,他先去引導另一個稍微大一點的小程序,再由這個大一點的小程序去引導系統內核.在linux系統中這樣的小程序有LILO和GRUB.在這個項目中,我決定用LILO來做系統引導程序.在軟盤上啟動linux系統的過程和在硬碟上啟動的過程相似.
Linux系統內核被引導程序裝入內核並運行後,linux內核會檢測系統中的各種硬體.並做好各種硬體的初始化工作,使他們在系統正式運行後能正常工作.之後內核做的最後一個工作是運行
/sbin 下的init程序,init是英文單詞initialization(初始化)的簡稱,init程序的工作是讀取/etc/inittab文件中描述的指令,對系統的各種軟硬體環境做最初化設定.最後運行mingetty等待用戶輸入用戶名登錄系統.所有的工作就這麼簡單,雖然linux啟動的時候有很多內容,看上去十分高深,但是都不過是對這個過程的擴充.明白了這個道理,你可以寫一些腳本程序讓他在系統啟動的特定時間運行完成任務.事實上系統內核並不關心/sbin下的init是不是真的init,只要是放在/sbin下名叫init的可執行程序他都可以執行.可以做以下實驗:
編寫一個非常簡單的C程序:
main()
{
printf(「hello,world!\n」);
}
保存後以init.c保存他,並用gcc編譯.
#gcc –-static -o init init.c
這裡的--static 參數告訴gcc把這個程序靜態聯接,這樣這個程序不倚賴任何庫就能運行.把編譯好的init程序拷貝到/sbin下,備份好原來的那個.重新啟動系統最後系統的輸出結果是: hello,world!
然後停在那裡.做這個實驗以前先確定你知道如何把系統恢復到原來的狀態,有一個簡單的方法,在內核啟動前給他加上init=參數,比如你原先的init被你改成了init.bak 只要在啟動的時候給內核加上init=/sbin/init.bak就可以用原來的init程序啟動系統.
做完以上實驗,就明白了內核和init程序之間的關係.此外,init程序不一定是一個二進位可執行程序,他可以是一個bash腳本,一個指向另一個程序的聯接,他的位置也並不一定要在/sbin下,只要在啟動內核時,給內核加上init參數就能被運行,比如,開始時給內核加上init= /bin/bash參數,內核在最後一步就直接運行bash給出提示符,不用登錄系統就可以輸入命令了.其功能類似單用戶模式啟動系統. /sbin/init 程序只是內核默認運行的第一個程序.
六,編譯一個linux系統內核
1,編譯前的規劃和準備
在編譯內核前,請先確定你的需求,把你的需求羅列成一張詳細的表格.你需要讓內核支持什麼硬體,支持多少種分區類型和文件系統,支持哪些網卡,支持哪些網絡協議.等等.請儘可能詳細的羅列這些內容,但是你也不要太貪心,因為你所有能利用的空間只有1440K,如果你編譯出一個大於1440K或很接近這個數字的內核,你的這個項目就不能完成了,你已經沒有空間再放ramdisk映象文件,除非你原意再多出一張軟盤,做一個兩張軟盤的小linux系統.對於音效卡驅動之類,我勸你還是放棄吧,因為一個音效卡驅動也許只讓你的內核增大了十多K,但是你有了一個音效卡驅動就務必要有一個播放器吧,否則音效卡驅動就沒有意義,可一個播放器的大小可不是一張軟盤可以裝得下的.在我先前製作的babylinux內核有900多K,其中,文件系統部分站了大部分,因為我的目標是把他做成一個系統修復盤.因此我在內核中編譯7種文件系統的支持,每減少一個文件系統就可以減小几十甚至200多K的內核大小.越是複雜,越是安全的文件系統,其支持模塊也越大,比如在linux下FAT模塊只有32K,VFAT只有17K,但是ext3的模塊就有86K,JFS達到216K, reiserfs模塊是224K,可以想像,編譯一個支持7個文件系統的900多K的內核,文件系統部分就佔了600K以上的空間,所以如果某一個文件系統是你根本不用的,那麼還是不要編譯進內核把,這樣至少可以省下100多K的空間.對於其他的驅動,比如網卡,通常大小只有8,9K,最大的也不過10多 K,因此可以把常用的網卡晶片的驅動都編譯進去.另外如果你想讓你的babylinux支持U盤,那麼scsi的驅動模塊也是不可小看的,他通常要接近 150K,因為U盤是被當做scsi設備來驅動的.另外你還需要讓你的內核支持即插即用,這些都是不小的空間開銷,我的建議是你放棄一兩個你不用的文件系統.總之,你最後編譯出來的內核大小最好不要超過900K,否則你在busybox裡只能編譯進去很少的命令.