当前位置: 首页 > news >正文

树莓派linux内核源码编译

Raspberry Pi 内核 托管在 GitHub 上;更新滞后于上游 Linux内核,Raspberry Pi 会将 Linux 内核的长期版本整合到 Raspberry Pi 内核中。

1 构建内核

操作系统随附的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。原生编译使用这些默认编译器和链接器。交叉编译是为运行编译过程的目标之外的目标编译代码的过程。Raspberry Pi 内核的交叉编译允许从 32 位操作系统构建 64 位内核,反之亦然。也可以从 Raspberry Pi 以外的设备交叉编译 32 位或 64 位 Raspberry Pi 内核。

1.1 下载内核源代码

下载最新 Raspberry Pi 内核的源代码:

git clone --depth=1 https://github.com/raspberrypi/linux

上面的 git clone 命令下载的是当前活动分支,从这个分支构建 Raspberry Pi 操作系统镜像,没有任何历史记录。省略 --depth=1可以下载整个版本库,包括所有分支的完整历史。
要下载不带历史记录的不同分支,在上述命令中添加 --branch 选项,并将 替换为要下载的分支名称
bashgit clone --depth=1 --branch <branch> https://github.com/raspberrypi/linux

1.2 原生构建内核
1.2.1 安装编译依赖项
sudo apt install bc bison flex libssl-dev make
1.2.2 构建配置

在构建内核时应用默认配置。准备默认配置,需要根据 Raspberry Pi 型号运行相应命令,这里使用的是树莓派5,命令为:

cd linux
KERNEL=kernel_2712
make bcm2712_defconfig
1.2.3 使用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION

修改 .config 中的以下一行:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
1.2.4 构建

构建内核。这一步可能需要很长时间, 取决于 Raspberry Pi 型号:

# 构建 64 位内核
make -j6 Image.gz modules dtbs# 构建 32 位内核
make -j6 zImage modules dtbs
1.2.5 安装内核

将内核模块安装到启动媒体上:

sudo make -j6 modules_install

然后,将内核和设备树 blobs 安装到启动分区中,并备份原始内核。

如果不想在运行此命令的 Raspberry Pi 上安装刚编译好的内核,可将编译好的内核复制到另一个启动介质的启动分区,而不是 /boot/firmware/。

  • 安装 64 位内核:
# 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、覆盖层、README,并卸载分区
sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
  • 安装 32 位内核:
# 创建当前内核的备份,然后安装新的内核映像
sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img# 根据内核版本,运行以下命令
# 对于版本 6.4 以下的内核:
sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
# 适用于 6.5 及以上版本的内核:
sudo cp arch/arm/boot/dts/broadcom/*.dtb /boot/firmware/# 复制覆盖层和 README
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
  • 运行以下命令重启 Raspberry Pi 并运行新编译的内核
sudo reboot
1.3 交叉编译内核

首先需要准备一台合适的 Linux 交叉编译主机,这里使用的是 ubuntu。

1.3.1 安装所需的依赖项和工具链
sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev# 安装 64 位工具链以构建 64 位内核,请运行以下命令
sudo apt install crossbuild-essential-arm64# 安装 32 位工具链以构建 32 位内核,请运行以下命令
sudo apt install crossbuild-essential-armhf
1.3.2 编译配置

在构建内核时应用默认配置。准备默认配置,需要根据 Raspberry Pi 型号运行相应命令,这里使用的是树莓派5,命令为:

cd linux
KERNEL=kernel_2712
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig
1.3.3 使用 LOCALVERSION 自定义内核版本

为防止内核覆盖 /lib/modules 中的现有模块,并在 uname 输出中说明运行的是自己的内核,调整 LOCALVERSION

修改 .config 中的以下一行:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
1.3.4 构建
  • 构建 64 位内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- 映像模块 dtbs
  • 构建 32 位内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage 模块 dtbs
1.3.5 安装内核

构建内核后,需要将其复制到 Raspberry Pi 的启动媒体(可能是 SD 卡或 SSD)上并安装模块。

  • 查找启动媒体
    首先,运行 lsblk。然后,连接启动媒体。再次运行 lsblk;新设备代表启动媒体
    例如我这里的输出为:
sdbsdb1sdb2

将这些分区挂载为 mnt/boot 和 mnt/root,调整分区代号以匹配启动媒体的位置:

mkdir mnt
mkdir mnt/boot
mkdir mnt/root
sudo mount /dev/sdb1 mnt/boot
sudo mount /dev/sdb2 mnt/root
  • 安装
    将内核模块安装到启动媒体上:
# 对于 64 位内核
sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install# 对于 32 位内核
sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install
  • 将内核和设备树 blob 安装到启动分区,并备份原始内核
# 安装 64 位内核
sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
sudo umount mnt/boot
sudo umount mnt/root# 安装 32 位内核
sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
# 对于版本 6.4 以下的内核
sudo cp arch/arm/boot/dts/*.dtb mnt/boot/
#  6.5 及以上版本的内核
sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
sudo umount mnt/boot
sudo umount mnt/root

最后,将启动媒体连接到 Raspberry Pi 并接通电源,运行新编译的内核。

2 配置内核

Linux 内核是高度可配置的, 以便根据自己的需要进行定制,例如启用新的或试验性的网络协议,或启用对新硬件的支持。最常见的配置方法是通过 make menuconfig 界面完成, 也可以手动修改你的 .config 文件:

2.1 准备配置

menuconfig 工具需要 ncurses 开发头文件才能正常编译:

sudo apt install libncurses5-dev

接下来,下载内核源代码。

2.2 menuconfig

编译并运行 menuconfig 工具:

make menuconfig# 交叉编译 64 位内核:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
# 交叉编译 32 位内核:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

简短编译后,menuconfig 将显示包含所有可配置选项的子菜单列表。第一次尝试时,不要轻易启用或禁用很多选项;这样很容易破坏配置。

3 内核补丁

在构建自定义内核时,可能希望在 Linux 内核中应用补丁或补丁集(patchsets)。

3.1 确定内核版本

查看设备上当前运行的内核版本:

uname -r
# 6.6.51+rpt-rpi-2712

在打补丁之前,务必检查内核版本。在内核源代码目录下,运行以下命令查看内核版本:

head Makefile -n n# 类似下面的输出:
# SPDX-License-Identifier: GPL-2.0
VERSION = 6
PATCHLEVEL = 1
SUBLEVEL = 38
EXTRAVERSION =
NAME = Pinguïn Aangedreven

这里可以看到版本为 6.1.38。

3.2 应用补丁

补丁的应用取决于补丁的发布格式。开发者会以单个文件的形式发布大多数补丁。使用 patch 工具来打补丁。

以下命令将下载、解压缩并使用实时内核补丁:

wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.38-rt13-rc1.patch.gz
gunzip patch-6.1.38-rt13-rc1.patch.gz
cat patch-6.1.38-rt13-rc1.patch | patch -p1

有些开发者会以 邮箱格式 发布补丁,即一个包含多个补丁文件的文件夹。使用 Git 可以打上这些补丁:

git am -3 /path/to/patches/*

相关文章:

树莓派linux内核源码编译

Raspberry Pi 内核 托管在 GitHub 上&#xff1b;更新滞后于上游 Linux内核&#xff0c;Raspberry Pi 会将 Linux 内核的长期版本整合到 Raspberry Pi 内核中。 1 构建内核 操作系统随附的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。原生编译使用这些默…...

本地小主机安装HomeAssistant开源智能家居平台打造个人AI管家

文章目录 前言1. 添加镜像源2. 部署HomeAssistant3. HA系统初始化配置4. HA系统添加智能设备4.1 添加已发现的设备4.2 添加HACS插件安装设备 5. 安装cpolar内网穿透5.1 配置HA公网地址 6. 配置固定公网地址 前言 大家好&#xff01;今天我要向大家展示如何将一台迷你的香橙派Z…...

SpringBoot返回文件让前端下载的几种方式

01 背景 在后端开发中&#xff0c;通常会有文件下载的需求&#xff0c;常用的解决方案有两种&#xff1a; 不通过后端应用&#xff0c;直接使用nginx直接转发文件地址下载&#xff08;适用于一些公开的文件&#xff0c;因为这里不需要授权&#xff09;通过后端进行下载&#…...

人工智能及深度学习的一些题目

1、一个含有2个隐藏层的多层感知机&#xff08;MLP&#xff09;&#xff0c;神经元个数都为20&#xff0c;输入和输出节点分别由8和5个节点&#xff0c;这个网络有多少权重值&#xff1f; 答&#xff1a;在MLP中&#xff0c;权重是连接神经元的参数&#xff0c;每个连接都有一…...

15-利用dubbo远程服务调用

本文介绍利用apache dubbo调用远程服务的开发过程&#xff0c;其中利用zookeeper作为注册中心。关于zookeeper的环境搭建&#xff0c;可以参考我的另一篇博文&#xff1a;14-zookeeper环境搭建。 0、环境 jdk&#xff1a;1.8zookeeper&#xff1a;3.8.4dubbo&#xff1a;2.7.…...

【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问

8.5.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…...

未来网络技术的新征程:5G、物联网与边缘计算(10/10)

一、5G 网络&#xff1a;引领未来通信新潮流 &#xff08;一&#xff09;5G 网络的特点 高速率&#xff1a;5G 依托良好技术架构&#xff0c;提供更高的网络速度&#xff0c;峰值要求不低于 20Gb/s&#xff0c;下载速度最高达 10Gbps。相比 4G 网络&#xff0c;5G 的基站速度…...

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…...

Uniapp在浏览器拉起导航

Uniapp在浏览器拉起导航 最近涉及到要在浏览器中拉起导航&#xff0c;对目标点进行路线规划等功能&#xff0c;踩了一些坑&#xff0c;找到了使用方法。&#xff08;浏览器拉起&#xff09; 效果展示 可以拉起三大平台及苹果导航 点击选中某个导航&#xff0c;会携带经纬度跳转…...

公平联邦学习——多目标优化

前言 前段时间接触到了联邦学习&#xff08;Federated Learning, FL&#xff09;。涉猎了几年多目标优化的我&#xff0c;惊奇地发现横向联邦学习里面也有用多目标优化来做的。于是有感而发&#xff0c;特此写一篇博客记录记录&#xff0c;如有机会可以和大家多多交流。遇到不…...

奇怪的Python:为何字符串要设置成不可变的?

你好&#xff01;我是老邓。今天我们来聊聊 Python 中字符串不可变这个话题。 1、问题简介&#xff1a; Python 中&#xff0c;字符串属于不可变对象。这意味着一旦字符串被创建&#xff0c;它的值就无法被修改。任何看似修改字符串的操作&#xff0c;实际上都是创建了一个新…...

Vue-Router之嵌套路由

在路由配置中&#xff0c;配置children import Vue from vue import VueRouter from vue-routerVue.use(VueRouter)const router new VueRouter({mode: history,base: import.meta.env.BASE_URL,routes: [{path: /,redirect: /home},{path: /home,name: home,component: () &…...

MyBatis使用的设计模式

目录 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 单例模式&#xff08;Singleton Pattern&#xff09; 3. 代理模式&#xff08;Proxy Pattern&#xff09; 4. 装饰器模式&#xff08;Decorator Pattern&#xff09; 5. 观察者模式&#xff08;Observer Patt…...

arm rk3588 升级glibc2.31到2.33

一、查看glibc版本 rootztl:~# ldd --version ldd (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31 Copyright (C) 2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNE…...

【Linux系列】sed命令的深入解析:如何使用sed删除文件内容

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

C++ 设计模式:桥接模式(Bridge Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 装饰模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将抽象部分&#xff08;业务功能&#xff09;与实现部分&#xff08;平台实现&#xff09;分离&#xff0c;使它们…...

MATLAB中whitespacePattern函数用法

目录 语法 说明 示例 匹配空白字符 替换非标准空白 更正错误的间距 whitespacePattern函数的功能是匹配空白字符。 语法 pat whitespacePattern pat whitespacePattern(N) pat whitespacePattern(minCharacters,maxCharacters) 说明 pat whitespacePattern 创建一…...

Django多字段认证的实现

Django多字段认证 需求&#xff1a; django认证的检查用户是username&#xff0c;如果使用 username和 手机号验证登录。 重写&#xff1a; ModelBackend 类下的 authenticate 方法 # 在对应应用下创建 utils.py""" 修改Django认证类&#xff0c;为了实现 …...

【AndroidAPP】权限被拒绝:[android.permission.READ_EXTERNAL_STORAGE],USB设备访问权限系统报错

一、问题原因 1.安卓安全性变更 Android 12 的安全性变更&#xff0c;Google 引入了更严格的 PendingIntent 安全管理&#xff0c;强制要求开发者明确指定 PendingIntent 的可变性&#xff08;Mutable&#xff09;或不可变性&#xff08;Immutable&#xff09;。 但是&#xf…...

SQL进阶技巧:如何分析连续签到领金币数问题?

目录 0 题目需求 1 数据准备 2 问题分析 2.1 代码实现 2.2 代码功能分析 第一段 SQL...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...