最小Linux系統(tǒng)制作例程
一,什么是BabyLinux
本文引用地址:http://2s4d.com/article/150702.htmBabyLinux不是一個完整的發(fā)行版,他是利用原有的一套完整的linux系統(tǒng)的內(nèi)核原代碼和編譯工具,利用busybox內(nèi)建的強大功能,在一張軟盤上做的一個很小的linux系統(tǒng).他具備一個linux系統(tǒng)的基本特征,支持linux系統(tǒng)最常用的一百多個命令,支持多種文件系統(tǒng),支持網(wǎng)絡(luò)等等,你可以把他當做一張linux起動盤和修復(fù)盤來用,你也可以把他當做一個靜態(tài)路由的路由器軟件,當然,你也可以把他當做一個linux玩具,向你的朋友炫耀 linux可以做的多么小.我把他叫做BabyLinux因為他很小巧,小的很可愛,像一個剛剛出生的小baby.
二,為什么要作這樣一個linux
先說說我一開始的想法,當我一開始接觸linux的時候,看到書上說,linux通常安裝只需要60M左右的空間,但是我發(fā)現(xiàn)裝在我硬盤上的Redhat 6.0確要占據(jù)好幾百M的空間.為什么我的linux這么大呢? 后來我發(fā)現(xiàn),裝在我機器上的那么多東西只有不到30%是我平時常用的,還有30%是我極少用到的,另外的40%基本上是不用的.于是,我和大多數(shù)初學者一樣,開始抱怨,為什么linux不能做的精簡一點呢?于是,我萌發(fā)了自己裁減系統(tǒng)的想法.可惜那個時候我還沒有聽說過有LFS和Debain.等到我積累了足夠的linux知識后,我開始制作這樣一個小系統(tǒng).
制作這樣一個小系統(tǒng)最大的意義在于,你可以通過制作系統(tǒng)了解linux的啟動過程,學會ramdisk的使用,讓你在短時間內(nèi)學到更多的linux知識. 當然,你會得到很大的樂趣.這個項目只是做一個具有基本特征的linux系統(tǒng),如果你想自己做一個具有完整功能的linux,請閱讀Linux From Scratch (LFS)文檔.
三,什么人適合讀這篇文檔
如果你是一個linux愛好者,并且很想了解linux的啟動過程和系統(tǒng)的基本結(jié)構(gòu),而且是一個喜歡動手研究小玩意的人,那么這個文檔可以滿足你的需求. 如果你僅僅是用linux來做一些普通的日常工作,而不在乎你的linux到底怎么工作,那么這份文檔也許不太適合你.另外,如果你是linux愛好者, 但是目前還是一個剛剛?cè)腴T的newbi,我建議你先把linux命令學好.不過我想我會盡可能的把這份文檔寫詳細一些,如果你有足夠的毅力,或許一個 newbi也能成功做一個babylinux.或者,你遇到一件很不巧的事情,比如你的老婆來例假了,你的這個周末就泡湯了,那么閱讀這篇文檔并做一個 linux小玩具可以打發(fā)你的時間.
四,應(yīng)該具備的知識
在做一個babylinux之前,你應(yīng)當已經(jīng)會應(yīng)用linux最常用的命令.并且至少有一次成功編譯并安裝系統(tǒng)內(nèi)核的經(jīng)歷,會通過編譯源代碼來安裝軟件. 如果你具備了這些條件,那么做這樣一個小系統(tǒng)會很順利,如果你還沒有掌握這些知識,你可能會遇到一些困難.但是只要有毅力,也可以成功.你不需要具備編程的知識,因為我的目標是:讓具有中等以上linux水平的愛好者可以通過閱讀文檔輕松完成這個項目.關(guān)于一張軟盤上的linux還有一個很著名的 linux叫LOAP (Linux On A
Floppy) 但是他是由比較專業(yè)的人員需要編寫很多程序完成的.而且沒有關(guān)于他制作過程的文檔.
五,linux系統(tǒng)引導過程簡介
首先,主板的BIOS會讀取硬盤的主引導記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬盤讀取操作系統(tǒng)核心文件并運行,因為這個小程序太小了,因此通常這個小程序不具備直接引導系統(tǒng)內(nèi)核的能力,他先去引導另一個稍微大一點的小程序,再由這個大一點的小程序去引導系統(tǒng)內(nèi)核.在linux系統(tǒng)中這樣的小程序有LILO和GRUB.在這個項目中,我決定用LILO來做系統(tǒng)引導程序.在軟盤上啟動linux系統(tǒng)的過程和在硬盤上啟動的過程相似.
Linux系統(tǒng)內(nèi)核被引導程序裝入內(nèi)核并運行后,linux內(nèi)核會檢測系統(tǒng)中的各種硬件.并做好各種硬件的初始化工作,使他們在系統(tǒng)正式運行后能正常工作.之后內(nèi)核做的最后一個工作是運行
/sbin 下的init程序,init是英文單詞initialization(初始化)的簡稱,init程序的工作是讀取/etc/inittab文件中描述的指令,對系統(tǒng)的各種軟硬件環(huán)境做最初化設(shè)定.最后運行mingetty等待用戶輸入用戶名登錄系統(tǒng).所有的工作就這么簡單,雖然linux啟動的時候有很多內(nèi)容,看上去十分高深,但是都不過是對這個過程的擴充.明白了這個道理,你可以寫一些腳本程序讓他在系統(tǒng)啟動的特定時間運行完成任務(wù).事實上系統(tǒng)內(nèi)核并不關(guān)心/sbin下的init是不是真的init,只要是放在/sbin下名叫init的可執(zhí)行程序他都可以執(zhí)行.可以做以下實驗:
編寫一個非常簡單的C程序:
main()
{
printf(“hello,world!n”);
}
保存后以init.c保存他,并用gcc編譯.
#gcc –-static -o init init.c
這里的--static 參數(shù)告訴gcc把這個程序靜態(tài)聯(lián)接,這樣這個程序不倚賴任何庫就能運行.把編譯好的init程序拷貝到/sbin下,備份好原來的那個.重新啟動系統(tǒng)最后系統(tǒng)的輸出結(jié)果是: hello,world!
然后停在那里.做這個實驗以前先確定你知道如何把系統(tǒng)恢復(fù)到原來的狀態(tài),有一個簡單的方法,在內(nèi)核啟動前給他加上init=參數(shù),比如你原先的init被你改成了init.bak 只要在啟動的時候給內(nèi)核加上init=/sbin/init.bak就可以用原來的init程序啟動系統(tǒng).
做完以上實驗,就明白了內(nèi)核和init程序之間的關(guān)系.此外,init程序不一定是一個二進制可執(zhí)行程序,他可以是一個bash腳本,一個指向另一個程序的聯(lián)接,他的位置也并不一定要在/sbin下,只要在啟動內(nèi)核時,給內(nèi)核加上init參數(shù)就能被運行,比如,開始時給內(nèi)核加上init= /bin/bash參數(shù),內(nèi)核在最后一步就直接運行bash給出提示符,不用登錄系統(tǒng)就可以輸入命令了.其功能類似單用戶模式啟動系統(tǒng). /sbin/init 程序只是內(nèi)核默認運行的第一個程序.
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論