前言
编译失败,很大一部分原因就是文件不完整。而网络问题是导致文件下载不完整的罪魁祸首。下面这个例子的问题,不管是本地进行全局代理,还是海外千兆独立服务器都有遇到过很多次。
错误日志
make[3]: Entering directory `/home/admin/openwrt/lede/package/lean/openwrt-fullconenat'
touch /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.prepared_c3d2744078ea94ecfd6014d7d4b9070a_6664517399ebbbc92a37c5bb081b5c53_check
. /home/admin/openwrt/lede/include/shell.sh; xzcat /home/admin/openwrt/lede/dl/fullconenat-2018-12-15-d4daedd0.tar.xz | tar -C /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.. -xf -
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors
make[3]: *** [/home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.prepared_c3d2744078ea94ecfd6014d7d4b9070a_6664517399ebbbc92a37c5bb081b5c53] Error 2
make[3]: Leaving directory `/home/admin/openwrt/lede/package/lean/openwrt-fullconenat'
time: package/lean/openwrt-fullconenat/compile#0.39#0.23#0.77
make[2]: *** [package/lean/openwrt-fullconenat/compile] Error 2
make[2]: Leaving directory `/home/admin/openwrt/lede'
make[1]: *** [/home/admin/openwrt/lede/staging_dir/target-x86_64_musl/stamp/.package_compile] Error 2
make[1]: Leaving directory `/home/admin/openwrt/lede'
make: *** [world] Error 2
分析日志
找到第一个出现error
的地方:
tar: Exiting with failure status due to previous errors # (由于前面的错误,退出时处于失败状态)
似乎是tar
解压遇到了问题。那么这个问题应该在前面:
tar: This does not look like a tar archive # (这看起来不像tar档案)
看到这里我猜想应该是文件解压失败导致的问题,那么是哪个文件呢?于是继续往上看。
/home/admin/openwrt/lede/dl/fullconenat-2018-12-15-d4daedd0.tar.xz | tar -C /home/admin/openwrt/lede/build_dir/target-x86_64_musl/linux-x86_64/fullconenat-2018-12-15-d4daedd0/.. -xf -
这行日志中出现了一个名为fullconenat-2018-12-15-d4daedd0.tar.xz
的压缩包文件。顺着路径找到了文件,打开后里面是空的。复制到 Windows 10 环境下尝试用 bandizip 打开,结果报错。然后对其他压缩包以同样的方式进行打开,都是正常的,所以可以断定这个文件有问题。
解决方案
因为其在dl
目录中,可以确定是make
时下载的。那么可以把这个文件删除,执行make download
就会重新下载。
其他文件也可能有同样的问题,以我多次编译经验来判断一般文件大小为0或者以B(字节)为单位都是下载不完整的,一般来说1k以上的文件是正常的。桌面版 Linux 可以使用资源管理器打开dl
目录,用大小排序(Shell 下使用ls -Slh
命令进行大小排序,或者使用 SFTP 工具),把这些文件删除后同样使用make download
命令进行重新下载。
重新下载也可能遇到问题,通过执行make download V=s
查看详细日志,会发现遇到下载文件404的情况。自己曾遇到过十多个文件无法下载的情况,很是恼火。这个目前没有很好的解决方法,因为可能是服务器关闭导致的,只能过一段时间再下载,或者找大佬们拷贝已经下载好的文件。
确认所有文件都完整后,再进行编译,这样可以大大提高编译成功率。
本文作者:P3TERX
本文链接:https://p3terx.com/archives/reasons-and-solutions-for-openwrt-compilation-failure.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。非商业转载及引用请注明出处(作者、原文链接),商业转载请联系作者获得授权。
我在vultr vps上也是文件损坏,删除 dl 下的文件,重新下载还是,最后使用GitHub 上的dl 文件才成功编译
谢谢博主解惑,我现在正在用make download V=s这个方法来下载需求包。
还可以加
-j8
参数用多线程下载,速度更快。