2.6.8内核编译全过程
--版权所有--ayiiq180,转载请注明作者
经历了整整两天的编译、编译、再编译,终于搞定了2.6.8的内核,用着2.6.8的内核,现在写下这篇文章,给大家一个借鉴。
首先,必须得承认:2.6.8的内核速度真的很快,呵呵!
我的系统:rh as 3 update2。
1.下载及解压:到kernel.org下载2.6.8的内核源码包,然后解压到/usr/src下,形成一个linux-2.6.8的文件夹。
2.升级系统必要工具:包括module_init_tools和mkinitrd
安装module-init-tools-3.0.tar.gz工具包
linux-2.6.x内核的module处理过程有所改变(很多原先在用户态下由modutils处理的工作都放到内核里去完成了), 因此2.4.x下的modutils工具包已经不在适合新的2.6.x内核, 必需将其升级到module-init-tools工具包. 该工具包的最新版本是3.0。
可以下载module-init-tools-3.0.tar.gz源码包的地方有两个:
Rusty's Linux Kernel Page:
http://www.kernel.org/pub/linux/ker...ools-3.0.tar.gz
http://www.kernel.org/pub/linux/uti...ools-3.0.tar.gz
接下来, 按照下列步骤安装module-init-tools工具包:
# configure --prefix=/
# make moveold
# make all install
# ./generate-modprobe.conf /etc/modprobe.conf
命令"make moveold"将把系统原来的modutils工具程序改名为"*.old"(比如,lsmod.old等等). NOTE! 这是非常重要的一步, 千万不要省略. 这将使得你可以继续使用原有的linux-2.4.x系统, 因为在2.4.x系统下, 新的module-init-tools工具包实际上是倚赖原来"*.old"程序来加载内核模块. 如果忘记了这一步也不要紧张, 可以先下载并安装原来的modutils程序包, 然后按照上面的步骤重来一遍就可以了.
新的module-init-tools工具包不再使用原来的/etc/modules.conf配置文件了, 而是使用新的配置文件/etc/modprobe.conf. 因此必需用命令"./generate-modprobe.conf etc/modprobe.conf"来生成新的配置文件/etc/modprobe.conf.
更新mkinitrd程序
由于依赖性的问题,升级这个软件包需要下载如下包:
mkinitrd-3.5.15.1-2.i386.rpm,device-mapper-1.00.07-1.i386.rpm
device-mapper-1.00.07-3.1.i386.rpm lvm2-2.00.08-2.i386.rpm
直接rpm -ivh安装即可。
3.内核配置及编译:
内核配置可以选择自己喜欢的工具,如make config,make menuconfig,make xconfig,make gconfig等,最终得到的效果都是一样的―生成一个“.config”。由于我是只安装了Gnome,所以make xconfig自然没法用了,好在make gconfig和make menuconfig都不错

。
内核配置中有几点需要注意的地方:
o关于"Loadable Module support"选项, 一定要选上"Module unloading"和"Automatic kernel module loading"这两个选项.
o 关于"

rocessor type and features"选项, 一定要选上"

reemptible Kernel"选项, 这是2.6.x内核优于2.4.x内核的重要原因之一.
o 关于"Block Devices"的配置, 一定要选上对loopback和ramdisk的支持.
o 关于"Multi-device support(RAID and LVM)", 要选上"device mapper".
o 关于"Input device support", 记得要选上"Keyboards"和"Mice"的支持.
o 关于"Graphics support", 要选上对frame buffer的支持,要安装nvidia驱动的绝对不要选择RIVA Frame buffer支持,如果选择了,将无法安装nvidia驱动。
o 关于"Sound":2.6.8内核默认是用的ALSA的驱动,选择如下:
Device Drivers --->
Sound --->
[*[ Sound card support
Advanced Linux Sound Architecture --->
Advanced Linux Sound Architecture
Sequencer support
[ ] Sequencer dummy client
OSS Mixer API
OSS PCM (digital audio) API
OSS Sequencer API
RTC Timer support
PCI devices --->
[M] Intel i8x0/MX440, SiS 7012; Ali 5455; NForce Audio; AMD768/8111
Open Sound System --->
[ ] Open Sound System (DEPRECATED)
我的声卡是Nforce2 AC97,用的驱动也是snd-intel8x0,而这个模块我编译成了模块,其实编译进内核也是一个好注意:)。
o 关于USB, 几个重点模块usbhid,ohci-hcd,ehci-hcd,usbmouse,usbcore等等我全部直接编译进内核了,开始的几次都编译为模块,但是在rc.sysinit运行到modprobe的时候总是提示read-only filesystem,无法加载到内核,但是进入系统后手动modprobe又可以,所以一气之下全部编译进内核,反正我是用的usb鼠标,必须得有usb支持。
o 关于文件系统, 选上常用的那几种就可以了. 如果要体验sysfs的话, 要选上对sysfs的支持(到现在我也不知道这个sysfs到底有什么用处?)但是,一个重点问题是Ext3的文件系统一定要直接编译进内核,这个非常重要,在配置完后一定要检查一下.config文件有没有"CONFIG_EXT3_FS=y"这一项. 如果不是"CONFIG_EXT3_FS=y"而是"CONFIG_EXT3_FS=m",你在运行内核时就会遇上以下错误: pivotroot: pivot_root(/sysroot,/sysroot/initrd) failed 。选项如下:
File systems--->
Ext3 journalling file system support
Ext3 Security Labels
JBD (ext3) debugging support
o 关于显卡驱动的问题,我的主板是Nforce2芯片组,显卡为Nvidia Geforce 4 Ti 4200,as 3刚刚安装时,无论怎样装显卡驱动或者修改XFconig,都无法正常使用显卡驱动,只要安装,使用nvidia模块x就必死无疑。经过反复研究,终于发现是内核中的Agpgart模块的问题,所以,内核配置中重点要选择如下:
Device Drivers --->
character Device--->
<*> /dev/agpgart (AGP Support)
<*> NVIDIA nForce/nForce2 chipset support
其他就根据具体情况配置一下,懒得话默认也可以了。
然后就:make
make modules_install
make install
这时,你的grub.conf文件中已经多了一项新内核的启动项了。但是,2.6的内核不认识默认给出的root=LABEL=/,必须改成root=/dev/hda9,我的是hda9,你的根据实际情况而定。
4.其他配置文件改动:
/etc/modprobe.conf的修改:由于usb的所有模块都已经直接编译进了内核,所以/etc/modprobe.conf文件中所于关于usb的行都可以删除了,当然,如果你不想全部编译进内核的话,或者你能成功自动modprobe上的话(当然不是自己在rc.local中写modprobe),你就需要修改一些地方了:
alias usb-controller usb-ohci要把它改为:alias usb-controller ohci-hcd
alias char-major-13-32 mousedev改成alias char-major-13-32 usbmouse
如果你有usb键盘的话还需要把:keybdev改成usbkbd
下面部分的mousedev和keybdev都需要改成usbmouse和usbkbd
另外,声音部分的模块名也改变了。我的原来的声卡驱动是i810_audio,现在已改为snd-intel8x0。因此需要删除原来的所有关于sound的行并把下面的内容添加到/etc/modprobe.conf中:
alias char-major-14 soundcore
alias sound snd-intel8x0
alias sound-slot-0 snd-intel8x0
alias snd-card-0 snd-intel8x0
alias sound-service-0-0 snd-mixer-oss
alias sound-service-0-1 snd-seq-oss
alias sound-service-0-3 snd-pcm-oss
alias sound-service-0-8 snd-seq-oss
alias sound-service-0-12 snd-pcm-oss
install snd-intel8x0 /sbin/modprobe --ignore-install sound-slot-0 && { /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1; /bin/true; }
remove snd-intel8x0 { /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1; /bin/true; }; /sbin/modprobe -r --ignore-remove sound-slot-0
/etc/rc.d/rc.local文件中我增加了一行:modprobe sound,用来自动加载声卡模块。
/etc/rc.sysinit文件的修改:由于usb模块名称的改变和Hotplug需要的/proc/ksyms改名为/proc/kallsyms以及/proc/bus/usb改为/sys/bus/usb,这个文件也需要一定的修改:在文件头加入如下定义:
#兼容2.4内核的变量定义部分
#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
KEYBDEV_NAME=usbkbd
MOUSEDEV_NAME=usbmouse
USBPATH_NAME=/sys/bus/usb
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
KEYBDEV_NAME=keybdev
MOUSEDEV_NAME=mousedev
USBPATH_NAME=/proc/bus/usb
fi
#兼容2.4内核的变量定义部分
然后, 把/etc/rc.sysinit脚本文件中出现keybdev和mousedev的地方都改为$KEYBDEV_NAME和$MOUSEDEV_NAME. 把所有/proc/ksyms改为$KSYMS,所有/proc/bus/usb改为$USBPATH_NAME。
具体sys这个文件系统到底有没有用仍然不得而知。
另外,由于我所有usb模块都编译进了内核,所以初始化usb设备的部分需要屏蔽,否则会在启动的时候出现找不到模块的失败错误。屏蔽如下,为了兼容2.4.21内核启动:
#兼容2.4内核的部分,其实这里本来需要,但是usb模块编译进内核后就不需要了。
if [ "$KERNELVER" = "2.4" ]; then
needusstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" $USBPATH_NAME/devices 2>/dev/null`
LC_ALL=C grep 'hid' $USBPATH_NAME/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
# action $"Initializing USB keyboard: " modprobe $KEYBDEV_NAME 2> /dev/null
action $"Initializing USB mouse: " modprobe $MOUSEDEV_NAME 2> /dev/null
fi
fi
#兼容2.4内核的部分,其实这里本来需要,但是usb模块编译进内核后就不需要了。
Sysfs文件系统支持:
首先, 创建目录/sys:
# mkdir /sys
然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:
o 找到行: mount -f /proc", 在下面增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
o 找到行: action $"Mounting proc filesystem: " mount -n -t proc /proc /proc, 在其下面增加这样一行:
#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi
接下来, 在/etc/fstab文件中, 加入这样一行:
none /sys sysfs defaults 0 0
最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk '$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk '$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
以上部分是借鉴别人的说法,具体有什么用不知道,事实上我只增加了一行mount -f /sys。
到了这里,OK,可以重启了体验新内核了。GOOD LUCK!04年9月8日 ayiiq180