概述
本文将一步一步介绍如何根据需求配置编译符合自己需求的 Linux内核,以及如何安装编译好的内核和删除不需要的内核。
本文实际操作是在 Ubuntu 操作系统上进行的,其它 Linux 发行版可以参考本方法做适当调整完成内核的添加和删除。
添加内核
添加内核一般来说并不需要,当然也不是完全不需要。安装新内核大体因为以下几种需求:
尝鲜新功能
原来的内核比较臃肿
和硬件兼容
特殊需求
笔者安装新内核就是处于特殊需求。笔者所做的工作是需要用到Linux自带的分析工具——ftrace。该工具中的一些专门性的工具(姑且叫插件吧)在发行版本中并没有编译到内核中去,所以笔者需要重新编译内核将这些插件勾选上,并编译后的内核安装到自己的系统中。整个过程虽说只有简单几步而已,但是笔者还是走了不少弯路。比如,笔者最开始是不想在自己的机器上直接安装新内核的,毕竟有些环境是笔者费了九牛二虎之力才部署好的,再加上对现有系统添加新内核也是大姑娘出嫁——头一回,万一搞不好就废了。所以开始是在virtualbox上搞的,可是在对内核进行配置时执行 make menuconfig 总是提示 curses.h 找不到,在网上扒了半天,安装了和 curses.h 相关的所有库也不行,也是够了。后来,我只好在物理机上搞了,结果还是出现了一些奇葩问题,比如删除内核方法中的第二个就是笔者惨痛的经历。当时笔者是安装好新内核后进入系统所有外设都不可用,只好进入原来的系统中删除新安装的内核,结果就是方法二中的情况了。后来回想起来应该是没有执行 make modules_install 导致驱动啥的都没装。
编译新内核
准备工作
准备工作当然是下载相应版本的内核了,内核官网 www.kernel.org。当然下载方法是多种多样的自不必说,下载后可以将内核放在任何你想放的地方。不过说是这么说,其实最好还是放到 /usr/src 下面,毕竟内核代码都在那呢。当然也有人放到了 /opt/ 下面(可以参考这篇文章:Linux系统替换新内核),这也未尝不可,就当安装一个大型程序嘛。毕竟在执行 # make install 时会把相应的文件拷贝到对应的目录下,源码放在哪并不影响安装内核。
编译
在安装之前需要对内核进行编译,这过中住需要对代码进行清理、配置等工作。
清理
本步骤主要是清理代码中的.o和.config等以前编译过程中产生的文件,而这些文件在不同的机器是不同的,所以必须清除掉。如果是新下载的内核是不用执行该步骤的。总之,这一步也并非必须的,但是做了终究没有什么坏处。具体命令如下。
在本文中,该命令执行目录为/usr/src/linux-3.19.8/,linux-3.19.8是笔者需要安装的新内核,如无特别说明下同。
# make mrproper
配置
本步骤主要是为了配置编译选项,比如哪些模块需要编译到内核中去,哪些是不需要的,哪些是编译成在需要时动态的插入到内核中去的。通过本步骤将生成一个.config文件,该文件记录我们设定的一下规则。大体上,本步可以分两种情况来考虑或者说来解决:
1.直接拷已有的 .config 文件,该文件存在于 /boot/ 目录下,当然并不叫 .config,例如,笔者系统中就是 ***config-3.13.0-32-generic ***,笔者系统中内核原来版本是 3.13.0,如图:
图1 config
可执行如下命令来进行拷贝:
#cp /boot/config-3.13.0-32-generic ./.config
2.根据自己的需求重新配置,这时会在当前目录下生成 .config 文件,具体如何配置方法很多,这里只给出常用方式:
# make menuconfig
执行该命令后会弹出一个基于ncurses图形库的图形界面,如图。
图2 menuconfig
当然,如果你只是想使用新内核的话,选择默认就好,最后保存就可以生成一个 .config 文件的。由于笔者需要使用 ftrace 这款工具,所以还是需要稍加配置,但这不是本文主题,故略去。
编译
配置完成后,就可以对内核进行编译了。这个过程有点长,你可以干点其他的事情了。具体命令如下:
# make
#make 命令相当于执行了 # make bzImage 和 # make modules,由于是本机替换内核,所以无需分开执行。这一步所需的时间较长,为了加快编译速度,我们可以加上 “-j” 选项,后面跟的数字是 jobsnum ,建议设置为 CPU 核心数 + 1,jobsnum 值可以由命令 cat /proc/cpuinfo |sed -n '/^processor/p' |wc -l 获得。
安装内核
安装模块
执行如下命令:
# make modules_install
编译成功后,系统会在 /lib/modules 目录下生成一个 3.19.8 子目录,里面存放着新内核的所有可加载模块(即将编译好的 modules 拷贝到 /lib/modules 下)。
注意: 模块安装一定要在内核安装之前,否则,安装内核时会提示致命错误——在 /lib/modules 找不到对应的模块。
安装内核
执行如下命令:
# make install
该命令的作用是将 .config,vmlinuz,initrd.img,System.map 文件到 /boot/ 目录、更新 grub。默认启动新内核。
删除内核
方法一
1.查看当前系统使用的内核
# uname -a
该条命令可以给出系统当前使用的内核版本的详细信息如:
图3 查看当前内核版本
2.查看系统中已经安装了的内核
# dpkg --get-selections | grep linux
该命令可以查看系统中已经安装过的所有内核,如:
图4 查看所有已经安装了的内核
如上图所示,在该图列表中含image 部分是已经安装过的内核,由以上两步可以确定在图 4 中而不在图 3 中的内核版本是可以删除的。
3.删除内核
完成1-2两步后,我们可以确定将要被删除的内核版本。
# apt-get remove linux-image-****-generic
4.更新 grub
经过以上三步已经很完整的删除了内核版本,但是,这时候开机时还会有被删除内核的选项,这个对于处女座的同志们来说,估计是不能忍的。我们可以通过更新grub.cfg的内容来解决这个问题。
# update-grub
经过以上四步后,就算彻彻底底的删除了要删除的内核了。
然而,事情往往并不是总那么顺利。比如,笔者本人就遇到这样的奇葩问题:在安装内核后,通过
# dpkg --get-selections|grep linux
命令就找不到刚才安装的内核。所以上面的方法看来是不行了,那么,只能使用简单粗暴的方法了。
方法二
1.直接删除 /usr/src/ 下对应要删除的内核代码。
2.删除 /boot/ 下对应的内核相关文件,比如,笔者要删除版本为 3.19.8 的内核,可执行如下命令:
# cd /boot/
# rm -rf *3.19.8*
这样,就可以将相应的 config、System.map、vmlinuz 等文件删除。
3.更新 grub。本步和 方法一 相同,不再赘述。
总结
至此,我们已经在 Ubuntu 操作系统上完成了对内核的配置、编译、安装以及删除的操作。其他 Linux 发行版也可以通过类似的方式对内核进行安装和删除,读者朋友可以自己动手实践起来。
本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。