专题一内核编译
作业要求:
完成本专题教学内容中的验收测试题并提交验收材料。
验收材料要求:
新内核引导成功前:
\1. 执行命令:
uname –a,提交截屏结果1
新内核引导成功后:
\2. 执行命令:
uname –a,提交截屏结果2
\3. 进入目录/boot,执行命令:ls -l,提交截屏结果3

==tips:== 在创建虚拟机时,最好分配 50 GB 以上从磁盘空间,四个以上内核
最重要的是:分配 4 GB 以上的内存,防止在内存中死锁
最最重要的是:新版本的 Linux 内核
make install安装后,不再需要手动引导内核!!!即不再需要配置 grub
1 [知识点]什么是 Linux 内核
操作系统的结构

操作系统:Kernel + Shell
Kernel的组成和功能:
Linux 发行版本和内核版本之间的关系:
- 例如教学视频中:
Ubuntu10.04=Kernel2.6.30+SHELL+USERS APPLICATIONS - 两者独立
- 例如教学视频中:
本次课程设计我选择的发行版本是
Ubuntu20.04.20- 其内核版本:用命令
uname -r5.8.0-50-generic
- 其内核版本:用命令
2 [实验] 从内核源码 到 内核镜像(Kernel Image)
实验准备
当前Linux内核版本为5.8.0-50
从内核版本官网下载另一个内核版本:
- 版本号尾号为偶数的是stable版的,所以我选择
5.12.2
tips: 直接点击屎黄色按钮下载很慢,可以将下载链接复制至自己喜欢的下载软件下载IDM
实验步骤
实验要求: 利用make menuconfig的配置功能,配置并编译信息中带有自己学号加姓名的内核
1 安装相应的软件包
步骤
手动或终端解压
package.deb离线安装包- 老版本的发行版在线安装比较麻烦
sudo bash ./INSTALL.sh: 执行安装脚本
遇到的问题:相关依赖下载安装
可以先更换国内源
- 在 软件和更新 选择
最佳的服务器在执行 INSTALL.sh 时,许多警告,缺少依赖等
- 百度找到 Ubuntu20.04 编译内核所需要的依赖
- 首更新
sudo apt-get update && sudo apt-get upgradesudo apt-get install libelf-devsudo apt-get install libncurses5-dev libssl-devsudo apt-get install build-essential opensslsudo apt-get install libidn11-dev libidn11sudo apt-get install zlibc minizipsudo apt-get install bisonsudo apt-get install flexsudo apt-get install pkg-config
sudo apt-get install libssl-dev
2 拷贝源码包至/usr/src并解压
- 需要用 root 用户权限将源码包拷入标准路径
/usr/src - 解压命令
sudo tar xfv xxx- 解压七万多个文件(.c .h文件)
遇到的问题:
需要重新安装VMware tools
- 首先将压缩包移动至 usr/local`
- 然后使用
tar -zxvf xxx解压- 进入vmware-tools-distrib, 使用
sudo ./vmware-install.pl命令安装- 手动启动
vmware-user
3 进入源码所在目录
- 按照功能分
- Makefile
4 执行一系列 make 指令
==tips:== 可以使用多核进行编译
make -j x: x为核心数,不能超过自己的核心数,省略则使用最多数
- 步骤一:
make menuconfig -j x- 进入配置菜单
[ ]: 编译入内核[*]:可选[M]: 编译为内核模块
- 必须改:在
General setup——>Local version:加入学号加姓名
- 进入配置菜单
遇到的错误:
Your display is too small to run Menuconfig! It must be at least 19 lines by 80 columns. make[1]: *** [scripts/kconfig/Makefile:34:menuconfig] 错误 1 make: *** [Makefile:602:menuconfig] 错误 2
- 第一个问题似乎是终端窗口太小,最大化试试
- 最大化之后再将比例缩小即可
- 步骤二:
make -j x(x为分配的内核数):.c编译为.o- 一到两小时
- 可以用多内核减少一些时间
- 快照:保存当前系统的状态,随时可以恢复载入改状态
- 编译finished后,目录下产生:
vmlinux.o目标文件和vmlinux可执行文件
- 一到两小时
make之后报错:
scripts/sign-file.c:25:10: fatal error: openssl/opensslv.h: 没有那个文件或目录 25 | #include <openssl/opensslv.h> | ^~~~~~~~~~~~~~~~~~~~ compilation terminated.
- 解决:
sudo apt-get install libssl-dev- 应提前安装
- 步骤三:
make modules_install -j x- 编译为动态链接库
.kodriverfssoundlib
- 将
.ko(类似于动态库)移动至标准目录
- 编译为动态链接库
make modules_install报错:
sed: 无法读取 modules.order: 没有那个文件或目录 make: *** [Makefile:1471:_modinst_] 错误 2
- 问题解决:
make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”由“certs/x509_certificate_list” 需求。 停止。 make: *** [Makefile:1851:certs] 错误 2
- solution :
vi .config/搜索CONFIG_SYSTEM_TRUSTED_KEYS,将里面内容清空
- 步骤四:
make install -j x- 执行
.sh脚本:将内核镜像移动至boot引导目录- 用引导程序将内核镜像引导起来
- 执行完命令后:
- 三个以
学号姓名为后缀的文件是引导所需要的
- 三个以
- 执行
Warning:
dpkg: warning: version '5.12.2mazihao_19030500024~old' has bad syntax: invalid character in version number dpkg: warning: version '5.12.2mazihao_19030500024~old' has bad syntax: invalid character in version number
- solution:
- 注意:新版本(我的是5.12.2)的Linux内核,不需要手动引导内核,
- make install 之后直接重启即可
3 [知识点] GNU make和makefile
什么是 make
make menuconfig: 用命令行模式配置内核make: 编译内核和模块make modules_install: 安装模块- 在
/lib/modules/内核版本对应的目录下,建立文件夹并把模块文件放入
- 在
make install: 安装内核- 即拷贝入
/boot目录下
- 即拷贝入
什么是makefile
- 告诉 make 命令如何去编译
makefile文件保存了 编译器和连接器的参数选项, 还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).
创建程序(make程序) 首先读取makefile文件, 然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出, 最后输出并生成的通常是可执行文件.
创建程序利用内置的推理规则来激活编译器,以便通过对特定
CPP文件的编译来产生特定的OBJ文件.
makefile 规则
1 | target ... :prerequisites ... |
Makefile demo 使用规则
试读内核源码的Makefile
4 [知识点] 操作系统启动
操作系统 引导过程
- 电脑开机后, 启动 BIOS , BIOS 自检
- 自检后,BIOS 找到硬盘上的主引导记录 MBR
- MBR 读取硬盘分区表 DPT ,找到活动分区中的分区引导记录 PBR,将控制权交给 PBR
- PBR 搜索活动分区中的启动管理器 bootmgr (Linux下是Grub,grub.conf , windows下是),将控制权交给 bootmgr
- bootmgr 寻找 boot 文件夹中的 BCD 文件(启动配置数据)
- 找到 BCD 后,bootmgr 首先从 BCD 中读取启动管理器 bootmgr 菜单信息,在显示器上显示多操作系统选择画面
- 如果存在多个操作系统并且系统设置的等待时间不是0,就会显示多个操作系统。若无,则直接进入
- 进入系统后,bootmgr 会读取 BCD 中win7系统所在的盘的
winload.exe文件,将控制器交给 - winload.exe 加载win7 内核、硬件、服务等,之后加载桌面等信息,从而启动整个系统
启动管理程序 grub
grub.conf- 需要改配置正确才能启动
5 [实验] Linux 内核的引导
引导前:

内核 make install成功后
==注意:==
新版本的Ubuntu 不再需要手动引导内核(知道真相的我眼泪流下来,需要将内存分配至4GB以上)
然后,make install之后,直接reboot
首先:将内核作为引导,数字改为自己编译的版本号:
sudo update-initramfs -c -k 5.12.2mzh19030500024
然后,更新 grub:
sudo update-grub
之后,修改 grub文件:
sudo gedit /etc/default/grub
然后,执行sudo update-grub
最后重启,选择advanced,选择编译好的内核
步骤一:sudo mkinitramfs -o /boot/initrd.img-5.12.2步骤二:sudo update-initramfs -c -k 5.12.2在boot目录下产生init
步骤三:sudo update-grub2自动修改系统引导配置,产生grub.cfg启动文件。后grub.cfg文件中增加了新内核的启动项
步骤三:reboot选择新版本内核











