学院 | 年级/专业/班 | 姓名 | 学号 | ||||
实验课程名称 | 成绩 | ||||||
实验项目名称 | 指导老师 | ||||||
评语: | |||||||
一、实验目的 (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命令解决 错误: turkey什么意思 解决: (不建议) (强烈建议) 除此之外还可以直接运行,上一条命令解决不了就用下面这个: sudo apt-get install --reinstall bison libbison-dev flex libfl-dev 解决上述错误(强烈建议) 运行完上述命令后再次输入sudo make menuconfig便正常进入如下: 见到这个界面后无需任何多余操作,使用键盘方向键选择<Save> 回车 再回车即可 此时.config文件生成成功 .config文件是隐藏文件记得加参数-a 此外还有一个方法就是用 cp 命令从原有系统的内核复制.config文件过来也可以命令:sudo cp /boot/config- 5.11.0-43-generic ./.config (二)编译内核 为了避免多线程编译时同时出现过多错误,我们这里一开始只使用单线程编译 在这里除了用make编译还可以用make-kpkg等工具,个人比较喜欢用make-kpkg hearfrom但课本用make所以我接下来的实验也先用make完成。 执行 make 出现错误: 解决:执行杰克逊经典歌曲下载sudo apt-get install libssl-dev sudo apt-get install libelf-dev -y 再次执行make, 解决:执行sudo apt-get install openssl 再次重复上述步骤缺什么装什么,此类步骤不再重复 基本确认全部装完就开8线程编译,有错误再另外解决 出现下列错误: 解决方法: 怎么了英文打开这两个文件后把全注释掉再次编译问题可解决 再次编译 还有问题: make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。 make: *** [Makefile:1060:certs] 错误 2 根据错误提示,把两个需求删掉就可以了 把生成的文件 .config: 里面的:(用查找功能查找) 改成这样: 再编译就可以啦,至此编译成功 (三)编译和安装模块 make modules -j8 make modules_install -j8 遇到错误: 解决: 尝试了无数方法都没有办法解决,在网上找了无数方法修改了各种配置文件、装包、清除缓存重新编译两次都不行,没办法,只能重头再试一次,安装是没问题的,如下,但是重新启动是看不到4.16的内核是安装的 sudo make install ............................................ ................................ waltz又重新再来一次: 。。。好吧,直到现在仍在编译中,可能是我电脑太落后了 重新编译几遍还是不行,一样的错误,就在想会不会是编译器的问题,因为我这个虚拟机是重新开的,安装的gcc也是最新的,所以我找了个18年的编译器版本,因为4.16也是18年的,同时我更认为最可能的是自动生成的 .config 文件有问题,所以我在这里一并重新解决看看是否能成功; its ok先装个8.1.0的gcc: 官网可能无法访问或者下载慢 推荐前往tsukuba下载(百度搜索就好,链接有限制,我这里无法提供): 因为我安装的时候是打算试一试的,所以命令没截屏,但是都一样,照着我的命令来打一样可以成功安装 1、解压到 /usr/local/ 目录下 tar -xvf gcc-8.1. -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=relea --enable-languages=c,c++ --disable-multilibduty //接着上一行的 4、编译 make -j4 5、安装 $ make install 6、安装成功 gcc --version 至此gcc 8.1.0版本更换成功 同时我发现只换版本一样没办法成功安装模块,我还是连.config文件替换掉再重新编译试一下 接着就是把正确的.config文件替换掉原来的 到对应目录下 gedit .config 粘贴正确的过来,文档最后 把前面编译剩下的文件简单清理一下 make clean 重新编译,接下来又是漫长的等待.......... 编译再次成功 试一下安装模块 至此,终于安装成功没有报错 (四)安装内核 安装成功 (五)重新启动 发现并没有用新安装的内核启动 看一下有没有可用的 发现好像没有4.16直接可用的内核,还需要加装一些东西,但是我不想装了,试一下直接用.old行不行 尝试:(大概率失败,失败可能要重装) 此时需手动更改启动内核选项 改为:Ubuntu,Linux 4.16.10.old 更新一下 根据警告再次更改 Plea don't u old title `Ubuntu,Linux 4.16.10.old' for GRUB_DEFAULT, u `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' 再次更新: 重启: 此时我想进引导界面即grub挽救一下的,但是好像怎么都进不去了......... 好吧,真的重装了 实验最后成功的示例: 为了避免更多的问题,我直接用Ubuntu18.04来做吧,因为我原来那个可能版本太高了 此时是一个4.15.0的内核 接下来就是和上面一样的操作,如果还是不行我就换make-kpkg来做了 不一样的是我这次直接复制原来的.config文件过来编译,前面有提到 想了想还是直接用make-kpkg做吧 过程: 多装两个东西: apt-get install build-esntial kernel-package libncurs5-dev 中间会弹出和查看内核配置一样的界面,不用管直接回车选择默认的就好 安装make-kpkg: sudo apt install kernel-package 开始编译: sudo make-kpkg --initrd --append-to-version=zws kernel_image kernel_headers -j4 命令参数说明: --initrd: 生成initramfs --append-to-version:生成内核版本附加信息,编译成功后你就会发现这个信息会在哪里了 --revision:deb文件的版本信息,只影响文件名,这个参数我认为是可以直接写下面的文件名的,不必在前面声明,正如我这行命令就没有,一样正确使用 kernel_image:内核和模块的安装包 kernel_headers:生成内核头文件的安装包。 -j:指定多少个线程编译内核 编译完成: 再回到上一级目录我们发现多了两个.deb文件,由上图 其中linux-headers为Linux内核头文件的软件包, 大学生穿衣linux-image为Linux内核和模块镜像文件包 首先用dpkg安装linux-image开头的内核和模块镜像文件包 dpkg -i linux-image-4.16.10zws_4.16.10zws-10.00.Custom_amd64.deb 安装linux-headers开头的内核头文件的软件包 sudo dpkg -i linux-headers-4.16.10zws_4.16.10zws-10.00.Custom_amd64.deb 安装完成后重启 耐心等待两分钟左右,是绿色的ok就可以了,例如: 进入后 uname -r 可见成功安装完成,zws就是我们内核的附加信息,我用了我名字的拼音首字母 看到这里或许就知道我为什么喜欢用make-dpkg了 此次至此一丁点错误都没有地成功安装了............. 从一开始我就应该相信自己用自己的方式做的,不应该太相信课本的方法 此外还可以用dpkg、apt等工具把旧的内核卸载掉,但我内存足够且就内核不影响我正常使用,我就不卸载了 最后总结:建议直接用经典Ubuntu18.04然后不要按课本用我上面提到的make-dpkg等编译、安装 二、常见问题 编译过程中,我们需要细心和耐心,如果出现问题,要善于使用搜索工具查找原因。以下是一些经常出现的问题和对应的解决方案,供读者参考。 (1)注意需要提前在“软件与更新”配置页中将更新权限打开,否则会出现无法定位的错误。 由于Ubuntu使用apt来管理软件包,而apt会将软件包存储在/etc/apt/sources.list和/etc/apt/sources.list.d/目录下带.list后缀的文件中,因此可以使用命令mansources.list来查看apt的完整存储机制。通过编辑这些文件,可以添加、删除或临时关闭某些软件包,也可以在Ubuntu图形化界面的属性页上通过勾选的方式加以实现。 (2)若不安装ncurs包就直接使用命令make menuconfig,系统会报缺少ncurs组件的错误,此时读者需要按照错误提示安装对应的包。例如: # apt-get install ncurs-devel绍兴学校 如果缺少依赖的包,那么可以根据错误提示进行安装,例如: # apt-get install libncurs5-dev (3)在make过程中也可能出现缺包错误,比如缺少openssl和libssl-dev包。读者可 以利用下列命令来安装这两个包。 # apt-get install openssl # apt-get install libssl-dev (4)编译前一定要注意留出足够的磁盘空间,否则会出现“磁盘空间不足”的错误。 (5)重启系统需要的时间比较长,这和所用设备有关。如果出现长时间容机的现象,建议读者耐心等待。如果超过半小时没有响应,则可认为编译失败。如果确实重启失败,内核版本并重新尝试。 则说明内核崩溃了。原因可能是编译过程中出现了错误或内核本身就有问题等,可以更换 五、实验思考 遇到的问题我都在文章里面提到解决方法啦,不再重复,推荐几篇文章(链接又有限制无法提供,建议百度搜素): | |||||||
本文发布于:2023-05-25 15:32:02,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/90/122270.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |