Yocto镜像使用ip.iproute2时出现'-sh: ip: not found'错误排查
Yocto中ip.iproute2执行报错'-sh: ip: not found'的排查思路
问题背景
在Yocto发行版中,当包含ip.iproute2包时,无论是运行指向它的符号链接ip,还是直接执行/sbin/ip.iproute2,都会抛出-sh: ip: not found或-sh: ip.iproute2: not found错误。但不包含该包时ip命令可正常工作,结合meta-updater(OSTree)层使用该包时也能正常运行。ldd ip.iproute2输出显示所有依赖库均能找到对应路径。
排查方向与调试步骤
1. 验证动态链接器兼容性
从ldd输出可见,程序依赖的动态链接器为/usr/lib/ld-linux-armhf.so.3,可直接指定链接器运行程序,排查链接器路径匹配问题:
/usr/lib/ld-linux-armhf.so.3 /sbin/ip.iproute2
若此命令能正常执行,说明shell的环境变量或链接器默认搜索路径存在异常,比如/usr/lib未被加入链接器默认查找路径,或构建时sysroot配置有误。
2. 检查文件权限与属性
确认ip.iproute2的可执行权限及特殊属性:
ls -l /sbin/ip.iproute2 getfattr -d /sbin/ip.iproute2
确保文件拥有可执行权限(x位),且未被设置noexec等限制执行的属性。
3. 对比不同构建的包差异
- 排查无
ip.iproute2时正常运行的ip来源:用which ip和ldd $(which ip)查看该ip所属包及依赖路径,与ip.iproute2做对比。 - 检查
ip.iproute2的配方文件(.bb),确认编译选项、安装路径等配置是否存在错误,比如是否误编译为其他架构,或安装时路径处理异常。 - 对比常规构建与结合meta-updater构建的
rootfs结构:查看/lib、/usr/lib的挂载方式,或ld.so.conf的配置差异:
cat /etc/ld.so.conf ldconfig -p | grep libelf
验证依赖库缓存是否正确加载。
4. 排查Shell的PATH配置
检查当前shell的PATH是否包含/sbin:
echo $PATH
若未包含,手动添加后重试:
export PATH=$PATH:/sbin ip.iproute2
5. 重新构建包排除损坏可能
清理并重新构建ip.iproute2包,确保构建过程无报错后重新生成rootfs测试:
bitbake iproute2 -c cleanall bitbake iproute2
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

