从0——1的内核编译
当你接触到内核,你在真正的开始认识计算机
每次萌发动手玩内核的想法,但总是因为各式各样的花式借口放弃了,遂打算一点一点的记录下学习内核的过程,并将遇到的问题和大家分享。
如果你也想加入进来!欢迎私信我,大家一起玩转内核 !
为避免出错,我是从最开始的虚拟机开始部署,用的是Linux Ubuntu 20.04.2(最新出炉~~~)。但其实这并不妨碍我们,在任何的Linux系统上都可以通用的解决内核编译的从0到1。
开整
- 下载内核源码
- 安装依赖
- 解压源码
- 配置内核
- 编译和安装
- 启用内核为引导
Let's Do It
下载内核源码
官方正品
内核源码下载条传送门: [kernel.org](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/refs/).
命令行下载:
wget https://git.kernel.org/torval... *.tar.gz
( *** 代表的是你选择Linux的版本号)
正版虽然好,但是国内的下载速度确实是真的慢,换一下清华的源,速度会快很多!
==换源应该在下载源码前行动==
vim /etc/apt/sources.list
vim 打开软件源,将原文件做个备份,然后将文件替换为下面内容,使用 TUNA 的软件源镜像。
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
清华的kernel源码shell下载据点:
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.5.tar.gz
安装依赖
当你有了内核压缩包后,请将它视为一个软件,如果想让这个软件在你的机器上运行起来,那么先移步安装依赖。
需要的依赖命令:
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
解压源码
解压内核源码包
根据自己的版本解压哦!!!
tar xvzf linux- *.tar.gz
配置内核
重头戏
解压后进入解压后的文件 cd linux-*
为了防止配置过程有纰漏,往往先备份一份.config配置文件
cp /boot/config-$(uname -r) .config
就这样,你可以在 .config上 Do it you want to do!
当你有目的的配置内核时,取消和开启内核中的功能是你的一个核心诉求,所以利用配置工具menuconfig将拷贝好的配置文件来可视化的选择你的更改。
(如果你是刚入手,我给你的意见是默认的看一下选择退出。这一步不可忽略!!!)
shell下的menuconfig配置。
命令行
make menuconfig
最后,记得退出!!! 退出找Exit选项喽!
编译和安装
编译内核的命令很简单,当你在命令行上敲下 make 时,它就开始编译内核了。
但这太慢了,要想加快速度,多线程编译必然提高编译效率
make -j8
搞定编译,你除了发现一大堆的二进制.o文件,有两个文件格外关注一点。
./vmLinux
./arch/x86/boot/bzImage
vmLinux为gdb调试所需的,bzImage为大内核文件映像。
这对内核编译没有什么帮助,只在调试内核时有用。
这块当你遇到了相关问题,请来找找看。
但编译过程中并不是一帆风顺,你可能会遇到一些问题。
我在过程中遇到的:
- Makefile执行过程中出错:make: * No rule to make target ` ‘, needed by xxx. Stop.
这说明makefile在编译过程中找不到相关的文件。
遇到这个问题,你可以直接打开 .config配置文件。对,就是上面你拷贝的那个! 找到相关联的指定依赖,然后残酷的把它删除掉,因为配置过程中makefile找不到相关的文件,那就让它消失掉吧。
如我遇到的是:
CONFIG_SYSTEM_TRUSTED_KEYS="certs/rhel.pem"
- staging: wilc1000: remove wilc1000_spi_ops as it is not used
这个问题,会导致报错!
寓意是它定义了结构体,但完全没有使用!
既然它通不过,那只能挥泪自刀了。
找到出处,这是我的报错代码文件。
/drivers/staging/wilc1000/wilc_spi.c
找到文件,注释~ or 删除~
//static const struct wilc1000_ops wilc1000_spi_ops;
往往内核编译,大多是为了安装系统。那么继续将编译后的系统支棱起来。
命令行
make modules_install
make install
结束,重启,选择,新系统诞生。
内核编译整体顺下来,其实一点都不复杂,感谢kernel的开发者们帮助简化内核编译,源码安装也乐趣颇多。