获取内核源码及工具
源码链接:
https://github.com/raspberrypi/linux
工具链接:
https://github.com/raspberrypi/tools
patch链接:
https://www.kernel.org/pub/linux/kernel/projects/rt/
源码在git上的master的版本是4.9,可直接复制git的链接
git clone https://github.com/raspberrypi/linux.git
如果想下载其他版本的内核,比如想下载5.1.y版本内核,则使用如下方式
git clone -b rpi-5.1.y https://github.com/raspberrypi/linux.git
tools工具则是一些交叉编译所使用的编译器
git clone https://github.com/raspberrypi/tools.git
下载patch,要下载和你将要编译的内核版本一致的patch。
以上是使用git下载,在国内的下载速度是比较慢的。如果想高速下载,可以使用迅雷。方法是复制浏览器顶部链接,复制到迅雷进行搜索
然后下载压缩版本,我在迅雷里的下载速度达到了3m,速度还可以。
下载完成后全部解压。
打patch
我们对Linux内核添加补丁,这个过程就是打patch。将上面下载的patch压缩版解压到对应的内核文件夹下,并执行
cat *.patch | patch p1
配置交叉编译环境
这个要用到我们下载的tools。使用git方式下载的文件夹名为tools;下载压缩包版本直接解压的文件夹名为tool-master。我们以tools为命名来讲解。
ubuntu系统位数查看
$ getconf LONG_BIT
64
如果你的ubuntu系统位数为32位,执行
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin >> ~/.bashrc
source ~/.bashrc
如果是64位,执行
echo PATH=\$PATH:~/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin >> ~/.bashrc
source ~/.bashrc
并且64位系统也要安装32位的编译器的支持
sudo apt-get install lib32stdc++6
sudo apt-get install libc6:i386
sudo apt-get install lib32z1
进入Linux源码目录,进行交叉编译的配置
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
编译
进入Linux源码目录,执行
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
或者你的处理器有多个线程,可以使用-jn来加速编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4
这个过程应该要持续几十分钟,取决于电脑运行速度。喝杯茶等一下吧~
部署到SD卡
首先将插入装有系统的内存卡读卡器,并在虚拟机内挂载。
查看分区在/dev下的名称
lsblk
sdc1是boot分区,sdc2是rootfs分区。
接下来进行挂载。首先在/mnt下创建两个文件夹
sudo mkdir /mnt/fat32
sudo mkdir /mnt/ext4
然后将sdc1和sdc2分别挂载在fat32和ext4
sudo mount /dev/sdc1 /mnt/fat32
sudo mount /dev/sdc2 /mnt/ext4
首先安装内核模块到/mnt/ext4,定位到内核源码文件夹下,执行
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/mnt/ext4 modules_install
接下来的操作都是对boot分区进行,也就是/mnt/fat32
备份原本的内核,本次调试发现,kernel7.img是树莓派所使用的内核,所以我们对树莓派的kernel7.img进行备份
mv kernel7.img kernel7-pre.img
将内核源码中的zImage重命名为kernel7.img(所在位置:linux-rpi-4.9.y/arch/arm/boot)
mv zImage kernel7.img
或者使用tools下的工具进行类型转换
cd tools/mkimage
./imagetool-uncompressed.py ~/linux-rpi-4.9.y/arch/arm/boot/zImage
这样生成的名称为kernel.img,将他重命名为kernel7.img
mv kernel.img kernel7.img
**********************************************
如果出现python编译的错
/usr/bin/env python\r no such file or directory
则是由于windows下编写的python代码不符合Linux下的规范,使用以下方式进行转码
sudo apt-get install dos2unix
dos2unix <filename>
**********************************************
将生成的kernel复制到/mnt/fat32下
sudo cp ~/linux-rpi-4.9.y/arch/arm/boot/kernel7.img /mnt/fat32
或者
sudo cp ~/tools/mkimage/kernel7.img /mnt/fat32
复制.dts文件和README文件
sudo cp ~/linux-rpi-4.9.y/arch/arm/boot/dts/*.dtb /mnt/fat32
sudo cp ~/linux-rpi-4.9.yarch/arm/boot/dts/overlays/README /mnt/fat32/overlays
至此树莓派内核更新完成,插入到树莓派中试一试