新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 最小Linux系統(tǒng)制作例程

最小Linux系統(tǒng)制作例程

作者: 時(shí)間:2011-05-27 來源:網(wǎng)絡(luò) 收藏

一,什么是Baby

本文引用地址:http://butianyuan.cn/article/150702.htm

  Baby不是一個(gè)完整的發(fā)行版,他是利用原有的一套完整的linux的內(nèi)核原代碼和編譯工具,利用busybox內(nèi)建的強(qiáng)大功能,在一張軟盤上做的一個(gè)很小的linux.他具備一個(gè)linux的基本特征,支持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可以做的多么小.我把他叫做Baby因?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文件中描述的指令,對(duì)系統(tǒng)的各種軟硬件環(huán)境做最初化設(shè)定.最后運(yùn)行mingetty等待用戶輸入用戶名登錄系統(tǒng).所有的工作就這么簡單,雖然linux啟動(dòng)的時(shí)候有很多內(nèi)容,看上去十分高深,但是都不過是對(duì)這個(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è)程序.

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

上一頁 1 2 下一頁

關(guān)鍵詞: 制作 系統(tǒng) Linux 最小

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉