欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

核心动画_核心

程序员文章站 2024-03-22 22:00:52
...

在你开始前

了解这些教程可以教给您什么以及如何从中获得最大收益。

关于本系列

Linux Professional Institute (LPI)在两个级别上对Linux系统管理员进行认证: 初级 (也称为“认证级别1”)和中级 (也称为“认证级别2”)。 要获得1级认证,您必须通过101和102考试; 要达到2级认证,您必须通过201和202考试。

developerWorks提供了教程,以帮助您为四门考试中的每门考试做准备。 每个考试涵盖几个主题,并且每个主题在developerWorks上都有一个相应的自学教程。 对于LPI 102考试,这9个主题和相应的developerWorks教程为:

表1. LPI考试102:教程和主题
LPI 102考试主题 developerWorks教程 教程总结
主题105 LPI 102考试准备:
核心
(本教程)。 了解如何安装和维护Linux内核和内核模块。 请参阅下面的详细目标
主题106 LPI 102考试准备:
引导,初始化,关闭和运行级别
快来了。
主题107 LPI 102考试准备:
列印
快来了。
主题108 LPI 102考试准备:
文献资料
快来了。
主题109 LPI 102考试准备:
Shell,脚本,编程和编译
快来了。
主题111 LPI 102考试准备:
行政任务
快来了。
主题112 LPI 102考试准备:
网络基础
快来了。
主题113 LPI 102考试准备:
网络服务
快来了。
主题114 LPI 102考试准备:
安全
快来了。

要通过考试101和102(并达到1级认证),您应该能够:

  • 在Linux命令行上工作
  • 执行简单的维护任务:帮助用户,将用户添加到更大的系统,备份和还原以及关闭和重新启动
  • 安装和配置工作站(包括X)并将其连接到LAN,或通过调制解调器将独立PC连接到Internet

要继续准备1级认证,请参阅有关LPI考试101和102developerWorks教程 ,以及整套developerWorks LPI教程

Linux Professional Institute不特别认可任何第三方考试准备材料或技术。 有关详细信息,请联系[email protected]

关于本教程

欢迎使用“内核”,这是为您准备LPI 102考试而设计的九个教程中的第一篇。在本教程中,您将学习如何构建,安装和查询Linux内核及其内核模块。

本教程根据该主题的LPI目标进行组织。 粗略地说,对于体重较高的目标,应在考试中提出更多问题。

表2.内核:本教程涵盖的考试目标
LPI考试目标 客观体重 客观总结
1.105.1
在运行时管理和查询内核以及内核模块
重量4 学习查询和管理内核以及内核可加载模块。
1.105.2
重新配置,构建和安装自定义内核和内核模块
重量3 学习从源代码定制,构建和安装内核以及可装入内核的模块。

先决条件

为了从本教程中获得最大收益,您应该具有Linux的基本知识以及可以在其中实践本教程中介绍的命令的Linux系统。

本教程建立在LPI系列以前的教程中介绍的内容的基础上,因此您可能需要首先查看101考试教程

程序的不同版本可能会不同地格式化输出,因此您的结果可能看起来与本教程中的清单和图不完全相同。

运行时内核管理

本部分介绍了初中级管理(LPIC-1)考试102的主题1.105.1的材料。该主题的权重为4。

在本节中,学习如何:

  • 使用命令行实用程序获取有关当前正在运行的内核和内核模块的信息
  • 手动加载和卸载内核模块
  • 确定何时可以卸载模块
  • 配置系统以通过模块名而不是文件名加载模块

从技术上讲,Linux是系统的内核。 内核为应用程序提供了运行和使用各种硬件设备的框架。 它是处理硬件接口,调度和内存管理等的低级代码。 许多人将整个系统称为GNU / Linux,因为使大多数发行版可用的许多工具都来自*软件基金会的GNU项目。 尽管如此,您通常只会看到“ Linux”而不是“ GNU / Linux”。

ame

uname命令输出有关您的系统及其内核的信息。 清单1显示了uname的各种选项以及所得到的信息; 表3中定义了每个选项。

清单1. uname命令
aaa@qq.com:~$ uname
Linux
aaa@qq.com:~$ uname -s
Linux
aaa@qq.com:~$ uname -n
pinguino
aaa@qq.com:~$ uname -r
2.6.12-10-386
aaa@qq.com:~$ uname -v
#1 Mon Jan 16 17:18:08 UTC 2006
aaa@qq.com:~$ uname -m
i686
aaa@qq.com:~$ uname -o
GNU/Linux
aaa@qq.com:~$ uname -a
Linux pinguino 2.6.12-10-386 #1 Mon Jan 16 17:18:08 UTC 2006 i686 GNU/Linux
表3. uname的选项
选项 描述
-s 打印内核名称。 如果未指定任何选项,则为默认设置。
-n 打印节点名或主机名。
-r 打印内核的发行版。 此选项通常与模块处理命令一起使用。
-v 打印内核的版本。
-米 打印机器的硬件(CPU)名称。
-o 打印操作系统名称。
-一个 打印以上所有信息。

清单1来自运行在Intel®CPU上的Ubuntu系统。 uname命令在大多数UNIX®和类似UNIX的系统以及Linux上可用。 打印的信息将根据Linux发行版和版本以及运行的计算机类型而有所不同。 清单2显示了运行Fedora Core 4的AMD Athlon 64系统以及Apple PowerBook的输出,以进行比较。

清单2.与另一个系统一起使用uname
Linux attic4 2.6.14-1.1656_FC4 #1 Thu Jan 5 22:13:55 EST 2006 x86_64 
x86_64 x86_64 GNU/Linuxfilesystem

Darwin Ian-Shields-Computer.local 7.9.0 Darwin Kernel Version 7.9.0: 
Wed Mar 30 20:11:17 PST 2005; root:xnu/xnu-517.12.7.obj~1/RELEASE_PPC  
Power Macintosh powerpc

内核模块

内核管理着系统的许多底层方面,包括硬件和接口。 有了各种可能的硬件和几个不同的文件系统,支持所有功能的内核将变得相当大。 幸运的是, 内核模块允许您在需要时加载支持软件,例如硬件驱动程序或文件系统,因此您可以使用小内核启动系统,然后根据需要加载其他模块。 通常,加载是自动的,例如插入USB设备时。

本节的其余部分着眼于内核模块的命令和配置。

诸如装载或卸载模块之类的任务的命令需要root权限。 用于显示有关模块信息的命令通常可由一般用户运行。 但是,由于它们位于/ sbin中,因此通常不在非root用户的路径上,因此,如果您不是root用户,则可能必须使用完整路径名。

lsmod

使用lsmod命令显示系统上当前加载的模块,如清单3所示。您的输出可能会有所不同,尽管您应该看到一些常见的条目。

清单3.使用lsmod显示内核模块
[aaa@qq.com ~]$ /sbin/lsmod
Module                  Size  Used by
nvnet                  74148  0
nvidia               4092336  12
forcedeth              24129  0
md5                     4161  1
ipv6                  268737  12
parport_pc             29189  1
lp                     13129  0
parport                40969  2 parport_pc,lp
autofs4                29637  1
sunrpc                168453  1
ipt_REJECT              5825  1
ipt_state               1985  3
ip_conntrack           42009  1 ipt_state
iptable_filter          3137  1
ip_tables              19521  3 ipt_REJECT,ipt_state,iptable_filter
dm_mod                 58613  0
video                  16069  0
button                  4161  0
battery                 9541  0
ac                      4933  0
ohci_hcd               26977  0
ehci_hcd               41165  0
i2c_nforce2             7105  0
i2c_core               21825  1 i2c_nforce2
shpchp                 94661  0
snd_intel8x0           34945  1
snd_ac97_codec         76217  1 snd_intel8x0
snd_seq_dummy           3781  0
snd_seq_oss            37569  0
snd_seq_midi_event      9409  1 snd_seq_oss
snd_seq                62801  5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event
snd_seq_device          9037  3 snd_seq_dummy,snd_seq_oss,snd_seq
snd_pcm_oss            51569  0
snd_mixer_oss          18113  1 snd_pcm_oss
snd_pcm               100553  3 snd_intel8x0,snd_ac97_codec,snd_pcm_oss
snd_timer              33733  2 snd_seq,snd_pcm
snd                    57669  11 snd_intel8x0,snd_ac97_codec,snd_seq_oss,snd_seq,
snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer
soundcore              11169  1 snd
snd_page_alloc          9925  2 snd_intel8x0,snd_pcm
floppy                 65397  0
ext3                  132681  3
jbd                    86233  1 ext3
sata_nv                 9541  0
libata                 47301  1 sata_nv
sd_mod                 20545  0
scsi_mod              147977  2 libata,sd_mod
[aaa@qq.com ~]$

您可以看到该系统具有许多已加载的模块。 其中大多数都随内核一起提供。 但是,某些组件(例如NVIDIA Corporation的nvnet,nvidia和sata_nv模块)包含专有代码,并且不作为标准内核的一部分提供。 通过这种方式,模块化方法允许将专有代码插入开源内核。 假设供应商许可证允许,Linux发行商可以将专有模块添加到发行版中,从而省去了直接从供应商处获取专有模块的工作,并有助于确保您拥有适当的级别。

从清单3中,您还可以看到模块化支持扩展到设备,例如视频,SATA和SCSI硬盘驱动器,软盘和声卡,以及网络功能(例如IPV6),文件系统支持(例如ext3和Sun)。远程过程调用(RPC)。

除了模块名称外, lsmod还显示模块大小和模块用户数。 如果该模块被其他模块使用,则将列出这些模块。 因此,例如, soundcore模块由snd模块使用,而snd模块又由其他几个声音模块使用。

modinfo

modinfo命令显示有关一个或多个模块的信息。 如清单4所示,该信息包括文件的完整路径,作者,许可证,模块可以接受的任何参数,版本,依赖项以及其他信息。

清单4.基本模块信息
[aaa@qq.com ~]$ /sbin/modinfo floppy
filename:       /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko
author:         Alain L. Knaff
license:        GPL
alias:          block-major-2-*
vermagic:       2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends:
srcversion:     2633BC999A0747D8D215F1F
parm:           FLOPPY_DMA:int
parm:           FLOPPY_IRQ:int
parm:           floppy:charp
[aaa@qq.com ~]$ /sbin/modinfo sata_nv
filename:       /lib/modules/2.6.12-1.1456_FC4/kernel/drivers/scsi/sata_nv.ko
author:         NVIDIA
description:    low-level driver for NVIDIA nForce SATA controller
license:        GPL
version:        0.6
vermagic:       2.6.12-1.1456_FC4 686 REGPARM 4KSTACKS gcc-4.0
depends:        libata
alias:          pci:v000010DEd0000008Esv*sd*bc*sc*i*
alias:          pci:v000010DEd000000E3sv*sd*bc*sc*i*
alias:          pci:v000010DEd000000EEsv*sd*bc*sc*i*
alias:          pci:v000010DEd00000054sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000055sv*sd*bc*sc*i*
alias:          pci:v000010DEd00000036sv*sd*bc*sc*i*
alias:          pci:v000010DEd0000003Esv*sd*bc*sc*i*
alias:          pci:v000010DEd*sv*sd*bc01sc01i*
srcversion:     3094AD48C1B869BCC301E9F

在清单4中,请注意在给出模块文件名的行中,这些文件名以.ko后缀结尾。 这将2.6内核的模块与其他目标文件以及2.4和更早版本的内核(与其他目标文件使用相同的.o后缀)区分开。

您还将注意到模块路径包括内核版本。 例如,/lib/modules/2.6.12-1.1456_FC4/kernel/drivers/block/floppy.ko包含2.6.12-1.1456_FC4作为路径元素。 这与uname -r发出的值相同。 内核模块特定于给定的内核,并且此结构管理该关系。

在2.6内核上,您还可以使用modinfo将请求限制为有关模块的特定信息。 使用-F选项提取单个信息类型,例如parm,描述,许可证,文件名或别名。 如果需要不同类型的信息,请多次使用带有不同选项的命令。 在2.4内核上, -p参数提取了参数信息。 当前的modinfo命令还支持较旧的参数。 清单5显示了一些示例。

清单5.特定的模块信息
[aaa@qq.com ~]$ /sbin/modinfo -F parm snd
cards_limit:Count of auto-loadable soundcards.
major:Major # for sound driver.
[aaa@qq.com ~]$ /sbin/modinfo -F license nvidia floppy
NVIDIA
GPL
[aaa@qq.com ~]$ /sbin/modinfo -p snd
major:Major # for sound driver.
cards_limit:Count of auto-loadable soundcards.

使用您的Linux技能

您可以使用教程“ LPI 101考试准备(主题103):GNU和UNIX命令 ”中介绍的某些技术来提取信息,例如任何接受参数的模块接受的参数数量。 清单6显示了一个示例。

清单6.每个模块的参数数量
[aaa@qq.com ~]$ for n in `/sbin/lsmod | tail +2 | cut -d " " -f1`;
> do echo "$n $(/sbin/modinfo -p $n |wc -l )" | grep -v " 0$"; done
nvnet 12
forcedeth 1
parport_pc 5
dm_mod 1
ohci_hcd 2
ehci_hcd 2
shpchp 3
snd_intel8x0 7
snd_ac97_codec 1
snd_seq_dummy 2
snd_seq_oss 2
snd_seq 7
snd_pcm_oss 3
snd_pcm 2
snd_timer 1
snd 2
snd_page_alloc 1
scsi_mod 6

rmmod

如果模块的使用计数为0,则可以安全地将其删除。 例如,您可以这样做以准备加载更新的版本。 这是模块化内核的一项重要功能,因为您不必总是重新引导就可以更新对一个或另一个特定设备的支持。 要删除一个mod,请使用rmmod命令以及模块名称,如清单7所示。

清单7.删除正在运行的系统的模块
[aaa@qq.com ~]# rmmod floppy

有关rmmod可用的其他选项,请参考手册页。

insmod和modprobe

卸下模块后,可能需要重新加载它。 您可以使用insmod命令执行此操作,该命令获取要重新加载的模块的完整路径名,以及可能需要的所有模块选项。 如果使用此命令,则可能要使用命令替换来生成文件名。 清单8显示了两种方法。

清单8.使用insmod加载模块
[aaa@qq.com ~]# insmod /lib/modules/
            `uname -r`/kernel/drivers/block/floppy.ko
            [aaa@qq.com ~]# rmmod floppy
            [aaa@qq.com ~]# insmod $(modinfo -F filename floppy)

上面的第二种形式使您无需记住模块位于哪个子目录(在这种情况下为驱动程序/块),但是有一种更好的加载模块的方法。 modprobe命令提供了一个更高级别的界面,该界面使用模块名称而不是文件路径进行操作。 它还处理加载模块所依赖的其他模块,并且可以删除模块并进行加载。

清单9显示了如何使用modprobe删除vfat模块以及使用它的fat模块。 然后显示了如果重新加载模块,系统将如何操作,最后显示了重新加载模块的结果。 注意,指定了-v选项以获得详细的输出。 否则, modprobe (和基础的insmod命令)将仅显示来自模块本身的错误消息。 在每个步骤之间, lsmod的输出通过grep传递给管道,以显示是否加载了vfatfat模块。

清单9.使用modprobe加载模块
[aaa@qq.com root]# modprobe -r vfat
vfat: Device or resource busy
[aaa@qq.com root]# lsmod | grep fat
vfat                   13132   1
fat                    38744   0  [vfat]
[aaa@qq.com root]# umount /windows/D
[aaa@qq.com root]# modprobe -r vfat
[aaa@qq.com root]# modprobe -v --show  vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[aaa@qq.com root]# lsmod | grep fat
[aaa@qq.com root]# modprobe -v  vfat
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/fat/fat.o
Symbol version prefix ''
/sbin/insmod /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
Using /lib/modules/2.4.21-37.0.1.EL/kernel/fs/vfat/vfat.o
[aaa@qq.com root]# lsmod | grep fat
vfat                   13132   0  (unused)
fat                    38744   0  [vfat]

德普莫德

您刚刚已经看到,当某些模块依赖于其他模块时, modprobe可以处理多个模块的自动加载。 依赖关系保存在适当内核的/ lib / modules子目录的modules.dep文件中,如uname -r命令所给。 该文件以及几个映射文件是由depmod命令生成的。 -a (对于all )现在是可选的。

depmod命令扫描/ lib / modules子目录中的模块以查找您正在使用的内核,并刷新依赖关系信息。 清单10中显示了一个示例以及产生的更改文件。

清单10.使用depmod重建modules.dep
[aaa@qq.com root]# date
Thu Mar 16 10:41:05 EST 2006
[aaa@qq.com root]# depmod
[aaa@qq.com root]# cd /lib/modules/`uname -r`
[aaa@qq.com 2.4.21-37.0.1.EL]# ls -l mod*
-rw-rw-r--    1 root     root        54194 Mar 16 10:41 modules.dep
-rw-rw-r--    1 root     root           31 Mar 16 10:41 modules.generic_string
-rw-rw-r--    1 root     root           73 Mar 16 10:41 modules.ieee1394map
-rw-rw-r--    1 root     root         1614 Mar 16 10:41 modules.isapnpmap
-rw-rw-r--    1 root     root           29 Mar 16 10:41 modules.parportmap
-rw-rw-r--    1 root     root        65171 Mar 16 10:41 modules.pcimap
-rw-rw-r--    1 root     root           24 Mar 16 10:41 modules.pnpbiosmap
-rw-rw-r--    1 root     root       122953 Mar 16 10:41 modules.usbmap
[aaa@qq.com 2.4.21-37.0.1.EL]# cd -
/root

您可以使用配置文件/etc/modules.conf自定义modprobedepmod的行为。 通常用于别名模块名称,并指定在模块加载后或卸载之前应运行的命令。 但是,可以完成其他各种配置。 清单11显示了/etc/modules.conf的示例。 有关更多详细信息,请参见手册页中的modules.conf。

清单11.示例/ etc / modules文件
[aaa@qq.com root]# cat /etc/modules.conf
alias eth0 e100
alias usb-controller usb-uhci
alias usb-controller1 ehci-hcd
alias sound-slot-0 i810_audio
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :

您还应该知道,某些系统使用另一个名为modprobe.conf的配置文件,而其他系统则将模块配置信息存储在/etc/modules.d目录中。 在某些系统上,您可能还会找到一个名为/ etc / modules的文件。 该文件包含应在引导时加载的内核模块的名称。

USB模块

将USB设备热插入Linux系统时,内核必须确定要加载哪些模块来处理该设备。 通常,这是通过热插拔脚本为您完成的,该脚本使用usbmodules命令查找适当的模块。 您也可以运行usbmodules (以root用户身份)亲自查看。 清单12显示了一个示例。

清单12. USB模块
aaa@qq.com:~# lsusb
Bus 005 Device 004: ID 1058:0401 Western Digital Technologies, Inc.
Bus 005 Device 003: ID 054c:0220 Sony Corp.
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 003: ID 04b3:310b IBM Corp. Red Wheel Mouse
Bus 001 Device 001: ID 0000:0000
aaa@qq.com:~# usbmodules --device /proc/bus/usb/005/003
usb-storage
aaa@qq.com:~# usbmodules --device /proc/bus/usb/001/003
usbmouse
usbhid

下一节将向您展示如何构建和配置定制内核。

定制和构建内核和内核模块

本部分介绍了初中级管理(LPIC-1)考试102的主题1.105.2的材料。该主题的权重为3。

在本节中,学习如何:

  • 自定义当前内核配置
  • 构建一个新内核和适当的内核模块
  • 安装新内核和任何模块
  • 确保引导管理器可以找到新内核和关联文件

正如您在上一节“ 运行时内核管理”中了解到的那样, 内核为系统硬件和文件系统提供了底层支持。 现代的内核映像通常仅包含基本功能,但被配置为支持通过使用内核模块可能需要的其他功能。 仅在需要时(例如,在插入设备或启用设备时)才加载附加支持。

模块化代码成为内核的组成部分,动态扩展了内核功能。 如果已加载内核模块的功能没有使用几分钟,则内核可以自动将其与内核的其余部分解除关联,并通过称为autocleaning的过程将其从内存中卸载。

如果没有内核模块,则从磁盘作为单个二进制文件加载的正在运行的内核将必须包含您可能需要的所有功能。 每当您想向系统中添加功能时,您还需要构建一个全新的内核。

但是,您不能将所有内容放入模块中。 至少要加载的内核映像必须能够挂载您的根文件系统。 但是,正如您在教程“ LPI 101考试准备(主题102):Linux安装和程序包管理 ”中所了解的那样,引导加载程序可以加载初始RAM磁盘 (或initrd ),其中可能包含安装根文件所需的模块。系统。 但是,内核映像必须至少包含对初始RAM磁盘中使用的RAM文件系统的支持。 否则,系统将无法启动。

一旦您的系统自启动,就继续安装根文件系统,然后启动其他初始化过程。 几秒钟后,系统启动,可以使用了。 但是,内核仍处于控制状态,等待请求执行用户进程的工作并在需要它们的任务之间调度系统资源。

模块化内核在具有大量RAM和磁盘空间的现代系统中可以很好地工作。 但是,您可能拥有新的硬件,例如视频卡或存储系统,但发行版附带的内核不支持该硬件。 确实,某些驱动程序包含据说会污染纯Linux内核的专有代码,因此即使供应商许可条款允许您选择的分销商分发该代码,某些发行商也不会包含该代码。 在这种情况下,您至少需要构建新模块,甚至可能还要构建新内核。

Linux可用于许多环境,从嵌入式系统(如手机)到网络设备(如路由器)再到机顶盒以及更传统的计算环境。 其中一些设备使用定制的内核,仅支持系统打算支持的功能。 例如,一个打算成为无盘防火墙的系统可能不需要支持它所加载的只读文件系统以外的任何文件系统,但是它可能需要支持不是标准内核一部分的高级网络硬件。 。 同样,将需要自定义内核。

源码包

Linux内核的最终来源是Linux Kernel Archives(请参阅参考资料中的链接)。 除非您已经知道要做什么,否则应该使用Linux发行版中的内核软件包,因为发行商可能已添加了自定义补丁。 如果您已经熟悉获取和提取源软件包,请查看教程“ LPI 101考试准备(主题102):Linux安装和软件包管理” 与可能会更改系统的所有内容一样,请先进行备份,以便在出现问题时可以恢复。

如果从公共内核归档文件中下载源代码,则将下载一个压缩文件,然后根据下载的是内核源代码的.gz还是.bz2版本,使用gzipbzip2将其解压缩。 下载服务器上的pub / linux / kernel /目录具有每个内核版本的目录,例如2.4、2.5或2.6。 在撰写本文时,2.6内核的最新bzip2版本是linux-2.6.15.tar.bz2。

在该内核目录中,您还将看到一个相应的ChangeLog-2.6.15.6文件,该文件描述了此版本中的更改,以及一个patch-2.6.15.bz2,它是一个较小的文件,可用于将源的先前版本修补为使其达到2.6.15的水平。 您还将注意到签名文件,可用于验证您下载的文件是否意外或恶意损坏。

压缩源通常在/ usr / src中未压缩,并且为内核版本(例如linux-2.6.15)创建了一个新的子目录,其中包含构建内核所需的文件树。 如果已经有了这样的目录,则可能需要备份或重命名它,然后再解压缩新的内核源代码。 这样可以确保您可以在需要时返回,也可以避免内核源代码树中没有杂散文件。 您需要大约40MB的磁盘空间用于压缩包,以及大约350MB的扩展源代码。

一些发行商,特别是Red Hat,现在发行了内核头文件和将内核模块构建为内核开发包所必需的源。 文档可能位于单独的内核文档包中。 这些是为构建模块而设计的,并且足以构建模块,例如专有的供应商图形卡模块,但不足以重建自定义内核。 您的发行版应包含有关如何重建内核以及如何获取源的信息。 检查文档,例如发行说明。

假设您使用FTP或HTTP从pub / fedora / linux / core / updates / 4 / SRPMS /的download.fedora.redhat.com上下载kernel-2.6.15-1.1833_FC4.src.rpm源RPM,文件位于/ root目录中。 请注意,此处使用的版本号对于您的系统可能会有所不同,因此请确保获得与安装的内核相对应的源代码的更新版本。 现在,对于Fedora,您必须安装源RPM,然后切换到/ usr / src / redhat / SPECS目录,最后构建源RPM,以便创建Linux内核源树,如清单13所示。

清单13.为Fedora Core创建内核源代码树
[aaa@qq.com ~]# uname -r
2.6.15-1.1833_FC4
[aaa@qq.com ~]# rpm -Uvh kernel-2.6.15-1.1833_FC4.src.rpm
   1:kernel                 ########################################### [100%]
[aaa@qq.com ~]# cd /usr/src/redhat/SPECS
[aaa@qq.com SPECS]# rpmbuild -bp --target $(arch) kernel-2.6.spec
Building target platforms: x86_64
Building for target x86_64
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.23188
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ '[' '!' -d kernel-2.6.15/vanilla ']'
+ cd /usr/src/redhat/BUILD
+ rm -rf kernel-2.6.15
+ /bin/mkdir -p kernel-2.6.15
+ cd kernel-2.6.15
+ /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.15.tar.bz2
+ tar -xf -
...
+ echo '# x86_64'
+ cat .config
+ perl -p -i -e 's/^SUBLEVEL.*/SUBLEVEL = 15/' Makefile
+ perl -p -i -e 's/^EXTRAVERSION.*/EXTRAVERSION = -prep/' Makefile
+ find . -name '*.orig' -o -name '*~' -exec rm -f '{}' ';'
+ exit 0

Fedora的Linux内核源代码现在位于/usr/src/redhat/BUILD/kernel-2.6.15/linux-2.6.15中。 按照约定,/ linux-2.6.15树通常被移动到/ usr / src并以符号方式链接到/ usr / src / linux,如清单14所示。这不是严格必需的,但是与引用一起使用更容易假设内核源代码树位于.usr。/ src / linux中。

清单14.将源树移动到./usr/src
[aaa@qq.com SPECS]# mv ../BUILD/kernel-2.6.15/linux-2.6.15 /usr/src
[aaa@qq.com SPECS]# cd /usr/src
[aaa@qq.com src]# ln -s linux-2.6.15 linux
[aaa@qq.com src]# ls -ld lin*
lrwxrwxrwx   1 root root   12 Mar 20 18:23 linux -> linux-2.6.15
drwxr-xr-x  20 root root 4096 Mar 20 18:13 linux-2.6.15

在尝试构建任何内容之前,请查看“文档”目录中的“更改”文件。 其中,它列出了构建内核所需的各种软件包的最低级别。 确保已安装这些软件包。

您可能会注意到清单13中所示文件中的Makefile和.config。make文件包含几个make目标,用于执行任务,例如配置内核选项,构建内核及其模块,安装模块以及构建RPM或deb软件包。 最新的内核资源使您可以使用make help获得有关每个目标的简要帮助。 对于较旧的系统,您可能需要查阅文档或检查make文件。 清单15显示了make help部分输出。

清单15.内核构建make文件的帮助
[aaa@qq.com linux-2.6.15]$ make help
Cleaning targets:
  clean           - remove most generated files but keep the config
  mrproper        - remove all generated files + config + various backup files

Configuration targets:
  config          - Update current config utilising a line-oriented program
  menuconfig      - Update current config utilising a menu based program
  xconfig         - Update current config utilising a QT based front-end
  gconfig         - Update current config utilising a GTK based front-end
  oldconfig       - Update current config utilising a provided .config as base
  randconfig      - New config with random answer to all options
  defconfig       - New config with default answer to all options
  allmodconfig    - New config selecting modules when possible
  allyesconfig    - New config where all options are accepted with yes
  allnoconfig     - New minimal config

Other generic targets:
  all             - Build all targets marked with [*]
* vmlinux         - Build the bare kernel
* modules         - Build all modules
  modules_install - Install all modules
  dir/            - Build all files in dir and below
  dir/file.[ois]  - Build specified target only
...

组态

内核构建目录中的.config文件包含内核的配置信息,包括目标计算机环境,要包含的功能以及是否应将功能编译到内核中或作为模块构建。 创建.config文件是构建或重建内核的第一步。 您可以使用make文件中的配置目标之一来创建它。

主要配置选项为:

配置
config目标使用命令行界面来获取对许多问题的答案,以构建或更新您的.config文件。 随着基于菜单的配置目标的出现,该命令行界面如今已很少使用。
菜单配置
menuconfig目标使用基于ncurses,基于菜单的程序来创建或更新.config文件。 您只需要回答要更改的项目的问题。 这种方法已取代了较早的配置目标。 您可以在终端窗口中远程或本地运行它。
的xconfig
xconfig目标使用基于QT前端的图形菜单系统,例如与KDE桌面一起使用的系统。
gconfig
gconfig目标使用基于GTK前端的图形菜单系统,例如与GNOME桌面一起使用的图形菜单系统。
oldconfig
使用oldconfig目标,您可以使用现有的.config文件来构建配置,例如以前的构建或其他系统中的文件。 例如,如果如上所述安装Fedora的内核源代码,则可以将正在运行的系统的配置文件从/lib/modules/$(uname -r)/build/.config/usr/src/linux 构建它之后,如有必要,可以使用菜单配置目标之一对其进行修改。

图1显示了如果为2.4系列内核运行make menuconfig会看到什么。 Enter进入下一级菜单,然后按Esc返回。 大多数项目都可以使用帮助。 使用Tab键转到<帮助>按钮,然后按Enter键 ,或直接键入h Esc返回配置。

图1.在2.4内核上运行make menuconfig
核心动画_核心

表4显示了用于在内核中包括内置功能或作为模块功能的各种选项。 突出显示选项时,按空格键可在该功能的允许选项之间切换。 您也可以按y启用选项,按n禁用它,或者按m使其编译为模块。

表4. menuconfig的选项
选项 描述
[*] 功能将内置到内核中。
[] 功能将不包含在内核中。
<M> 功能将构建为内核模块。
<> 功能不会包含在内核中,但可以作为模块构建。

图2显示了如果为2.6系列内核运行make gconfig将会看到的内容。 单击箭头以展开或折叠菜单项。 帮助显示在下部窗格中。

图2.在2.6内核上运行make gconfig
核心动画_核心

2.6内核的主要配置部分如下所述。 在2.4和更早版本的内核中可能找不到所有这些,但是此列表为您提供了在哪里找到内容的概述。

代码成熟度级别选项
本节包含一个选项,该选项确定其余选项是否使您可以选择被认为是实验性的代码。 如果未选择此选项,则将只能选择被认为是稳定的选项。 警告您选择的功能可能无法在系统的当前代码级别上运行,因此您可能有机会进行调试。
常规设置
本部分允许您在新内核中包含一个标识字符串,以及不属于其他地方但必须指定的几个内核属性的选项。
可加载模块支持
本节包含一个选项,该选项确定内核是否支持模块以及是否可以自动加载和卸载模块。 您应该启用模块支持。
块层
本节包含对大于2TB的磁盘的支持,并允许您选择所需的磁盘调度类型。
处理器类型和功能
本节包含特定于CPU的配置选项。 在这里,您可以选择内核将支持的处理器或处理器系列,以及是否启用对各种处理器功能的访问。 如果您有多个CPU或超线程CPU,请确保启用对称多处理支持。 通常,应启用MTRR选项,以使AGP或PCI视频卡具有更好的图形性能。
电源管理选项
本节包含几个电源管理选项。 这些在笔记本电脑上特别有用。 除了控制电源状态之外,您还将在此处找到用于控制和监视温度或风扇状态的选项。
总线选项(PCI等)
本节包含系统支持的总线的选项,例如PCI,PCI Express和PC卡总线。 您也可以在此处启用/ proc / pci文件系统,尽管通常应改用lspci
可执行文件格式/仿真
本节包含用于支持各种二进制文件格式的选项。 您应该启用ELF二进制支持。 您还可以启用对在DOSEMU下运行的DOS二进制文件以及由包装程序驱动的二进制文件(例如Java™,Python,Emacs-Lisp等)的支持。 最后,对于支持32位仿真的64位系统,您可能希望启用32位二进制支持。
联网
网络部分很大。 在这里,您可以启用基本套接字和TCP / IP网络,以及数据包过滤,桥接,路由,并支持各种协议,例如IPV6,IPX,Appletalk和X.25。 您还可以在此处启用无线,红外和业余无线电支持。
设备驱动程序
此部分也很大。 在这里,您可以支持大多数硬件设备,包括IDE / ATAPI或SCSI硬盘驱动器和闪存设备。 为您的IDE设备启用DMA; 否则,它们将在较慢的PIO模式下工作。 如果要支持RAID或LVM等多种设备,则可以在此处启用它。 如果需要并行打印机支持,还可以在此处配置并行端口支持。 您还可以在此处配置各种可能的网络设备,以支持上面配置的网络协议。 您还将在这里找到对音频和视频捕获设备,USB和IEEE 1384(火线)设备以及各种硬件监视设备的支持。 在字符设备小节下,您可能需要启用并行打印支持和直接渲染支持。
固件驱动
本节包含一些与BIOS设置和更新有关的选项,例如在某些Dell系统上使用Dell系统管理功能。
文件系统
本部分用于配置您希望内核支持的文件系统,这些文件系统可以以模块形式编译或以模块形式编译。 您还将在这里找到用于可移动介质(例如软盘和CD或DVD设备)的文件系统,以及对网络文件系统(例如NFS,SMB或CIFS)的支持。 在这里也可以找到对各种分区的支持以及对本机语言的支持。
仪器支持
本部分允许您启用实验性分析支持,以对系统的活动进行概要分析。
内核黑客
本部分允许您启用内核调试并选择要启用的功能。
安全选项
本部分允许您配置几个安全选项,以及启用和配置SELinux(安全性增强Linux)。
加密选项
本部分允许您配置几种加密算法,例如MD4,DES和SHA256。
图书馆例程
本部分允许您确定是将某些CRC算法编译还是作为模块构建。

建造

既然您已经了解了配置内核的主要方面,那么就可以开始构建内核了。 如果不确定构建树的状态,请在配置新内核之前运行make clean 要获得更极端的清理目标,请运行make mrproper 这将删除您的.config文件以及构建过程中使用的其他一些文件。 如果这样做,然后需要还原备份的.config文件,则需要在配置之前运行make oldconfig

在进行实验时,应给新内核一个自定义名称,以便您轻松识别它。 为此,请设置一个本地版本值,并启用“常规设置”部分下的自动将版本信息附加到版本字符串的选项,如图3所示。

图3.配置定制内核
核心动画_核心

本着其余步骤的精神,本教程其余部分中的示例均基于仅用图3所示的两个更改构建内核。

原则上,内核不需要root用户权限来构建,尽管您将需要root用户权限来安装新内核。 但是,如果您使用的是由发行版安装的软件包,则由于已设置文件和目录权限,您可能必须以root用户身份运行。 您可以通过从Linux内核归档文件下载内核源tarball并将其解压缩到主目录中,或者通过复制内核构建树并更改对userid的权限,来在用户模式下进行练习。

要开始构建2.6内核,请输入make

要开始构建2.4内核,请运行以下三个命令:
make dep
make bzImage
make modules
第一个创建必要的依赖文件。 第二个构建内核。 最后构建您的模块。

在我的AMD Athlon 3500+系统上运行make大约需要半小时才能从头开始完成构建。 较慢的系统可能需要几个小时才能完成工作,因此请稍等一下或在等待时执行其他操作。 运行构建时,您将看到进度消息,如清单16所示。

清单16.运行make
[aaa@qq.com linux]# make
  CHK     include/linux/version.h
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/split-include
  HOSTCC  scripts/basic/docproc
  SPLIT   include/linux/autoconf.h -> include/config/*
  CC      arch/x86_64/kernel/asm-offsets.s
  GEN     include/asm-x86_64/asm-offsets.h
...
  LD [M]  sound/usb/snd-usb-lib.ko
  CC      sound/usb/usx2y/snd-usb-usx2y.mod.o
  LD [M]  sound/usb/usx2y/snd-usb-usx2y.ko

正在安装

完成内核的构建后,您还需要执行几个步骤。 首先,您需要运行make modules_install将内核模块安装在./lib/modules的新子目录中。

如果您需要用于视频卡或网络驱动程序的专有模块(如我的nVidia图形卡和nForce 4主板芯片组的需求),那么现在正是使用供应商提供的工具来构建这些模块的好时机。

最后,您需要运行make install来将新内核和初始RAM磁盘安装在/ boot中,并更新引导加载程序配置。 清单17中说明了这些步骤。

清单17.安装内核和模块
[aaa@qq.com linux]# make modules_install
  INSTALL arch/x86_64/crypto/aes-x86_64.ko
  INSTALL arch/x86_64/kernel/cpufreq/acpi-cpufreq.ko
  INSTALL arch/x86_64/kernel/microcode.ko
  INSTALL arch/x86_64/oprofile/oprofile.ko
  INSTALL crypto/aes.ko
  INSTALL crypto/anubis.ko
  INSTALL crypto/arc4.ko
...
[aaa@qq.com linux]# ls -lrt /lib/modules | tail -n 3
drwxr-xr-x  5 root root 4096 Mar  4 14:48 2.6.15-1.1831_FC4
drwxr-xr-x  5 root root 4096 Mar 20 18:52 2.6.15-1.1833_FC4
drwxr-xr-x  3 root root 4096 Mar 20 21:38 2.6.15-prep-Topic105
[aaa@qq.com linux]# sh  /root/NFORCE-Linux-x86_64-1.0-0310-pkg1.run -a \
>  -n -K -k 2.6.15-prep-Topic105
Verifying archive integrity...OK
Uncompressing NVIDIA nForce drivers for Linux-x86_64 1.0-0310...................
[aaa@qq.com linux]# sh  /root/NVIDIA-Linux-x86_64-1.0-8178-pkg2.run -a \
> -n -K -k 2.6.15-prep-Topic105
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated 
   Graphics Driver for Linux-x86_64 1.0-8178.................
[aaa@qq.com linux]# make install
  CHK     include/linux/version.h
  CHK     include/linux/compile.h
  CHK     usr/initramfs_list
Kernel: arch/x86_64/boot/bzImage is ready  (#2)
sh /usr/src/linux-2.6.15/arch/x86_64/boot/install.sh 2.6.15-prep-Topic105 
arch/x86_64/boot/bzImage System.map "/boot"
[aaa@qq.com linux]# ls -lrt /boot | tail -n 6
-rw-r--r--  1 root root 1743149 Mar 20 21:45 vmlinuz-2.6.15-prep-Topic105
lrwxrwxrwx  1 root root      28 Mar 20 21:45 vmlinuz -> vmlinuz-2.6.15-prep-Topic105
-rw-r--r--  1 root root  980796 Mar 20 21:45 System.map-2.6.15-prep-Topic105
lrwxrwxrwx  1 root root      31 Mar 20 21:45 System.map -> System.map-2.6.15-prep-Topic105
-rw-r--r--  1 root root 1318741 Mar 20 21:45 initrd-2.6.15-prep-Topic105.img
drwxr-xr-x  2 root root    4096 Mar 20 21:45 grub

初始RAM磁盘

请注意,构建过程会自动为您创建必要的初始RAM磁盘(initrd)。 如果您需要手动创建一个,可以使用mkinitrd命令。 有关详细信息,请参见手册页。

引导加载程序

如果一切正常,则make install步骤还应该更新了引导加载程序配置。 清单18显示了我的一些代码行。

清单18.更新的GRUB配置文件
default=1
timeout=10
splashimage=(hd0,5)/boot/grub/splash.xpm.gz
password --md5 $1$y.uQRs1W$Sqs30hDB3GtE957PoiDWO.
title Fedora Core (2.6.15-prep-Topic105)
        root (hd0,11)
        kernel /boot/vmlinuz-2.6.15-prep-Topic105 ro root=LABEL=FC4-64 rhgb quiet
        initrd /boot/initrd-2.6.15-prep-Topic105.img
title Fedora Core -x86-64 (2.6.15-1.1833_FC4)

新建内核的条目已放置在顶部,但默认条目已进行了调整,以保持以前的默认设置。 如果改为使用LILO,则构建脚本中使用的grubby命令应该已经更新了LILO配置。 如果由于某种原因未正确更新配置,请参考教程“ LPI 101考试准备(主题102):Linux安装和软件包管理 ”,您将找到有关设置引导加载程序的完整说明。

最后一点。 您可能想知道为什么示例配置中添加了-Topic105 ,而创建的文件都具有-prep-Topic105 这是Fedora的安全措施,可防止您无意中破坏活动的内核。 这由设置在主make文件顶部附近的EXTRAVERSION变量控制,如清单19所示。如果需要删除此文件,请编辑该文件。

清单19.更新的GRUB配置文件
[aaa@qq.com linux]# head -n 6 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 15
EXTRAVERSION = -prep
NAME=Sliding Snow Leopard

重新启动

如果一切顺利,您现在应该可以启动新系统。 您将需要为新内核选择配置条目,因为它不是默认值。 对它满意之后,可以将其设置为默认值。 重新引导时,使用uname命令检查系统的内核,如清单20所示。

清单20.检查新系统
[aaa@qq.com ~]$ uname -rv
2.6.15-prep-Topic105 #2 Mon Mar 20 21:13:20 EST 2006

翻译自: https://www.ibm.com/developerworks/linux/tutorials/l-lpic1105/index.html