Skip to content

内核构建

操作系统随附的默认编译器和链接器被配置为构建可执行文件以在该操作系统上运行-它们是本机工具-但这不是必须的。交叉编译器被配置为为目标而不是运行构建过程的目标生成代码,使用它称为交叉编译。

树莓派内核的交叉编译很有用,原因有两个:

它允许使用 32 位 OS 构建 64 位内核,反之亦然,并且 即使是普通的笔记本电脑也可以比 Pi 本身更快地交叉编译 Pi 内核。

下面的说明分为本地构建和交叉编译。选择适合您情况的部分-尽管两者之间有许多共同的步骤,但也有一些重要的区别。

当地建筑

在树莓派上,首先安装[树莓派 OS]的最新版本(https://www.raspberrypi.org/downloads/)。然后启动您的 Pi ,插入以太网以访问源,然后登录。

首先安装 Git 和构建依赖项:

`` sudo apt install git bc bison flex libssl-dev make


接下来获取源,这将需要一些时间:

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

选择来源

上面的 git clone命令将下载当前的活动分支(我们正在从中构建树莓派 OS映像的分支),而没有任何历史记录。省略--depth = 1将会下载整个存储库,包括所有分支的全部历史记录,但这会花费更长的时间并且占用更多的存储空间。

要下载另一个分支(同样没有历史记录),请使用--branch选项:

`` git clone --depth = 1 --branch <分支> https://github.com/raspberrypi/linux


其中" <branch>"是您要下载的分支的名称。

有关可用分支的信息,请参考[原始 GitHub 存储库](https://github.com/raspberrypi/linux)。

### 内核配置

配置内核;以及默认配置,您可能希望[更详细地配置内核](configuring.md)或[应用来自其他来源的补丁](patching.md),以添加或删除所需的功能。

<a name="default_configuration"> </a>
#### 应用默认配置

首先,根据您的树莓派版本,通过运行以下命令来准备默认配置:

##### 树莓派 1,Pi Zero,Pi Zero W和 Compute  Module默认构建配置

``
光盘 Linux 
内核=内核
制作 bcmrpi _defconfig
树莓派 2,Pi 3,Pi 3+和 Compute Module 3默认构建配置

`` 光盘 Linux 内核=内核 7 使 bcm2709 _defconfig


##### 树莓派 4默认构建配置

``
光盘 Linux 
内核=内核 7l 
制作 bcm2711 _defconfig

使用 LOCALVERSION 自定义内核版本

除了更改内核配置之外,您可能还希望调整 LOCALVERSION 以确保新内核不会收到与上游内核相同的版本字符串。这既说明您在 uname 的输出中运行自己的内核,又确保/lib/modules中的现有模块不会被覆盖。

为此,请在.config中更改以下行:

CONFIG_LOCALVERSION ="-v7l-MY_CUSTOM_KERNEL"

您也可以按照内核配置说明中的说明以图形方式更改该设置。它位于"常规设置" =>"本地版本-附加到内核发行版"中。

建造

构建并安装内核,模块和设备树 blob ;根据使用的 Pi 型号,此步骤可能需要**较长的时间:

`` 使-j4 zImage模块 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


**注意**:在树莓派 2/3/4上," -j4"标志将工作分配到所有四个内核之间,从而显着加快了编译速度。

## 交叉编译

首先,您将需要合适的 Linux 交叉编译主机。我们倾向于使用 Ubuntu 。因为树莓派 OS是
同样是 Debian 发行版,它意味着很多方面都是相似的,例如命令行。

您可以使用 Windows 上的 VirtualBox (或 VMWare )执行此操作,也可以将其直接安装到计算机上。作为参考,可以在线[在 Wikihow ](http://www.wikihow.com/Install-Ubuntu-on-VirtualBox)上遵循说明。

### 安装必需的依赖项和工具链

要构建用于交叉编译的源,请通过执行以下命令确保您对计算机具有所需的依赖关系:
``
 sudo  apt  install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

如果您发现需要其他东西,请提交请求请求以更改文档。

为 32 位内核安装 32 位工具链

`` sudo apt install crossbuild-essential-armhf ```####或者,为 64 位内核 bash 安装 64 位工具链 sudo apt install crossbuild-essential-arm64


### 获取资源

要下载当前分支的最小源代码树,请运行:

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

有关如何选择其他分支的说明,请参见上面的选择源

构建源

输入以下命令来构建源文件和设备树文件:

32位配置

对于 Pi 1,Pi Zero,Pi Zero W或计算模块:

`` 光盘 Linux 内核=内核 使 ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- bcmrpi_defconfig


对于 Pi  2,Pi 3,Pi 3+或计算模块 3 :

``
光盘 Linux 
内核=内核 7 
使 ARCH  = arm CROSS_COMPILE = arm-linux-gnueabihf- bcm2709_defconfig

对于树莓派 4:

`` 光盘 Linux 内核=内核 7l 使 ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- bcm2711_defconfig


#### 64位配置
对于 Pi  3,Pi 3+或计算模块 3 :
``
光盘 Linux 
内核=内核 8 
使 ARCH  = arm64 CROSS_COMPILE = aarch64-linux-gnu- bcmrpi3_defconfig

对于树莓派 4: `` 光盘 Linux 内核=内核 8 使 ARCH = arm64 CROSS_COMPILE = aarch64-linux-gnu- bcm2711_defconfig


#### 使用配置进行构建

**注意**:为了加快多处理器系统上的编译速度并在单处理器系统上获得一些改进,请使用-j n,其中 n 是处理器数* 1.5。另外,您也可以尝试一下,看看有什么用!

##### 对于所有 32 位版本
``
使 ARCH  = arm CROSS_COMPILE = arm-linux-gnueabihf- zImage模块 dtbs 
对于所有 64 位版本

注意:请注意 32 位和 64 位图像目标之间的差异。 `` 使 ARCH = arm64 CROSS_COMPILE = aarch64-linux-gnu-映像模块 dtbs


### 直接安装到 SD 卡上

构建内核之后,您需要将其复制到树莓派上并安装模块。最好直接使用 SD 卡读卡器完成此操作。

首先,在插入 SD 卡之前和之后使用`lsblk`进行识别。您应该以如下形式结束:

数据库 sdb1 sdb2


其中 sdb1 是 FAT (引导)分区,而 sdb2 是 ext4 文件系统(根)分区。

如果是 NOOBS 卡,则应该看到以下内容:

数据库 sdb1 sdb2 sdb5 sdb6 sdb7


其中 sdb6 是 FAT (引导)分区,而 sdb7 是 ext4 文件系统(根)分区。

首先安装这些,并根据需要调整 NOOBS 卡的分区号:

``
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
 sudo 挂载/dev/sdb6 mnt/fat32
 sudo 挂载/dev/sdb7 mnt/ext4

接下来,将内核模块安装到 SD 卡上:

对于 32 位

`` sudo env PATH = $ PATH make ARCH = arm CROSS_COMPILE = arm-linux-gnueabihf- INSTALL_MOD_PATH = mnt/ext4 modules_install


#### 对于 64 位
``
sudo env PATH = $ PATH make ARCH = arm64 CROSS_COMPILE = aarch64-linux-gnu- INSTALL_MOD_PATH = mnt/ext4 modules_install

最后,将内核和设备树 blob 复制到 SD 卡上,确保备份旧内核:

对于 32 位

`` 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


#### 对于 64 位

``
 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

另一种选择是将内核复制到同一位置,但使用不同的文件名(例如,kernel-myconfig.img),而不是覆盖 kernel .img文件。然后,您可以编辑 config .txt文件以选择 Pi 引导进入的内核:

内核=内核 myconfig .img

这样做的好处是,可以使内核与系统和任何自动更新工具管理的内核映像分开,并允许您在内核无法启动的情况下轻松地还原到常规内核。

最后,将卡插入 Pi 并启动!