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> .
至此,交叉编译环境已搭建完成。
内核编译
要编译内核需要先从树莓派的官方仓库:
下文基于你想用最新的内核版本开发驱动为示例演示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卡上
- 安装内核模块
env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
- 复制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/
- 在容器外将挂载的SD卡卸载
sudo umount mnt/fat32 sudo umount mnt/ext4
把sd卡插回树莓派后启动,用