拿到一台信创机器,麒麟装好了,兴冲冲部署业务,结果一跑就崩:

bash: /opt/app/bin/start: cannot execute binary file: Exec format error

或者装包时装到一半被弹回来:

package app-1.0-1.x86_64.rpm is intended for a different architecture

这类报错的根因只有一个:你下的包跟这台机器的 CPU 架构对不上。国产 CPU 不是换个牌子那么简单,底层指令集差了一大截,飞腾和鲲鹏能通用的包,龙芯上一个都跑不了。

这篇从报错出发,讲清楚怎么一眼认出机器是什么芯、装错了怎么救、以及采购选型时该怎么挑。

一、30 秒确认这台机器是什么芯

别看机箱上贴的牌子,直接敲命令:

uname -m
lscpu | grep -E 'Architecture|Model name|CPU\(s\)'

三行输出对上号就行:

uname -m 输出对应的芯
aarch64飞腾、鲲鹏(都是 ARMv8)
loongarch64龙芯 3A5000 及以后(LoongArch)
mips64龙芯 3A4000 及以前(老 MIPS)
x86_64海光、兆芯

有坑aarch64 这一档里藏着飞腾和鲲鹏两家,光看 uname -m 分不出来。要精确到型号:

sudo dmidecode -t processor | grep -iE 'version|family|manufacturer'
cat /proc/cpuinfo | grep -iE 'model name|cpu part' | head -4

飞腾 D2000 会显示 Phytium,鲲鹏 920 会显示 Kunpeng 或者 Huawei。这一层区分在做性能优化和驱动适配时才有必要,日常装软件知道是 aarch64 就够。

二、装错了怎么救

先看报错属于哪一种

报错含义处理方式
Exec format error二进制的指令集跟 CPU 不匹配换对应架构的包,或找源码重编
is intended for a different architecturerpm 包架构不对换包,别加 --force 硬装
package architecture does not match systemdeb 包架构不对换包,别加 --force-architecture

装之前先验包,别等装一半才报错

拿到一个包,先问它是什么架构:

# rpm 包
rpm -qp --qf '%{NAME} %{ARCH}\n' app-1.0-1.rpm

# deb 包
dpkg-deb -f app_1.0.deb Package Architecture

# 已经躺在磁盘上的二进制文件
file /opt/app/bin/start
readelf -h /opt/app/bin/start | grep Machine

file 的输出最直接,一眼能看明白:

start: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), dynamically linked

已经硬装进去了怎么清理

不小心用 --force 装了错架构的包,卸掉重来:

# 服务器版
sudo rpm -e --nodeps 包名
sudo yum install -y 正确架构的包.rpm

# 桌面版
sudo dpkg -r --force-all 包名
sudo apt install -y ./正确架构的包.deb

有坑:清理不干净会留下半截文件,下一次装正确的包反而报文件冲突。卸完用 rpm -qa | grep 包名 或者 dpkg -l | grep 包名 确认真的没了再装。

三、五款 CPU 怎么选

选型的判断依据不是参数跑分,是你要跑的软件在哪个架构上有现成的包

你的情况选哪个理由
桌面办公、党政目录机飞腾 D2000 / S5000C信创目录覆盖全,桌面生态成熟
服务器、虚拟化、云计算鲲鹏 920核数多,主流服务端软件都有 aarch64 版本
自主可控要求最高、能接受自己编译龙芯 3A5000 / 3C5000LoongArch 完全自主,代价是生态最薄
要跑一堆老 x86 闭源软件海光x86_64 指令集,现有 x86 包直接能装
桌面替换、预算有限兆芯同为 x86_64,兼容性好,价格低

一句话记住架构通用性:飞腾和鲲鹏的 aarch64 包互相通用,海光和兆芯的 x86_64 包互相通用,龙芯的 loongarch64 谁都不通用。

这条结论直接决定工作量。你单位里如果混着飞腾和鲲鹏,一套包能覆盖;混着龙芯,龙芯那批得单独准备一套;混着 x86 和 ARM,两套源、两套包、两套编译环境。

四、选定之后,软件包这块怎么配

镜像源要按架构指

麒麟的官方源是按架构分目录的,配错了就是一片 404:

# 先确认架构
arch
# 服务器版看源配置
cat /etc/yum.repos.d/kylin.repo | grep -E 'baseurl|arch'

自己搭本地离线源时,目录结构里必须带上架构层(aarch64 / loongarch64 / x86_64),别把三种架构的包混在一个目录里,不然装的时候会挑错。

包名后缀就是架构

后缀装到哪
x86_64.rpm / amd64.deb海光、兆芯
aarch64.rpm / arm64.deb飞腾、鲲鹏
loongarch64.rpm / loongarch64.deb龙芯 3A5000+
noarch.rpm / all.deb全架构通用(脚本、文档、Java 包)

看到 noarch / all 的包,说明里面没有二进制,哪种架构都能装。

不得不源码编译时

拿不到现成架构的包,只能自己编。编译参数按架构给:

# 飞腾 / 鲲鹏(ARMv8)
./configure --host=aarch64-linux-gnu CFLAGS="-O2 -march=armv8-a"

# 龙芯(LoongArch)
./configure --host=loongarch64-linux-gnu CFLAGS="-O2"

# 海光 / 兆芯
./configure --host=x86_64-linux-gnu CFLAGS="-O2 -march=x86-64"

龙芯上编译最常见的坑是工具链版本。确认 gcc 认得 LoongArch:

gcc -dumpmachine

输出不是 loongarch64-linux-gnu,说明你的编译器不对,得装龙芯对应的工具链版本。

五、验证:装机后跑一遍这套自检

新机器到手,或者接手一台不知道底细的机器,把这几条跑一遍存档:

echo "=== 架构 ==="; uname -m
echo "=== 型号 ==="; sudo dmidecode -t processor 2>/dev/null | grep -i version | head -2
echo "=== 系统 ==="; nkvers 2>/dev/null || cat /etc/os-release | grep PRETTY
echo "=== 已装包的架构分布 ==="
rpm -qa --qf '%{ARCH}\n' 2>/dev/null | sort | uniq -c | sort -nr
echo "=== 有没有混入异架构包 ==="
rpm -qa --qf '%{NAME} %{ARCH}\n' 2>/dev/null | grep -v "$(uname -m)" | grep -v noarch

最后一条是关键。输出为空,说明系统干净,没有装错的包。有输出,列出来的就是需要清理的。

桌面版把 rpm -qa 换成:

dpkg-query -W -f='${Package} ${Architecture}\n' | grep -v "$(dpkg --print-architecture)" | grep -v all

六、防复发:把架构写进部署文档第一条

架构不一致导致的故障,特点是装的时候没事,跑的时候才炸,而且报错信息(Exec format error)完全不提架构,排查方向很容易跑偏。

两个规矩能挡掉大部分:

第一,部署文档第一行写清楚目标架构,并给出 uname -m 的期望输出。装之前先对一遍,对不上就别往下走。

第二,做离线包仓库时,按架构分目录存放,目录名直接写死 aarch64 / loongarch64 / x86_64。别图省事放一起,混了之后靠人眼分辨不出来。


附:五款国产 CPU 参数对照

飞腾 D2000 / S5000C鲲鹏 920龙芯 3A5000 / 3C5000海光 3 系 / 5 系兆芯 KX-6000
指令集ARMv8ARMv8LoongArchx86_64x86_64
uname -maarch64aarch64loongarch64x86_64x86_64
典型场景桌面、党政服务器、云自主可控服务器、兼容老软件桌面替换
包生态好(aarch64 通用)好(aarch64 通用)薄,常需自编译最好(x86 直接装)好(x86 直接装)
主要代价单核性能一般供货与授权生态需自建自主度争议性能偏弱

选国产 CPU,本质上不是选性能,是选生态。先把业务软件在哪个架构上有现成的包摸清楚,再回头定机器,能省掉后面大量的编译和踩坑时间。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐