最详细的树莓派更换自定义内核步骤

设备准备

  • 树莓派4B
  • Ubuntu18.04.6虚拟机
  • SD卡(已安装树莓派系统)
  • 读卡器

说明:本文针对树莓派4B更换自定义的32位内核。如果树莓派型号不同还需要参考文末的参考链接,结合本文内容,相信你一定能弄明白。

安装依赖项

第一行安装一些后续程序所需要的包;第二行安装32位内核的交叉编译工具。

为什么需要交叉编译工具呢?这是由于我们使用的Ubuntu是基于Linux的64位系统,但是我们想要编译的树莓派系统内核是32位的ARM架构程序。因此需要借助交叉编译工具进行编译。

注意:没有依赖项和交叉编译工具后面的步骤无法顺利进行,请确保所有依赖项和交叉编译工具均已安装。此外,交叉编译工具仅用于交叉编译arm32位程序,如果想编译64位内核请参考文末的链接。

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
sudo apt install crossbuild-essential-armhf

下载内核源码

--depth=1保证只下载最新版本的树莓派内核源代码。如果没有该参数则会下载所有的分支。如果不是想进行开发,建议使用git下载时都加上--depth参数。

如果想下载特定版本的树莓派内核,请打开https://github.com/raspberrypi/linux在branch中寻找合适的版本并使用git下载到本地。

经测试,树莓派4B不能使用高于5.15.y版本的内核,因此需要使用下面的命令下载5.15版本的内核。(测试了6.1.y版本不行,5.18.y版本不行,5.15y版本可以)

git clone -b rpi-5.15.y --single-branch --depth=1 https://github.com/raspberrypi/linux
下载不同版本的树莓派系统内核
图1 下载不同版本的树莓派内核

预配置

进入刚刚下载树莓派源代码目录,设置环境变量KERNEL,并使用make指定bcm2711_defconfig配置模板生成arm架构32位的配置文件。

  • ARCH=arm代表架构位arm32位架构;
  • CROSS_CPMPILE指定交叉编译工具为linux平台交叉编译arm32位工具;
  • 最后指定初始配置文件的模板为bcm2711_defconfig。

注意:树莓派版本不同,这里设置的环境变量KERNEL不同,所使用的配置模板也不同,其他型号的具体参数设置请参考文末链接。

cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

配置内核

这里使用make工具打开linux内核配置菜单。64位内核在这与此命令不同,请结合本文内容并参考文末链接:

ARCH和CROSS_COMPILE参数与预配置中的参数和意思相同,不再赘述。最后的menuconfig命令指示打开linux配置菜单。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

在配置菜单中,使用方向键移动光标;使用 y 键选择功能,可以将该功能编译进内核,此时功能前面变为[*];使用m键选中功能,可以将该功能作为模块编译,此时功能前面变为[M];使用 n 键可以取消选中,此时功能前面变为[ ]。

图2 内核配置菜单

在配置内核时,有时想将功能编译进内核,但是会如下图提示:

图3 将功能编译进内核却报错

这是因为这个功能还依赖于其他功能。而其他功能是被作为模块编译的。因此要想将该功能编译进内核,就也得把它依赖的功能编译进内核。所以,我们回到功能页面,按下 h 键就可以看到它依赖的都是哪些功能了。

图4 查看所依赖的功能

我们只需寻找到这些功能,并把它也配置为编译进内核就好了。怎么寻找呢?我们可以按下 / 键调出搜索菜单,然后输入功能的名字就可以查找到这个模块啦。找到模块位置后,将其状态设置为 [*] 就可以啦。此时再回到原来的功能,就可以成功将其编译进内核了。

图5 查找功能位置

最后不断按ESC返回上级菜单,提示选择YES保存即可。

交叉编译

内核配置完成后,我们就要进行交叉编译,将源代码编译为可执行程序。执行下面的代码即可。64位内核在这与此命令不同,请结合本文内容并参考文末链接:

  • ARCH、CROSS_COMPILE参数不再赘述。
  • zImage:生成的 Linux 内核镜像的文件名;
  • modules:生成内核模块;
  • dtbs:生成设备树二进制文件(Device Tree Binary)。设备树是一种描述硬件设备信息的数据结构,用于在 Linux 内核中动态配置硬件。生成的设备树二进制文件将包含硬件设备的描述信息
  • ;-j24 多线程编译。其后的数字取决于电脑的CPU线程数量,一般为CPU线程数量*1.5。请自行修改为适合自己电脑的参数。
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j24

注意:如果编译失败,请自行查找错误。网络上一般都有线程的解决方法。唯一要注意的是,报错信息并不总是在make结尾,中间也可能出现报错。因此在编译失败后请使用第三方工具查找make输出所有结果中含有error的内容。建议将Make输出信息输出到文件,便于查找错误信息。

内核安装

将预安装有系统的SD卡插入读卡器,连接到Ubuntu虚拟机。执行下面的命令查看SD卡的分区情况。

sudo lsblk
图6 查看分区

其中,boot分区,即小一点的分区,文件系统格式一般为fat32;rootfs分区,即大一点的分区,文件系统格式一般为ex4。这里要将分区号与文件系统格式对应。在本文中,sdb1对应fat32文件系统;sdb2对应ex4文件系统。

此时,我们应该还在下载的树莓派内核源代码的目录,即在名为linux的目录下。如果不在,请切换到刚刚下载的树莓派内核源代码目录。

然后,创建文件夹,将不同的文件系统挂载到对饮的目录下。这里sdb1对应fat32文件系统;sdb2对应ex4文件系统。如果你的电脑上不是,请自行调整顺序,保证文件系统挂载到和其相同的目录下。

sudo mkdir mnt
sudo mkdir mnt/fat32
sudo mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4

接下来,执行下面的命令,安装内核及模块。64位内核在这与此命令不同,请结合本文内容并参考文末链接。

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

然后,备份原内核、复制新内核及设备树信息。64位内核在这与此命令不同,请结合本文内容并参考文末链接。

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

将SD卡重新插入树莓派,启动树莓派,使用下列命令即可查看内核版本。至此,大功告成!

uname -a

参考链接:

Raspberry Pi Documentation - The Linux kernel --- Raspberry Pi 文档 - Linux 内核

主要参考Building the Kernel Locally、Cross-Compiling the Kernel、Configuring the Kernel。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值