树莓派Linux内核编译

news/2024/11/25 7:45:40/

本文目录

  • 1、下载内核代码
  • 2、编译树莓派内核
  • 3、本地编译
    • 3.1、安装编译环境
    • 3.2、下载树莓派内核代码
    • 3.3、配置内核
    • 3.4、定制内核版本号
    • 3.5、编译并安装内核
  • 4、交叉编译
    • 4.1、安装编译环境
    • 4.2、下载树莓派内核代码
    • 4.3、配置内核
    • 4.4、定制内核版本号
    • 4.5、编译内核
    • 4.6、安装内核
  • 5、内核更新结果

树莓派内核源代码保存在GitHub上github.com/raspberrypi/linux,可以看做是Linux主线内核代码的一个分支。树莓派内核源代码是从Linux主线的长期维护的稳定版本加上树莓派特有的改动形成的。树莓派的内核更新可以通过apt命令自动更新到最新的稳定版本。但是如果你需要使用到最新的非稳定版本或者指定版本或者要对内核进行裁剪或者修改内核代码。那么你就会需要对内核进行编译。

1、下载内核代码

通过访问github找到树莓派内核源代码项目(方法见下载linux内核代码),通过https或者git下载你想要的版本的源代码到本地主机。

2、编译树莓派内核

编译过成可以分成在本机上本地编译和交叉编译,本地编译指的是在目标主机上直接编译,编译完成后就在目标主机上直接运行,交叉编译是指在其它主机上编译,编译完成后再把编译出来的程序安装到目标主机上执行。在树莓派这里,我们可以采用本地编译与可以采用交叉编译,因为树莓派运行速度较慢,所以交叉编译在这里可以显著的提高编译速度。

3、本地编译

3.1、安装编译环境

启动树莓派后,输入如下命令安装编译环境

sudo apt install git bc bison flex libssl-dev make

3.2、下载树莓派内核代码

然后通过https下载Linux内核代码后解决压或者通过git下载代码到/usr/src目录下,如下所示:

xxx@raspberrypi:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun  5 13:56 linux-rpi-6.1.y
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x  24 root root   4096 Jun  4 19:39 arch
drwxr-xr-x   3 root root  12288 Jun  5 14:01 block
drwxr-xr-x   2 root root   4096 Jun  5 10:28 certs
-rw-r--r--   1 root root    496 Jun  4 19:39 COPYING
-rw-r--r--   1 root root 101639 Jun  4 19:39 CREDITS
drwxr-xr-x   4 root root  20480 Jun  5 13:25 crypto
drwxr-xr-x  86 root root   4096 Jun  4 19:39 Documentation

3.3、配置内核

开始编译之前我们需要先对内核进行配置,让编译工程知道我们要编译的内核的目标主机架构等信息,编译工程才知道自己应该怎么编译。

  1. 使用默认配置
  • 如果你的设备是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1 ,那么它们只支持32-bit的Linux内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel
xxx@raspberrypi:/usr/src $ sudo make bcmrpi_defconfig
  • 如果你的设备是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+,且使用32-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7
xxx@raspberrypi:/usr/src $ sudo make bcm2709_defconfig
  • 如果你的设备是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 ,且使用32-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel7l
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig
  • 如果你的设备是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4,那么它们还支持64-bit的内核,可以使用如下内核配置命令配置成默认配置。
xxx@raspberrypi:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@raspberrypi:/usr/src $ KERNEL=kernel8
xxx@raspberrypi:/usr/src $ sudo make bcm2711_defconfig

本文使用的是树莓派zero w,只支持32位内核,所以使用的是第一种配置。

  1. 自定义内核配置
    待更新

  2. 加入内核补丁
    待更新

3.4、定制内核版本号

修改当前目录下的.config文件里的
CONFIG_LOCALVERSION=“my_first_kernel”

xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改这个文件里的LOCAL配置项成你想要的任何字符串
Kconfig

这个可以在你后续运行中通过uname命令查询到你自己编译的Linux内核的版本号,也会让新的内核在/lib/modules目录下产生新的目录文件去放置新内核的模块,而不是直接覆盖。

3.5、编译并安装内核

这一步,我们将编译,安装内核,模块和设备树,因为树莓派性能比较差,所以这一步会花费非常长的时间,尤其是如果你使用的是树莓派的早期硬件版本的话,就更慢了。

32bit内核

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

64bit内核

make -j4 Image.gz modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image.gz /boot/$KERNEL.img

编译安装完成后,重启则已经用新编译的内核了。

4、交叉编译

这里以ubuntu为例,介绍如何对树莓派内核进行交叉编译

4.1、安装编译环境

启动树莓派后,输入如下命令安装编译环境

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

根据你编译的目标是32bit内核还是64bit内核选择安装不同的toolchain

  • 32bit
sudo apt install crossbuild-essential-armhf
  • 64bit
sudo apt install crossbuild-essential-arm64

4.2、下载树莓派内核代码

然后通过https下载Linux内核代码后解决压或者通过git下载代码到/usr/src目录下,如下所示:

xxx@ubuntu:/usr/src $ ls -l
total 16
drwxr-xr-x 27 root root 4096 Jun  5 13:56 linux-rpi-6.1.y
xxx@ubuntu:/usr/src $ cd ./linux-rpi-6.1.y/
xxx@ubuntu:/usr/src/linux-rpi-6.1.y $ ls -l
total 1012
drwxr-xr-x  24 root root   4096 Jun  4 19:39 arch
drwxr-xr-x   3 root root  12288 Jun  5 14:01 block
drwxr-xr-x   2 root root   4096 Jun  5 10:28 certs
-rw-r--r--   1 root root    496 Jun  4 19:39 COPYING
-rw-r--r--   1 root root 101639 Jun  4 19:39 CREDITS
drwxr-xr-x   4 root root  20480 Jun  5 13:25 crypto
drwxr-xr-x  86 root root   4096 Jun  4 19:39 Documentation

4.3、配置内核

开始编译之前我们需要先对内核进行配置,让编译工程知道我们要编译的内核的目标主机架构等信息,编译工程才知道自己应该怎么编译。

  • 32-bit

如果你的设备是Raspberry Pi 1, Zero 或者 Zero W 或者 Raspberry Pi Compute Module 1:

cd linux-rpi-6.1.y
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

如果你的设备是Raspberry Pi 2, 3, 3+ 或者 Zero 2 W 或者 Raspberry Pi Compute Modules 3, 3+:

cd linux-rpi-6.1.y
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

如果你的设备是Raspberry Pi 4 或者 400, 或者 Raspberry Pi Compute Module 4 :

cd linux-rpi-6.1.y
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
  • 64-bit

如果你的设备是Raspberry Pi 3, 3+, 4, 400 或者 Zero 2 W, 或者 Raspberry Pi Compute Modules 3, 3+ 或者 4:

cd linux-rpi-6.1.y
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

本文使用的是树莓派zero w,只支持32位内核,所以使用的是第一种配置。

4.4、定制内核版本号

修改当前目录下的.config文件里的
CONFIG_LOCALVERSION=“-v7-MY_FIRST_KERNEL”

xxx@raspberrypi:/usr/src/linux-rpi-6.1.y $ ls -a | grep config
.cocciconfig
.config----------------------------修改这个文件里的LOCAL配置项成你想要的任何字符串
Kconfig

这个可以在你后续运行中通过uname命令查询到你自己编译的Linux内核的版本号,也会让新的内核在/lib/modules目录下产生新的目录文件去放置新内核的模块,而不是直接覆盖。

4.5、编译内核

这一步,我们将编译,安装内核,模块和设备树,因为是交叉编译,交叉编译用的主要性能相对于树莓派而言都是非常非常高的了,所以这一步会花费的时间会比较短,8核 i7用-j12选项一般来说25分钟就可以编完了。

32bit内核

make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

64bit内核

make -j4 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

4.6、安装内核

完成交叉编译后,需要将编译出来的内核拷贝到树梅莓里并安装内核模块。通过将SD读卡器插入编译主机的方式进行的操作会比较简单。下面就以这个为例进行说明。

将带有SD卡的SD卡读卡器插入主机,输入以下命令(注意,如果你的主机本来就有多个硬盘那么插入的SD卡可能显示的是sdc之类的,注意鉴别一下):


xxx@xx-PC:~$ lsblk -f | grep sdb
sdb
├─sdb1 vfat     FAT32 bootfs CEE7-0DF0
└─sdb2 ext4     1.0   rootfs ebadab55-bd70-46a9-8f18-995c136fb5b2
  1. 挂载这二个分区:
sudo mkdir mnt
sudo mkdir mnt/fat32
sudo mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4
  1. 安装内核模块到sd卡
  • 32bit系统
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
  • 64bit系统
sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install
  1. 安装内核与设备树(安装前可以先备份原先的内核):
  • 32bit系统
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
  • 64bit系统
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

退出SD卡,将SD卡插回树莓派,重启则可。

5、内核更新结果

我们可以看到内核版本已经变成6.1.31my_first_kernel,也已经 更新了内核编译的时间。

xxx@raspberrypi:~ $ uname -a
Linux raspberrypi 6.1.31my_first_kernel #1 Mon Jun  5 20:48:53 CST 2023 armv6l GNU/Linux

http://www.ppmy.cn/news/231381.html

相关文章

i5 13600KF参数 酷睿i53600KF什么水平i5 13600KF核显相当于什么显卡

i5-13600KF采用10工艺 14 核 20 线程,睿频 5.1GHz,三级缓存 24.00 MB基础功耗 125W,最大睿频功耗 181W i5 13600KF组装电脑怎么搭配更合适这些点很重要 http://www.adiannao.cn/du

酷睿 i5 12600KF参数 功耗 i512600kf有核显吗

intel全新推出基于10nmESF制程工艺的12代酷睿CPU,核心代号 Alder Lake-S,采用了全新LGA1700插槽,首次采用了全新的高性能混合架构,也广称为“大小核”设计,其中大核为主导性能发挥的性能核,称之为P核&#…

J4125 和 I3-6100U性能对比

J4125 是一款四核SOC,于2019年底发布。运行在2-2.7GHz,基于Gemini Lake平台。除了四个CPU内核之外,还包括具有DirectX 12功能的GPU以及DDR4/LPDDR4内存控制器。 通过鲁大师对J4125硬件进行评测如下: 通过鲁大师对I3-6100U硬件进行…

r5 5600u和i5 10300h 选哪个

Ryzen 5 5600U 为 6 核 Zen 3 设计,基础频率 2.3GHz, 加速频率 4.2GHz ,核显为 7 CU 的 Vega 优化版,显卡频率为 1.8GHz ,热设计功耗为 10-25W 。 选i5 10300H还是锐龙r5 5600u哪个好 这些点很重要!看完你就知道了 http://www.adi…

docker中orcale新建用户,以及权限授予

因为有新来员工要操作数据库的关系,我们一般不授予用户删除表的权限,或者因为用户要查一些数据,要授予用户查询视图的权限 创建用户 1、创建容器,oracle11g 为容器名 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11…

HP ProBook 440静电保护恢复方法

1.断掉电源; 2.按住电源键和F5(静音键)到30秒以上; 3.重新开机。

惠普笔记本刷linux系统教程,【高手 你会用吗?HP Linux系统笔记本】- 中关村在线...

惠普(HP)正式推出全球第一部预装Linux操作系统的笔记本电脑,代表Linux操作系统在PC市场的根又扎深一层。彭博信息引述IDC分析师Rogers Kay的话指出,Linux操作系统以往大多用于服务器类的产品上,即使用于PC上,也只有小型厂商把Linu…

HP ProBook 440 GS更改BIOS设置,开启虚拟化

不同品牌的笔记本进入BIOS的快捷键略有不同,今天刚拿到新的HP电脑,准备装虚拟机用,还是查了一下开机进入BIOS的快捷键,F10。 以下是具体操作: 一、首先在开机时按ESC,进入快捷键功能表/直接按F10进入BIOS设…