前言

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

错误日志

bash
1
2
3
4
5
6
7
8
9
10
11
12
13
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 的地方:

bash
1
tar: Exiting with failure status due to previous errors # (由于前面的错误,退出时处于失败状态)

似乎是 tar 解压遇到了问题。那么这个问题应该在前面:

bash
1
tar: This does not look like a tar archive # (这看起来不像tar档案)

看到这里我猜想应该是文件解压失败导致的问题,那么是哪个文件呢?于是继续往上看。

bash
1
/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 的压缩包文件。顺着路径找到了文件,打开后里面是空的。复制到 Win­dows 10 环境下尝试用 ban­dizip 打开,结果报错。然后对其他压缩包以同样的方式进行打开,都是正常的,所以可以断定这个文件有问题。

解决方案

因为其在 dl 目录中,可以确定是 make 时下载的。那么可以把这个文件删除,执行 make download 就会重新下载。

其他文件也可能有同样的问题,以我多次编译经验来判断一般文件大小为 0 或者以 B(字节)为单位都是下载不完整的,一般来说 1k 以上的文件是正常的。桌面版 Linux 可以使用资源管理器打开 dl 目录,用大小排序(Shell 下使用 ls -Slh 命令进行大小排序,或者使用 SFTP 工具),把这些文件删除后同样使用 make download 命令进行重新下载。

重新下载也可能遇到问题,通过执行 make download V=s 查看详细日志,会发现遇到下载文件 404 的情况。自己曾遇到过十多个文件无法下载的情况,很是恼火。这个目前没有很好的解决方法,因为可能是服务器关闭导致的,只能过一段时间再下载,或者找大佬们拷贝已经下载好的文件。

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