***********************************************************************
*以下步骤有很多都是很初级的命令或解释,因为偶是linux新手,
*在编译过程中走了很多弯路,花了大量时间找各种解决办法,所以
*把相应的命令都写了出来,希望对跟偶一样的才入门不久而又想
*编译内核的新手有所帮助!
*
*kilvon05-Mar-2003
**********************************************************************
基本编译情况说明:偶目前的版本是:RedHatlinux8.0
(机器有双操作系统:linux和windows2000)
内核版本是2.4.18-14,硬件是笔记本compaq的某一型号,
下载的内核版本是2.4.20(在www.kernel.org上可以找到),
推荐编译内核时使用高版本,而不是在以前的版本上编译,
原因见第7.1步的说明
在编译开始前,建议先在windows下用相关软件对硬件做一个
详细统计,包括硬件类型,厂家,芯片版本等等,特别是笔记本
和品牌机,因为二者很多部件都是OEM其它厂家的,并把它打印
出来以供配置内核时使用.(linux下也可以用:系统工具->
硬件浏览器来查看)
另外建议在身旁准备几张纸和笔,随时把你认为重要的信息记下来,
当然包括错误信息了,以帮助以后判断和解决问题.
1.将内核源码包linux-2.4.20.tar.bz2copy至/usr/src目录下:
#cplinux-2.4.20.tar.bz2/usr/src
#cd/usr/src
2.将指向以前内核版本的symbollink删除
#rm-flinux-2.4
3.用以下命令解开压缩包
#bzip2-dlinux-2.4.20.tar.bz2
#tar-xvflinux-2.4.20.tar
4.创建新的symbollink以链接到刚解开的源码所在目录
#ln-slinux-2.4.20linux-2.4
5.进入到以后编译时用的工作目录虾:
#cd/usr/src/linux-2.4
6.该命令保证源代码目录下没有不正确的.o文件(即object文件,编译c语
言时生成的,目的是下一步编译成可执行码时link之用)以及文件的相互
倚赖关系.第一次编译刚下载的源码包不用此命令,但如果多次使用这
些源码编译内核,那么一定要先运行本命令.
#makemrproper
7.为了不影响已经可用的内核(比如安装linux时装入的内核),现在需要
保存以前的可用的内核(以使得编译失败仍然可以"方便的"启动linux),
并且我们要对本次编译的内核标识一个容易辨认的标记,以下几步与
编译暂时无关.
7.1偶使用grub作为bootmanager,所以要修改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
titlePsyche(2.4.18-14standard)
root(hd0,6)
kernel/vmlinuz-2.4.18-14.standardroroot=/dev/hda8
initrd/initrd-2.4.18-14.standard.img
titleWindows2000
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
以下是偶机器的部分输出:
Filesystem1K-blocksUsedAvailableUse%Mountedon
/dev/hda841372642136592179050855%/
...
看看你的系统根目录装在哪里很重要,因为后面你将会看到系统安装编译好的内核时在grub.conf插入的命令中root=LABEL=/hdc=ide-scsi
可能会引发系统引导时的如下错误:
VFS:Cannotopenrootdevice""or00:00
Pleaseappendacorrect"root="bootoption
Kernelpanic:VFS:UnabletoMountrootfson00: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.偶是在XWindow下编译:
#makexconfig
8.1如果你是在文本模式下,用
#makemenuconfig
8.2其实编译步骤里最难的就是内核参数的配置,我在这里耗费了很多时间,
更惨的是开始并没有认识到这一点,以为是那些命令的使用...所以,接着看吧:
8.3选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块(哪些较远?看各人对linux和操作系统概念的理解程度了,还有就是看所配置项的help),有利于减小内核的长度,减小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。下面对常用的选项分别加以介绍:
/1.Codematurityleveloptions
代码成熟等级。此处只有一项:
promptfordevelopmentand/orincompletecode/drivers
如果你要试验现在仍处于实验阶段的功能,比如khttpd、IPv6等,就必须
把该项选择为Y了;否则可以把它选择为N。
/2.Loadablemodulesupport
对模块的支持。这里面有三项:
Enableloadablemodulesupport:
除非你准备把所有需要的内容都编译到内核里面,否则该项应该是必选的。
Setversioninformationonallmodulesymbols:
可以不选它。
Kernelmoduleloader:
让内核在启动时有自己装入必需模块的能力,建议选上。
/3.Processortypeandfeatures
CPU类型,选项很多,不一一介绍了,有关的几个如下:
Processorfamily:
根据你自己的情况选择CPU类型。
HighMemorySupport:
大容量内存的支持。可以支持到4G、64G,一般可以不选。
Mathemulation:
协处理器仿真,协处理器是在386时代的宠儿,现在早已不用了。
MTTRsupport:MTTR支持。可不选。
Symmetricmulti-processingsupport:
对称多处理支持。除非你富到有多个CPU,否则就不用选了。
/4.Generalsetup
这里是对最普通的一些属性进行设置。这部分内容非常多,一般使用缺省设置就可以了。下面介绍一下经常使用的一些选项:
Networkingsupport:
网络支持,必须选,没有网卡也建议选上。
PCIsupport:
PCI支持,必选.
PCIaccessmode:
PCI存取模式。可供选择的有BIOS、Direct和Any,选Any吧。
Supportforhot-pluggabeldevices:
热插拔设备支持,可选.
PCMCIA/CardBussupport:
PCMCIA/CardBus支持,有PCMCIA就必选了。
SystemVIPC
BSDProcessAccounting
Sysctlsupport:
以上三项是有关进程处理/IPC调用的,主要就是SystemV和BSD两种风格。
如果你不是使用BSD,就按照缺省吧。
PowerManagementsupport:电源管理支持,可选上,特别是笔记本.
AdvancedPowerManagementBIOSsupport:高级电源管理BIOD支持。
/5.MemoryTechnologyDevice(MTD)
MTD设备支持
可不选。
/6.Parallelportsupport
串口支持。如果不打算使用串口,就别选了。
/7.PlugandPlayconfiguration
即插即用支持。选上吧,可以体验一下Linux下即插即用的感觉。
/8.Blockdevices
块设备支持,需要针对每个人的具体情况来选:
NormalPCfloppydisksupport:普通PC软盘支持,一般要选,我的没有,
就没选
XTharddisksupport:
CompaqSMART2support:
MulexDAC960/DAC1100PCIRAIDControllersupport:RAID镜像用的。
Loopbackdevicesupport:
Networkblockdevicesupport:网络块设备支持。如果想访问网上邻居的
东西,就选上。
Logicalvolumemanager(LVM)support:逻辑卷管理支持。
Multipledevicesdriversupport:多设备驱动支持。
RAMdisksupport:RAM盘支持。
/9.Networkingoptions
网络选项。这里配置的是网络协议。自己看吧.
除了肯定要选中TCP/IPnetworking外,其它看着办吧
/10.TelephonySupport
Linux下可以支持电话卡,这样你就可以在IP上使用普通的电话提供语音服务.详细情况可看看help内容.
/11.ATA/IDE/MFM/RLLsupport
这个是有关各种接口的硬盘/光驱/磁带/软盘支持的,内容太多了,使用缺省
的选项吧,偶有PCMCIA卡,各人机器情况不一样.
/12.SCSIsupport
SCSI设备的支持,如果你用了SCSI的硬盘/光驱/磁带等设备,自己找好了.
/13.IEEE1394(FireWire)support
偶的是灰的,不用操心了,:))
/14.I2Odevicesupport
在智能Input/Output(I2O)体系接口中使用,不会,用缺省吧.
/15.Networkdevicesupport
网络设备支持。上面选好协议了,现在该选设备.
为了免得麻烦,编译到内核里面好了,不选M了,选Y。耐心点,一般说来你都能找到自己用的网卡。如果没有,你只好自己到厂商那里去当驱动了,
或者去www.mydrivers.com看看
/16.AmateurRadiosupport
没有,不选.
/17.IrDA(infrared)support
这个要红外支持,我的有.
/18.ISDNsubsystem
如果你使用ISDN上网,这个就必不可少了
/19.OldCD-ROMdrivers(notSCSI、notIDE)
专门为非SCSI/IDE口的光驱做的,但谁还在用那么老的东东啊,自己选吧.
/20.InputCoreSupport
这个选项很重要,除了joystick(游戏遥控杆)建议都选"m".切记!
/21.Characterdevices
字符设备。这个内容又太多了,先使用缺省设置,需要的话自己就修改:
I2Csupport:I2C是Philips极力推动的微控制应用中使用的低速串行
总线协议。如果你要选择下面的VideoForLinux,该项必选。
Mice:鼠标。如果是笔记本,建议在BusMouseSupport选上"y".
Joysticks:手柄。即使在Linux下把手柄驱动起来意义不大
WatchdogCards:虽然称为Cards,这个可以用纯软来实现,当然也有
硬件的。如果你把这个选中,那么就会在你的/dev下创建一个名为
watchdog的文件,它可以记录你的系统的运行情况,一直到系统重新
启动的1分钟左右。有了这个文件,你就可以恢复系统到重启前的状态了。
VideoForLinux:支持有关的音频/视频卡。
Ftape,thefloppytapedevicedriver:
PCMCIAcharacterdevicesupport:
/22.Multimediadevices
为捕捉audio/video用,如果感兴趣看看help
/23.Filesystems
文件系统。内容太多了,建议在缺省选项的基础上进行修改。
介绍以下几项:
Quotasupport:Quota可以限制每个用户可以使用的硬盘空间的上限,在多用户共同使用一台主机的情况中十分有效。
DOSFATfssupport:
DOSFAT文件格式的支持,可以支持FAT16、FAT32。
ISO9660CD-ROMfilesystemsupport:光盘使用的就是ISO9660的文件格式。
NTFSfilesystemsupport:ntfs是NT使用的文件格式,你要在linux下mountntfs分区的话,就要选上它。记得在mount的时候,
只有iocharset=cp936可以加上,codepage=936不能加。
/procfilesystemsupport:/proc文件系统是Linux提供给用户和系统进行交
互的通道,建议选上,否则有些功能没法正确执行。
还有另外三个大类都规到这儿了:NetworkFileSystems(网络文件系统)、
PartitionTypes(分区类型)、NativeLanguageSupport(本地语言支持)。
值得一提的是NetworkFileSystems里面的两种:NFS和SMB分别是Linux和
Windows相互以网络邻居的形式访问对方所使用的文件系统,根据需要加以选择。
/24Consoledrivers
用缺省
/25Sound
你用什么声卡?选选吧.
/26USBSupport
很重要,至少要选以下选项
SupportforUSB
UCHIAlternateDeriver(JE)Support
OCHI(Compaq,iMacs...
USBAudio...
USBMIDI...
USBHumanInterfaceDevice(fullHID)support
HIDinputlayersupport
/dev/hiddevrawHID...
USBLCDdevicesupport
因为偶的硬件很多都要求USBHID支持,所以这里选了不少
*如果有某些选项那不准,可以参考:
/usr/src/linux-2.4/Documentation/Configure.help
也可以search整个系统并看看相关的文字都在哪些文件出现:
#find/usr-name"*.*"-print-execgrep
-q-smousedev{};-print
这个长命令很有用
8.4别忘了将你的配置保存到一个文件里,否则下次编译时又要重选!
LoadConfigurationfromfile
比如保存到/home/kilvon/conf/Kernel-kilvon.001
8.5用以下命令读取刚才的配置数据使之生效:
#makedep
#makeclean
9.开始编译内核和模块
#makebzImage
#makemodules
#makemodules_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-fSystem.map
#rm-fvmlinuz
#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--mkinitrd2.4.20-kilvon.001
--mkinitrd作InitialRamdisk的,可以直接敲个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
titlePsyche(2.4.20-kilvon.001)
root(hd0,6)
kernel/vmlinuz-2.4.20-kilvon.001roroot=/dev/hda8
initrd/initrd-2.4.20-kilvon.001.img
titlePsyche(2.4.18-14standard)
root(hd0,6)
kernel/vmlinuz-2.4.18-14.standardroroot=LABEL=/hdc=ide-scsi
initrd/initrd-2.4.18-14.standard.img
titleWindows2000
rootnoverify(hd0,0)
chainloader+1
13.再好好检查一下/boot下的文件名是否敲对了(前面有好多的mv,cp动作)
[root@localhostboot]#ll
total8880
58249月604:53boot.b
6129月604:53chain.b
421509月501:47config-2.4.18-14
10243月521:32grub
1309833月503:49initrd-2.4.18-14.img
1309833月420:21initrd-2.4.18-14.standard.img
654993月521:31initrd-2.4.20-kilvon.001.img
4733月503:49kernel.h
122883月503:44lost+found
231089月622:05message
212829月622:05message.ja
213月503:49module-info->module-info-2.4.18-14
154369月501:47module-info-2.4.18-14
154363月420:21module-info-2.4.18.standard
168343月521:17MyKernelSetup-kilvon.001
6409月604:53os2_d.b
283月519:32System.map->System.map-2.4.20-kilvon.001
5078149月501:47System.map-2.4.18-14
5078143月420:20System.map-2.4.18-14.standard
5881753月521:24System.map-2.4.20-kilvon.001
32364389月501:47vmlinux-2.4.18-14
313月512:51vmlinuz->/boot/vmlinuz-2.4.20-kilvon.001
11251949月501:47vmlinuz-2.4.18-14
11251943月420:19vmlinuz-2.4.18-14.standard
14587903月521:24vmlinuz-2.4.20-kilvon.001
14.好了,来吧:
#reboot
15.如果有错无法启动,这回到grub控制台然后用以前的内核启动,还记得吗?前面第7步的"额外"工作将在这时为你节省大量时间...
16.如果系统可以启动到登录界面并可以登录,但启动过程中有Failed的项,查看:/var/log/boot.log或该目录下搜索一下,看看是什么问题,偶就遇到类似问题,
后来通过改变内核编译的配置而解决掉这些讨厌的红色文字,好了,就写到这里