找回密码
 注册
查看: 5276|回复: 0

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

[复制链接]
发表于 2011-3-31 00:02:44 | 显示全部楼层 |阅读模式
iThink Slax 6.3.1 构建之[一]内核编译笔记                                                                                                                « 于: 2011 年 03 月 24 日, 20:55:13 »
                                                                                                                                                                                                                                                                                                                                         
本版 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 版时,我决定公开整个制做过程,以便于大家一起研究改进。

好了,多的不说了,先贴笔记吧。

准备工作
首先,我到 kernel.org 中 git 了一份 2.6.37.4 的最新版本
  1. cd /tmp
  2. mkdir kernel
  3. cd kernel
  4. git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-2.6.37.y.git
复制代码

因为硬盘资源紧张,所以,下载完成后,我清理了一下下下来的源码。
  1. mv linux-2.6.37.y linux-2.6.37.4
  2. cd linux-2.6.37.4
  3. rm -rf .git
复制代码

然后我去下载了 aufs 和 squashfs+lzma 的补丁:
  1. cd /tmp
  2. mkdir patch
  3. cd patch
  4. wget http://www.ponce.cc/porteus/i486/current/packages/kernel-sources/porteus-v09-kernel-patches.zip
  5. mkdir porteus
  6. cd porteus
  7. unzip -x ../porteus-v09-kernel-patches.zip
复制代码

这个可是重点补丁,少了它,live 系统就 live 不起来了。

接下来,是准备为内核打 Framebuffer UTF-8 中文显示补丁,这个补丁分为两部份:
第一部份,是内核程序补丁
  1. cd /tmp
  2. cd patch
  3. wget http://zdbr.net.cn/download/utf8-kernel-2.6.37-core-1.patch.bz2
  4. bzip2 utf8-kernel-2.6.37-core-1.patch.bz2
复制代码

第二部份,是内核utf-8 字库
  1. wget http://zdbr.net.cn/download/utf8-kernel-2.6-fonts-3.patch.bz2
  2. bzip2 -d utf8-kernel-2.6-fonts-3.patch.bz2
复制代码

好了,现在准备工作 ready 了,可以开始正式工作了。。

给内核打补丁
多的不说,直接上命令吧:
  1. cd /tmp/kernel/linux-2.6.37.4
  2. patch -Np1 < /tmp/utf8-kernel-2.6.37-core-1.patch
  3. patch -Np1 < /tmp/utf8-kernel-2.6-fonts-3.patch
  4. patch -Np1 < /tmp/patch/porteus/squashfs-lzma.patch
  5. patch -Np1 < /tmp/patch/porteus/aufs/aufs.patch
复制代码

这是第一步,初步内核补丁工作完成了,但是这里有一点要注意,因为 aufs 补丁不光是打完补丁就完事了,还需要把相关源码拷贝到内核相关目录中去。
  1. cp -dprR /tmp/patch/porteus/aufs fs/
  2. cp -dprR /tmp/patch/porteus/aufs/Documentation/ABI/testing/* Documentation/ABI/testing
  3. 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源码的了解又近于白痴,所以放弃了这两个补丁。

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

编译内核
直接上命令,等有需要说明的时候再补充一下:
  1. cd /tmp/kernel/linux-2.6.37.4
  2. cp /boot/.config .
  3. 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 或者 直接回车,则表示不选当前模块,并且这个模块不参与编译,放弃此项功能或驱动

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

1、内核压缩方式,我选的是 lzma 方式,这个在第一个常规选项里
---[General setup]/[kernell compression mode]
2、process 选项里,我选的 i586 处理器
---[Processor type and features]/[Processor family]
3、内存选的是 64G 模式(也就是PAE)
---[Processor type and features]/[High Memory Support]
4、loop device 选 Y,表示内置它,这里要说一下,以前的SLAX这里选的是 m 表示可以生成一个 loop.ko 文件,但是新版 squashfs 4 以后,我发现,这个驱动外置的后果很严重,会造成 loop 设置数量受限的问题。
---[Device Drivers]/[Block device]/[Loopback device support]
5、squashfs 里要选 lzma 和 lzo 压缩支持,其它的都不选,另外,squashfs 本身要选择为 m,即外挂
---[File systems]/[Miscellaneous filesystems]/[SquashFS 4.0 - Squashed file system support]
6、aufs 选择为 m 外挂,其中 Maximum number of branches 选项中,我选的是 511 ,这是我自己测出来确实是压缩和效率都比较均衡的值了
---[File systems]/[Miscellaneous filesystems]/[Aufs (Advanced multi layered unification filesystem) support]

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

累死我了!

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

安装内核
编译成功完成后,安装内核,主要有以下步骤。
一、安装内核模块(你也可以说这就是外挂驱动,虽然驱动这个词不是很准确)
  1. INSTALL_MOD_PATH=/tmp/newkernell-2.6.37.4 make modules_install
复制代码
二、提取内核头文件
  1. make headers_install ARCH=i386 INSTALL_HDR_PATH=/tmp/newkernel-2.6.37.4/usr
复制代码
三、提取内核及保存内核配置文件
  1. mkdir /tmp/newkernel-2.6.37.4/boot
  2. cp arch/x86/boot/bzImage /tmp/newkernel-2.6.37.4/boot/vmlinuz  (注意字母大小写!)
  3. cp .config /tmp/newkernel-2.6.37.4/boot
复制代码
四、保存内核源码
  1. make clean
  2. make prepare
  3. mkdir /tmp/newkernel-2.6.37.4/usr/src/linux-2.6.37.4
  4. cp -dprR * /tmp/newkernel-2.6.37.4/usr/src/linux-2.6.37.4
复制代码

至此,内核算是基本完成了,所有内核文件都存放在了 /tmp/newkernel-2.6.37.4 目录中了。不过别忘了,还有点收尾工作,非常重要

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

  1. cd /tmp/newkernel-2.6.37.4
  2. find usr/include -name .install -or -name ..install.cmd | xargs rm -fv
复制代码

修补链接
首先,修正安装内核时,内核源码指向链接错误

  1. cd /tmp/newkernel-2.6.37.4/lib/modules/2.6.37.4
  2. rm build
  3. rm source
  4. ln -sf /usr/src/linux-2.6.37.4 build
  5. ln -sf /usr/src/linux-2.6.37.4 source
复制代码

然后,创建一个内核源码链接
  1. cd /tmp/newkernel-2.6.37.4/usr/src
  2. ln -sf linux-2.6.37.4 linux
复制代码

至此,才算是完成了整个内核的工作!
你可以打包这个目录了,做份备份存档,呵呵
  1. cd /tmp
  2. 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 本人所使用的工具脚本,欢迎大家一起来研究讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2021-12-1 02:51 , Processed in 0.045054 second(s), 15 queries .

© 2021 Powered by Discuz! X3.4.

快速回复 返回顶部 返回列表