树莓派上的操作
树莓派使用的系统是通过 Raspberry Pi Imager 安装的 2023-05-03-raspios-bullseye-armhf.img.xz 。
1.升级到最新版内核保证与下载的内核源码版本一致
1 |
$ sudo rpi-update |
2.升级完整后重启
1 |
$ sudo reboot |
3.查看内核版本
1 |
$ uname -r |
4.把最新版本的内核配置保存到.config中,以备以后编译内核使用
1 |
$ sudo modprobe configs |
文件被存储到了/proc/config.gz
中。
目前最新版本是 6.1.12,当前内核启动默认会切换到 64位内核了,即使安装的是32位系统镜像也是这样。
如果想从32位内核启动,那么需要在 config.txt 中配置 arm_64bit。
因此下面的编译都是针对6.1.y这个分支进行的。
Debian/Ubuntu下编译
1.获取内核源代码
1 2 3 4 5 |
$ cd ~ $ mkdir rpi $ cd rpi |
2,以下步骤时间很长,可以在睡觉前执行,并且可能需要重试几次才行。
1 2 3 |
# core.symlinks=true 软连接处理,否则会出现各种找不到文件的问题 $ git -c core.symlinks=true clone https://github.com/raspberrypi/linux.git rpi-linux |
3. 安装编译工具
1 2 3 4 5 |
# 编译 32 位代码 $ sudo apt install crossbuild-essential-armhf # 如果需要编译 64 位代码 # sudo apt install crossbuild-essential-arm64 |
4.整个的rpi-linux的文件夹的所有者更改为当前用户,否则存在一定程度的编译问题,特别是代码从其他系统上拷贝过来的情况
1 |
$ sudo chown -R `whoami` rpi-linux/ |
5.配置编译类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ cd rpi-linux/ # 检出分支 $ git checkout rpi-6.1.y # 软连接处理,否则会出现各种找不到文件的问题 $ git config core.symlinks true $ git reset --hard $ KERNEL=kernel7l $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig # 编译64位 # KERNEL=kernel8 # make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig |
6. 开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。
1 2 3 4 5 6 |
$ make clean $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j6 # 编译64位 # make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j6 |
7.编译错误修正,如果提示如下错误
1 2 3 4 5 6 7 |
arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts:13:10: fatal error: dt-bindings/gpio/gpio.h: 没有那个文件或目录 13 | #include <dt-bindings/gpio/gpio.h> | ^~~~~~~~~~~~~~~~~~~~~~~~~ compilation terminated. make[2]: *** [scripts/Makefile.lib:428:arch/arm/boot/dts/overlays/adafruit-st7735r.dtbo] 错误 1 make[1]: *** [scripts/Makefile.build:500:arch/arm/boot/dts/overlays] 错误 2 make: *** [Makefile:1478:dtbs] 错误 2 |
这个现象的原因是 git 在检出代码的时候,没有正确处理软连接,我们只需要重新处理一次即可。如下:
1 2 3 4 5 |
# 软连接处理,否则会出现各种找不到文件的问题 $ git config core.symlinks true $ git reset --hard |
8.查看生成的内核镜像文件
1 |
$ cd rpi-linux/arch/arm/boot |
生成的zImage就是我们需要的kernel.img
。
9.编译modules
1 2 3 4 5 6 7 8 9 10 11 |
$ cd ../.. $ mkdir modules $ cd rpi-linux # 32位 $ make modules_install ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=../modules # 64位 # make modules_install ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=../modules |
10.编译实时内核
1 2 3 4 5 6 7 8 9 10 |
# 如果需要编译实时内核 rpi-linux 目录 $ wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz $ gunzip patch-6.1.38-rt13-rc1.patch.gz $ cat patch-6.1.38-rt13-rc1.patch | patch -p1 ............................ Reversed (or previously applied) patch detected! Assume -R? [n] y ............................ |
启用实时内核编译配置
32位
1 2 3 4 5 |
$ KERNEL=kernel7l $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig |
64位
1 2 3 4 5 |
$ KERNEL=kernel8 $ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig $ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig |
先加载默认生成的配置:
修改配置:
开始正式编译内核,最后的数字改成比你的CPU核心数量+1以提交多线程编译效率。
1 2 3 4 5 6 7 |
$ make clean # 32位 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j6 # 64位 # make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs -j6 |
安装编译好的内核
Ubuntu
下面,SD
卡会自动挂载,默认挂载到了/media/
目录下面,如果是使用NOOBS
安装的话,系统目录是固定的,执行如下命令拷贝到目标SD
卡上面
32位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ cd rpi-linux $ mv /media/`whoami`/bootfs/kernel7l.img /media/`whoami`/bootfs/kernel7l_old.img $ cp arch/arm/boot/zImage /media/`whoami`/bootfs/kernel7l.img $ cp -r /media/`whoami`/bootfs/overlays /media/`whoami`/bootfs/overlays.old $ cp arch/arm/boot/dts/*.dtb /media/`whoami`/bootfs/ $ cp arch/arm/boot/dts/overlays/*.dtb* /media/`whoami`/bootfs/overlays/ $ cp arch/arm/boot/dts/overlays/README /media/`whoami`/bootfs/overlays/ $ KERNEL=kernel7l $ sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/`whoami`/rootfs1 modules_install |
确认内核已经生效
1 2 |
$ cat /proc/version Linux version 6.1.39-rt13-rc1-v7l+ (xxx@xxx) (arm-linux-gnueabihf-gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #9 SMP PREEMPT_RT Tue Jul 25 03:28:07 CST 2023 |
64位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ cd rpi-linux $ mv /media/`whoami`/bootfs/kernel8.img /media/`whoami`/bootfs/kernel8_old.img $ cp arch/arm64/boot/Image /media/`whoami`/bootfs/kernel8.img $ cp -r /media/`whoami`/bootfs/overlays /media/`whoami`/bootfs/overlays.old $ cp arch/arm64/boot/dts/broadcom/*.dtb /media/`whoami`/bootfs/ $ cp arch/arm64/boot/dts/overlays/*.dtb* /media/`whoami`/bootfs/overlays/ $ cp arch/arm64/boot/dts/overlays/README /media/`whoami`/bootfs/overlays/ $ KERNEL=kernel8 $ sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/`whoami`/rootfs1 modules_install |
参考链接
- Ubuntu 16.04 (x64)树莓派B+(Raspberry Pi B+)源代码编译
- RaspberryPi4B树莓派4B,Linux5.4本地编译驱动开发
- Raspberry Pi Documentation Cross-Compiling the Kernel
- #Raspberry Pi 4B: Real-Time System using Preempt-RT (kernel 4.19.y)
- 编译dts dtb 出错 fatal error: dt-bindings/gpio/gpio.h: No such file or directory
- Real Time 6.1 64 bit Kernel Compile
- 64bit RT Kernel Compilation for Raspberry Pi 4B .
- sed命令替换指定字符后不固定字符串,文本信息的替换删除
- How to Use sed to Find and Replace String in Files
- 正则表达式匹配任何空白字符或者非空白字符
- 如何在 Linux 中使用 find 命令搜索多个文件名(扩展名)
- remusmp/rpi-rt-kernel
- Raspberry Pi Documentation The config.txt file
- 树莓派4B(Raspbian)切换64位内核+简单性能测试
- Git 不同平台下软链接问题
- git clone -c core.symlinks=true does not work