- 论坛徽章:
- 0
|
获取Linux内核源代码
本节将告诉你如何去下载linux内核源代码以及如何在内核源代码树中找到对文件系统开发有用的源文件。后续的章节则教你如何针对自己特定的系统硬件平台去配置内核,进行编译然后再安装新构建的内核。Lilo和Grub引导程序都将谈到。
Linux内核源代码可以从如下网站获得:
www.kernel.og
该网站主页上将显示最新版本的linux内核。例如,下面显示了本书写作时最新的稳定内核版本:
The latest stable version of the Linux kernel is: 2.4.18 2002-07-10 00:40
UTC F V VI Changelog
该网站也描述了不同版本内核的状态,也包括最新的稳定内核版本。点击内核版本就可以下载到最新的内核。点击Changelog将会显示最新内核的所有更新之处。
自Linux问世以来的所有内核版本都可以在该网站上找到。按照上面的链接就可以找到你所要的内核版本。正如本书中使用的代码一样,你需要的是linux-2.4.18内核。同时,正如前所述,新的uxfs文件系统版本可以从如下网站去获取:
www.wiley.com/compbooks/pate
另外,在本网站上也说明了uxfs文件系统所支持linux内核以及各种不同的linux发行版。
为获取你所需要的内核源代码,请遵循如下不同的批示。例如,按照主页上的链接进入到linux代码库,其中包括有内核源代码,然后是kernel和2.4。也就是如下连接:
www.kernel.org/pub/linux/kernel/v2.4/
内核源代码是gzip tar压缩文件。一旦下载完成,就必须进行解压缩。内核源代码一般位于/usr/src目录下,尽管这不是必须的。我们可以解压缩文件至/usr/src并设置一个符号连接到该特定目录。例如,若gzipped压缩文件已经在/usr/src目录下,执行如下的操作:
# bunzip2 linux-2.4.18.tar.bz2
# mv linux linux.orig
# tar xvf linux-2.4.18.tar
# mv linux linux-2.4.18
# ln -s linux-2.4.18 linux
最终解压之后的文件缺省都将安放在当前目录的linux目录下。根据你自己的环境的不同,mv你的旧的linux内核目录可能有所不同。另外,也可以将源代码解压到一个单独的目录下,然后再将其移动到/usr/src/linux-2.4.18目录下。要注意的是不要覆盖了现存的任何linux内核源代码树。
内核源代码树目录
在linux内核源代码树下存在着很多文件和目录。本小节将对内核源码树的布局进行介绍,这样读者就能够容易地找到各不同的内核子系统或特定的文件。
Arch. 该目录下针对linux支持的不同的机器平台都存在相应的子目录,如Intel,Sparc,MIPS和IBM s390。
CREDITS. 该文件列出了linux内核的主要贡献者以及它们所精通的领域。
Documentation.
随着linux内核源码发布的也包括大量的文档。Filesystems目录下除包括一些通用的文件系统相关信息外,还包括一些不同的linux文件系统信息。
Drivers. 该目录下包括所有的linux设备驱动程序。
Fs. 该目录对关心文件系统的人是很有用的,另外mm目录也包括很多page cache/ data I/O管理程序代码对我们有用。Fs目录下的文件实现了dcache、buffer cache、inode cache以及文件系统相关的系统调用处理程序。同时,fs目录下针对linux的各种文件系统都有其相应的子目录,其中包括各文件系统的源代码实现。
Include. 所有的内核头文件都可以在这找到,该目录下包括有特定体系架构的头文件以及跨平台的通用头文件。通用的头文件可以在linux子目录下找到,其中fs.h头文件对于文件系统编写者特别重要,dache.h头文件则定义了linux dcache使用到的结构体。
Init. 该目录包括了内核引导启动阶段要执行的函数。
Ipc. 该目录包括有System V IPC(进程间通信)源码,其中包括有信号量、共享内存和消息队列。
Kdb. 如果kbd补丁要安装,该目录包括有内核调试器的所有源码。注意该kdb补丁会改变linux内核中的其它相关文件。
Kernel. 该目录包括有所有核心的内核例程,如进程管理,系统调用处理,模块管理等。
Lib. 标准C库函数在内核中都有对应的部分,其源码可以在该目录下找到。
MAINTAINERS. 该文件列出了负责内核各个部分的人员。
mm. 该目录下包括了所有的并不是与具体平台相关的内存管理代码。Linux页cache管理例程也包括在该目录下。
Net. 所有的网络协议(TCP、UDP、IP等)实现源码都包含在该目录下。
前面我们讨论了许多文件和目录,然而,对文件系统学习有兴趣的读者来说,include, fs和mm目录包括有所有的文件系统相关的数据结构和例程。对于那些想深入了解文件系统/驱动层接口的人来说,drivers/block目录下有些文件是很有用的。
配置内核
在构建内核之前,有必要先确定内核的配置。事实上,内核源码树中很多部分在你编译自己的内核时都是不必要的。例如,对于不同的SCSI适配器有不同的设备驱动程序。如果你不需要访问SCSI,就没有必要把它编译进内核。因此,你先要确定自己的硬件配置,然后再决定哪些内核组件是需要的。
有几种不同的方式来确定配置,除本文中所谈到的,linux内核HOWTO也应该多看下。可以从网上获取HOWTO文档,它有多份拷贝。可以从如下网站获得:
www.tldp.org/HOWTO/Kernel-HOWTO.html
确定内核配置的一种最简单的方式是在已安装linux操作系统的基础之上来安装内核源码。如此,我们便可以参考已安装内核的配置文件。我们可以直接将已安装内核源码树中的配置文件直接复制到新的内核源码树中来,如下:
# cp /usr/src/linux-2.4.18-3/.config
/usr/src/linux-2.4.18/.config
值得注意的是,如果要安装的新内核与已安装内核的配置有很大的不同,配置中的一些选项可能就无法使用。但是,上述方法在大多数情况下都是适用的。
另外一种确定配置的方法是对已安装的内核源码和新内核源码均执行如下命令。例如,对于Red Hat 7.3运行如下:
# cd /usr/src/linux-2.4.18-3
# make menuconfig
对于新内核命令则如下:
# cd /usr/src/linux-2.4.18
# make menuconfig
打开两个配置窗口,通过浏览查看当前内核的配置选项就很容易知道新内核哪些配置选项是需要的。这种方法能够让我们充分了解我们的硬件配置,并且在当前内核中选择了的配置在新内核中也都会选上。
前面用*号标注的条目则是被选择上的,可加载模块则是由字母M来表示。在屏幕的顶部的提示告诉了我们如何来选择。按回车将进入到下一级菜单,按Esc则回到上一级。
一旦完成了内核的配置,在一系统的Esc键之后,将提示你是否愿意保存配置并且退出。要注意对于当前运行内核的配置我们不需要做保存,这是特别重要的以妨你不小心对其作了任何改变。在保存好配置并且退出之后,将会显示如下信息:
Saving your kernel configuration...
*** End of Linux kernel configuration.
*** Check the top-level Makefile for additional
configuration.
*** Next, you must run ’make dep’
紧接着我们执行如下命令:
# make dep
# make clean
上述第一步基于前面内核配置过程中的选项构建必要的内核文件依赖关系。接下来一步则确保整个构建环境是干净的,这样后续的内核编译才不会使用前面任何已经编译过的文件,因为这些文件可能并不与我们的的配置选项相匹配。
下面持续时间是最长的一步,就是编译内核。通过如下命令来编译内核:
# make bzImage
...
objcopy -O binary -R .note -R .comment -S
compressed/bvmlinux
compressed/bvmlinux.out
tools/build -b bbootsect bsetup compressed/bvmlinux.out
CURRENT >
bzImage
Root device is (3, 2)
Boot sector 512 bytes.
Setup is 2536 bytes.
System is 1301 kB
warning: kernel is too big for standalone boot from
floppy
make[1]: Leaving directory '/usr/src/linux-2.4.18/arch/i386/boot'
#
当上述编译过程完成之后,名为bzImage的压缩内核将会存在于arch/i386/boot目录下。我们将其复制到/boot目录下并且重新命名(名称要唯一)如下:
# cp arch/i386/boot/bzImage /boot/linux.spate
要记住复制的压缩内核的名称,最好取一个容易记住的名称而且不要覆盖了已经存在/boot目录下的任何内核。唯一的例外是当你经常构建内核时,你清楚哪些内核可以安全地被覆盖。由于很多内核组件是选择以内核模块的形式来编译的,因此,它们必须如下命令来编译和安装:
# make modules
# make modules_install
模块编译好之后,将安装在/lib/modules目录下,对于每一内核版本都有相应的一个子目录。例如,就以我们上面使用的内核而言,模块将会存放于:
/lib/modules/2.4.18
一定要记住编译和安装好在配置中选择的模块,这经常容易被忘记。如果模块没有放在合适的位置,内核就可能无法被引导。
安装并引导新内核
下一步要做的就是配置引导程序来识别新内核。大部分linux发行版都使用LILO或GRUB引导程序。本小节介绍如何使用LILO这一最通用的引导程序。
下面是从Red
Hat 7.3中的配置文件/etc/lilo.conf中节选的几行,该配置文件是在linux安装时建立的。
image=/boot/vxlinuz-2.4.18-3
label=linux
initrd=/boot/initrd-2.4.18-3.img
read-only
root=/dev/hda2
image字段用于指定要引导的内核,当lilo运行并显示可引导的内核列表,它将显示出label字段的名称,在上例中是linux。Initrd字段则用于指定一初始化根磁盘ramdisk,它在检测和加载真实的根文件系统之前被使用。Root字段则用于指定根磁盘的位置所在。
为引导新的内核,复制下面几行到上面lilo.conf配置文件最后,并且修改image和label字段,如下所示:
image=/boot/linux.spate
label=linux.spate
initrd=/boot/initrd-2.4.18-3.img
read-only
root=/dev/hda2
这样我们就为新内核创建了一个新的条目,并且原来内核的条目并没有改变。要注意不要去修改任何在linux内核安装过程中建立起来的配置信息。我们有必要确保至少有一个内核可以安全地引导,因为有时候构建的新内核可能不小心缺少某些设备驱动。例如,刚开始构建内核时,我们经常容易忽略一些必要的信息如正确的磁盘驱动,这也导致新内核无法引导。
最后一步要做的就是运行lilo将新内核的信息安装到主引导记录中去。
# lilo
Lilo运行成功后并不会显示任何信息。一旦完成,在下一次计算机重启时你将看到对应于你的内核的一个条目(label字段)。
使用GRUB引导
现在很多linux发行版已经使用GRUB(Grand Unified Bootloader)引导程序。其功能十分强大,但与lilo操作不同。然而,增加一个新内核并不困难,/etc/grub.conf配置文件与/etc/lilo.conf使用方式类似。而且,只要往其中添加一个条目就足够了,并不需要运行GRUB来安装信息到主引导记录中。
进一步了解GRUB,请参见grub man手册。
引导新内核
下一步要做的就是重启计算机。一旦机器启动,lilo将显示可引导的linux内核列表,我们将会看到最新安装的内核。通过移动箭头按键可以来选择要引导的内核,按Enter键将进行加载。如果一切顺利的话,新内核将成功被引导。
为验证运行的正是我们请求的内核,可以运行uname命令来显示内核版本,如下所示:
# uname -a
Linux x.y.com 2.4.18 #2 SMP
Tue Jul 30 18:55:27 PDT 2002 i686 unknown
内核版本号是以粗体显示的,因为存在这样的情形,当重启机器后,lilo可能自动引导了缺省的内核,这时你回到机器前,可能想知道你到底运行的是哪个内核。通常我们都将缺省内核设置为linux操作系统安装时的内核。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/27708/showart_397062.html |
|