手动编译内核

一般来说,内核的核心功是直接在内核里,要想让内核支持其他功能,通常具有以下三种选择:

1、不使用该功能

2、将这些功能编译成模块的形式

3、将这些功能直接编译进内核当中

手动编译的方式

使用make gconfig命令,不过使用该命令适用于Gnome桌面环境,且需要安装图形开发库

使用make kconfig命令,该命令适用于KDE桌面环境,且需要安装图形开发库


不过最常见的方式是使用make menuconfig命令来编译,使用该命令会产生一个窗口界面

在该窗口下有许多参数可以选择。

然后执行make命令进行编译即可。

接着执行make modules_install来安装编译的模块。

最后执行make install来完成整个编译过程。


在二次编译前,最好先执行make clean命令来清理上次编译过程中产生的一些二进制模块,核心文件(.config)不会被清理掉。

如果是第一次编译,也最好执行make mrproper命令来清理一些残留文件,不过该命令也会将核心配置文件(.config)删除掉,所以建议在执行该命令前,如果有.config文件,最好将 .config文件备份一下。


内核编译步骤

1、将某个内核解压缩到/usr/src/目录下

2、使用cd命令切换到/usr/src目录下

3、在/usr/src目录下有一个内核目录,为这个内核目录创建链接文件

4、切换到这个链接目录下,里面存放里许多和内核有关的文件

5、使用命令make menuconfig来打开一个文本窗口(如果使用该命令打不开的话,把终端窗口最大化)

    在这个文本窗口下:

    [*]:表示将该功能直接编译到内核,按Y键表示编译进内核

    [M]:表示将该功能做出模块,按M键表示编译成模块

    []:表示不启用该功能,按N键表示不启用此功能

    在每个选项后面如果出现箭头,表示该选项还有其子选项,按Enter键可进入子选项界面

    如果选择完所有功能后,按两次ESC键,即可回到退出界面,在按YES键即可保存之前的选择配置

6、保存配置完成之后,会在当前目录下生产一个.config文件

7、在使用make进行编译

8、使用make modules_install安装内核模块

9、使用make install命令安装内核即可


不过使用这种方式编译的内核花费时间长,可能在系统启动过程中出现许多的错误,或者是某些功能没有编译到内核中而需要重新编译。因此,为了提高编译的成功率,我们可以将当前系统内核所使用的config配置文件,直接复制到链接目录下,并重命名为.config,之后的步骤和之前一下,不再详述。


例如:编译linux-2.6.28.10.tar.gz这个内核文件

1、将linux-2.6.28.10.tar.gz解压缩到/usr/src/目录下

wKiom1PiICahutOFAAAsugZiEZE972.jpg

2、切换到/usr/src目录下,为linux-2.6.28.10创建一个符合链接,叫linux

wKiom1PiIKaDE3MsAAEfKDiFNIA648.jpg

3、切换到linux目录下去,复制/boot/config-2.6.18-308.el5到当前目录下,并重命名为.config文件

wKioL1PiItGAdWbeAAFmbZVXYK8354.jpg

4、在当前目录linux目录下,使用make menuconfig命令来打开一个文本菜单选项,里面是内核所有的功能和参数

wKioL1PiM4mTVajIAAKIr9NB4CU232.jpg


5、使用make命令编译

6、在安装内核之前,先使用命令make modules_install来安装之前选择的模块。

    这些安装的模块放在/lib/modules/`uname -r`/目录下

7、使用make install来安装内核


如果安装一切顺利的话,那么在/boot/grub/grup.conf文件中,会出现一个title,因此在下一次启动时,如果选择这个title,那么系统会去加载这个title中的内核,系统也可以顺利开机。



部分编译

有时候我们需要的功能或者模块没有编译进来,如果重新编译的话就会比较麻烦,因此,一般情况下,我们可以实现部分编译

对于部分编译我们可以分为以下几种状况:

1、只编译某个目录下的相关代码

make dir/  :只需指定某个目录即可,就会对指定目录下的代码重新进行编译

例如:重新编译arch目录,该目录是kernel的核心功能

make arch/


2、只编译部分模块

make M=dir/

例如:只编译驱动程序中关于网络的模块

make M=drivers/net/


3、只编译某一个模块

make /dir/Modules_name

例如:只编译驱动程序中的网卡模块

make drivers/net/pcnet32.ko


4、将编译完成的结果放在指定目录下

make   o=/path/to/directory




编译内核时注意事项

当我们使用ssh远程登入到某个主机上去的时候,在编译内核的时候,如果ssh远程登入突然中断了,那么此时编译也跟着中断,那么我们就需要重新编译。为了解决这个问题,我们可以使用screen命令来打开一个界面(屏幕),在这个界面下编译内核时,如果ssh远程登入中断了,当再次远程登入screen界面的时候,我们可以返回到当时编译内核的界面,这样就可以继续编译内核了。

有关screen命令介绍如下:

screen命令:
screen -ls: 显示已经建立的屏幕
screen   -S NAME: 直接打开一个新的屏幕。-S选项可以建议一个名为NAME的窗口。
screen -r ID: 还原回某屏幕(ID使用screen -ls命令可以查看的到)

screen -d ID:暂停某个屏幕。

Ctrl+a, d: 拆除屏幕(就是暂停这个屏幕)

exit: 退出某个屏幕



有时候我们在编译kernel时,要编译某个驱动程序,但是又不知道自己本机的硬件是否支持,这样就容易将那些不用的驱动程序编译进内核或者模块,而我们本机硬件所对应的驱动程序没有编译进内核或模块。因此为了方面我们自己关于如何查看本机硬件设备信息,这里提供了几个常用命令可供我们查看。

查看本机硬件设备信息

cat /proc/cpuinfo:查看CPU硬件信息
cat /proc/meminfo:查看内存信息

cat /proc/interrupt:查看中断信息

lsusb:显示所有USB设备信息

lspci:显示所有连接PCI总线设备信息

hal-device:Hardware Abstract Layer显示所有设备的详细信息