很好的一片博客,以前看过,再去搜的时候,花了很久时间才搜到,记录下来。
cukdd.blog.chinaunix.net
http://blog.chinaunix.net/uid-24585858-id-2125490.html
开始之前,先简单唠叨两句。 编译并使用一个自定义的内核,若想得到官方的支持是非常困难的。然而你可以增加学习的经验,尽管如此,使用你自己编译的内核是不允许上报bug的。如果你这样做了,将会被官方无任何解释的拒绝。
如果你是以下几种情况之一,那么你将有理由去编译自己的内核:
- 你是一个内核开发者。
- 你需要已经编译好的内核的一个特殊的方面,并且官方网站上有没有将其编译进内核(例如,需要开启一些试验阶段的特性)。
- 你试图调试并去除官方网站上已提供内核上的bug。
- 官方网站上提供的内核不支持你的硬件体系结构。
相反,如果你是以下几种情况之一,那么你最好不要编译内核:
- 你仅仅需要编译一个特殊的驱动。为了这样做,你仅仅需要安装linux-headers源码软件包即可。
- 你不知道你在做什么,并且如果你损坏了一些东西,想试图寻求帮助来修复它。依据发生错误时你所作的操作,你可能需要重新安装你的系统才可以修复损伤。
感谢您耐心地看到了这里,下面让我们一起进入正题。
- 背景知识
由于在32位机器上编译生成64位内核镜像文件,所以需要交叉编译环境。可以通过crosstool脚本工具自
动化配置。下载该工具可以通过点击下面的连接
http://www.kegel.com/crosstool/#download
下载后,在使用该工具时,最好先看看使用说明。
http://www.kegel.com/crosstool/crosstool-0.43/doc/crosstool-howto.html
这将会使你节省大量的时间,转而去做更多的工作^_^
小提示:在使用crosstool工具时,需要创建数个目录,当然也可以自定义设置,但是如果你选择在/opt/目录或是其他具有root权限的目录中创建的话,那么这时为了减少对后续工作的不必要的麻烦,建议你可以使用如下命令设置一下上述目录的使用权限: chown -R <user>.<user> <directory> user为你当前用户的名称 |
2. 编译内核
不管是交叉编译还是其他方式的编译,内核编译过程大体上可以分为以下几步(但这里主要讲解交叉编译,其余情况直接将make命令行编译选项去掉即可):
第一步:产生配置文件和Makefile
这里的配置文件是.config。可以通过命令:
make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- oldconfig/muneconfig |
产生。在该命令执行过程中,需要用户参与内核参数的配置。这些配置最终将会决定你的内核所具有的特性。命令执行完成后,配置文件.config和规则文件Makefile将会被生成。
第二步:编译并生成压缩内核镜像文件bzImage(该文件名也由.config文件来决定)
执行如下命令即可。
make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- |
小提示
:有些文章可能会建议你,在使用make编译内核时可以利用多核参数选项(-j2),可以加快编译速度。但这里根据我的编译经验来告诉你,最好不要使用该选项。因为目前阶段多核协同工作技术还不成熟,在编译时总是会出现编译不完全致使新内核无法正常引导的情况。
第三步:编译内核模块(modules)
在.config文件生成过程中,你会看到很多'm'的配置选项。这些选项就是在这里起作用的。它来告诉编译器哪些部分以内核模块的方式进行组织。好了,下面就是目标模块的生成命令:
make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- modules |
第四步:安装内核模块
可以通过下面的命令,将第三步中生成的模块安装到modules/目录中。
make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- modules_install |
第五步:生成内核镜像文件
该镜像是系统在boot时使用的文件。可以通过下面的命令生成:
mkinitramfs ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- -o initrd.img-<your kernel version> <your kernel version> |
3. 配置新内核的启动引导环境
对于刚编译生成的内核,若想让它成功引导系统需要完成下面的工作:
cp initrd.img-<your kernel version> /boot/ cp arch/x86_64/boot/bzImage /boot/vmlinuz-<your linux version> cp System.map /boot/System.map-<your linux version> |
最后,生成启动项配置文件
OK! 到这里我们就可以
系统了。正常情况下,新内核会被顺利的加载并执行。但是如果编译内核时,你的配置不正确,或是使用的编译器过低,或是被链接入镜像文件的资源版本过低,就会出现引导失败的情况。这是你就要好好检查编译环境和配置文件了,然后重新进行2中的操作,修正new kernel中的bug.
提示:cross compile是非常困难的一件事情,除非你非常有兴趣或是有大量的时间,否则建议你还是去官方网站上下载64Bit镜像文件为好。