一、内核编译
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
便可看到需要删除的内核文件已经不存在,成功卸载内核。