KernelHowto

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

如何安装一个自定义的 Linux 内核 Linux内核是Ubuntu操作系统的心脏。Ubuntu自带的内核通常包含你所需要的所有驱动程序,但有时你希望调整你的内核或如果由于某些特别原因你需要重新编译,本手册将帮助你。

象这个不太详尽的文档事实上可以在 内核编译指南 找到。


准备

要创建内核,你需要 build-essential fakerootkernel-package 包.

bash:~$ sudo apt-get install build-essential fakeroot kernel-package

内核创建工作在/usr/src/目录进行,为此,添加src组

bash:~$ sudo adduser my_username src
Adding user my_username to group src...
Done.

注销并重新登录,或使用su再登录(切换用户):

bash:~$ su my_username
bash:~$ groups
my_username src audio adm dialout cdrom floppy video plugdev lpadmin

会列出所有组名,src是其中之一。


获取源代码

你可以用下面的办法搜索内核源代码

bash:~$ apt-cache search source 2.6

选择你想要的内核源代码.

问题:内核原代码有时叫kernel-source-2.6.5等,而有时又叫linux-source-2.6.8.1,为什么?

kernel-source来自于Debian,linux-source来自Ubuntu。如果可能请尽量使用linux-source。所有的依赖关系都还没有改变,虽然如此,如果你通过linux-source得到像"uninstalled package kernel-source"(反安装内核源码包)的错误警告,你可以安全地忽略他们--Bronson.

使用下列命令下载内核源代码:

bash:~$ sudo apt-get install linux-source

建议安装libncurese-dev和libqt3-dev包,第一个是menuconfig所需要的,第二个用于xconfig,安装他们中的一个是很小的(见下面的内容)

下载并放源代码至 /usr/src

源代码解包

我将使用UBuntu服务器上的最新的2.6.8.1内核为例来写说明

bash:~$ cd /usr/src
bash:/usr/src$ ls -l
linux-source-2.6.8.1.tar.bz2

如果你看到一个指向较老内核源代码的linux链接,请删除它。

bash:/usr/src$ rm linux

如果原来的linux链接仍保存在这里的话不要解包。因为如果你的新源代码直接解包至旧内核原代码目录中,创建工作将不会成功。

解开压缩包用:

bash:/usr/src$ tar xjvf linux-source<version>.tar.bz2

不要使用sudo,这里并不需要。

如果源代码是.bz2格式,使用tar jxvf,如果是.gz则用tar zxvf

这里应该会以你和src组名义创建一个叫linux-source-2.6.8.1的目录。

创建一个叫linux的内核源代码链接

bash:/usr/src$ ln -s linux-source-2.6.8.1 linux

在当前位置查看一下,你将看到象这样的情况:

bash:/usr/src$ ls
linux@  linux-source-2.6.8.1/  linux-source-2.6.8.1.tar.bz2

配置内核

有几种方法来配置内核。你将可能使用"xconfig"。改变当前目录至/usr/src/linux目录,象这样启动:

bash:/usr/src/linux$ make xconfig

如果你未使用X,或你不想使用鼠标:

bash:/usr/src/linux$ make menuconfig

警告:至少,你必须确认将你所用的总线(bus)、磁盘(disk)、根分区文件系统(root filesystem)驱动程序直接编译进你的内核。否则,你的新内核映像将无法启动。查看 KernelBuildpackageHowto 来获得无需重新配置内核的方法。


创建内核

make-kpkg

创建内核你要用到"make-kpkg",脚本会自动替换这个命令系列"make dep; make clean; make bzImage; make modules"。花点时间阅读手册中make-kpkg部分。make-kpkg命令行可能有些复杂而首次使用会被吓倒。它的基本语法是:

bash:/usr/src$ make-kpkg <options> <target>

你的目标target将成为"kernel_image"。让我们以较为重要而通用的两个选项(options)进行探讨,"--append-to-version"和"--revision".

--append-to-version

第一个选项让你添加特别项至内核版本号中,它会成为内核名的一部分。你可以使用字母,"+"和"."(小数点或句号);但不能使用下划线"_"。 这个是当前运行的内核:

bash:/usr/src$ /usr/src/$ uname -a
Linux da5id 2.6.8.1-2-k7 #1 Sat Sep 18 11:23:11 BST 2004 i686 GNU/Linux

使用--append-to-version时要避免使用象"-686","-k7"和"-sparc"的字串,因为它们常常在Debian预编译内核中被使用。

内核模块放在/lib/modules子目录中;每个内核都有它自己的子目录。你每次安装新命名的内核映像,包安装器会创建一个象/lib/modules的新子目录来存放它的模块。

这就意味着你每次用--append-to-version创建内核映像名,你可以使新内核有一个新名字,从而使它的模块不会与其他内核产生冲突。

如果你用与已安装的内核相同的名称安装内核(相同的版本号和 --append-to-version),安装新内核的包将覆盖旧内核和它的模块。这时你将被警告并被建议退出退出。退出,用另一个append-to-version值来重建内核吧。


--revision

另一个make-kpkg选项是"--revision",它会指定Debian的名字打包而不是内核名。如用--append-to-version, 你只能使用字母,"+"和".",而不能使用线"_"。如果你不提供--revision值,make-kpkg将使用"10.00.Custom"。

使用不同的--revision值将无法避免用相同内核名产生的冲突。他们只是让你看起来不同,比如重新编译变化很小的相同内核。


内核包名

Debian内核映像文件名如:

kernel-image-(kernel-version)(--append-to-version)_(--revision)_(architecture).deb

在第一个下划线之前所有字符就是内核包名

bash:/usr/src$ ls
kernel-image-2.6.8.1.181004_10.00.Custom_i386.deb

现在你就能明白为什么下划线是不允许在make-kpkg选项中出现了--他们隔开包名的各部分。

我建议你为每个编译的内核使用不同的--append-to-version值,并让make-kpkg指定缺省的revision值。Date-based值对我有用,但你可以根据自己的计划自由设定。

如果--append-to-version或--revision值未被清除,或如果你希望使用与我建议的选项不同,请阅读 /usr/share/doc/kernel-package/README.gz。(可以这样做到:"zless README.gz")暂时不要去对flavours和epochs进行探讨,直到你用make-kpkg和Debian包更加熟悉;现在它们对你并不十 分有用。

fakeroot

当你已添加你自己到src组,使用正常用户的权限就能做好创建内核包的大多数工作。然而内核包的部分(象内核和内核模块)文件将赋予root并使用root权限运行;它们必须用root权限来创建。

使用fakeroot,你可以用普通用户来启动make-kpkg,并且大多数工作将运行于普通权限。工作接近尾声时,fakeroot将模拟一个root环境来创建内核映像包。

手册中有关make-kpkg的部分描述了使用fakeroot的一种方法;我们将使用make-kpkg命令行开始处输入"fakeroot"的较简单的方法来做,象这样:

fakeroot make-kpkg <options> <target>

制作内核映像

最后!马上就要完工了--你准备制作一内核映像。

bash:/usr/src/linux $ fakeroot make-kpkg clean

然后:

bash:/usr/src/linux $ fakeroot make-kpkg --append-to-version=.181004 kernel_image --initrd binary

现在你所要做的就是等计算机来完成了。在计算机完美的工作中让我们轻松片刻吧。


安装内核映像包

一旦内核映像被创建,你就可以安装内核映像包了,它包含内核和内核模块。首先退回/usr/src目录并列出里面的内容,来检测并确认它被成功创建。

bash:/usr/src/linux$ cd ..
bash:/usr/src$ ls
kernel-image-2.6.8.1.181004_10.00.Custom_i386.deb
linux@
linux-source-2.6.8.1/
linux-source-2.6.8.1.tar.bz2

有了!注意--append-to-version值是如何成为内核名的一部分的。

安装内核和所有的内核模块:

bash:/usr/src$ sudo dpkg -i kernel-image-2.6.8.1.181004_10.00.Custom_i386.deb

从磁盘安装内核映像包(象对应地从Debian包文件安装)要使用完整的文件名。你可以使用tab键来补齐命令行。

如果每一步都做得很好,你现在要做的就是重新启动。如果新内核无法启动,则启动你原来的内核或插入你的引导软盘并重新启动。调整你的内核配置,重试。


结束

保持内核!

如果你已使用--append-to-version,你不需要为apt-get试图"upgrade"你的内核而担心。如果你试图这样,你只要这样:

bash:~$ echo "kernel-image-2.6.8.1.181004 hold" | sudo dpkg --set-selections

当然你要用你真实的内核名来代替。查阅dpkg的包以了解有关使用包名比完整的文件名更好。同样,"|"字符输入是\符的上位(Shift)...

bash:~$ dpkg --get-selections | grep kernel-image
kernel-image-2.6.8.1.181004_10.00.Custom_i386.deb    hold

一些人写了关于保持包,如何操作等等.


删除符号链接

接下来,你要在/usr/src目录创建符号链接。这样做有几个原因:

  • 下次你下载一个不是Debian格式的内核包,当你解开这个源代码包时会通过旧符号链接覆盖你的旧源码目录树。这是令人不快的事。
  • 下次你下载Debian格式的内核源代码,你可能解开源代码到它自己的目录树这个没有问题,但你已有一个叫"linux"的符号链接在src目录里的话,你可能进入并编译旧内核(忘了它之前已经链接到一个旧源代码树)。
  • 当你下载补丁或其他源代码到一个特定的源代码树,你不要想做任何事情,则否弄坏它。通过删除符号链接可以防止#1问题的发生。

删除符号链接这样做:

bash:~$ rm /usr/src/linux

备份你的内核

这并不是必须的,但备份你的定制内核.deb是个好主意,复制它到一个安全之处。


一旦你的内核已经与它的模块一起打包,你可以安装它到有你的硬件的其他机器上,它也可以在你重设系统后重新安装到当前机器上。


制作新引导盘

你刚安装好内核,要创建另一个引导磁盘。得到另一个软件--覆盖你的旧引导盘不是个好主意;你还没有足够长的时间使用你的新内核来验证它的工作。如果你弄糟了你的系统,一张引导盘是必须的。

bash:/usr/src# cd /boot
bash:/boot# mkboot /boot/vmlinuz-2.4.18.030320

创建你的下一个内核

如果你因为刚刚买了一块新声卡想重新编译你的内核,或你在第一次编译时忘了某个新功能,你需要做的是重新配置,"fakereoot make-kpkg clean",用不同的--append-to-version值重新编译。看起来象这样:

bash:~$ cd /usr/src
bash:/usr/src$ ln -s linux-source-2.6.8.1 linux
bash:/usr/src$ cd linux
bash:/usr/src/linux$ make xconfig
(reconfigure your kernel)
bash:/usr/src/linux$ fakeroot make-kpkg clean
(lots of cleaning here)
bash:/usr/src/linux$ fakeroot make-kpkg --append-to-version=.181004 kernel_image --initrd binary
(screens and screens of stuff)

使用已经存在的配置

当你安装好你制定的内核,它的配置被复制至/boot/config-x.y.z。你可能为了保险起见或以后还要使用而想保存它至其他地方(或几个地方)。

假如刚刚在上周你谨慎地通过了内核选项的迷宫,而又决定你希望支持所有硬件和功能配置,今天一个新的稳定内核被释放和导致你希望升级版本。 下载并解开新源代码包并创建一个新符号链接,然后改变目录至/usr/src/linux,复制你已经存在的配置到这里并"make oldconfig":

bash:/usr/src/linux$ cp /boot/config-2.4.18.030320 .config
bash:/usr/src/linux$ make oldconfig

你将被问及一些新内核选项的有关问题。所有的问题回答"no"它通常是安全的;新选项你应该引起注意。你完成oldconfig之后,你可以运行xconfig或menuconfig来检查你所选择的项目,改变你的答案,或研究你注意的选项。

用你自己的配置创建最新稳定内核

fakeroot make-kpkg clean

检查列表

  • 制作备份引导盘
  • 安装需要的包
  • build-essential fakeroot kernel-package
  • 设置源代码目录树

1 添加你自己的源代码,注销,登录,使用使用组确认。

  • 删除旧符号链接

1 解包源代码压缩包

  • 制作和检查新符号链接。
  • 配置内核
  • 使用旧的有效配置文件,cp /boot/config-x.y.z .config
  • make oldconfig或make xconfig或make menuconfig.
  • 保存稍迟需要用到的.config文件
  • 创建内核映像包
  • fakeroot make-kpkg clean
  • fakeroot make-kpkg --append-to-version=alpha+numeric.but.no.underscore kernel_image --initrd binary
  • 安装内核映像包
  • dpkg -i kernel-image-x.y.z.yy.mm.dd_10.00.Custom_i386.deb
  • 重启
  • 下一步是什么?
  • 保持你的包. echo "kernel-image-x.y.z.yymmdd hold" | dpkg --set-selections
  • 删除符号链接。
  • 备份内核映像。
  • 删除旧的内核映像包。
  • 制作新的引导磁盘。