当前位置:Linux教程 - Linux - 编译内核的一点点经验

编译内核的一点点经验

最开始听说编译核心时都吓了一跳, 心想LINUX那么可怕, 一上来就是要自已编译核心...
后来自己试了一下, 其实也不复杂, 主要是找些文档来看就行了.

1.核心的源程序:
我现在在用TLC, REDHAT也用过, SLACKWARE也用过. 无论哪一种, 都是把核心源程序放到 /usr/src/linux 下, 因为有些别的应用程序在编译时好像也会从这个路径来引用一些头文件之类. 一般来说这个 linux 目录都只是个符号连接, 有一点点像WIN下的Shortcut, 而实际上它对应的目录可能是 /usr/src/linux-2.0.35 之类. RedHat的缺省安装好像并不装源程序, 只有些头文件.
以现在的2.2.5 核心为例, 我装的时候就是这样(其实什么版本都一样 :)
cd /usr/src
rm linux
# 这个linux只是个符号连接, 删掉它没事的. 可以 ls -l 看看, 如果看到这个:
# linux -> linux-XXXXX, 就表示它是个连接而已. 原来的源程序在箭头后的目录.
tar zxvf XXXXXXX/linux-2.2.5.tar.gz
# 这个包解开后, 新核心的源程序就放在了新建立的linux目录下, 这可是个货真价
# 实的目录.
mv linux linux-2.2.5
ln -s linux-2.2.5 linux
# 按照惯例, 还是把目录另命个名, 再重新做个linux的符号连接
好了, 现在源程序放好了.

2.准备编译:
现在要做一些准备工作. 对于新释放出来的核心源程序也没啥好做的, 就打一个:
cd /usr/src/linux
make menuconfig

然后就会看到一个很友好的界面(在LINUX下...已经是很友好的了), 大致上有点像WIN 9X安装时的选择安装项目. 这就是在配置核心, 选择哪些内容要, 哪些不要.
慢慢道来:

Code maturity ......
按回车进去后只有一项, 是问是否在后面的选项中列出开发中/或未完成的代码/
驱动程序. 不管它, 不选它就行了

Processor type ......
选择CPU类型, 进去后有四项:
Processor family: 按回车, 在里面选CPU类型(我不懂为什么把PPro和6x86MX列在
一起);
Math emulation: 协处理器仿真, 当然不选(你不会还在用没有FPU的386吧);
MTRR: 搞不懂 :PP, 不管它, 缺省是不选的;
Symmetric......: 如果你富到有两个或以上的CPU并且装在同一块主板上, 就选;

Loadable module support:
对模块的支持. 模块可是好东西, 网卡声卡的驱动问题很多朋友都在问, 有模块
其实很好办. 这里面有三项:
Enable loadable .....: 当然要选;
Set version.....: 好像是为了使核心可以装入不同版本的模块, 可以不选它;
Kernel module.....: 让核心在启动时有自己装入必需模块的能力, 选上吧;

General setup:
里面东西不少, 我的办法是一项也不改, 用缺省的;

Plug and Play........:
著名的Plug and ""Pray"", 嘿嘿. 选上吧;

Block devices:
选择某些设备驱动, 按缺省的不变就可以了(如果你没有什么过于古旧的设备如
IDE卡的话), 不过我是把""CMD640""及""RZ1000""两项去掉, 因为我不认得它们, 它
们也不认得我. 还有就是不妨把 ""Loopback device"" 也加上, 做成核心内包含
或模块都可以.

现场解释:
在每一个选项前都有个括号, 但有的是中括号有的是尖括号. 用空格键选择时可以发现, 中括号里要么是空, 要么是""*"", 而尖括号里可以是空, ""*""和""M"". 这表
示前者对应的项要么不要, 要么做在核心里; 后者则多一样选择, 可以做成模块.

模块: 我的直观理解是, 模块就是像*.SYS那样的驱动程序, 可以在核心启动后加载,能有效减小核心尺寸, 并有更多的灵活性. 关于灵活性, 后面再说.

Networking options:
主要是有关TCP/IP的设置. 一般机器用缺省的就行了, 别的如果要作防火墙啊
路由什么的可以自己选, 我没选过, 不敢乱说 :PP;

SCSI support:
我是没有SCSI设备的, 所以我一项也不选. 你有吗? 不妨把你要的都做成模块,
这样内核会比较小. 像16.8就选了""low-level drivers"" 里的""AIC7xxx"",因为
有一个SCSI 的 CDR 光驱, 有时候可能会接上来用;

Netword device support:
这里就是网卡的设置.
进去以后第一项, Netword device support选上先(没网卡? 也选!)

ARCnet support:
小的不知此为何物, 不选它;

Dummy net driver support:
哑(或空)网络驱动支持. 照缺省的, M.

EQL ........:
不懂. 不选.

Ethernet (10 or 100Mbit):
你是用网卡上网就把它选上吧.

3COM cards:
如果你用3COM的卡, 选上. 下面会有多的选项, 选择你的卡那一项吧.

AMD LANCE .....:
Western Digital......:
Racal-Interlan......:
看起来都像是某种卡, 不管他.

Other ISA cards:
其他的用ISA网卡的玩家们(尤其是UMC 9008这种XX卡), 选上.
别的卡我是没用过, NE2000兼容的卡就选上 NE2000/NE1000 support, 最好是选成
M. 把网卡驱动做成模块会有利于你装网卡驱动的.

如果已经选出了你用的卡, 下面的可以全部不管了. 统统可以不选. 如果不是的话,
就照着列出来的项目选. 例如是拨号上网就要把PPP 选上. 下面的这些没有一样我用
过, 不敢胡说 :PP

出来, 然后是 Amateur Radio Support, 不选;

然后是ISDN...你富到了用ISDN上网?

下面是 Old CD-ROM drivers, 如果你还在用古老的非IDE或SCSI接口的光驱, 就进去
自己选吧.

Character devices:
基本上可以全都不变. 如果用的是串口鼠标, ""Mouse Support(not serial mouse)""
就可以不选了. 有游戏手柄的可以在 Joystick support 里选. 一般的模拟手柄(不好
下精确的定义, 总之你能用60块钱以下买到的4键6键8键之类都是模拟型的)就选第一
项""Classic PC ...."". 我用的Creative Cobra里面是没有的. 不过, LINUX下把手柄
驱动起来好像也没什么意义...

Filesystems:
文件系统支持.
Quota support:
不用选了, 如果你的机器不是像16.8这样做个人主页服务器的话. 如果你要实验如何
限制用户使用的硬盘空间, 就选上.

Kernel automounter support 可以选上, 虽然我没发现选不选有什么区别.
DOS FAT fs support 最好要选上, 如果要在LINUX下读写DOS分区. 下面有三个选项,把
""MSDOS fs support"" 与 ""VFAT(Windows-95) fs support""选上就可以了. VFAT 即
FAT32.

ISO 9660 .....: ISO 9660格式光盘(现在的软件光盘..X版的光盘..都是这个格式)支
持, 当然选上.

Microsoft Joliet......: 选上以后没发现有什么用.

以下的可以统统保持缺省. 如果装了NT或OS/2, 可以选上NTFS ....及 OS/2 ....., 都
是只读访问.

Network File Systems 子项里缺省选上了NFS, 可以不要. SMB可以选上, 用来访问局
域网中的WINDOWS共享目录. 如果要访问Netware卷, 就选上""NCP ....."".

出来以后是 Console drivers, 可以不管它.
然后是 Sound...这一块东西很多, 实在没力气一一写下来. 不过有几个建议:
1. 能用OSS驱动还是用OSS驱动, 又方便, 支持的卡也多;
2. 如果用OSS驱动, 在SOUND里就不要选任何东西;
3. OSS不支持的卡(如ALS007), 才在核心里想办法. 可以参考上面我POST的""ALS007发声经过"".
4. OSS指Open Sound System, 是 4 Front Tech 的商业产品, 在16.8上可以找得到, 但有时间限制. 某高人作了工作将其注册, 大家自己下载了回去研究. 核心里的那个""OSS sound modules(NEW)"" 只是OSS的一部分. 我也用过这个来驱动YAMAHA 719卡.

Kernel hacking: 不管它啦......

好了, 全部设完了, 选EXIT退出来, 问是否保存修改时答YES.
然后会有一些提示. 如果看到了有叫你""make dep"", 就一定要打""make dep""先.
完了后就打 make bzImage. 如果提示信息中没有叫你""make dep"", 只有叫你
""make zImage"", ""make zdisk"" 或 ""make zlilo"" 的, 就直接打 make bzImage 就行了.

一点说明: make dep 是作一些准备工作, make bzImage 则是开始编译生成核心. 而
make bzImage与make zImage的区别在于, 作成bzImage的核心压缩率比zImage高, 核心就更小一些. make zdisk 与 make zlilo 是做别的用处的核心的.

然后就等吧(有得你等的). 一般从5分钟到半个钟头不等, 看你的机器了. 第一次编译会比较慢. 以后再改了配置后make就会快很多了.

等这个完了后一定还要 make modules 和 make modules_install.

make bzImage 完后会显示核心放在什么地方, 一般是/usr/src/linux/arch/i386/boot/
下. 把bzImage拷到根下. 然后修改 /etc/lilo.conf, 照着原来的image = XXXXX来加上
image = /bzImage
root = /dev/hda1 (这里视你的LINUX安装而定, 照你原有的改)
label = linux
read-only
把原来的 label = linux 改一下, 如 label = oldlinux.
把image = /bzImage 这一节加在原来的前面, 这样会自动作为缺省的核心. 你也可以在LILO时打linux或oldlinux来启动不同的核心. 关于这一段, 也可以参考俺前面的""ALS007
发声经过"".
最后, 切记切记, 一定要打个lilo来重新生成LILO程序.

好了, 重启...