type
Post
status
Published
slug
2023/11/09/run-dae-on-Raspberry-Pi-OS
summary
tags
Linux
树莓派
category
技术分享
icon
password
new update day
Property
Nov 9, 2023 04:03 AM
created days
Last edited time
Nov 9, 2023 04:03 AM

0 查看要求

因为大鹅是基于 Linux ebpf 子系统,所以需要内核在 5.8 版本以上,并且支持 btf ,而默认的 Raspberry Pi OS 的内核虽然版本达到了要求,但是没有编译对应的 btf 内核特性,所以需要进行手动编译,并进行内核替换。

1 配置交叉编译环境

因为涉及到树莓派的内核编译,而树莓派的性能羸弱,如果直接在树莓派上进行内核编译,不知道猴年马月能够完成编译,所以准备使用交叉编译的方法进行内核编译。

1.1 安装 crosstool-ng

sudo pacman -S --needed git base-devel sudo pacman -S bc git clone https://aur.archlinux.org/yay.git cd yay makepkg -si sudo pacman -S clang llvm yay -S crosstool-ng

1.2 查看 crosstool-ng 预制配置文件

ct-ng show-aarch64-rpi4-linux-gnu [G...] aarch64-rpi4-linux-gnu Languages : C,C++ OS : linux-6.4 Binutils : binutils-2.40 Compiler : gcc-13.2.0 C library : glibc-2.38 Debug tools : gdb-13.2 Companion libs : expat-2.5.0 gettext-0.21 gmp-6.2.1 isl-0.26 libiconv-1.16 mpc-1.2.1 mpfr-4.2.1 ncurses-6.4 zlib-1.2.13 zstd-1.5.5 Companion tools :

1.3 使用 crosstool-ng 配置交叉编译工具

mkdir ct-ng cd ct-ng ct-ng aarch64-rpi4-linux-gnu ct-ng menuconfig # 配置一些需要的参数,工具链存储地址等信息 ct-ng build # 构建交叉编译工具链,等待完成 ## 编译完成的后工具链存储的地址 ls /home/XXX/x-tools/aarch64-rpi4-linux-gnu/bin

1.4 下载 raspberrypi linux 源码

git clone --depth=1 https://github.com/raspberrypi/linux.git rpi-linux-6.1.x cd rpi-linux-6.1.x

1.5 开始编译内核

export PATH=$PATH:/home/XXX/x-tools/aarch64-rpi4-linux-gnu/bin # 生成默认配置 make ARCH=arm64 CROSS_COMPILE=aarch64-rpi4-linux-gnu- bcm2711_defconfig # 开启配置菜单 make ARCH=arm64 CROSS_COMPILE=aarch64-rpi4-linux-gnu- menuconfig # 开启下面的内核编译选项 CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT=y CONFIG_DEBUG_INFO_COMPRESSED_ZLIB=y CONFIG_DEBUG_INFO_BTF=y CONFIG_KPROBE_EVENTS=y CONFIG_BPF_EVENTS=y CONFIG_RING_BUFFER=y CONFIG_TRACING=y CONFIG_STACKTRACE=y CONFIG_NOP_TRACER=y CONFIG_BINARY_PRINTF=y CONFIG_EVENT_TRACING=y CONFIG_TRACE_CLOCK=y CONFIG_TASKS_RCU=y # 开始编译 make -j10 ARCH=arm64 CROSS_COMPILE=aarch64-rpi4-linux-gnu- # 安装模块到上级目录,会有一个 lib 目录 make -j10 ARCH=arm64 CROSS_COMPILE=aarch64-rpi4-linux-gnu- INSTALL_MOD_PATH=../ modules_install

1.6 复制内核与模块到树莓派

# 压缩 tar cvfh lib.tar lib/ # 解压 tar xf lib.tar

1.7 在树莓派上执行内核替换

首先切换目录:lib/modules/6.1.61-v8+/source/arch/arm64/boot/
执行以下命令:
cp Image /boot/kernel8.img cp dts/broadcom/*.dtb /boot/ cp dts/overlays/*.dtb* /boot/overlays/ cp dts/overlays/README /boot/overlays/

1.8 安装内核模块

make ARCH=arm64 modules_install

1.9 修改配置文件(可选)

树莓派默认是用32位内核启动,需要修改 boot 分区下的 config.txt 文件
arm_64bit=1 kernel=kernel8.img

1.10 重启

执行 reboot 启动后执行
uname -a
可查看内核版本,是否成功更换内核。
 

2 安装大鹅

手动下载 dae 与 daed 进行配置安装,并编写 systemd 服务文件,其他省略(因为可以正常运行,并且官方文档写的挺仔细的)。

3 遇到的问题

3.1 非对称路由无法使用

💡
这里的旁路由定义为:1,被设为网关。2,对 TCP/UDP 进行 SNAT。3,LAN 接口和 WAN 接口属于同一个网段。
具体现象:关闭 dae 开始内核转发参数设备可以正常上网。
sudo sysctl -a | grep forward net.ipv4.conf.all.bc_forwarding = 0 net.ipv4.conf.all.forwarding = 1 net.ipv4.conf.all.mc_forwarding = 0 net.ipv4.conf.default.bc_forwarding = 0 net.ipv4.conf.default.forwarding = 1 net.ipv4.conf.default.mc_forwarding = 0 net.ipv4.conf.eth0.bc_forwarding = 0 net.ipv4.conf.eth0.forwarding = 1 net.ipv4.conf.eth0.mc_forwarding = 0 net.ipv4.conf.lo.bc_forwarding = 0 net.ipv4.conf.lo.forwarding = 1 net.ipv4.conf.lo.mc_forwarding = 0 net.ipv4.conf.wlan0.bc_forwarding = 0 net.ipv4.conf.wlan0.forwarding = 1 net.ipv4.conf.wlan0.mc_forwarding = 0 net.ipv4.ip_forward = 1 net.ipv4.ip_forward_update_priority = 1 net.ipv4.ip_forward_use_pmtu = 0 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.all.mc_forwarding = 0 net.ipv6.conf.default.forwarding = 0 net.ipv6.conf.default.mc_forwarding = 0 net.ipv6.conf.eth0.forwarding = 0 net.ipv6.conf.eth0.mc_forwarding = 0 net.ipv6.conf.lo.forwarding = 0 net.ipv6.conf.lo.mc_forwarding = 0 net.ipv6.conf.wlan0.forwarding = 0 net.ipv6.conf.wlan0.mc_forwarding = 0
开启 dae 设备无法上网,可以 ping 通网关(192.168.1.150),以及主路由(192.168.1.1),但是无法上网,无法ping通公网ip(233.5.5.5)
解决方案:
  1. 安装 systemd-resolved 并启用 systemd-resolved
  1. 关闭 taiscale 的 dns 接受
tailscale set --accept-dns=false
后续测试正常。
 
欢迎加入喵星计算机技术研究院,原创技术文章第一时间推送。
notion image
 
树莓派寄存器物理基地址查询CS144-2023-Spring router.cc 功能部分实现讲解