编译环境: 虚拟机下的 Ubuntu18.04.1(LTS)
内核知识简述
首先简单介绍一些有关Linux内核的知识,这些知识可以要你对Linux有一个全新的认识。
Linux内核历史
Linux发行版本很多,但是他们共同的特征就是使用了Linux内核。Linux内核是基于C语言编写的符合POSIX标准的类Unix操作系统。内核是操作系统最基本的部分,也是最核心的部分。Linux内核于1991年由当时的芬兰大学生Linus Torvalds开发。目前linus仍然致力于内核的设计、开发和维护,目前通过https://www.kernel.org网站发布与提供Linux所有版本的内核以及补丁。在GitHub上也有一份Linux 内核的镜像文件,地址:https://github.com/torvalds/linux。不过Linus本人根本不想从 GitHub 接受 PR,可以拿来看看,但是不要随便发issue。
可以这么说,当你真正了解内核的时候,你才算真正的懂Linux以及Linux的运行原理、工作机制,你才能从根本上来定制属于自己的Linux系统。当然这是属于系统底层的知识,并不需要每个使用Linux的人都了解内核。
Linux内核简介
内核指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核并不是一套完整的操作系统。内核负责管理系统的进程,内存,设备驱动程序,文件和网络系统,决定着系统的性能和稳定性。
当前系统的内核存放到/boot
目录,我们可以进入该目录查看。同时/boot目录也存放了引导。
linux内核版本号说明
使用uname -r
命令可以查看当前系统的内核版本。
说明: 4.15.0-34-generic
- 4代表的是内核主版本号,15代表的是次版本号,为不稳定版本(偶数是稳定版本,奇数是过渡版本),0代表的是末版本号,属于修订版本号(扩展版本号),表示修改次数。(以上版内核版本号说明是最新的内核版本命名方式,为Linux内核的第三种命名方式)
- 34为建立(build)号,每个建立可以增加少量新的驱动程序或缺陷修复。
- generic 为通用版本的意思。 一些发行版本还会出现“pp”字样,就是“pre-patch”的意思,属于内核的测试版本。
编译内核的优劣
那么,现在问题来了,我们下载的系统不是已经有稳定的Linux内核了吗,为什么还要编译内核?
大部分情况是完全不用手动编译内核的,我们下载的系统默认已经安装了使用广泛的内核。但是我们仍然有其他理由来重新编译内核:
- 最优化服务器
- 处于安全原因需要禁止某些默认功能
- 添加系统默认未作选择的功能
- 为计算机更换超越原内核负载能力的硬件
- 需要更改无法用/proc/sys来变更的内核运行参数
- 更好的匹配用户计算机上的硬件特质
- 从根本上更好的定制系统,使系统更加符合自己的风格,这种方式是最彻底最高效的
通常新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快,更稳定,并且会修复老版本中的漏洞。
以上都是关于重新编译内核的好处,当然也有弊端。
以下是我从实践中总结的几点:
- 难度较大,不适合Linux新手
- 过程复杂,要想完全的编译内核的话,整个过程过于繁琐复杂,时间周期会很长
- 不能出错,一旦出错,整个系统就会全部崩溃
综上所述,至于你需不需要编译内核,你需要想清楚,因为你一旦开始编译,你就不能停下也不能退回到系统初始状态了。一旦失败,你会发现你连桌面都进不去,如果要做就做好承担风险的准备。
内核编译方式
目前,我已知的有4种编译方式:
- make config # 基于文本的配置界面,但操作极为麻烦,适合专业人员
- make menuconfig # 基于文本菜单的配置界面,需要在终端下使用
- make xconfig # 基于图像化窗口的配置界面,适合在桌面环境下使用,最适合初学者使用
- make oldconfig # 在原来内核配置基础上修改一些小地方
编译的整个原理和操作方法是十分复杂的,如果你有兴趣的话,可以去看看一些关于内核编写的书。
配置内核
本文采用最普遍最常用的编译内核方式:make menuconfig
这里只是给出了较为简单的编译内核方式,如果要真实的编译内核,你需要根据具体的需求来配置不同的参数进行编译。
环境准备
- 保证网络环境良好
- 系统磁盘容量足够(40~60g,编译的选项越多占用磁盘容量越大)
- 保证系统文件完整,也就是你没有删除过任何的系统自带的文件系统(在编译时候很可能因为文件系统不完整而出错)
需要提醒你的是,你最好在虚拟机中做这个实验,而且最好给虚拟机开快照,以便你编译出错的时候还可以回退回来,不至于重新安装系统。
下载内核
linux内核官方网站:http://kernel.org/
这里我选择https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/中的版本号为4.18.11
的当前最新稳定版。
其中每个版本的内核都有2种不同的压缩方式,还有一个扩展名为sign的文件用于内核验证。
把下载好的内核压缩包解压进/usr/src目录1
bingyu@ubuntu:~$ sudo tar xvf linux-4.18.11.tar.xz -C /usr/src
搭建环境
先刷新软件包列表1
sudo apt-get update
安装gcc编译器。1
sudo apt-get install gcc
如果你的系统已经自带了gcc,就不用安装了。使用gcc -version
查看是否已经安装。
安装运行库。这个会消耗很长的时间,中途一定不要终止。1
sudo apt-get install fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
安装过程中会弹出这个:
直接enter确定即可。
如果你全部安装成功,是不会出现任何报错信息的。
如下图即为安装成功。
如果你安装失败的话,你可以重新运行以上安装命令再次安装一下。
配置内核
在正式编译内核之前,我们首先必须配置需要包含哪些模块。当然,我们初次编译时,可以采取一些简单的方式来进行配置。我们可以把原来内核拥有的配置文件直接拿来用。
使用如下命令来完成:1
bingyu@ubuntu:~$ sudo cp /boot/config-4.15.0-34-generic/.config /usr/src/linux-4.18.11/
此处我个人建议你开虚拟机全屏,并且把终端也是全屏显示。不然会出现如下报错(你的显示器太小,无法运行menuconfig)。
OK,打开是这样的。
在此窗口下,使用上下左右键进行选择,选择哪一项,回车即可。
然后我们需要小心的配置,如果你不确定哪一步怎么做,就放弃操作,不要瞎点。
此处由于我们已经把配置文件复制过去了,所以我们不需要一个一个的点了。如果你要一个一个去设置的话,应该需要一个月时间。
我们不进行选择,直接选择“save”,然后回车,会提示你
然后再回车即可退出。
最后选择e退出menuconfig窗口。
定制完内核后,我们所设置的编译选项全部会保存到.config文件,用ls-a查看。
你也可以使用cat
命令查看其内容。
下面开始编译。1
bingyu@ubuntu:~$ sudo make
应该会需要2~5小时吧。你现在可以做其他事。再次提醒保证你的磁盘容量足够,不然中途会因磁盘满而停止,就前功尽弃了,40-60g应该是足够的。
此刻就不要再用你的计算机了,而且记着关闭其他正在运行的软件。只保留终端即可。
下图是我编译结束的样子,花费了差不多4个小时。(这个过程的时间长短与你编译的选项多少有关,如果你省略了大部分的编译选项,那么编译将会很快完成。)
编译和安装
用如下的命令安装那些之前启用的模块:1
bingyu@ubuntu:~$ sudo make modules_install
使用这个命令来安装内核:1
bingyu@ubuntu:~$ sudo make install
这个命令仍然会花费很长时间,你可以去做其他的事。
启用内核作为引导
使用这个命令来实现:1
bingyu@ubuntu:~$ sudo update-initramfs -c -k 4.18-rc2
其中的4.18
替换为你编译的内核版本号。
更新grub1
bingyu@ubuntu:~$ sudo update-grub
好了,现在全部工作已经做完, 你可以重启系统了。
当我们再次进入系统后,你可以再次运行uname -r
来查看一下内核版本,是否和你重新编译的内核版本一致。
在编译完成后,可能会生成一大堆的附属文件,这些文件对系统本身是没有用的,所以是可以删除的,但是如果你不确定这个文件是否需要删除,那么就保留。
本文作者:冰羽
本文地址: https://bingyublog.com/2018/10/09/Linux内核编译/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!