• Linux内核配置指南


    1.  简介

    Gentoo提供了两种处理内核安装和升级的方法:自动方法(genkernel)和手动方法。尽管,对用户来说自动方法更加简便,但是下面这些理由仍然支撑很大一部分Gentoo用户手动得配置内核:很大的灵活性、比较小的内核、较短的编译时间、可以学到东西或者只因为实在太无聊了。

    本文并不打算介绍自动方法(genkernel)。如果你想要用genkernel编译和安装你的内核,请看Genkernel documentation

    本文也不打算从头到脚将手动配置的过程整个记录下来,因为,通常这个过程严重依赖于一些常识和你对自己系统有多少技术上的了解。相反,本文仅介绍手动配置的概念,同时,会揭示一些用户需要面对的常见的陷阱。

    本文是以最近较新的内核为蓝本,同时也兼顾了最常见的计算机体系结构。一些细节可能有别于较旧版本的内核或者比较少见的体系结构,尽管如此,大部分内容还是可以触类旁通的。

    现在,我们假设在你的硬盘上已经解压好了一份Linux内核源代码(通常在/usr/src/目录下),还有,你应当已经知道怎样进入menuconfig这个配置工具,而且还会在其中的各个目录系统中转悠。如果你还没有到这一步,我们还为此准备了其他文档。

    • Kernel Guide中列举出了各种版本的内核源代码包。
    • 内核更新指南则说明了如何升级你的内核以及如何从一个内核切换到另一个。
    • Gentoo手册也提到了内核安装的某些方面。

    2.  配置的概念

    基础

    大体的过程说起来非常简单:你可以看到一系列选项,这些选项是按照一个个的目录和子目录分类的,而且,你需要为你的系统选择硬件支持和内核的功能特性。

    内核自带一个默认配置,当你第一次在某个源代码上运行menuconfig的时候,你看到的就是它。默认配置通常是涵盖广泛并且有些道理的,这意味着大多数用户只需对其做很小的改动即可。如果你要禁用某个默认配置中启用了的选项,请再三确认你了解这个选项的作用以及禁用它以后有何后果。

    如果这是你第一次配置Linux内核,请稍微保守一点吧:不要太激进,也就是尽量少改动默认配置。同时,请记住,还是有相当一部分选项是你必须为你的系统量身定做才能让它启动起来的!

    内置vs模块化

    大多数配置选项有三种状态:他们可以完全不被编译、直接编译进入你的内核(Y),或者以一个模块的形式编译(M)。模块被保存在内核外部的文件系统上,而内置项目却直接会被编译进入内核镜像。

    内建和模块化还有一个重要区别:除了个别例外之外,当你需要某些内核模块时,内核并不会主动尝试装载它们(这将由用户决定)。尽管系统的其他部分可能会有按需加载的工具,而且,还有一些自动的模块装载工具可供选择,我们还是推荐你将硬件支持和内核特性直接编译进入内核。这样,内核才可以保证在需要那些功能和硬件支持的时候可以找得到。

    毫无疑问,对于某些配置,内建是唯一选择。例如,如果你的根分区采用ext2文件系统,而你又将ext2编译为一个模块,那么系统就启动不起来了(系统得在根分区上找出ext2模块来,但是它查看这个分区却需要加载ext2模块!)。

    硬件支持

    除了检查一下你的系统的体系结构类型以外,配置工具不会识别你的系统上究竟有哪些硬件。虽然对于某些硬件支持的确有默认配置,但是你几乎肯定需要找出并且选择好与你的系统硬件配置相关的配置选项。

    这只需要你对计算机内部已经连接的部件有相当的了解,或者你有可以识别这些部件的知识。对于大多数内部部件,你需要识别它们使用的芯片组,而不是它们的零售名称。

    这儿有一些可以帮助你的工具。lspci(包含在sys-apps/pciutils软件包之中)可以识别PCI和AGP总线上的硬件,其中还包含那些在主板上自带的内建设备。lsusb(来自sys-apps/usbutils软件包)可以识别连接到USB端口上的设备。

    各种各样花样翻新的硬件标准可能让事情变得有些眼花缭乱。除非你的设备与默认配置大相径庭,你的IDE硬盘和PS/2或者USB键盘鼠标,都统统不用特别注意就可以正常工作。而且,你还能得到最基本的VGA显示设备支持。然而,其他一些设备,例如网卡却很少依照标准制造,所以,你必须识别你使用的网卡芯片组并且为特定网卡选择好硬件支持才能接入网络。

    此外,尽管很多事情可以在默认配置下就可以“干活”,你可能还是需要选择更加精确的选项来挖掘系统的潜力。例如,如果你没有启用对某款IDE设备的适当的支持,你的IDE硬盘就只能以非常慢的速度工作。

    内核特性

    与硬件支持同样的,你也需要考虑一下内核的软件特性。其中,比较重要特性中的一个例子就是对文件系统的支持:你必须为在硬盘上使用的文件系统,还有那些你在外部存储设备上使用的文件系统,选择其支持特性。

    另外一个常见的例子就是高级网络功能。如果你想要实现某些路由或者防火墙功能,你必须确保与此相关的配置项目进入你的内核配置当中。

    准备好了?

    现在我们已经介绍了一些基本概念,你应该已经可以开始识别你的硬件、浏览配置目录、为你的系统选择需要的内核选项了吧。

    本页余下的部分将专注于理清一些常见的令人迷惑的地方,并为用户提供一些建议以免遇到一些常见问题。祝你好运!

    3.  常见问题和陷阱

    SATA硬盘和SCSI

    大多数现代桌面系统都有存储设备(硬盘和CD/DVD驱动器),这些设备通常连接在Serial ATA总线上,而不是老旧的IDE(带状电缆)总线上。

    在Linux中对SATA的支持是用一个叫作libata的层实现的,这个层则位于SCSI子系统之下。正因为如此,在SCSI驱动配置中可以找到SATA驱动。此外,你的存储设备也会被当作SCSI设备对待,这意味着你同样需要SCSI硬盘/光驱的支持特性。你的SATA硬盘会被叫做(例)/dev/sda而你的SATA上的CD/DVD驱动器则会以(例)/dev/sr0命名。

    虽然,大多数此类驱动程序是为了SATA控制器而写的,但是,libata却不仅仅只是为了SATA标准而设计的。在不远的将来,所有常见的IDE驱动都将会被移植到libata上来;而现在的情况下,以上这个说法对IDE用户也是适用的。

    代码 3.1: libata的配置选项

    Device Drivers  --->
     SCSI device support  --->
      <*> SCSI device support
      <*>   SCSI disk support
      <*>   SCSI CDROM support
    
      SCSI low-level drivers  --->
       <*> Serial ATA (SATA) support
        在上面这些选项以下列出的选项中选出你自己的芯片组。
    

    IDE芯片组和DMA

    尽管引入了SATA,IDE设备仍然非常普遍并且还有很多人需要它。IDE是应用相当广泛的技术,正因如此,Linux不需要选择任何与特定控制器相关的选项就可以支持几乎所有的IDE控制器。

    但是,IDE同时也是一种老旧的技术,它最初采用的是Programmed Input/Output,根本不能提供高速的现代存储设备所需要传输速率,它只会带来很低的传输速率,还会导致在从硬盘读写数据的时候发生的明显偏高的CPU使用率。

    除非你在使用一个早于1995年的系统,你的IDE控制器还会支持另一种传输模式,即Direct Memory Access(DMA)。DMA可是快了很多很多,而且,在数据传输发生时,CPU使用率则很少受到影响。如果你正在承受真正糟糕的系统性能问题,而且你恰好使用IDE硬盘,可能就是由于你没有使用DMA所致。

    注意: 正如我们之前提到的,libata也适用于IDE驱动。如果你使用libata,那么,你所有的驱动,包括你的IDE驱动,都将会使用DMA。这就不需要再做更多的检查和配置了。

    如果你没有对你的IDE硬盘使用libata,那么你需要检查一下DMA的使用,并且启用它。

    代码 3.2: 检查IDE硬盘上是否启用了DMA

    # hdparm -d /dev/hda
    
    /dev/hda:
     using_dma    =  0 (off)
    

    为了在你的IDE设备上启用DMA,你只需为你的IDE控制器将该配置选项设为有效。

    代码 3.3: IDE控制器的配置选项

    Device Drivers  --->
     ATA/ATAPI/MFM/RLL support  --->
      <*> ATA/ATAPI/MFM/RLL support
      <*>   Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
      [*]     PCI IDE chipset support
      在上面的选项以下列出的选项中选出你的芯片组。
    

    USB主控制器

    USB是一种被广泛用于将外部周边设备连接到计算机上的总线。USB之所以能够取得成功的一个原因就是它是一个标准化的协议,但是,在计算机上实现的USB的主控制器设备(host controller devices)(HCD)却各自有一些小小的差异。它有三种类型:

    • UHCI是Universal Host Controller Interface的缩写。它支持USB标准1.1版,通常你可以在基于VIA或者Intel芯片组的主板上找到它。
    • OHCI是Open Host Controller Interface的缩写。它同样也支持USB标准1.1版,但是常常出现在基于Nvidia或者SiS芯片组的主板上。
    • EHCI是Extended Host Controller Interface的缩写。它是唯一比较常见的支持USB标准2.0版的主控制器。而通常它可以在任何支持USB 2.0的计算机上找得到。

    大多数系统会有上面提到的其中两种接口类型:EHCI(USB 2.0)加上UHCI或者OHCI(USB 1.1)其中的一个。尽管所有的USB 2.0设备都对USB 1.1向后兼容,但大多数USB设备(甚至是现在制造的设备)都还是基于USB 1.1接口的——难道一个USB鼠标会需要1.5mbit/sec那么高的传输速度么?

    如果你没有选择与系统上的USB HCD对应的相关选项,你可能会遇到USB端口“假死”的现象:你插入了一个新的设备,但是设备却不能得到供电或者根本没有任何反应。

    一个简单的lspci(来自sys-apps/pciutils软件包)就可以很简单的侦测到你的系统上有哪种HCD设备。忽略命令结果中的同样符合检索条件的FireWire控制器,可以很容易看出我的系统上需要OHCI和EHCI支持。

    代码 3.4: 使用lspci侦测HCD类型

    # lspci -v | grep HCI
    00:02.0 USB Controller: nVidia Corporation CK804 USB Controller (rev a2) (prog-if 10 [OHCI])
    00:02.1 USB Controller: nVidia Corporation CK804 USB Controller (rev a3) (prog-if 20 [EHCI])
    01:0b.0 FireWire (IEEE 1394): Agere Systems FW323 (rev 61) (prog-if 10 [OHCI])
    

    代码 3.5: 配置USB的HCD

    Device Drivers  --->
     USB support  --->
      <*> Support for Host-side USB
      ---   USB Host Controller Drivers
      <*>   EHCI HCD (USB 2.0) support
      <*>   OHCI HCD support
      <*>   UHCI HCD (most Intel and VIA) support
      请选择你系统上的HCD,或者,如果你不确定的话,请选上所有这三个类型。
    

    多处理器、超线程和双核系统

    很多计算机都是基于多处理器的,但形式却各有不同,有些不是那么显而易见。

    • 很多Intel的CPU支持他们所谓的超线程技术,这项技术事实上仅使CPU看上去像是两个逻辑上的处理器。
    • 而一些最新的Intel/AMD CPU却实实在在得由在一个封装中的多个物理处理器组成,这被称作双核处理器。
    • 一些高端计算机系统实际有着多个安装在特制主板上的物理处理器用以提供明显高于单处理器的性能。如果你拥有这样的系统,你应该不会不知道,因为,它们可不便宜。

    在以上所有情况下,你都需要选择适当的内核选项才能从这些系统上攫取更好的性能。

    代码 3.6: 配置多道处理

    Processor type and features  --->
     [*] Symmetric multi-processing support
     如果你使用多处理器系统(无论哪种类型),请选择上面的选项。
     [*]   SMT (Hyperthreading) scheduler support
     如果你使用Intel的超线程CPU,请选择性上面的选项。
     [*]   Multi-core scheduler support (NEW)
     如果你的CPU是双核的,选择上面的选项。
    Power management and ACPI options  --->
     [*] ACPI (Advanced Configuration and Power Interface) Support
     上面这个选项不仅可以启用电源管理功能,而且要激活系统上所有CPU的话必须选中它。
    

    x86上的高端内存支持

    由于x86结构上的32位地址空间的限制,采用默认配置的内核只能够支持大约896M大小的RAM。除非启用高端内存支持,即使系统上有比这个更大的主存,那么也只有前896M是可以见的。

    注意: 这个限制仅限于x86(IA32)这个体系结构上。其他体系结构不需要修改什么配置,天生就支持大内存。

    在默认配置中没有启用高端内存的原因在于,它会引入一些系统开销。不要太在意这一点,因为与获得更多内存而带来的系统性能的提升相比,这些开销就微不足道了。

    代码 3.7: 在x86上启用高位内存

    Processor type and features  --->
     High Memory Support  --->
      (X) 4GB
      ( ) 64GB
      除非你的系统有大于4GB的内存,否则这里请选择4GB这个选项。
    

    4.  其他内核配置文档

    到目前为止,我们仅仅讨论了一般的概念和一些于内核配置相关的特定问题,而没有涉及任何精确的细节(比如那些等待你自己去发现的!)。但是,Gentoo文档集的其他部分却可能对你手头的事情提供了专门的详细解说。

    你会发现,这些文档对于配置一些专门的领域时非常有帮助,但是如果你对内核配置还不是很熟悉,可别那么着急冒险尝试。

    • ALSA指南详细叙述了与网卡支持相关的配置选项。要注意,对于前面提到的不要将东西编译成模块的说法,ALSA可是个例外。将部件编译成模块可以让ALSA的配置变的更简单。
    • Bluetooth Guide详述了在系统上使用蓝牙设备时需要的选项。
    • IPv6 Router Guide详细描述了如何配置你的内核使其可以使用下一代网络寻址模式。
    • 如果你需要使用闭源的nVidia网卡驱动来提升3D性能,nVidia指南列出了在这样的系统上很多必须选和一定不能选的选项。
    • 还有其他一些,电源管理指南解释了怎样配置内核以支持CPU频率调整、挂起和休眠功能。
    • 如果你在运行一个PowerPC系统,PPC FAQ其中也有与内核配置相关的章节。
    • Printing HOWTO列出了为了支持在Linux上打印所需的内核选项。
    • USB指南详述了常见的USB设备——例如,键盘/鼠标、存储设备还有打印机——所需要的配置。

    5.  疑难解答

    更改了的配置却没有生效

    很常见的是用户对配置做了一些更改,但是却在接下来的步骤中犯了小错。他们经常会重新启动进入那个并不是他们更改过配置的内核,并发现他们试图解决的问题却仍然存在,从而得出这个配置的更改不能解决问题。

    如何编译和安装内核并不在本文的讨论范围之内,你应该查看一下内核更新指南来获得相对更全面的指导。简短的说,这个过程是:配置、编译、挂载 /boot(如果还没有挂载的话)、将新的内核镜像拷贝过来、重新启动。如果你缺少了其中任何一个步骤,你的更改都不会生效。

    通过验证数据和编译时间可以检查你启动的内核与你编译到硬盘上的内核是否匹配。假设你的体系结构是x86并且你的内核源代码安装在/usr/src/linux下:

    代码 5.1: 验证你是否是以修改过的内核启动的

    # uname -v
    #4 SMP PREEMPT Sat Jul 15 08:49:26 BST 2006
    上面的命令显示你现在启动的内核所编译的日期和时间。
    
    # ls -l /usr/src/linux/arch/i386/boot/bzImage
    -rw-r--r-- 1 dsd users 1504118 Jul 15 08:49 /usr/src/linux/arch/i386/boot/bzImage
    上面的命令可以显示你硬盘上的内核镜像最后编译的日期和时间。
    

    如果以上两个命令显示出的时间差异大于2分钟,这意味着你可能在重新安装的过程中犯错误了,而你并没有从你想要的那个内核镜像上启动。

    不能自动装载模块

    本文之前已经提到,内核配置系统使得内核部件被编译为模块(M)和内建于内核之中(Y)这两种情况之间的差异变的很模糊。在这里之所以值得这样旧事重提是因为很多用户会跌入这个陷阱。

    当你选择将某个部件以内建的方式编译,它的代码会被编译进入内核镜像当中(bzImage)。当内核需要使用这个部件时,内核可以自动得初始化和装载它,而不需要打断用户。

    而如果你将某个部件编译为模块,它的代码则会被编译进入内核模块文件并且被安装到你的文件系统上。通常来讲,当内核需要使用这个部件时,它实际上却什么也不能做。除去一些例外情况,内核事实上不会对装载这些模块做什么努力——这个任务留给了用户。

    所以,如果你将自己的网卡驱动编译成一个模块,并且你又发现自己不能接入网络,那可能是因为这个模块没有被装载——你必须手动得装载它,或者将你的系统配置为在启动时可以自动装载。

    请将这些模块直接编译进入你的内核,让内核自动得为你设置,这样就可以节省时间,除非你有足够的理由不愿这么做。

    (来自:http://www.gentoo.org/doc/zh_cn/kernel-config.xml)

  • 相关阅读:
    类的加载过程 以及实例的加载顺序
    设计优化之单例模式
    Java程序性能优化之性能概述
    1-12接口
    1-11多态
    1-9方法的重写(override)
    1-6static关键字
    1-10super和this关键字
    1-8继承extends
    1-7代码块的分类
  • 原文地址:https://www.cnblogs.com/ikaka/p/3345516.html
Copyright © 2020-2023  润新知