自己动手编译Linux内核

一、实验目的

学习重新编译Linux内核,理解、掌握Linux内核和发行版本的区别。

 

二、实验内容

在Linux操作系统环境下重新编译内核。实验主要内容:

A. 查找并且下载一份内核源代码,本实验使用最新的Linux内核2.6.36。

B. 配置内核。

C. 编译内核和模块。

D. 配置启动文件。

本次实验环境是Linux2.6.35内核的环境下,下载并重新编译内核源代码(2.6.36);然后,配置GNU的启动引导工具grub,成功运行编译成功的内核。

 

三、主要仪器设备(必填)

Linux环境:utuntu10.10,linux内核2.6.35

待编译内核:linux2.6.36

 

四、操作方法和实验步骤

【1】下载内核源代码

从http://os.zju.edu.cn/newlinux/files/jijiangmin网站上下载最新的Linux内核2.6.36。

 

【2】部署内核源代码

打开终端,更改用户权限为root。具体做法是在终端输入sudo su,然后按提示输入密码。判断是否是root用户是使用whoami命令,若输出为root则已经切换到root账户。

输入mv linux-2.6.36.tar.gz  /usr/src,目的是把下载的内核源代码文件移到/usr/src目录。

输入cd /usr/src切换到该目录下。

输入tar zxvf linux-2.6.36.tar.gz,目的是解压内核包,生成的源代码放在linux-2.6.36目录下。

输入cd linux-2.6.36,切换到该目录下。

输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config,目的是使用在boot目录下的原配置文件。

 

【3】配置内核

配置内核的方法很多,主要有如下几种:

#make menuconfig  //基于ncurse库编制的图形工具界面

#make config  //基于文本命令行工具,不推荐使用

#make xconfig  //基于X11图形工具界面

#make gconfig  //基于gtk+的图形工具界面

由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。

对每一个配置选项,用户有三种选择,它们分别代表的含义如下:

<*>或[*]——将该功能编译进内核

[]——不将该功能编译进内核

[M]——将该功能编译成可以在需要时动态插入到内核中的代码

本实验在make menuconfig后,把ext2和ext3文件系统编译进内核。如果用户是在虚拟机下编译的,那么一般要把SCSI设备编译进内核。不是在虚拟机下编译的也可以把它编译进去,不会有什么影响的。

 

【4】编译内核

这步是时间最长的一个步骤,一般在3个小时左右。

编译内核只需在终端输入make,然后等待编译的完成。

 

【5】编译和安装内核模块

输入make modules_install,这步很快能完成。

 

【6】安装内核

输入make install

 

【7】生成启动

依次输入:

sudo mkinitramfs -o /boot/initrd.img-2.6.36

sudo update-initramfs -c -k 2.6.36

sudo update-grub2  //自动修改系统引导配置,产生grub.cfg启动文件。

 

五、实验结果和分析

把内核源代码移动到目录/usr/src,如下图

 

在成功执行语句

sudo mkinitramfs -o /boot/initrd.img-2.6.36

sudo update-initramfs -c -k 2.6.36

后的boot目录,如下图

 

在成功执行语句

sudo update-grub2

后grub.cfg文件中增加了新内核的启动项,如下图

 

在所有的实验步骤成功完成后,重新启动,可以发现在启动项中多了两项,分别为Linux2.6.36模式和Linux2.6.36 recovery模式,选择Linux2.6.36模式,进入新的内核,若在启动过程中没有跳出错误提示,表示已经成功了。

进入系统后,打开终端,输入uname -a,输出如下图,表明现在已经是2.6.36的内核了

 

常用命令:编译内核: 
# cd /usr/src/linux 
# make dep -----链接程序代码与函数库. 
# make clean -----删除不必要的模块和文件. 
# make bzImage -----开始编译系统内核. 
# make modules -----开始编译外挂模块. 
# make modules_install -----安装编译完成的模块. 


# mkinitrd /boot/initrd-2.2.5-15.img 2.2.5-15


编译64位内核

    make ARCH=x86_64 menuconfig
    make ARCH=x86_64
    make ARCH=x86_64 modules_install
    make ARCH=x86_64 install