BabyLinux製做過程詳解

轉:http://www.360doc.com/content/05/0915/14/1429_12641.shtmlhtml

 

BabyLinux製做過程詳解

做者:GuCuiwen email:win2linux@163.com

版權聲明:
本文檔能夠在網絡上在非商業範圍內自由轉載,轉載請註明出處
若是轉載版面包含商業廣告,請向做者支付至少每千字100園的稿費
以書面,書籍形式轉載和出版請按至少每千字100園人民幣的標準向做者支付稿費

一,什麼是BabyLinux
二,爲何要作這樣一個linux
三,什麼人適合讀這篇文檔
四,應該具有的知識
五,linux系統引導過程簡介
六,編譯內核
七,編譯busybox
八,製做根文件系統
九,製做ramdisk映象文件
十,內核與busybox的整合
十一,安裝測試和內容調整
十二,babylinux中的BUG
十三,接下來要作的事情
十四,參考文獻

一,什麼是BabyLinux

BabyLinux 不是一個完整的發行版,他是利用原有的一套完整的linux系統的內核原代碼和編譯工具,利用busybox內建的強大功能,在一張軟盤上作的一個很小的 linux系統.他具有一個linux系統的基本特徵,支持linux系統最經常使用的一百多個命令,支持多種文件系統,支持網絡等等,你能夠把他當作一張 linux起動盤和修復盤來用,你也能夠把他當作一個靜態路由的路由器軟件,固然,你也能夠把他當作一個linux玩具,向你的朋友炫耀linux能夠作 的多麼小.我把他叫作BabyLinux由於他很小巧,小的很可愛,像一個剛剛出生的小baby.

二,爲何要做這樣一個linux

先 說說我一開始的想法,當我一開始接觸linux的時候,看到書上說,linux一般安裝只須要60M左右的空間,可是我發現裝在我硬盤上的Redhat 6.0確要佔據好幾百M的空間.爲何個人linux這麼大呢? 後來我發現,裝在我機器上的那麼多東西只有不到30%是我平時經常使用的,還有30%是我極少用到的,另外的40%基本上是不用的.因而,我和大多數初學者一 樣,開始抱怨,爲何linux不能作的精簡一點呢?因而,我萌發了本身裁減系統的想法.惋惜那個時候我尚未據說過有LFS和Debain.等到我積累 了足夠的linux知識後,我開始製做這樣一個小系統.
製做這樣一個小系統最大的意義在於,你能夠經過製做系統瞭解linux的啓動過程,學會 ramdisk的使用,讓你在短期內學到更多的linux知識.固然,你會獲得很大的樂趣.這個項目只是作一個具備基本特徵的linux系統,若是你想 本身作一個具備完整功能的linux,請閱讀Linux From Scratch (LFS)文檔.

三,什麼人適合讀這篇文檔

如 果你是一個linux愛好者,而且很想了解linux的啓動過程和系統的基本結構,並且是一個喜歡動手研究小玩意的人,那麼這個文檔能夠知足你的需求.如 果你僅僅是用linux來作一些普通的平常工做,而不在意你的linux到底怎麼工做,那麼這份文檔也許不太適合你.另外,若是你是linux愛好者,但 是目前仍是一個剛剛入門的newbi,我建議你先把linux命令學好.不過我想我會盡量的把這份文檔寫詳細一些,若是你有足夠的毅力,或許一個 newbi也能成功作一個babylinux.或者,你遇到一件很不巧的事情,好比你的老婆來例假了,你的這個週末就泡湯了,那麼閱讀這篇文檔並作一個 linux小玩具能夠打發你的時間.

四,應該具有的知識

在作一個babylinux以前,你應當已經會應用linux最 經常使用的命令.而且至少有一次成功編譯並安裝系統內核的經歷,會經過編譯源代碼來安裝軟件.若是你具有了這些條件,那麼作這樣一個小系統會很順利,若是你還 沒有掌握這些知識,你可能會遇到一些困難.可是隻要有毅力,也能夠成功.你不須要具有編程的知識,由於個人目標是:讓具備中等以上linux水平的愛好者 能夠經過閱讀文檔輕鬆完成這個項目.關於一張軟盤上的linux還有一個很著名的linux叫LOAP (Linux On A
Floppy) 可是他是由比較專業的人員須要編寫不少程序完成的.並且沒有關於他製做過程的文檔.

五,linux系統引導過程簡介

首 先,主板的BIOS會讀取硬盤的主引導記錄(MBR),MBR中存放的是一段很小的程序,他的功能是從硬盤讀取操做系統核心文件並運行,由於這個小程序太 小了,所以一般這個小程序不具有直接引導系統內核的能力,他先去引導另外一個稍微大一點的小程序,再由這個大一點的小程序去引導系統內核.在linux系統 中這樣的小程序有LILO和GRUB.在這個項目中,我決定用LILO來作系統引導程序.在軟盤上啓動linux系統的過程和在硬盤上啓動的過程類似.

Linux系統內核被引導程序裝入內核並運行後,linux內核會檢測系統中的各類硬件.並作好各類硬件的初始化工做,使他們在系統正式運行後能正常工做.以後內核作的最後一個工做是運行
/sbin 下的init程序,init是英文單詞initialization(初始化)的簡稱,init程序的工做是讀取/etc/inittab文件中描述的指 令,對系統的各類軟硬件環境作最初化設定.最後運行mingetty等待用戶輸入用戶名登陸系統.全部的工做就這麼簡單,雖然linux啓動的時候有不少 內容,看上去十分高深,可是都不過是對這個過程的擴充.明白了這個道理,你能夠寫一些腳本程序讓他在系統啓動的特定時間運行完成任務.事實上系統內核並不 關心/sbin下的init是否是真的init,只要是放在/sbin下名叫init的可執行程序他均可以執行.能夠作如下實驗:

編寫一個很是簡單的C程序:

main()
{
printf(「hello,world!\n」);
}

保存後以init.c保存他,並用gcc編譯.
#gcc –-static -o init init.c
這裏的--static 參數告訴gcc把這個程序靜態聯接,這樣這個程序不倚賴任何庫就能運行.把編譯好的init程序拷貝到/sbin下,備份好原來的那個.從新啓動系統最後系統的輸出結果是: hello,world!
然 後停在那裏.作這個實驗之前先肯定你知道如何把系統恢復到原來的狀態,有一個簡單的方法,在內核啓動前給他加上init=參數,好比你原先的init被你 改爲了init.bak 只要在啓動的時候給內核加上init=/sbin/init.bak就能夠用原來的init程序啓動系統.
作完以上實 驗,就明白了內核和init程序之間的關係.此外,init程序不必定是一個二進制可執行程序,他能夠是一個bash腳本,一個指向另外一個程序的聯接,他 的位置也並不必定要在/sbin下,只要在啓動內核時,給內核加上init參數就能被運行,好比,開始時給內核加上init=/bin/bash參數,內 核在最後一步就直接運行bash給出提示符,不用登陸系統就能夠輸入命令了.其功能相似單用戶模式啓動系統. /sbin/init 程序只是內核默認運行的第一個程序.

六,編譯一個linux系統內核

1,編譯前的規劃和準備

在編譯內核 前,請先肯定你的需求,把你的需求羅列成一張詳細的表格.你須要讓內核支持什麼硬件,支持多少種分區類型和文件系統,支持哪些網卡,支持哪些網絡協議.等 等.請儘量詳細的羅列這些內容,可是你也不要太貪心,由於你全部能利用的空間只有1440K,若是你編譯出一個大於1440K或很接近這個數字的內核, 你的這個項目就不能完成了,你已經沒有空間再放ramdisk映象文件,除非你原意再多出一張軟盤,作一個兩張軟盤的小linux系統.對於聲卡驅動之 類,我勸你仍是放棄吧,由於一個聲卡驅動也許只讓你的內核增大了十多K,可是你有了一個聲卡驅動就務必要有一個播放器吧,不然聲卡驅動就沒有意義,可一個 播放器的大小可不是一張軟盤能夠裝得下的.在我先前製做的babylinux內核有900多K,其中,文件系統部分站了大部分,由於個人目標是把他作成一 個系統修復盤.所以我在內核中編譯7種文件系統的支持,每減小一個文件系統就能夠減少幾十甚至200多K的內核大小.越是複雜,越是安全的文件系統,其支 持模塊也越大,好比在linux下FAT模塊只有32K,VFAT只有17K,可是ext3的模塊就有86K,JFS達到216K,reiserfs模塊 是224K,能夠想像,編譯一個支持7個文件系統的900多K的內核,文件系統部分就佔了600K以上的空間,因此若是某一個文件系統是你根本不用的,那 麼仍是不要編譯進內核把,這樣至少能夠省下100多K的空間.對於其餘的驅動,好比網卡,一般大小隻有8,9K,最大的也不過10多K,所以能夠把經常使用的 網卡芯片的驅動都編譯進去.另外若是你想讓你的babylinux支持U盤,那麼scsi的驅動模塊也是不可小看的,他一般要接近150K,由於U盤是被 當作scsi設備來驅動的.另外你還須要讓你的內核支持即插即用,這些都是不小的空間開銷,個人建議是你放棄一兩個你不用的文件系統.總之,你最後編譯出 來的內核大小最好不要超過900K,不然你在busybox裏只能編譯進去不多的命令.

在我編譯的busybox中,我編譯進去120多 個命令,基本上把busybox支持的命令都包括進去了.加上小系統所必需的文件系統目錄,/dev下的設備文件,以及/etc下幾個必需的配置文件,作 成ramdisk壓縮後的大小是440多K, 加上900K左右的內核恰好能夠放入一張1440K軟盤,請注意,你應該留下至少50K的空間,由於咱們要在軟盤上建立一個ext2文件系統,而文件系統 本生須要佔據大概25K的磁盤空間.另外lilo的引導文件boot.b的大小是5.7K,還有裝上lilo後自動產生的map文件也要10多K的空 間,map文件的具體大小由內核安裝的實際大小決定,一般不會超過30K.
綜上所述,請遵循下面的公式:

內核大小+文件系統壓縮印象文件+50K <= 1440K

另一點須要說明的是:以上所羅列的文件系統模塊大小是察看我如今使用的Redhat 9 的
/lib/modules下的模塊文件獲得的,實際編譯進內核大小會小一點,由於咱們用make bzImage
在內核源代碼目錄樹下生成的內核是通過壓縮過的.

若是你對以上說的內容不太明白也沒有關係,我會在下面的內容中作詳細的說明.

2,必需編譯進內核的內容

首 先,咱們製做的這個小系統是基於一張軟盤的,所以,你的內核必需支持軟盤.另外對IDE硬盤和cdrom的支持也是不可少的,不然作出來的 babylinux就沒有實用價值,由於他不能訪問硬盤和光盤上的內容這樣的linux雖然能夠作的更小,可是製造一個徹底沒有用的東西是浪費時間.其餘 的包括framebuffer等,若是你須要支持在字符界面下以高分辨率顯示,以看到更多的屏幕內容,那麼就必需把framebuffer支持編譯進內 核,此外在高分辨率下使用的8x8字體也必需編譯進去.不然即便你給內核傳遞了vga= 參數,內核會由於沒有可用的小字體而自動轉跳到低分辨率模式下,這是之前困擾我好幾天想不明白的事情,後來經過反覆試驗才明白原來是缺乏字體的文體.這裏 我先大體提一下須要注意的事情.在下一小節具體編譯時,我會繼續就某些細節問題說明.

3,關於內核的版本

我是在Redhat 9 linux系統下打造的babylinux小系統.使用的是Redhat 9 自帶的2.4.20版的內核.
爲何我不用最新的2.6的內核?
一 開始我也企圖用最新的內核,可是經過試驗我發現,在用最新的2.6.9內核的狀況下,我編譯一個all-no的(即全部內容都選N,不支持任何硬件,只有 一個最基本的內核)最小化內核就要460K左右,若是我在這個基礎上再加入幾種文件系統和必要的驅動,那麼內核的大小就不能裝下一張1440K
的 軟盤,而我用2.4.20的內核編譯一個最小化的內核只須要217K,的大小.若是優化了gcc參數他還能再小些.這樣我就當即省下了200多K的空間, 在平時,200多K的內容微不足道,可是在babylinux裏,這個數目是整個空間的 1/7,至關於一個reiserfs文件系統模塊的大小.固然,我也嘗試了2.2以及更老的內核,可是他們缺乏我須要的東西,所以最後權衡下來用2.4的 內核是比較合理的.若是你用的是2.6內核的FC系統,那麼最好仍是去下載一個2.4版的內核,www.kernel.org 有各個時期的內核能夠下載.

4, 內核的配置

若是你對linux內核的配置和編譯已經很熟悉了,請跳過這一段,直接看busybox的編譯.

以root身份登陸系統
進入/usr/src/linux目錄
[root@gucuiwen root]# cd /usr/src/linux
若是你下載了一個2.4版本的內核,爲了不麻煩,請將他拷貝到/usr/src下,而後接壓縮,再作一個指向他的名爲linux的連接.雖然這並非必需的,可是根據我以往的經驗,若是我把linux源代碼放在其餘目錄下解開並編譯,偶然會有一些莫名其妙的小問題發生.

#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
爲了方便,作一個到目錄linux-2.4.20的鏈接:
#ln -s linux-2.4.20 linux
進入linux源代碼目錄:
#cd linux
清理源代碼樹:
#make mrproper
運行配置程序:
#make xconfig

code maturity level options
先 選擇N,當咱們配置好常規的東西,要加入framebuffer支持時再將這一項選擇Y,由於在2.4.20中,framebuffer支持尚屬於實驗性 代碼.若是不在code maturity level options選擇爲Y,將不能配置framebuffer.

Loadable module support
選擇N,爲了簡化系統的製做,我在這個項目中不選擇可加載內核模塊的支持.

processor type and features

processor family 中選擇你須要的CPU類型,若是你想讓老至386,新到P4的CPU都能運行babaylinux那麼請選擇386CPU,不然請按本身的實際狀況選擇.

其餘選項都選擇N.這些在babylinux中都是不須要的.

General setup
networking support 選擇Y
PCI support 選擇Y 除非你不用PCI設備,不過通常人都是須要的,由於如今網卡大部分是PCI的.

System V ipc 選擇Y
systrl support選擇Y
kernel support for ELF 選擇Y
其他內容均可以選擇N,若是有特殊需求,好比的網卡是ISA的,那麼請將相應的內容選上.可是不能貪心,時刻牢記,咱們能利用的空間只有 1440K ,內核的大小毫不能超過 900K,任何沒必要要的東西都應該從內核中去除.

memory technology devices (MTD)
Parallel port support
Plug and Play configuration
以上三個大項中的全部內容選擇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.

這裏的選項比較重要,我想重點說明一下.對於軟盤的支持,那是沒必要說的,那是必備的.
loopback device 即迴環設備,咱們平時用命令

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

掛裝光盤映象文件,或者其餘文件系統映象文件時就用到了內核中的loopback 模塊,若是沒有編譯進這個模塊,你將不能用上面的命令掛裝光盤映象和文件系統映象.
我的認爲這個功能是很是重要的,因此編譯了進去.

RAM disk support 即內存磁盤(比較貼切的說法是虛擬磁盤,即撥出一部份內存當作磁盤用).這是製做babylinux項目中的核心內容,因爲一張軟盤的空間有 限,babylinux的根文件系統是用gzip壓縮法高度壓縮的,在運行時,將解壓縮後的文件拷貝到一個RAM disk運行,因此在運行時,你在根文件系統上的全部操做其實是在內存上進行的.可是在形式上和在真正的磁盤上運行同樣.只不過放在RAM disk上的全部內容會在系統關機後所有消失.
不只在運行babylinux時用到ramdisk,咱們在製做壓縮的根文件系統時也要用到ramdisk,學習ramdisk的使用是作一個babylinux的重要目的之一. 在linux中,還支持另一種虛擬磁盤,叫作shm,
(shared memory),這種虛擬磁盤機制比ramdisk更加先進,ramdisk的大小是固定的,由編譯內核時候的default ram disk size 決定.默認爲4096K(4M),也能夠在內核裝載前加上ramdisk_size=參數來決定他的大小,可是系統一旦啓動,ramdisk的大小是不能 改變的,而shm的大小卻動態的改變.默認狀況下爲物理內存的一半,當系統須要更多內存的時,他就自動縮小.系統內存富餘時,他自動增大,這樣能夠充分靈 活的利用內存空間,shm一般用來做爲系統的磁盤高速緩存,存放系統運行中的臨時文件等.redaht 的linux在默認狀況下都有shm的支持,能夠用mount和df察看他的掛裝點和大小,以下命令:

[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
文件系統 容量 已用 可用 已用% 掛載點
/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有這麼多的優勢,我仍是選擇了ramdisk,由於ramdisk能夠很方便地在系統啓動的時候加載,而shm卻沒那麼容易,下面就來說一下關於內核啓動時加載ramdisk映象的相關內容.

initial RAM disk (initrd) support
即 初始化ramdisk支持,這個選項讓內核有能力在內核加載階段就能裝入RAMDISK,並運行其中的內容,不然只能在系統運行階段用ramdisk ,咱們平時在編譯了一個新內核後,若是你的根文件系統用的是ext3,而你沒有把ext3編譯進內核,而只做爲一個模塊編譯了,那麼就須要用 mkinitrd命令作一個initrd (initializtion ramdisk),這個ramdisk裏放了ext3的模塊,這樣內核在加載根文件系統前就能正確識別ext3文件系統.不然,內核加載的最後一步就會出 現kernel panic cant not find init .... 的錯誤.

在babylinux項目中,這個選項是必需的,這裏的做用是把解壓的根文件系統映象裝入ramdisk.

Per partition statics in /proc/partitions
這 個選項不是必需的,可是我發現若是我不把這個功能編譯進內核,那麼當我在掛裝文件系統的時候會有些小問題,好比我不能以簡寫的掛裝命令來掛裝文件系統.我 不肯定究竟是不是這個選項的關係,可是把這個選項編譯進內核只增大一點點內核空間,因此爲了不麻煩,我把他編譯了進去.

Multi-device support (RAID and LVM)
Cryptography support (CryptoAPI)
這兩個大項所有選擇N,由於在我的用PC上,及少牽涉到這兩項,若是你真的有RAID設備或者LVM,那麼就本身摸索着配置一下吧.

Networking options

這一大項中,只須要把下列項目編譯進內核:
Packet socket :mmapped IO
TCP/IP networking

對 於IP:advanced router這項,若是你想重點把babylinux用作靜態路由軟件,那麼把這項編譯進去,而對於network packet filtering (replaces ipchains)這一項,沒有必要編譯進去了,由於busybox沒有提供iptables工具來設置包過濾防火牆.一樣,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編譯進去,由於那時候主板的CMD640 IDE控制芯片大多有莫名其妙的BUG,把這項編譯進去會修復這個bug.

下面幾個大項:
SCSI support
Fusion MPT device support
IEEE 1394(FireWire) support
I2O device support
所有選擇N,這裏可能有你想要的好東西,好比1394接口驅動,可是在babylinux上意義不大,並且咱們的空間只有1440K.

下面一個大項:
Network device support
選 擇Y,這樣就能夠支持網卡了,其他都選擇N.而後點Ethernet(10 or 100 Mbit)按鈕選擇你須要的網卡驅動,你能夠把最多見的幾種Reltek8139,NE2000,3COM等網卡編譯進內核.雖然網卡的驅動一般都很小, 可是不要太貪心,選2~3個就足夠了,不然你的內核就會一會兒多出幾十K.在我先前編譯的babylinux內核中,我把via-rhine網卡編譯了進 去,是由於我打造babylinux的機器上只有一塊那個芯片的網卡.

若是你發現你須要的網卡是灰色的,不能點,那麼先肯定他上一級的選 項已經點了,好比你想選NE2000的網卡,就必需先選擇ELSA,VLB,PCI and on board controllers.若是還不能點,那麼請肯定是否已經把PCI的支持選項選上了,(在Geneal setup)裏.沒有PCI的支持,PCI的網卡將不能選.

可能你是個有錢人,在本身的PC上用千兆網卡,那麼請在千兆網卡那一欄選擇.

接下來幾個大項:
Amateur Radio support
IrDA (infrared) support
ISDN subsystem
Old CD-ROM drivers (not SCSI,not IDE)
Input core support
所有選擇N.

接下來的Charcter devices是很重要的一項,他和Bloack devices同樣重要,我將重點講述.
除了Virtual terminal和Support for console on terminal兩項,其餘全選N.

Virtual terminal 即虛擬終端,這是通常linux必備選項.不然你的linux啓動後,在屏幕看不到任何東西.另外還負責鍵盤輸入信息等等.只有在某些嵌入式linux應用場合纔會不要這個選項,由於這些linux一般都不用操做.

Support for console on terminal
在虛擬終端上的控制檯.他支持在終端上各類信息的輸出,這也是必備的.

接下來的幾個大項:
Multimedia devices
Crypto Hardware support
所有選擇N.

再接下來的那部分File sytems但是重頭戲喔.
這部分不用我太羅嗦了吧,本身須要支持什麼就選什麼.
可是其中有三個是你必需選的:
/proc file system support 缺了他,不少命令和軟件就不能運行.
Second extended fs support BabyLinux的基本文件系統.
ISO 9660 CDROM filesytem support 除非你不想用光盤.
另外,諸如磁盤限額(Quota support),Reiserfs的DEBUG模式(Enable reiserfs debug mode)
等就不用編譯進去了.這些東西意義不大,確要無故的增大內核大小.請牢記一點:編譯出來的內核大小不要超過900K.

Tip:是否是看的很累啊,我寫得更累,別急,內核配置部分立刻要好了.

最後一個Console drivers
這是支持linux在字符模式下高分辨率顯示的內核模塊.前面三個所有選擇Y,
Frame-buffer support按鈕是灰色的不能選,別急,回到第一個大選項:
Code maturity level options 選擇Y,就能夠激活這個按鈕了.

下面幾個選項須要選擇Y:
Support for framebuffer devices
VESA VGA graphics console
你也能夠選擇其餘的顯卡驅動,好比nVidia的,可是VESA和VGA是通用性最好的,只要不是幾十年前的黑白顯卡(我只據說過,沒見過),都兼容VESA和VGA,所以,爲了製做好的BabyLinux的通用性,請選擇這個驅動.

Support only 8 pixels wide fonts
這個必定要選,否當你給內核傳遞vga=788參數,讓linux在字符界面下高分辨率顯示的時候,系統會由於找不到合適的小字體而返回到低分辨率模式.

好了!全部內核的配置工做到這裏就所有完成了,剩下的幾個大項所有選N就好了.
保存後退出,配置程序會自動生成一個隱藏的配置文件.config

下面是我配置好的.config文件內容.若是你懶的本身去配置,那麼直接把這個.config拷貝到你的源代碼目錄下就能直接用了.(已經去掉了#開頭的註釋行)
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,編譯內核
#make dep
#make bzImage

下面是最後編譯結果:
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‘

我用上面的配置獲得了一個845k的內核.
編譯好的內核放在/usr/src/linux-2.4.20-8/arch/i386/boot下.將他拷貝在一個安全的地方備用.

創建一個專放babylinux材料的目錄
#mkdir /babylinux
創建一個作babylinux根文件系統的目錄
#mkdir /babylinux/rootfs
備分內核
#cp /usr/src/linux-2.4.20-8/arch/i386/boot/bzImage /babylinux/

七,編譯busybox

1,busybox簡介

busybox 是一個集成了一百多個最經常使用linux命令和工具的軟件,他甚至還集成了一個http服務器和一個telnet服務器,而全部這一切功能卻只有區區1M左 右的大小.咱們平時用的那些linux命令就比如是分力式的電子元件,而busybox就比如是一個集成電路,把經常使用的工具和命令集成壓縮在一個可執行文 件裏,功能基本不變,而大小卻小不少倍,在嵌入式linux應用中,busybox有很是廣的應用,另外,大多數linux發行版的安裝程序中都有 busybox的身影,安裝linux的時候案ctrl+alt+F2就能獲得一個控制檯,而這個控制檯中的全部命令都是指向busybox的連接.
Busybox的小身材大做用的特性,給製做一張軟盤的linux帶來了及大方便.

2,busybox的用法

能夠這樣用busybox
#busybox ls
他的功能就至關運行ls命令
最經常使用的用法是創建指向busybox的連接,不一樣的連接名完成不一樣的功能.
#ln -s busybox ls
#ln -s busybox rm
#ln -s busybox mkdir

而後分別運行這三個連接:
#./ls
#./rm
#./mkdir

就能夠分別完成了ls rm 和mkdir命令的功能.雖然他們都指向同一個可執行程序busybox
可是隻要連接名不一樣,完成的功能就不一樣,busybox就是這麼的神奇.
不少linux網站都提供busybox的源代碼下載.目前版本是busybox1.0正式版.

3,配置busybox

busybox的配置程序和linux內核菜單配置方式簡直如出一轍.熟悉用make menuconfig方式配置linux內核的朋友很容易上手.

#cp busybox-1.00.tar.gz /babylinux
#cd /babylinux
#tar xvfz busybox-1.00.tar.gz
#cd busybox-1.00
#make menuconfig

下面是須要編譯進busybox的功能選項,其餘的能夠根據須要自選,可是一樣不要太貪心.
General Configuration應該選的選項
Show verbose applet usage messages
Runtime SUID/SGID configuration via /etc/busybox.conf

Build Options
Build BusyBox as a static binary (no shared libs)
這個選項是必定要選擇的,這樣才能把busybox編譯成靜態連接的可執行文件,運行時才獨立於其餘函數庫.不然必須要其餘庫文件才能運行,在單一個linux內核不能使他正常工做.

Installation Options
Don‘t use /usr
這個選項也必定要選,不然make install 後busybox將安裝在原系統的/usr下,這將覆蓋掉系統原有的命令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裏面有busybox和指向他的連接.

其餘選項都是一些linux基本命令選項,本身須要哪些命令就編譯進去,通常用默認的就能夠了.

配置好後退出並保存.

4,編譯並安裝busybox

#make
#make install

編譯好後在busybox目錄下生成子目錄_install,裏面的內容:
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
其中可執行文件busybox在bin目錄下,其餘的都是指向他的符號連接.
我編譯出來的busybox可執行文件是935K,加上符號連接,整個_install目錄是952K.加上845K的內核不是已經超過1440K了嗎?別擔憂,咱們將對整個根文件系統作大幅度的壓縮.


八,製做根文件系統

1,基本目錄結構

#cd /babylinux/rootfs
#mkdir etc usr var tmp proc home root dev
其中etc,proc和dev是必定要建的,bin和sbin不用建,由於busybox中已經有了.
其餘的能夠象徵性的建幾個就能夠了.

拷貝busybox
#cp -R /babylinux/busybox-1.00/_install/* /babylinux/rootfs/

2,創建設備文件名

#cd /babylinux/rootfs/dev
你能夠用mknod手工創建,也能夠直接從原系統的/dev目錄下拷貝過來.

手工創建的方法:
#ls -l /dev/console
crw------- 1 root root 5, 1 11月 30 09:02 /dev/console
這樣就查看到了console設備的主設備號是5,輔設備號是1,是一個標記爲C的字符設備.
因而,咱們能夠用mknod創建一個一樣的設備文件:

#mknod console c 5 1

可是手工方法創建太麻煩了,一般直接從/dev下把須要的設備文件拷貝過來.
這些設備文件是特殊文件,在拷貝時必定要加上-R參數才能拷貝.

#cp -R /dev/console ./
#cp -R /dev/null ./
#cp -R /dev/zero ./
...

如下是我認爲須要的設備名:
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等能夠根據實際須要決定.可是上表中的選擇是比較合理的,即能知足大部分的須要,有沒有不用的設備浪費空間.注意,千萬不要把/dev下的設備全拷貝過來,那將產生大約420K的/dev目錄,這對babylinux來講太大了.

3,創建etc目錄下的配置文件

busybox.conf group inittab motd passwd resolv.conf shadow-
fstab init.d issue mtab profile shadow

其中init.d是一個目錄,從busybox-1.00源代碼目錄下拷貝過來.

#cp -R /babylinux/busybox-1.00/examples/bootflopyp/etc/init.d /babylinux/rootfs/etc/

busybox.conf是一個空文件.
其餘文件的內容以下:

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

:first:/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:::
其 中有不少是從原系統的/etc下拷貝過來修改的,若是你是一個具備中等以上水平的linux愛好者,那麼應該一看就明白了,固然,你也能夠根據本身的須要 修改這些文件.其中最重要的是fstab和inittab,busybox內建的init程序用到的inittab文件的語法和通常的不同,不能直接把 原系統/etc下inittab文件拷貝過來.能夠把busybox-1.00目錄下的示例文件拷貝過來修改用.具體請看busybox的文 檔.busybox的init也能夠不用inittab.可是在我製做babylinux過程當中有一個很是奇怪的bug.全部/sbin下的 busybox連接在作成壓縮的根文件系統,解壓後都不能正常運行,顯示找不到該命令.只有當我在/bin下作這些連接時才能運行.具體緣由還不太清除, 因此你須要作下面的工做:

#cd /babylinux/rootfs/sbin
#ls
chroot getty ifconfig losetup pivot_root reboot swapoff sysctl
fdisk halt init mkswap poweroff route swapon telnetd
查看到sbin下有上述連接

轉到bin下
#cd /babylinux/rootfs/bin
從新作這些連接:
#ln -s busybox chroot
#ln -s busybox getty
#ln -s busybox ifconfig
...


而後把sbin下的連接刪除,以節省空間
#rm -rf /babylinux/rootfs/sbin/*

再把原先inittab中全部的sbin改爲bin

init.d下的文件:
rcS
請確保這個文件是可執行的,不然請改爲可執行的:
#chmod u+x rcS

rcS的內容:
#! /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"
hostname BabyLinux
能夠本身做相應的修改.
以上是babylinux根文件系統的全部內容,他的總大小應該在1M左右.
[root@gucuiwen baby]# du -hs
1.1M .

九,製做ramdisk映象文件


babylinux根文件系統全部東西都放在/babylinux/rootfs下,咱們將利用ramdisk把這些內容作成ramdisk映象文件並壓縮他.

如下主要是ramdisk的用法,看完如下內容,你應當學會ramdisk的使用.

[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1
dd: 正在寫入 ‘/dev/ram1’: 設備上沒有空間
讀入了 8193+0 個塊
輸出了 8192+0 個塊

zero 是一個特殊的設備,表示所有爲0的字符塊.上面這條命令的意思是把系統的第一個ramdisk用所有爲0的數據填充,由於ramdisk默認大小爲4M, 所以當讀滿8192個塊(每塊512字節)後,顯示‘設備上沒空間‘.這很正常,/dev/ram1已經被填充滿了.
若是指定塊的大小:

[root@gucuiwen babylinux]# dd if=/dev/zero of=/dev/ram1 bs=1M count=4
讀入了 4+0 個塊
輸出了 4+0 個塊

不會有錯誤提示,這裏演示了dd的通常用法,接下來還要頻繁用到dd命令.

在/dev下有不少ramdisk設備,ram1,ram2,ram3....
通常用第一個就能夠了.

填充後,ram1就有可空間,能夠在這個空間上創見一個文件系統:
[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掛裝到文件系統中:
先創建一個掛裝點:
#mkdir /mnt/ram
掛上ram1:
#mount /dev/ram1 /mnt/ram
將先前作好的babylinux根文件系統拷貝到ram1上.
#cp -R /babylinux/rootfs/* /mnt/ram

作完以上幾步,你應就白了ramdisk設備的含義,他是和hda1,hdb1,同樣的塊設備,用mount掛到文件系統下後就能夠訪問,往裏放東西,可是全部的東西在內存上.關機將丟失全部東西.

拷貝好babylinux根文件系統後卸載ram1:
#umount /dev/ram1
這時,雖然不能經過/mnt/ram這個掛裝點訪問ram1中的內容了,可是他卻切切實實得在內存中存在.




再用dd把這個ram1以映象方式取出來:

[root@gucuiwen babylinux]# dd if=/dev/ram1 of=/babylinux/ramdisk.img
讀入了 8192+0 個塊
輸出了 8192+0 個塊

驗證一下取出來的內容:
[root@gucuiwen babylinux]# file ramdisk.img
ramdisk.img: Linux rev 1.0 ext2 filesystem data

他是一個ext2 文件系統,相似一個ISO光盤映象文件.
因次,咱們能夠用loop設備來把他從新掛裝到文件系統裏:

[root@gucuiwen babylinux]# mount -o loop ramdisk.img /mnt/ram/

爲了方便,我仍舊把他掛在/mnt/ram下,所以,在先前必定要把/dev/ram1 umount掉

查看/mnt/ram下的內容,他應該和/babylinux/rootfs下的如出一轍,不然就是出錯了:
[root@gucuiwen babylinux]# ls /mnt/ram
bin dev etc home lost+found mnt proc root sbin tmp usr var

這樣,咱們就獲得了一個ramdisk根文件系統映象:ramdisk.img
把他umount掉:
#umount /mnt/ram

若是是第一次接觸ramdisk,你可能對上述的內容很迷惑,若是這樣,請反覆閱讀和理解上面的內容,本身多動手作幾回試驗,就能夠理解.

壓縮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. 加上內核的845K,是1340K
符合公式:

內核大小+文件系統壓縮印象文件+50K <= 1440K

如 果你作出來的kernel和ramdisk.img.gz太大了,請從新制做kernel或ramdisk.img.gz,在其中作一些取捨,若是你的 kernel和ramdisk.img.gz過小了,那麼能夠再往裏面添加一些內容,使你的babylinux功能更強.


十,內核與busybox的整合

準備一張無缺的空白軟盤

建立一個比內核大小略大的文件系統:
好比內核大小是845K,那麼我我創見一個920K的文件系統:
#mkfs.ext2 -m0 /dev/fd0 920

若是空間容許,還能夠再大一些,可是必需保證
1440K-文件系統大小>=ramdisk.img.gz的大小.

掛上軟盤
#mount /dev/fd0
將內核拷貝到軟盤:
#cp /babylinux/bzImage /mnt/floppy/
將lilo引導文件安boot.b 拷貝到軟盤
#cp /boot/boot.b /mnt/floppy

新建一個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表示讓內核支持字符界面的高分辨率顯示,你能夠改爲vga=ask,這樣能夠在啓動的時候選擇分辨率.

紅色一行是關鍵,load_ramdisk=1告訴內核在啓動的時候轉載壓縮的ramdisk印象文件,
ramdisk_start=940 告訴內核從軟盤的第940K的地方去尋找並裝載壓縮的ramdisk印象文件.

關於ramdisk的用法和更多參數請查看linux0內核文檔/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開始的地方.

詳細內容請看dd的聯機文檔 man dd

爲何要從940k開始呢?
由於剛纔做了一個920K的文件系統.我把他裝在文件系統20K之後的地方.
固然,若是你的空間十分緊張,連這20K都不捨得浪費,那麼能夠這樣:

#dd if=/babylinux/ramdisk.img.gz of=/dev/fd0 bs=1k seek=921

固然,別忘記修改lilo.conf文件. ramdisk_start=921

接下來裝lilo引導程序就大功告成了.

#lilo -C lilo.conf

若是你的磁盤上還有一點點空餘空間,那麼能夠把lilo.conf也拷貝上去,以備未來使用.
#cp lilo.conf /mnt/floppy

#umount /dev/fd0


整個工程已經完成了,你能夠從新啓動機器,設置電腦從軟盤啓動.看看有沒有成功.



十一,安裝測試和內容調整

若是在整合內核和ramdisk映象過程當中,出現磁盤空間不夠的狀況,請從新編譯內核和busybox
能夠根據實際須要,調整內核和busybox,好比你要內核支持不少東西,可是隻須要一個支持50個命令的busybox,那麼能夠本身作相應調整.

十二,babylinux中的BUG

有些命令的輸出結果會有誤差,好比用 busybox的df 看磁盤使用狀況,和實際的不同.

十三,接下來要作的事情

作一個基於64M U盤的linux小系統.
計劃支持以下特徵:

a.軟盤babylinux的全部功能
b.圖形界面的支持.
c.一個輕量級的窗口管理器(window maker)
d.網絡的支持,
e.至少一個圖形web瀏覽器,能夠上網.
f.一個音樂播放器和一個視頻播放器.
g.支持中文的顯示和輸入.
h.能夠修改配置並保存數據

我還計劃作一個live CD,可是目前已經有不少live CD了,並且都作的很是好.
可是我會本身作一個做爲學習linux的一種手段.若是有時間,可能寫一個作U盤linux和live CD
的教程.可是,我想不會寫的和這個文檔同樣詳細了,個人時間有限.可能大概講一下原理和步驟.有經驗的linux愛好者應該能夠經過閱讀文檔完成製做.

十四,參考文獻

<Pocket Linux Guide>
node

相關文章
相關標籤/搜索