Linux 内核编译与优化


Linux 系统工程师 —— Linux 高级应用 Version:1.0 1www.koorka.com 第一章 内核编译与优化 新配置和编译的内核往往能够支持更多的硬件,能够进行更好的进程管理,最 大限度地发挥硬件的功能,而且还可以修正旧版本中的错误与传统的 Windows 相比, 这是很具有诱惑力的优点。 本章目标: 学习完本章你将能够 ¾ 了解 Linux 内核的作用 ¾ 掌握内核的配置方法 ¾ 编译和安装内核 ¾ 掌握常用的内核参数 Linux 系统工程师 —— Linux 高级应用 Version:1.0 2www.koorka.com 1. 为什么要编译内核 内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、 文件和网络系统,决定着系统的性能和稳定性。 Linux 的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在 /usr/src/linux 下找到,大部分应用软件也都是遵循 GPL 而设计的,你都可以获取相 应的源程序代码。 全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引 发的一个明显的好处就是 Linux 修补漏洞的快速以及对最新软件技术的利用。而 Linux 的内核则是这些特点的最直接的代表。 想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系 统是如何工作的。通过通读源代码,我们就可以了解系统的工作原理,这在 Windows 下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的 系统,这样就需要重新编译内核。 在 Windows 下是什么情况呢?相信很多人都被越来越庞大的 Windows 整得莫名 其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没 错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的 就是要增加并实现自己需要的功能。在 Windows 下,除非你是微软的核心技术人员, 否则就不用痴心妄想了。 通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更 快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新 的系统内核是 Linux 使用者的必要操作内容。 为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码, 一般主要有下面四个考虑(这也是为什么我们需要编译内核): ¾ 自己定制编译的内核运行更快(具有更少的代码) ¾ 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中) ¾ 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞 ¾ 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 2. 开始编译内核前准备 在开始编译内核之前,需要作一些准备工作。 (1)获取硬件信息 Linux 系统工程师 —— Linux 高级应用 Version:1.0 3www.koorka.com 要编译或升级内核,必须要明确清楚自己的硬件型号。所谓硬件,无非就是 CPU 型号和板卡的控制芯片。 要知道 CPU 的型号,可以查看/proc/cpuinfo,下面是一台主机的 CPU 信息: [root@koorka ~]# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 4 model name : Intel(R) Pentium(R) 4 CPU 3.00GHz stepping : 8 cpu MHz : 3011.273 cache size : 2048 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe ds_cpl est cid xtpr bogomips : 5931.00 从上面的输出可以看出,该 CPU 是 P4 的。 要知道主机中的板卡信息,可以使用 lspci 命令 [root@koorka ~]# lspci 00:00.0 Host bridge: Intel Corporation: Unknown device 2770 (rev 02) 00:01.0 PCI bridge: Intel Corporation: Unknown device 2771 (rev 02) 00:1b.0 Class 0403: Intel Corporation: Unknown device 27d8 (rev 01) 00:1c.0 PCI bridge: Intel Corporation: Unknown device 27d0 (rev 01) 00:1c.2 PCI bridge: Intel Corporation: Unknown device 27d4 (rev 01) 00:1d.0 USB Controller: Intel Corporation: Unknown device 27c8 (rev 01) 00:1d.1 USB Controller: Intel Corporation: Unknown device 27c9 (rev 01) Linux 系统工程师 —— Linux 高级应用 Version:1.0 4www.koorka.com 00:1d.2 USB Controller: Intel Corporation: Unknown device 27ca (rev 01) 00:1d.3 USB Controller: Intel Corporation: Unknown device 27cb (rev 01) 00:1d.7 USB Controller: Intel Corporation: Unknown device 27cc (rev 01) 00:1e.0 PCI bridge: Intel Corporation 82801BAM PCI (rev e1) 00:1f.0 ISA bridge: Intel Corporation: Unknown device 27b8 (rev 01) 00:1f.1 IDE interface: Intel Corporation: Unknown device 27df (rev 01) 00:1f.3 SMBus: Intel Corporation: Unknown device 27da (rev 01) 01:00.0 VGA compatible controller: nVidia Corporation: Unknown device 01d1 (rev a1) 03:00.0 Ethernet controller: BROADCOM Corporation NetXtreme BCM5789 Gigabit Ethernet (rev 11) 04:00.0 Ethernet controller: 3Com Corporation 3c905B 100BaseTX [Cyclone] (rev 30) 04:01.0 SCSI storage controller: Adaptec 7899A (rev 01) 04:01.1 SCSI storage controller: Adaptec 7899A (rev 01) 从输出中我们可以知道主机的北桥芯片(Host bridge)、南 桥 芯 片( PCI bridge)、 USB 控制芯片(USB Controller)、IDE 控制芯片(IDE interface)、以太网卡、SCSI 卡等硬件信息。 注:lspci 命令之所以能够列出具体的型号,使因为 lspci 工具有一个数据库存储 了这些信息,对一那些不在数据库中的硬件型号,我们看到的是 Unknown。 (2)获取内核源代码 Linux 内核的官方下载地址为 www.kernel.org,要知道最新的内核版本,只要登 录该网站即可,如图 1-1 所示: 图 1-1 Linux 系统工程师 —— Linux 高级应用 Version:1.0 5www.koorka.com 当然,如果只是想定制,而不是升级,也可以使用发行版本自带的内核源代码, 例如在 RedHat Enterprise Linux AS 4 Update 2 中,如果在安装时选择了内核开发, 那么相应的内核源代码就已经安装在/usr/src/kernels 目录中了。如果在安装时没有安 装,只需要安装相应的源代码包。如果是超线程或双核的 CPU,或者有多个 CPU 建 议安装 kernel-smp-devel,否则安装 kernel-devel。 需要注意的是,官方版本的内核是标准内核,而发行版本的内核源代码有可能 是经过厂商修改过的,或者添加了一些特殊硬件的驱动。因此,我们建议到发行版 本的相应厂商处获取新版本的源代码。当然,如果您的系统使用的是普通 PC 服务 器,并且应用都是使用的源软件。那么使用标准版本的内核是没有任何问题的。 (3)取定服务器的脚色以及需要支持的功能。 要求清楚知道服务器用来做什么。例如如果服务器用来做防火墙,那么在编译 时防火墙功能必须要选择;如果用来做路由器,那么高级路由必须选择。总之,对 服务器需要使用的功能要了然于胸。 3. 编译并安装内核 在规划好服务器功能之后,结下来就可以对内核进行编译和配置了。 3.1 配置内核的方法 Linux 内核源代码采用的 make 项目的方式来进行配置编译。在开始编译前,需 要对内核进行配置。配置内核有 3 种方法: (1)文本交互配置 在源代码目录树内执行 make config 命令: [root@koorka 2.6.9-22.EL-smp-i686]# make config HOSTLD scripts/kconfig/conf scripts/kconfig/conf arch/i386/Kconfig # # using defaults found in .config * * Linux Kernel Configuration * * * Code maturity level options * Prompt for development and/or incomplete code/drivers (EXPERIMENTAL) [Y/n/?] Linux 系统工程师 —— Linux 高级应用 Version:1.0 6www.koorka.com 执行完之后,出现交互界面,在每个内核功能项的后面需要输入我们的选择。 通常有两种提示:[Y/n/?] 或[Y/n/m/?],如果选择 Y,表示将该功能编译到内核中, 如果选择 n,表示定制的内核中不加入此功能,如果选择 m,表示内核支持此功能, 但是不编译到内核中,而是以外挂模块的方式先存储在磁盘上,需要使用时才载入 内存中。 (2)文本菜单方式。 在内核源代码目录下执行 make menuconfig,将出现如图 1-2 所示的界面: 图 1-2 在该界面中,首先出现的是主菜单,如果需要进入某一个菜单,用光标键选中 后按回车键即可进入子菜单,例如选择“General setup”回车后将出现如图 1-3 所示 的子菜单。 图 1-3 Linux 系统工程师 —— Linux 高级应用 Version:1.0 7www.koorka.com 如果还是多级菜单,继续选择即可。 在正式的选项界面中,可以按空格键来改变每个选项的设置,选项有以下三种 形式,分别对应文本交互界面的 Y,n,m: [ ]: “n”,即不用此功能。 [* ]: “y”,即将该功能编译进内核。 : “m”,即将该功能编译成模块。 (3)图形配置 在图形界面下执行 make xconfig,将出现如图 1-4 所示的界面: 图 1-4 在该界面中方框为“空白”(对应 n)表示不支持该功能,“勾”(对应 Y)表示 将该功能加入内核,“· ”(对应 m)表示编译成外挂模块。 在上面的三种方法中,推荐使用文本菜单方式,即使远程配置,也不会占用泰 多带宽,而且交互性也比较强。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 8www.koorka.com 根据需要定制好自己的内核,在定制好内核之后,选择退出配置界面,当提问 是否保存修改时,选择是。保存后将在当前目录下生成一个 .config 文件。 3.2 编译内核实例 下面的步骤是将 RedHat Enterprise Linux AS 4 的内核升级到 2.6.18 的过程: (1)获取内核源代码,并将其存储到/usr/src/kernels 下。 http://www.kernel.org/pub/Linux/kernel/ 本案例中下载的是 linux-2.6.18.tar.bz2。 (2)解压源代码 cd /usr/src/kernels tar -jxvf linux-2.6.18.tar.bz2 cd linux-2.6.18 (3)配置内核选项 首先清除以前编译的目标代码: make mrproper 然后再配置 make menuconfig (4)编译内核及内核模块 make bzIamge make modules (5)安装内核模块 make modules_install (6)启用新内核 在编译完内核后,拷贝相应的文件到/boot 下: #cp /usr/src/kernels/linux-2.6.18/System.map /boot/System.map-2.6.18 #cp /usr/src/kernels/linux-2.6.18/arch/i386/bzImage /boot/bzImage Linux 系统工程师 —— Linux 高级应用 Version:1.0 9www.koorka.com 以上这两个文件是刚才编译时新生成的,修改/boot 下的链接 System.map 使其 指向新内核的文件: #cd /boot #rm -f System.map (删除旧的链接,不要删除原文件) #ln -s System.map-2.6.18 System.map (创建新链接) 现在编辑 /boot/grub/grub.conff,增加如下一段: title New Kernel(2.6.18) root (hd0,0) kernel /boot/bzImage ro root=/dev/sda1 rhgb quiet 当然,需要注意您自己的/boot 目录所在的分区和您的根文件系统所在的分区。 重新启动系统,选择新的内核进入系统,进入系统后使用 uname –r 命令查看内 核版本号。 4. 部分内核选项说明: 1.Code maturity level options --->代码成熟等级 Prompt for development and/or incomplete code/drivers ——如果要测试现在仍 处于实验阶段的功能,比如 khttpd、IPv6 等,就必须把该项选择为 Y 了,否则可以 把它选择为 N。 如果设置为 Y,以后将会出现一些还在测试中的选项供用户做选择,否则就键 入 N。 2.General setup --->普通的属性设置 [*] Support for paging of anonymous memory (swap) ——这个选项将使你的内核 支持虚拟内存,也就是让你的计算机好象拥有比实际内存更多 多的内存空间用来执 行很大的程序。默认是选择的。 [*] System V IPC ——如果将来想编译 dosemu(DOS 模拟器),则这个选项一 定要选,它是让各个程序(process)同步且能彼此交换数据的函数库和一些系统调 用;如果不选该选项,很多的程序将会无法执行。即支持 System V 系统中的进程间 的 IPC 通讯功能。 [*] POSIX Message Queues ——POSIX 消息队列。进程可以按照优先级有选择 的读取队列中的数据。另外,各消息节点中还存在一个信号变量,当这个消息被放 置到队列中的时候,会发送信号通知相关进程接收消息。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 10www.koorka.com [ ] BSD Process Accounting ——该功能将会让内核为用户层的进程(用户态的 进程)建立一个帐目(进程通过一个特殊的系统调用来通知内核),当程序退出时内核 会将进程的相关信息记录到帐目文件中,主要包括进程的创建时间、 创建者,内存 占用等信息。 [*] Auditing support ——审记支持,用于和内核的某些子模块同时工作,例如 SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用。 [*] Optimize for size (Look out for broken compilers!) ——这个选项使 gcc 使用 -Os 的参数而不是-O2 的参数来优化编译,以获得更小尺寸的内核,建议选上。 3.Loadable module support --->对模块的支持 [*] Enable loadable module support ——很多人喜欢将全部功能、硬件支持一股 脑的编进内核,而不是使用模块的方式。这样做非常不好(个人觉得)。其实我也做 过嵌入式的开发,在针对特定硬件的平台下尽可能将内核编小,将始终是支持模块 加载的。例如我们开发的防火墙就是做为内核的模块被加载的。使用模块支持,你 的系统能具有更好的可扩充性。还有一个原因就是自己编写的功能模块、设备驱动 模块(假设编写的质量不高)以模块方式工作引起 KernelPanic 的机率要远远低于不 支持模块全部编进内核的方式。 [*] Module unloading ——不选这个功能,加载的模块就不能动态卸载。没 什么需要多解释的,建议最好选上。 [*] Module versioning support ——这个功能可以让你使用其它版本的内核 模块。例如自己开发的内核模块。 [ ] Source checksum for all modules (NEW) ——这个功能是为了防止更改了 内核模块的代码但忘记更改版本号而造成版本冲突。我估计现在没有哪家公司在开 发中还没使用版本控制工具,所以不需要这项了。如果你不是自己写内核模块,那 不需要这一选项。 [*] Automatic kernel module loading ——这个选项能让内核自动的加载部份 模块,建议你最好选上。举个例子说明一下,如模块 eth1394 依赖于模块 ieee1394。 如果选择了这个选项,可以直接加载模块 eth1394;如果没有选择这个选项,必需先 加载模块 ieee1394,再加载模块 eth1394,否则将出错。 4.Block layer --->块层次的设定 [*] Support for Large Block Devices ——如果有大于 2TB 的块设备,必须启用。 5.Processor type and features --->处理器类型和特色 Linux 系统工程师 —— Linux 高级应用 Version:1.0 11www.koorka.com [*] Symmetric multi-processing support ——对称多处理器支持,在单 CPU 的机 器上,不选这个选项会更快一些。由于超线程技术,看起来是两颗 CPU,因些要选 上这个选项。 Subarchitecture Type (Generic architecture (Summit, bigsmp, ES7000, default)) — —CPU 的体系结构 Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) ——CPU 的 具体型号。 [*] Generic x86 support ——这一选项针对 x86 系列的 CPU 使用更多的常规优 化。 [*] HPET Timer Support ——HPET 是替代 8254 芯片的下一代时钟处理器。这 里你可以安全的选上这一选项。如果硬件不支持的话,将仍使用 8254 时钟处理器。 (32) Maximum number of CPUs (2-255) ——支持的最大 CPU 数。 [*] SMT (Hyperthreading) scheduler support ——超线程支持,如果你的 CPU 是 P4 超线程的,应该选上这一选项。 [*] Multi-core scheduler support (NEW) ——当然是多核 CPU 的支持了。 [*] Machine Check Exception ——该功能允许处理器在检测到硬件错误时通知 Linux 内核检测到错误!这些错误包括:系统总线错误、内存错误(其中可能包含 同位检查或 Error Correction Code (ECC) 问题)、处理器或硬件中的快取错误、处理 器中的 Translation Lookaside Buffers (TLB) 错误、其它 CPU 供货商侦测到的特定 硬件问题、特定供货商侦测到的硬件问题等。 Toshiba Laptop support ——该功能允许访问 Toshiba 的系统管理模式,即 直接设置 BIOS 来支持某些功能。该功能只在 Toshiba 的 BIOS 的机器中管用。如果 你的 BIOS 不是 Toshiba,那么该功能无效。 Dell laptop support ——对 Dell 笔记本 BIOS 功能的支持,作用同 Toshiba Laptop support 选项。 /dev/cpu/microcode - Intel IA32 CPU microcode support ——这个选项是让 你使用不随 Linux 内核发行的 IA32 microcode,但是你必需有 IA32 microcode 的二 进制文件。该功能同时还需要 dev file system support(devfs 文件系统)的支持。关于 微代码的要求和组成等相关信息,请参考:http://www.urbanmyth.org/microcode/ /dev/cpu/*/msr - Model-specific register support ——这个选项桌面用户一 般用不到。这个选项能让特权 CPU 访问 x86 的 MSR 寄存器,这个寄存器(MSR) 的作用也依赖与不同的 CPU 类型而有所不同,一般可以用来改变一些 CPU 原有物 理结构的用途,但不同的 CPU 用途差别也很大。 /dev/cpu/*/cpuid - CPU information support ——这会在/dev/cpu 中建立一 系列的设备文件,用来让进程去访问指定的 CPU。一般不用选。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 12www.koorka.com High Memory Support (64GB) ——内核支持的最大内存数,缺省为 off。如果 你使用的机器物理内存小于 960M,可以不用修改该选项;如果您使用的机器物理内 存在 1GB-4GB 之间,选择 4GB;如果你使用的服务器内存在 4GB 以上,选择 64GB。 [*] Allocate 3rd-level pagetables from highmem ——如果超过 4GB 内存,建议选 择此功能。 [ ] Math emulation ——模拟浮点处理器,现在用不上了。 [*] MTRR (Memory Type Range Register) support ——选择该选项,系统将生成 /proc/mtrr 文件对 MTRR 进行管理,供 Xserver 使用。在 Intel p6 家族的处理器中(Ppro、 PII 和更新的)有一个内存类型范围寄存器(MTTR),可用来控制处理器访问的内存 范围。打开它一般可以提升显卡的显示性能。服务器就没有这个必要了。 6.Power management options (ACPI, APM) --->电源管理 服务器 7*24 小时开机不间断服务,所以大多数功能都不需要。 当然,如果要使用变频技术,还是需要使用其中的一些配置。 7.Bus options (PCI, PCMCIA, EISA, MCA, ISA) --->总线配置 [*] PCI support ——PCI 支持。如果使用了 PCI 的卡,当然必选。 PCI access mode (Any) ——设置 Linux 探测 PCI 设备的方式。强列建议选 Any, 系统将优先使用 MMConfig,然后使用 BIOS,最后使用 Direct 检测 PCI 设备。 [ ] PCI Express support (NEW) ——PCI Express 接口的支持。 [ ] Message Signaled Interrupts (MSI and MSI-X) ——如果选择这项,允许设 备通过 PCI 总线写入内存堆栈产生一个中断。 PCCARD (PCMCIA/CardBus) support ---> 一般只有笔记本电脑上才会有 PCMCIA 插槽。 PCI Hotplug Support ---> 热插拔设备支持。(如热插拔 SCSI 硬盘)。七子选项 就是选择热插拔设备的控制芯片的驱动。 8.Executable file formats --->可执行二进制文件的格式 [*] Kernel support for ELF binaries ——ELF 是开放平台下最常用的二进制文 件,它支持不同的硬件平台。 < > Kernel support for a.out and ECOFF binaries ——a.out 的执行文件是比较古 老的可执行代码,用在比较早期的 UNIX 系统上。Linux 最初也是使用这种代码来执 Linux 系统工程师 —— Linux 高级应用 Version:1.0 13www.koorka.com 行程序,一直到 ELF 格式的可执行码出来后,有愈来愈多的程序码随着 ELF 格式的 优点而变成了 ELF 的可执码。 <*> Kernel support for MISC binaries ——支持 MISC 格式的二进制文件。一般 选 y,用于支持 java 等代码的自动执行。 8.Networking --->网络配置 [*] Networking support ——没有它,当然就无法使用网络了。 [ ] Amateur Radio support --->业余无线广播。可以用来启动无线网络的基 本支持,目前的无线网络可以通过公用频率传输数据,如果有此类设备就可以启用。 < > IrDA (infrared) subsystem support --->红外支持 Bluetooth subsystem support ---> 蓝牙支持。 Generic IEEE 802.11 Networking Stack ——无线网络的支持。 Networking ---> Networking options --->网络选项,具体的常用选项如下: <*> Packet socket ——选择 Y,一些应用程序将使用 Packet 协议直接同网络设 备通信,而不通过内核中的其它中介协议。例如 tcpdump 程序。 < > Netlink device emulation ——该选项目前是一个兼容性设备,在将来的内核 中将被 real netlink socket 取代。当某个程序需要访问字符节点如:/dev/tap0 或 /dev/route 时需要此功能。 [*] Network packet filtering (replaces ipchains) ——包过滤防火墙功能的支持。 如果要使用 Linux 防火墙功能,必须开启该选项。只有该选项被选中,后面的 IP: Netfilter Configuration --->和 IP: Virtual Server Configuration ---> 才会出现。 [ ] Socket Filtering ——Unix 套接字的过滤功能。用户态的程序可以通过过滤来 告诉内核哪些数据可以通过 Socket,哪些数据不可以通过 Socket。 <*> Unix domain sockets ——Unix 套接字的支持。很多程序都会用到 Unix 套 接字,例如:PostgreSQL、MySQL、Postfix ……等。 <*> IPsec user configuration interface ——提供支持本地工具配置 IPSEC 的接 口。 PF_KEY sockets ——PF_KEYV2 套接字协议簇,它是和 KAME 相兼容的。 如果你的 IPSEC 配置工具是由 KAME 移植过来的,那就需要。 [*] TCP/IP networking ——选择 Y,内核将支持 TCP/IP 协议。这个选项无论如 何都要选择 Y,即使没有网络卡,或是没有连到网络上的设备,在 Linux 上仍有所 谓的 lookback 设备而且有些程序需要选择该选项。如果用户没有打开这个设置,则 X-window system 可能会有问题(因为它也需要 TCP/IP)。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 14www.koorka.com [ ] IP: multicasting ——多播支持。multicasting 是群组广播,它是用在视频会议 上的协议,如果想发送一个网络封包(网络的数据),同样的一份数据将送往十部计 算机上。用户可以连续送十次分别给十台计算机(点对点的传送),也可以同时送一 次,然后让十台计算机同时接收到。当然后者比前者好,由于视频会议要求最好每 个人都能同时收到同一份信息,所以如果用户有类似的需要,这个选项就要选择, 同时用户还必须去找相关的软件。 [*] IP: advanced router ——用 Linux 来做路由器,此选项应该上,否则不要选。 [*] IP: policy routing ——策略路由。 [*] IP: equal cost multipath ——多路径路由,例如使用多个 ADSL 同时拨 号上网,如果使用此特性,则由系统自动选择客户端要走的 ISP 路径。当然也是路 由的负载均衡。 [*] IP: verbose route monitoring ——路由监视,这可以用来识别出 IP 欺骗 packets (推荐使用) 。 [ ] IP: kernel level autoconfiguration ——内核级自动配置。当内核启动时自动通 过内核命令或 BOOTP 或 RARP 协议设置网络设备的 IP 地址和路由表。一般用在 网络启动或无盘工作站系统中。 < > IP: tunneling ——IP 隧道。是将一个 IP 报文封装在另一个 IP 报文的技术, 这可以使得目标为一个 IP 地址的数据报文能被封装和转发到另一个 IP 地址。IP 隧 道技术亦称为 IP 封装技术(IP encapsulation)。IP 隧道主要用于移动主机和虚拟私 有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个 IP 地址,另一端也有唯一的 IP 地址。 < > IP: GRE tunnels over IP ——基于 IP 的 GRE(Generic Routing Encapsulation) 隧道。GRE 隧道可以基于 IPv4 的基础网络来封装 IPv4 或 IPv6 的网络协议,并且 GRE 隧道可以使用多播功能(Linux 的 IP 隧道不可以)。主要在 Linux 与 Cisco 等路 由设备使用隧道进行通讯时使用。 [ ] IP: multicast routing ——多播路由的支持。当 Linux 用作路由器,并且需要 路由多播数据包时需要此功能。 [ ] IP: TCP Explicit Congestion Notification support ——ECN(显式拥塞指示)的 支持。由于目前很多老的路由器和防火墙不支持 ENC,因此如果你启用了此功能, 大概不能与互联网上 8%的主机进行通讯。好处嘛,从名称打概略知一二了吧! [*] IP: TCP syncookie support (disabled per default) ——启用该功能可以在一定 程度上防止 SYS Flood 攻击。关于 syscookie 的更多信息,请访问: http://cr.yp.to/syncookies.html IP: Virtual Server Configuration --->子选项是 LVS 的配置(Linux 负载均衡)。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 15www.koorka.com [*] Network packet filtering (replaces ipchains) --->Linux 防火墙功能的支持。 < > 802.1Q VLAN Support ——用 Linux 加上一台二层交换机来实现三层交换, 非常节省成本。更多信息请访问:http://www.candelatech.com/~greear/vlan.html The IPX Protocol ——如果用户希望 Novell 的计算机资源共享(例如用他们的 打印机或是硬盘),那么该选项则要选择 Y。至于存取文件的 NCPFS 的格式,也应 该选择以便支援这个文件系统。如此一来,用户就可以通过 Novell 的 IPX 通信协议 去存取它们的数据了,或者用户希望从 dosemu(DOS 的模拟器)里使用 IPX 协议, 这时也要把它选中。 Appletalk protocol support ——AppleTalk 是存在于苹果机上的一种通信协议, 用来与苹果电脑之间的网络通信,通过 AppleTalk,彼此的电脑间可以打印和共享文 件。如果用户需要连上这样的网络,可以把这个选项打开,就能与苹果电脑做沟通 了,或者把该选项编成一个模块亦可。 802.1d Ethernet Bridging ——模拟交换机。选择该选项可以让 Linux 作为一个 网络上的交换机。 Qos and/or fair queueing——服务质量公平调度,建议不选择。 Network testing ---> 网络测试。 9.Device Drivers --->设备驱动 Generic Driver Options --->普通驱动,如果有 firmware 接口设备,需要下面的 选项: [*] Prevent firmware from being built <*> Userspace firmware loading support Memory Technology Devices (MTD) ---> 采用内存技术的设备支持。 Parallel port support ---> 并口设备支持 Plug and Play support --->即插即用支持 Block devices --->块设备支持 该选项需要针对具体的设备情况来选择了: Linux 系统工程师 —— Linux 高级应用 Version:1.0 16www.koorka.com Normal PC floppy disk support ——普通 PC 软盘支持。 Xt hard disk support ——支持 XT 的古董级硬盘,这是 IBM 电脑时代的东西, 如果用户还有这种硬盘。那么,就可以把它编进内核或是编成一个模块。大部分的 情况都是选择 N 的。 Parallel port IDE device support ——并口 IDE 硬盘的支持。(也是老掉牙的设备 了。) < > Compaq SMART2 support ——Compaq 的 smart2 阵列控制器的支持。 < > Compaq Smart Array 5xxx support ——Compaq 的 Smart 5xxx 系列阵列控制 器的支持。 < > Mylex DAC960/DAC1100 PCI RAID Controller support —— Mylex DAC960, AcceleRAID, and x x eXtremeRAID PCI RAID 卡(控制芯片)的支持。 < > Promise SATA SX8 support ——Promise SATA SX8 系列 SATA 硬盘控制器的 支持。 < > Loopback device support ——如果要在 Linux 上挂接 ISO 镜像文件,该功能 是必须的。 < > Network block device support ——网络块设备的支持。(通过该选项可以将 一个网络文件系统当成本地的块设备来访问,即将网络文件系统 Mount 到本机,例 如:NFS、SMB 等)。 RAM disk support ——如果使用过 DOS 下的 ramdrive 程序,应该能了解这个选 项的意义。它可以把内存当成硬盘,可以格式化,或是放一些文件在其中。但是, 当用户关机时,这些数据也随着消失了。当制作一个嵌入式 Linux 时常用到此功能。 [ ] Per partition statistics in /proc/partitions ——如果启用该功能,将记录每个分 区的统计信息,例如读、写等访问信息。一般不需要。 ATA/ATAPI/MFM/RLL support --->IDE 设备的支持 <*> ATA/IDE/MFM/RLL support ——如果有 IDE(或 EIDE)设备,这是必选的。 如果使用的是 SCIS 设备,那就可以不用了。 Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support ——选择 Y,内核将提 供对增强 IDE 硬盘、CDROM 和磁带机的支持。如果用户的 IDE 接口是 Enhanced 的(增强 IDE 接口),请用户选 Y,即会出现 IDE 选项的界面,这些选项能加快用 户 IDE 接口的速度或对某些芯片做一些最佳化处理。但如果用户的硬盘或光盘全都 是 SCSI 接口的,那么需要选择 N 以跳过下面的选项。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 17www.koorka.com use old disk-only driver on primary interface ——通常是选择 N。因为有其它新 的驱动可用。这个选项的意思是说,如果用户的 IDE 接口是很旧的,就可以使用这 个驱动去驱动旧型的 IDE 接口(可装二块硬盘;或是一块硬盘,一个光驱)。 [ ] Support for SATA (deprecated; conflicts with libata SATA driver) ——有一小 部份 SATA 接口控制芯片只能使用 IDE 驱动程序才能使其正常工作。对于使用 SATA 驱动(在 SCSI 支持部分可以选择)不能正常工作的 SATA 设备(很少见的)可以使用 该功能, Include IDE/ATA-2 DISK support ——它包含了增强的 IDE 接口,所以是必需选 择的。 < > PCMCIA IDE support ——如果使用了 PCMCIA 卡来连接 IDE 硬盘,那就需 要了。 Include IDE/ATAPI CDROM support ——如果希望内核支持 IDE/ATAPI 接口 的光驱,那就需要选择 Y。如果是附有一张接口卡的光驱,必需把排线接到那张专 用接口卡或者是声卡上,则这个选项必须要选 N。现在的光驱通常是 IDE/ATAPI 接口的,所以这个选项通常是 Y。 < > Include IDE/ATAPI TAPE support < > Include IDE/ATAPI FLOPPY support < > SCSI emulation support ——将一个 IDE 设备模拟为 SCSI 设备来使用。但 在内核启动参数中必须加入类似:hdx=scsi 的参数。 CMD640 chipset bugfix/support ——很多 486 和 586 的主机板都是用 CMD640 的芯片,它是 Neptune 芯片和 SIS 芯片的结合。这种芯片有它的缺点,在许多的情 形下,它会造成数据的丢失和错误。如果用户选了这一项,则 Linux 内核会为用户 小心的寻找这些错误并修正它,而且,它会打开对两个 IDE 接口的支持。不过,在 它的说明文件中提到,如果用户的主机板没有 PCI 界面,只有 VESA 总线界面,还 希望有这项功能的话,则用户必须传送一些参数给内核(ideo=cmd640_vlb);如 果不确定,则选择 Y。如果你确定你的 IDE 控制芯片不是 CMD640,将该选项设置 为 N(不选)。 [*] PCI IDE chipset support ——PCI 总线的 IDE 接口的支持。呵呵,对目前流 行的主板来说必选的了。后面的选项就是根据你的主板 IDE 芯片组来选择一个驱动。 RZ1000 chipset bugfix/support ——这个选项如同前面的 CMD640 一样。 SCSI device support --->SCSI 设备支持 如果有 SCSI 设备,就选择 Y(现在一般 PC 机都没有 SCSI 设备)。接着会有提 示要求更进一步的信息,询问是否要支援光驱、硬盘,还有你使用的是那一种 SCSI 界面卡(这部份请参阅 SCSI-HOWTO,有更详细的说明)。如果你的启动分区是 SCSI Linux 系统工程师 —— Linux 高级应用 Version:1.0 18www.koorka.com 设备,一定要把它编译到内核内。 <*> SCSI disk support ——SCSI 硬盘的支持。 < > SCSI generic support ——其他 SCSI 设备的支持,例如:扫描仪等。 SCSI low-level drivers --->SCSI 卡的驱动程序。根据 SCSI 卡的芯片选择一个驱 动。 Old CD-ROM drivers (not SCSI, not IDE) --->如果用户的光驱是 SCSI 或 IDE 接口的,则不选择该选项;如果用户使用的光驱既不是 SCSI 接口,也不是 IDE 接 口,则必须选择该选项。 Multi-device support (RAID and LVM) --->支持软件磁盘阵列(Software RAID) 和卷。 [ ] Multiple devices driver support (RAID and LVM) ——如果需要支持软件 RAID(不推荐使用)或逻辑卷管理(推荐使用),必须选择该选项。 Logical volume manager(LVM)support ——逻辑卷管理支持。 Network device support ---> 网络设备支持驱动 该选项设置对网络设备的支持,主要有 ARCnet 设备、Ethernet(10 or 100Mbit)、 Ethernet( 1000Mbit)、 Wireless LAN( non-hamradio)、 Token Ring device、 Wan interfaces、PCMCIA network device support 几大类。一般说来都能找到自己用的网 卡的驱动。如果没有,就要找设备供应商要求提供该设备的驱动了。 ARCnet support --->这也是一种网络卡,一般用的不多,所以选择 N。如果用户 有这样的网络卡,请查阅 Documentation/networking/arcnet.txt 的说明。 Dummy net driver support ——如果有 SLIP 或 PPP 的传输协议,那么就要把该 选项打开。因为它不会使 Linux 内核增大,而且对某些应用程序来说,它可以让我 们模拟出来的 TCP/IP 环境更像 TCP/IP 环境。如果用户没有 SLIP 或 PPP 协议, 就不用设置该选项。 < > Bonding driver support ——以太网卡的邦定。启用该功能可以将两块网卡 邦定在一起来当两块网卡使用,例如两块 100M 的网卡邦定之后相当于一块 200M 的网卡。当然,在你的交换机上也要做端口邦定设置(将两个端口邦定为一个端口 使用。)。 EQL(serial line load balancing)support ——如果有两个 MODEM,两条电话 线,而且用 SLIP 或 PPP 协议,可以用这个 Driver 以便让用户的 MODEM 有两倍的 Linux 系统工程师 —— Linux 高级应用 Version:1.0 19www.koorka.com 速度,当然,在网络的另一端也要有同样的设备。 < > Universal TUN/TAP device driver support ——该功能可以使内核可以直接 从用应用程序接收数据包或直接将数据发送给应用程序,而不必先通过物理网卡(当 然是在本地通讯中。)。 Ethernet (10 or 100Mbit) --->百兆网卡驱动。 Ethernet (1000 Mbit) --->千兆网卡驱动。 PPP(point-to-point)support ——点对点协议。 SLIP(serial line)support ——这是 MODEM 族常用的一种通信协议,必须通 过一台 Server(叫 ISP)获取一个 IP 地址,然后利用这个 IP 地址来模拟以太网络, 使用有关 TCP/IP 的程序。 [ ] Fibre Channel driver support ——光纤通道。主要用在存储系统中。 Wireless LAN (non-hamradio) ——无线网卡的支持。 Input device support --->核心输入设备的支持。例如游戏控制杆等。 Character devices --->字符设备 所谓字符设备,通常是指以字符为单位做处理的设备,例如终端机。对于这些 选项的选择也是以预设为主。 Virtual terminal ——选择 Y,内核将支持虚拟终端。 Support for console on virtual terminal ——选择 Y,内核可将一个虚拟终端用作 系统控制台。 Standard/generic (8250/16550 and compatible UARTs) serial support ——选择 Y, 内核将支持串行口。如果用户是用 serial 的鼠标(大部分的用户都是用这种鼠标) 或是 MODEM 的话,则该选项一定要选上。 Support for console on serial port——选择 Y,内核可将一个串行口用作系统控 制台。  I2C support ——I2C 是 Philips 极力推荐的在微控制应用中使用的低速串行总线 协议。如果要选择 Video For Linux,则该选项必需选上。 Mice ——鼠标。 目前可以支持总线、串口、PS/2、C&T82C710 mouseport、PC110 digitizerpad 等多种接口的鼠档,根据需要选择。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 20www.koorka.com PS/2mouse(aka“auxiliarydevice”)support ——如果用户使用的是 PS/2 鼠标, 则该选项应该选择 Y。 Joysticks ——游戏手柄。 Watchdog Cards --->虽然称为 Cards,但是却可以用纯软件来实现,当然也有用 硬件来实现的。如果选中该选项,就会在/dev 目录下创建一个名为 watchdog 的文件, 它可以记录系统的运行情况,一直到系统重新启动的 1 分钟左右。有了这个文件, 你就可以恢复系统到重启前的状态了。 QIC-02 tape support ——非 SCSI 界面的磁带机,除非用户有,否则选择 N。 9.File systems ---> 文件系统 Linux 上支持约二十几种的文件系统。支持某个文件系统的意思是,可以存取 某个文件系统的数据或是做拷贝动作。在这些文件系统中,通常的选择方法是按照 原来预设的方式,不过,其中的 EXT2FS 或 Ext3 选项一定要选上,因为它是 Linux 系统所使用的文件系统,其他的则根据需求做选择。 通常是把 ext2 或 ext3 编译进内核,而让其余的使用模块。 Quota support ——支持磁盘配额。可以限制每个用户所能使用的硬盘空间的上 限,在多用户共同使用一台主机的情况中十分有效。 Kernel automounter support ——如果选择Y,内核将提供对automounter的支持, 使系统在启动时自动 mount 远程文件系统。 Ext3 journalling file system support ——ext3 文件系统的支持,它的性能比 ext2 好,如果使用 ext3 做根文件系统,一定要将该选项编译进内核。 DOS FAT fs ——DOS FAT 文件格式的支持,可以支持 FAT16、FAT32。这个选 项是 DOS 的文件系统,如果用户没有选 Y,则下面的 MSDOS,VFAT,UMSDOS 将不会出现。 MSDOS ——DOS 文件系统的格式。如果想要在 Linux 下访问硬盘中的 MS-DOS 分区,或是想将用 MS-DOS 格式化的磁盘挂进来的话,选择 Y。 UMSDOS:UNIX-like file system on top of standard MSDOS fs ——如果把 Linux 装进 DOS 的一个目录下,那么用户则要选择这一项。不建议这样做,因为这样就不 能看到长文件名了,而且效率也不是很高。 VFAT(Windows95)fs ——windows95 所支持的文件系统,是我们常说的 FAT32 文件系统,如果用户的计算机中装有 windows95/98,那么选择这个文件系统可以使 用户看到 windows95/98 的长文件名。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 21www.koorka.com ISO 9660 CDROM file system support ——光盘使用的就是 ISO9660 的文件格 式。 Minix fs support ——新的套件不再建立 Minix 文件系统,而且很多人不使用它, 但是把它配置在内核里仍然是个好主意。某些“恢复磁盘”程序会用到它,而且仍 然有许多磁盘可能用 Minix 文件系统,因为 Minix 文件系统对于处理磁盘方面是最 好的。当初 Linus 是因为对 Minix 这个小型的操作系统有很深的经验,所以才写出 Linux 这个操作系统。Minix 文件系统通常用在磁盘上。 NTFS file system support(read only)——NTFS 是 Windows NT 使用的文件格 式。 /proc ——它不是硬盘分区里的任何部分,不占用硬盘的空间,而是内核与程序 之间的文件系统界面,它表示的只是内存的使用状况和各个程序执行的情况,它也 记录了用户的硬件配置。许多程序工具(像“ps”)都会用到它。如果已经将它安装 好了,可以执行命令“cat /proc/meminfo”或者是“cat /proc/devices”。有些 shells 会用/proc/self/fd(在其它系统上为/dev/fd)来处理输出输入。有许多重要的 Linux 标准工具是靠它来运作的,否则执行有些命令会出问题。 Second extended fs ——这是现在新发行的套件所广泛采用的文件系统,这个是 Linux 文件系统,请务必选择 Y,除非用户能把 Linux 安装在 DOS 目录下。 UFS filesystem support ——这是 BSD,SunoS,FreeBSD,NetBSD 或 Nextstep 所使用的文件系统。如果用户在电脑上有这些操作系统的话,那么可以选中该选项, 否则选择 N。 Network File Systems ——网络文件系统 NFS file system support ——如果在网络环境下想要共享文件,选择 Y。如果希 望挂上其他电脑的文件系统,那么该选项一定要选上。它可以让用户利用网络把其 他计算机的硬盘当成自己的来使用(把它变成一个目录)。对于一般用户来说,该选 项是选择 Y。 SMB filesystem support ——这个文件系统让用户可以挂上 windows95/98 或 windowsNT 的文件系统,也就是用户可以访问到在 windows 下的电脑。 NCP file system support (to mount NetWare volumes)——NCP 是一种网络的 通信协议,使用 IPX 协议,它可以利用 IPX 协议让两台电脑之间的文件共享,并能 进行沟通。如果用户想挂上有关 Novell 的 Netware 文件系统,那么这个选项就要选 上。 Partition Types --->支持的分区类型。该选项支持一些不太常用的分区类型,用 户如果需要,在相应的选项上选择 Y 即可。 #Native Language Support--->本地语言支持。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 22www.koorka.com #System Vand Coherent——该选项是为 SystemV 以及 Coherent 的分割区而设置 的。如果希望支持 SystemV 或 Xenix 相关 UNIX 系统的 FS,并读取它们的数据,那 么才有必要选中该选项,否则一般来说该选项是选择 N 的。 Instrumentation Support --->内核统计相关。 Kernel hacking --->只有做内核调试采用的上。 以上只是介绍了部分选各项,在使用或学习过程中,如果有任何疑问,请及时 到 http://www.koorka.com 进行答疑。 5. 常用内核参数的优化 Linux 内核的很多参数是可以动态修改的,为了使系统运行的更稳定和更快速, 在此介绍一些常用的内核参数。如有疑问,请及时到 http://www.koorka.com/ 进行 答疑。 5.1 内存参数优化 内存的优化主要就是共享内存,要确定系统对共享内存的限制,可以使用下面 的命令: [root@koorka ~]# ipcs -lm ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 32768 max total shared memory (kbytes) = 8388608 min seg size (bytes) = 1 设置 SHMMAX SHMMAX 参数定义共享内存段的最大大小(以字节为单位)。 可以通过执行以下命令来确定 SHMMAX 的值: [root@koorka ~]# cat /proc/sys/kernel/shmmax Linux 系统工程师 —— Linux 高级应用 Version:1.0 23www.koorka.com 33554432 SHMMAX 的默认值为 32MB。通常,这个值对于大多数软件住够用了,但是 对于一些大型应用软件,尤其是数据库,通常都太小了。在数据库服务器中,如果 物理内存小于 2GB,通 常 将 SHMMAX 参数设置为 2GB;如果物理内存大于 2GB, 我通常将其设置为物理内存的大小。 可以通过下面的方法来设置: 通过直接更改 /proc 文件系统,你无需重新启动计算机便可以改变 SHMMAX 的缺省设置。可以使用以下方法动态设置 SHMMAX 的值。通过将此命令置于 /etc/rc.local 启动文件中可以使它永久有效: [root@koorka ~]# echo "2147483648" > /proc/sys/kernel/shmmax 还可以使用 sysctl 命令来更改 SHMMAX 的值: [root@koorka ~]# sysctl -w kernel.shmmax=2147483648 最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,可以使这种更改 永久有效: [root@koorka ~]# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf 设置 SHMMNI 这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的缺省值是 4096。该值足以满足需要,因此通常无需更改。(当然了,算一下 32M * 4096,呵 呵您的内存能有多大?) 可以通过执行以下命令来确定 SHMMNI 的值: [root@koorka ~]# cat /proc/sys/kernel/shmmni 4096 设置 SHMALL 该参数控制系统一次可以使用的共享内存总量(以页为单位)。简言 之,该 参 数 的值始终应至少为: ceil(SHMMAX/PAGE_SIZE) ,即不应该小于共享内存段的最大容量除以内存页 Linux 系统工程师 —— Linux 高级应用 Version:1.0 24www.koorka.com 面。例如如果最大共享内存段容量为 2GB,那么:2147483648/4096=524288,即 SHMALL 的值不应该小于 524288;如果 SHMMAX 为 32GB,那么么这个值最少应 该是:8388608 SHMALL 的默认大小为 2097152(4GB 内存内足够了),并可以使用以下命令 进行查询: [root@koorka ~]# cat /proc/sys/kernel/shmall 2097152 5.2 信号量优化 对信号的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中 的线程)之间提供同步的计数器。Unix System V 支持信号集,其中的每个信号都 是一个信号计数。当应用程序请求信号时,它使用“集合”来完成此工作。 要确定所有信号限制,可使用以下命令: [root@koorka ~]# ipcs -ls ------ Semaphore Limits -------- max number of arrays = 128 max semaphores per array = 250 max semaphores system wide = 32000 max ops per semop call = 32 semaphore max value = 32767 还可以使用以下命令: [root@koorka ~]# cat /proc/sys/kernel/sem 250 32000 32 128 上面的值依次对应的参数是: SEMMSL SEMMNS SEMOPM SEMMNI 设置 SEMMSL SEMMSL 内核参数用于控制每个信号集合的最大信号数。 对于大多数应用服务器(例如 weblogic 等)和数据库服务器 SEMMSL 设置为 不小于 100。 设置 SEMMNS Linux 系统工程师 —— Linux 高级应用 Version:1.0 25www.koorka.com SEMMNS 内核参数用于控制整个 Linux 系统中的信号(而非信号集)的最大 数量。 使用以下计算式确定可以在 Linux 系统上分配的信号的最大数量。它将是以下 两者中较小的一个值: SEMMNS — 或 — (SEMMSL * SEMMNI) 。 设置 SEMOPM SEMOPM 内核参数用于控制每个 semop 系统调用可以执行的信号操作数。 semop 系统调用(函数)能够使用一个 semop 系统调用完成多个信号的操作。 一个信号集可以拥有每个信号集中最大数量的 SEMMSL,因此建议将 SEMOPM 设置为等于 SEMMSL。 设置 SEMMNI SEMMNI 内核参数用于控制整个 Linux 系统中信号集的最大数量。建议将 SEMMNI 设置为不小于 100。 可以通过直接更改 /proc 文件系统,不必重新启动机器而更改所有信号设置的 缺省设置。该方法将以下内容置于 /etc/rc.local 启动文件中: [root@koorka ~]# echo "250 32000 250 128" > /proc/sys/kernel/sem 还可以使用 sysctl 命令来更改所有信号设置的值: [root@koorka ~]# sysctl -w kernel.sem="250 32000 250 128" 最后,可以通过将内核参数插入到 /etc/sysctl.conf 启动文件中以使此更改永久 有效: [root@koorka ~]# echo "kernel.sem=250 32000 250 128" >> /etc/sysctl.conf 5.3 文件句柄优化 配置 Linux 服务器时,必须确保最大文件句柄数足够大。文件句柄的设置表示 您在 Linux 系统上可以打开的文件数。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 26www.koorka.com 使用以下命令来确定整个系统中文件句柄的最大数量: [root@koorka ~]# cat /proc/sys/fs/file-max 32768 在大型应用服务器(例如访问量较大的 web 服务器)、数据库服务器中,建议 将整个系统的文件句柄值至少设置为 65536。 通过直接更改 /proc 文件系统,您可以不必重新启动机器而改变文件句柄最大 数量的默认设置。该方法将以下内容置于 /etc/rc.local 启动文件中: [root@koorka ~]# echo "65536" > /proc/sys/fs/file-max 可以使用 sysctl 命令来更改 file-max 的值: [root@koorka ~]# sysctl -w fs.file-max=65536 最后,可以通过将内核参数插入到 /etc/sysctl.conf 启动文件中以使此更改永久 有效: [root@koorka ~]# echo "fs.file-max=65536" >> /etc/sysctl.conf 可以通过使用以下命令查询文件句柄的当前使用情况: [root@koorka ~]# cat /proc/sys/fs/file-nr 613 95 32768 file-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以 及可以分配的最大文件句柄数。 (注意:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。 通常将其设置为 unlimited。使用 ulimit 命令来验证 ulimit 设置: [root@koorka kernel]# ulimit unlimited 5.4 络缓冲区和包的队列优化 执行 sysctl -a | grep mem,将有如下的输出: net.ipv4.tcp_rmem = 4096 87380 174760 net.ipv4.tcp_wmem = 4096 16384 131072 net.ipv4.tcp_mem = 98304 131072 196608 net.ipv4.igmp_max_memberships = 20 net.core.optmem_max = 10240 net.core.rmem_default = 110592 net.core.wmem_default = 110592 Linux 系统工程师 —— Linux 高级应用 Version:1.0 27www.koorka.com net.core.rmem_max = 131071 net.core.wmem_max = 131071 vm.overcommit_memory = 0 这些输出显示了当前系统的缓冲区的设置。 根据具体的系统情况,对它们的值进行修改,以便充分发挥您的系统的性能。 (1)tcp_rmem:共有三个值,设置了 TCP 连接接收缓冲区的大小(单位是字 节)。 第一个数字表明写入缓冲区的起始值,它在 TCP 套接字创建时分配。 理想情 况下,您希望将其设置为由服务器接收的平均页面大小。 这将确保除非页面大于平 均值,否则就无需为连接进行更多缓冲操作。 第二个值表明不受系统妨碍(甚至在 可用内存较低的情况下)时可以增加到的缓冲区大小。 超过这个值的话,如果系统 当前处在高负载状态下,操作系统可以决定不增加缓冲区大小。最大页面大小是这 个选项数字的一个不错选择。 最后一个数字表明可能的最大 TCP 套接字缓冲区大 小,它旨在防止为了传送大文件(如图像)而分配大量缓冲区从而导致的内存耗尽 的情形。 可以使用下面的命令修改: [root@koorka ~]# sysctl -w net.ipv4.tcp_rmem='4096 87380 8388608' (2)tcp_wmem:共有三个值,第 1 个值设置了 TCP 连接发送缓冲区的最小值 (单位是字节),第 2 个为缺省值,第 3 个为最大值。 可以使用下面的命令修改: [root@koorka ~]#sysctl -w net.ipv4.tcp_wmem='4096 65536 8388608' (3)tcp_mem:它定义了 TCP 堆栈的内存使用方式。 与 tcp_wmem 指令相 似,它也由 3 个值组成(单位是页),表明最小值、平均值和最大值。 但这些值的 含义略有不同。 它们用于设置对 TCP 套接字缓冲区使用的总限制,也就是说它们 必须说明系统上并发活动的套接字数。 而且,与 tcp_wmem 和 tcp_rmem 不同,这 里大小不是以字节计算,而是以内存页(通常每个内存页代表 4,096 字节)计算。 可以使用下面的命令修改(如果是 32GB 内存): [root@koorka ~]#sysctl -w net.ipv4.tcp_mem='8388608 8388608 8388608' (4)igmp_max_memberships:主机上所监听的最大 igmp (multicast) socket 数 量。不做路由器的话,无所谓了。 (5)optmem_max:每个套接字所允许的最大缓冲区的大小。 Linux 系统工程师 —— Linux 高级应用 Version:1.0 28www.koorka.com 可以使用下面的命令修改: [root@koorka ~]#sysctl -w net.core.optmem_max = 20480 (6)rmem_default:缺省的所有接收缓冲区,不用修改。 (7)wmem_default:缺省的所有发送缓冲区,不用修改。 (8)rmem_max:所有连接的缓冲区接收最大值。 [root@koorka ~]#sysctl -w net.core.rmem_max=1073741823 (9)wmem_max:所有连接的发送缓冲区最大值。 [root@koorka ~]#sysctl -w net.core.wmem_max=1073741823 5.5 TCP Syn 优化 (1)tcp_max_syn_backlog:Sys 对列的长度。如果太小,就会影响用户的连接。 [root@koorka ~]#sysctl -w net.ipv4.tcp_max_syn_backlog=2048 (2)tcp_syncookies:打开 SYN Cookie 功能可以阻止部分 SYN 攻击,降低重 试次数也有一定效果。 [root@koorka ~]#sysctl -w net.ipv4.tcp_syncookies=1 (3)降低重试次数,避免某些攻击者不停地发送 sys 数据包。 [root@koorka ~]#sysctl -w net.ipv4.tcp_synack_retries=3 [root@koorka ~]#sysctl -w net.ipv4.tcp_syn_retries=3
还剩27页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

lxy1985

贡献于2011-11-27

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf