小西 发表于 2003-10-24 11:09:26

Kernel 2.6x 编译过程

作者:北南南北

来自:LinuxSir.Org

提要:在Kernel 2.6x和以前的版本的编译方法有点区别,所以就简单的把编译过程写出来,主要是帮助初学Linux的兄弟。

Kernle 2.6x 编译比较简单,最适合我等菜鸟!!

本文是以Redhat为例,内版本是2.6.0-test8

一、下载

http://www.kernel.org

二、解压

1.把下载好的内核放到/usr/src目录中,比如我下载的是linux-2.6.0-test8.tar.bz2
#mv linux-2.6.0-test8.tar.bz2 /usr/src
#tar jxvf linux-2.6.0-test8.tar.bz2

2.进入相应的目录编译和安装,进入内核选项设置

#cd linux-2.6.0-test8

#make mrproper
#make menuconfig

进入内核选项卡,M是以模快方式编译,*是直接编入内核

致于哪些要编入内核,哪些要编译成模块。在文章管理器和基础讨论区的帖子中都有,自己试着找一找。另外内核中的doc也有相应的文档
3.编译和安装内核

#make
#sudo make install

这个过程是编译和安装内核的过程,系统自动为我们做了哪些事?

1]系统会在/usr/src/linux/arch/i386/boot/目录中产生bzImage,并把bzImage复制为vmlinuz-2.6.0-test8到/boot目录中,并创建议vmlinuz-2.6.0-test8的链接vmlinuz;

2]在/boot目录中,系统会产生System.map-2.6.0-test8,以及创建它的链接System.map;

3]在/boot目录中,自动生为initrd-2.6.0-test8.img;

4]修改/etc/grub.conf 文件,加入了新内核的启动项。

[注]经大熊宝宝兄的提示,怕初学的弟兄不明白这个过程,所以就把这个过程详细的写出来,所以我也做了补充。以上的四点都是系统自动安装内核时所做的任务。查看一下/boot目录中的文件以及/etc/grub.conf就明白了。这一点和以往2.4.x不一样的地方。做个比喻就是2.4.x还是半自动的,上面的东西要执行好多个命令,而在2.6.x中,一步就到位,是全自动的!

4.编译和安装模快

#make modules
#make modules_install

5.设置/etc/grub.conf,我不用lilo,更确切的来说,我不太懂,所以只能说Grub的设置办法。

为什么要设置这个呢?其实在编译和安装内核的过程中,系统已经自动把新内核的启动项直接添加到了/etc/grub.conf中。当我们不对/etc/grub.conf进行改动,直接启用新内核会发现VFS错误之类的提示。

下面的是我安装后新内核后,没有改动过的/etc/grub.conf

title Fedora Core (2.6.0-test8)
root (hd0,7)
kernel /boot/vmlinuz-2.6.0-test8 ro root=LABEL=/
initrd /boot/initrd-2.6.0-test8.img
title Fedora Core (2.4.22-1.2061.nptl)
lock
root (hd0,7)
kernel /boot/vmlinuz-2.4.22-1.2061.nptl ro root=LABEL=/
initrd /boot/initrd-2.4.22-1.2061.nptl.img

改动后的就是
title Fedora Core (2.6.0-test8)
root (hd0,7)
kernel /boot/vmlinuz-2.6.0-test8 ro root=/dev/hda8
initrd /boot/initrd-2.6.0-test8.img
title Fedora Core (2.4.22-1.2061.nptl)
lock
root (hd0,7)
kernel /boot/vmlinuz-2.4.22-1.2061.nptl ro root=LABEL=/
initrd /boot/initrd-2.4.22-1.2061.nptl.img

对比改动过的/etc/grub.conf,我们不难发现,我们在新内核2.x中,指定root的根分区所在的位置时,没有用标签LABEL=/,而是用的是真正的分区位置。

请对Linux不太熟的弟兄,不要照搬我的分区设置。如果想知道这方面的,在基础讨论区中,有关于GRUB和分区访问的文章,在文章管理器中也有。

最后还有一点就是如果显示卡原来安装过驱动,就要在新内核中重新安装。比如我用的是NVIDIA的显卡,我下载的是LinuxSir.Org的下载区中,哈兄提供的打过补丁的NVIDIA的驱动。装上就OK了。

可能文中有不少错误,请大家指正。

多谢

Dragonfly 发表于 2003-10-24 22:35:52

thx

小西 发表于 2003-10-25 12:23:06

thx
谢谢你!!!

aniuge007 发表于 2003-10-25 13:01:15

好象是错的。 :idea:

txr 发表于 2003-10-27 11:34:59

The command "make" includes "make modules",so you do not need to use "make modules" command again.

gundon 发表于 2003-10-27 17:36:15

谢谢

redhat008 发表于 2003-11-28 16:51:02

我按照这个方法试过,有点问题!总是出现什么Kernel panic:…………no init …………try option…………(记不清楚了)错误!!

cnlong 发表于 2003-11-29 09:47:24

我觉得编译内核在查资料时要多查几家资料,综合比较,
有时听一家之言,人家能做成功的步骤你来照搬不一定能成功.

netwolf 发表于 2003-11-29 13:51:48

我按照这个方法试过,有点问题!总是出现什么Kernel panic:…………no init …………try option…………(记不清楚了)错误!!

你的是ext3文件系统吧,把ext3编进内核就可以了。
我也试了好几次

redhat008 发表于 2003-11-30 18:40:42

已经找出原因了 :-D ,谢谢!!

stanley 发表于 2003-12-1 12:54:01

在我这里会出错,我把sudo make install 最后执行就行,并且不用改grub.conf,改了反而在启动时出现Kernel panic.No init found,try init=option的错误。我的内核是2.6.0-test11,我记得以前编译2.4.22是要改grub.conf中的root=LABEL=/为root=/dev/hdxx的。

SKyPP 发表于 2003-12-2 19:41:40

我一直这么编译
make mrproper
make bzImage
cp arch/i386/boot/bzImage /boot/
cp System.map /boot/
然后修改/boot/grub/grub.conf
title linux new kernel
root (hd0,5)
kernel (hd0,9)/boot/bzImage ro root=/dev/hda10
initrd (hd0,9)/boot/System.map
我的grub安装在hda6,linux根分区在hda10
然后,有空的话,就
make modules
make modules_install

guanhuaming 发表于 2003-12-19 12:50:02

地球上的人都知道这些,问题是配置文件难理解啊!

littlezgj 发表于 2004-1-10 21:28:27

谢谢大侠们!!!

guanhuaming 发表于 2004-1-11 13:56:19

这种文章也算得上精华?编译内核没什么难难就难在对配置文件的理解上!!!
页: [1] 2
查看完整版本: Kernel 2.6x 编译过程