Linux实训——编译升级Linux内核

山东科技大学
信息工程系

内容说明:本篇文章是《嵌入式操作系统》实训报告的第一部分,实现了编译和升级Linux内核
《嵌入式操作系统》实训报告内容介绍:
第一部分:编译升级系统Linux内核
第二部分:搭建HTTP服务器
第三部分:搭建动态网站
完整实验报告PDF文件

目录

  • 一、编译升级Linux内核
    • 1.1 实验原理
      • 1.1.1 Linux内核
      • 1.1.2 升级内核
    • 1.2 实验过程记录
      • 1.2.1 安装Ubuntu18.04虚拟环境
      • 1.2.2 软件更新
      • 1.2.3 查看当前内核版本
      • 1.2.4 下载Linux内核
      • 1.2.5 安装编译工具
      • 1.2.6 解压内核源码
      • 1.2.7 拷贝配置文件
      • 1.2.8 配置内核选项
      • 1.2.9 开始编译内核
      • 1.2.10 安装编译好的内核包
      • 1.2.11 关机重启
      • 1.2.12 卸载多余的内核版本

一、编译升级Linux内核

1.1 实验原理

1.1.1 Linux内核

  Linux内核是Linux操作系统的核心,主要包括文件系统模块、内存管理模块、进程管理模块、进程间通信模块和网络接口模块5大模块。

表-Linux内核各模块功能
模块 功能
文件系统模块 主要负责文件系统的管理,Linux内核支持ext2、ext3、ext4、gfs、及网络文件系统nfs、cifs等
内存管理模块 主要负责内存的资源分配
进程管理模块 主要负责进程的资源分配协调管理
进程间通信模块 主要负责协调进程之间的资源分配关系和进程资源的竞争分配
网络接口模块 主要负责对系统进行远程管理

1.1.2 升级内核

  Linux的内核承担着Linux操作系统的最为核心的任务,是其它程序和硬件等运行过程中的管理者:它要管理所有进程的内存,保证它们都能平等得到处理器的时隙。此外,它还提供程序和硬件之间的接口等功能。
  通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。

1.2 实验过程记录

1.2.1 安装Ubuntu18.04虚拟环境

  本次实验选用VM VirtualBox虚拟机,相较于VMwareVirtualBox虚拟机的优势在于:开源软件,免费使用;中文界面;占用空间较小等。
  本次实验选用系统镜像为:ubuntu-18.04.1-desktop-amd64.iso
VM VirtualBox虚拟机软件中,安装Ubuntu18.04镜像文件,新建Ubuntu虚拟机。等待其自动安装完成即可。
Linux实训——编译升级Linux内核_第1张图片

图 VM VirtualBox安装Ubuntu虚拟环境

1.2.2 软件更新

  安装Ubuntu虚拟环境成功后,首先使用sudo apt-get update命令,更新系统中的软件源。apt-get update命令会从存储库下载软件包列表并“更新”它们,以获取有关软件包及其依赖项的最新版本的信息。
Linux实训——编译升级Linux内核_第2张图片

图 更新软件包列表

1.2.3 查看当前内核版本

  为了能够下载合适的内核版本,在更新完成后,需要使用命令umane –r查看当前系统的内核版本。
在这里插入图片描述

图 当前内核版本

  输入命令查看当前的Linux内核版本,可以看到我当前的版本是4.15.0-29-generic

1.2.4 下载Linux内核

  在GitHub上或其他下载源,下载新版本的Linux内核文件。其中需要注意的是,新版本与当前版本差距不应太大,避免造成更新后硬件不兼容的现象。因为我的当前内核版本为4.15,所以我找到了内核版本为4.16的内核文件。
Linux实训——编译升级Linux内核_第3张图片

图 新版本内核列表

  可以看到,有两种版本的内核压缩包。可以选择任意一种类型下载,只是解压方式不同。本次选择tar.gz文件进行下载。直接在虚拟机Linux环境中的Firefox浏览器中进行下载即可。
Linux实训——编译升级Linux内核_第4张图片

图 内核下载过程

  Firefox的默认下载位置是~/Download文件夹,等待下载完成,可在该文件夹下查看内核文件包。
在这里插入图片描述

图 内核包下载位置

1.2.5 安装编译工具

  由于编译内核的过程需要使用相关的编译工具,在编译之前需要对此进行安装。现在安装make ,gcc, make-kpkg,等编译内核相关的工具,以做好编译的准备工作。
Linux实训——编译升级Linux内核_第5张图片

图 安装编译工具

  安装部分编译工具时,会出现下图中的配置选项,选择默认的配置即可。
Linux实训——编译升级Linux内核_第6张图片

图 编译工具配置菜单

  之后,检查makegcc是否安装。
Linux实训——编译升级Linux内核_第7张图片

图 检查相关工具安装状态

  可以看到,相关工具已经安装完成。

1.2.6 解压内核源码

  进入到/usr/src/文件夹下,查看当前文件夹下的文件,将刚才下载的Linux内核压缩文件拷贝到当前目录下,以便于解压。
Linux实训——编译升级Linux内核_第8张图片

图 转移内核文件

  新建一个kernel目录,用于存放内核解压之后的文件。使用tar工具解压内核压缩文件至kernel目录。
在这里插入图片描述

图 解压内核压缩包

  解压完成之后,进入到kernel目录,查看该目录下的文件。
在这里插入图片描述

图 查看内核文件

  可以看到,内核解压后生成了一个名为linux-4.16的文件夹,该文件夹即为所需的内核文件。下面进入到该文件夹下,进行内核编译的准备工作。

1.2.7 拷贝配置文件

  编译的过程需要使用相关的配置文件,可以选择将Linux原有的配置文件拷贝到当前目录下,或者在本机重新编译生成新的配置文件。本步骤采用第一种方式,复制原有配置文件至指定目录。复制结束后,查看是否拷贝成功。
Linux实训——编译升级Linux内核_第9张图片

图 复制配置文件

  由于.config文件是隐藏文件,所以需要加-a参数,才能看到该文件。

1.2.8 配置内核选项

  本步骤与第7步作用相同。第7步中,使用了原有的配置文件,直接复制到了工程文件夹下。同样可以在机器上,使用make编译生成新的配置文件,本步骤即为此方法。在使用make工具,编译menuconfig目标时,发生下图所示的错误,其原因为未安装bison工具,使用图中的命令安装该bison工具,问题得以解决。
Linux实训——编译升级Linux内核_第10张图片

图 菜单编译配置文件

  再次编译menuconfig目标时,出现如图所示的菜单界面,此时不需进行其余配置,直接选择save。选择save后,出现第二图中所示的界面,用于填写配置文件名,同样不需修改,直接使用默认的.config文件名即可。
Linux实训——编译升级Linux内核_第11张图片

图 Linux内核配置菜单

Linux实训——编译升级Linux内核_第12张图片

图 设置配置文件名

  选择”OK”并退出即可。

1.2.9 开始编译内核

  Linux内核可以使用makemake-kpkg等工具进行编译。本次实验使用make-kpkg工具来进行内核的编译。该编译工具的主要使用方法如下图所示。
Linux实训——编译升级Linux内核_第13张图片

图 make-kpkg使用介绍

  可以看到,这个make-kpkg需要跟着optionstarget,其中一个选项--append-to-versions是指定内核版本的附加内容,追加作为内核名称的一部分,我将该参数指定为zhjv1。第二个参数是编译之后生成的目标,也就是之后会生成的编译之后的文件,现将目标设为kernel-imagekernel-headers
在这里插入图片描述

图 尝试编译内核

  运行时,发现make-kpkg comman not found.说明该工具未安装,使用命令安装该工具。
Linux实训——编译升级Linux内核_第14张图片

图 查找错误原因

  但是命令显示,该工具已经安装。原来是我将make-kpkg错写成了make-kgkg,下面改正错误,重新运行。
运行过程中,出现如下图所示的错误。
Linux实训——编译升级Linux内核_第15张图片

图 报错信息

  经过查阅资料,发现应该是缺少相关的编译工具,现安装相关工具,如下图所示。
在这里插入图片描述

图 安装缺少的编译工具

  安装完成后,返回linux-4.16文件夹,重新进行内核编译。经过非常漫长(整个编译过程持续5h29min)的过程,终于编译完成。
Linux实训——编译升级Linux内核_第16张图片

图 编译成功及其用时

  编译结束之后,在当前目录下的上一级目录,也就是/usr/src/kernel目录下,会生成两个内核文件。这两个文件就是我们需要的内核文件包。其中,linux-headers为Linux内核头文件的软件包,linux-image为Linux内核镜像文件包。
Linux实训——编译升级Linux内核_第17张图片

图 编译生成的文件

1.2.10 安装编译好的内核包

  在/usr/src/kernel目录下,使用dpkg工具安装编译好的内核包文件,先安装linux-image镜像软件包。
Linux实训——编译升级Linux内核_第18张图片

图 安装镜像内核包

  之后安装linux-headers头文件软件包:
Linux实训——编译升级Linux内核_第19张图片

图 安装头文件内核包

  现在我使用uname命令,查看当前的内核版本。
在这里插入图片描述

图 当前内核版本

  现在还是4.15.0版本,并没有升级到4.16版本。

1.2.11 关机重启

为了刷新内核版本,现在重新启动虚拟机。启动之后,继续使用uname命令查看当前的内核版本。
在这里插入图片描述

图 内核升级成功

  Nice!可以看到,当前内核版本已经升级为4.16.0。与此同时,内核的名称还追加了我编译之前添加的版本识别参数zhjv1

1.2.12 卸载多余的内核版本

  现在来查看电脑中存在的各版本的内核。
Linux实训——编译升级Linux内核_第20张图片

图 现存的内核版本

  可以看到,现在电脑中4.15版本的内核依然是安装状态,因为4.16版本的内核已经安装,4.15版本的可以卸载掉了。现在使用apt工具卸载4.15版本的内核。
Linux实训——编译升级Linux内核_第21张图片

图 报错信息

  可以看到,我使用apt管理工具,分别使用了removepurge两个参数,都未能正确卸载旧内核。原因大概是,有其他进程正在使用dpkg或是占用了apt进程。
  在网上查找的资料中,解决办法是更新引导,但更新引导之后,并没有起作用。现在看来,与引导更新的关系应该不大。
Linux实训——编译升级Linux内核_第22张图片

图 更新引导

  没办法,我重启了虚拟机。再次尝试卸载旧内核,发现此时已经允许卸载。
Linux实训——编译升级Linux内核_第23张图片

图 卸载旧内核

  卸载linux_image完成之后,旧版本的linux_headers以相同的操作卸载。
在这里插入图片描述

图 卸载旧版本头文件内核包

  卸载进程结束后,再次查看现有的linux内核版本。
Linux实训——编译升级Linux内核_第24张图片

图 查看内核列表

  可以看到,虽然刚才已经卸载了linux-image-4.15.0内核,但其依然存在于电脑中,只是deinstall未安装罢了。想要彻底删除这些未安装的内核,还需要使用dpkg工具。
Linux实训——编译升级Linux内核_第25张图片

图 查看内核列表

  使用dpkg –P命令,删除未安装的linux-image-4.15.0内核,结果出现报错。之后再次查看当前存在的内核,发现该内核已经消失。我认为报错的原因在于,dpkg工具未及时更新现存的内核版本,在发现错误后才算进行了一次更新。
  接着继续删除多余未安装的linux-modules,卸载了多余的linux-image-4.15.0-51-generic。再次查看当前的内核版本。
Linux实训——编译升级Linux内核_第26张图片

图 查看内核列表

  最终,我删除了不必要的4.15内核版本的文件,仅保留了未涉及的4.15内核文件和4.16版本的内核文件。现在再次查看当前内核版本,确保是4.16版本。
在这里插入图片描述

图 最终内核版本

  第一个实验顺利结束。

你可能感兴趣的:(实验报告)