最小的Linux系統(tǒng)制作過程詳解
掃描二維碼
隨時(shí)隨地手機(jī)看文章
一,什么是BabyLinux
二,為什么要做這樣一個(gè)linux
三,什么人適合讀這篇文檔
四,應(yīng)該具備的知識(shí)
五,linux系統(tǒng)引導(dǎo)過程簡介
六,編譯內(nèi)核
七,編譯busybox
八,制作根文件系統(tǒng)
九,制作ramdisk映象文件
十,內(nèi)核與busybox的整合
十一,安裝測(cè)試和內(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,請(qǐng)閱讀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ì)檢測(cè)系統(tǒng)中的各種硬件.并做好各種硬件的初始化工作,使他們?cè)谙到y(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è)程序.
六,編譯一個(gè)linux系統(tǒng)內(nèi)核
1,編譯前的規(guī)劃和準(zhǔn)備
在編譯內(nèi)核前,請(qǐng)先確定你的需求,把你的需求羅列成一張?jiān)敿?xì)的表格.你需要讓內(nèi)核支持什么硬件,支持多少種分區(qū)類型和文件系統(tǒng),支持哪些網(wǎng)卡,支持哪些網(wǎng)絡(luò)協(xié)議.等等.請(qǐng)盡可能詳細(xì)的羅列這些內(nèi)容,但是你也不要太貪心,因?yàn)槟闼心芾玫目臻g只有1440K,如果你編譯出一個(gè)大于1440K或很接近這個(gè)數(shù)字的內(nèi)核,你的這個(gè)項(xiàng)目就不能完成了,你已經(jīng)沒有空間再放ramdisk映象文件,除非你原意再多出一張軟盤,做一個(gè)兩張軟盤的小linux系統(tǒng).對(duì)于聲卡驅(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的空間.對(duì)于其他的驅(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)去很少的命令.[!--empirenews.page--]
在我編譯的busybox中,我編譯進(jìn)去120多個(gè)命令,基本上把busybox支持的命令都包括進(jìn)去了.加上小系統(tǒng)所必需的文件系統(tǒng)目錄,/dev下的設(shè)備文件,以及/etc下幾個(gè)必需的配置文件,做成ramdisk壓縮后的大小是440多K, 加上900K左右的內(nèi)核剛好可以放入一張1440K軟盤,請(qǐng)注意,你應(yīng)該留下至少50K的空間,因?yàn)槲覀円谲洷P上創(chuàng)建一個(gè)ext2文件系統(tǒng),而文件系統(tǒng)本生需要占據(jù)大概25K的磁盤空間.另外lilo的引導(dǎo)文件boot.b的大小是5.7K,還有裝上lilo后自動(dòng)產(chǎn)生的map文件也要10多K的空間, map文件的具體大小由內(nèi)核安裝的實(shí)際大小決定,通常不會(huì)超過30K.
綜上所述,請(qǐng)遵循下面的公式:
內(nèi)核大小+文件系統(tǒng)壓縮印象文件+50K <= 1440K
另外一點(diǎn)需要說明的是:以上所羅列的文件系統(tǒng)模塊大小是察看我現(xiàn)在使用的Redhat 9 的
/lib/modules下的模塊文件得到的,實(shí)際編譯進(jìn)內(nèi)核大小會(huì)小一點(diǎn),因?yàn)槲覀冇胢ake bzImage
在內(nèi)核源代碼目錄樹下生成的內(nèi)核是經(jīng)過壓縮過的.
如果你對(duì)以上說的內(nèi)容不太明白也沒有關(guān)系,我會(huì)在下面的內(nèi)容中做詳細(xì)的說明.
2,必需編譯進(jìn)內(nèi)核的內(nèi)容
首先,我們制作的這個(gè)小系統(tǒng)是基于一張軟盤的,因此,你的內(nèi)核必需支持軟盤.另外對(duì)IDE硬盤和cdrom的支持也是不可少的,否則做出來的 babylinux就沒有實(shí)用價(jià)值,因?yàn)樗荒茉L問硬盤和光盤上的內(nèi)容這樣的linux雖然可以做的更小,但是制造一個(gè)完全沒有用的東西是浪費(fèi)時(shí)間.其他的包括framebuffer等,如果你需要支持在字符界面下以高分辨率顯示,以看到更多的屏幕內(nèi)容,那么就必需把framebuffer支持編譯進(jìn)內(nèi)核,此外在高分辨率下使用的8x8字體也必需編譯進(jìn)去.否則即使你給內(nèi)核傳遞了vga= 參數(shù),內(nèi)核會(huì)因?yàn)闆]有可用的小字體而自動(dòng)轉(zhuǎn)跳到低分辨率模式下,這是以前困擾我好幾天想不明白的事情,后來通過反復(fù)試驗(yàn)才明白原來是缺少字體的文體.這里我先大致提一下需要注意的事情.在下一小節(jié)具體編譯時(shí),我會(huì)繼續(xù)就某些細(xì)節(jié)問題說明.
3,關(guān)于內(nèi)核的版本
我是在Redhat 9 linux系統(tǒng)下打造的babylinux小系統(tǒng).使用的是Redhat 9 自帶的2.4.20版的內(nèi)核.
為什么我不用最新的2.6的內(nèi)核?
一開始我也企圖用最新的內(nèi)核,但是通過試驗(yàn)我發(fā)現(xiàn),在用最新的2.6.9內(nèi)核的情況下,我編譯一個(gè)all-no的(即所有內(nèi)容都選N,不支持任何硬件,只有一個(gè)最基本的內(nèi)核)最小化內(nèi)核就要460K左右,如果我在這個(gè)基礎(chǔ)上再加入幾種文件系統(tǒng)和必要的驅(qū)動(dòng),那么內(nèi)核的大小就不能裝下一張1440K
的軟盤,而我用2.4.20的內(nèi)核編譯一個(gè)最小化的內(nèi)核只需要217K,的大小.如果優(yōu)化了gcc參數(shù)他還能再小些.這樣我就立即省下了200多K的空間,在平時(shí),200多K的內(nèi)容微不足道,但是在babylinux里,這個(gè)數(shù)目是整個(gè)空間的 1/7,相當(dāng)于一個(gè)reiserfs文件系統(tǒng)模塊的大小.當(dāng)然,我也嘗試了2.2以及更老的內(nèi)核,但是他們?nèi)鄙傥倚枰臇|西,因此最后權(quán)衡下來用2.4的內(nèi)核是比較合理的.如果你用的是2.6內(nèi)核的FC系統(tǒng),那么最好還是去下載一個(gè)2.4版的內(nèi)核,www.kernel.org 有各個(gè)時(shí)期的內(nèi)核可以下載.
4, 內(nèi)核的配置
如果你對(duì)linux內(nèi)核的配置和編譯已經(jīng)很熟悉了,請(qǐng)?zhí)^這一段,直接看busybox的編譯.
以root身份登錄系統(tǒng)
進(jìn)入/usr/src/linux目錄
[root@gucuiwen root]# cd /usr/src/linux
如果你下載了一個(gè)2.4版本的內(nèi)核,為了避免麻煩,請(qǐng)將他拷貝到/usr/src下,然后接壓縮,再做一個(gè)指向他的名為linux的鏈接.雖然這并不是必需的,但是根據(jù)我以往的經(jīng)驗(yàn),如果我把linux源代碼放在其他目錄下解開并編譯,偶然會(huì)有一些莫名其妙的小問題發(fā)生.
#cp linux-2.4.20.bz2 /usr/src/
#cd /usr/src
#tar xfvj linux-2.4.20.bz2
如果是tar.gz格式,可以這樣解開
#tar xfvz linux-2.4.20.tar.gz
為了方便,做一個(gè)到目錄linux-2.4.20的連接:
#ln -s linux-2.4.20 linux
進(jìn)入linux源代碼目錄:
#cd linux
清理源代碼樹:
#make mrproper
運(yùn)行配置程序:
#make xconfig
code maturity level options
先選擇N,當(dāng)我們配置好常規(guī)的東西,要加入framebuffer支持時(shí)再將這一項(xiàng)選擇Y,因?yàn)樵?.4.20中,framebuffer支持尚屬于實(shí)驗(yàn)性代碼.如果不在code maturity level options選擇為Y,將不能配置framebuffer.
Loadable module support
選擇N,為了簡化系統(tǒng)的制作,我在這個(gè)項(xiàng)目中不選擇可加載內(nèi)核模塊的支持.
processor type and features
processor family 中選擇你需要的CPU類型,如果你想讓老至386,新到P4的CPU都能運(yùn)行babaylinux那么請(qǐng)選擇386CPU,否則請(qǐng)按自己的實(shí)際情況選擇.
其他選項(xiàng)都選擇N.這些在babylinux中都是不需要的.
General setup
networking support 選擇Y
PCI support 選擇Y 除非你不用PCI設(shè)備,不過一般人都是需要的,因?yàn)楝F(xiàn)在網(wǎng)卡大部分是PCI的.
System V ipc 選擇Y
systrl support選擇Y
kernel support for ELF 選擇Y
其余內(nèi)容都可以選擇N,如果有特殊需求,比如的網(wǎng)卡是ISA的,那么請(qǐng)將相應(yīng)的內(nèi)容選上.但是不能貪心,時(shí)刻牢記,我們能利用的空間只有 1440K ,內(nèi)核的大小絕不能超過 900K,任何不必要的東西都應(yīng)該從內(nèi)核中去除.
memory technology devices (MTD)
Parallel port support
Plug and Play configuration
以上三個(gè)大項(xiàng)中的所有內(nèi)容選擇N
block devices
Normal floppy disk support
Loopback device support
RAM disk support
initial RAM disk (initrd) support
Per partition statics in /proc/partitions
以上幾項(xiàng)選擇Y,其余全部選擇N.
這里的選項(xiàng)比較重要,我想重點(diǎn)說明一下.對(duì)于軟盤的支持,那是不必說的,那是必備的.
loopback device 即回環(huán)設(shè)備,我們平時(shí)用命令
#mount -o loop somecd.ISO /mnt/cdrom
掛裝光盤映象文件,或者其他文件系統(tǒng)映象文件時(shí)就用到了內(nèi)核中的loopback 模塊,如果沒有編譯進(jìn)這個(gè)模塊,你將不能用上面的命令掛裝光盤映象和文件系統(tǒng)映象.[!--empirenews.page--]
個(gè)人認(rèn)為這個(gè)功能是非常重要的,所以編譯了進(jìn)去.
RAM disk support 即內(nèi)存磁盤(比較貼切的說法是虛擬磁盤,即撥出一部分內(nèi)存當(dāng)做磁盤用).這是制作babylinux項(xiàng)目中的核心內(nèi)容,由于一張軟盤的空間有限, babylinux的根文件系統(tǒng)是用gzip壓縮法高度壓縮的,在運(yùn)行時(shí),將解壓縮后的文件拷貝到一個(gè)RAM disk運(yùn)行,所以在運(yùn)行時(shí),你在根文件系統(tǒng)上的所有操作實(shí)際上是在內(nèi)存上進(jìn)行的.但是在形式上和在真正的磁盤上運(yùn)行一樣.只不過放在RAM disk上的所有內(nèi)容會(huì)在系統(tǒng)關(guān)機(jī)后全部消失.
不僅在運(yùn)行babylinux時(shí)用到ramdisk,我們?cè)谥谱鲏嚎s的根文件系統(tǒng)時(shí)也要用到ramdisk,學(xué)習(xí)ramdisk的使用是做一個(gè)babylinux的重要目的之一. 在linux中,還支持另外一種虛擬磁盤,叫做shm,
(shared memory),這種虛擬磁盤機(jī)制比ramdisk更加先進(jìn),ramdisk的大小是固定的,由編譯內(nèi)核時(shí)候的default ram disk size 決定.默認(rèn)為4096K(4M),也可以在內(nèi)核裝載前加上ramdisk_size=參數(shù)來決定他的大小,但是系統(tǒng)一旦啟動(dòng),ramdisk的大小是不能改變的,而shm的大小卻動(dòng)態(tài)的改變.默認(rèn)情況下為物理內(nèi)存的一半,當(dāng)系統(tǒng)需要更多內(nèi)存的時(shí),他就自動(dòng)縮小.系統(tǒng)內(nèi)存富余時(shí),他自動(dòng)增大,這樣可以充分靈活的利用內(nèi)存空間,shm通常用來作為系統(tǒng)的磁盤高速緩存,存放系統(tǒng)運(yùn)行中的臨時(shí)文件等.redaht 的linux在默認(rèn)情況下都有shm的支持,可以用mount和df察看他的掛裝點(diǎn)和大小,如下命令:
[root@gucuiwen linux]# mount
/dev/hda1 on / type ext3 (rw)
none on /proc type proc (rw)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/hda6 on /home type ext3 (rw)
/dev/hda5 on /oracle type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/hda7 on /var type ext3 (rw)
[root@gucuiwen linux]# df -h
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
/dev/hda1 2.9G 2.7G 26M 100% /
/dev/hda6 3.8G 1.8G 1.8G 50% /home
/dev/hda5 5.7G 677M 4.8G 13% /oracle
none 125M 0 125M 0% /dev/shm
/dev/hda7 711M 91M 584M 14% /var
雖然shm有這么多的優(yōu)點(diǎn),我還是選擇了ramdisk,因?yàn)閞amdisk可以很方便地在系統(tǒng)啟動(dòng)的時(shí)候加載,而shm卻沒那么容易,下面就來講一下關(guān)于內(nèi)核啟動(dòng)時(shí)加載ramdisk映象的相關(guān)內(nèi)容.
initial RAM disk (initrd) support
即初始化ramdisk支持,這個(gè)選項(xiàng)讓內(nèi)核有能力在內(nèi)核加載階段就能裝入RAMDISK,并運(yùn)行其中的內(nèi)容,否則只能在系統(tǒng)運(yùn)行階段用ramdisk ,我們平時(shí)在編譯了一個(gè)新內(nèi)核后,如果你的根文件系統(tǒng)用的是ext3,而你沒有把ext3編譯進(jìn)內(nèi)核,而只作為一個(gè)模塊編譯了,那么就需要用 mkinitrd命令做一個(gè)initrd (initializtion ramdisk),這個(gè)ramdisk里放了ext3的模塊,這樣內(nèi)核在加載根文件系統(tǒng)前就能正確識(shí)別ext3文件系統(tǒng).否則,內(nèi)核加載的最后一步就會(huì)出現(xiàn)kernel panic cant not find init .... 的錯(cuò)誤.
在babylinux項(xiàng)目中,這個(gè)選項(xiàng)是必需的,這里的作用是把解壓的根文件系統(tǒng)映象裝入ramdisk.
Per partition statics in /proc/partitions
這個(gè)選項(xiàng)不是必需的,但是我發(fā)現(xiàn)如果我不把這個(gè)功能編譯進(jìn)內(nèi)核,那么當(dāng)我在掛裝文件系統(tǒng)的時(shí)候會(huì)有些小問題,比如我不能以簡寫的掛裝命令來掛裝文件系統(tǒng). 我不確定到底是不是這個(gè)選項(xiàng)的關(guān)系,但是把這個(gè)選項(xiàng)編譯進(jìn)內(nèi)核只增大一點(diǎn)點(diǎn)內(nèi)核空間,所以為了避免麻煩,我把他編譯了進(jìn)去.
Multi-device support (RAID and LVM)
Cryptography support (CryptoAPI)
這兩個(gè)大項(xiàng)全部選擇N,因?yàn)樵趥€(gè)人用PC上,及少牽涉到這兩項(xiàng),如果你真的有RAID設(shè)備或者LVM,那么就自己摸索著配置一下吧.
Networking options
這一大項(xiàng)中,只需要把下列項(xiàng)目編譯進(jìn)內(nèi)核:
Packet socket :mmapped IO
TCP/IP networking
對(duì)于IP:advanced router這項(xiàng),如果你想重點(diǎn)把babylinux用做靜態(tài)路由軟件,那么把這項(xiàng)編譯進(jìn)去,而對(duì)于network packet filtering (replaces ipchains)這一項(xiàng),沒有必要編譯進(jìn)去了,因?yàn)閎usybox沒有提供iptables工具來設(shè)置包過濾防火墻.同樣,unix domain sockets這項(xiàng)也不必選擇,只有運(yùn)行X的情況下才需要選這項(xiàng).
Telephony Support 選擇N
ATA/IDE/MFM/RLL support
選擇Y,然后下面的'IDE,ATA and ATAPI Block Devices'按鈕就被激活
下面幾項(xiàng)請(qǐng)選擇Y,其余都可以是N.
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
Include IDE/ATA-2 DISK support
Auto-Geometry Resizing support
Include IDE/ATA CDROM support
如果你的內(nèi)核要運(yùn)行在一臺(tái)很老的pentium或486上,請(qǐng)把CMD640 chipset bugfix/support編譯進(jìn)去,因?yàn)槟菚r(shí)候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把這項(xiàng)編譯進(jìn)去會(huì)修復(fù)這個(gè)bug.
下面幾個(gè)大項(xiàng):
SCSI support
Fusion MPT device support
IEEE 1394(FireWire) support
I2O device support
全部選擇N,這里可能有你想要的好東西,比如1394接口驅(qū)動(dòng),但是在babylinux上意義不大,而且我們的空間只有1440K.
下面一個(gè)大項(xiàng):
Network device support
選擇Y,這樣就可以支持網(wǎng)卡了,其余都選擇N.然后點(diǎn)Ethernet(10 or 100 Mbit)按鈕選擇你需要的網(wǎng)卡驅(qū)動(dòng),你可以把最常見的幾種Reltek8139,NE2000,3COM等網(wǎng)卡編譯進(jìn)內(nèi)核.雖然網(wǎng)卡的驅(qū)動(dòng)通常都很小, 但是不要太貪心,選2~3個(gè)就足夠了,否則你的內(nèi)核就會(huì)一下子多出幾十K.在我先前編譯的babylinux內(nèi)核中,我把via-rhine網(wǎng)卡編譯了進(jìn)去,是因?yàn)槲掖蛟靊abylinux的機(jī)器上只有一塊那個(gè)芯片的網(wǎng)卡.
如果你發(fā)現(xiàn)你需要的網(wǎng)卡是灰色的,不能點(diǎn),那么先確定他上一級(jí)的選項(xiàng)已經(jīng)點(diǎn)了,比如你想選NE2000的網(wǎng)卡,就必需先選擇ELSA,VLB,PCI and on board controllers.如果還不能點(diǎn),那么請(qǐng)確定是否已經(jīng)把PCI的支持選項(xiàng)選上了,(在Geneal setup)里.沒有PCI的支持,PCI的網(wǎng)卡將不能選.
可能你是個(gè)有錢人,在自己的PC上用千兆網(wǎng)卡,那么請(qǐng)?jiān)谇д拙W(wǎng)卡那一欄選擇.[!--empirenews.page--]
接下來幾個(gè)大項(xiàng):
Amateur Radio support
IrDA (infrared) support
ISDN subsystem
Old CD-ROM drivers (not SCSI,not IDE)
Input core support
全部選擇N.
接下來的Charcter devices是很重要的一項(xiàng),他和Bloack devices一樣重要,我將重點(diǎn)講述.
除了Virtual terminal和Support for console on terminal兩項(xiàng),其他全選N.
Virtual terminal 即虛擬終端,這是一般linux必備選項(xiàng).否則你的linux啟動(dòng)后,在屏幕看不到任何東西.另外還負(fù)責(zé)鍵盤輸入信息等等.只有在某些嵌入式linux應(yīng)用場(chǎng)合才會(huì)不要這個(gè)選項(xiàng),因?yàn)檫@些linux通常都不用操作.
Support for console on terminal
在虛擬終端上的控制臺(tái).他支持在終端上各種信息的輸出,這也是必備的.
接下來的幾個(gè)大項(xiàng):
Multimedia devices
Crypto Hardware support
全部選擇N.
再接下來的那部分File sytems可是重頭戲喔.
這部分不用我太羅嗦了吧,自己需要支持什么就選什么.
但是其中有三個(gè)是你必需選的:
/proc file system support 缺了他,很多命令和軟件就不能運(yùn)行.
Second extended fs support BabyLinux的基本文件系統(tǒng).
ISO 9660 CDROM filesytem support 除非你不想用光盤.
另外,諸如磁盤限額(Quota support),Reiserfs的DEBUG模式(Enable reiserfs debug mode)
等就不用編譯進(jìn)去了.這些東西意義不大,確要無端的增大內(nèi)核大小.請(qǐng)牢記一點(diǎn):編譯出來的內(nèi)核大小不要超過900K.
Tip:是不是看的很累啊,我寫得更累,別急,內(nèi)核配置部分馬上要好了.
最后一個(gè)Console drivers
這是支持linux在字符模式下高分辨率顯示的內(nèi)核模塊.前面三個(gè)全部選擇Y,
Frame-buffer support按鈕是灰色的不能選,別急,回到第一個(gè)大選項(xiàng):
Code maturity level options 選擇Y,就可以激活這個(gè)按鈕了.
下面幾個(gè)選項(xiàng)需要選擇Y:
Support for framebuffer devices
VESA VGA graphics console
你也可以選擇其他的顯卡驅(qū)動(dòng),比如nVidia的,但是VESA和VGA是通用性最好的,只要不是幾十年前的黑白顯卡(我只聽說過,沒見過),都兼容VESA和VGA,因此,為了制作好的BabyLinux的通用性,請(qǐng)選擇這個(gè)驅(qū)動(dòng).
Support only 8 pixels wide fonts
這個(gè)一定要選,否當(dāng)你給內(nèi)核傳遞vga=788參數(shù),讓linux在字符界面下高分辨率顯示的時(shí)候,系統(tǒng)會(huì)因?yàn)檎也坏胶线m的小字體而返回到低分辨率模式.
好了!所有內(nèi)核的配置工作到這里就全部完成了,剩下的幾個(gè)大項(xiàng)全部選N就行了.
保存后退出,配置程序會(huì)自動(dòng)生成一個(gè)隱藏的配置文件.config
下面是我配置好的.config文件內(nèi)容.如果你懶的自己去配置,那么直接把這個(gè).config拷貝到你的源代碼目錄下就能直接用了.(已經(jīng)去掉了#開頭的注釋行)
CONFIG_X86=y
CONFIG_UID16=y
CONFIG_EXPERIMENTAL=y
CONFIG_M586=y
CONFIG_X86_WP_WORKS_OK=y
CONFIG_X86_INVLPG=y
CONFIG_X86_CMPXCHG=y
CONFIG_X86_XADD=y
CONFIG_X86_BSWAP=y
CONFIG_X86_POPAD_OK=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_L1_CACHE_SHIFT=5
CONFIG_X86_USE_STRING_486=y
CONFIG_X86_ALIGNMENT_16=y
CONFIG_X86_PPRO_FENCE=y
CONFIG_NOHIGHMEM=y
CONFIG_NET=y
CONFIG_PCI=y
CONFIG_PCI_GODIRECT=y
CONFIG_PCI_DIRECT=y
CONFIG_SYSVIPC=y
CONFIG_SYSCTL=y
CONFIG_KCORE_ELF=y
CONFIG_BINFMT_ELF=y
CONFIG_BLK_DEV_FD=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
CONFIG_PACKET=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
CONFIG_BLK_DEV_IDEDISK=y
CONFIG_IDEDISK_MULTI_MODE=y
CONFIG_BLK_DEV_IDECD=y
CONFIG_BLK_DEV_IDE_MODES=y
CONFIG_NETDEVICES=y
CONFIG_NET_ETHERNET=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
CONFIG_REISERFS_FS=y
CONFIG_EXT3_FS=y
CONFIG_JBD=y
CONFIG_FAT_FS=y
CONFIG_VFAT_FS=y
CONFIG_RAMFS=y
CONFIG_ISO9660_FS=y
CONFIG_JFS_FS=y
CONFIG_NTFS_FS=y
CONFIG_PROC_FS=y
CONFIG_EXT2_FS=y
CONFIG_MSDOS_PARTITION=y
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_VGA_CONSOLE=y
CONFIG_VIDEO_SELECT=y
CONFIG_VIDEO_IGNORE_BAD_MODE=y
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
CONFIG_FB_VESA=y
CONFIG_VIDEO_SELECT=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
CONFIG_FBCON_CFB24=y
CONFIG_FBCON_CFB32=y
CONFIG_FBCON_FONTWIDTH8_ONLY=y
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
5,編譯內(nèi)核
#make dep
#make bzImage
下面是最后編譯結(jié)果:
Boot sector 512 bytes.
Setup is 4733 bytes.
System is 845 kB
make[1]: Leaving directory `/usr/src/linux-2.4.20-8/arch/i386/boot'
我用上面的配置得到了一個(gè)845k的內(nèi)核.
編譯好的內(nèi)核放在/usr/src/linux-2.4.20-8/arch/i386/boot下.將他拷貝在一個(gè)安全的地方備用.
建立一個(gè)專放babylinux材料的目錄
#mkdir /babylinux
建立一個(gè)做babylinux根文件系統(tǒng)的目錄
#mkdir /babylinux/rootfs
備份內(nèi)核[!--empirenews.page--]
#cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /babylinux/
七,編譯busybox
1,busybox簡介
busybox是一個(gè)集成了一百多個(gè)最常用linux命令和工具的軟件,他甚至還集成了一個(gè)http服務(wù)器和一個(gè)telnet服務(wù)器,而所有這一切功能卻只有區(qū)區(qū)1M左右的大小.我們平時(shí)用的那些linux命令就好比是分力式的電子元件,而busybox就好比是一個(gè)集成電路,把常用的工具和命令集成壓縮在一個(gè)可執(zhí)行文件里,功能基本不變,而大小卻小很多倍,在嵌入式linux應(yīng)用中,busybox有非常廣的應(yīng)用,另外,大多數(shù)linux發(fā)行版的安裝程序中都有busybox的身影,安裝linux的時(shí)候案ctrl+alt+F2就能得到一個(gè)控制臺(tái),而這個(gè)控制臺(tái)中的所有命令都是指向busybox的鏈接.
Busybox的小身材大作用的特性,給制作一張軟盤的linux帶來了及大方便.
2,busybox的用法
可以這樣用busybox
#busybox ls
他的功能就相當(dāng)運(yùn)行l(wèi)s命令
最常用的用法是建立指向busybox的鏈接,不同的鏈接名完成不同的功能.
#ln -s busybox ls
#ln -s busybox rm
#ln -s busybox mkdir
然后分別運(yùn)行這三個(gè)鏈接:
#./ls
#./rm
#./mkdir
就可以分別完成了ls rm 和mkdir命令的功能.雖然他們都指向同一個(gè)可執(zhí)行程序busybox
但是只要鏈接名不同,完成的功能就不同,busybox就是這么的神奇.
很多l(xiāng)inux網(wǎng)站都提供busybox的源代碼下載.目前版本是busybox1.0正式版.
3,配置busybox
busybox的配置程序和linux內(nèi)核菜單配置方式簡直一模一樣.熟悉用make menuconfig方式配置linux內(nèi)核的朋友很容易上手.
#cp busybox-1.00.tar.gz /babylinux
#cd /babylinux
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig
下面是需要編譯進(jìn)busybox的功能選項(xiàng),其他的可以根據(jù)需要自選,但是同樣不要太貪心.
General Configuration應(yīng)該選的選項(xiàng)
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf
Build Options
Build BusyBox as a static binary (no shared libs)
這個(gè)選項(xiàng)是一定要選擇的,這樣才能把busybox編譯成靜態(tài)鏈接的可執(zhí)行文件,運(yùn)行時(shí)才獨(dú)立于其他函數(shù)庫.否則必需要其他庫文件才能運(yùn)行,在單一個(gè)linux內(nèi)核不能使他正常工作.
Installation Options
Don't use /usr
這個(gè)選項(xiàng)也一定要選,否則make install 后busybox將安裝在原系統(tǒng)的/usr下,這將覆蓋掉系統(tǒng)原有的命令.選擇這個(gè)選項(xiàng)后,make install后會(huì)在busybox目錄下生成一個(gè)叫_install的目錄,里面有busybox和指向他的鏈接.
其他選項(xiàng)都是一些linux基本命令選項(xiàng),自己需要哪些命令就編譯進(jìn)去,一般用默認(rèn)的就可以了.
配置好后退出并保存.
4,編譯并安裝busybox
#make
#make install
編譯好后在busybox目錄下生成子目錄_install,里面的內(nèi)容:
drwxr-xr-x 2 root root 4096 11月 24 15:28 bin
lrwxrwxrwx 1 root root 11 11月 24 15:28 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 11月 24 15:28 sbin
其中可執(zhí)行文件busybox在bin目錄下,其他的都是指向他的符號(hào)鏈接.
我編譯出來的busybox可執(zhí)行文件是935K,加上符號(hào)鏈接,整個(gè)_install目錄是952K.加上845K的內(nèi)核不是已經(jīng)超過1440K了嗎?別擔(dān)心,我們將對(duì)整個(gè)根文件系統(tǒng)做大幅度的壓縮.
八,制作根文件系統(tǒng)
1,基本目錄結(jié)構(gòu)
#cd /babylinux/rootfs
#mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是一定要建的,bin和sbin不用建,因?yàn)閎usybox中已經(jīng)有了.
其他的可以象征性的建幾個(gè)就可以了.
拷貝busybox
#cp -R /babylinux/busybox-1.00/_install/* /babylinux/rootfs/
2,建立設(shè)備文件名
#cd /babylinux/rootfs/dev
你可以用mknod手工建立,也可以直接從原系統(tǒng)的/dev目錄下拷貝過來.
手工建立的方法:
#ls -l /dev/console
crw------- 1 root root 5, 1 11月 30 09:02 /dev/console
這樣就查看到了console設(shè)備的主設(shè)備號(hào)是5,輔設(shè)備號(hào)是1,是一個(gè)標(biāo)記為C的字符設(shè)備.
于是,我們可以用mknod建立一個(gè)同樣的設(shè)備文件:
#mknod console c 5 1
但是手工方法建立太麻煩了,通常直接從/dev下把需要的設(shè)備文件拷貝過來.
這些設(shè)備文件是特殊文件,在拷貝時(shí)一定要加上-R參數(shù)才能拷貝.
#cp -R /dev/console ./
#cp -R /dev/null ./
#cp -R /dev/zero ./
...
以下是我認(rèn)為需要的設(shè)備名:
cdrom fd0 hda14 hda4 hdb11 hdb19 hdc hdc16 hdc6 hdd13 hdd3 loop2 ram2
console fd0H1440 hda15 hda5 hdb12 hdb2 hdc1 hdc17 hdc7 hdd14 hdd4 loop3 tty0
fb hda hda16 hda6 hdb13 hdb3 hdc10 hdc18 hdc8 hdd15 hdd5 loop4 tty1
fb0 hda1 hda17 hda7 hdb14 hdb4 hdc11 hdc19 hdd hdd16 hdd6 loop5 tty2
fb1 hda10 hda18 hda8 hdb15 hdb5 hdc12 hdc2 hdd1 hdd17 hdd7 null tty3
fb2 hda11 hda19 hdb hdb16 hdb6 hdc13 hdc3 hdd10 hdd18 hdd8 ram tty4
fb3 hda12 hda2 hdb1 hdb17 hdb7 hdc14 hdc4 hdd11 hdd19 initctl ram0 tty5
fb4 hda13 hda3 hdb10 hdb18 hdb8 hdc15 hdc5 hdd12 hdd2 loop1 ram1 zero
其中,fd0,hda,ram,ram1,tty1,null,zero,loop1,fb0,fb等是必備的.
其它的hda,hda1,hdb等可以根據(jù)實(shí)際需要決定.但是上表中的選擇是比較合理的,即能滿足大部分的需要,有沒有不用的設(shè)備浪費(fèi)空間.注意,千萬不要把/dev下的設(shè)備全拷貝過來,那將產(chǎn)生大約420K的/dev目錄,這對(duì)babylinux來說太大了.
3,建立etc目錄下的配置文件
busybox.conf group inittab motd passwd resolv.conf shadow-
fstab init.d issue mtab profile shadow[!--empirenews.page--]
其中init.d是一個(gè)目錄,從busybox-1.00源代碼目錄下拷貝過來.
#cp -R /babylinux/busybox-1.00/examples/bootflopyp/etc/init.d /babylinux/rootfs/etc/
busybox.conf是一個(gè)空文件.
其他文件的內(nèi)容如下:
fstab
/dev/fd0 / ext2 defaults 0 0
none /proc proc defaults 0 0
/dev/cdrom /mnt/cdrom udf,iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
group
root:x:0:root
inittab
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
tty2::respawn:/bin/getty 38400 tty2
tty3::respawn:/bin/getty 38400 tty3
tty4::respawn:/bin/getty 38400 tty4
# Stuff to do when restarting the init process
::restart:/bin/init
# Stuff to do before rebooting
::ctrlaltdel:/bin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/bin/swapoff -a
issue
Baby Linux release 0.1
motd
mtab
passwd
root::0:0:root:/root:/bin/ash
profile
# /etc/profile: system-wide .profile file for the Bourne shells
echo
echo
export PS1="[\u@\h \w]\$"
echo "Done"
alias ll='ls -l'
alias du='du -h'
alias df='df -h'
alias rm='rm -i'
echo
resolv.conf
nameserver 202.96.209.5
nameserver 202.96.209.6
shadow
root:$1$$adltAB9Sr/MSKqylIvSJT/:12705:0:99999:7:::
shadow-
root:$1$DWU.tenP$B7ANiXoGoiZMwJR6Ih8810:12705:0:99999:7:::
其中有很多是從原系統(tǒng)的/etc下拷貝過來修改的,如果你是一個(gè)具有中等以上水平的linux愛好者,那么應(yīng)該一看就明白了,當(dāng)然,你也可以根據(jù)自己的需要修改這些文件.其中最重要的是fstab和inittab,busybox內(nèi)建的init程序用到的inittab文件的語法和一般的不一樣,不能直接把原系統(tǒng)/etc下inittab文件拷貝過來.可以把busybox-1.00目錄下的示例文件拷貝過來修改用.具體請(qǐng)看busybox的文檔. busybox的init也可以不用inittab.但是在我制作babylinux過程中有一個(gè)非常奇怪的bug.所有/sbin下的busybox鏈接在做成壓縮的根文件系統(tǒng),解壓后都不能正常運(yùn)行,顯示找不到該命令.只有當(dāng)我在/bin下做這些鏈接時(shí)才能運(yùn)行.具體原因還不太清除,所以你需要做下面的工作:
#cd /babylinux/rootfs/sbin
#ls
chroot getty ifconfig losetup pivot_root reboot swapoff sysctl
fdisk halt init mkswap poweroff route swapon telnetd
查看到sbin下有上述鏈接
轉(zhuǎn)到bin下
#cd /babylinux/rootfs/bin
重新做這些鏈接:
#ln -s busybox chroot
#ln -s busybox getty
#ln -s busybox ifconfig
...
然后把sbin下的鏈接刪除,以節(jié)省空間
#rm -rf /babylinux/rootfs/sbin/*
再把原先inittab中所有的sbin改成bin
init.d下的文件:
rcS
請(qǐng)確保這個(gè)文件是可執(zhí)行的,否則請(qǐng)改成可執(zhí)行的:
#chmod u+x rcS
rcS的內(nèi)容:
#! /bin/sh
mount -o remount,rw /
/bin/mount -a
>/etc/mtab
echo
echo
echo
echo
echo -en "\t\tWelcom to \\033[0;32mBabyLinux\\033][0;39m\n"
echo -en "\\033][0;36m\n"
echo
echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\t\t\n"
echo -en "+ This is a tiny linux system based on a floppy.It contains \t\t\n"
echo -en "+ more than 100 basic Linux commands and tools.The kernel of \t\t\n"
echo -en "+ this tiny system support all kinds of normal filesystems. \t\t\n"
echo -en "+ linux ext2,ext3,jfs,reiserfs and windows fat,vfat,ntfs][readonly]\t\t\n"
echo -en "+ is supported! So it is a powerful small system you can use it \t\t\n"
echo -en "+ as a linux and windows rescue disk.Beside this,the kernel also\t\t\n"
echo -en "+ contains the drivers of Reltek8139,NE2000,via-rhine ethernet\t\t\n"
echo -en "+ adpater. you can configure the IPaddress and netmask with tools\t\t\n"
echo -en "+ 'ifconfig' and config the default gateway with command 'route'. \t\t\n"
echo -en "+ Is there anything else? Haha,this is a telnet server build-in\t\t\n"
echo -en "+ you can type 'telnetd' to startd it and thus your friends can\t\t\n"
echo -en "+ logon to your system to help you solve the problem.\t\t\n"
echo -en "+ \\033[0;32mAll these great features are powered by BusyBox 1.0\\033][0;36m\t\t\n"
echo -en "+ This is a free system tool developed by GuCuiwen.\t\t\n"
echo -en "+ RUN YOUR OWN RISK of using it ! if you have any problem please\t\t\n"
echo -en "+ mailto : win2linux@163.com Enjoy!!\t\t\n"
echo -en "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\t\t\n"
echo -en "\\033][0;39m\n"[!--empirenews.page--]
hostname BabyLinux
可以自己作相應(yīng)的修改.
以上是babylinux根文件系統(tǒng)的所有內(nèi)容,他的總大小應(yīng)該在1M左右.
][root@gucuiwen baby]# du -hs
1.1M .
九,制作ramdisk映象文件
babylinux根文件系統(tǒng)所有東西都放在/babylinux/rootfs下,我們將利用ramdisk把這些內(nèi)容做成ramdisk映象文件并壓縮他.
以下主要是ramdisk的用法,看完以下內(nèi)容,你應(yīng)當(dāng)學(xué)會(huì)ramdisk的使用.
[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1
dd: 正在寫入 ‘/dev/ram1’: 設(shè)備上沒有空間
讀入了 8193+0 個(gè)塊
輸出了 8192+0 個(gè)塊
zero是一個(gè)特殊的設(shè)備,表示全部為0的字符塊.上面這條命令的意思是把系統(tǒng)的第一個(gè)ramdisk用全部為0的數(shù)據(jù)填充,因?yàn)閞amdisk默認(rèn)大小為4M,因此當(dāng)讀滿8192個(gè)塊(每塊512字節(jié))后,顯示'設(shè)備上沒空間'.這很正常,/dev/ram1已經(jīng)被填充滿了.
如果指定塊的大小:
[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1 bs=1M count=4
讀入了 4+0 個(gè)塊
輸出了 4+0 個(gè)塊
不會(huì)有錯(cuò)誤提示,這里演示了dd的一般用法,接下來還要頻繁用到dd命令.
在/dev下有很多ramdisk設(shè)備,ram1,ram2,ram3....
一般用第一個(gè)就可以了.
填充后,ram1就有可空間,可以在這個(gè)空間上創(chuàng)見一個(gè)文件系統(tǒng):
[root@gucuiwen babylinux]# mkfs.ext2 -m0 /dev/ram1
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1024 inodes, 4096 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
將ram1掛裝到文件系統(tǒng)中:
先建立一個(gè)掛裝點(diǎn):
#mkdir /mnt/ram
掛上ram1:
#mount /dev/ram1 /mnt/ram
將先前做好的babylinux根文件系統(tǒng)拷貝到ram1上.
#cp -R /babylinux/rootfs/* /mnt/ram
做完以上幾步,你應(yīng)就白了ramdisk設(shè)備的含義,他是和hda1,hdb1,一樣的塊設(shè)備,用mount掛到文件系統(tǒng)下后就可以訪問,往里放東西,但是所有的東西在內(nèi)存上.關(guān)機(jī)將丟失所有東西.
拷貝好babylinux根文件系統(tǒng)后卸載ram1:
#umount /dev/ram1
這時(shí),雖然不能通過/mnt/ram這個(gè)掛裝點(diǎn)訪問ram1中的內(nèi)容了,但是他卻切切實(shí)實(shí)得在內(nèi)存中存在.
再用dd把這個(gè)ram1以映象方式取出來:
[root@gucuiwen babylinux]# dd if=/dev/ram1 of=/babylinux/ramdisk.img
讀入了 8192+0 個(gè)塊
輸出了 8192+0 個(gè)塊
驗(yàn)證一下取出來的內(nèi)容:
[root@gucuiwen babylinux]# file ramdisk.img
ramdisk.img: Linux rev 1.0 ext2 filesystem data
他是一個(gè)ext2 文件系統(tǒng),類似一個(gè)ISO光盤映象文件.
因次,我們可以用loop設(shè)備來把他重新掛裝到文件系統(tǒng)里:
[root@gucuiwen babylinux]# mount -o loop ramdisk.img /mnt/ram/
為了方便,我仍舊把他掛在/mnt/ram下,因此,在先前一定要把/dev/ram1 umount掉
查看/mnt/ram下的內(nèi)容,他應(yīng)該和/babylinux/rootfs下的一模一樣,否則就是出錯(cuò)了:
[root@gucuiwen babylinux]# ls /mnt/ram
bin dev etc home lost+found mnt proc root sbin tmp usr var
這樣,我們就得到了一個(gè)ramdisk根文件系統(tǒng)映象:ramdisk.img
把他umount掉:
#umount /mnt/ram
如果是第一次接觸ramdisk,你可能對(duì)上述的內(nèi)容很迷惑,如果這樣,請(qǐng)反復(fù)閱讀和理解上面的內(nèi)容,自己多動(dòng)手做幾次試驗(yàn),就可以理解.
壓縮ramdisk.img印象文件:
[root@gucuiwen babylinux]# gzip -v9 ramdisk.img
ramdisk.img: 87.9% -- replaced with ramdisk.img.gz
查看壓縮后的大小:
[root@gucuiwen babylinux]# ls -lh ramdisk.img.gz
-rw-r--r-- 1 root root 495K 11月 30 11:32 ramdisk.img.gz
我得到的壓縮ramdisk映象文件安是495K. 加上內(nèi)核的845K,是1340K
符合公式:
內(nèi)核大小+文件系統(tǒng)壓縮印象文件+50K <= 1440K
如果你做出來的kernel和ramdisk.img.gz太大了,請(qǐng)重新制作kernel或ramdisk.img.gz,在其中做一些取舍,如果你的 kernel和ramdisk.img.gz太小了,那么可以再往里面添加一些內(nèi)容,使你的babylinux功能更強(qiáng).
十,內(nèi)核與busybox的整合
準(zhǔn)備一張完好的空白軟盤
創(chuàng)建一個(gè)比內(nèi)核大小略大的文件系統(tǒng):
比如內(nèi)核大小是845K,那么我我創(chuàng)見一個(gè)920K的文件系統(tǒng):
#mkfs.ext2 -m0 /dev/fd0 920
如果空間允許,還可以再大一些,但是必需保證
1440K-文件系統(tǒng)大小>=ramdisk.img.gz的大小.
掛上軟盤
#mount /dev/fd0
將內(nèi)核拷貝到軟盤:
#cp /babylinux/bzImage /mnt/floppy/
將lilo引導(dǎo)文件安boot.b 拷貝到軟盤
#cp /boot/boot.b /mnt/floppy
新建一個(gè)lilo.conf 配置文件:
prompt
timeout=60
default=linux
boot=/dev/fd0
map=/mnt/floppy/map
install=/mnt/floppy/boot.b
linear
image=/mnt/floppy/bzImage
label=linux
read-only
vga=788
root=/dev/fd0
append="load_ramdisk=1 ramdisk_start=940"
vga=788表示讓內(nèi)核支持字符界面的高分辨率顯示,你可以改成vga=ask,這樣可以在啟動(dòng)的時(shí)候選擇分辨率.[!--empirenews.page--]
紅色一行是關(guān)鍵,load_ramdisk=1告訴內(nèi)核在啟動(dòng)的時(shí)候轉(zhuǎn)載壓縮的ramdisk印象文件,
ramdisk_start=940 告訴內(nèi)核從軟盤的第940K的地方去尋找并裝載壓縮的ramdisk印象文件.
關(guān)于ramdisk的用法和更多參數(shù)請(qǐng)查看linux0內(nèi)核文檔/usr/src/linux/Documents/ramdisk.txt
接下來再用dd命令把ramdisk.img.gz裝到軟盤上.
#dd if=/babylinux/ramdisk.img.gz of=/dev/fd0 bs=1k seek=940
這里的seek=940 表示把ramdisk.img.gz裝到軟盤的第940K開始的地方.
詳細(xì)內(nèi)容請(qǐng)看dd的聯(lián)機(jī)文檔 man dd
為什么要從940k開始呢?
因?yàn)閯偛抛髁艘粋€(gè)920K的文件系統(tǒng).我把他裝在文件系統(tǒng)20K以后的地方.
當(dāng)然,如果你的空間十分緊張,連這20K都不舍得浪費(fèi),那么可以這樣:
#dd if=/babylinux/ramdisk.img.gz of=/dev/fd0 bs=1k seek=921
當(dāng)然,別忘記修改lilo.conf文件. ramdisk_start=921
接下來裝lilo引導(dǎo)程序就大功告成了.
#lilo -C lilo.conf
如果你的磁盤上還有一點(diǎn)點(diǎn)空余空間,那么可以把lilo.conf也拷貝上去,以備將來使用.
#cp lilo.conf /mnt/floppy
#umount /dev/fd0
整個(gè)工程已經(jīng)完成了,你可以重新啟動(dòng)機(jī)器,設(shè)置電腦從軟盤啟動(dòng).看看有沒有成功.
十一,安裝測(cè)試和內(nèi)容調(diào)整
如果在整合內(nèi)核和ramdisk映象過程中,出現(xiàn)磁盤空間不夠的情況,請(qǐng)重新編譯內(nèi)核和busybox
可以根據(jù)實(shí)際需要,調(diào)整內(nèi)核和busybox,比如你要內(nèi)核支持很多東西,但是只需要一個(gè)支持50個(gè)命令的busybox,那么可以自己做相應(yīng)調(diào)整.
十二,babylinux中的BUG
有些命令的輸出結(jié)果會(huì)有偏差,比如用 busybox的df 看磁盤使用情況,和實(shí)際的不一樣.
十三,接下來要做的事情
做一個(gè)基于64M U盤的linux小系統(tǒng).
計(jì)劃支持如下特征:
a.軟盤babylinux的所有功能
b.圖形界面的支持.
c.一個(gè)輕量級(jí)的窗口管理器(window maker)
d.網(wǎng)絡(luò)的支持,
e.至少一個(gè)圖形web瀏覽器,可以上網(wǎng).
f.一個(gè)音樂播放器和一個(gè)視頻播放器.
g.支持中文的顯示和輸入.
h.可以修改配置并保存數(shù)據(jù)