前言
主机环境 Ubuntu20.04
设备 树莓派zero w
基于buildroot编译出来的根文件系统
参考文档https://www.raspberrypi.com/documentation/computers/linux_kernel.html#choosing_sources
目标
搭建一个纯裸的linux内核编译环境(不带根文件系统与u-boot)
经过前面的buildroot的编译,我们已经能够实现基于buildroot的内核根文件系统与第三方软件的一整套编译与运行,那么现在要做的linux内核单独编译,就有点多此一举了。其实主要原因是,buildroot不够灵活,如果我们只想操作除了根文件系统构建以外的内容呢?这时候在使用buildroot来编译就很麻烦了,编译时间久,而且首次编译还需要联网,总之有很多理由使我们只想构建一个linux内核开发环境,而并不想构建根文件系统。
获取linux内核源码
我们获取树莓派的linux类核源码时,通过GitHub获取,具体获取的分支由 -b rpi-5.10.y这个参数决定,如果不知道自己要获取哪一个分支可以,在当前已运行的树莓派中查看通过以下命令
uname -a
可以用查出来的版本信息前两组确定,最后一组表示的只是小改动,可以不关心
获取Linux内核
git clone --depth=1 -b rpi-5.10.y https://github.com/raspberrypi/linux.git
获取到内核以后可以进入Linux内核查看如下
编译Linux内核源码
接下来我们可以编写一个脚本完成每次编译都固定需要做的一些事情
在Linux目录下创建并打开一个脚本
gedit build.sh
在脚本中填写以下内容
#!/bin/bash
#表明我们使用的架构(ARCH)是arm 编译器(CROSS_COMPILE)是arm-linux- 使用的配置脚本是bcmrpi_defconfig
ERNEL=kerne
make ARCH=arm CROSS_COMPILE=arm-linux- bcmrpi_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux- -j8 zImage modules dtbs
其中编译器需要我们提前准备好,还记得我们之前编译的buildroot吧。如果你使用过它,并且没有指定自己的编译器那么在这个目录就会生成一个编译工具链
buildroot/output/host/bin
进入到你的这个路径使用pwd命令查看并复制这个路径
在你的用户目录打开.bashrc,将它添加到你的环境变量
使用以下命令
sudo vi .bashrc
在末尾添加
注意buildroot前面的路径请写你自己的
export PATH=$PATH:/home/growup/linux/buildroot/output/host/bin
之后保存,同步
source .bashrc
好了现在回到linux目录将之前写的build.sh保存并赋予权限
sudo chmod 777 build.sh
在运行脚本之前首先运行以下命令,确保你该安装的都已经安装了,不然可能报一些莫名其妙的错误
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
运行脚本
./build.sh
编译完成后得到vmlinux,有这个基本也就表示编译成功了
将内核镜像添加到树莓派
首先挂载sd卡到主机,当然我这里是主机上的虚拟机
这个mnt目录随便创建在哪里,只要方便你拷贝我就创建在linux目录
使用lsblk命令可以查看挂在的sd卡在那个位置
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4
安装驱动模块到sd卡
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux- INSTALL_MOD_PATH=mnt/ext4 modules_install
将设备树和镜像拷贝到sd卡
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卡插入树莓派运行了