用Ubuntu交叉编译Linux内核源码并部署到树莓派4B上

参考文章
1. 配置交叉编译环境

之前在ubuntu上配置过了,直接跳过

2.获取Linux内核源码

Linux内核源码链接

  • 到链接里面选择自己合适版本的内核源码下载下来,然后传到ubuntu中进行解压

3.Linux内核源码的配置

参考文章

复制代码
			厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
		第一种方式:
			cp 厂家.config .config
		第二种方式:
			make menuconfig 一项项配置,通常是基于厂家的config来配置
			
		第三种方式:
			完全自己来

我使用的是第一种根据厂家提供的.config文件来进行配置

1)内核配置:

首先要进入到Linux内核源码的目录里面

获取bcm2711_defconfig的配置到 .config里。

树莓派4b配置的是bcm2711_defconfig

树莓派3b则是bcm2709_defconfig

执行

bash 复制代码
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2711_defconfig

2)驱动的配置

  • 安装必要的库:
bash 复制代码
sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5
  • 第二种方式:
    make menuconfig 一项项配置,通常是基于厂家的config来配置执行menuconfig
bash 复制代码
 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

然后会弹出这样的一个框图

  • *编译进内核 zImage包含了驱动
  • M 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载

可以进行内核驱动的一些相关配置

如果没有什么改的,可以不用执行这一步

4.编译和打包内核源码

1)编译

bash 复制代码
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs


然后编译出错,是工具不行,直接安装最新工具

bash 复制代码
sudo apt install libssl-dev

然后编译成功了

*注意:编译成功后,看到源码树目录多了vmlinux,失败则无此文件

成功后,目标zImage镜像arch/arm/boot底下

*

2)打包zImage成树莓派可用的xxx.img
参考文章

bash 复制代码
./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

在这里出现了bug

提示:ash: ./scripts/mkknlimg: No such file or directory

没有打包工具mkknlimg,尝试了很多方法都不行,后来发现打包工具mkknlimg被淘汰了

方法1:重新下载一个老版本的源码Linux-rpi-4.14.y.zip,unzip解压,在文件夹scripts里找到打包工具mkknlimg,将该打包工具拷贝到现在源码的scripts目录下

方法2:下载tool_master工具包找到imagetool-uncompressed.py

bash 复制代码
sudo ./imagetool-uncompressed.py 内核源码目录的绝对路径/arch/arm/boot/zImage

打包成功后,在源码目录下课以找到kernel_new.img这个文件

5.挂载树莓派sd卡,并安装编译好的内核源码到sd卡

1)先建立两个空文件夹,方便挂载sd卡

bash 复制代码
mkdir data1 data2

dmesg查看内核打印信息如出现 sdb1 sdb2,则继续下列操作

挂载U盘

bash 复制代码
sudo mount /dev/sdb1 data1   一个fat分区,是boot相关的内容,kernel的img
sudo mount /dev/sdb2 data2   一个是ext4分区,也就是系统的根目录分区。

以下用fat表示boot挂载的路径,ext4表示ext4挂载的路径。

2)安装modules, 设备驱动文件

bash 复制代码
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install

操作ext4分区,需要root权限。

3)安装更新 kernel.img 文件,注意镜像名字是kernel7.img

更新之前先备份,防止更换内核后树莓派启动失败,找不回原先的内核

bash 复制代码
```bash
cd [fat]
cp kernel7.img kernel7old.img

前面已经用 mkknlimg 工具打包了kernel_new.img文件了,把它复制到boot分区并配置使用即可

bash 复制代码
cp kernel_new.img [fat]/

然后编辑 fat/config.txt 文件,在最后加入一行:

bash 复制代码
kernel=kernel_new.img

也可以把编译新生成的拷贝到fat/中,起名kernel7.img

bash 复制代码
cp kernel_new.img [fat]/kernel7.img

这种的话直接不用修改fat/config.txt 文件

4)复制其他相关文件

bash 复制代码
sudo cp arch/arm/boot/dts/*.dtb [fat]/
sudo cp arch/arm/boot/dts/overlays/*.dtb* [fat]/overlays/
sudo cp arch/arm/boot/dts/overlays/README [fat]/overlays/

6.将sd卡插回树莓派用串口登录的方式查看树莓派的内核输出日志是否正常以及能否正常登录

我的内核版本之前是5.15.32

更换之后为5.15.0

相关推荐
AlanBruce3 小时前
摩尔信使MThings功能综述与应用使用指南
linux·自动化·plc·mthings·摩尔信使
陈陈CHENCHEN7 小时前
【Linux】服务器根目录磁盘扩容操作记录
linux·运维·服务器
GeW8 小时前
RHCE快速拿证全攻略:考点拆解+实验强化+时间规划,一次通关
linux
码农小韩9 小时前
Linux应用开发(八)——TCP/IP网络编程基础
linux·嵌入式软件开发·linux操作系统·嵌入式操作系统·linux网络编程·linux应用
迷途之人不知返9 小时前
【进程】-5-进程优先级
linux
fengyehongWorld10 小时前
Linux squid搭建基础代理服务器
linux·运维·服务器
木白CPP10 小时前
Linux DMA驱动详解(二)-----DMA的使用者
java·linux·运维
赵民勇10 小时前
systemd-socket-activate命令详解
linux·运维
Cx330❀11 小时前
【Linux网络】网络层 IP 协议:从网段划分到内核源码解析
大数据·linux·服务器·网络·tcp/ip·性能优化·langchain
企鹅的蚂蚁11 小时前
LubanCat RK3588 实时 Linux 开发(七):YT6801 PCIe 网卡驱动移植与 vermagic 排查
linux·rk3588·linux驱动·yt6801·pcie网卡·vermagic