内核简介

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr /src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的 代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。

想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作 的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系 统,这样就需要重新编译内核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修 改,以符合自己的需要。这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在
Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。

内核版本号

由于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使用者的必要操作内容。

为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:

l 自己定制编译的内核运行更快(具有更少的代码)。

2 系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)。

3 不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞。

4 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些。

内核编译模式

要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build- in),也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度 快,机器一启动,你就可以使用这部分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就是Windows惯用的招数,建议 经常使用的部分直接编译到内核中,比如网卡。如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得
自己来调用这些模块。

新版本内核的获取和更新

Linux内核版本发布的官方网站是http://www.kernel.org,国内 各大ftp上一般都可以找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另外一种是patch文件,即补丁。完整的内核版本比 较大,比如linux-2.4.0-test8.tar.bz2就有18M之多,网速快的用户可以下载使用。完整内核版本一般 是.tar.gz(.tgz)文件或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较
小,一般只有几十K到几百K,极少的会超过1M,网速慢的用户可以使用patch文件来升级内核。但是patch文件是针对于特定的版本的,你需要找到自 己对应的版本才能使用。

编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.0test8的内核的linux-2.4.0test8.tar.gz为例),命令为:

     #cp linux-2.4.0test8.tar.gz /usr/src

  

让我们先来查看一下当前/usr/src的内容,注意到有一个linux的符号链接,它指向一个类似于linux-2.2.14(对应于你现在使用的内核版本号)的目录。首先删除这个链接:

     #cd /usr/src    #rm -f linux

  

现在解压我们下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,请使用下面的命令:

     #tar -xzvf linux-2.4.0test8.tar.gz

  

如果你所下载的是.bz2文件,例如linux-2.4.0test8.tar.bz2,请使用下面的命令:

     #bzip2 -d linux-2.4.0test8.tar.bz2    #tar -xvf linux.2.4.0.test8.tar   

 

现在让我们再来看一下/usr/src下的内容,你会发现现在有了一个名为linux的目录,里 面就是我们需要升级到的版本的内核的源程序。还记得那个名为linux的链接么?之所以使用那个链接就是防止在升级内核的时候会不慎把原来版本内核的源程 序给覆盖掉了。我们也需要同样处理:

     #mv linux linux-2.4.0test8    #ln -s linux-2.4.0test8 linux   

 

这样我们也有了一个名为linux的符号链接,就不用担心以后会把它覆盖掉了(也许你会觉得重新 建立linux的符号链接没有必要,但实际上这是必不可少的,下文中会有介绍)。如果你还下载了patch文件,比如patch-2.4.0test8, 你就可以进行patch操作(下面假设patch-2.4.0test8已经位于/usr/src目录下了,否则你需要先把该文件拷贝到/usr/src 下):

     #patch -p0 < patch-2.4.0test8

  

现在,我们已经把内核源程序升级到最新版本了。

准备工作

通常要运行的第一个命令是:

     #cd /usr/src/linux;make mrproper

  

该命令确保源代码目录下没有不正确的.o文件以及文件的互相依赖。由于我们使用刚下载的完整的源程序包进行编译,所以本步可以省略。而如果你多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。

确保/usr/include/目录下的asm、linux和scsi等链接是指向要升 级的内核源代码的。它们分别链向源代码目录下的真正的、该计算机体系结构(对于PC机来说,使用的体系结构是i386)所需要的真正的include子目 录。如:asm指向/usr/src/linux/include/asm-i386等。若没有这些链接,就需要手工创建,按照下面的步骤进行:

     # cd /usr/include/    # rm -r asm linux scsi    # ln -s /usr/src/linux/include/asm-i386 asm    # ln -s /usr/src/linux/include/linux linux    # ln -s /usr/src/linux/include/scsi scsi

  

这是配置非常重要的一部分。删除掉/usr/include下的asm、linux和scsi链 接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。现在你应该明白为什么我 们上面又在/usr/src下"多余"地创建了个名为linux的链接了吧?下面就可以开始内核编译的旅程了。

重新编译Linux内核必要性及其准备工作的更多相关文章

  1. 自定义配置编译linux内核

    1 编译linux内核原因一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如 ...

  2. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...

  3. Centos下编译Linux内核

    Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...

  4. 编译linux内核时出错

    在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the*** required ...

  5. Mac下重新编译Linux内核

    Mac下重新编译Linux内核 操作系统实验,要求添加系统调用并重新编译内核,这里记录一下编译内核的过程 0.下载VirtualBox 博主一直用parallel desk,但因为驱动等问题,在PD上 ...

  6. 为什么要编译Linux内核?

    新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核. 通常,更新的内核会支持更多的硬件,具 ...

  7. 编译Linux内核(Mac OS平台)

    操作系统第一次实验需要编译Linux内核,我之前在Mac上一直使用的都是Parallels Desktop这个软件,所以这次也将课程网站上提供的Ubuntu安装在了PD上,但是编译完内核后无法进入Ub ...

  8. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核

    HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...

  9. make 编译 linux 内核是单线程的任务 才用-j4命令使用4 线程加速

    今天使用 make 编译 linux 内核,发现CPU只用了30%多一点,而我的电脑是4核的,所以如果没有意外的话,make 编译 linux 内核的任务是用单线程做的. 又了解到,使用-j4参数可以 ...

随机推荐

  1. dfs 与 dijkstra 总结

    Dijkstra: //寻求加权图起始点到各个节点的最短路径 for i <- 1:n do distance[i] <- INF; distance[0] <- 0;//起始节点距 ...

  2. Func常用模块及API

    Func常用模块及API Func提供了非常丰富的功能模块,包括: CommandModule(执行命令) CopyFileModule(拷贝文件) CpuModule(CPU信息) DiskModu ...

  3. redis通过pipeline提升吞吐量

    案例目标 简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用. 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元: 然 ...

  4. VLAN 模式下的 OpenStack 管理 vSphere 集群方案

    本文不合适转载,只用于自我学习. 关于为什么要用OpenStack 管理 vSphere 集群,原因可以有很多,特别是一些传统企业,VMware 的使用还是很普遍的,用 OpenStack 纳管至少会 ...

  5. Git:fatal: refusing to merge unrelated histories

    如何去解决fatal: refusing to merge unrelated histories 先pull,因为两个仓库不同,发现refusing to merge unrelated histo ...

  6. LNMP搭建02 -- 编译安装Nginx

    [编译安装Nginx]   为了顺利安装Nginx,先安装下面这些: [CentOS 编译 nginx 前要做的事情] yum install gcc gcc-c++ kernel-devel yum ...

  7. LNMP搭建01 -- 编译安装MySQL 5.6.14 和 LNMP相关的区别

    [编译安装MySQL 5.6.14] [http://www.cnblogs.com/xiongpq/p/3384681.html ]  [mysql-5.6.14.tar.gz 下载] http:/ ...

  8. python学习:备份文档并压缩为zip格式

    import os import time source = ['/root/notes'] target_dir = '/root/backup' if not os.path.exists(tar ...

  9. 10分钟入门kubernetes(上)

    kubernetes简称k8s, 主要用途是automate deployment, scaling, and managment of containerized applications.是目前非 ...

  10. Java经典编程题50道之十

    一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下……求它在第10次落地时,共经过多少米?第10次反弹多高? public class Example10 {    public sta ...