linux内核编译(不是选项)

LINUX内核编译
 
编译LINUX的内核
Daniel Robbins
总裁/CEO
Gentoo 技术公司
2000-09-27
本文转自 http://www-900.ibm.com/developerWork...5?OpenDocument
一 、内核入门:
1. 启动,第一部分 当您开启您基于 Linux 的系统时,内核被一个引导工具,例如 LILO,从硬盘载入内存。在此时,内核接管了您的系统控制。它所作的第一件事是探测并初始化它所找到的硬件 -- 它被编译成能支持的那些。一旦硬件已经被正确初始化,它就准备开始运行进程了。它运行的第一个进程被称为"init",位于 /sbin 目录下。然后,"init" 启动在 /etc/inittab 文件中指定的其他进程。

2. 启动,第二部分 "init"通常启动一个名为"getty"程序的多份拷贝,它等待来自控制台的登录。在 getty 成功处理一个登录请求后,您缺省的 shell (通常是 bash) 被载入。一旦您进入 bash,您就有能力来启动任意一个您想要的程序了。当所有这些新的进程被启动后,内核仍在控制系统,精确地给 CPU 分割时间片这样每个进程将均匀地分到。另外,内核继续为各种运行中的进程提供硬件抽象和网络服务。

3. 介绍...模块! 所有最新的 Linux 内核都支持内核模块。Kernel 模块是非常整齐的 -- 它们是除非需要驻留在硬盘上的内核部分。一旦内核需要一个特定模块的功能时,它从硬盘被载入,自动集成到内核中就可被使用了。另外,如果内核模块有好几分钟未被使用,内核可以自愿地将其从内存中调出 -- 被称之为"自动清除"。

4. 模块,第二部分 内核模块是驻留在 /lib/modules 目录下,而且每个模块再其文件名结尾都有一个 ".o"。您也许会猜到,每个模块代表一个内核功能的特定组件 -- 一个模块可能提供 FAT 文件系统支持,而另一个可能支持一种特殊的 ISA 以太网卡.模块使得您的内核占用少量的内存空间。您可创建一个内核只包含足以启动计算机的功能,而其他的功能则在需要时被载入。由于内核能自动清除它所载入的模块,您系统的内存资源能被很好地利用。

5. 模块 -- 特别注意! 您是无法将所有一切放入一个模块的。由于模块是存放在磁盘上,您可启动的内核映像需要被编译入您的磁盘控制器以及对您基本文件系统(通常是 ext2 文件系统)的支持。如果您没有将这些重要的组件编译入您的内核映像(而是将它们作为模块来编译),然后您的内核就无法获得基本的功能来从磁盘上载入这些模块了 -- 导致了一个“鸡生蛋、蛋生鸡”的问题!

二、查找并下载内核代码
1. 下载内核 如果您只是想编译一个您已安装内核的新版本(例如,实现 SMP 支持),那不需要下载任何代码 -- 跳过此部分继续下一屏。您可以在 http://www.kernel.org/pub/linux/kernel 上找到内核代码。当您进入到那后,您将发现内核的源代码按内核版本(v2.2、v2.3 等),被组织到多个不同的目录中。在每个目录中,您将发现文件被冠以"linux-x.y.z.tar.gz"和"linux-x.y.z.tar.bz2"。这些就是 Linux 内核的源代码。您也将看到冠以 "patch-x.y.z.gz" 和 "patch-x.y.z.bz2" 的文件。这些是用来更新前面完整的内核源代码的补丁包。如果您希望编译一个新的内核版本,您将需要下载这些"linux"文件其中之一。

2. 内核解包 如果您已从 kernel.org 下载一个新的内核,现在是要将其解包时候了。首先,cd /usr/src。如果这里有一个存在的"linux"目录,将其改名为"linux.old" ("mv linux linux.old",以 root 权限)。现在,可以解开新的内核包了。仍然在 /usr/src 目录下,输入 tar xzvf /path/to/my/kernel-x.y.z.tar.gz 或者 cat /path/to/my/kernel-x.y.z.tar.bz2 | bzip2 -d | tar xvf -,根据您下载的源代码是用 gzip 或 bzip2 压缩的。在输入完此命令后,您下载的内核源代码会被释放到一个新的"linux"目录下。注意 -- 全套内核源代码通常将在硬盘上占用超过 50 兆空间!

三、配置内核:
1. 讨论配置问题 在您编译内核前,您需要配置它,配置是您精确控制在新内核中启用(禁止)哪些内核功能的机会。您也将控制哪些会被编译到内核的二进制映像(在启动时被载入)而哪些被编译到需要时载入的内核模块文件。老式配置内核的方法是极为痛苦的过程,并涉及到进入 /usr/src/linux 目录并输入 make config 命令。请放弃这种配置内核的方式 -- 除非您想在命令行上回答几百个(对!几百个)“yes/no”的问题。

2. 配置的新途径 我们是现代人类,我们不在输入 make config,而是输入 make menuconfig 或者 make xconfig。如果您想要配置您的内核,使用上述选择之一。如果您输入 make menuconfig,您将使用一个漂亮的基于文本的彩色菜单系统来配置内核。如果您输入 make xconfig,您将使用一个更漂亮的基于 X-Window 的 GUI 界面来配置内核的各种选项。这里有一个使用 "make menuconfig" 的屏幕截图:

当使用 "make menuconfig" 时,在左面出现一个 "< >" 的选项能被编译成为一个模块。当选项被选中,按下空格键来循环选择选项是被选中或未选中, ("<*>")表示将被编译成内核映像而("<M>")表示将被编译成模块。
3. 配置技巧 在这里有极其多的内核选项,而且我们无法在此一一解释 -- 所以请利用内核内置的帮助功能。基本上每个选项都至少有一些描述,而且每个通常都有一行"如果您不知道这个选项的含义,输入 Y。(或者 N)"。这些提示在您不知道一个特定选项的含义时能帮助您。要使用帮助,选中您有疑问的选项然后按 "?" 键。

四、编译LINUX内核
1. make dep; make clean 一旦您的内核配置完毕,就可开始编译它了。在我们能编译它前,我们需要生成依赖(dependency)信息并清除任何老的"编译结果"。这可以通过在 /usr/src/linux 下输入 make dep; make clean 完成。

2. make bzImage 现在是编译真正的二进制内核映像时候了。输入 make bzImage。过几分钟后,编译会结束而且您在 /usr/src/linux/arch/i386/boot(x86 PC 内核)目录下找到 bzImage 文件。我们将待会告诉您如何安装这个新内核,但是现在我们要看看模块编译了。

3. 编译模块 现在我们有了 bzImage,下面要编译模块了。即使您在配置内核时没有使用任何模块,也不要跳过此步骤 -- 在编译完 bzImage 后立刻编译模块是个好习惯。而且,如果您真的没有模块需要编译,这个步骤也非常快就结束了。输入 make modules; make modules_install。这将导致模块被编译而且被安装到 /usr/lib/<内核版本号> 目录下。祝贺您!您的内核已经被编译完成了,您的内核模块也编译完成并被安装。现在是要重新配置 LILO,这样您能使用新的内核。

五、启动配置
1. LILO 入门 现在是最后来重新配置 LILO 的时候了,它将负责载入新的内核。LILO 是最流行的 Linux 引导工具,而且为所有的主流 Linux 发行商所采用。您要作的第一件事是察看您的 /etc/lilo.conf 文件。它将包含一行看似 "image=/vmlinuz" 的语句。该语句告诉 LILO 到何处找到内核。

2. 启动配置, 第二部分 要配置 LILO 来使用新的内核,您有两种选择。第一个是覆盖您现有的内核 -- 除非您手头上有一些紧急启动措施如还有此内核的引导盘,这很危险的方法。更为安全的选择是配置 LILO 是得它能从新的或旧的内核引导。LILO 可配置成从新内核缺省启动,但仍提供一种方法让您遇上问题时能选择旧的内核来启动。这是推荐的作法,也是我们将随后介绍的方法。

3. 启动配置, 第三部分 您的 lilo.conf 文件有可能看起来如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only
image=/vmlinuz
label=linux
要在您的 lilo.conf 文件中增添新的项目,参见下列步骤。首先,拷贝 /usr/src/linux/arch/i386/boot/bzImage 到您的根(root)分区上的一个文件,例如 /vmlinuz2。一旦拷贝完毕,复制您 lilo.conf 文件的最后三行并将它们添加到该文件的最后... 我们即将结束整个步骤了...

4. 启动配置, 第四部分 现在,您的 lilo.conf 文件应该看起来如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only

image=/vmlinuz
label=linux
image=/vmlinuz
label=linux
首先,将第一个 "image=" 行改为 "image=/vmlinuz2"。其次,将第二个 "label=" 行改为 "label=oldlinux"。然后,确定在文件的开始有一行 "delay=20" -- 如果没有,增添一行。如果它已经存在,将数字至少设为 20。

5. 启动配置, 第五部分 您最后的 lilo.conf 文件将看起来如下:
boot=/dev/hda
delay=20
vga=normal
root=/dev/hda1
read-only

image=/vmlinuz2
label=linux

image=/vmlinuz
label=oldlinux
作完这些修改后,您将需要以 root 身份运行 "lilo"。这非常重要!如果您不执行此步,启动的过程无法继续。运行 "lilo" 将给 lilo 一个机会来更新它的启动映射。

6. 启动配置, 详解 现在我们详细地解释一下我们所作的改动。这个 lilo.conf 文件可以用来允许您启动两个不同的内核。它允许您启动您原来的内核,位于 /vmlinuz 目录下。它也允许您启动新的内核,位于 /vmlinuz2 目录下。在缺省情况下,它将尝试启动您的新内核(指向新内核的 image/label 行首先出现在配置文件中)。如果,出于某种原因,您需要启动旧内核,只需在重新启动计算机时按住 Shift 键。LILO 将会监测到此操作,然后允许您输入要启动的映像标签名。要启动旧内核,您需要输入 "oldlinux",然后按回车键。要看到有哪些选择,您可按 TAB 键。


 

你可能感兴趣的:(linux,公司,职场,硬件,休闲)