这个问题我在知乎骂过,引起了无数Linux粉丝的反击;但是类似的错误又重演了,我只好再骂一遍。Linux系统和Android系统不同,采用了最落后的垄断库体系,所以造成了无法避免的脆弱性。
踩坑经过
事情的经过是这样的,我在Redhat 9安装了Postgresql之后,安装灾备工具PgPool-II 4.4.3. 安装不上去,说找不到libpq,官方给出的回复是得找个特殊的库安装上去:
dnf install --enablerepo=crb postgresql-server-devel
然而我又发现postgresql官方提供了手动备份工具pgAdmin,跑到官网上找到了安装介绍:
结果在安装清单里也有libpq,是另一个版本的
====================================================================================================
Package Architecture Version Repository Size
====================================================================================================
Installing:
pgadmin4-web noarch 7.3-1.el9 pgAdmin4 8.8 k
Installing dependencies:
apr x86_64 1.7.0-11.el9 appstream 123 k
apr-util x86_64 1.6.1-20.el9 appstream 94 k
apr-util-bdb x86_64 1.6.1-20.el9 appstream 13 k
httpd x86_64 2.4.53-11.el9_2.5 appstream 47 k
httpd-core x86_64 2.4.53-11.el9_2.5 appstream 1.4 M
httpd-filesystem noarch 2.4.53-11.el9_2.5 appstream 14 k
httpd-tools x86_64 2.4.53-11.el9_2.5 appstream 81 k
libpq5 x86_64 15.3-42.1PGDG.rhel9 pgAdmin4 223 k
mailcap noarch 2.1.49-5.el9 baseos 32 k
pgadmin4-server x86_64 7.3-1.el9 pgAdmin4 87 M
python3-mod_wsgi x86_64 4.7.1-11.el9 appstream 931 k
rocky-logos-httpd noarch 90.14-1.el9 appstream 24 k
Installing weak dependencies:
apr-util-openssl x86_64 1.6.1-20.el9 appstream 15 k
mod_http2 x86_64 1.15.19-4.el9_2.4 appstream 149 k
mod_lua x86_64 2.4.53-11.el9_2.5 appstream 61 k
Transaction Summary
====================================================================================================
Install 16 Packages
Total download size: 90 M
Installed size: 402 M
Is this ok [y/N]: N
这个时候我要是点No就好了,但是我点了y,结果是安装失败,因为libpq和现有的,即之前安装的有冲突。
安了几个小时,最后告诉失败。网上找了卸载教程:
cd /etc/yum.repos.d
rm pgadmin4.repo
yum clean all
好像是卸载了,其实并没有。我现在连启动pgpool都做不到了:
pgpool -h
pgpool: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory
反思
为什么会出这种错误?本质原因是Linux的垄断库思想——即一个类型的库只能在/usr/lib文件夹中有一个版本,如果你安装的软件恰巧需要另一个版本,对不起,把原来的卸了装新的。原来的软件怎么办?完蛋。
Windows和后来的Android都不这么做(.Net运行任意个版本并存)。之所以Android占用空间大,也是每一个新的应用都安装自己的私有依赖库,即使表面上相同,也必须另装一份。
为什么Linux从Redhat到Ubuntu几十年都坚持这个思路,死性不改?几种猜想:
1)计划经济理想,一个萝卜一个坑,一个部门就一家企业,别无分号(苏联的经互会思维)。
2)如果允许每一个应用单独启动自己的依赖库,那么硬盘占用和内存占用很快就比Windows的大(如Android),怎么体现自己的优越性?
3)开源Linux的大赞助商以服务器厂商为主,特别是云服务厂商。正是因为你装了第二个软件就造成库冲突,所以对不起,再租台服务器不就解决问题了?你抱怨Linux烂,但是人家是免费的,你明明可以通过多付费来解决问题,你到底想不想解决吧?
我觉得2和3的可能性较大,也不排除1的因素,毕竟创始人也不像好说话的人。欢迎补充或提出可行性建议,谢绝粉丝性谩骂。