GitHub: https://github.com/khs1994/kernel
编译环境 Ubuntu 18.04 server 64 位(使用 VirtuaiBox
虚拟机),本次编译专门针对 树莓派 3
,可能不适用于前代产品!
目录说明:本次编译目录位于 ~/pi
,请提前创建好该文件夹。
arm64
来源:https://github.com/bamarni/pi64
准备
安装包
arm32v7 (官方系统)
1 | $ sudo apt install \ |
arm64v8
1 | $ sudo apt-get update \ |
克隆资源
https://github.com/raspberrypi
在 ~/pi
目录执行以下命令
firmware
树莓派的交叉编译好的二进制内核、模块、库、bootloader
1 | $ git clone --depth=1 git@github.com:raspberrypi/firmware.git |
linux
内核源码
1 | $ git clone -b rpi-4.13.y --depth=1 git@github.com:raspberrypi/linux.git linux-src |
编译
准备 .config
在 linux-src
目录执行以下命令。
arm32v7
使用以下两种方法之一,在 linux-src
文件夹下生成 .config
。
使用命令生成
1 | $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig |
使用图形化界面进行配置
有特殊需求再自行配置,一般使用第一种方法即可。
1 | $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig |
arm64v8
1 | $ wget https://raw.githubusercontent.com/bamarni/pi64/master/make/kernel-config.txt |
编译
arm32v7
1 | $ make ARCH=arm -j $(nproc) CROSS_COMPILE=arm-linux-gnueabihf- |
arm64v8
1 | $ make ARCH=arm64 -j $(nproc) CROSS_COMPILE=aarch64-linux-gnu- |
复制 kernel
在 linux-src
目录执行以下命令。
arm32v7
1 | $ mkdir -p ../linux/boot |
注意:
kernel.img
是树莓派 1 用的,二代以后 cpu 是arm v7
架构,内核名字被配置成了kernel7.img
!
arm64v8
1 | $ mkdir -p ../linux/boot |
提取 modules
上一步不但编译出来了内核的源码,一些模块文件也编译出来了,这里我们提取一下(新的 Kernel 要正确运行,还需要编译所需的 modules
,主要对应 /lib
目录下的内容)。
编译时,使用 INSTALL_MOD_PATH
参数指定目标路径。
在 linux-src
目录执行以下命令。
arm32v7
1 | $ make ARCH=arm \ |
arm64v8
1 | $ make ARCH=arm64 \ |
提取 firmware
在 ~/pi
目录执行以下命令。
1 | $ cd firmware/boot |
打包
由于编译环境位于虚拟机,把文件压缩之后,本机使用 scp
将压缩包拿回来。
1 | $ tar -zcvf linux.tar.gz linux |
将文件移动到 TF 卡
在本机将 linux.tar.gz
解压缩。
将 linux/boot
目录文件复制到 TF 卡 boot
目录,树莓派开机。
启动之后将 linux.tar.gz
通过 scp
上传到树莓派中。
1 | $ tar -zxvf linux.tar.gz |
注意: 这一步不可以省略,如果不复制
modules
一些软件比如Docker
会出错。