操作系统:Ubuntu24.04
开发板:树莓派4b
一、编译内核
可以在树莓派上直接编译(大约2h),也可以在虚拟机中先编译好,再放到树莓派中(大约40min)。
1.安装交叉编译链
1.1
下载链接Linaro Releases中的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。
1.2
解压压缩包
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
1.3
将编译工具存到/usr/local/arm
sudo mkdir /usr/local/arm
sudo cp gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu /usr/local/arm
1.4
配置环境变量
sudo vi /etc/profile
export PATH=$PATH:/usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin
1.5
安装依赖
sudo apt-get install lsb-core lib32stdc++6
1.6
重启
sudo reboot
1.7
查看
aarch64-linux-gnu-gcc -v
注意
1.环境变量的export的gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu可以根据自己的想法改,文件名对应正确就好了
2.如果在树莓派上无法安装依赖,又只想在树莓派上编译,不需要交叉编译的话,可以直接在树莓派上下载gcc,效果是一样的。
sudo apt-get install gcc
2.编译内核+加载模块
接下来的步骤,在Ubuntu虚拟机里面和树莓派里面都是一样的
2.1
获取依赖
sudo apt-get install git bison flex libssl-dev zip libncurses-dev make
2.2
获取内核源码
git clone --depth=1 --branch rpi-5.15.y https://github.com/raspberrypi/linux
#如果报错,就多试几次就好了,网络就是这样的
2.3
按顺序执行,编译源码
cd linux
make distclean #或者make mrproper
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 bcm2711_defconfig
make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8
#开始编译,如果在树莓派上编译,则需要2个小时左右,如果是Ubuntu虚拟机,则在40分钟左右
2.4
编译完成后,更新模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/home/linux/ modules_install
#INSTALL_MOD_PATH=/home/linux/ 改成自己放linux源码的路径
至此,如果没有报错,则得到5.15.92-v8+内核。
3.配置内核模块
这里的步骤,树莓派和Ubuntu虚拟机是不一样的
树莓派
将所需的文件复制到/boot/firmware下面去
sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware
sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp linux/arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
# 复制内核
sudo cp linux/arch/arm64/boot/Image /boot/firmware/kernel8.img
sudo cp -r linux /lib/
#linux/改成 linux源码的路径
Ubuntu虚拟机
虚拟机则需要插入树莓派的SD卡,并找到对应的设备名是哪个,我的是sdc1和sdc2
然后按操作
cd ~
mkdir data1
mkdir data2
sudo mount /dev/sdc1 ~/data1
sudo mount /dev/sdc2 ~/data2
sudo cp linux/arch/arm64/boot/dts/broadcom/*.dtb ~/data1
sudo cp linux/arch/arm64/boot/dts/overlays/*.dtb* ~/data1/overlays/
sudo cp linux/arch/arm64/boot/dts/overlays/README ~/data1/overlays/
# 复制内核
sudo cp linux/arch/arm64/boot/Image ~/data1/kernel8.img
sudo cp -r linux ~/data2/lib/
#linux改成 linux内核源码的路径
sudo umount ~/data1
sudo umount ~/data2
把SD卡插回树莓派。
接下来的步骤是树莓派和Ubuntu虚拟机共同的
修改配置文件
sudo vi /boot/firmware/config.txt
# 在末尾!!!添加内容并保存退出
arm_64bit=1
kernel=kernel8.img
然后重启树莓派,并查看
sudo reboot
uname -r
如果和编译后的内核是一个版本,均为5.15.92-v8+,则成功
注意
更换内核后,wifi模块会出问题,我看到的解决方法是重新加载内核模块
即从2.4开始重新弄,然后再在树莓派上输入命令 sudo depmod,再重启就好了,但是我的没成功。
所以我的方法是用网线连接
读者可以自行搜索网线连接的方法,如果发现eth0没有出现的话,需要在/etc/netplan里面进行设置
sudo vi /etc/netplan/50-cloud-init.yaml
#然后在network:下面加
ethernets:
eth0:
addresses: [192.168.137.21/24],这是ip地址和子网掩码,DNS和网关有需要就配
optional: true
version: 2
再重启网络服务sudo netplan apply就可以了
谢谢观看!