***********************************************************************
*以下步驟有很多都是很初級的命令或解釋,因為偶是Linux新手,
*在編譯過程中走了很多彎路,花了大量時間找各種解決辦法,所以
*把相應的命令都寫了出來,希望對跟偶一樣的才入門不久而又想
*編譯內核的新手有所幫助!
*
* kilvon 05-Mar-2003
**********************************************************************
基本編譯情況說明:偶目前的版本是: RedHat linux 8.0
(機器有雙操作系統:linux和windows 2000)
內核版本是 2.4.18-14,硬件是筆記本compaq 的某一型號,
下載的內核版本是2.4.20(在www.kernel.org上可以找到),
推薦編譯內核時使用高版本,而不是在以前的版本上編譯,
原因見第7.1步的說明
在編譯開始前,建議先在windows下用相關軟件對硬件做一個
詳細統計,包括硬件類型,廠家,芯片版本等等,特別是筆記本
和品牌機,因為二者很多部件都是OEM其它廠家的,並把它打印
出來以供配置內核時使用.(linux下也可以用:系統工具->
硬件浏覽器來查看)
另外建議在身旁准備幾張紙和筆,隨時把你認為重要的信息記下來,
當然包括錯誤信息了,以幫助以後判斷和解決問題.
1.將內核源碼包linux-2.4.20.tar.bz2 copy至/usr/src目錄下:
#cp linux-2.4.20.tar.bz2 /usr/src
#cd /usr/src
2.將指向以前內核版本的symbol link刪除
#rm -f linux-2.4
3.用以下命令解開壓縮包
#bzip2 -d linux-2.4.20.tar.bz2
#tar -xvf linux-2.4.20.tar
4.創建新的symbol link以鏈接到剛解開的源碼所在目錄
#ln -s linux-2.4.20 linux-2.4
5.進入到以後編譯時用的工作目錄蝦:
#cd /usr/src/linux-2.4
6.該命令保證源代碼目錄下沒有不正確的.o文件(即object文件,編譯c語
言時生成的,目的是下一步編譯成可執行碼時link之用)以及文件的相互
倚賴關系.第一次編譯剛下載的源碼包不用此命令,但如果多次使用這
些源碼編譯內核,那麼一定要先運行本命令.
#make mrproper
7.為了不影響已經可用的內核(比如安裝linux時裝入的內核),現在需要
保存以前的可用的內核(以使得編譯失敗仍然可以"方便的"啟動linux),
並且我們要對本次編譯的內核標識一個容易辨認的標記,以下幾步與
編譯暫時無關.
7.1偶使用grub作為boot manager,所以要修改grub.conf文件,
#cp /boot/grub/grub.conf /boot/grub/grub.conf.bck
(建議有條件打印一份原始的grub.conf文件,原因見第7.4步)
#emacs /boot/grub/grub.conf
(emacs小提示: ctrl+ x +s 為保存結果,ctrl + x +c為關閉emacs,
刪除n行文字為:先把光標放在要刪除文字的起始處 ctrl + u,然後敲入要
刪除的行數,比如4,最後ctrl + k)
下面是偶的grub.conf內容:
default=1
timeout=10
splashimage=(hd0,6)/grub/splash.XPm.gz
title Psyche (2.4.18-14 standard)
root (hd0,6)
kernel /vmlinuz-2.4.18-14.standard ro root=/dev/hda8
initrd /initrd-2.4.18-14.standard.img
title Windows 2000
rootnoverify (hd0,0)
chainloader +1
注意kernel...和initrd...兩條語句,因為要與以下改動對應:
#rm -f /boot/System.map
#rm -f /boot/vmlinuz
#cp /boot/System.map-2.4.18-14 /boot/System.map-2.4.18.standard
#ln -s /boot/System.map-2.4.18.standard /boot/System.map
#cp /boot/vmlinuz-2.4.18-14 /boot/vmlinuz-2.4.18-14.standard
#ln -s /boot/vmlinuz-2.4.18-14.standard /boot/vmlinuz
#cp /boot/initrd-2.4.18-14.img /boot/initrd-2.4.18-14.standard.img
(initrd只用了copy,因為偶是編譯一個高版本的內核,而不是同一個版本
內核的重新編譯,編譯高版本的好處在於系統會建立另外的目錄而不會
用新編譯的(可能是錯的)版本覆蓋以前的版本,看一下/lib/modules目錄
就明白了.)
7.2如何知道你的根目錄"\"在哪個partition上? 命令為:
#df
以下是偶機器的部分輸出:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda8 4137264 2136592 1790508 55% /
...
看看你的系統根目錄裝在哪裡很重要,因為後面你將會看到系統安裝編譯好的內核時在grub.conf插入的命令中root=LABEL=/ hdc=ide-scsi
可能會引發系統引導時的如下錯誤:
VFS: Cannot open root device "" or 00:00
Please append a correct "root=" boot option
Kernel panic: VFS: Unable to Mount root fs on 00:00
所以要在grub.conf裡修改其命令為:root=/dev/hda8
7.3好了,做完這些准備工作後,我們要--
重啟一下機器,:)不要急,應為要先確認7.1步的工作的正確性,以免把7.1錯誤
帶入以後的步驟中.(編譯內核一定要非常小心謹慎,不能急躁,否則,嘿嘿...)
7.4如果在重啟過程中系統有問題,可以在grub的引導界面上臨時改動grub引
導參數,相關命令有:
e -編輯引導命令
ESC鍵 -回到上級目錄
o -插入一行命令
b -開始引導系統
d -刪除一行
其實你可以把grub控制台上的命令都刪了(只影響本次啟動),然後按照
/boot/grub/grub.conf裡的命令手工在grub控制台上敲進去,也是一樣的效果.
7.5如果你能使用重新配置的grub命令正確啟動系統,那麼讓我們開始真正的
編譯工作吧!!!!
7.6先保證我們在編譯的工作目錄下:
#cd /usr/src/linux-2.4
然後編輯Makefile(這個文件是用來控制編譯用的),找到這一行:
EXTRAVERSION =
修改為(以偶本次編譯為例,也可以是任意的合法字符串,比如"-sema-v.4")
EXTRAVERSION = -kilvon.001
8.偶是在X Window下編譯:
#make xconfig
8.1如果你是在文本模式下,用
#make menUConfig
8.2其實編譯步驟裡最難的就是內核參數的配置,我在這裡耗費了很多時間,
更慘的是開始並沒有認識到這一點,以為是那些命令的使用...所以,接著看吧:
8.3選擇的原則是將與內核其它部分關系較遠且不經常使用的部分功能代碼編譯成為可加載模塊(哪些較遠?看各人對linux和操作系統概念的理解程度了,還有就是看所配置項的help),有利於減小內核的長度,減小內核消耗的內存,簡化該功能相應的環境改變時對內核的影響;不需要的功能就不要選;與內核關心緊密而且經常使用的部分功能代碼直接編譯到內核中。下面對常用的選項分別加以介紹:
/1. Code maturity level options
代碼成熟等級。此處只有一項:
prompt for development and/or incomplete code/drivers
如果你要試驗現在仍處於實驗階段的功能,比如khttpd、IPv6等,就必須
把該項選擇為Y了;否則可以把它選擇為N。
/2. Loadable module support
對模塊的支持。這裡面有三項:
Enable loadable module support:
除非你准備把所有需要的內容都編譯到內核裡面,否則該項應該是必選的。
Set version information on all module symbols:
可以不選它。
Kernel module loader:
讓內核在啟動時有自己裝入必需模塊的能力,建議選上。
/3. Processor type and features
CPU類型,選項很多,不一一介紹了,有關的幾個如下:
Processor family:
根據你自己的情況選擇CPU類型。
High Memory Support:
大容量內存的支持。可以支持到4G、64G,一般可以不選。
Math emulation:
協處理器仿真,協處理器是在386時代的寵兒,現在早已不用了。
MTTR support:MTTR支持。可不選。
Symmetric multi-processing support:
對稱多處理支持。除非你富到有多個CPU,否則就不用選了。
/4. General setup
這裡是對最普通的一些屬性進行設置。這部分內容非常多,一般使用缺省設置就可以了。下面介紹一下經常使用的一些選項:
Networking support:
網絡支持,必須選,沒有網卡也建議選上。
PCI support:
PCI支持,必選.
PCI Access mode:
PCI存取模式。可供選擇的有BIOS、Direct和Any,選Any吧。
Support for hot-pluggabel devices:
熱插拔設備支持,可選.
PCMCIA/CardBus support:
PCMCIA/CardBus支持,有PCMCIA就必選了。
System V IPC
BSD Process Accounting
Sysctl support:
以上三項是有關進程處理/IPC調用的,主要就是System V和BSD兩種風格。
如果你不是使用BSD,就按照缺省吧。
Power Management support:電源管理支持,可選上,特別是筆記本.
Advanced Power Management BIOS support:高級電源管理BIOD支持。
/5. Memory Technology Device(MTD)
MTD設備支持
可不選。
/6. Parallel port support
串口支持。如果不打算使用串口,就別選了。
/7. Plug and Play configuration
即插即用支持。選上吧,可以體驗一下Linux下即插即用的感覺。
/8. Block devices
塊設備支持,需要針對每個人的具體情況來選:
Normal PC floppy disk support:普通PC軟盤支持,一般要選,我的沒有,
就沒選
XT hard disk support:
Compaq SMART2 support:
Mulex DAC960/DAC1100 PCI RAID Controller support:RAID鏡像用的。
Loopback device support:
Network block device support:網絡塊設備支持。如果想訪問網上鄰居的
東西,就選上。
Logical volume manager(LVM)support:邏輯卷管理支持。
Multiple devices driver support:多設備驅動支持。
RAM disk support:RAM盤支持。
/9. Networking options
網絡選項。這裡配置的是網絡協議。自己看吧.
除了肯定要選中TCP/IP networking外,其它看著辦吧
/10. Telephony Support
Linux下可以支持電話卡,這樣你就可以在IP上使用普通的電話提供語音服務.詳細情況可看看help內容.
/11. ATA/IDE/MFM/RLL support
這個是有關各種接口的硬盤/光驅/磁帶/軟盤支持的,內容太多了,使用缺省
的選項吧,偶有PCMCIA卡,各人機器情況不一樣.
/12. SCSI support
SCSI設備的支持, 如果你用了SCSI的硬盤/光驅/磁帶等設備,自己找好了.
/13. IEEE 1394(FireWire)support
偶的是灰的,不用操心了,:))
/14. I2O device support
在智能Input/Output(I2O)體系接口中使用,不會,用缺省吧.
/15. Network device support
網絡設備支持。上面選好協議了,現在該選設備.
為了免得麻煩,編譯到內核裡面好了,不選M了,選Y。耐心點,一般說來你都能找到自己用的網卡。如果沒有,你只好自己到廠商那裡去當驅動了,
或者去www.mydrivers.com看看
/16. Amateur Radio support
沒有,不選.
/17. IrDA(infrared)support
這個要紅外支持,我的有.
/18. ISDN subsystem
如果你使用ISDN上網,這個就必不可少了
/19. Old CD-ROM drivers(not SCSI、not IDE)
專門為非SCSI/IDE口的光驅做的,但誰還在用那麼老的東東啊,自己選吧.
/20.Input Core Support
這個選項很重要,除了joystick(游戲遙控桿)建議都選"m".切記!
/21. Character devices
字符設備。這個內容又太多了,先使用缺省設置,需要的話自己就修改:
I2C support:I2C是Philips極力推動的微控制應用中使用的低速串行
總線協議。如果你要選擇下面的Video For Linux,該項必選。
Mice:鼠標。如果是筆記本,建議在Bus Mouse Support選上"y".
Joysticks:手柄。即使在Linux下把手柄驅動起來意義不大
Watchdog Cards:雖然稱為Cards,這個可以用純軟來實現,當然也有
硬件的。如果你把這個選中,那麼就會在你的/dev下創建一個名為
watchdog的文件,它可以記錄你的系統的運行情況,一直到系統重新
啟動的1分鐘左右。有了這個文件,你就可以恢復系統到重啟前的狀態了。
Video For Linux:支持有關的音頻/視頻卡。
Ftape, the floppy tape device driver:
PCMCIA character device support:
/22.Multimedia devices
為捕捉audio/video用,如果感興趣看看help
/23. File systems
文件系統。內容太多了,建議在缺省選項的基礎上進行修改。
介紹以下幾項:
Quota support:Quota可以限制每個用戶可以使用的硬盤空間的上限,在多用戶共同使用一台主機的情況中十分有效。
DOS FAT fs support:
DOS FAT文件格式的支持,可以支持FAT16、FAT32。
ISO 9660 CD-ROM file system support:光盤使用的就是ISO 9660的文件格式。
NTFS file system support:ntfs是NT使用的文件格式,你要在linux下mount ntfs分區的話,就要選上它。記得在mount的時候,
只有iocharset=cp936可以加上,codepage=936不能加。
/proc file system support:/proc文件系統是Linux提供給用戶和系統進行交
互的通道,建議選上,否則有些功能沒法正確執行。
還有另外三個大類都規到這兒了:Network File Systems(網絡文件系統)、
Partition Types(分區類型)、Native Language Support(本地語言支持)。
值得一提的是Network File Systems裡面的兩種:NFS和SMB分別是Linux和
Windows相互以網絡鄰居的形式訪問對方所使用的文件系統,根據需要加以選擇。
/24 Console drivers
用缺省
/25 Sound
你用什麼聲卡?選選吧.
/26 USB Support
很重要,至少要選以下選項
Support for USB
UCHI Alternate Deriver (JE) Support
OCHI (Compaq,iMacs...
USB Audio...
USB MIDI...
USB Human Interface Device (full HID) support
HID input layer support
/dev/hiddev raw HID...
USB LCD device support
因為偶的硬件很多都要求USB HID 支持,所以這裡選了不少
*如果有某些選項那不准,可以參考:
/usr/src/linux-2.4/Documentation/Configure.help
也可以search整個系統並看看相關的文字都在哪些文件出現:
#find /usr -name "*.*" -print -exec grep
-q -s mousedev {} \; -print
這個長命令很有用
8.4別忘了將你的配置保存到一個文件裡,否則下次編譯時又要重選!
Load Configuration from file
比如保存到/home/kilvon/conf/Kernel-kilvon.001
8.5用以下命令讀取剛才的配置數據使之生效:
#make dep
#make clean
9.開始編譯內核和模塊
#make bzImage
#make modules
#make modules_install
10.將編譯好的文件移到/boot下;如果上面某步有錯,大部分情況是由於
配置內核選項時將一些當前版本只能編譯為modules的選為編譯到內核裡,
我遇到好幾次這樣的情況.應為既然www.kernel.org發布一個穩定的內核,
(偶沒down那些alpha,beta版)9成9可以成功的編譯.
#move /usr/src/linux-2.4/System.map /boot/System.map-2.4.20-kilvon.001
#move /usr/src/linux-2.4/arch/i386/boot/bzImage
/boot/vmlinuz-2.4.20-kilvon.001
#rm -f System.map
#rm -f vmlinuz
#ln -s /boot/System.map-2.4.20-kilvon.001 /boot/System.map
#ln -s /boot/vmlinuz-2.4.20-kilvon.001 /boot/vmlinuz
11.作些收尾工作:
#new-kernel-pkg --install --depmod --mkinitrd 2.4.20-kilvon.001
--mkinitrd 作Initial Ramdisk的,可以直接敲個mkinitrd -h看看
--depmod 檢查內核中有沒有未解析的symbol
--install 在grub中安裝一個啟動選項
12.看看第7.2步的相關解釋,現在請修改/boot/grub/grub.conf文件,
以下是修改後的grub.conf:
default=2
timeout=10
splashimage=(hd0,6)/grub/splash.xpm.gz
title Psyche (2.4.20-kilvon.001)
root (hd0,6)
kernel /vmlinuz-2.4.20-kilvon.001 ro root=/dev/hda8
initrd /initrd-2.4.20-kilvon.001.img
title Psyche (2.4.18-14 standard)
root (hd0,6)
kernel /vmlinuz-2.4.18-14.standard ro root=LABEL=/ hdc=ide-scsi
initrd /initrd-2.4.18-14.standard.img
title Windows 2000
rootnoverify (hd0,0)
chainloader +1
13.再好好檢查一下/boot下的文件名是否敲對了(前面有好多的mv,cp動作)
[root@localhost boot]# ll
total 8880
5824 9月 6 04:53 boot.b
612 9月 6 04:53 chain.b
42150 9月 5 01:47 config-2.4.18-14
1024 3月 5 21:32 grub
130983 3月 5 03:49 initrd-2.4.18-14.img
130983 3月 4 20:21 initrd-2.4.18-14.standard.img
65499 3月 5 21:31 initrd-2.4.20-kilvon.001.img
473 3月 5 03:49 kernel.h
12288 3月 5 03:44 lost+found
23108 9月 6 22:05 message
21282 9月 6 22:05 message.ja
21 3月 5 03:49 module-info -> module-info-2.4.18-14
15436 9月 5 01:47 module-info-2.4.18-14
15436 3月 4 20:21 module-info-2.4.18.standard
16834 3月 5 21:17 MyKernelSetup-kilvon.001
640 9月 6 04:53 os2_d.b
28 3月 5 19:32 System.map -> System.map-2.4.20-kilvon.001
507814 9月 5 01:47 System.map-2.4.18-14
507814 3月 4 20:20 System.map-2.4.18-14.standard
588175 3月 5 21:24 System.map-2.4.20-kilvon.001
3236438 9月 5 01:47 vmlinux-2.4.18-14
31 3月 5 12:51 vmlinuz -> /boot/vmlinuz-2.4.20-kilvon.001
1125194 9月 5 01:47 vmlinuz-2.4.18-14
1125194 3月 4 20:19 vmlinuz-2.4.18-14.standard
1458790 3月 5 21:24 vmlinuz-2.4.20-kilvon.001
14.好了,來吧:
#reboot
15.如果有錯無法啟動,這回到grub控制台然後用以前的內核啟動,還記得嗎?前面第7步的"額外"工作將在這時為你節省大量時間...
16.如果系統可以啟動到登錄界面並可以登錄,但啟動過程中有Failed的項,查看:/var/log/boot.log或該目錄下搜索一下,看看是什麼問題,偶就遇到類似問題,
後來通過改變內核編譯的配置而解決掉這些討厭的紅色文字,好了,就寫到這裡
507814 3月 4 20:20 System.map-2.4.18-14.standard
588175 3月 5 21:24 System.map-2.4.20-kilvon.001
3236438 9月 5 01:47 vmlinux-2.4.18-14
31 3月 5 12:51 vmlinuz -> /boot/vmlinuz-2.4.20-kilvon.001
1125194 9月 5 01:47 vmlinuz-2.4.18-14
1125194 3月 4 20:19 vmlinuz-2.4.18-14.standard
1458790 3月 5 21:24 vmlinuz-2.4.20-kilvon.001
14.好了,來吧:
#reboot
15.如果有錯無法啟動,這回到grub控制台然後用以前的內核啟動,還記得嗎?前面第7步的"額外"工作將在這時為你節省大量時間...
16.如果系統可以啟動到登錄界面並可以登錄,但啟動過程中有Failed的項,查看:/var/log/boot.log或該目錄下搜索一下,看看是什麼問題,偶就遇到類似問題,
後來通過改變內核編譯的配置而解決掉這些討厭的紅色文字,好了,就寫到這裡
23108 9月 6 22:05 message
21282 9月 6 22:05 message.ja
21 3月 5 03:49 module-info -> module-info-2.4.18-14
15436 9月 5 01:47 module-info-2.4.18-14
15436 3月 4 20:21 module-info-2.4.18.standard
16834 3月 5 21:17 MyKernelSetup-kilvon.001
640 9月 6 04:53 os2_d.b
28 3月 5 19:32 System.map -> System.map-2.4.20-kilvon.001
507814 9月 5 01:47 System.map-2.4.18-14
507814 3月 4 20:20 System.map-2.4.18-14.standard
588175 3月 5 21:24 System.map-2.4.20-kilvon.001
3236438 9月 5 01:47 vmlinux-2.4.18-14
31 3月 5 12:51 vmlinuz -> /boot/vmlinuz-2.4.20-kilvon.001
1125194 9月 5 01:47 vmlinuz-2.4.18-14
1125194 3月 4 20:19 vmlinuz-2.4.18-14.standard
1458790 3月 5 21:24 vmlinuz-2.4.20-kilvon.001
14.好了,來吧:
#reboot
15.如果有錯無法啟動,這回到grub控制台然後用以前的內核啟動,還記得嗎?前面第7步的"額外"工作將在這時為你節省大量時間...
16.如果系統可以啟動到登錄界面並可以登錄,但啟動過程中有Failed的項,查看:/var/log/boot.log或該目錄下搜索一下,看看是什麼問題,偶就遇到類似問題,
後來通過改變內核編譯的配置而解決掉這些討厭的紅色文字,好了,就寫到這裡