Linux Kernel in a Nutshell - 2
Requirements for Building and Using the Kernel
本章描述你配置、编译、启动一个内核的流程。查看 Documentation/Changes
来确定本章中使用的各个工具针对某个内核版本所需要的特定工具版本是一个明智选择。本章是基于 2.6.18
内核,使用的工具限定在这个版本。如果你使用不同的内核版本,那么请确定使用的工具版本是正确的,否则出现问题之后,很难确定问题究竟出在哪里。
Tools to Build the Kernel
大部分 Linux
发布版本提供一个安装选项来安装一系列 kernel hacking packages
。如果你使用的发布版本提供了这个选项,那么安装就会比较简单,而不是尝试溯源本章中所有需要的单个程序。
成功编译一个内核只需要三个包:一个编译器、一个链接器以及一个 make
工具。本节描述每一个包的详细信息。
Compiler
Linux Kernel
是以 C
外加少量的汇编语言写成。要编译内核,gcc
C
编译器是必须的。大部分 Linux
发布版本提供了 gcc
,可以直接安装,如果你希望自己下载编译器源码并编译成工具,可以在 http://gcc.gnu.org 中找到。
针对 2.6.18
内核,gcc 3.2
版本是最老的支持这个内核版本的编译器版本。需要注意的是,获取到最新的 gcc
版本并不总是一个好的想法。最新的 gcc
可能不能够完成编译内核这个工作,因此,你如果不希望帮忙确定新编译器的bug,那么不建议使用最新的编译器版本。
使用下面的命令确定使用的 gcc
版本:
$ gcc --version
Linker
C
编译器 gcc
并不能单独完成所有工作。需要称作 binutils
的工具箱来做汇编以及连接的工作。binutils
工具包包含一些其他的操作目标文件的工具集,比如查看库中内容的工具。
binutils
通常可以以 binutils
工具包的形式查找到。如果你希望自己下载源码编译并安装工具,可以在 http://www.gnu.org/software/binutils 中找到。
针对 2.6.8
内核,binutils
的 2.12
版本是最老的支持这个内核版本的二进制工具集。
使用下面的命令来查看自己的 binutils
版本:
$ ld -v
make
make
可以遍历内核源码树,确定哪些文件需要编译,之后调用编译器以及其他工具来完成内核编译。内核需要的 GNU make
的版本通常可以在你的版本分支的 make
中发现。
如果你希望自己下载源码编译并安装 make
,可以在 http://www.gnu.org/software/make 找到。
对于 2.6.8
内核,make
的 3.79.1
版本是最老的支持这个内核版本的工具版本。推荐安装最新版本的 make
,因为最新版本的 make
能够更快完成这个工作。
使用下面的命令确定自己的 make
版本:
$ make --version
Tools to Use the Kernel
虽然运行的内核版本一般不会影响任何用户应用,但是也存在少量应用程序依赖于内核版本。本节描述一些可能已经安装在你的系统上的程序。如果你更新的内核到其他的版本,这些程序可能也要更新,以保证它能过够正常工作。
util-linux
util-linux
包是做一系列不同工作的小工具集。这个工具集的大部分工具用来处理挂载、创建盘分区、操纵系统中的硬件时钟。
如果你希望自己下载安装这个工具集,可以在 http://www.kernel.org/pub/linux/utils/util-linux 中找到。
针对 2.6.18
内核,2.10
版本是能够正常工作的最老版本。推荐安装最新版本,因为新版本支持内核的新特性。绑定挂载是一个新内核支持特性的例子,新的 util-linux
包能够支持使用这个特性。
使用下面的命令确定自己的 util-linux
包版本:
$ fdformat --version
module-init-tools
如果你需要使用 Linux
内核模块,那么 module-init-tools
是必要的。一个内核模块是能够在内核运行过程中添加到或从内核中移除的可加载代码块。有时候我们将设备驱动编译成模块只在对应的硬件存在时才将驱动加载到内核。所有的 Linux
发布版本使用模块来只在硬件存在时加载对应的驱动以及系统选项,而不是将所有内容都维持在内核中。模块化可以节省内核运行时所需的内存。
内核模块载入进程在 2.6
内核中发生了根本的转变。模块的链接器现在处于内核中,这令用户空间工具很小。老的发布版本具有成为 modutils
的包,在 2.6
内核中不能正常工作。module-init-tools
包则是在 2.6
内核版本之后需要的了。
如果你希望自己下载并安装这个包,可以在 http://www.kernel.org/pub/linux/utils/kernel/module-init-tools 中找到。
针对 2.6.18
内核,0.9.10
版本是能够正常工作的最老版本。推荐使用最新版本,因为新版本支持内核的新特性。其中的黑名单能够避免加载一些有问题的模块。
使用下面的命令来确定自己的 module-init-tools
包版本:
$ depmod -V
Filesystem-Specific Tools
为完成对某个文件系统创建、格式化、配置、修复盘分区等工作,需要一系列工具。util-linux
包中具有一些工具集,但是对一些流行的文件系统,则被放在单独的包中。
ext2/ext3/ext4
ext3
以及 ext4
文件系统是 ext2
的升级,可以使用相同的工具进行管理;任何基于 ext2
的工具的最新版本,也可以对另外两个文件系统进行处理。
如果希望能够使用这些文件系统,你必须具有 e2fsprogs
包。
如果你希望自己下载并安装这个包,可以在 http://e2fsprogs.sourceforge.net 中找到。
针对 2.6.18
内核,1.29
版本是能够正常工作的最老版本。推荐使用最新版本,因为新版本可以完全使用 ext2
以及 ext3
文件系统中具有的新特性。
使用下面的命令来确定自己的 e2fsprogs
包版本:
$ tune2fs
JFS
如果使用 IBM
的 JFS
文件系统,你必须具有 jfsutils
包。
如果你希望自己下载并安装这个包,可以在 http://jfs.sourceforge.net 中找到。
针对 2.6.18
内核,1.1.3
版本是能过够正常工作的最老版本。
使用下面的命令来确定自己的 jfsutils
包版本:
$ fsck.jfs -V
ReiserFS
为了使用 ReiserFS
文件系统,你必须具有 reiserfsprogs
包。
如果你希望自己下载并安装这个包,可以在 http://www.namesys.com/download.html 中找到。
针对 2.6.18
内核,3.6.3
版本是能够正常工作的最老版本。
使用下面的命令确定自己的 reiserfsprogs
包版本:
$ reiserfsck -V
XFS
为了使用 SGI
的 XFS
文件系统,你不许具有 xfsprogs
包。
如果你希望自己下载并安装这个包,可以在 http://oss.sgi.com/projects/xfs 中找到(这个链接好像打不开呢)。
针对 2.6.18
内核,2.6.0
版本是能够正常工作的最老版本。
使用下面的命令确定自己的 xfsprogs
包版本:
$ xfs_db -V
Quotas
为了使用内核提供的磁盘配额功能,你必须具有 quota-tools
包。这个包包含的程序可以令你为用户分配磁盘配额,为不同的用户提供静态的配额。并在用户使用的空间快要超出他具有的配额时做出警告。
如果你希望自己下载并安装这个包,可以在 http://sourceforge.net/projects/linuxquota 中找到。
针对 2.6.18
内核,3.09
版本是能够正常工作的最老版本。
使用下面的命令确定自己的 quota-tools
包版本:
$ quota -V
NFS
为了使用 NFS
文件系统,你必须具有 nfs-utils
包。这个包包含的程序可以令你挂载 NFS
分区作为一个客户端,并运行一个 NFS
服务器。
如果你希望自己下载并安装这个包,可以在 http://nfs.sf.net 中找到。
针对 2.6.18
内核,1.0.5
版本是能够正常工作的最老版本。
使用下面的命令确定自己的 nfs-utils
包版本:
$ showmount --version
Other Tools
还有一些十分重要的程序与内核版本紧紧绑定。这些程序在内核正常工作时并不是必要的,但是它们可以用来访问不同类型的硬件与功能。
udev
udev
程序可以令 Linux
在 /dev
目录中提供一个持续存在的设备名系统。它也提供了一个动态的 /dev
,就像 devfs
文件系统提供的功能一样。基本上所有的 Linux
发布版本都使用 udev
来管理 /dev
目录,因此需要使用它来正常地启动设备。
udev
依赖于 /sys
目录,而 /sys
这个目录对在不同的内核版本中是不同的。内核的一些修改会打断 udev
,因此设备可能不能够正常启动。如果你最新版本的 udev
不能够正常启动你的内核,请联系 udev
的开发者。linux-hotplug-devel@lists.sourceforge.net。
推荐你使用在你的 Linux
发布版本中具有的 udev
。
如果你希望自己下载并安装这个包,可以在 http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html 中找到 (不能访问)。
针对 2.6.18
内核,081
版本是能够正常工作的最老版本。推荐使用最新版本的 udev
,因为它能更好的为新内核服务。
使用下面的命令确定自己的 udev
包版本:
$ udevinfo -V
已经被 udevadm
替代
Process tools
procps
包包含常用的工具比如 ps
以及 top
,以及一些其他的用来管理操作进程的工具。
如果你希望自己下载并安装这个包,可以在 http://procps.sourceforge.net 中找到。
针对 2.6.18
内核,3.2.0
版本是能够正常工作的最老版本。
使用下面的命令确定自己的 procps
包版本:
$ ps --version
PCMCIA tools
为了能够在 Linux
中正常使用 PCMCIA
设备,必须使用一个用户空间帮助程序来设置设备。对于较老的内核版本,这个程序曾经称为 pcmcia-cs
,现在已经被更简单的系统替代 pcmciautils
。
如果你希望自己下载并安装这个包,可以在 ftp://ftp.kernel.org/pub/linux/utils/kernel/pcmcia 中找到(存在问题)。
针对 2.6.18
内核,004
版本是能够正常工作的最老版本。推荐使用最新版本,以使用 PCMCIA
子系统中的新特性,比如新设备查找到后自动加载驱动。
使用下面的命令确定自己的 pcmciautils
包版本:
$ pccardctl -V