最小Linux系統制作例程
1,編譯前的規劃和準備
在編譯內核前,請先確定你的需求,把你的需求羅列成一張詳細的表格.你需要讓內核支持什么硬件,支持多少種分區類(lèi)型和文件系統,支持哪些網(wǎng)卡,支持哪些網(wǎng)絡(luò )協(xié)議.等等.請盡可能詳細的羅列這些內容,但是你也不要太貪心,因為你所有能利用的空間只有1440K,如果你編譯出一個(gè)大于1440K或很接近這個(gè)數字的內核,你的這個(gè)項目就不能完成了,你已經(jīng)沒(méi)有空間再放ramdisk映象文件,除非你原意再多出一張軟盤(pán),做一個(gè)兩張軟盤(pán)的小linux系統.對于聲卡驅動(dòng)之類(lèi),我勸你還是放棄吧,因為一個(gè)聲卡驅動(dòng)也許只讓你的內核增大了十多K,但是你有了一個(gè)聲卡驅動(dòng)就務(wù)必要有一個(gè)播放器吧,否則聲卡驅動(dòng)就沒(méi)有意義,可一個(gè)播放器的大小可不是一張軟盤(pán)可以裝得下的.在我先前制作的babylinux內核有900多K,其中,文件系統部分站了大部分,因為我的目標是把他做成一個(gè)系統修復盤(pán).因此我在內核中編譯7種文件系統的支持,每減少一個(gè)文件系統就可以減小幾十甚至200多K的內核大小.越是復雜,越是安全的文件系統,其支持模塊也越大,比如在linux下FAT模塊只有32K,VFAT只有17K,但是ext3的模塊就有86K,JFS達到216K, reiserfs模塊是224K,可以想像,編譯一個(gè)支持7個(gè)文件系統的900多K的內核,文件系統部分就占了600K以上的空間,所以如果某一個(gè)文件系統是你根本不用的,那么還是不要編譯進(jìn)內核把,這樣至少可以省下100多K的空間.對于其他的驅動(dòng),比如網(wǎng)卡,通常大小只有8,9K,最大的也不過(guò)10多 K,因此可以把常用的網(wǎng)卡芯片的驅動(dòng)都編譯進(jìn)去.另外如果你想讓你的babylinux支持U盤(pán),那么scsi的驅動(dòng)模塊也是不可小看的,他通常要接近 150K,因為U盤(pán)是被當做scsi設備來(lái)驅動(dòng)的.另外你還需要讓你的內核支持即插即用,這些都是不小的空間開(kāi)銷(xiāo),我的建議是你放棄一兩個(gè)你不用的文件系統.總之,你最后編譯出來(lái)的內核大小最好不要超過(guò)900K,否則你在busybox里只能編譯進(jìn)去很少的命令.
在我編譯的busybox中,我編譯進(jìn)去120多個(gè)命令,基本上把busybox支持的命令都包括進(jìn)去了.加上小系統所必需的文件系統目錄,/dev下的設備文件,以及/etc下幾個(gè)必需的配置文件,做成ramdisk壓縮后的大小是440多K, 加上900K左右的內核剛好可以放入一張1440K軟盤(pán),請注意,你應該留下至少50K的空間,因為我們要在軟盤(pán)上創(chuàng )建一個(gè)ext2文件系統,而文件系統本生需要占據大概25K的磁盤(pán)空間.另外lilo的引導文件boot.b的大小是5.7K,還有裝上lilo后自動(dòng)產(chǎn)生的map文件也要10多K的空間, map文件的具體大小由內核安裝的實(shí)際大小決定,通常不會(huì )超過(guò)30K.
綜上所述,請遵循下面的公式:
內核大小+文件系統壓縮印象文件+50K = 1440K
另外一點(diǎn)需要說(shuō)明的是:以上所羅列的文件系統模塊大小是察看我現在使用的Redhat 9 的
/lib/modules下的模塊文件得到的,實(shí)際編譯進(jìn)內核大小會(huì )小一點(diǎn),因為我們用make bzImage
在內核源代碼目錄樹(shù)下生成的內核是經(jīng)過(guò)壓縮過(guò)的.
如果你對以上說(shuō)的內容不太明白也沒(méi)有關(guān)系,我會(huì )在下面的內容中做詳細的說(shuō)明.
2,必需編譯進(jìn)內核的內容
首先,我們制作的這個(gè)小系統是基于一張軟盤(pán)的,因此,你的內核必需支持軟盤(pán).另外對IDE硬盤(pán)和cdrom的支持也是不可少的,否則做出來(lái)的 babylinux就沒(méi)有實(shí)用價(jià)值,因為他不能訪(fǎng)問(wèn)硬盤(pán)和光盤(pán)上的內容這樣的linux雖然可以做的更小,但是制造一個(gè)完全沒(méi)有用的東西是浪費時(shí)間.其他的包括framebuffer等,如果你需要支持在字符界面下以高分辨率顯示,以看到更多的屏幕內容,那么就必需把framebuffer支持編譯進(jìn)內核,此外在高分辨率下使用的8x8字體也必需編譯進(jìn)去.否則即使你給內核傳遞了vga= 參數,內核會(huì )因為沒(méi)有可用的小字體而自動(dòng)轉跳到低分辨率模式下,這是以前困擾我好幾天想不明白的事情,后來(lái)通過(guò)反復試驗才明白原來(lái)是缺少字體的文體.這里我先大致提一下需要注意的事情.在下一小節具體編譯時(shí),我會(huì )繼續就某些細節問(wèn)題說(shuō)明.
3,關(guān)于內核的版本
我是在Redhat 9 linux系統下打造的babylinux小系統.使用的是Redhat 9 自帶的2.4.20版的內核.
為什么我不用最新的2.6的內核?
一開(kāi)始我也企圖用最新的內核,但是通過(guò)試驗我發(fā)現,在用最新的2.6.9內核的情況下,我編譯一個(gè)all-no的(即所有內容都選N,不支持任何硬件,只有一個(gè)最基本的內核)最小化內核就要460K左右,如果我在這個(gè)基礎上再加入幾種文件系統和必要的驅動(dòng),那么內核的大小就不能裝下一張1440K
的軟盤(pán),而我用2.4.20的內核編譯一個(gè)最小化的內核只需要217K,的大小.如果優(yōu)化了gcc參數他還能再小些.這樣我就立即省下了200多K的空間,在平時(shí),200多K的內容微不足道,但是在babylinux里,這個(gè)數目是整個(gè)空間的 1/7,相當于一個(gè)reiserfs文件系統模塊的大小.當然,我也嘗試了2.2以及更老的內核,但是他們缺少我需要的東西,因此最后權衡下來(lái)用2.4的內核是比較合理的.如果你用的是2.6內核的FC系統,那么最好還是去下載一個(gè)2.4版的內核,www.kernel.org 有各個(gè)時(shí)期的內核可以下載.
4, 內核的配置
如果你對linux內核的配置和編譯已經(jīng)很熟悉了,請跳過(guò)這一段,直接看busybox的編譯.
以root身份登錄系統
進(jìn)入/usr/src/linux目錄
[root@gucuiwen root]# cd /usr/src/linux
如果你下載了一個(gè)2.4版本的內核,為了避免麻煩,請將他拷貝到/usr/src下,然后接壓縮,再做一個(gè)指向他的名為linux的鏈接.雖然這并不是必需的,但是根據我以往的經(jīng)驗,如果我把linux源代碼放在其他目錄下解開(kāi)并編譯,偶然會(huì )有一些莫名其妙的小問(wèn)題發(fā)生.
#cp linux-2.4.20.bz2 /usr/src/
#cd /usr/src
#tar xfvj linux-2.4.20.bz2
如果是tar.gz格式,可以這樣解開(kāi)
#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
清理源代碼樹(shù):
#make mrproper
運行配置程序:
#make xconfig
code maturity level options
先選擇N,當我們配置好常規的東西,要加入framebuffer支持時(shí)再將這一項選擇Y,因為在2.4.20中,framebuffer支持尚屬于實(shí)驗性代碼.如果不在code maturity level options選擇為Y,將不能配置framebuffer.
Loadable module support
選擇N,為了簡(jiǎn)化系統的制作,我在這個(gè)項目中不選擇可加載內核模塊的支持.
processor type and features
processor family 中選擇你需要的CPU類(lèi)型,如果你想讓老至386,新到P4的CPU都能運行babaylinux那么請選擇386CPU,否則請按自己的實(shí)際情況選擇.
其他選項都選擇N.這些在babylinux中都是不需要的.
General setup
networking support 選擇Y
PCI support 選擇Y 除非你不用PCI設備,不過(guò)一般人都是需要的,因為現在網(wǎng)卡大部分是PCI的.
System V ipc 選擇Y
systrl support選擇Y
kernel support for ELF 選擇Y
其余內容都可以選擇N,如果有特殊需求,比如的網(wǎng)卡是ISA的,那么請將相應的內容選上.但是不能貪心,時(shí)刻牢記,我們能利用的空間只有 1440K ,內核的大小絕不能超過(guò) 900K,任何不必要的東西都應該從內核中去除.
memory technology devices (MTD)
Parallel port support
Plug and Play configuration
以上三個(gè)大項中的所有內容選擇N
block devices
Normal floppy disk support
Loopback device support
RAM disk support
initial RAM disk (initrd) support
Per partition statics in /proc/partitions
以上幾項選擇Y,其余全部選擇N.
這里的選項比較重要,我想重點(diǎn)說(shuō)明一下.對于軟盤(pán)的支持,那是不必說(shuō)的,那是必備的.
loopback device 即回環(huán)設備,我們平時(shí)用命令
#mount -o loop somecd.ISO /mnt/cdrom
掛裝光盤(pán)映象文件,或者其他文件系統映象文件時(shí)就用到了內核中的loopback 模塊,如果沒(méi)有編譯進(jìn)這個(gè)模塊,你將不能用上面的命令掛裝光盤(pán)映象和文件系統映象.
個(gè)人認為這個(gè)功能是非常重要的,所以編譯了進(jìn)去.
RAM disk support 即內存磁盤(pán)(比較貼切的說(shuō)法是虛擬磁盤(pán),即撥出一部分內存當做磁盤(pán)用).這是制作babylinux項目中的核心內容,由于一張軟盤(pán)的空間有限, babylinux的根文件系統是用gzip壓縮法高度壓縮的,在運行時(shí),將解壓縮后的文件拷貝到一個(gè)RAM disk運行,所以在運行時(shí),你在根文件系統上的所有操作實(shí)際上是在內存上進(jìn)行的.但是在形式上和在真正的磁盤(pán)上運行一樣.只不過(guò)放在RAM disk上的所有內容會(huì )在系統關(guān)機后全部消失.
不僅在運行babylinux時(shí)用到ramdisk,我們在制作壓縮的根文件系統時(shí)也要用到ramdisk,學(xué)習r(shí)amdisk的使用是做一個(gè)babylinux的重要目的之一. 在linux中,還支持另外一種虛擬磁盤(pán),叫做shm,
(shared memory),這種虛擬磁盤(pán)機制比ramdisk更加先進(jìn),ramdisk的大小是固定的,由編譯內核時(shí)候的default ram disk size 決定.默認為4096K(4M),也可以在內核裝載前加上ramdisk_size=參數來(lái)決定他的大小,但是系統一旦啟動(dòng),ramdisk的大小是不能改變的,而shm的大小卻動(dòng)態(tài)的改變.默認情況下為物理內存的一半,當系統需要更多內存的時(shí),他就自動(dòng)縮小.系統內存富余時(shí),他自動(dòng)增大,這樣可以充分靈活的利用內存空間,shm通常用來(lái)作為系統的磁盤(pán)高速緩存,存放系統運行中的臨時(shí)文件等.redaht 的linux在默認情況下都有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
文件系統 容量 已用 可用 已用% 掛載點(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,因為ramdisk可以很方便地在系統啟動(dòng)的時(shí)候加載,而shm卻沒(méi)那么容易,下面就來(lái)講一下關(guān)于內核啟動(dòng)時(shí)加載ramdisk映象的相關(guān)內容.
initial RAM disk (initrd) support
即初始化ramdisk支持,這個(gè)選項讓內核有能力在內核加載階段就能裝入RAMDISK,并運行其中的內容,否則只能在系統運行階段用ramdisk ,我們平時(shí)在編譯了一個(gè)新內核后,如果你的根文件系統用的是ext3,而你沒(méi)有把ext3編譯進(jìn)內核,而只作為一個(gè)模塊編譯了,那么就需要用 mkinitrd命令做一個(gè)initrd (initializtion ramdisk),這個(gè)ramdisk里放了ext3的模塊,這樣內核在加載根文件系統前就能正確識別ext3文件系統.否則,內核加載的最后一步就會(huì )出現kernel panic cant not find init .... 的錯誤.
在babylinux項目中,這個(gè)選項是必需的,這里的作用是把解壓的根文件系統映象裝入ramdisk.
Per partition statics in /proc/partitions
這個(gè)選項不是必需的,但是我發(fā)現如果我不把這個(gè)功能編譯進(jìn)內核,那么當我在掛裝文件系統的時(shí)候會(huì )有些小問(wèn)題,比如我不能以簡(jiǎn)寫(xiě)的掛裝命令來(lái)掛裝文件系統. 我不確定到底是不是這個(gè)選項的關(guān)系,但是把這個(gè)選項編譯進(jìn)內核只增大一點(diǎn)點(diǎn)內核空間,所以為了避免麻煩,我把他編譯了進(jìn)去.
Multi-device support (RAID and LVM)
Cryptography support (CryptoAPI)
這兩個(gè)大項全部選擇N,因為在個(gè)人用PC上,及少牽涉到這兩項,如果你真的有RAID設備或者LVM,那么就自己摸索著(zhù)配置一下吧.
Networking options
這一大項中,只需要把下列項目編譯進(jìn)內核:
Packet socket :mmapped IO
TCP/IP networking
對于IP:advanced router這項,如果你想重點(diǎn)把babylinux用做靜態(tài)路由軟件,那么把這項編譯進(jìn)去,而對于network packet filtering (replaces ipchains)這一項,沒(méi)有必要編譯進(jìn)去了,因為busybox沒(méi)有提供iptables工具來(lái)設置包過(guò)濾防火墻.同樣,unix domain sockets這項也不必選擇,只有運行X的情況下才需要選這項.
Telephony Support 選擇N
ATA/IDE/MFM/RLL support
選擇Y,然后下面的'IDE,ATA and ATAPI Block Devices'按鈕就被激活
下面幾項請選擇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
如果你的內核要運行在一臺很老的pentium或486上,請把CMD640 chipset bugfix/support編譯進(jìn)去,因為那時(shí)候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把這項編譯進(jìn)去會(huì )修復這個(gè)bug.
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論