Linux内核编译及常见错误实验报告

  • 格式:docx
  • 大小:1.70 MB
  • 文档页数:16

第 1 页 共 16 ***学生实验报告

学院

年级/专业/班 姓名 学号

实验课程名称 成绩

实验项目名称 指导老师

评语:

一、实验目的

(1)学习重新编译Linux内核的方法

(2)理解Linux标准内核和发行版本内核的区别。

二、实验内容

在Linux系统中下载同一发行版本的版本号较高的内核,编译之后运行自己编译的内

核,并使用uname-r命令查看是否运行成功。由于不同版本的内核在编译过程中可能出现不同的问题,本书推荐的内核版本为4.16.10。从第7章开始的进阶实验篇,都可以选用该版本的内核。

三、实验设备

Vmware上运行的linux ubuntu 5.11.0-43-generic

实验成功:linux ubuntu 4.18.0-generic(Ubuntu18.04均可)

实验成功的方法在最后

四、实验过程和原理分析

一、实验

(一)准备工作:

在这里我建议用一个全新的虚拟机,避免编译错误对原来常使用的虚拟机造成不可逆的影响,安装好后就先安装gcc、make等工具

首先下载好Linux***内核文件

解压至 /usr/src 目录下,如下:

确认安装好gcc、make等工具,后可直接运行命令sudo make menuconfig进行查看内核功能是否需要编译,如果遇到如下错误可以运行命令 sudo apt bison 或sudo apt-get

install fiex bison命令解决

错误:

第 2 页 共 16 解决: (不建议)

(强烈建议)

除此之外还可以直接运行,上一条命令解决不了就用下面这个:

sudo apt-get install --reinstall bison libbison-dev flex libfl-dev

解决上述错误(强烈建议)

运行完上述命令后再次输入sudo make menuconfig便正常进入如下:

见到这个界面后无需任何多余操作,使用键盘方向键选择

第 3 页 共 16 回车

再回车即可

第 4 页 共 16 此时.config文件生成成功

.config文件是隐藏文件记得加参数-a

此外还有一个方法就是用 cp 命令从原有系统的内核复制.config文件过来也可以命令:sudo cp /boot/config- 5.11.0-43-generic ./.config

(二)编译内核

为了避免多线程编译时同时出现过多错误,我们这里一开始只使用单线程编译

在这里除了用make编译还可以用make-kpkg等工具,个人比较喜欢用make-kpkg

但课本用make所以我接下来的实验也先用make完成。

执行 make 出现错误:

解决:执行sudo apt-get install libssl-dev

sudo apt-get install libelf-dev -y

再次执行make,

解决:执行sudo apt-get install openssl

再次重复上述步骤缺什么装什么,此类步骤不再重复

基本确认全部装完就开8线程编译,有错误再另外解决

出现下列错误:

第 5 页 共 16 解决方法: 打开这两个文件后把全注释掉再次编译问题可解决

再次编译

还有问题:

make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。

make: *** [Makefile:1060:certs] 错误 2

根据错误提示,把两个需求删掉就可以了

把生成的文件 .config:

里面的:(用查找功能查找)

改成这样:

再编译就可以啦,至此编译成功

第 6 页 共 16 (三)编译和安装模块 make modules -j8

make modules_install -j8

遇到错误:

解决:

第 7 页 共 16 尝试了无数方法都没有办法解决,在网上找了无数方法修改了各种配置文件、装包、清除缓存重新编译两次都不行,没办法,只能重头再试一次,安装是没问题的,如下,但是重新启动是看不到4.16的内核是安装的

sudo make install

第 8 页 共 16

............................................

................................

又重新再来一次:

。。。好吧,直到现在仍在编译中,可能是我电脑太落后了

重新编译几遍还是不行,一样的错误,就在想会不会是编译器的问题,因为我这个虚拟机是重新开的,安装的gcc也是最新的,所以我找了个18年的编译器版本,因为4.16也是18年的,同时我更认为最可能的是自动生成的 .config 文件有问题,所以我在这里一并重新解决看看是否能成功;

先装个8.1.0的gcc:

官网可能无法访问或者下载慢

推荐前往tsukuba下载(百度搜索就好,链接有限制,我这里无法提供):

因为我安装的时候是打算试一试的,所以命令没截屏,但是都一样,照着我的命令来打一样可以成功安装

1、解压到 /usr/local/ 目录下

tar -xvf gcc-8.1.0.tar.gz -C /usr/local/

2、下载依赖项

cd gcc-8.1.0

./contrib/download_prerequisites

cd ..

3、建立编译后文件存放目录

mkdir gcc-build-8.1.0

cd gcc-build-8.1.0

../gcc-8.1.0/configure --enable-checking=release --enable-languages=c,c++ --

第 9 页 共 16 disable-multilib //接着上一行的

4、编译

make -j4

5、安装

$ make install

6、安装成功

gcc --version

至此gcc 8.1.0版本更换成功

同时我发现只换版本一样没办法成功安装模块,我还是连.config文件替换掉再重新编译试一下

接着就是把正确的.config文件替换掉原来的

到对应目录下

gedit .config

粘贴正确的过来,文档最后

把前面编译剩下的文件简单清理一下

make clean

重新编译,接下来又是漫长的等待..........

编译再次成功

试一下安装模块

第 10 页 共 16 至此,终于安装成功没有报错 (四)安装内核

安装成功

(五)重新启动

发现并没有用新安装的内核启动

看一下有没有可用的

发现好像没有4.16直接可用的内核,还需要加装一些东西,但是我不想装了,试一下直接用.old行不行

第 11 页 共 16 尝试:(大概率失败,失败可能要重装) 此时需手动更改启动内核选项 改为:Ubuntu,Linux 4.16.10.old

更新一下

根据警告再次更改

Please don't use old title `Ubuntu,Linux 4.16.10.old' for GRUB_DEFAULT, use

`Advanced options for Ubuntu>Ubuntu,Linux 4.16.10.old' (for versions before 2.00) or

`gnulinux-advanced-a6addcf2-d6dc-450f-86e2-6033a727dac5>gnulinux-4.16.10.old-advanced-a6addcf2-d6dc-450f-86e2-6033a727dac5' (for 2.00 or later)

改为:`gnulinux-advanced-a6addcf2-d6dc-450f-86e2-6033a727dac5>gnulinux-4.16.10.old-advanced-a6addcf2-d6dc-450f-86e2-6033a727dac5'

再次更新:

重启:

第 12 页 共 16 此时我想进引导界面即grub挽救一下的,但是好像怎么都进不去了.........

好吧,真的重装了

实验最后成功的示例:

为了避免更多的问题,我直接用Ubuntu18.04来做吧,因为我原来那个可能版本太高了

此时是一个4.15.0的内核

接下来就是和上面一样的操作,如果还是不行我就换make-kpkg来做了

不一样的是我这次直接复制原来的.config文件过来编译,前面有提到

想了想还是直接用make-kpkg做吧

过程:

多装两个东西:

apt-get install build-essential kernel-package libncurses5-dev

中间会弹出和查看内核配置一样的界面,不用管直接回车选择默认的就好

安装make-kpkg:

sudo apt install kernel-package

开始编译:

sudo make-kpkg --initrd --append-to-version=zws kernel_image kernel_headers -j4