Linux 性能调优,献给胆小者
您是否曾想过,究竟是哪个疯子会想要重新编译 Linux 系统内核?对于某些人来说,这是一个具有挑战性的问题。许多 Linux 新用户都认为,当他们安装 Linux 时,安装本身就是完美的。不要以为 Linux 在开箱后就为你精确的设置进行了高效的设置。以下是原因(以及如何更改它)。
假设您买了一台新笔记本电脑,并且想在上面运行 Linux。您只有 4MB 的 RAM,并且只有 100MB 的硬盘空间。一个经过精细调整的 Linux 内核是让您的系统拥有所有可能的内存空间的关键,因此也是以少量时间投入获得更快系统的关键。
您可能已经意识到 Linux 提供了“虚拟内存”(也称为交换空间或分页空间),它允许程序使用比系统上实际更多的内存,方法是将某些内存的内容临时移动到磁盘。但是,您可能没有意识到,内核的任何部分都无法分页到磁盘。内核占用的每个字节都是任何其他程序都无法使用的字节。
如果您运行的内核内置了 SCSI 支持、网络和声音,但您没有或不使用 SCSI、网络或声卡,那么您就是在浪费内存。如果您的内核是随 Linux 发行版一起提供的,则很可能就是这种情况,因为这些内核通常编译为可与非常广泛的设备一起工作,并且没有针对您的硬件进行调整。
如果您只有 4MB 的内存,那么当其他程序被换出到磁盘然后再换回内存时,您也可能浪费大量时间。通过编译一个不包含不必要部分的全新内核,您可以使您的 Linux 计算机运行得更快。
幸运的是,Linux 使这变得容易。
首先,您需要考虑您拥有的硬件。您有哪些类型的外围设备?您有什么类型的鼠标?您有声卡吗?
为了为您系统构建和编译最佳内核,您必须了解您的硬件组成。您可能会发现坐下来列出您计算机的所有部件很有帮助。这不仅现在对您有帮助,而且如果您遇到问题或错误,它还将帮助您发布良好的问题报告,因为当您发布问题报告时,您需要相同的有关您的配置的信息。
要配置您的系统,您首先需要在您的系统上安装 Linux 源代码。这可以通过 ftp 从 nic.funet.fi 的 /pub/OS/Linux/PEOPLE/Linus,tsx-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 文件。确保您为硬盘驱动器上的特定表放置了正确的标签名称。
一旦启动了新内核,您就可以自由地进行修改了。内核编译可能是一个令人困惑的过程。一些新的管理员会被编译新内核吓倒,但它是运行优化系统的先决条件。经过几次内核升级后,您可以熟练地维护您的系统以达到最佳状态。然后,您可以将该知识传递给那些曾经和您一样不确定的人。请记住,您对自己的系统了解得越多,您在使用它时就越优化。
在解压缩内核源代码之前,最好先备份您的旧内核。您应该这样做,只是暂时这样做,直到您完全让新内核正常运行。您甚至可以使用 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 -
此过程完成后,您就可以继续了。我还建议将新的压缩内核源代码保存在备份目录中。这样,如果在升级和编译新内核的过程中发生错误,您始终拥有未修补的“原始”源代码可以重新开始。这消除了再次下载内核源代码的时间,并让您有更多时间专注于手头的任务。
Clarence Smith, Jr. 是华盛顿大学的学生,攻读公共关系和社会学学位。他希望通过开发一些有用的软件工具来提高他对 Linux 操作系统的了解。Clarence 秉承黑客道德,以追求完美为目标,基于优美的代码行和功能。