Chinaunix首页 | 论坛 | 博客
  • 博客访问: 817282
  • 博文数量: 117
  • 博客积分: 2583
  • 博客等级: 少校
  • 技术积分: 1953
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-06 22:58
个人简介

Coder

文章分类
文章存档

2013年(1)

2012年(10)

2011年(12)

2010年(77)

2009年(13)

2008年(4)

分类: LINUX

2009-10-01 19:15:00

    对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

阅读(2172) | 评论(0) | 转发(0) |
0

上一篇:什么是驱动程序

下一篇:关闭Linux防火墙

给主人留下些什么吧!~~