第一步:下载内核源码:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.tar.gz
然后解压进入到解压后的目录
# tar -zxvf linux-2.6.29.tar.gz
# cd /usr/src/linux-2.6.29
第二步:开始编译
清理以前的编译痕迹
如果内核源码是刚解压缩出来的,可以跳过这一步,否则执行以下两条命令:
make mrproper make clean设置内核编译选项
命令如下:
cp /boot/config-`uname -r` .config make menuconfig执行该命令需要ncurses库,如果执行出错则执行如下命令安装ncurses:
yum install ncurses-devel
编译内核压缩镜像
1make bzImage
编译会生成bzImage文件,对应于/boot目录下的vmlinuz文件,是压缩过的内核文件。启动加载时将该文件解压缩到内存中之后才能执行操作系统。
编译内核模块
make modules
内核在运行过程中,除需要内核文件之外,还需要加载一些外围模块(例如驱动程序)等才能运行。
安装内核模块
make modules_install
安装上一步中编译的内核模块,一般都会安装到/lib/modules目录下。
安装内核
make install这句命令很简单,它会在/boot目录下生成vmlinux/System.map两个文件,并且在/boot/grub目录中生成menu.lst文件。有关menu.lst文件的修改方法请Google一下。
注:1. 若提示如下错误
sh /usr/src/linux-2.6.29/arch/x86/boot/install.sh 2.6.29 arch/x86/boot/bzImage \
System.map "/boot"
*** Missing file: arch/x86/boot/bzImage
*** You need to run "make" before "make install".
make[1]: *** [install] Error 1
make: *** [install] Error 2说明找不到内核模块的错误,执行以下两个命令
cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.29.1
cp System.map /boot/System.map-2.6.29.1
启动新的内核
修改/boot/grub/menu.lst文件,将新生成的默认启动项修改为刚生成的启动项,重启即可:reboot
新内核启动问题:
如果启动时报"insmod: error inserting '/lib/dm-region-hash.ko' : -1 File exists"错误,解决方法如下:
1.解压initrd文件
2.下边就是编辑init, 删掉其中重复的四行中的两行# cp /boo/initrd-2.6.32.60.img /tmp/ # cd /tmp/ # ls initrd-2.6.32.60.img # mkdir newinitrd # cd newinitrd/ # zcat ../initrd-2.6.32.60.img |cpio -i 12629 blocks 释放之后看到如下内容 # ls bin dev etc init lib proc sbin sys sysroot
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko
3.重新打包initrd
好了,initrd.img就是重新打包的initrd了,然后把initrd.img拷贝到/boot,更改/boot/grub/grub.conf里边的initrd-2.6.32.60.img为initrd.img就可以了[root@bogon newinitrd]# find .|cpio -c -o > ../initrd 12629 blocks [root@bogon newinitrd]# cd .. [root@bogon tmp]# gzip -9 < initrd > initrd.img [root@bogon tmp]# ls initrd-2.6.32.60.img initrd initrd.img newinitrd
如果启动时出现如下的错误:
mount: could not find filesystem ‘/dev/root’
setuproot: moving /dev failed: No such file or directory
setuproot: error mounting /proc: No such file or directory
setuproot: error mounting /sys: No such file or directory
switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init!
解决方法:编译时修改.config文件中的“CONFIG_SYSFS_DEPRECATED_V2”,默认该选项为not set,被注释掉的,将其改为y。即修改为“CONFIG_SYSFS_DEPRECATED_V2=y”,修改后,再重新编译内核,重启即正常了。
具体操作:
第一次打开.config时查找没有CONFIG_SYSFS_DEPRECATED_V2字段,先make menuconfig然后导入配置文件之后退出在打开.config修改或添加"CONFIG_SYSFS_DEPRECATED_V2=y",然后在重新make menuconfig导入配置文件退出,编辑.config文件这时可以找到 CONFIG_SYSFS_DEPRECATED_V2字段了修改其为CONFIG_SYSFS_DEPRECATED_V2=y
本文转自“lchengcome的专栏”