前面因为博客园维修,所以内核编译过程一直没有发出来,现在把整个内核过程分享出来。本随笔给出内核的编译实现过程,在编译前需要参照我前面一篇随笔:

Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译前准备(1) :https://www.cnblogs.com/iFrank/p/14556664.html

  切记:注意一点需要参照前一篇随笔,不然编译过程十有八九出问题。

开发环境

  Ubuntu20.04(ubuntu-20.04.2-live-server-amd64.iso)

  系统自带的内核版本:5.4.0-67-generic(上篇随笔的内核版本为5.4.0-42-generic,但是-67版本与-42具体操作一样)

编译过程

  准备工作做完,接下来就要编译内核了。这个编译其实也分了好几个大的步骤,下面首先介绍第一步配置。

  原则上来讲,内核需要配置的项非常多,而且很多涉及到了一般读者并不太熟悉的硬件细节。这样一来,稍不留神就会导致配错项,而这个错误往往是在编译内核时才暴露出来,非常耽误时间。可能大家花费几天甚至十几天的时间都不能编译成功,原因就在于诸多的配置项把自己卡住了。鉴于这种情况,我建议直接使用系统内核已有的配置文件.config,直接使用不容易报错,但是短板也是对应的-只能编译系统已有的内核版本,比如我只能编译5.4.0系列的内核版本,但是在学习过程,这样是非常方便的,系统在安装过程中,就已经根据当前的硬件环境做出了选择。直接拿来用就可以了,非常省事。

  首先把该配置文件,复制到下载并解压好的内核源码目录中,比如本机环境的/home/frank/Desktop/linux-5.4。前面提到,下载的内核源码版本是5.4.0,和当前系统所用的内核版本一致。其原因就在这里,可以非常方便地直接使用系统自带的内核配置文件。注意,在复制配置文件/boot/config-5.4.0-67-generic的同时,需要将其更名为.config,执行下面命令:

1  sudo cp /boot/config-5.4.0-67-generic .config

  前面提到过使用内核命令行参数,禁止内核地址随机化。其实也可以在.config文件中,注释掉CONFIG_RANDOMIZE_BASE配置项以实现禁用的目的。这之后,可以执行命令“make menuconfig”,在图形界面中对.config文件进行配置,按默认的配置就行(kgdb也默认配置好了),直接选择load,选择保存退出即可。

  配置好了以后,先不着急编译。我们需要改一改内核的Makefile文件(即顶层Makefile文件),以去优化编译内核。我们编译内核的目的是为了调试,而优化很多时候会影响调试。比如代码的顺序被改变了,某个变量被优化掉了等等,这常常导致源码和实际运行情况不一致。如何解决?直接修改内核的Makefile文件,我的环境中为/home/frank/Desktop/linux-5.4/Makefile,将其中的-O2优化级别全部替换成-O1(总共有三处)。既然去优化,为什么不直接改成-O0呢?答案很简单,改成-O0或者-Og,后面编译过不了。能降低一点优化级别,也是好的。

  虽然顶层Makefile文件中不能将优化级别变成-O0,但是有可能把某个模块的优化级别降成-O0。比如,当我们需要调试研究某一个模块时,可以在该模块自己的Makefile文件中加入-O0。但是,这个做法并不能保证适合于每一个模块。

  去优化完成之后,我们就可以开始真正编译了。命令也十分简单:

1 sudo make-kpkg --initrd kernel-headers kernel_image

  我在运行过程中,遇到了签名问题报错:

1 make[2]: *** No rule to make target 'debian/certs/benh@debian.org.cert.pem', needed by 'certs/x509_certificate_list'。 停止。
2 Makefile:988: recipe for target 'certs' failed
3 make[1]: *** [certs] Error 2
4 make[1]: Leaving directory '/home/sakura/linux-4.10.12'
5 debian/ruleset/targets/common.mk:295: recipe for target 'debian/stamp/build/kernel' failed
6 make: *** [debian/stamp/build/kernel] Error 2

  需要重新复制/boot/config-5.4.0-67-generic,修改名.config,然后直接修改.config文件,之后重新注释掉CONFIG_RANDOMIZE_BASE配置项,随后执行下面操作:

1 把CONFIG_MODULE_SIG_ALL,
2 CONFIG_MODULE_SIG_KEY
3 和CONFIG_SYSTEM_TRUSTED_KEYS三项注释掉,编译时系统会自动生成一次性密钥来加密,
4 另外记得把CONFIG_DEBUG_INFO=y去掉

  .config配置好之后,重新执行make menuconfig命令,选择load,然后保存即可,随后在当前目录输入:

1 sudo make-kpkg --initrd kernel-headers kernel_image

  如果没有报错就会进行内核编译,耐心等待较长时间后(约3-5小时),会在前一级目录生成两个deb文件:

1 linux-headers-5.4.0_5.4.0-10.00.Custom_amd64.deb

2 linux-image-5.4.0_5.4.0-10.00.Custom_amd64.deb

  两个deb文件位于/home/frank/Desktop目录下。之后在此目录下直接执行下面命令,进行安装就可以了:

1 dpkg -i *.deb

  到此为止,内核就编译完成了。不过,ubuntu 20.04默认情况下,开机是看不到grub界面的,也就无法选择进入新编译好的内核。所以,此时还得修改一个/etc/default/grub文件。将其中的“GRUB_TIMEOUT_STYLE=hidden”注释掉,以显示grub界面;并且将GRUB_TIMEOUT修改成“GRUB_TIMEOUT = 10”,以留出10秒时间让用户选择进入哪个内核:

  同样,最后还需要执行update-grub命令,并重启系统。

  为了便于大家进行内核编译,下面总结性地列出了主要步骤:

第一步:将下载的内核源码5.4.0,解压于目录~/Desktop/linux-5.4中。并假设该目录,就是当前工作目录(即执行pwd命令,将得到路径~/Desktop/linux-5.4);

第二步:# cp /boot/config-5.4.0-67-generic .config;

第三步:# sudo vim .config,注释掉CONFIG_RANDOMIZE_BASE;

第四步:# make menuconfig,选择load,随即保存即可;

第五步:去优化编译,将顶层Makefile中的-O2,改成-O1(总共有三处);

第六步:# sudo make-kpkg --initrd kernel-headers kernel_image;

第七步:# cd ../,回到上级目录,即~/Desktop;
# dpkg -i *.deb,安装生成的两个deb文件; 第八步:修改/etc/default/grub,注释掉“GRUB_TIMEOUT_STYLE=hidden”,并设置等待时间GRUB_TIMEOUT = 10。 第九步:# update-grub
# reboot

编译完成,重新启动选择内核版本

  选择5.4.0版本内核,具体过程如下:

Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译过程(2)的更多相关文章

  1. Ubuntu20.04linux内核(5.4.0版本)编译准备与实现过程-编译前准备(1)

    最近项目也和linux kernel技术有关,调试内核和内核模块.修改内核源码,是学习内核的重要技术手段之一.应用这些技术时,都有一本基本的要求,那就是编译内核.因此,在分析内核调试技术之前,本随笔给 ...

  2. hadoop源码编译——2.5.0版本

    强迫症必治: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using b ...

  3. nginx-1.12.0版本(编译安装)-自定义安装路径

    nginx-1.12.0版本(编译安装)-自定义安装路径 安装路径:/application/nginx-1.12.0 1.前期准备 安装编译需要的gcc和gcc-c++ yum install -y ...

  4. 编译Qt5.0连接MySql5.5数据库的驱动(5.0版本的编译,我记得5.2开始自带了)

    第一步 1.准备好Mysql数据库安装文件,Qt5.0完整的离线安装包,以及Qt5.0的完整的源代码.安装好程序,假设Mysql的安装路径为:C:\MySQL5.5,Qt5.0的安装路径:C:\Qt\ ...

  5. hisi3559的usb无线网卡驱动(rtl8192cu)(一条龙服务:内核编译、驱动编译、iw等工具编译)

    usb无线网卡驱动(rtl8192cu) 内核编译.驱动编译.iw等工具编译  (哈哈,如果有其他问题,麻烦留言:) 环境 板卡:hi3559av100(arm64) 交叉编译链:aarch64-hi ...

  6. AFNetworking 2.5.0版本的使用

    http://www.mamicode.com/info-detail-477899.html AFNetworking 2.5.0版本的使用 http://afnetworking.com/ htt ...

  7. iOS开发---百度地图配置流程,2.6.0 版本 支持64位

      1.首先需要在百度地图下载最新SDK:地址: http://developer.baidu.com/map/index.php?title=iossdk/sdkiosdev-download 2. ...

  8. Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解

    作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ...

  9. Scala 的 Web 框架 Lift 开始 3.0 版本开发

    Scala 的 Web 框架 Lift 开始 3.0 版本开发 http://demo.liftweb.net/ http://liftweb.net/download Lift 框架在不断的成长和改 ...

随机推荐

  1. CSON vs JSON

    CSON vs JSON 今天在github浏览资料时,无意发现了这个很像json,却优于json的cson.故,再次分享给大家! 官方fork文档:https://github.com/xgqfrm ...

  2. 如何使用 js 实现相似图片搜索

    如何使用 js 实现相似图片搜索 以图搜图 https://www.google.com/imghp?hl=en https://www.google.com/imghp?hl=zh https:// ...

  3. 时间轴 timeline

    时间轴 timeline https://www.helloweba.net/javascript/285.html https://www.helloweba.net/demo/v_timeline ...

  4. vue页面切换过渡

    <!--<transition name="slide-left">--> <router-view></router-view>& ...

  5. NGK公链依靠技术创新推动数字经济产业发展

    数字经济更让人们的生活发生了翻天覆地的变化.数字经济的发展要依靠技术的创新,发展出生态新模式.同时数字经济的发展要利用新技术对传统产业进行全面的的改造升级,释放数字对经济发展的放大.倍增作用.打造数字 ...

  6. Java中的CPU占用高和内存占用高的问题排查

    下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...

  7. tomcat运行多个项目同一个端口与不同端口的设置

    一.首先打包项目 这里采用eclipse开发工具,选中项目右击,点击Export进入 选择web下的 WAR file ,点击next 在这里可能有坑,新装的eclipse没有web文件夹 此时需要下 ...

  8. 【Notes_4】现代图形学入门——光栅化、离散化三角形、深度测试与抗锯齿

    光栅化 Viewport Transform(视口变换) 将经过MVP变换后得到的单位空间模型变换到屏幕上,屏幕左边是左下角为原点. 所以视口变换的矩阵 \[M_{viewport}=\begin{p ...

  9. vue:子组件通过调用父组件的方法的方式传参

    在本案例中,由于子组件通过调用父组件的方法的方式传参,从而实现修改父组件data中的对象,所以需要啊使用$forceUpdate()进行强制刷新 父组件: provide() { return { s ...

  10. Python和JavaScript在使用上有什么区别?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.freecodecamp.org/news/python-vs-javas ...