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