跳到主要内容

Linux 内核

如何为您的魔方派配置和构建自定义内核。

魔方派内核托管在 GitHub 上;更新速度落后于 上游 Linux 内核。目前魔方派 3 Ubuntu 24.04 LTS 的内核版本为 6.8.12。

更新内核

您在使用 sudo apt upgrade 命令更新时会自动将您的内核更新到最新的稳定版本。如果您想尝试最新的不稳定测试内核,可以 下载最新内核源码手动编译和更新内核

编译内核

编译内核分为本地构建(Native builds)和交叉编译(Cross-compilation)两种方式。

魔方派 3 上默认安装的编译器和链接器可以构建在魔方派 3 上运行的可执行文件, 为本地构建;

交叉编译是在一个平台上生成另一个平台上的可执行代码, 例如在 x86_64 机器上生成 ARM 架构的可执行文件。

下载内核源代码

在为任何目标平台构建之前,您需要内核源代码。要获取内核源代码,您需要 Git。如果您还没有安装 Git,请先在您的设备上安装它:

sudo apt install git

接下来,下载最新的魔方派 3 内核的源代码:

git clone https://github.com/rubikpi-ai/linux-ubuntu.git

这可能需要几分钟。

备注

上面的 git clone 命令会下载当前活动的分支,包含了所有提交记录和文件历史。如果您只需要最新的源代码,可以使用 git clone --depth 1 https://github.com/rubikpi-ai/linux-ubuntu.git 命令来减少下载的大小。

您如果想要下载其他分支的源代码,可以在克隆后切换到相应的分支: 进入下载的目录并使用 git checkout <branch-name> 命令切换到所需的分支。

有关可用分支的列表,请访问 魔方派内核 GitHub 仓库

现在您有了内核源代码,可以本地构建或通过交叉编译构建一个新内核。

首先,在魔方派 3 中安装编译依赖项:

sudo apt install bc bison flex libssl-dev make gcc debhelper cpio dwarfdump \
zstd llvm clang libclang-dev gawk dwarves libelf-dev dkms zip rustup

然后,进入到内核目录, 配置 rust 环境:

cd linux-ubuntu

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
cargo install --git https://github.com/rust-lang/rust-bindgen --tag v0.65.1 bindgen-cli
sudo cp ~/.cargo/bin/bindgen /usr/bin/bindgen
sudo cp /usr/bin/bindgen /usr/bin/bindgen-0.65
rustup override set $(scripts/min-tool-version.sh rustc)
rustup component add rust-src

若出现了下面内容,请输入回车, 使用默认配置。

使用下面命令验证 rust 环境是否配置成功。

make LLVM=1 rustavailable

如果成功,您将看到类似以下的输出:

Rust is available!

接下来,构建内核。此步骤可能需要很长时间。

fakeroot debian/rules clean
fakeroot debian/rules build
fakeroot debian/rules binary
备注

fakeroot debian/rules build 命令会根据 CPU 核心数自动并行编译内核,魔方派的 CPU 核心数为 8,因此会使用 8 个线程进行编译。

安装内核:

进入到 linux-ubuntu 的上层目录,将生成的内核包安装到系统中。

cd ..
sudo dpkg -i linux-*.deb

最后,运行以下命令重新启动您的魔方派 3 并运行新编译的内核:

sudo reboot

配置内核

Linux 内核具有高度可配置性。有些用户可能希望修改默认配置,使其符合自己的需求,例如启用新的或实验性的网络协议,或启用对新硬件的支持。

配置通常通过 make menuconfig 界面完成。或者,您也可以手动修改 .config 文件,但这可能更加困难。

准备配置

menuconfig 工具需要 ncurses 开发头文件才能正确编译。要安装这些头文件,请运行以下命令:

sudo apt install libncurses5-dev

接下来,下载你的内核源代码。特别要注意的是,确保您已经完成了 本地编译或交叉编译 的步骤。

设置好所有内容后,您可以编译并运行 menuconfig 程序,如下所示:

cd linux-ubuntu/debian/build/build-rubikpi

make menuconfig

要使用 menuconfig ,请使用键盘:

  • 使用箭头键进行方向导航

  • 按 Enter 键进入子菜单(以 ---> 表示)

  • 按两次 Esc 键返回上一级或退出

  • 按空格键切换选项的启用或禁用状态

  • 按 Enter 键打开子菜单,使用箭头键浏览子菜单,再次按 Enter 键选择状态

  • 按 H 键获取选项或菜单的帮助

在进行简短编译后,menuconfig 会显示一个子菜单列表,其中包含所有可配置的选项。选项很多,请耐心阅读。第一次尝试时,请抵制启用或禁用大量选项的诱惑;配置很容易被破坏,因此请从小处着手,熟悉配置和构建过程。

保存更改

完成更改后,请按住 Esc 键,直到系统提示您保存新配置。默认情况下,保存到 .config 文件中。您可以通过复制此文件来保存和加载配置。

自定义完成后,您现在就可以构建内核了。

cd linux-ubuntu

fakeroot debian/rules build

构建完成后,您可以参考 编译内核 中的方法安装内核。

应用内核补丁

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

硬件制造商有时会提供补丁集作为临时措施,以便在补丁被纳入 Linux 内核和 RUBIK Pi 内核之前支持新硬件。然而,也存在用于其他目的的补丁集,例如,为了实现完全可抢占的内核以实现实时使用。

确定您的内核版本

要检查设备当前运行的内核版本,请运行以下命令:

uname -r

在应用补丁之前,请务必检查内核版本。在内核源目录中,运行以下命令查看内核版本:

head Makefile -n 4

您应该看到类似以下内容的输出:

# SPDX-License-Identifier: GPL-2.0
VERSION = 6
PATCHLEVEL = 8
SUBLEVEL = 12

在本例中,源代码适用于 6.8.12 内核。

应用补丁

补丁的应用取决于补丁分发的格式。

开发者将大多数补丁以单个文件的形式分发。请使用 patch 实用程序应用这些补丁。以下命令将下载、解压缩并使用实时内核补丁来修补我们的示例内核版本:

wget https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/patch-6.8.2-rt11.patch.gz
gunzip patch-6.8.2-rt11.patch.gz
cat patch-6.8.2-rt11.patch.gz | patch -p1

有些开发者会以邮箱的形式分发补丁,即一个包含多个补丁文件的文件夹。使用 Git 来应用这些补丁。 在使用 Git 应用邮箱补丁之前,请使用名称和电子邮件配置本地 Git 安装:

git config --global user.name "your name"
git config --global user.email "your email"

要使用 Git 应用邮箱格式的补丁,请运行以下命令:

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

请务必遵循补丁分发者提供的说明。例如,某些补丁集需要针对特定提交进行修补。

内核头文件

要编译内核模块,您需要 Linux 内核头文件。这些头文件提供了编译与内核接口的代码所需的函数和结构定义。

如果您从 GitHub 克隆了整个内核,则这些头文件已包含在源代码树中。如果您不需要所有额外的文件,可以使用 apt 命令在魔方派3 中仅安装内核头文件。

sudo apt install linux-headers-$(uname -r)
备注

安装可能需要几分钟。没有进度指示器。

贡献您的代码

您可能出于多种原因想要将某些内容添加到内核中:

  • 您编写了一些魔方派专用代码,希望每个人都能从中受益

  • 您为某个设备编写了一个通用的 Linux 内核驱动程序,并希望每个人都能使用它

  • 您修复了一个通用的内核错误

  • 您修复了一个魔方派专用的内核错误

对于魔方派专用的更改或错误修复,请向魔方派内核提交 Pull Requset(PR)请求。对于常规的 Linux 内核更改(例如新的驱动程序),请先向上游 Linux 内核提交 Pull Requset。一旦 Linux 内核接受了您的更改,我们就会内核更新时将其合并到魔方派内核中。

为魔方派内核贡献代码

首先,fork 魔方派内核代码库 并将其克隆到您的开发设备上。然后,您可以进行更改、测试,并将其提交到您的 fork 代码库中。

然后,向魔方派内核代码库 提交包含您更改的拉取请求。魔方派工程师将审核您的贡献并提出改进建议。一旦获得批准,我们将合并您的更改,这些更改最终将纳入魔方派内核的稳定版本。

为上游 Linux 内核贡献代码

首先,将 Linux 内核树 克隆到您的开发设备。然后,您可以进行更改、测试,并将其提交到本地树中。

更改准备就绪后,您可以将其提交给 Linux 内核社区。Linux 内核开发通过邮件列表进行,而不是在 GitHub 上进行。为了使您的更改成为 Linux 的一部分,请将其作为补丁程序通过电子邮件发送给社区。请遵循 Linux 内核文档中的提交补丁程序:将代码放入内核的基本指南Linux 内核编码风格。Linux 内核贡献者将审核您的贡献并提出改进建议。一旦获得批准,他们就会合并您的更改。最终,这些更改将进入 Linux 内核的长期版本。一旦我们测试了该长期版本与魔方派内核的兼容性,您的更改将进入魔方派内核的稳定版本。