老旧文章/KernelBuildpackageDetailedHowto

来自Ubuntu中文
跳到导航跳到搜索

by Markus Kolb <ubuntu-ml -at- tower-net.de> December 25th 2004 这里介绍通过非官方途径编译你自己的内核.如果你不明白为什么需要自己定制的内核,你就没有必要阅读本文。

对于一般用户,使用ubuntu提供的官方内核可能更好,因为这样你可以自动并且安全的获得更新,也没有必要一次又一次的自己去编译内核。

但有时需要自己对运行的内核作些更改.或许一些附加特性的补丁和重要的修正并不包括在官方的内核中. 还有些人希望有针对他们电脑配置的更小的优化过的内核.

这篇how-to并不会讲怎样的内核配置选项才能使你所有的东西完美运行.如果你想要移除某些内核选项,你必须明白你在做什么或者敢于尝试和犯错误.

你必须使用Ubuntu Linux系统进行以下程序。 你不能在其他的发行版中,比如Debian,来通过Ubuntu的源码来编译Ubuntu内核,除非使用某些技巧. 请保持耐心,告诉我我用英语的过程中是否有失误.我是德国人,(使用英语)自然不会十分完美.

这份指南适用于Ubuntu 4.10(Warty Warthog)

Changes

  • Dec, 25th 2004 – Markus Kolb – publication of the howto.
  • Apr, 23rd 2005 – Chris Fazekas – added 'sudo apt-get install devscripts' to install required app 'dch'.

内核编译和 Debian 包编译需要的包

  • 你首先需要确认 /etc/apt/sources.list 中的以下行未被注释:
deb-src http://archive.ubuntu.com/ubuntu/ warty main restricted
deb-src http://security.ubuntu.com/ubuntu/ warty-security main restricted
  • 现在你需要运行:
$ sudo apt-get update

你可以使用以下命令来安装编译所需要的软件包:

$ sudo apt-get build-dep linux-source-2.6.8.1
$ sudo apt-get install fakeroot
$ sudo apt-get install devscripts

下载正确的 Ubuntu 内核源码

  • 不要使用二进制库 (binary repository) 中的linux源码包 (linux-source packages) . 这些包产生的进程不能产生正确的映像,Ubuntu 将不能正常运行,除非人为介入. 所以你还必须下载Ubuntu使用的正确的内核源码包.
  • 下载源码时,将当前目录更改到你希望保存该源码的位置: 然后运行:
apt-get source linux-source-2.6.8.1
  • 三个文件会被下载 源码的描述文件,extension.dsc,gzip 打包的原始的内核源码和 gzip 打包的 diff 文件,里面包括原始源码和 Ubuntu 源码的差别。
  • 这些文件将会被解压到 linux-source-2.6.8.1 的子目录,并打上 diff 的补丁. 你并不需要做任何事情.

如果你想要之后自己解压,你可以使用 dpkg-source-x <source-description.dsc>

在更改日志(changelog)中创建新的版本记录.

  • 从现在起每个目录的描述将会和源文件解压后的目录有关,如果没有专门指出更改到某个特定目录,你应该在源文件目录下. 你必须在 debian/changelog 中添加一条新的记录. 此时你可以使用工具 dch
$ dch -i
  • 将会在changelog中添加一条新的记录,包括添加增量后的版本号.并在你的文本编辑器中打开这个文件.你可以输入简短的描述说明你希望更改的内容,也可以调整版本号使之包括一个自定义的扩展. 例如最后一条存在的记录为:
  • linux-source-2.6.8.1 (2.6.8.1-16.5) warty-security; urgency=high
  • 添加增量后的记录将会是:
  • linux-source-2.6.8.1 (2.6.8.1-16.6) warty-security; urgency=low

如果你使用版本号 2.6.8.1-16.6 ,你将不能从Ubuntu的软件库中获得下次安全的升级.所以使用扩展替换为:

  • linux-source-2.6.8.1 (2.6.8.1-16.5custom) warty; urgency=low

更改内核配置

  • 内核配置在目录 debian/config 下
  • 每个架构和每个指定的处理器都有自己的配置文件. 所以如果你想为 i386 架构 686 处理器更改设置,你必须修改文件 debian/config/386/686 请记住我曾经告诉过你的话.如果你想要更改设置,你将只能靠自己独立完成. 如果你做错了某些事情,你电脑的某些硬件可能不会被支持,Linux启动时会有出错信息.

修改内核源码

  • 不要在源码中做这些事.有许多补丁会在源码编译的时候被合并.所以如果你更改了会被打补丁某部分,内核编译时会因错误而中止.
  • 但可以使用 dpatch 文件.这个文件通过官方途径来修改源码.

Dpatching 内核源码

  • dpatch 文件在 debian/patches 目录下.
  • 如果你有通过 diff-tool 工具创建的通常的 patch 文件,你可以用它来制作一个 dpatch 文件. 使用如下命令:
$ dpatch patch-template -p “{patchname}” “{patch-description}” < {diff-file} > debian/patches/{patchname}.dpatch
  • 如果你必须更改源码,你可以使用:
$ dpatch-edit-patch {new-patchname}
  • 这将会生成一个源文件目录的副本,并打开一个新的 shell .你可以对这个新的暂时的目录作任何更改.通过 "exit" 退出这个 shell 之后,所有的更改将会添加到新的 dpatch 文件( debian/patches/{new-patchname}.dpatch ) 中去.
  • 在作出更改之后你必须在编译时声明存在新的补丁.对此,你可以复制最新的 debian/patches/00list-* file (样例中为00list-16.5) 到 debian/patches/00list-*custom (例如 00list-16.5custom ).
  • 然后修改这个副本并添加新的 dpatch 名称,名称中不含 .dpatch 的扩展.
  • 更多的细节请阅读 debian/ README.NMU!

编译内核

  • 现在你几乎已经做好准备编译源码了,但是如果你现在开始,源码将会对你架构上的每个处理器都编译(386,686,686-smp,...)
  • 你可以在 debian/rules中作出更改. 搜索定义flavours的部分:
#flavours := $(shell \
#   find debian/config/$(arch) -maxdepth 1 -type f ! -name default \
#       -printf '%f\n' \
#)
  • 注释以下几行并添加你希望的处理器新的 flavour 定义
flavours := k7

flavours 和 debian/config/{architecure}中的一致 现在我们可以开始编译

dpkg-buildpackage -rfakeroot -us -uc -b
  • 如果你没有任何失误,这将会编译二进制源码;o)
  • 编译结束后,你可以在源文件目录的上一级目录中找到 deb 包. 样例中如下:
linux-doc-2.6.8.1_2.6.8.1-16.5custom_all.deb
linux-headers-2.6.8.1-4_2.6.8.1-16.5custom_i386.deb
linux-headers-2.6.8.1-4-k7_2.6.8.1-16.5custom_i386.deb
linux-image-2.6.8.1-4-k7_2.6.8.1-16.5custom_i386.deb
linux-patch-debian-2.6.8.1_2.6.8.1-16.5custom_all.deb
linux-source-2.6.8.1_2.6.8.1-16.5custom_all.deb
linux-tree-2.6.8.1_2.6.8.1-16.5custom_all.deb
  • Juhuu.

编译其他的模块

  • 有更多与内核相关的包,像 linux-restricted-modules . 如果你修改过内核并且你会使用这些模块,很可能你还还要将它们也重新编译.
  • 如果你不得不依赖与这些补丁. 编译这些模块的过程和编译内核的过程类似

更多的信息和选择

  • 对于不同的内核编译工具可以有更多的选择
  • 因此至少简单的阅读一下工具的手册,知道它们可以干什么,这不失为一个好主意. 为此,可以输入:
  • $ man {toolname} for this.

文章来源:官方WIKI
翻译人员:cocos
校对人员:
文章状态:翻译完毕