BeagleBone Black Yocto系统perf命令报错的原因及解决方法
问题原因
当前系统中的/usr/bin/perf是一个shell脚本,逻辑如下:
- 通过
uname -r提取当前内核版本,将版本号简化为两位格式(比如内核版本为4.14.x-xxx时,会提取为4.14) - 尝试执行对应版本的perf工具
perf_4.14 - 由于系统中不存在
perf_4.14这个实际的二进制可执行文件,因此触发报错,提示缺少linux-perf-4.14包。
另外,Yocto是基于构建的嵌入式发行版,没有Debian/Ubuntu体系的apt包管理器,所以网上的apt update类方法完全不适用。
解决方法
方法一:重新构建Yocto镜像时包含perf包
Yocto的meta-oe层提供了perf工具包,在构建镜像时:
- 打开构建目录下的
conf/local.conf文件 - 添加如下配置,将perf包加入镜像:
IMAGE_INSTALL:append = " perf"
- 重新构建镜像并烧录到BeagleBone Black,此时系统会包含对应内核版本的perf工具,脚本可正常调用。
方法二:手动编译对应版本的perf工具
如果无法重新构建镜像,可手动编译与当前内核版本匹配的perf:
- 获取与板上内核完全一致的内核源码(可从BeagleBoard官方仓库或Yocto构建时的内核源码目录获取)
- 进入源码的
tools/perf目录- 若在x86主机上交叉编译(推荐,板上资源有限),执行:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - 若直接在板上编译,确保已安装gcc等编译工具,执行:
make
- 若在x86主机上交叉编译(推荐,板上资源有限),执行:
- 编译完成后会生成
perf二进制文件,将其复制到板上的/usr/bin/目录,并重命名为perf_4.14(匹配脚本中的调用名称),或者直接替换掉原来的/usr/bin/perf脚本。
方法三:修改现有shell脚本
如果已经有了编译好的perf二进制文件,可直接修改/usr/bin/perf脚本:
- 编辑脚本:
vi /usr/bin/perf - 将
exec "perf_$version" "$@"这一行,替换为直接指向你的perf二进制路径,比如:exec /usr/bin/my_compiled_perf "$@" - 保存退出后,即可正常执行
perf命令。
内容的提问来源于stack exchange,提问作者ohiliouh
相关产品推荐
相关产品推荐

