新聞中心

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

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

作者: 時(shí)間:2011-05-27 來源:網(wǎng)絡(luò) 收藏
六,編譯一個(gè)linux內(nèi)核

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

  1,編譯前的規(guī)劃和準(zhǔn)備

  在編譯內(nèi)核前,請先確定你的需求,把你的需求羅列成一張?jiān)敿?xì)的表格.你需要讓內(nèi)核支持什么硬件,支持多少種分區(qū)類型和文件,支持哪些網(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.對于聲卡驅(qū)動之類,我勸你還是放棄吧,因?yàn)橐粋€(gè)聲卡驅(qū)動也許只讓你的內(nèi)核增大了十多K,但是你有了一個(gè)聲卡驅(qū)動就務(wù)必要有一個(gè)播放器吧,否則聲卡驅(qū)動就沒有意義,可一個(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ū)動,比如網(wǎng)卡,通常大小只有8,9K,最大的也不過10多 K,因此可以把常用的網(wǎng)卡芯片的驅(qū)動都編譯進(jìn)去.另外如果你想讓你的babylinux支持U盤,那么scsi的驅(qū)動模塊也是不可小看的,他通常要接近 150K,因?yàn)閁盤是被當(dāng)做scsi設(shè)備來驅(qū)動的.另外你還需要讓你的內(nèi)核支持即插即用,這些都是不小的空間開銷,我的建議是你放棄一兩個(gè)你不用的文件系統(tǒng).總之,你最后編譯出來的內(nèi)核大小最好不要超過900K,否則你在busybox里只能編譯進(jìn)去很少的命令.

  在我編譯的busybox中,我編譯進(jìn)去120多個(gè)命令,基本上把busybox支持的命令都包括進(jìn)去了.加上小系統(tǒng)所必需的文件系統(tǒng)目錄,/dev下的設(shè)備文件,以及/etc下幾個(gè)必需的配置文件,做成ramdisk壓縮后的大小是440多K, 加上900K左右的內(nèi)核剛好可以放入一張1440K軟盤,請注意,你應(yīng)該留下至少50K的空間,因?yàn)槲覀円谲洷P上創(chuàng)建一個(gè)ext2文件系統(tǒng),而文件系統(tǒng)本生需要占據(jù)大概25K的磁盤空間.另外lilo的引導(dǎo)文件boot.b的大小是5.7K,還有裝上lilo后自動產(chǎn)生的map文件也要10多K的空間, map文件的具體大小由內(nèi)核安裝的實(shí)際大小決定,通常不會超過30K.

  綜上所述,請遵循下面的公式:

  內(nèi)核大小+文件系統(tǒng)壓縮印象文件+50K = 1440K

  另外一點(diǎn)需要說明的是:以上所羅列的文件系統(tǒng)模塊大小是察看我現(xiàn)在使用的Redhat 9 的

  /lib/modules下的模塊文件得到的,實(shí)際編譯進(jìn)內(nèi)核大小會小一點(diǎn),因?yàn)槲覀冇胢ake bzImage

  在內(nèi)核源代碼目錄樹下生成的內(nèi)核是經(jīng)過壓縮過的.

  如果你對以上說的內(nèi)容不太明白也沒有關(guān)系,我會在下面的內(nèi)容中做詳細(xì)的說明.

  2,必需編譯進(jìn)內(nèi)核的內(nèi)容

  首先,我們的這個(gè)小系統(tǒng)是基于一張軟盤的,因此,你的內(nèi)核必需支持軟盤.另外對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)核會因?yàn)闆]有可用的小字體而自動轉(zhuǎn)跳到低分辨率模式下,這是以前困擾我好幾天想不明白的事情,后來通過反復(fù)試驗(yàn)才明白原來是缺少字體的文體.這里我先大致提一下需要注意的事情.在下一小節(jié)具體編譯時(shí),我會繼續(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ū)動,那么內(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)核的配置

  如果你對linux內(nèi)核的配置和編譯已經(jīng)很熟悉了,請?zhí)^這一段,直接看busybox的編譯.

  以root身份登錄系統(tǒng)

  進(jìn)入/usr/src/linux目錄

  [root@gucuiwen root]# cd /usr/src/linux

  如果你下載了一個(gè)2.4版本的內(nèi)核,為了避免麻煩,請將他拷貝到/usr/src下,然后接壓縮,再做一個(gè)指向他的名為linux的鏈接.雖然這并不是必需的,但是根據(jù)我以往的經(jīng)驗(yàn),如果我把linux源代碼放在其他目錄下解開并編譯,偶然會有一些莫名其妙的小問題發(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那么請選擇386CPU,否則請按自己的實(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的,那么請將相應(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)說明一下.對于軟盤的支持,那是不必說的,那是必備的.

  loopback device 即回環(huán)設(shè)備,我們平時(shí)用命令

  #mount -o loop somecd.ISO /mnt/cdrom

  掛裝光盤映象文件,或者其他文件系統(tǒng)映象文件時(shí)就用到了內(nèi)核中的loopback 模塊,如果沒有編譯進(jìn)這個(gè)模塊,你將不能用上面的命令掛裝光盤映象和文件系統(tǒng)映象.

  個(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)容會在系統(tǒng)關(guān)機(jī)后全部消失.

  不僅在運(yùn)行babylinux時(shí)用到ramdisk,我們在制作壓縮的根文件系統(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)一旦啟動,ramdisk的大小是不能改變的,而shm的大小卻動態(tài)的改變.默認(rèn)情況下為物理內(nèi)存的一半,當(dāng)系統(tǒng)需要更多內(nèi)存的時(shí),他就自動縮小.系統(tǒng)內(nèi)存富余時(shí),他自動增大,這樣可以充分靈活的利用內(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)啟動的時(shí)候加載,而shm卻沒那么容易,下面就來講一下關(guān)于內(nèi)核啟動時(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)前就能正確識別ext3文件系統(tǒng).否則,內(nèi)核加載的最后一步就會出現(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í)候會有些小問題,比如我不能以簡寫的掛裝命令來掛裝文件系統(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

  對于IP:advanced router這項(xiàng),如果你想重點(diǎn)把babylinux用做靜態(tài)路由軟件,那么把這項(xiàng)編譯進(jìn)去,而對于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)請選擇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)行在一臺很老的pentium或486上,請把CMD640 chipset bugfix/support編譯進(jìn)去,因?yàn)槟菚r(shí)候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把這項(xiàng)編譯進(jìn)去會修復(fù)這個(gè)bug.

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

上一頁 1 2 下一頁

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

評論


相關(guān)推薦

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

關(guān)閉