首页
/ 解决dae项目在Ubuntu 20.04上启动失败的问题

解决dae项目在Ubuntu 20.04上启动失败的问题

2025-06-15 00:40:02作者:裘旻烁

问题背景

在使用dae项目时,部分用户在Ubuntu 20.04系统上遇到了服务启动失败的问题。系统日志显示错误信息:"load eBPF objects: field TproxyLanIngress: program tproxy_lan_ingress: apply CO-RE relocations: load kernel spec: no BTF",这表明系统内核配置不满足dae运行的基本要求。

问题分析

dae项目依赖Linux内核的eBPF功能来实现高性能网络处理。要正常运行dae,系统内核必须满足特定的配置要求。从错误信息来看,主要问题出在内核缺少BTF(BPF Type Format)支持,这是eBPF CO-RE(Compile Once - Run Everywhere)功能的关键依赖。

内核配置要求

dae项目正常运行需要以下内核配置项:

  • 基本eBPF支持:

    • CONFIG_BPF=y
    • CONFIG_BPF_SYSCALL=y
    • CONFIG_BPF_JIT=y
    • CONFIG_BPF_STREAM_PARSER=y
  • 网络相关配置:

    • CONFIG_NET_INGRESS=y
    • CONFIG_NET_EGRESS=y
    • CONFIG_NET_SCH_INGRESS=m
    • CONFIG_NET_CLS_BPF=m
    • CONFIG_NET_CLS_ACT=y
  • 调试和追踪支持:

    • CONFIG_DEBUG_INFO=y
    • CONFIG_DEBUG_INFO_BTF=y
    • CONFIG_KPROBE_EVENTS=y
    • CONFIG_BPF_EVENTS=y
  • 其他必要配置:

    • CONFIG_CGROUPS=y
    • CONFIG_KPROBES=y

解决方案

方法一:升级内核

Ubuntu 20.04默认安装的内核版本可能较旧,建议升级到较新的内核版本:

  1. 查看当前内核版本:

    uname -r
    
  2. 安装更新的内核:

    sudo apt update
    sudo apt install linux-image-generic-hwe-20.04
    
  3. 重启系统使新内核生效。

方法二:检查并调整内核配置

如果无法升级内核,可以检查当前内核配置并确保所有必要选项已启用:

  1. 使用以下脚本检查内核配置:

    #!/bin/bash
    declare -A config_requirements=(
        [CONFIG_BPF]="y"
        [CONFIG_BPF_SYSCALL]="y"
        [CONFIG_BPF_JIT]="y"
        [CONFIG_CGROUPS]="y"
        [CONFIG_KPROBES]="y"
        [CONFIG_NET_INGRESS]="y"
        [CONFIG_NET_EGRESS]="y"
        [CONFIG_NET_SCH_INGRESS]="m"
        [CONFIG_NET_CLS_BPF]="m"
        [CONFIG_NET_CLS_ACT]="y"
        [CONFIG_BPF_STREAM_PARSER]="y"
        [CONFIG_DEBUG_INFO]="y"
        [CONFIG_DEBUG_INFO_BTF]="y"
        [CONFIG_KPROBE_EVENTS]="y"
        [CONFIG_BPF_EVENTS]="y"
    )
    
    find_config_file() {
        local paths=(
            "/proc/config.gz"
            "/boot/config-$(uname -r)"
            "/usr/src/linux-$(uname -r)/.config"
            "/usr/src/linux-config-$(uname -r)"
        )
        for path in "${paths[@]}"; do
            if [ -f "$path" ]; then
                echo "$path"
                return
            fi
        done
    }
    
    check_config() {
        local config=$1
        local expected_value=$2
        local config_value
    
        if [[ $config_file == *.gz ]]; then
            config_value=$(zgrep "^$config" "$config_file" || echo "")
        else
            config_value=$(grep "^$config" "$config_file" || echo "")
        fi
    
        if [[ $config_value =~ $config=$expected_value ]]; then
            return 0
        else
            echo "配置项 $config 需要设置为 $expected_value,当前设置为 ${config_value#*=}"
            return 1
        fi
    }
    
    config_file=$(find_config_file)
    
    if [ -z "$config_file" ]; then
        echo "无法找到内核配置文件。"
        exit 1
    fi
    
    echo "使用内核配置文件: $config_file"
    
    all_good=true
    for config in "${!config_requirements[@]}"; do
        if ! check_config "$config" "${config_requirements[$config]}"; then
            all_good=false
        fi
    done
    
    if $all_good; then
        echo -e "\e[1;32m内核配置满足要求\e[0m"
    else
        echo "有些内核配置不符合要求,请根据提示进行调整。"
    fi
    
  2. 对于缺少的配置项,需要重新编译内核或寻找已包含这些配置的内核版本。

方法三:使用预编译的内核

如果手动配置内核比较复杂,可以考虑使用已经配置好这些选项的预编译内核,如:

  1. Ubuntu官方提供的HWE(Hardware Enablement)内核
  2. 第三方维护的优化内核

预防措施

为了避免类似问题,建议:

  1. 在部署dae前先检查系统内核配置
  2. 优先选择较新的Linux发行版或内核版本
  3. 在生产环境部署前先在测试环境验证

总结

dae项目依赖现代Linux内核的eBPF功能,特别是需要BTF支持。在Ubuntu 20.04这类较旧的系统上运行时,可能会遇到内核配置不兼容的问题。通过升级内核或调整内核配置,可以解决这些问题,确保dae能够正常运行。对于不熟悉内核编译的用户,最简单的解决方案是升级到支持这些功能的内核版本。

登录后查看全文
热门项目推荐

热门内容推荐

最新内容推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
871
515
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
131
184
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
346
380
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
334
1.09 K
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
31
0
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
kernelkernel
deepin linux kernel
C
22
5
WxJavaWxJava
微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
829
22
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
603
58