写在前面:
tar.xz解压命令:tar vxJf linux-x.x.tar.xz
本文主要讲解内核的编译流程以及grub选项的设置,有什么问题欢迎评论讨论交流。
下面为编译内核流程,由于最近项目需要Ubuntu1204,因此以Ubuntu1204为例,其他版本使用同样的操作,题主在1604上也使用的同样的操作:
一、下载需要的内核
https://mirrors.edge.kernel.org/pub/linux/kernel/
二、将下载的内核代码cp到/usr/src目录下并解压
三、安装基本的工具和相关软件
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
上述工具无绝对,在安装的过程中要注意变通,不要遇到一点问题就卡死,如果有部分工具装不了,可继续往下执行。
四、执行编译前配置工作
依次输入下列命令:
sudo make mrproper
sudo make clean
sudo make menuconfig
其中mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在menuconfig出现选择的图形化设置界面。
下载的源码第一次编译时可以直接使用
sudo make menuconfig
来进行配置。
menuconfig界面如下所示,如果没有特殊的配置,就直接sava->ok->exit->exit
五、编译
执行命令,-jx,这里的x是计算机核数x2,如4核CPU就为-j8,20核cpu可以写为-j40,以多线程的方式进行编译,加快编译速度。
sudo make –j8 或者sudo make
同时要注意,如果你更改了内核源码中的内容,而且不能保证你编写的内容不会出现编译错误,推荐使用sudo make来进行编译,遇到编译错误能够及时停止,并能看到错误信息。-jx的编译方式,如果一个编译线程遇到错误,其他的编译线程还在进行,错误信息会被覆盖,而且不好排查(个人理解)。
原始下载的源码直接用 sudo make -j8编译即可。
以下为编译时截图:
编译完成后如下图所示:
六、安装
如果编译过程正确无误,下一步就是安装,使用如下命令进行安装:
sudo make modules_install //安装内核模块
sudo make install //安装内核
安装模块界面如下图所示:
安装内核界面如下图所示:
至此内核编译和安装就完成了。
编译和安装完成之后,是不是我们直接重启就会是我们最新编译的内核了呢,如果不是Ubuntu又是怎么选择的内核来进行启动呢。
首先我们先进行一个测试,安装完后直接重启,看一下内核有没有被我们新编译的内核替换:
重启后使用uname -r或者uname -a进行查看,其输出的信息如下图片所示。
uname -a
uname -r
通过上述图片发现,Ubuntu1204的内核版本并没有被我们新编译的内核所替换,重启后还是原来的内核,那么我们要怎样启用我们编译好的内核呢。
这就是最开始所讲得设置grub的问题了,简单来讲如果我们编译的内核比现在Ubuntu中自带的内核版本高,那么reboot之后,我们编译的高版本内核就会直接被Ubuntu系统启用。如果我们编译的内核版本比自带的低,那么就要修改一下grub的配置选项,将开机选择内核版本的菜单栏显示出来(默认是不显示,通过修改配置文件显示)
七、启用编译好的内核
通过修改grub配置文件,在开机中显示选择内核版本的菜单栏,使用gedit打开配置文件,目录为/etc/default/grub。
gedit /etc/default/grub
打开配置文件之后,我们看到最上面的代码有一些参数的配置,我们需要更改的参数就只有一个即GRUB_HIDDEN_TIMEOUT。
此配置将影响grub菜单显示。若设置此选项为一个常数,则将在此时间内隐藏菜单而显示引导画面。菜单将会被隐藏,如果注释掉该行,即:(#GRUB_HIDDEN_TIMEOUT=0)。则grub菜单能够显示,等待用户的选择,以决定进入哪个系统或内核。
因此我们要做的就是把这一行注释掉,然后输入以下命令,使修改生效:
sudo update-grub
设置成功后重启:
重启后出现如下菜单:
进入到Previous Linux versions选项中
选择我们编译好的Linux-3.10版本即可,进入后,现在查看内核版本信息如下:
Ubuntu已经启用了我们编译的内核,然后就可以开始在上面进行需要的开发了~