Linux 性能调优,献给胆小者

作者:Clarence Smith Jr.

您是否曾想过,究竟是哪个疯子会想要重新编译 Linux 系统内核?对于某些人来说,这是一个具有挑战性的问题。许多 Linux 新用户都认为,当他们安装 Linux 时,安装本身就是完美的。不要以为 Linux 在开箱后就为你精确的设置进行了高效的设置。以下是原因(以及如何更改它)。

假设您买了一台新笔记本电脑,并且想在上面运行 Linux。您只有 4MB 的 RAM,并且只有 100MB 的硬盘空间。一个经过精细调整的 Linux 内核是让您的系统拥有所有可能的内存空间的关键,因此也是以少量时间投入获得更快系统的关键。

您可能已经意识到 Linux 提供了“虚拟内存”(也称为交换空间或分页空间),它允许程序使用比系统上实际更多的内存,方法是将某些内存的内容临时移动到磁盘。但是,您可能没有意识到,内核的任何部分都无法分页到磁盘。内核占用的每个字节都是任何其他程序都无法使用的字节。

如果您运行的内核内置了 SCSI 支持、网络和声音,但您没有或不使用 SCSI、网络或声卡,那么您就是在浪费内存。如果您的内核是随 Linux 发行版一起提供的,则很可能就是这种情况,因为这些内核通常编译为可与非常广泛的设备一起工作,并且没有针对您的硬件进行调整。

如果您只有 4MB 的内存,那么当其他程序被换出到磁盘然后再换回内存时,您也可能浪费大量时间。通过编译一个不包含不必要部分的全新内核,您可以使您的 Linux 计算机运行得更快。

幸运的是,Linux 使这变得容易。

首先思考

首先,您需要考虑您拥有的硬件。您有哪些类型的外围设备?您有什么类型的鼠标?您有声卡吗?

为了为您系统构建和编译最佳内核,您必须了解您的硬件组成。您可能会发现坐下来列出您计算机的所有部件很有帮助。这不仅现在对您有帮助,而且如果您遇到问题或错误,它还将帮助您发布良好的问题报告,因为当您发布问题报告时,您需要相同的有关您的配置的信息。

要配置您的系统,您首先需要在您的系统上安装 Linux 源代码。这可以通过 ftpnic.funet.fi/pub/OS/Linux/PEOPLE/Linustsx-11.mit.edu/pub/linux/sources/system 目录或 sunsite.unc.edu/pub/Linux/kernel 或世界各地的其他镜像站点获得。目录名称将取决于内核版本:Linux 1.1.x 版本保存在 v1.1 目录中,名称类似于 linux-1.1.45.tar.gz,补丁名称类似于 patch46.gz。您只需要获取编号晚于您获取的 tar 文件版本的补丁。

或者,如果您从某人那里购买了 Linux,则 Linux 的 GPL 版权要求他们提供源代码,或应要求提供(可能收取象征性费用)。

源代码应解压缩到 /usr/src/linux 中,因为它期望在那里。如果您不知道如何执行此操作,请参阅侧边栏 “解压缩 Linux 源代码”

解压缩源代码后,您应该应用任何所需的 内核补丁 以获得您想要的版本。您应该将您的补丁(当它们仍然压缩或 gzipped 时)插入到 /usr/src/linux 中。然后从 /usr/src/linux 中,键入

gunzip -c patch?.gz | patch -s -p1gunzip -c patch??.gz | patch -s -p1

? 获取补丁 1-9 按顺序,只有当您使用其中一个补丁时才应该这样做。?? 将获取 10 到 99 之间的所有补丁(存在的且您已下载的)按顺序。重要的是所有补丁都按顺序应用。patch-s 参数告诉 patch 静默工作,仅抱怨错误。-p1 告诉 patch 我们在 /usr/src/linux 目录中,以便它知道如何查找文件,并将新文件放在正确的位置。-s 标志是可选的;-p1 参数是强制性的。

或者,您可以分别运行每个补丁

gunzip -c patch8.gz | patch -p1gunzip -c patch9.gz | patch -p1...gunzip -c patch46.gz | patch -p1

等等。

完成补丁后,您可能想要删除补丁创建的任何不必要的文件。这些文件是以任何方式更改的文件的原始版本,因此它们可能会占用大量空间。您可以通过键入以下内容来查找并删除它们

find /usr/src/linux -name '*.orig' -o -name '*~'-exec rm -f {} ;

您可以通过键入以下内容来查找任何未正确修补的文件,从而提前发现可能导致无法编译内核的问题

find /usr/src/linux -name '*.rej' -print

这将列出任何具有“拒绝块”的文件;无法正确安装到源代码中的补丁。如果您发现任何这些文件,请重新开始。如果您仍然看到这些文件,请向他人寻求帮助;可能出错的事情太多了,无法在本文中涵盖。

配置内核

现在,在 /usr/src/linux 中,键入 make config。现在会提示您回答许多有关您系统的问题。如果您说您没有您确实拥有的硬件,则新内核将不支持该特定硬件。同样,如果您说您拥有您没有的硬件,您将浪费内存。此外,您只想启用您将要使用的软件功能。

我将尝试指出一些最重要的配置问题。首先出现的问题之一是

“内核数学仿真” CONFIG_MATH_EMULATION ?

如果您没有数学协处理器,您应该回答此问题为 YES。那些拥有数学协处理器的人应该回答 NO。内置数学仿真的内核仍然会使用处理器(如果存在)。在这种情况下,数学仿真根本不会被使用。但是,这将导致内核稍大,并浪费内存。

有几个关于硬盘支持的问题。其中一个特别容易引起混淆

“XT 硬盘支持” CONFIG_BLK_DEV_XD

我回答这个问题为 NO。这实际上与硬盘无关,它与您的 控制器卡 有关。AT 控制器卡是 16 位卡,受标准硬盘驱动程序支持。XT 控制器卡是 8 位卡,在 386 类机器中非常罕见。

“TCP/IP 网络” CONFIG_INET

如果您计划让您的系统在网络上交互,请回答 YES。这包括 SLIP 和 PPP 连接。如果您现在不打算连接到网络,请回答 NO;您以后总是可以编译另一个内核。

“System V IPC” CONFIG_SYSVIPC

这在很多方面都没有使用,但不会占用太多内存。建议选择 YES。

“对 486 特定优化使用 -m486 标志” CONFIG_M486

如果您有 i386 系统,请回答 NO。否则,您应该选择 YES。这会占用少量内存。添加此标志不会降低 386 的速度,除了使用额外的内存外,但会大大加快 486 的速度。

设备类型

有一系列问题与不同类型的 SCSI 驱动程序和接口有关。如果您有 SCSI 控制器,那么您需要通过配置过程启用驱动程序。对于那些没有 SCSI 控制器的人,请选择 NO,然后继续配置中的下一步。如果您不选择 SCSI 支持,则不会询问您是否包含 SCSI 设备。

网络设备支持主要与选择正确的以太网设备或其他网络连接有关。PPP 和 SLIP 用于通过串行端口连接到 TCP/IP 网络;PLIP 用于通过并行端口连接 TCP/IP 网络,其余的是以太网控制器。不要选择您没有的设备的驱动程序。这有时会在您启动时引起冲突。

内核配置过程中的另一个重要部分与不同的文件系统有关。将内核编译为仅具有您需要的文件系统是有优势的。Linux 支持几种不同的文件系统

“标准 (minix) fs 支持” CONFIG_MINIX_FS

这是原始的 Linux 文件系统。它被认为是更稳定的文件系统之一,并且仍然被广泛使用。除非您真的急需空间,或者真的永远不会使用它,否则您可能需要它。

“扩展 fs 支持” CONFIG_EXT_FS

仅当您仍然有来自“旧时代”的文件系统将使用第二个扩展文件系统的先驱时才选择此项。此文件系统速度慢,且不再积极维护。它仅用于向后兼容。NO。

“第二扩展 fs 支持” CONFIG_EXT2_FS

ext2 文件系统是文件系统中“功能最齐全”的。它是原始扩展文件系统的超级重写,也提高了速度。这是迄今为止最流行的文件系统。此文件系统有一个文件系统调试包,可以帮助您从相当糟糕的文件系统崩溃中恢复。YES。

“xiafs 文件系统支持” CONFIG_XIA_FS

这是 Minix 文件系统的修改版(允许诸如更长的文件名之类的东西)。如果您计划使用它 (YES),否则 (NO)。

“msdos fs 支持” CONFIG_MSDOS_FS

此文件系统允许访问 MS-DOS 使用的 FAT 文件系统。对于那些需要访问使用该文件系统的软盘或硬盘分区的人来说,这是一个巨大的优势。此外,如果您使用 UMSDOS 文件系统(通常是因为您在 MSDOS 分区上安装了 Linux),则需要包含 MSDOS 文件系统支持。

“/proc 文件系统支持” CONFIG_PROC_FS

PROC 文件系统不接触您的磁盘。内核使用它来向需要该信息的系统程序提供内核本身内保存的数据。许多标准实用程序在没有此文件系统的情况下将无法运行。YES。

“NFS 文件系统支持” CONFIG_NFS_FS

对于那些拥有物理网络并且需要从其他计算机挂载 NFS 文件系统的人来说,NFS 文件系统是必需的。如果您在 TCP/IP 网络上,您可能需要此选项。否则,您不需要。

可能的困惑

“内核分析支持” CONFIG_PROFILE

这仅供经验丰富的内核黑客使用。如果您需要阅读本文...则不需要此项。

“选择(虚拟控制台的剪切和粘贴)”

不言自明。如果您希望能够在任何 VC 中使用鼠标,那么您应该选择 YES。请注意,这需要单独的 selection 程序才能工作。没有此程序,您的鼠标将处于非活动状态。这与 X-windows 无关。

声音技巧

配置过程中需要洞察力的最后一部分与声卡选项有关。如果您想要声卡支持,那么您肯定会选择 YES。令人困惑的部分是接下来的两个问题;由于它们出现的顺序而令人困惑。

完整驱动程序? NO。我选择 NO 是因为我想将内核配置为仅处理我的特定声卡。我不想为我没有的卡启用驱动程序。这只是浪费空间。

紧随其后的是:禁用? NO。在我看来很奇怪,驱动程序问题会在完全禁用声音驱动程序的问题之前出现。尽管如此,您应该选择 NO,并根据您拥有的硬件相应地回答后续问题。

这就是配置过程的最后一部分。剩下的就是建立系统依赖项。之后,就是实际的内核编译!

建立系统依赖项

建立依赖项没有任何令人困惑的部分。您所做的只是键入 make depend(在 /usr/src/linux 目录中,您应该已经在其中);这会设置所有文件都具有的系统依赖项。如果您必须更改源代码,这将允许 make 智能地重新编译正确的文件。

编译内核

创建系统依赖项后,您就可以编译新配置的内核了。此时,您应该键入 make zImage 以创建一个压缩内核。这有助于保持内核较小。根据您机器的速度、您拥有的内存量以及您要编译到内核中的内容,您的编译可能需要 15 分钟(在快速 486 或 Pentium 上)到几个小时(在具有 4MB 内存的慢速 386sx 上)不等。

编译过程完成后,您将在 /usr/src/linux 目录中找到一个新创建的内核 zImage。但是,安装新内核的过程尚未完成。如果您现在重新启动,即使您已经编译了一个新内核,您仍然会启动旧内核。您仍然需要安装新内核。

安装新内核

在安装新内核之前,您应该重命名旧内核,以便在紧急情况下可以使用它。在 / 目录中,应该有旧内核的映像 (zImage)。只需使用 mv 命令将其重命名为 zImage.old。如果您的新内核无法启动,这将很有用;您至少有一个仍然允许系统正常运行的备份。

现在,您必须编辑(如果需要)LILO 配置文件,以便它接受您的新内核。它最常出现在 /etc/lilo/config 文件中,但也可能以 /etc/lilo.conf 的形式存在。基本上,编辑配置文件并运行 lilo 会告诉 LILO 在启动时使用哪个内核。配置文件中设置的第一个映像将是默认映像。通过将新内核映像放在首位,我们将确保默认情况下启动新内核;如果我们将 DOS 条目放在首位,则默认情况下将启动 DOS。这是一个示例

boot = /dev/hda

#这是要启动的新内核映像的路径image = /zImagelabel = linux

#这是旧内核映像的路径#如果另一个应该无法启动image = /zImage.oldlabel = linux.old

#这是 DOS 操作系统的路径other = /dev/hda1table = /dev/hdalabel = dos

编辑配置文件后,将新内核映像复制或移动到 / 目录。确保 /zImage/zImage.old 在继续之前都存在。接下来,您需要返回 /etc/lilo 目录并键入 ./lilo 以运行 lilo。或者(如果 /etc/lilo 不存在),您可能需要 cd/etc 并运行 /sbin/lilo。在任何一种情况下,这都是“安装”步骤,使您能够启动新内核。

现在您可以启动新内核了。为此,请键入 shutdown -r now

如果您没有通过将新内核作为 /etc/lilo/config 中的第一个条目来将其安装为默认内核,您将需要在启动时手动选择新内核。您可以通过在 LILO 启动时按 <shift>、<control> 或 <alt keys> 或在 LILO 启动之前按 <CapsLock> 或 <ScrollLock> 键来激活 LILO 菜单。

在 LILO 提示符下,请确保键入映像的 标签,而不是映像的文件名。如果 LILO 找不到您请求的映像,它会告诉您。键入 ? 将为您提供标签列表以供选择。

在启动过程中,请务必查看与正在启动的内核版本以及编译日期相关的信息(它们都在同一行)。我的看起来像这样

Linux version 1.0.9 (root@HoMiEz.ShOpPiN.NeT) Thu Jul 14 22:45:16 1994

此特定行告诉您正在启动的内核版本,以及上次编译的日期和时间。此处显示的信息应与您最近完成的编译过程一致。如果存在不一致之处,请务必检查您的 /etc/lilo/config 文件。确保您为硬盘驱动器上的特定表放置了正确的标签名称。

一旦启动了新内核,您就可以自由地进行修改了。内核编译可能是一个令人困惑的过程。一些新的管理员会被编译新内核吓倒,但它是运行优化系统的先决条件。经过几次内核升级后,您可以熟练地维护您的系统以达到最佳状态。然后,您可以将该知识传递给那些曾经和您一样不确定的人。请记住,您对自己的系统了解得越多,您在使用它时就越优化

解压缩 Linux 源代码

在解压缩内核源代码之前,最好先备份您的内核。您应该这样做,只是暂时这样做,直到您完全让新内核正常运行。您甚至可以使用 tar 然后压缩它来缩小旧内核源代码的大小。最好同时使用两者,作为双重强度方法

cd /usr/srctar cvf linux-old.tar linuxgzip -9 linux-old.tar

结果文件应该是 linux-old.tar.gz。完成此操作后,您可以安全地通过键入以下内容删除旧的源代码目录

rm -rf linux

完成此操作后,您可以解压缩新内核。您必须首先将新内核源代码移动到 /usr/src。然后键入以下内容

gunzip -c new-kernel-name.gz | tar xvof -

此过程完成后,您就可以继续了。我还建议将新的压缩内核源代码保存在备份目录中。这样,如果在升级和编译新内核的过程中发生错误,您始终拥有未修补的“原始”源代码可以重新开始。这消除了再次下载内核源代码的时间,并让您有更多时间专注于手头的任务。

内核资源

内核源代码可在大量 Linux ftp 站点上获得,包括 sunsite.unc.edu/pub/Linux/kerneltsx-11.mit.edu/pub/linux/sources/systemnic.funet.fi/pub/OS/Linux/kernel/src。存储在这些站点上的内核源代码通常是 gzipped tar 文件,文件名为 linux-version.tar.gz

如果您从经销商处获得 Linux,他们可能已经为您提供了内核源代码。如果他们没有提供,GNU 通用公共许可证要求他们向您提供。

Clarence Smith, Jr. 是华盛顿大学的学生,攻读公共关系和社会学学位。他希望通过开发一些有用的软件工具来提高他对 Linux 操作系统的了解。Clarence 秉承黑客道德,以追求完美为目标,基于优美的代码行和功能。

加载 Disqus 评论