通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过程中的一些实际经验。

内核简介

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

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

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

内核编译模式

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

实际的内核编译阶段:

一、Linux内核源代码包的获取:http://www.kernel.org,编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到/usr/src/下(下文中以2.4.18的内核的linux-2.4.18.tar.gz为例),命令为

#cp linux-2.4.18.tar.gz /usr/src

二、解压源代码包和建立相应的链接:

在当前的/usr/src内容里,注意到有一个linux- 2.4的符号链接,指向一个linux-2.4.7-10(以REDHAT7.2为例)的目录。这就是你所装linux的kernel源代码,删除这个链接。

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

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

#bzip2 -d linux-2.4.18.tar.bz2

#tar -xvf linux.2.4.18.tar

文件将解压到/usr/src/linux目录中,我们把它稍作修改:

#mv linux linux-2.4.18

#ln -s linux-2.4.18 linux(重新建立指向刚刚解压的linux-2.4.18的链接)

三、检查源代码目录下有没有不正确的.o文件以及文件的互相依赖,运行以下命令:

#cd /usr/src/linux

#make mrproper

四、创建指向你所编译内核的asm  linux  scsi链接

为确保/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链接后,再创建新的链接指向新内核源代码目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。

五、内核配置

接下来的内核配置过程比较烦琐,但是配置的适当与否与日后linux的运行直接相关,有必要了解一下一些主要的且经常用到的选项的设置。

配置内核可以根据需要与爱好使用下面命令中的一个:

#make config(基于文本的最为传统的配置界面,不推荐使用)

#make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)

#make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)

#make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,那么就推荐你使用这个命令,界面如下:

如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了,下图为make menuconfig的界面:

选择相应的配置时,有三种选择,它们分别代表的含义如下:

Y--将该功能编译进内核

N--不将该功能编译进内核

M--将该功能编译成可以在需要时动态插入到内核中的模块

如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是 make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"。这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。

至于内核配置的选项在我的以下文章里有简单的介绍:

六、编译,使用以下命令:

#make dep

#make clean

#make bzImage或make zImage

#make modules

#make modules_install

#depmod -a

第一个命令make dep实际上读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要;第二命令make clean完成删除前面步骤留下的文件,以避免出现一些错误;make zImage和make bzImage则实现完全编译内核,二者生成的内核都是使用g***压缩的,只要使用一个就够了,它们的区别在于使用make bzImage可以生成大一点的内核。建议大家使用make bzImage命令。

后面三个命令只有在你进行配置的过程中,在回答Enable loadable module support (CONFIG_MODULES)时选了"Yes"才是必要的,make modules和make modules_install分别生成相应的模块和把模块拷贝到需要的目录中。

严格说来,depmod -a命令和编译过程并没有关系,它是生成模块间的依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。

七、更新部分内容

经过以上的步骤,我们终于得到了新版本的内核。为了能够使用新版本的内核,我们还需要做一些改动:

#cp /usr/src/linux/System.map /boot/System.map-2.4.18

#cp /usr/src/linux/arch/i386/bzImage /boot/vmlinuz-2.4.18

以上这两个文件是我们刚才编译时新生成的。下面修改/boot下的两个链接System.map和vmlinuz,使其指向新内核的文件:

#cd /boot;rm -f System.map vmlinuz

#ln -s vmlinuz-2.4.18 vmlinuz

#ln -s System.map-2.4.18 System.map

八、修改启动管理器

如果用LILO,修改/etc/lilo.conf,添加以下项:

image=/boot/vmlinuz-2.4.18

label=linux240

read-only

root=/dev/hda2

其中root=/dev/hda2一行要根据需要自行加以修改。

运行:

#/sbin/lilo -v

确认对/etc/lilo.conf的编辑无误,现在重新启动系统:

#shutdown -r now

如果是用Grub启动管理器,则添加如下几项即可。

title Red Hat linux (2.4.18)

root (hd0,0)

kernel /vmlinuz-2.4.18 ro root=/dev/hda2

Grub不需再次调用命令,自动生效。

重启以后就可以用新内核了。

编译linux内核生成.ko,Linux内核编译完整过程相关推荐

  1. linux内核生成img,linux内核探索:定制自己的initrd.img-转载并修改

    1. 什么是initrd.img,它有什么用? initrd.img是Linux启 动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块.如果系统的一些设备的驱动编译为可加载模,那么 ...

  2. linux sql生成随机数,Linux的两种随机数生成器

    Linux下有两个特殊设备文件/dev/random和/de/urandom,用于生成随机数./dev/random生成的随机数与当前使用的计算机硬件状态相关,提高了安全性,非常适合对随机数质量要求很 ...

  3. linux 下生成docx,linux下创建、删除文件和文件夹命令.docx

    linux下创建.删除文件和文件夹命令.docx 还剩 6页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 学习 Linux 二(创建.删除文件和文件夹 ...

  4. linux自动生成证书,linux shell自动创建ca证书脚本linux操作系统 -电脑资料

    在linux下创建证书大概是大多数人很头疼的事情,今天我在网上搜到个不错的shell自动创建ca证书的脚本,来分享给大家. 脚本内容:代码如下复制代码 #!/bin/bash # Author: MO ...

  5. linux自动生成证书,Linux生成TLS证书

    安装acme.sh 证书的生成有许多方法,这里使用的是比较简单的方法:使用 acme.sh 脚本生成. 注意:针对debian9系统,在执行安装acme.sh脚本之前,需要提前安装必备软件包.不然会有 ...

  6. db2 迁移 aix linux,DB2从windowsXP迁移至AIX完整过程

    一:安装数据库 1. 用root用户登录,通过smitty user创建实例用户 gjyw,进入DB2安装文件所在目录. 2. 将安装文件目录下所有文件赋全部权限 chomd 777 * 3. 如果使 ...

  7. 基于GUI的mcc编译和dll生成

    基于GUI的mcc编译和dll生成 1.mcc的编译 1.1 MCRInstaller编译器的安装 找到Matlab下的MCRInstaller,双击MCRInstaller编译器,运行安装. 1.2 ...

  8. kali2022编译Linux内核驱动ko文件

    在Linux环境下编译.ko内核驱动文件(运行于本linux系统,非嵌入式),需要保证/lib/modules/xxx的版本与内核版本保持一致,否则编译后的驱动无法运行! 1.更新内核版本及heade ...

  9. Linux 内核模块ko在内核源码外部编译的方法

    前言 默认Linux 内核驱动,可以模块编译为 *.ko 文件,不编译进内核 默认开发Linux 内核驱动,驱动一般放在Linux 内核源码中,如 drivers 目录 本篇尝试在 Linux ker ...

最新文章

  1. android中Textview 和图片同时显示时,文字省略号显示,图片自动靠到右边
  2. 脉冲电子围栏系统介绍_网络型脉冲电子围栏系统介绍
  3. 一个***与一个电脑白痴的经典对白
  4. 需求分析 应该先写业务还是功能_一个套路,拆解常见数据分析需求
  5. iPhone屏幕尺寸/launch尺寸/icon尺寸
  6. Wireshark文档阅读笔记-TCP 3 way handshaking解析与实例
  7. hadoop学习日志
  8. java接口是静态_Java接口(静态方法、私有方法)
  9. 光电自动避障小车_AGV机器人:基于视觉避障的理论基础
  10. zblock 结构_偷窥Data block 的物理结构
  11. bsb 网络验证系统 安装教程 免费的易语言网络验证系统 真正免费 不收钱
  12. 【mcuclub】红外测温-MLX90614
  13. Rhythmbox乱码的解决办法
  14. Android中仿微信选择图片并展示在RecyclerView中
  15. vue项目hash模式改history模式 mand-mobile组件库样式不生效
  16. php htmlpurifier,htmlpurifierPHP过滤库
  17. Android 异常 “Binary XML file line # : Error inflating class”
  18. 得出一个月有多少工作日
  19. landsat、spot、ikonos等各种卫星信息介绍及几种遥感影像下载方法
  20. PDF删除水印与添加水印方法介绍

热门文章

  1. springBoot中tomcat默认端口修改
  2. 强烈抗议抖音关闭`OBS`第三方推流接口的倡议
  3. Kippo开源蜜罐技术-尚文网络xUP楠哥
  4. 地图下钻、地图点聚合
  5. C++入门教程(一、初步了解)
  6. 各大IT公司2012校园招聘笔试面试整理(强烈推荐)
  7. C# WinForm中四种显示信息的方式
  8. 关于CSDN导入Markdown文件时图片转存失败的问题
  9. python打印不同颜色日志logging
  10. 关于面向对象、面向过程区别,我的看法