applewolf 发表于 2011-3-31 00:02:44

iThink Slax 6.3.1 构建之[一]内核编译笔记

iThink Slax 6.3.1 构建之[一]内核编译笔记                                                                                                                « 于: 2011 年 03 月 24 日, 20:55:13 »
                                                                                                                                                                                                                                                                                                                                       http://ithink.8866.org/smf/Smileys/default/smiley.gif
本版 iThink Slax 6.3.1 按计划采用了 2.6.37.4 内核。

同时,参考了 slackware-current 2011-03-15 版本,保持与官方版本一至。

介绍一下这次我的开发平台就是 iThink Slax 6.3.0,由于630系统是首个与官方 Slax 分离的测试平台,所以,非常多不足之处,其中包括内核选项不合理,适成在 i 系列CPU上启动失败的BUG,还包括在不少平台上存在无法进入桌面的问题(应该是源自xorg 部份存在问题,并未分析出结果)等等,一堆BUG,所以,在这次制做 iThink Slax 6.3.1 版时,我决定公开整个制做过程,以便于大家一起研究改进。

http://ithink.8866.org/smf/Smileys/default/grin.gif 好了,多的不说了,先贴笔记吧。

准备工作
首先,我到 kernel.org 中 git 了一份 2.6.37.4 的最新版本
cd /tmp
mkdir kernel
cd kernel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.37.y.git
因为硬盘资源紧张,所以,下载完成后,我清理了一下下下来的源码。
mv linux-2.6.37.y linux-2.6.37.4
cd linux-2.6.37.4
rm -rf .git
然后我去下载了 aufs 和 squashfs+lzma 的补丁:
cd /tmp
mkdir patch
cd patch
wget http://www.ponce.cc/porteus/i486/current/packages/kernel-sources/porteus-v09-kernel-patches.zip
mkdir porteus
cd porteus
unzip -x ../porteus-v09-kernel-patches.zip
这个可是重点补丁,少了它,live 系统就 live 不起来了。

接下来,是准备为内核打 Framebuffer UTF-8 中文显示补丁,这个补丁分为两部份:
第一部份,是内核程序补丁
cd /tmp
cd patch
wget http://zdbr.net.cn/download/utf8-kernel-2.6.37-core-1.patch.bz2
bzip2 utf8-kernel-2.6.37-core-1.patch.bz2
第二部份,是内核utf-8 字库
wget http://zdbr.net.cn/download/utf8-kernel-2.6-fonts-3.patch.bz2
bzip2 -d utf8-kernel-2.6-fonts-3.patch.bz2
好了,现在准备工作 ready 了,可以开始正式工作了。。

给内核打补丁
多的不说,直接上命令吧:
cd /tmp/kernel/linux-2.6.37.4
patch -Np1 < /tmp/utf8-kernel-2.6.37-core-1.patch
patch -Np1 < /tmp/utf8-kernel-2.6-fonts-3.patch
patch -Np1 < /tmp/patch/porteus/squashfs-lzma.patch
patch -Np1 < /tmp/patch/porteus/aufs/aufs.patch
这是第一步,初步内核补丁工作完成了,但是这里有一点要注意,因为 aufs 补丁不光是打完补丁就完事了,还需要把相关源码拷贝到内核相关目录中去。
cp -dprR /tmp/patch/porteus/aufs fs/
cp -dprR /tmp/patch/porteus/aufs/Documentation/ABI/testing/* Documentation/ABI/testing
cp -dprR /tmp/patch/porteus/aufs/include/linux/aufs_type.h include/linux最后一句请特别注意,不要把aufs 补丁中 include/linux/目录里的所有文件都拷入内核的include/linux/目录中,余下的那个Kbuild 千万不要拷,切记,如果不信,你把两个目录中的 Kbuild 打开对比一下就知道了。

本来还想打BFS补丁和鸡血补丁的,但是经测试,结果发现,鸡血补丁完全不支持BFS,而鸡血补丁打上后,可能是源码要经过修正,总是提示函数的写法尚未被支持,然后出错中断,但是非常有意思的是,如果CPU类型选为 pentium pro 反而可以通过编译, Google 了一下,没找到解决方案,而我对C源码的了解又近于白痴,所以放弃了这两个补丁。

至此,补丁工作完成。开始正式的内核编译过程。

编译内核
直接上命令,等有需要说明的时候再补充一下:
cd /tmp/kernel/linux-2.6.37.4
cp /boot/.config .
make oldconfig唉。。。。逃不走啊,这里就要说明一下了。
之所以要 cp .config 文件,主要是,继承大量的原版 iThink Slax 内核的配置,当然,我的主要目的是为了省力,省去再一项项点选驱动了,如果你的内核没有 .config 这个文件,那么也没关系,可以直接生成一个,用 make menuconfig 或者make xconfig 都可以。
至于 make oldconfig 主要是因为新老内核在内容上有非常多的变化,所以,需要先把老内核文件与新内核同步,在执行这条命令时,会出很多选项,大多是回答 y/n/m 的,我在这里的原则是,能 m 则 m ,遇 debug 时,全都跳过不选,遇到必须的,又没有 m 选项的,才会选y。
这里:
y 是指把这个模块编译进内核文件中,成为内置模块(就是那个 vmlinuz)
m 是指,把这个模块编译成外挂模块,这就是常见的那种 .ko 驱动之类的模块
n 或者 直接回车,则表示不选当前模块,并且这个模块不参与编译,放弃此项功能或驱动

累!接上回打命令:
make xconfig
make scripts
make prepare
make all这里就说一下最上面的 make xconfig ,这条命令会打开一个图形界面的内核配置界面,在这个界面中,你可以更详细清晰地看到所有的模块选项(还配有每个选项的说明哦),在这里,你选择自己需要的就行了,不过这里我说一下我的几个重点检查的地方:

1、内核压缩方式,我选的是 lzma 方式,这个在第一个常规选项里
---/
2、process 选项里,我选的 i586 处理器
---/
3、内存选的是 64G 模式(也就是PAE)
---/
4、loop device 选 Y,表示内置它,这里要说一下,以前的SLAX这里选的是 m 表示可以生成一个 loop.ko 文件,但是新版 squashfs 4 以后,我发现,这个驱动外置的后果很严重,会造成 loop 设置数量受限的问题。
---//
5、squashfs 里要选 lzma 和 lzo 压缩支持,其它的都不选,另外,squashfs 本身要选择为 m,即外挂
---//
6、aufs 选择为 m 外挂,其中 Maximum number of branches 选项中,我选的是 511 ,这是我自己测出来确实是压缩和效率都比较均衡的值了
---//

以上几点是要特别注意一点的,另外,老机器的兄弟们就不要选 64G 内存了,这可能与你的CPU不兼容。

累死我了!

如果不出意外的话(当然,在630上编译是没什么意外了),编译会顺利完成,如果出错了,最偷懒的办法是看清楚错误出现在哪个模块文件上,跑到xconfig 中去掉它,嘿嘿,不过别忘了清理,重配置完成后,强烈建议再执行一下下面两条命令:
make clean
make scripts
make prepare然后再重新 make

安装内核
编译成功完成后,安装内核,主要有以下步骤。
一、安装内核模块(你也可以说这就是外挂驱动,虽然驱动这个词不是很准确)
INSTALL_MOD_PATH=/tmp/newkernell-2.6.37.4 make modules_install二、提取内核头文件
make headers_install ARCH=i386 INSTALL_HDR_PATH=/tmp/newkernel-2.6.37.4/usr三、提取内核及保存内核配置文件
mkdir /tmp/newkernel-2.6.37.4/boot
cp arch/x86/boot/bzImage /tmp/newkernel-2.6.37.4/boot/vmlinuz(注意字母大小写!)
cp .config /tmp/newkernel-2.6.37.4/boot四、保存内核源码
make clean
make prepare
mkdir /tmp/newkernel-2.6.37.4/usr/src/linux-2.6.37.4
cp -dprR * /tmp/newkernel-2.6.37.4/usr/src/linux-2.6.37.4
至此,内核算是基本完成了,所有内核文件都存放在了 /tmp/newkernel-2.6.37.4 目录中了。不过别忘了,还有点收尾工作,非常重要

清理头文件中的垃圾
安装好的内核产生的头文件目录中有非常多的安装脚本文件,我们需要清理掉它。

cd /tmp/newkernel-2.6.37.4
find usr/include -name .install -or -name ..install.cmd | xargs rm -fv
修补链接
首先,修正安装内核时,内核源码指向链接错误

cd /tmp/newkernel-2.6.37.4/lib/modules/2.6.37.4
rm build
rm source
ln -sf /usr/src/linux-2.6.37.4 build
ln -sf /usr/src/linux-2.6.37.4 source
然后,创建一个内核源码链接
cd /tmp/newkernel-2.6.37.4/usr/src
ln -sf linux-2.6.37.4 linux
至此,才算是完成了整个内核的工作!
你可以打包这个目录了,做份备份存档,呵呵
cd /tmp
dir2lzm newkernel-2.6.37.4 newkernel-2.6.37.4.lzm
搞定!收工!

其实做起来就这么点事,写起来一大堆啊!

下一贴将写一下,如何生成 initrd 这个文件以及如何启用已经做好的内核。

AppleWolf 原创贴,转贴时麻烦留我一小名!

各位 Linux 爱好者,iThink Slax 非常渴望大家的加入,共同研究,共同努力,搞出我们国人自己的完善的 Live 化系统来。

同时,从 6.3.1 版开始,iThink Slax 将在论坛公开所有 AppleWolf 自己所懂的经验与技术,同时也会公开所有 AppleWolf 本人所使用的工具脚本,欢迎大家一起来研究讨论。
页: [1]
查看完整版本: iThink Slax 6.3.1 构建之[一]内核编译笔记