http://www.linuxsir.org/bbs/showthread.php?s=&threadid=80090
发现还是很多人问关于内核编译的问题,所以一时性起发个帖子总结一下。
2.6.0 的编译方法已经简洁了很多,下面的办法假设你的现有系统上已经具备了所有操作所需要的东西(绝大多数系统默认都已经提供)
1.下载
在 http://www.kernel.org/pub/linux/kernel/v2.6/ 下载 linux-2.6.0.tar.bz2
选择 bz2 的原因就是压缩比高,节约点时间 。
2.解压
代码:
# cd /usr/src
# tar xvjpf [$NEW-KERNEL-PATH]/linux-2.6.0.tar.bz2
$NEW-KERNEL-PATH 就是你刚才将新内核下载到的路径,以下操作都在 /usr/src 目录下完成
3.配置
代码:
# make mrproper
# make menuconfig
make mrproper 是清理代码树的动作,保证源代码是干净的
make menuconfig 如果失败,很可能是 ncurses 库没有装,可以用 make xconfig 或者 make config 来替代
4.编译
如果不放心,也可以用旧的命令:make bzImage && make modules 。
5.安装
如果不放心,也可以用 cp [$bzImage-PATH]/bzImage /boot/vmlinuz-2.6.0 && cp System.map /boot/System.map-2.6.0 来替代
另外, make modules_install 也一样还可以用。
不过,建议在没有 make clean 之前,如果增加了新的模块,可以直接 make menuconfig && make moduels && make modules_install,不需要全部重新来过
6.检验
如果看到了 vmlinuz-2.6.0 和 System.map-2.6.0 ,那么恭喜你,成功了!
如果你是用 make install 安装的,还会看到个 config-2.6.0 文件
7.清理
如果你以后还要利用这次编译的成果,也可以省略这一步,如果你想直接删除源代码目录,也可以省略这一步。
8.修改 grub
在 grub 的配置文件中进行修改,增加新内核的支持。建议保留旧内核的项目,避免编译失败后痛哭流涕 。
通常 grub 配置文件在下面三个地方(根据发行版的不同):
/etc/grub.conf
/boot/grub/menu.lst
/boot/grub/grub.conf
根据你的实际情况来修改。
修改参照下面:
代码:
title Kernel 2.6.0
root (hd0,0)
kernel /vmlinuz-2.6.0 ro root=/dev/hda1
将 (hd0,0) 和 /dev/hda1 换成你的实际信息,如果重新启动后出现 kernel panic 错误或者显示应该修改 init 信息,则基本都是 kernel 语句错误。
8.其他
如果你的 kernel 支持内存镜像,就用 mkinitrd 命令制作一个镜像文件,然后拷贝到 /boot 路径下。通常在 redhat 的 /boot 下有一个 initrd-2.6.0.img 就是这么做的,呵呵。不过这个步骤似乎并非必要,而且很多发行版默认不提供
mkinitrd 命令。就算你真的非要这么做,也要记得在 make menu 的时候记得选择内核镜像 ram image,并且不能安装为模块,否则 initrd 就不会运作。
最后,Enjoy It!
以上如果有什么地方有问题或者新的东东,希望大家提出来,群策群力 。
=============================================
其实,内核编译,简单来说就是:
make mrproper
make menuconfig
make
make install ( make modules_install 可选 )
make clean
============================================
如果你使用非 root 帐号,执行类似 make install 这样的指令,可能不成,需要 sudo make install 。
如果提示没有 sudo 指令,需要执行 su 取得超级用户的权限。
===========================================
我也是这样编译的,但重启后出现一句错误提示后就死锁了:
kernel panic : no init found ,try passing init = option to kernel.............
重编译了几次都这样..........
------------
看第7点,通常是 kernel 中 root 参数不正确
根据你硬盘实际情况修改
请参考硬盘文件命名规则
比如第一块IDE硬盘的第一个扩展分区是 /dev/hda5
第二块SCSI硬盘的第一个主分区是 /dev/sdb1
============================================
kernel panic 错误通常源自类似这样的语句:
kernel /vmlinuz-2.6.0 ro root=/dev/hda1
昨天晚上在我自己的机器上也测试了一下
我自己的配置是:
kernel /vmlinuz-2.6.0 ro root=/dev/hdb3
平时一切正常。
我在引导时,按 c 进入 grub 控制台,然后将指令改为:
kernel /vmlinuz-2.6.0 ro root=/dev/hdb1 (第二块硬盘的 /boot 分区)
然后顺利的出现了 kernel panic error,提示 init= 错误。
我想和你们的状况大概是相同的。
我想,可能很多人理所当然的认为 root 参数后面应该是 /boot (第一个分区)的,其实应该是 / (也就是所有目录的 root)所在分区。
==============================================
按你的方法我已成功启用新内核,可有一个问题:
启动时,
报QM_MODULES:Function not implement ,不知道为何?
谢谢了。。
---------------
===============================================
其实我觉得以下的顺序应该更好
make mrproper
make menuconfig
配置
make && make modules && make modules_install && make install
之后什么都不用改,直接重启就好了
如果去掉了make modules && make modules_install的话
在我的电脑上无法正常完成编译
--------------------
呵呵,你用的就是 2.4.x 的编译方式,2.6.x 也支持
只是 2.6.x 有简化方法而已
================================================
如果你编译了模块,make install之前必须要make moudules_install,要不干脆make modules_install install
================================================
kernel panic : no init found ,try passing init = option to kernel
我修改了grub.conf的root都不行啊?
我是这样装的,我装在hdc上的,我怎样设置啊?
---------------
root=/dev/hdc(n)
例如 root=/dev/hdc3
=================================================
谢谢楼主,但还是不行? n是指hdc的第一个扩展分区,是吗?
"通常ext3编译成模块而又没有配置好modprobe.conf正常加载的话,就会出现kernel panic的错误,最好还是把主要的几个文件系统编译进内核。":这句话应该怎么去做?
------------
具体原理我还说不清楚,不过依据我的经验,出现kernel panic的原因有二。
一是通用的ext2,ext3,ramfs文件系统没有在配置内核make menuconfig时选择编译进内核;二是新内核在挂载/proc方面和fedora启动脚本的冲突,造成LABEL=/不能在/etc/fstab中使用,这时要改成设备名/dev/hdaX(X是你的根分区在Linux中的编号)。
其实最好还是用自己的lfs来试验新内核,这样很多奇怪的问题都可以避免。
===================================================
文章评论(0条评论)
登录后参与讨论