Docker搭建树莓派内核编译环境


Docker搭建树莓派内核编译环境

tips: 本文基于你了解基本的git和docker的使用并已安装docker展开

目录

  • 搭建内核交叉编译环境
    • 编写Dockerfile
    • 构建镜像
  • 内核编译
    • 挂载SD卡
    • 运行交叉编译docker镜像
    • 配置内核
    • 编译内核
    • 将内核模块安装到SD卡上

搭建内核交叉编译环境

用docker搭建编译环境的好处是只需要配置一次环境和不会影响编译主机自身的环境,后续所有安装了docker的交叉编译主机只需要把镜像拷贝过来即可进行开发。

如果你只想畅快的开发功能而不是被繁琐的环境搭建困扰可以直接下载搭建好的镜像进行开发并跳到内核编译章节

编写Dockerfile

根据官方的介绍把所需的依赖项和工具链写入Dockerfile里。

FROM ubuntu:22.04

# 工作目录,根据自己喜欢配置
WORKDIR /home/

# 设置 Git 用户信息
ENV GIT_AUTHOR_NAME "Your Name"
ENV GIT_AUTHOR_EMAIL "[email protected]"

RUN apt-get update 
    # To build the sources for cross-compilation
    && apt-get -y install git 
    && apt-get -y install bc 
    && apt-get -y install bison 
    && apt-get -y install flex 
    && apt-get -y install libssl-dev 
    && apt-get -y install libc6-dev 
    && apt-get -y install libncurses5-dev 
    && apt-get -y install make 
    # Install the 64-bit Toolchain for a 64-bit Kernel
    && apt-get -y install crossbuild-essential-arm64

tips: 此Dockerfile仅安装了64bit的工具链,如需32bit请参考官方介绍修改

构建镜像

docker build -t <image name> .

至此,交叉编译环境已搭建完成。

内核编译

要编译内核需要先从树莓派的官方仓库:https://github.com/raspberrypi/linux 把代码clone下来。具体选择哪个版本的内核根据你的需要来。比如你只想开发驱动,最简单的就是选一个和你当前版本一致的内核版本,编译出来的.ko就可以直接加载使用了。如果你是想更换最新的内核版本或者基于最新的内核版本开发驱动则需要编译出新的内核镜像并替换。
下文基于你想用最新的内核版本开发驱动为示例演示raspberry pi 3B+ 64bit内核编译替换,其它型号版本的内核配置参考官方介绍。编译主机为ubuntu22.04系统。

挂载SD卡

把树莓派的sd卡拔出来后插入编译主机。插入SD卡之后使用lsblk来识别它。你应该得到类似这样的结果:

sdb
   sdb1
   sdb2

sdb1 是 FAT 文件系统(boot)分区,sdb2 是 ext4 文件系统(root)分区。然后再挂载他们(你需要根据实际情况改成和你对应的)

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

运行交叉编译docker镜像

tips: 如果你是windows环境下开发,最好在容器里clone代码,本人尝试在window环境clone代码会遇到路径问题。

docker run -itd -v <你的内核代码路径>:<你想映射在容器里的路径> -v mnt/fat32:mnt/fat32 -v mnt/ext4:mnt/ext4 <交叉编译镜像名>:<tag>

镜像成功跑起来之后进入容器进行编译

docker exec -it <container id> bash

配置内核

cd <内核代码目录>
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

编译内核

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

将内核模块安装到SD卡上

  1. 安装内核模块
env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
  1. 复制Image镜像和设备树到sd卡
cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
  1. 在容器外将挂载的SD卡卸载
sudo umount mnt/fat32
sudo umount mnt/ext4

把sd卡插回树莓派后启动,用uname -r命令确认树莓派当前的内核版本是否和内核代码里的一致,一致则表示替换成功;内核的版本在工程根目录的Makefile里,可以用head Makefile -n 4查看当前工程的内核版本