Linux是一套开源免费的操作系统,对于刚接触Linux的人来说,尝试自己编译新内核是一项很有意思的学习体验,也有助于熟悉Linux内核功能。本文以Ubuntu为例,展示如何编译Linux内核。
下载与解压内核
Linux内核官方下载地址为:https://www.kernel.org/,下载最新的稳定版即可。
下载完成后,需要将它解压到/usr/src目录下。笔者习惯使用图形化界面的文件管理器,这里需要用到root权限,在终端输入:
sudo nautilus
这样就以root身份打开了一个文件管理器,接着移动解压,解压成功后可以看到内核文件夹。
编译前的准备
编译的过程中需要一系列的软件工具,为编译做准备,在终端输入以下命令逐一下载:
sudo apt-get install libncurses5-dev openssl libssl- dev
sudo apt-get install build-essential openssl
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
如果终端下载的速度过慢,很有可能是下载源的问题,需要将下载源换至国内的镜像网站。在/etc/apt目录下,有一个sources.list文件,先复制一份以作备份,再双击打开它,在Download from项中选择Other…,再找到China,选择一个国内镜像网站即可,换源后下载速度就大大提升了。
配置与编译
编译工具全部下载完成后就完成了准备工作,接下来正式开始编译。首先进入内核所在目录:
cd /usr/src/linux-5.5.9
执行以下2条语句:
sudo make mrproper
sudo make clean
其中make mrproper用于净化源码,make clean用于删除配置时的一些不需要文件。
配置文件
编译前需要对选项进行配置,选择好内核需要哪些功能。配置的方式有很多,笔者采用的是:
sudo make menuconfig
输入后进入字符模式下的图形用户界面,通过方向键和回车操作,在其中选择需要的模块,如果不做改动则是默认的配置,完成后选择save保存。
如果安装了QT工具,则可以输入“sudo make xconfig”命令进行配置。
除了选择内核所需功能模块之外,我们还可以修改系统的版本信息。打开内核目录下的MakeFile文件,前3行分别是此Linux内核的主版本号、修订版本号和次版本号。这里笔者在次版本号后添加了一些数字,可以在最后查看效果(当然笔者将NAME也修改了,但不知道如何查看到效果)。
启动编译
接下来就正式启动编译。首先输入命令:
sudo make j8
最后的数字8表示8线程编译,可以提高编译的速度。建议先查明自己CPU或者给虚拟机分配的CPU信息,选择适当的线程。笔者选择了8线程,但还是等了不少时间的。编译过程比较缓慢,耐心等待它完成。
编译完成后,再分别输入以下2条命令:
sudo make modules_install
sudo make install
第一条命令表示安装内核模块,第二条表示安装内核,等待一小段时间后内核就编译完成了,此时进入boot分区,可以看到已经有编译好的内核了。
编译遇到的问题
实际编译的过程并没有上述的那样顺利,笔者在编译过程中遇到了两个问题都导致编译停止,只能解决后再重新开始编译。
问题1:编译终止,报错:vmlinux error 137。
解决:查明原因是swap交换空间不足,于是按以下方法增加swap分区空间。
首先输入以下命令查看swap空间大小:
free
笔者在编译停止后查看到swap分区总空间只有1G不到,可用部分只剩下了一点点,于是增加了2G的空间。先创建一个swap文件:
cd /
sudo mkdir swap
cd swap/
sudo dd if=/dev/zero of=swapfile bs=1M count=2048
再将该文件转换为swap文件:
sudo mkswap swapfile
最后激活:
sudo swapon swapfile
再次输入“free”命令,可以查看到扩展后的分区空间了。
问题2:编译终止,报错:No space on device。
解决:原因很简单,磁盘空间不足。笔者是在VMWare虚拟机上运行,扩容方式如下:
首先在VMWare的“管理—虚拟机设置”中找到硬盘,选择扩展:
接着打开Ubuntu,在终端下载分区管理工具gparted:
sudo apt-get install gparted
输入命令运行:
sudo gparted
在窗口下方选择分区,右键选择“Resize/Move”,在新窗口中将图示的红色区域向右边拉满即可。
注:在VMWare中增加空间后,这里会在此分区之后显示刚才增加的扩展空间,此图是扩容完成后的结果。
点击“Resize”,确认后就完成了根分区的扩容。
更新grub
编译成功后,离成功还差最后一步,需要更新一下系统的grub列表(Grub是一个启动加载器,用于加载内核):
sudo update-grub2
接着重启,在高级选项中就可以选择新编译好的内核了。重启后会发现系统没有太大的变化,但确实是自己编译的新内核。打开终端输入:
uname -r
可以看到版本号是配置时修改的。
至此,Ubuntu下编译Linux内核就完成了。
参考
- 简书,[linux下拷贝文件的时候出现权限不够的问题]:https://www.jianshu.com/p/14cfe33e0e8e;
- CSDN软件开发网,[ ubuntu换源]:https://blog.csdn.net/zhangmeimei_pku/article/details/79597951;
- CSDN软件开发网,[Ubuntu下编译内核]:https://blog.csdn.net/qq_43688952/article/details/88856354;
- CSDN软件开发网,[ubuntu18.04 编译内核 学习记录]:https://blog.csdn.net/weixin_38180645/article/details/82856407;
- 博客园,[编译自己的Ubuntu内核]:https://www.cnblogs.com/arnoldlu/p/6227843.html;
- CSDN软件开发网,[Ubuntu 16.04扩展swap分区]:https://blog.csdn.net/mika001/article/details/72780953;
- 博客园,[VMware下扩展Ubuntu根分区大小]:https://www.cnblogs.com/hester/p/11439353.html。