前言

编译失败,很大一部分原因就是文件不完整。而网络问题是导致文件下载不完整的罪魁祸首。下面这个例子的问题,不管是本地进行全局代理,还是海外千兆独立服务器都有遇到过很多次。

错误日志

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的情况。自己曾遇到过十多个文件无法下载的情况,很是恼火。这个目前没有很好的解决方法,因为可能是服务器关闭导致的,只能过一段时间再下载,或者找大佬们拷贝已经下载好的文件。

确认所有文件都完整后,再进行编译,这样可以大大提高编译成功率。