今天在ubuntu7.04上编译内核linux2.6.25.4成功了。
新编译的内核给我的感觉是反应速度快了很多。(在编译的时候将
Timer frequency由Feisty默认的250HZ该为1000Hz, 能不快多了吗?), 其他的bug暂时还没有发现。
1. 下载内核原代码:
$cd ~/linux/package
$
wget -c $
wget -c .sign
从国内的镜像站下源码要比直接从kernel.org快。
2. 验证签名
首先从pgp的服务器获取签名公匙, linux内核包的公匙编号是0x517D0F0E. 再利用sign文件来验证.bz2压缩包的签名.
如果输出中有类似gpg: Good signature from "Linux Kernel Archives Verification
Key
" 的内容, 说明该包是有效的. (注:
GPG签名只是保证镜像网站提供的压缩包和kernel.org所提供的是相同的, 如果在kernel.org下载, 不需要验证签名.)
$gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
$gpg --verify linux-2.6.25.4.tar.bz2.sign linux-2.6.25.4.tar.bz2
3. 解压缩kernel, (注意最好不要解压到/usr/src/中。因为其中有系统正在使用的kernel headers, 这样会导致混乱)
$cd ~/linux/package;mkdir ~/linux/src
$tar jxvf linux-2.6.25.4.tar.bz2 -C ~/linux/src
4. 构建编译环境,安装所有的源代码编译工具
$sudo apt-get install build-essential kernel-package libncurses5-dev
其中的libncurses5-dev是进行make menuconfig 时必须的curse库.
5. 开始配置内核
$cd ~/linux/src/linux-2.6.25.4
$make mrproper ##删除以前编译留下的信息
$cp /boot/config-`uname -r` .config ##当然这里你也可以用make defconfig生成默认的.config配置文件,这是linus的配置。
$make menuconfig ##或者make xconfig, make gconfig...
接着就是配置了。 配置中的具体选项可以参考内核自带的帮助, menuconfig时用?查看。 更多详细的可参考金步国先生的文章. 根据发行版本的.config,建议不要删减的还是不要乱删,否则出问题的可能性比较大。只是这样编译的过程会很慢。
6. 编译内核
$sudo make-kpkg clean
$sudo make-kpkg -initrd --initrd --append-to-version=mykernel kernel_image
上面的mykernel可以用你喜欢的字符串代替
等一段时间后(我的AMD 4200+用时是30多分钟),编译完成后会在你编译内核的上层目录生成文件(我的机子用了):linux-image-2.6.25.4mykernel_2.6.25.4mykernel-10.00.Custom_i386.deb
7. 安装内核
$cd ..
$sudo dpkg -i linux-image-2.6.25.4mykernel_2.6.25.4mykernel-10.00.Custom_i386.deb
完成后可以去/boot目录下看看.多了4个文件:
config-2.6.25.4mykernel
initrd.img-2.6.25.4mykernel
System.map-2.6.25.4mykernel
vmlinuz-2.6.25.4mykernel
8. 关于NVIDIA显卡驱动的问题
由于新内核不支持NVIDIA的驱动,因此需要打补丁。 我的是集成显卡Geforce 7025.
显卡驱动可到NVIDIA官方网站去下载,我的是:
$wget .run
对应的补丁在这里:
|
文件: | NVIDIA-patch.tar.gz |
大小: | 6KB |
下载: | 下载 |
|
应用补丁:
$sudo sh NVIDIA-Linux-x86-169.12-pkg1.run --apply-patch NVIDIA_kernel-169.12-2286310.diff.txt
这时会生成文件: NVIDIA-Linux-x86-169.12-pkg1-custom.run
9. 使用新内核
$reboot
在grub选在新内核
这时需要驱动NVIDIA显卡才能进x server
$sudo sh NVIDIA-Linux-x86-169.12-pkg1-custom.run --kernel-source-path=/home/itlanger/linux/src/linux-2.6.25.4
这时不需要选择从官方下载内核头文件了。因为已经指定了kernel-source-path, 该目录就是编译内核的目录。
10,再次reboot, 选新内核, 一切OK!
11.关于再次编译:
如果编译内核后,只希望重新修改某些内核选项,可以不需要整个重新编译:
只要不执行make mrproper和make kpkg-clean就行。
$make menuconfig 更改内核配置选项后,
$sudo make-kpkg -initrd --initrd --append-to-version=mykernel2 kernel_image
整个命令需要和上面编译时一样, 这样make就会在原来编译的基础上,编译新选上的模块(如果有的话)构建内核,而不会全部重新编译. 会节省很多时间。
12. 查找内核配置时本机所需驱动的方法:
这里有一种查找本机驱动的方法(以网卡为例子):
- $ ls /sys/class/net/
eth0 lo - $ basename $(readlink /sys/class/net/eth0/device/driver/module)
sky2 - $ cd /home/itlanger/linux/src/linux-2.6.25.4/
- $ cat Makefile | xargs grep sky2
sky2./drivers/net/Makefile:obj-$(CONFIG_SKY2) += sky2.o- 上面的CONFIG_SKY2就是要我的网卡需要的内核配置选项 $make menuconfig
- 在其中搜索 SKY2(就是去掉CONFIG前缀后剩下的部分),然后选上相应的驱动就可以了。
- 当然,这样挨个找每个设备对应的模块会比较麻烦, 可以用一个脚本实现:
- #!/bin/bash
#find_all_modules.sh
#
for i in `find /sys/ -name modalias -exec cat {} \;`;do
/sbin/modprobe --config /dev/null --show-depends $i;
done | rev |cut -f 1 -d '/'| rev | sort -u
- 我的机器上探测的结果如下(出现部分FATAL信息不用去理它, 因为有些设备没有相应的内核驱动):
- agpgart.ko
ahci.ko
amd74xx.ko
ata_generic.ko
bluetooth.ko
cdrom.ko
ehci-hcd.ko
evbug.ko
evdev.ko
generic.ko
hid.ko
i2c-algo-bit.ko
i2c-core.ko
ide-cd.ko
joydev.ko
k8temp.ko
libata.ko
nvidiafb.ko
nvidia.ko
ohci-hcd.ko
pci_hotplug.ko
pcspkr.ko
sata_nv.ko
scsi_mod.ko
shpchp.ko
sky2.ko
snd-hda-codec.ko
snd-hda-intel.ko
snd.ko
snd-page-alloc.ko
snd-pcm.ko
snd-timer.ko
soundcore.ko
tsdev.ko
usbcore.ko
usbhid.ko
usbkbd.ko
usbmouse.ko
vesafb.ko
xpad.ko
- 然后找相应的配置选项: cat Makefile | xargs grep modname ##例如modename=usbmouse
有一个参考内核配置比较好的网站:。 比较方面,可以比对各个版本内核的配置差异。
补充: 内核api的安装:在kernel source的顶层目录,执行make installmandocs就可以将man 手册安装到 /usr/local/man/man9下面了。
阅读(1288) | 评论(0) | 转发(0) |