《Linux 基础》教案
第七章 Linux内核的管理与定制
1. 回顾上一章: [10分钟] 3
2. 课程知识点讲解: 3
2.1. 核心基础 3
2.2. 升级核心前的准备 4
2.2.1. 查看系统中的设备 4
2.2.2. 核心源代码的获取与安装 6
2.3. 内核的定制 8
2.3.1. 模块的概念与作用 9
2.3.2. 内核定制的方式 10
2.3.3. 内核定制过程概述 12
2.4. 内核与模块的编译与安装 12
2.4.1. 编译、安装内核文件 12
2.4.2. 更新配置文件 12
2.4.3. 模块的安装与管理 12
3. 本章总结 [10分钟] 13
4. 考核点 13
5. 测试题 13
6. 扩展部分: 13
7. 学员问题汇总: 19
8. 作业: 19
授课教师:师资培训
课时:2小时
本章主要的目的
了解Linux内核的作用和基本功能
获取Linux内核的源码包,并进行安装
掌握内核的多种配置方法
了解内核配置项的含义
掌握内核的编译方法
掌握内核模块的编译与安装
在Linux系统中应用新内核
本章重点
获取Linux内核的源码包,并进行安装
掌握内核的多种配置方法
掌握内核的编译方法
掌握内核模块的编译与安装
本章难点
获取Linux内核的源码包,并进行安装
掌握内核的编译方法
1. 回顾上一章: [10分钟]
Linux应用程序基础
RPM包管理
应用程序编译
库管理
2. 课程知识点讲解:
2.1. 核心基础
Linux 拥有现在操作系统所具有的很多功能:
真正的抢先式多任务处理,支持多用户
内存保护
虚拟内存
支持对称多处理SMP(symmetric multiprocessing),即多个CPU机器
符合POSIX标准
网络功能完善
图形用户接口和桌面环境
速度和稳定性
严格说,Linux 并不是一个完整的操作系统。当我们在安装通常所说的Linux 时,我们实际安装的是很多工具的集合,这些工具协同工作以组成一个功能强大的实用系统。Linux 本身只是这个操作系统的内核,是操作系统的心脏、灵魂、指挥中心。整个系统应该称为GNU/Linux 。
内核是一个操作系统的核心,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。内核以独占的方式执行最底层任务,保证系统正常运行,协调多个并发进程,管理进程使用的内存,使它们互相之间不产生冲突,满足进程访问磁盘的请求等等。
为什么要学习使用内核
通过阅读内核源代码,可以了解操作系统的工作原理;
可以根据主机硬件的具体情况,定制Linux内核,这样就需要重新编译内核;
对内核源代码进行修改,以满足特定功能的需要,并且可以把对内核的修改作为内核补丁进行发布,让更多地人分享你的成果。
为什么要升级内核
Linux 发行版本中的内核不一定适用于所有的系统,配置与升级内核有利于用户解决系统中的许多问题:
现在内核中会不断暴露出漏洞,需要打补丁后重新编译内核,以便系统能够更加安全地运行;
新的内核版本通常会提供用户所需要的新功能;
新的内核版本会支持较新的硬件设备正常工作;
正确地为主机配置个性化的内核会使系统运行得更加快速、稳定。
2.2. 升级核心前的准备
需要充分掌握系统中的硬件信息以便正确配置内核选项、获得Linux 内核的源码包。
2.2.1. 查看系统中的设备
我们可以通过命令和相应的文件来查询系统中的设备信息,充分了解系统中的硬件信息对于进行内核配置大有益处。
(1). 查看主机的CPU信息
命令:more /proc/cpuinfo
(2). 查看主机PCI 设备信息
目前主机的许多设备都属于PCI设备,那么如何来查看PCI设备信息
命令:lspci
(3). 查看当前的Linux 操作系统所使用的内核模块(module)
在对新内核进行配置时应充分参考当前Linux 内核的配置,查看当前内核模块的使用情况并作为配置新内核的依据。“module”文件中包含了当前Linux 操作系统所使用的内核模块。
命令: more /proc/modules
2.2.2. 核心源代码的获取与安装
一、获取Linux 内核源代码
(1) 从发行版本中获得Linux 内核源代码。
在各种知名的Linux发行版本中都会包含Linux 内核源代码包,以便用户可以对Linux 内核进行定制和打补丁。
在Red Hat Linux 9的第二张安装光盘中包含Linux内核的源代码包,文件名是“kernel—source—2.4.20—8.i386.rpm”。
(2) 从网络下载Linux 的内核源代码。
对于Linux内核,有很多网站可以提供源代码的下载
① 从Linux内核的官方站点下载最新的Linux内核源代码。
Linux内核官方站点(http;//www.kernel.org)负责Linux内核的权威发布,用户可以到该站点上下载内核的最新发布。
在kernel.org站点中提供了Linux内核各个大的版本的最新下载(包括稳定版和开发版),用户可以在该站点以第一时间下载最新的Linux 内核版本。Linux内核源代码以压缩包的形式提供,文件名类似“Linux-2.4.24.tar.bz2”。
② 从知名的Linux内核网站下载Linux内核版本的下载,在这里我们介绍一个具有代表性的站点“linuxhq.com” (http;//www.linuxhq.com/kernel)。
“linuxhq.com”最大的特点就是信息全面,在其中可以快速查询到Linux内核的各个版本的信息并进行下载,对于需要获得Linux内核某个特定版本的用户特别方便。
二、安装Linux内核源代码
Linux内核源代码以打包的形式提供,rpm和bz2两种格式的源码包的安装方法不同
(1) 安装Red Hat Linux 9中的RPM内核源码包
# rpm -ivh kernel-source-2.4.20-8.i386.rpm
(2) 安装网络下载的内核源码包
# tar jxvf linux-2.4.24.tar.bz2
2.3. 内核的定制
内核版本号
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。
一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。
开发数就体现在源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。到目前为止,稳定树的最高版本是2.2.16,最新发布的Redhat7.0所采用的就是2.2.16的内核;开发树的最新版本是2.3.99。也许你已经发现和多网站上都有2.4.0-test9-pre7之类的内核,但是这并不是正式版本。内核版本的更新可以访问
http://www.kernel.org。
为什么重新编译内核
Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
自己定制编译的内核运行更快(具有更少的代码)
系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
2.3.1. 模块的概念与作用
一、模块简介
Windows NT是一种微内核的结构,其内核的功能块被划分成独立的模块,在这些功能块之间有严格的通信机制;而Linux则不同,它是一种monolithic(单一大块)结构,也就是说,整个内核是一个单独的、非常大的程序。在这种结构中,部件的添加和删除都相当麻烦,需要重新编译内核。为了解决这个问题,不知道从哪个版本的内核开始,Linux引入了一种称为module(模块)的技术,可以把某些功能代码作为模块动态装载到内核中使用。
模块是一种目标对象文件,需要在内核空间执行,可以把它看作是一组已经编译好而且已经链接成可执行文件的程序。在需要的时候,内核就会实用某种方法调用这些程序来执行特定的操作,实现特定的功能。内核在内核符号表中维护了一个模块的链表,每个符号表对应一个模块,在把模块加载进内核时正确地对其进行解释,并将模块作为内核的一部分来执行;加载进内核中的模块具有所有的内核权限。模块可以在系统启动时加载到系统中,也可以在系统运行的任何时刻加载;在不需要时,可以将模块动态卸载。这样就不用每次修改系统的配置时都要重新编译内核了。
二、模块的优缺点
内核模块的这种动态装载特性具有以下的优点:
1、可以把内核映像文件保持在最小。在编译内核时可以选择把一部分内容当成模块进行编译,这样在最终生成的内核映像文件中就可以不包含这部分内容,从而生成最小的内核映像文件。
2、灵活性好。如果需要实用新的模块,不必重新编译内核,只要把新的模块编译后装载进系统中就可以了。如果对内核源程序进行了修改,也不需要重新编译整个内核,只需要修改对应的部分就可以了。
但是,内核模块的引入也带来了一些问题:
1、这种动态加载的特性不利于系统的性能和内存的利用,会带来负面的影响。
2、装入内核的模块和其他内核部分一样具有最高的权限,使用不当就可能引起系统的崩溃。
3、内核版本和模块版本的不兼容也会导致系统的崩溃,因此必须进行严格的版本检查,这样就使模块的编写变得更加复杂了。
4、有些模块要使用其他模块(例如VFAT就要使用FAT)的内容,模块之间存在一定的依赖关系,这样模块的实用就复杂化了。
由于模块的这种动态装载/卸载的特性,在Linux中大部分设备驱动程序都是使用模块来编写的,例如文件系统(minix、msdos、isofs、smbms、nfs、proc等等)、SCSI设备驱动程序、以太网驱动程序、CD-ROM驱动程序等等。下面让我们介绍一下模块的使用方法。
2.3.2. 内核定制的方式
文本交互 配置界面
首先进入需要配置的内核源代码目录
cd /usr/src/linux-2.4
使用
make config
进入文本交互的配置界面。
文本窗口配置界面
Linux内核文本窗口配置界面在字符终端上实现了基于窗口和对话框的交互配置界面,在对操作环境要求较低的情况下实现了较好的用户配置界面。
(1) 启动文本窗口配置界面
首先进入需要配置的内核源代码目录
cd /usr/src/linux-2.4
使用
make menuconfig
进入Linux内核的文本窗口配置界面。
(2)文本窗口的主菜单配置界面
图形窗口配置界面
Linux 内核在图形窗口配置界面在X-Windows环境下运行,具有界面友好、操作方便的优点。
首先进入需要配置的内核源代码目录
cd /usr/src/linux-2.4
使用
make xconfig
进入Linux内核的图形窗口配置界面。
内核的图形窗口配置界面可以使用鼠标进行操作
内核配置项设置界面
Y 配置某功能编译进内核
M 配置某功能作为模块编译
N 配置不使用某功能(既不编译进内核,也不作为模块编译)
根据原有配置文件自动生成新的配置文件
make oldconfig 命令将根据现有的内核配置文件生成新的配置文件,从而有效地避免大量手工配置内核的工作。
首先进入需要配置的内核源代码目录
cd /usr/src/linux-2.4
使用
make oleconfig
命令将根据现有的内核配置文件生成新的配置文件