对linux内核的编译、安装是每个内核研读者都必须掌握的一个阶段,因为我们要完全按照我们自己的意愿往内核里添加特性,做实验。但是编译内核对于初学者来说还是相对有一些难度的,也许你可能不知如何下手,请不必为此烦恼或者放弃,经过一些归纳、总结及在网上大量查找资料后,形成了这个比较详细的步骤,从而可以为广大的爱好者以及新手能带来更好的帮助和深入的了解。
一、下载内核
到 下载新内核到/home/hanpfei/softwares/(可根据自己的实际情况任意选择)
下载建议最好下载比当前已安装版本高的内核,我下载的是 linux-2.6.34.1.tar.bz2( 原来的内核是
2.6.18-92.e15)
★ 我察看当前内核的版本
[root@localhost~]#uname
-a
Linux localhost.localdomain 2.6.18-92.e15 #1 SMP Tue Jun 8
10:30:55 CST 2010 i686 i686 i386 GNU/Linux
然后将其解压,直接在内核文件所在的目录,进入该目录,然后使用tar来解压,解压得到linux-2.6.34:
[root@localhost~]#cd /home/hanpfei/softwares/
[root@localhost~]#tar -jxvf linux-2.6.34.1.tar.bz2
如果所下载的
是.tar.gz(.tgz)文件,请使用下面的命令:
[root@localhost~]#tar -zxvf
linux-2.6.34.1.tar.gz
两中压缩格式的内核文件都可以使用下面的参数:
[root@localhost~]#tar -xvf
linux-2.6.34.1.tar.gz
较新版本tar可以自动判断压缩文件的格式。
二、
配置内核
[root@localhost~]#make clean 清除原有不需要的模块和文件(垃息)
[root@localhost~]#make
mrproper 清理源代码数
上面的两步是清除之前编译内核时产生的目标文件,在初次编译时不需要执行。另外,我们都知道,make工具非常智能化,只有被修该了的文件,在再次执行make时才是会被真正编译的。所以,有时为了加快编译速度,也会省略上面两步。
[root@localhost~]#make menuconfig
基于ncurse的图形配置界面(还可以在文本模下以菜单方式进行配置:make config;基于QT的图形方式配置:make xconfig,基于GTK的图形方式配置:make gconfig,可以通过make help查看更多关于make目标的信息)。
Load an Alternate Configuration
File,导入.config文件(可省略)
可以用两种方法来配置内核的组件,一种是选择直接编译入内核 ”*“ ;另一种是编成模块 ”M“ ,而在系统需要的时候进行加载。两种方法各有优点,直接编入内核的,比如设备的启动,不再需要加载模块的这一过程了,而编译成模块,则可以减小最终编译完成的内核的大小,同时节省对内存的使用,但需要加载设备的内核支持的模块;直接把所有的东西都直接编译入内核也是不太好的,内核体积会变大,系统负载也会过重。我们编内核时最好把极为重要的内核组件都选择直接编译入内核,其它的如果您不明白,最好用默认。
移动键盘上下左右键,按Enter 进入一个目录。把指针移动到Exit就退出当前目录到上级目录;
修改完毕选择Save an
Alternate Configuration File,然后退出配置
[root@localhost~]#emacs .config
编辑配置文件.config
找到105行的"#CONFIG_SYSFS_DEPRECATED is not
set"改为"CONFIG_SYSFS_DEPRECATED=y", 保存。假如不修改该行,在升级内核重新启动后会报如下的错,导致启动失败:
Volume group "VolGroup00" not found
Unalbe to access resume
device (/dev/VolGroup00/LogVol00)
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!
★ 编译开始,大概需要半个小时到一个小时的时间,自己可以倒杯凉茶耐心候。
[root@localhost~]#make
★
编译外挂模块和需要加载的模块安装
[root@localhost~]#make modules && make
modules_install
这一步会在/lib/modules/目录下生成一个以内核版本为名的目录,本例中,这个目录即为2.6.34.1,里面存放的正是我们编译的内核模块。
★ 编译系统内核且生成新的内核文件
生成一个压缩的大内核文件
[root@localhost~]#make
bzImage
将内核文件copy到/boot下
[root@localhost~]#cp arch/x86/boot/bzImage
/boot/vmlinuz-2.6.34
[root@localhost~]#mkinitrd
/boot/initrd-2.6.34.1.img 2.6.34.1
这一步将编译的内核模块打包,根据提供的版本号,在/lib/modules/寻找所需的文件。
[root@localhost~]# cp /boot/initrd-2.6.34.1.img /tmp
[root@localhost~]# cd
/tmp/
[root@localhost~]# ls
[root@localhost~]#mkdir newinitrd
[root@localhost~]#
cd newinitrd/
[root@localhost~]# zcat ../initrd-2.6.34.1.img
|cpio -i
[root@localhost~]# ls
bin dev etc init
lib proc sbin sys sysroot
[root@localhost~]#vim init
删掉重复的两行,有些情况下是没有就不要执行
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
★ 重新打包initrd
[root@localhost~]#
find .|cpio -c -o > ../initrd
[root@localhost~]# cd ..
[root@localhost~]#
gzip -9 < initrd > initrd-2.6.34.1.img
★
将initrd重新复制到/boot目录下
[root@localhost~]#cp initrd-2.6.34.1.img /boot/
★
给 /boot/grub/grub.conf中添加一个新的启动项,
[root@localhost~]#emacs
/boot/grub/grub.conf
如我的grub.conf 增加了如下一段文字 :
title CentOS(2.6.34.1)
root (hd0,0)
kernel
/boot/vmlinuz-2.6.34.1 ro root=LABEL=/ rhgb quiet
initrd
/boot/initrd-2.6.34.1.img
三、重新起动
[root@localhost~]# reboot
★
启动成功后查看当前内核版本号
[root@localhost~]#uname -r
2.6.34.1
阅读(2225) | 评论(0) | 转发(0) |