返回列表 发布新帖
查看: 141|回复: 1

(原创/技术向教程)为NanoPi R3s 编译一个支持eBPF的Ubuntu内核

9 金币 回复本帖可获得 1 金币奖励! 每人限 1 次(中奖概率 50%)
发表于 2025-6-10 23:10:10 | 查看全部 |阅读模式

欢迎注册账号,享受无广告更清爽的界面!

您需要 登录 才可以下载或查看,没有账号?注册

×
第一步:安装编译依赖
使用 amd64 架构的 Ubuntu 20.04 操作系统即可。
  1. sudo apt-get -y update
  2. sudo apt-get install -y sudo curl
  3. sudo bash -c "$(curl -fsSL <a href="https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh" target="_blank">https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh</a>)"
复制代码

大陆用户可使用以下命令以获得更快的下载速度:
  1. sudo bash -c "$(curl -fsSL <a href="http://112.124.9.243:3000/friendlyelec/build-env-on-ubuntu-bionic/raw/branch/cn/install.sh" target="_blank">http://112.124.9.243:3000/friendlyelec/build-env-on-ubuntu-bionic/raw/branch/cn/install.sh</a>)"
复制代码
上述脚本运行成功后,会在在 Ubuntu 安装以下交叉编译器:
版本 架构 编译器路径 用途
4.9.3 armhf /opt/FriendlyARM/toolchain/4.9.3 用于编译 armhf 架构的应用程序
6.4 aarch64 /opt/FriendlyARM/toolchain/6.4-aarch64 用于交叉编译 4.4 内核
11.3 aarch64 /opt/FriendlyARM/toolchain/11.3-aarch64 用于交叉编译 4.19 及以上内核(含 5.10, 6.1)及 uboot

第二步:设置环境变量
使用 vim 编辑 ~/.bashrc,使用 GG 跳到文件结尾,另起一行加入以下内容:
  1. export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin:$PATH
  2. export GCC_COLORS=auto
复制代码
使用WSL进行编译时,请额外添加 export PATH=$(echo "$PATH" | tr ':' '\n' | grep -v '^/mnt/c/' | tr '\n' ':' | sed 's/:$//')

执行以下命令使环境变量生效:
  1. . ~/.bashrc
复制代码

验证是否安装成功:
  1. aarch64-linux-gcc -v
复制代码

输出应包含以下信息:
  1. Using built-in specs.
  2. COLLECT_GCC=aarch64-linux-gcc
  3. ...
  4. gcc version 11.3.0 (ctng-1.25.0-119g-FA)
复制代码

第三步:下载源代码(请下载NanoPi官方验证版本)
  1. git clone <a href="https://github.com/friendlyarm/kernel-rockchip" target="_blank">https://github.com/friendlyarm/kernel-rockchip</a> --single-branch --depth 1 -b nanopi6-v6.1.y kernel-rockchip
  2. cd kernel-rockchip
  3. export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
  4. touch .scmversion
复制代码

第四步:加入 eBPF 支持
使用 vim 编辑 arch/arm64/configs/nanopi5_linux_defconfig 文件,跳到文件结尾,添加以下依赖项:
  1. CONFIG_DEVEL=y
  2. CONFIG_DEBUG_INFO=y
  3. CONFIG_DEBUG_INFO_REDUCED=n
  4. CONFIG_DEBUG_INFO_BTF=y
  5. CONFIG_CGROUPS=y
  6. CONFIG_CGROUP_BPF=y
  7. CONFIG_BPF_EVENTS=y
  8. CONFIG_BPF_TOOLCHAIN_HOST=y
  9. CONFIG_XDP_SOCKETS=y
  10. CONFIG_PACKAGE_kmod-xdp-sockets-diag=y
复制代码

第五步:编译
配置内核
  1. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 nanopi5_linux_defconfig
复制代码

编译内核
  1. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 -j$(nproc)
复制代码

编译驱动模块
  1. mkdir -p out-modules && rm -rf out-modules/*
  2. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
  3. make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules" modules_install
复制代码

获取内核版本:
  1. KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
复制代码

确保生成的模块依赖文件存在:
  1. [ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
  2. (cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)
复制代码

第六步:打包 kernel.img
下载并设置可执行权限:
  1. wget <a href="https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3566/kernel-6.1.y/tools/mkkrnlimg" target="_blank">https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3566/kernel-6.1.y/tools/mkkrnlimg</a> && chmod 755 mkkrnlimg
复制代码

生成 kernel.img:
  1. ./mkkrnlimg arch/arm64/boot/Image kernel.img
复制代码

完成后会得到如下文件:
  1. kernel.img
  2. 驱动模块位于 out-modules 目录
复制代码

第七步:安装 kernel
在开发板命令台,使用 parted 命令查看分区布局(如果缺少该包,可以通过 apt install parted 安装):
  1. parted /dev/mmcblk2 print
复制代码

得到如下输出:
  1. Model: MMC AT3SFB (sd/mmc)
  2. Disk /dev/mmcblk2: 31.3GB
  3. ...
  4. Number  Start   End     Size    File system  Name      Flags
  5. 1      8389kB  12.6MB  4194kB               uboot
  6. 2      12.6MB  16.8MB  4194kB               misc
  7. ...
  8. 5      37.7MB  79.7MB  41.9MB               kernel
  9. ...
复制代码

kernel 分区的序号为 5,对应的设备节点为 /dev/mmcblk2p5,使用 dd 命令如下:
  1. dd if=kernel.img of=/dev/mmcblk2p5 bs=1M
复制代码

第八步:安装新内核驱动模块
必须安装新驱动模块(否则可能会导致网卡驱动失效)。
将编译产生的 out-modules 目录上传并替换 /lib/modules 目录下的文件即可。
最后验证替换成功,进入 /lib/modules 目录,可以看到名字与新安装内核版本相同的文件夹,例如:
  1. #ls /lib/modules/
  2. 6.1.99
复制代码

结尾(免责声明):
  1. 本文步骤按照官方Wiki制作,操作前请确保有技术实力,其他需求和usb线刷救砖文件请转到官方文档自寻。
  2. 附官方链接 <a href="https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R3S/zh" target="_blank">https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R3S/zh</a>
复制代码


爱生活,爱奶昔~
发表于 2025-6-10 23:11:42 | 查看全部

回帖奖励 +1 金币

为啥不用Markdown啊,而且论坛有MdEdit(Markdown编辑器)
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 卡粉专属群
  • 官方电报群
© 2025 Naixi Networks 沪ICP备13020230号-1|沪公网安备 31010702007642号
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表