Skip to content

【Bug/建议】Agent 探针部署不支持 ARM64 目标机:交叉编译 GOARCH 硬编码为 amd64,aarch64 主机上探针 Exec format error #33

Description

@chenjiaqiangmax

环境

  • 版本:v5.0(Docker 部署,deviops-api:v5.0 镜像);已核对最新 main 分支(2026-08-03 提交),问题依然存在
  • 平台侧:x86_64 Linux,容器内 Go 1.25.2
  • 目标机:鲲鹏 920(aarch64),UOS Server/Desktop,SSH 可达

问题描述

向 aarch64 架构的目标主机部署 Agent 探针后,探针无法启动,/var/log/agent.log 持续报错:

/bin/sh: 1: exec: /opt/agent/dodevops-agent: Exec format error

用 file 检查平台分发过去的二进制:

/opt/agent/dodevops-agent: ELF 64-bit LSB executable, x86-64 ... statically linked

即平台给 ARM64 机器编译并分发了 x86-64 探针。SSH 连接、命令执行均正常,仅探针二进制架构不匹配。

根因分析(已定位到代码)

  1. api/api/monitor/service/agent.go 约 115-119 行,编译目标表 GOARCH 全部硬编码 amd64:

  2. var buildTargets = map[string]BuildTarget{

  3. "linux":   {GOOS: "linux", GOARCH: "amd64", Suffix: ""},
    
  4. "windows": {GOOS: "windows", GOARCH: "amd64", Suffix: ".exe"},
    
  5. "darwin":  {GOOS: "darwin", GOARCH: "amd64", Suffix: ""},
    
  6. }

  7. detectPlatform()(约 2119 行)只根据资产录入的 OS 字符串识别 GOOS,完全没有架构维度。

  8. 部署流程中已在目标机执行过 uname -a(约 1214 行,用于诊断),能拿到 aarch64,但该结果未参与编译参数决策——离支持 ARM 只差"把探测结果喂给 GOARCH"一步。

  9. 构建产物缓存目录(如 dodevops-agent-build-cache/)的 hash 未包含目标架构维度,未来多架构并存时可能互相覆盖。

期望行为

部署探针时自动识别目标机 CPU 架构,交叉编译出匹配的二进制(至少支持 linux/amd64 与 linux/arm64)。

修复建议

方案一(最小改动):buildTargets 增加 linux-arm64 条目,部署界面增加目标架构选项。

方案二(推荐,自适应):编译前在目标机执行 uname -m(或复用现有 uname -a 诊断输出)做架构映射:

func toGoArch(unameM string) string {
switch strings.ToLower(strings.TrimSpace(unameM)) {
case "x86_64", "amd64":
return "amd64"
case "aarch64", "arm64":
return "arm64"
case "i686", "i386":
return "386"
default:
return "amd64"
}
}

编译时 GOOS=linux GOARCH=<映射结果>,同时把架构纳入构建缓存 hash。

方案三(长期,供参考):探针目前是"部署时现编译、心跳地址编译期烙死",建议演进为官方预编译多架构二进制 + 运行时配置文件下发(/etc/dodevops/agent.yaml 或命令行参数)。好处:

  • 彻底解决多架构问题(Go 交叉编译零额外依赖)
  • 心跳地址变更不再需要重编译 + 全量重新部署
  • 省去每次部署的现编译耗时

补充说明

国产化场景下鲲鹏/飞腾等 ARM 服务器越来越普遍,该问题会挡住所有 ARM 主机的监控纳管。我们已在生产环境复现(鲲鹏 920 节点),愿意配合测试修复补丁。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions