山东科技大学
信息工程系
内容说明:本篇文章是《嵌入式操作系统》实训报告的第一部分,实现了编译和升级Linux内核
《嵌入式操作系统》实训报告内容介绍:
第一部分:编译升级系统Linux内核
第二部分:搭建HTTP服务器
第三部分:搭建动态网站
完整实验报告PDF文件
Linux内核是Linux操作系统的核心,主要包括文件系统模块、内存管理模块、进程管理模块、进程间通信模块和网络接口模块5大模块。
模块 | 功能 |
---|---|
文件系统模块 | 主要负责文件系统的管理,Linux内核支持ext2、ext3、ext4、gfs、及网络文件系统nfs、cifs等 |
内存管理模块 | 主要负责内存的资源分配 |
进程管理模块 | 主要负责进程的资源分配协调管理 |
进程间通信模块 | 主要负责协调进程之间的资源分配关系和进程资源的竞争分配 |
网络接口模块 | 主要负责对系统进行远程管理 |
Linux的内核承担着Linux操作系统的最为核心的任务,是其它程序和硬件等运行过程中的管理者:它要管理所有进程的内存,保证它们都能平等得到处理器的时隙。此外,它还提供程序和硬件之间的接口等功能。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
本次实验选用VM VirtualBox
虚拟机,相较于VMware
,VirtualBox
虚拟机的优势在于:开源软件,免费使用;中文界面;占用空间较小等。
本次实验选用系统镜像为:ubuntu-18.04.1-desktop-amd64.iso
在VM VirtualBox
虚拟机软件中,安装Ubuntu18.04
镜像文件,新建Ubuntu虚拟机。等待其自动安装完成即可。
安装Ubuntu虚拟环境成功后,首先使用sudo apt-get update
命令,更新系统中的软件源。apt-get update命令会从存储库下载软件包列表并“更新”它们,以获取有关软件包及其依赖项的最新版本的信息。
为了能够下载合适的内核版本,在更新完成后,需要使用命令umane –r
查看当前系统的内核版本。
输入命令查看当前的Linux内核版本,可以看到我当前的版本是4.15.0-29-generic
。
在GitHub上或其他下载源,下载新版本的Linux内核文件。其中需要注意的是,新版本与当前版本差距不应太大,避免造成更新后硬件不兼容的现象。因为我的当前内核版本为4.15,所以我找到了内核版本为4.16的内核文件。
可以看到,有两种版本的内核压缩包。可以选择任意一种类型下载,只是解压方式不同。本次选择tar.gz
文件进行下载。直接在虚拟机Linux环境中的Firefox浏览器中进行下载即可。
Firefox
的默认下载位置是~/Download
文件夹,等待下载完成,可在该文件夹下查看内核文件包。
由于编译内核的过程需要使用相关的编译工具,在编译之前需要对此进行安装。现在安装make
,gcc
, make-kpkg
,等编译内核相关的工具,以做好编译的准备工作。
安装部分编译工具时,会出现下图中的配置选项,选择默认的配置即可。
可以看到,相关工具已经安装完成。
进入到/usr/src/文件夹下,查看当前文件夹下的文件,将刚才下载的Linux内核压缩文件拷贝到当前目录下,以便于解压。
新建一个kernel目录,用于存放内核解压之后的文件。使用tar工具解压内核压缩文件至kernel目录。
可以看到,内核解压后生成了一个名为linux-4.16的文件夹,该文件夹即为所需的内核文件。下面进入到该文件夹下,进行内核编译的准备工作。
编译的过程需要使用相关的配置文件,可以选择将Linux原有的配置文件拷贝到当前目录下,或者在本机重新编译生成新的配置文件。本步骤采用第一种方式,复制原有配置文件至指定目录。复制结束后,查看是否拷贝成功。
由于.config
文件是隐藏文件,所以需要加-a参数,才能看到该文件。
本步骤与第7步作用相同。第7步中,使用了原有的配置文件,直接复制到了工程文件夹下。同样可以在机器上,使用make编译生成新的配置文件,本步骤即为此方法。在使用make工具,编译menuconfig
目标时,发生下图所示的错误,其原因为未安装bison工具,使用图中的命令安装该bison工具,问题得以解决。
再次编译menuconfig
目标时,出现如图所示的菜单界面,此时不需进行其余配置,直接选择save
。选择save
后,出现第二图中所示的界面,用于填写配置文件名,同样不需修改,直接使用默认的.config
文件名即可。
选择”OK”并退出即可。
Linux内核可以使用make
、make-kpkg
等工具进行编译。本次实验使用make-kpkg
工具来进行内核的编译。该编译工具的主要使用方法如下图所示。
可以看到,这个make-kpkg
需要跟着options
和target
,其中一个选项--append-to-versions
是指定内核版本的附加内容,追加作为内核名称的一部分,我将该参数指定为zhjv1
。第二个参数是编译之后生成的目标,也就是之后会生成的编译之后的文件,现将目标设为kernel-image
和kernel-headers
。
运行时,发现make-kpkg comman not found.
说明该工具未安装,使用命令安装该工具。
但是命令显示,该工具已经安装。原来是我将make-kpkg
错写成了make-kgkg
,下面改正错误,重新运行。
运行过程中,出现如下图所示的错误。
经过查阅资料,发现应该是缺少相关的编译工具,现安装相关工具,如下图所示。
安装完成后,返回linux-4.16文件夹,重新进行内核编译。经过非常漫长(整个编译过程持续5h29min
)的过程,终于编译完成。
编译结束之后,在当前目录下的上一级目录,也就是/usr/src/kernel目录下,会生成两个内核文件。这两个文件就是我们需要的内核文件包。其中,linux-headers
为Linux内核头文件的软件包,linux-image
为Linux内核镜像文件包。
在/usr/src/kernel目录下,使用dpkg
工具安装编译好的内核包文件,先安装linux-image
镜像软件包。
现在还是4.15.0
版本,并没有升级到4.16
版本。
为了刷新内核版本,现在重新启动虚拟机。启动之后,继续使用uname
命令查看当前的内核版本。
Nice!可以看到,当前内核版本已经升级为4.16.0
。与此同时,内核的名称还追加了我编译之前添加的版本识别参数zhjv1
。
可以看到,现在电脑中4.15
版本的内核依然是安装状态,因为4.16
版本的内核已经安装,4.15
版本的可以卸载掉了。现在使用apt
工具卸载4.15
版本的内核。
可以看到,我使用apt管理工具,分别使用了remove
和purge
两个参数,都未能正确卸载旧内核。原因大概是,有其他进程正在使用dpkg
或是占用了apt
进程。
在网上查找的资料中,解决办法是更新引导,但更新引导之后,并没有起作用。现在看来,与引导更新的关系应该不大。
没办法,我重启了虚拟机。再次尝试卸载旧内核,发现此时已经允许卸载。
卸载linux_image
完成之后,旧版本的linux_headers
以相同的操作卸载。
可以看到,虽然刚才已经卸载了linux-image-4.15.0
内核,但其依然存在于电脑中,只是deinstall
未安装罢了。想要彻底删除这些未安装的内核,还需要使用dpkg
工具。
使用dpkg –P
命令,删除未安装的linux-image-4.15.0
内核,结果出现报错。之后再次查看当前存在的内核,发现该内核已经消失。我认为报错的原因在于,dpkg
工具未及时更新现存的内核版本,在发现错误后才算进行了一次更新。
接着继续删除多余未安装的linux-modules
,卸载了多余的linux-image-4.15.0-51-generic
。再次查看当前的内核版本。
最终,我删除了不必要的4.15内核版本的文件,仅保留了未涉及的4.15内核文件和4.16版本的内核文件。现在再次查看当前内核版本,确保是4.16版本。
第一个实验顺利结束。