红联Linux门户
Linux帮助

Ubuntu编译内核

发布时间:2014-08-06 15:55:44来源:linux网站作者:linux

一、内核编译

1、下载内核源代码
http://www.kernel.org/下载自己想要编译的新内核,点后面的“F” 按钮下载文件。


2、安装有关编译程序。安装make, gcc, make-kpkg,运行menuconfig等等和编译内核相关的工具。安装不了,请检查/etc/apt/sources.list 文件。

执行命令:
$sudo apt-get install build-essential kernel-package libncurses5-dev


3、在终端输入su 命令切换到root权限,然后把linux-版本号.tar.bz2文件复制到/usr/src/ 目录下。如果出现su:认证失败,则证明root密码尚未设置。Ubuntu默认root无密码,但是第一个user在admin组,它可以给root设置密码。
sudo passwd root
[sudo] password for 用户名: <-输入密码
输入新的UNIX密码: <-输入新密码
重新输入新的UNIX密码: <-重新输入新密码
passwd:已成功更新密码


4、cd 到/usr/src/目录下,执行tar -jxvf linux-版本号.tar.bz2命令解压源代码包。就会解压到/usr/src/ linux-版本号文件夹。


5、开始编译前的准备工作。
首先,清理以前编译时留下的临时文件。如果是刚刚解开的包,不需要执行这步。如果是第二次或者是第n次编译,那么一定要执行。接着cd到/usr/src/ linux-版本号文件夹。执行make mrproper命令(root用户)。该命令可确保源代码目录下没有不正确的.o文件.config文件等。

网上很多教程上说把现在使用的内核的config拷贝过来参考,据实验,是不需要的,ubuntu还有debian会自动做这步。


6、开始配置内核选项。执行命令: make menuconfig(此时最好选择加载之前的内核.config文件,在之前的配置基础上添加新的需要添加的新特性生成新的.config文件 。)

你会发现画面主要分为两大部分,一个是大框内的反白光柱,另一个则是底下的小框,里面有 select, exit 与 help 三个选项的内容。这几个组件的大致用法如下:
『左右方向键』:可以移动最底下的 <Select>, <Exit>, <Help>项目;
『上下方向键』:可以移动上面大框框部分的反白光柱,若该行有箭头 (--->) 则表示该行内部还有其他细项需要来配置的意思;
选定项目:以『上下键』选择好想要配置的项目之后,并以『左右键』选择 <Select> 之后, 按下『 Enter 』就可以进入该项目去作更进一步的细节配置;
可挑选之功能:在细节项目的配置当中,如果前面有 [ ] 或 < > 符号时,该项目才可以选择, 而选择可以使用『空白键』来选择;
若为 [*] <*> 则表示编译进核心;若为 <M> 则表示编译成模块!尽量在不知道该项目为何时,且有模块可以选,那么就可以直接选择为模块!
当在细项目选择 <Exit> 后,并按下 Enter ,那么就可以离开该细部项目!
基本上建议只要『上下左右的方向键、空白键、Enter』这六个按键就好了!不要使用 Esc ,否则一不小心就有可能按错!另外,关于整个核心功能的选择上面,建议你可以这样思考:

『肯定』核心一定要的功能,直接编译进核心内;
『可能在未来会用到』的功能,那么尽量编译成为模块;
『不知道那个东西要干嘛的,看 help 也看不懂』的话,那么就保留默认值,或者将他编译成为模块;

总之,尽量保持核心小而美,剩下的功能就编译成为模块。


7、开始编译内核。

1)Ubuntu的工具是make-kpkg,和其他的发行版相比,步骤相对简单。执行命令:

#make-kpkg clean

#make-kpkg --initrd --append-to-version=-用户kernel-image kernel-headers

编译完成后,将会再当前目录的上级目录下生成两个deb文件,linux-image--XXX.deb,linux-headers-XXX.deb文件,这就是我们需要的内核包。 在 " --append-to-version= "之后,你可以写任何有助于标志内核的字符串,但前提是必须以-符号作为开头,中间不能有空白字符。

2)当然,也可以使用一般的编译方法。即运行make命令。执行之前可以先运行make clean 清空生成的内核文件,或者编译中间有问题了,想重新编译,可以用这个命令先清空已经生成的内核文件。

这个make相当于,手工执行了一下两步:

# make bzImage

# make modules (编译可加载模块)

其中make bzImage 将在 /usr/src/ linux-3.2.32-srf/arch/i386/boot 目录下生成一个名字为bzImage的内核镜像文件。运行make zImage 命令其实也可以生成内核镜像,bzImage 的区别就是它是压缩的。运行make modules 命令则是生成大量的 *.ko 内核文件,就是模块化的内核驱动等,不编译进bzImage里面去的都会另外单独生成的一个ko文件,以后需要的时候再由内核加载这个ko模块。


8、安装编译好的内核包。

1)如果在编译内核的时候使用的是方法1),则 进入当前内核源码目录的上级目录,进行安装。执行指令:

#cd ..

#dpkg -i linux-image-(按tab键)

#dpkg -i linux-headers-(按tab键)

2)如果在编译内核的时候使用的是方法2),则执行一下步骤:

1>执行make install命令。运行这一步之后,ls -l看一下/boot目录,发现已经把vmlinuz 文件链接到 vmlinuz-3.2.32srf 文件 System.map文件链接到 System.map-3.2.32srf 文件,config 文件链接到 config-3.2.32srf文件。

2>没有看到模块的配置信息输出,所以我又执行了一下 make modules_install 命令,这个是安装模块的。这个会安装很多 ko文件,最后输出DEPMOD 3.2.32srf。不懂这个流程是什么样子的。不过在/lib/modules/目录下面生成了一个 3.2.32srf的目录,下面 目录就是上面make modules生成的那些ko内核模块文件。

3>上面的编译过程会生成initrd镜像文件,/boot/目录里面的initrd.img-2.6.25.7srf文件,大小2.2MB。如果发现未生成,可以ubuntu系统下可使用 mkinittramfs 命令来生成。运行一下 "mkinitramfs -o initrd.img-3.2.32srf 3.2.32srf" ,将在当前目录下生成一个名字为 initrd.img-3.2.32srf的initrd 镜像文件。将它移到 /boot/ 目录里面去即可。

注:最后的参数“3.2.32srf ”是指定内核版本,就是/lib/modules/ 目录下相应的文件夹名字。这个一定要指定,不然他默认使用的是正在运行的系统的版本,最后系统就不能引导成功。

做完上面步骤之后,重启系统,等到系统提示按 ESC 键的时候,可以选择和进入GRUB的菜单。可以看到自己的内核版本已经显示出来了。

选择进入之后,一切正常。使用uname -r 命令查看,可以看到当前内核已经被更新了。


二、内核卸载

首先执行命令:dpkg --get-selections|grep linux

列出所有安装的内核,如下图(带有image的就是内核文件)。从中选择要卸载的包,用apt-get来卸载。

具体的卸载方法为执行命令:

sudo apt-get remove linux-image-XXX

sudo apt-get remove linux-headers-XXX

就可以实现自动删除内核文件了,还可以释放磁盘空间。

此时再执行命令:dpkg --get-selections|grep linux

便可看到需要删除的内核文件已经不存在,成功卸载内核。