2021-07-12 更新

果然还太年轻,当时捣鼓好了,后续再部署一台相同的服务器就卡住了。使用的 xenial 版本源(需要安装特定版本的软件),各种错误,安装的软件一个依赖一个,还与当前环境(Ubuntu 20.04 focal)依赖库不兼容。

搞了好几天,用 history 查看当时的操作指令,对比着去参考执行,终于弄明白了当初是怎么成功的。

如果直接复制 libpng12.so.0 文件到 /lib/x86_64-linux-gnu 下,再次安装依赖会报相同的错误:

# apt-get install nginx
# apt-get install xxx

You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 libgd3 : Depends: libpng12-0 (>= 1.2.13-4) but it is not going to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

按照提示执行 apt --fix-broken install 反过来又会把 /lib/x86_64-linux-gnu/libpng12.so.0 删除,然后还是报相同的错误。过程中有安装 libng12-0 的步骤,但最后的结果就是 libpng12-0 被删除了,提示找不到 /lib/x86_64-linux-gnu/libpng12.so.0

来来回回,在死胡同了腾挪翻转,头都要搞炸了。难道当初能够安装成功,真的只是个意外?安装过程不可重现?这不太可能,肯定还有一些我遗漏的部分未补全。

仔细查看 history 中执行过的指令,发现有两个操作比较可疑,或者说比较有可能是我未注意到,但对结果又重大影响的步骤。

一个是安装过程中更新过一个软件源:deb http://cz.archive.ubuntu.com/ubuntu xenial main,另一个是修改过 /var/lib/dpkg/status 文件。

我对其中的第一项印象比较深刻,因为记得当时就是在更新了软件源之后,再次执行安装脚本就成功了的。心里不由得开心起来,觉得这就是真相了,事实证明记忆也会骗人。

经过反复初始化云盘后,终于确定了有效的解决方案:复制 libpng12.so.0 到系统库中 + 修改 dpkg 依赖状态文件

1. 复制 libpng12.so.0 到系统库中

# cp libpng12.so.0 /lib/x86_64-linux-gnu/

2. 修改 dpkg 依赖状态文件

# vim var/lib/dpkg/status
找到 libgd3 包的 depends 部分
# libpng12-0 => libpng16-16 (>= 1.6.2-1)
# apt-get install nginx

成功!

[notice]
不要尝试去卸载掉 libpng16-16 后,再安装 libpng12-0。这不好使,且卸载 libpng16-16 或者其他系统中存在的依赖会同时卸载与依赖相关的软件。
曾经在卸载存在冲突的依赖时卸载了一个 *base 的关联软件,然后命令行突然就不好使了。Backspace(回格)键会向后移动空格,命令行会错位,完全不知道输入的是什么,基础的一些指令也会失效。
从其他服务器复制过来 terminfo 指令文件后,指令恢复了,但软件环境依然很混乱,只能重新初始化云盘,重新安装软件。
[/notice]


在 Ubuntu 上执行环境初始化脚本,安装 nginx 等服务器软件时,意外失败了:dpkg: 处理归档 /var/cache/apt/archives/libpng12-0_1.2.54-1ubuntu1.1_amd64.deb (--unpack)时出错: 无法安装 /lib/

更新软件源地址之后,执行指令 apt-get install libpng12-0 依然没有结果。

原因:Ubuntu 14 以上就已经不再支持 libpng12,然而有些软件又依赖于 libpng12。

官网上的 libpng12-0 直接报错了,所以需要需要找其他的下载源,然后放到 /usr/lib/x86_64-linux-gnu/ 文件夹下。

找到一个网友教程提供的百度云下载源:

链接:https://pan.baidu.com/s/1IAiUENyPnXD3kDJyV11gPA
密码: qw6j

直接上传到文件下,再次安装,成功!

附:查看 Ubuntu 版本号

cat /etc/issue (简单)
cat /etc/lsb-release(具体)
uname -a(内核)