linux内核测试指南 第一章

linux内核测试指南 第一章

内核,补丁,内核树 和 编译

1.1 内核

Linux内核的当前版本通常可以从linux内核档案网站(http://www.kernel.org/)以一个大的压缩文件的形式下载得到。这个压缩文件不是gzip就是bzip2格式,它就是我们所说的内核tarball(毫无疑问,bz2文件比gz体积要小,但是gzip解压速度一般比bzip2要快)。

Tarball下载好后,你可以用很多不同的方法把内核源码从里面解压出来(这是UNIX-like系统的优点)。我们偏爱的方法是在你希望放置内核源码的目录运行命令:

文本框: $ tar xjvf linux-2.6.x.y.tar.bz2

该命令适用于以bzip2格式压缩的tarball,或者

文本框: $ tar xzvf linux-2.6.x.y.tar.gz

该命令适用于gzip格式压缩的tarball。原则上,它可位于任意目录,不过最好它所在的分区应具有至少2GB的空余空间。

当然,你也可以依照内核的README,根据你所下载tarball的种类,用下列指令之一来解压源代码:

文本框: $ bzip2 -dc linux-2.6.x.y.tar.bz2 | tar xvf -$ gzip -cd linux-2.6.x.y.tar.gz | tar xvf -

无论如何,不推荐以root帐户来解压内核tarball

内核tarball解压后,我们就得到一个目录。目录的名字对应于用下载源码进行编译后所得内核的版本(比如 linux- 2.6.18 )。这个目录的内容通常称之为内核树。基于这个原因,树这个词用于命名内核不同的开发分支。比如,为了简便起见,我们不说Andrew Morton维护的内核开发分支,代替之而称它为-mm

1.1     Patches

1.2 补丁

升级内核源码是经常和必要的事,但是你不必每次都下载整个tarball,因为这样做将很消耗带宽并且费时。通常,下载一个能应用到已有内核树的补丁就足够了。例如,如果我们正在讨论的补丁是以bzip2压缩的,就可以在源码树所在目录这下,用下列方式之一来打补丁:

文本框: $ bzip2 -cd /path/to/patch-2.6.x.bz2 | patch -p1$ bzcat /path/to/patch-2.6.x.bz2 | patch -p1

如果补丁的压缩格式是gzip,类似地可以用以下方式之一打补丁:

文本框: $ gzip -cd /path/to/patch-2.6.x.gz | patch -p1$ zcat /path/to/patch-2.6.x.gz | patch -p1

至于没被压缩的补丁,用cat命令代替zcatbzcat就行了。当然,这只是打补丁最简陋的方式,基于这种方式我们可以发明出其他一些更有趣的方法来。

如果有能力把不再需要的补丁(或存在bug的补本)卸除掉是很有用的事。在打补丁命令上增加一个-R标志就能完成这个目标。

文本框: $ bzcat /path/to/patch-2.6.x.bz2 | patch -p1 -r

我们也可以靠补丁命令行选项—dry-run来检测补丁文件能否被干净利落应用(也就是说,它不能包含有任何被拒绝的片段)

文本框: $ bzcat /path/to/patch-2.6.x.bz2 | patch -p1 --dry-run

之后,如果没有过类似下面的信息输出的话

文本框: 1 out of 1 hunk failed -- saving rejects to file xxx

那就已经完整地打上了补丁了。

很多不同版本的内核源代码是以一组补丁(补丁集)甚至是若干独立补丁的形式存在的。这些补丁应该应用在特定的内核树上。基于这个原因,补丁们是以它们应当被应用到的内核树来标识的。也就是说,既然稳定的内核版本标识为2.6.x 2.6.x.y,开发树称为2.6.x-git*,2.6.z-rc*2.6.z-rc*-git*,这里,带有z-rc补丁就是应用在x加一等于z的稳定版内核2.6.x上的补丁。比如,标识为patch- 2.6.21 -rc3.bz2的补丁应该应用到linux-2.6.20内核树上,标志为patch-2.6.21-rc3-git3.bz2应该应用到patch-2.6.21-rc3.bz2.

下面的例子但愿能让事情一目了然。假设我们有标为linux- 2.6.16 .25.tar.bz2的稳定版本的内核源代码,并且我们希望得到开发树2.6.20-rc1-git1。首先,我们解压tarball:

文本框: $ tar xjvf linux-2.6.16.25.tar.bz2

下一步,我们从ftp://ftp.kernel.org获取补丁patch- 2.6.16 .25.bz2,然后卸补丁:

文本框: $ bzip2 -cd /path/to/patch-2.6.16.25.bz2 | patch -p1 -r

现在,我们在工作目录下得到了 2.6.16 内核的源码。这正是我们想要的,因为稳定版和开发版的补丁只能干净地应用到2.6.x内核树上,因为卸补丁前的源码可能包含了2.6.x.y版本的一些代码。因此,我们可以应用patch-2.6.17.bz2, patch-2.6.18.bz2 patch-2.6.19.bz2到我们的树上。

文本框: $ bzip2 -cd /path/to/patch-2.6.17.bz2 | patch -p1$ bzip2 -cd /path/to/patch-2.6.18.bz2 | patch -p1$ bzip2 -cd /path/to/patch-2.6.19.bz2 | patch -p1

这样我们得到了 2.6.19 的内核源代码。最后,我们得两个开发版的补丁,patch-2.6.20-rc1.bz2 patch-2.6.20-rc1-git1.bz2,然后按规定的次序应用它们。

很简单,不是吗?是的,很简单,但它也是枯燥的事。所以,不想因此浪费时间的一些人就会使用一种叫做ketchup(http://www.selenic.com/ketchup/)工具,下节我们就描述这个工具。

应当注意到,只有补丁具有适当的格式时,它们才能被应用。如果你是通过email收到或直接从一个邮件列表档案库下载到补丁的,它的格式经常是被改变了,它们因此就无法使用。在这种情况下,patch会拒绝应用补丁,并且你将会看到类似patch: **** malformed patch at line的信息。例如,

文本框: $ cat ../sched-2.patch | patch -p1 -r --dry-runpatching file kernel/sched.cpatch: **** malformed patch at line 33:                     if (next == rq->idle)

它意思是,这个叫做sched-2.patch的补丁已经损坏了,因而无法卸补丁。很幸运,如果补丁已经提交到了linux内核邮件列表(LKML),你可以从档案库http://marc.theaimsgroup.com/?l=linux-kernel下载到它原始的格式。你只需查找包含这个补丁的信息,然后点击链接Download message RAW。尽管如此,如果包含这个补丁的原始raw信息格式有问题,它依然无法工作。

想查看更多关于下载和应用补丁的信息,可以查看内核源码中的README文件以及Documentation/applying-patches.txt文件

1.3 Ketchup

Ketchup工具允许我们迅速地下载任一版本的内核源码,并且可以把给定的内核树转换到另一个内核树。它通过检测内核树的当前版本然后只下载需要的补丁这种方式,非常智能化地完成任务。

测试/非稳定版本Debian的用户,可以用他们中意的工具来安装ketchup安装包,比如

文本框: # apt-get install ketchup

但是,对于稳定版本Debian的用户或其他发生版本的用户,ketchup工具就不能用那种简单的方法安装了:

文本框: $ mkdir ~/bin

如果该子目录在用户home目录下已经存在,就不用打以上命令。接着

文本框: $ cd ~/bin$ wget http://www.selenic.com/ketchup/ketchup-0.9.8.tar.bz2$ tar xjvf ketchup-0.9.8.tar.bz2

除此外,还要安装python安装包。

你应该记得ketchup能够检验下载补丁的签名。所以,建议你访问网页http://www.kernel.org/signature.html,保存当前的key到一个text文件中(we have never managed tomake $ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D 0F 0E work on our systems)。接着,你可以

文本框: $ gpg --import the_file_containing_the_kernel.org_key $ gpg --import 包含kernel.org_key的文件

and you are ready to checkhow the whole thing works. Namely, you can do

然后,准备看看整件事如何完成。也就是,你可以这样做 文本框: $ mkdir ~/tree$ cd ~/tree$ ketchup -m

 

接着你会看到类似如下的错误信息:

文本框: traceback (most recent call last):  file "/usr/bin/ketchup", line 695, in ?     lprint(get_ver("makefile"))   file "/usr/bin/ketchup", line 160, in get_ver      m = open(makefile) ioerror: [errno 2] no such file or directory: ’makefile’

This only means that there is no Linux kernel tree inthe current directory. You can order ketchup to download the latest stableversion of the kernel by using the command ”ketchup 2.6-tip”:

这不过是表示,当前目录下不存在linux内核树。你可以使用命令”ketchup 2.6-tip”指使ketchup下载内核最新的稳定版本。

文本框: $ ketchup 2.6-tipnone -> 2.6.16.1unpacking linux-2.6.15.tar.bz2applying patch-2.6.16.bz2downloading patch-2.6.16.1.bz2--21:11:47-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.16.1.bz2           => ‘/home/michal/.ketchup/patch-2.6.16.1.bz2.partial’resolving www.kernel.org... 204.152.191.5, 204.152.191.37connecting to www.kernel.org|204.152.191.5|:80... connected.http request sent, awaiting response... 200 oklength: 5,284 (5.2k) [application/x-bzip2]100%[====================================>] 5,284          6.19k/s21:11:49 (6.18 kb/s) - ‘/home/michal/.ketchup/patch-2.6.16.1.bz2.partial’saved [5284/5284]downloading patch-2.6.16.1.bz2.sign--21:11:49-- http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.16.1.bz2.sign           => ‘/home/michal/.ketchup/patch-2.6.16.1.bz2.sign.partial’resolving www.kernel.org... 204.152.191.37, 204.152.191.5connecting to www.kernel.org|204.152.191.37|:80... connected.http request sent, awaiting response... 200 oklength: 250 [application/pgp-signature]100%[====================================>] 250           --.--k/s21:11:49 (18.34 mb/s) - ‘/home/michal/.ketchup/patch-2.6.16.1.bz2.sign.partial’ saved [250/250]verifying signature...gpg: signature made wto 28 mar 2006 09:37:31 cest using dsa key id 517d0f0egpg: good signature from "linux kernel archives verification key <ftpadmin@kernel.org>"gpg: warning: this key is not certified with a trusted signature!gpg:          there is no indication that the signature belongs to the owner.primary key fingerprint: c75d c40a 11d7 af88 9981 ed5b c86b a06a 517d 0f0eapplying patch-2.6.16.1.bz2

现在,你可以检查是否真的得到了最新的稳定的树

文本框: $ ketchup -m2.6.16.1

可以看到,ketchup自动地下载了需要的补丁。它也能从用户home目录中的~/.ketchup子目录中获取补丁。所以,把你已经有的补丁放到那里是个好主意。

把内核树转换到另一种内核树,这个任务对ketchup来说绝对是小菜一碟。你只需使用命令”ketchup 内核版本号就行了,比如:

文本框: $ ketchup 2.6.16-rc4-mm12.6.16.1 -> 2.6.16-rc4-mm1applying patch-2.6.16.1.bz2 -rapplying patch-2.6.16.bz2 -rapplying patch-2.6.16-rc4.bz2applying 2.6.16-rc4-mm1.bz2

类似地,如果你想从-rt分支得到最新的内核版本,只需这样做

文本框: $ ketchup 2.6-rt

接着工具会自动地替你打补丁或者卸补丁

文本框: 2.6.16-rc4-mm1 -> 2.6.16-rt12applying 2.6.16-rc4-mm1.bz2 -rapplying patch-2.6.16-rc4.bz2 -rapplying patch-2.6.16.bz2applying patch-2.6.16-rt12

It is also possible to teach ketchup to use patchesincluded in the latest -mm tree (described below), which can be done in the followingway:

还可以让ketchup使用包含在最新-mm(下面将讲到)中的补丁。按下面的方法做:

文本框: $ wget -c ‘ketchup -u 2.6-mm | sed "s/.bz2/-broken-out.tar.bz2/"‘

依照上面的例子,Ketchup能够识别几种开发分支的linux内核源码。特别地,它可以处理以下的内核树:

  • 2.6-tip – 最新的 "稳定" 内核
  • 2.6-rc – 最新的 "发布候选" 内核
  • 2.6-git – 最新的开发 -git 内核
  • 2.6-rt – Ingo Molnar "实时" 内核树
  • 2.6-mm – Andrew Morton的内核树
  • 2.6-ck –Con Kolivas的树 (桌面)
  • 2.6-cks –Con Kolivas的树(服务器)

现在,你可能正在怀疑,为什么我们把打补丁和卸补丁的命令都展示出来。原因很简单:如果你发现并报告了一个臭虫,你将来应该会得到一个修正补丁,然后你得有能力去正确地应用它。

1.2     Trees

1.4

我们已经多次使用了术语内核树,我们也告诉了你,树的意思是“包含内核源代码的目录的内容”。但是,它还有另外一种意思,那就是“内核源码的开发分支”。通常,这样的分支等效于能够应用到特定版本内核源码的补丁集。不同的分支的命名也不一样。这样我们可以轻易把不同分支区别开来。比较流行的分支,也就是“树”,有以下这些:

  • -mm (Andrew Morton维护), 这个树由其他树(比如内核的开发分支)以及很多个人的实验性补丁组成
  • -rt (实时) (Ingo Molnar维护), 它包含把linux转换为实时系统的补丁
  • -ck (Con Kolivas维护), 致力于改进系统的性能

很多开发人员以及主要的内核子系统都维护有开发过程中要使用到的各自的树。一段时间后,这些树的特定部分就被包含到由LinusTorvalds维护的主内核树中。这个主内核树称为主线(mainline)。上面章节中提到的-git分支表示的是,处于不断改进状态下的linus树在各种不同时间下的一个快照。

1.3     The -mm tree

1.4     1.5 -mm

我们已经讲过,-mm树是一些其他树以及各种实验性个人补丁的集合。更重要的是,它也是和linux内核中的臭虫进行决斗的主战场。

这个树的重要性基于这样一个事实:它集合了主线和多种内核子系统(子系统树)维护人所使用的树。子系统树中含有被认为是实验性的和还没准备好合并到主线中的各种补丁。换句话说,-mm树的每个版本都是带有额外修改和一些臭虫的主线的未来快照。这些臭虫在这些补丁合并到主线之前将会得到(希望是)修正。因此,通过测试当前的-mm树,我们检查未来的主线树(也就稳定树)内树可能会如何运作,而且,在这个阶段如果发现了任何臭虫,它们可以在损害主线之前就得到修正。

不过,有些补丁没有在-mm树出现过就进入了主线。这是内核源代码变化的结果。也就是说,被合并到主线中的多数补丁来自于不同的子系统树,这些补丁被认为已经成熟时,linus就决定把它们从特定的子系统树中拉取(pull)过来,包含进他的树中去。有可能,并且确实有时发生这样的事,linus从某些子系统树中把那些“已经做好准备向前冲”的补丁们拉取过来,这样这些补丁就没有机会出现在-mm树中(/*译者:也就说linus的决定错了?*/这种情况下,这些补丁将来会出现在-mm树中,但它们不是来自子系统树而是来自主线树中)。因此,仅仅测试-mm还不足够,-rc-git开发树也需要测试。

另一方面,也存在一些内核子系统,它们没有自己的开发树,所以很多补丁就直接提交给Andrew Morton。这类补丁首先被包含到-mm树中,然后它们进入到子系统树中的一个中去或者送到主线那里。因此,很多不同来源的补丁们首先是在-mm树这个地方见见面,然后组合到一个未来稳定内核的雏型中进行测试。

既然-mm树是很多其他树,也包括永远进化中的主线树,的一个组合体,它确实可以被认为是有时可以放到一起的一堆补丁。这时,Andrew就发布可以应用到特定-rc或者稳定内核树的所谓的-mm补丁集。每个补丁集也可以是以打包在一起以供下载的一系列独立的补丁的形式存在的,其中一些补丁也包含了Andrew自己的一些修改。这样做使得辨别出包含有臭虫的补丁更加容易,因为可以使用quilt工具在bisection技术的帮助下能够找出这些臭虫(查看章4可以获取更多信息)

在包含有-mm补丁和-mm补丁所包含的一系列独立补丁的目录中(at ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.X-rcY/2.6.X-rcY-mmZ/or at ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.X/2.6.X-mmZ/,where X, Y, Z are numbers),总是存在一个叫做hot-fix的目录。Hot-fix目录中含有修复当前版本-mm树的中已知臭虫(这些臭虫已经被识别出来,不需要重复费力气查找了)的补丁,在测试相应的-mm补丁前应当先打上这些补丁。

包含在-mm树中的独立补丁被送到mm-commits邮件列表中(http://vger.kernel.org/vger-lists.html#mm-commits).通过关注这个列表,你就能够了解-mm树当前的内容。它也可以帮助你识别出引进了臭虫的补丁们。

有时,Andrewmm-commits发送带有类似mm snapshot broken-out-date-time.tar.gz uploaded标题的信息到mm-commits,宣布服务上有了-mm树新的快照。这些快照认为比正式的-mm补丁集的易用性要差一些。那些愿意帮助Andrew就会使用这些快照把下一个-mm补丁汇聚到一块。

1.6 编译和安装

1.6.1 内核编译

首先,你的系统应当做好配置和编译内核的准备。你需要gcc,make,binutils,util-linux以及包含ncurses头文件的包(Debian中的libncurses5-dev Fedora Core OpenSUSE 中的ncurses-devel).如果你想在配置内核过程中使用图形化工具,你还得需要Qt 库或GTK+ 和相应的开发包。内核源码中的文件Documentation/Changes包含了你可能需要的所有程序的清单。

现在,我们假设你已经下载好了内核源码,还通过打补丁取得了需要的版本。编译前,先把当前目录转换到包含内核源码的目录下,接着运行下列命令:

  • make menuconfig (允许你调整出适合你的内核配置。网络上描述内核配置的文章有很多,其中的一个是http://www.tlug.org.za/old/guides/lkcg/lkcg_config.html)
  • make (开始编译内核。如果你的机器有两个以上的处理器核心,你可以使用make-j选项,比如 “make –j 5 )
  • make modules_install (安装内模块到/lib/modules/ 目录下, creating the subdirectory named after the version of the newly compiled kernel)
  • cp arch/i386/boot/bzImage /boot/vmlinuz-<kernel_version> (拷贝内核到 /boot目录; 标签<kernel_version> 应当反映出正被安装的内核的版本)
  • cp System.map /boot/System.map-<kernel_version> (把内核符号map文件拷到/boot目录)

你可以使用”make config”而不使用”make menuconfig”。这会导致内核build系统向你询问非常多关于配置的问题,这样效率低下而且枯燥。但在没有ncurses的情况,你可以使用它。

如果你已经配置过内核,你可以使用先前编译用的那个配置文件.config。为了达到这个目的,你可以把它拷到包含当前内核源码的目录中,然后运行命令”make oldconfig”(它运行起来象”make config”,但没有询问那么多的问题)。别外,你可以使用发行版本内核的配置文件(通常它包含了很多你没必要的东西,这也是你为什么需要学习如何配置内核的一个原因之一)

文本框: $ zcat /proc/config.gz > .config$ make oldconfig

1.6.2 有用的make选项

有一些很用的选项,在编译过程中你可以把它传递给make

  • make O=/directory/ (把编译的产物保存到给定的目录; 如果你不想让*.o文件把内核源码目录搞得乱七八糟,这选项相当地有用。但在这种情况下,你也应该使用”make O=/directory/ menuconfig” 而不是 ”make menuconfig”。 还有,应该使用 ”make O=/katalog/ modules_install” 等等.)
  • make CC=<compiler> (允许指定要使用的编译器名称; 比如,在for example,Debian 中存在多个版本的gcc,如果你想使用gcc-3.4来编译内核,你只需使用“make CC=gcc -3.4” )
  • make C=1 (在编译之前,用sparse工具检查内核源代码)
  • make -j<number> (设置编译内核的并发进程的数目)
  • make xconfig (使用QT的图形化配置工具)
  • make gconfig (使用GTK+的图形化配置工具)

 

1.6.3 内核模块

启动内核模块支持后,内核的某些部分就可以在需要的时候才装载到内存中。选择选项是:

文本框: loadable module support --->[*] enable loadable module support[*]     automatic kernel module loading

这种模块化支持使用得内核变得更小,运行更快。

为了把内核的代码片段编译为模块,你得在配置过程中把它标记为M。比如<M>     Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4。如果”Automatic kernel module loading”选项被选上了,模块就会在需要的时候被内核自动装载进来。也就是说,比如,如果你mount一个CD-ROM,内核会自动地装载isofs.ko模块,在CD-ROM卸载之后,这个模块可以从内存中移除掉。你也可以使用命令modprobe,insmod,rmmod等等,手工地装载和卸载内核模块。

  • modprobe isofs (loads the module isofs.ko)
  • modprobe -r isofs (removes isofs.ko from memory)
  • modprobe isofs (装载模块isofs.ko)
  • modprobe -r isofs (从内存中移除模块isofs.ko)

当前运行内态的所有可用模块都应当放置在/lib/modules/<kernel_version>/kernel子目录中。

1.6.4 内核hacking选项

如果想构造一个测试用的内核,你应当要认真地考虑设置位于”kernel hacking”菜单中的选出项。起码,应当设置:

文本框: [*] kernel debugging[*]     compile the kernel with debug info

尽可能地,其他的选项也应当要设置,因为它们有助有内核特定功能的调试。但有些选项会降低系统性能,所以你可能会考虑让它们保持在非设置状态:

文本框: [*]     debug shared irq handlers[*]     detect soft lockups[*]     debug slab memory allocations[*]        slab memory leak debugging[*]     rt mutex debugging, deadlock detection[*]     built-in scriptable tester for rt-mutexes[*]     lock debugging: prove locking correctness[*]     lock dependency engine debugging[*]     locking api boot-time self-tests[*]     highmem debugging[*]     debug vm

1.6.5 Magic SysRq

选项 [*] Magic SysRq 键相当有用,因为它常常让你减少内核故障造成的影响,并获取有关系统状态的额外信息。它打开了一些键盘快捷键,你可以利用快捷键直接向内核传递特定的指令:

  • Alt + SysRq + b – 立即重启系统,而不先卸载文件系统以及把磁盘缓冲写入在储存器中去(危险操作)
  • Alt + SysRq + c – crashdump
  • Alt + SysRq + e – INIT以外的所有进程发送TERM信号
  • Alt + SysRq + i – INIT以外的所有进程发送KILL信号
  • Alt + SysRq + k – SAK (安全访问键); 杀死绑定在当前活跃的虚拟控制台上的所有进程 (例如.Ctrl + Alt + Backspace 无法工作时,紧急关闭X服务器)
  • Alt + SysRq + l – 向包括INIT在内的所有进程发送KILL信号
  • Alt + SysRq + m – 打印内存状态信息
  • Alt + SysRq + o – 关闭系统
  • Alt + SysRq + p – 打印CPU寄存器和标志的内容
  • Alt + SysRq + r – 让键盘转换到RAW 模式 (例如. 导致Ctrl + Alt + Backspace不产生效果)
  • Alt + SysRq + s – 同步文件系统,并把磁盘缓冲的内容写到存储器中
  • Alt + SysRq + t – 打印所有任务的列表
  • Alt + SysRq + u – 移除所有只读的文件系统
  • Alt + SysRq + h – 显示帮助信息

 

SysRq键在哪里呢?这取决于你机器的架构:

  • x86 – Print Screen
  • SPARC – STOP
  • serial console – Break
  • PowerPC – Print Screen (or F13)

文本框: # echo t > /proc/sysrq-trigger

在所有的架构上,你都可以通过echo相应的字符到文件 /proc/sysrq-trigger中来触发分配给定键(假设为t)的动作,比如 # echo t > /proc/sysrq-trigger

怎样才是重启机器的安全方式呢?

首先,尝试按下组合键Ctrl + Alt + Backspace (X窗口系统下)或者Ctrl + Alt + Del (文件控制台下)。如果它不起效果,你可以:

  • press Alt + SysRq + k to kill all processes using the current console,
  • press Alt + SysRq + s, Alt + SysRq + u, Alt + SysRq + b
  • Alt + SysRq + k 来杀死使用当前控制台的所有进程
  • Alt + SysRq + s, Alt + SysRq + u, Alt + SysRq + b

有关”Magic SysRq 机制的更多信息,可以在内核源码中的文件Documentation/sysrq.txt中找

1.6.6 安装

某些发行版本允许你使用下面命令安装一个新编译的内核

文本框: # make install

上述命令是在包含内核源码的目录下以root身份运行的。但是,你通常得手工改变bootloader的配置文件。如果你使用的是lilo,你得运行/sbin/lilo来使新的内核生效。

此外,如果你使用的是现代的发行版本,你还得生成一个与新内核相对应的initrd映象。Initrd映象包含着在挂载根文件之前就应当装载的内核模块,还包含一些在内核运行init之前就应该执行的脚本和工具。想给你的内核创建initrd映象,并拷贝到系统的/boot目录,你可以这样做:

# mkinitrd -k vmlinuz-<kernel_version> -i initrd-<kernel_version>

这里,<kernel_version>是内核的版本字符串。还得把内核自身拷贝到文件/boot/vmlinuz-<kernel_version>。并且,在运行mkinitrd之前,内核符号的映射文件也要拷贝到文件/boot/System.map-<kernel_version>。在运行的内核的版本号可以用以下命令得到:

文本框: $ uname -r

它通常是对应构造相应内核的源代码的版本。

给新内核生成了initrd映象之后,还得调整boot loader的配置文件,这样才能使用该内核。如果使用的是GRUB,它的配置文件应该是/boot/grub/menu.lst。用你喜欢的文件编辑器打开它,加入下面的行:

文本框: title linux <kernel_version>         root (hdx,y)         kernel /boot/vmlinuz-<kernel_version> ro root=/dev/<root_partition>#        if initrd is used         initrd /boot/initrd-<kernel_version>

这里,XYGRUB用来标志包含你系统/boot目录的分区的数字(详细请查看GRUB的文档)<kernel_version>是内核的版本号,<root_partition>root分区的标识。内核使用root分区来挂载root文件系统并运行init.

LILO的用户可以在它配置文件/etc/lilo.conf中加入下面几行:

文本框: image=/boot/vmlinuz-<kernel_version>label=linux# if initrd is usedinitrd=/boot/initrd-<kernel_version>read-onlyroot=/dev/<root_partition>

同样,需要通过运行/sbin/lilo来让lilo实际使用新的内核(详细信息请参考LILO的文档)

1.6.7 自动化的配置和安装

上述步骤的一部分甚至是全部可以使用你发行版本的内核安装脚本来完成。不过,它们常常还是需要手工处理的。这种情况下,你可以使用下面这个脚本。在把它调整为适应你的系统配置后,你可以使用它来下载,编译,和安装最新的稳定版内核

文本框: #! /bin/sh# patch to the kernel source directorysrc_path="/usr/src/kernel/linux-stable"obj_path="$src_path-obj/"cd $src_path# download the latest -stableketchup 2.6# save the versionver=‘ketchup -m‘# generate the configuration file (based on the old one)make o=$obj_path oldconfig# build the kernelmake o=$obj_path# install modulessudo make o=$obj_path modules_install# copy the compressed kernel image into /bootsudo cp $obj_path/arch/i386/boot/bzimage /boot/vmlinuz-$ver# copy system.map into /bootsudo cp $obj_path/system.map /boot/system.map-$ver# if you use fedory, you have to generate the fedora initrdsudo /sbin/new-kernel-pkg --make-default --mkinitrd --depmod --install $ver

一般,每个发行版本都有它自己组装和安装新内核的首选出方法。下面这个表格包含了一些发行版的内核安装指导的链接。

Debian http://www.howtoforge.com/howto_linux_kernel_2.6_compile_debian

Fedora http://www.howtoforge.com/kernel_compilation_fedora

Gentoo http://www.gentoo.org/doc/en/kernel-upgrade.xml

Mandriva http://www.howtoforge.com/kernel_compilation_mandriva

OpenSUSE http://www.howtoforge.com/kernel_compilation_suse

Ubuntu http://www.howtoforge.com/kernel_compilation_ubuntu

要了解更多关于linux内核配置和编译的知识,可以参考GregKroah-Hartman写的书Linux Kernel in a Nutshell (http://www.kroah.com/lkn/).

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值