在Debian中编译内核
VMware中,Debian Sarge,内核版本2.6.8-2。试图重新编译内核。
上网搜罗相关文章,中英文俱有。但我需要的,是严谨而细致的手册。到LinuxSir的Debian板块,打开这两篇文档作为参考:
1.http://debian.linuxsir.org/book/reference/lyoo/ch-kernel.html
2.http://debian.linuxsir.org/book/faq/etony/ch-kernel.zh-cn.html
第一个相对详细,第二个日期更新一些。
适当重视文档的写作时间,例如倘是2002年的,那时效性可能差一些。
开始,按照Debian方式。这是一种简化和优化了的方式。
所谓Debian方式,就是以Debian的软件包管理方法来处理问题。
所以使用kernel-package中的工具make-kpkg来编译内核。
最终产生一个deb包,然后使用软件包管理工具dpkg来安装或卸载。
先前曾安装过Debian安装盘中的内核源码,以及kernel-package包。
到/usr/src下,可看到名为kernel-source-2.6.8.tar.bz2的压缩包。
到/usr/share/kernel-package下,可看到一篇名为README的文档。
它包含了编译内核所需的大部分内容,并且解说细致,条理清晰。
从该Readme文档以及那篇FAQ(前面提到的第二个链接)中,
可以知道编译内核首先需要安装哪些软件包。
除了系统必备的一些,其它的软件包,逐一搜索检查。
如果没有,则用Debian安装盘全部装好。
从该README文档中可以得知具体步骤和要执行的命令。
到/usr/src下,解压缩源码包,配置,编译。
在我编译之前,从README文档中得知,initrd并非必须。
如果有它,即使启动时内核镜像所在文件系统的驱动作为内核模块存在也可以。
如果没有它,那么该文件系统驱动必须被直接编译到内核中而非内核模块中。
如果需要initrd,则应当先为内核源码打cramfs补丁,再开始编译内核。
当然除了打cramfs补丁外,还有一种办法,见相关文档。
但是,既然完全可以不要initrd,那为什么要它?
所以我在编译内核时没有加--initrd参数,
并且也不打算之后使用mkinitrd等工具来生成它。
整个过程执行了这样的命令:
cd /usr/src
tar -jxvf kernel-source-2.6.8.tar.bz2
cd kernel-source-2.6.8
本来还想从/boot目录中找个当前的配置文件作为我的默认配置。
但我后来忘记做这个了。
make gconfig
尝试了make xconfig,觉得还是gconfig更好一些。
修改完成并保存后,当前目录下多了一个隐藏文件.config。
我多次反复用make gconfig修改了它。
其间我到slackware的FTP上找了一个config文件作参考。
之后执行了这些命令:
make-kpkg clean
make-kpkg --revision=custom.1.0 kernel_image
由于我用root用户登录的,所以我不需要文档中提到的fakeroot之类。
cd ..
这里发现产生了一个kernel-image-2.6.8_custom.1.0_i386.deb。
dpkg -i kernel-image-2.6.8_custom.1.0_i386.deb
从安装过程的提示信息中,可以看出:
新编译好的内核和模块都被自动安装到恰当的位置了。
相关配置文件也修改好了。
自动搜索到了grub,并且自动修改了grub的配置文件。
打开grub的配置文件,发现新内核的配置项已添加到现有内核配置之后。
我大喜,重新启动计算机,选择新的内核。
启动失败,提示
kernel panic:VFS:Unable to mount root fs on unknown-block ...
我的确已经将ext2和ext3都直接编译到内核里了。
不知为何。
想过妥协,弄个initrd出来,估计应该可以启动。但没有那样做。
我选择了继续摸索,绝不使用initrd!
Update: 多次尝试,终于发现问题所在,虽然将文件系统驱动直接编译进了内核,但硬盘是SCSI的,我却没有选上一些SCSI所需的驱动。新内核成功运行。
顺便说一句,过程可以散漫,态度不可不严谨。
标签: Linux

Atom


0 条评论:
发表评论
<< 主页