请教一些问题,关于应用软件版本和系统

Windows 可以在系统版本不变的情况下升级软件,而 Linux 只有滚动版才有可能用上最新的软件,稳定版是整个固化了的,这是什么原因?用 AppImage 可以在稳定版上运行最新的软件,比如可以在 Leap15.2 上用 Krita 4.4.2,但为什么各发行版不把最新版软件加入软件库呢?因为依赖关系不好处理还是因为稳定性没得到充分验证?
同样作为稳定版,FreeBSD Release 的软件都很新,跟 Linux 的滚动版用的版本差不多,怎么做到的?

第一, 滚动发行版和常规发行版以及 FreeBSD 的软件新旧问题

滚动与非滚动的本质区别在于,滚动发行版是没有版本号的,而常规发行版有版本号。比如,存在 openSUSE Leap 15.2,但是不存在 Arch Linux 15,只存在 2021 年 1 月份的 ArchLinux。

软件的新旧与是否滚动没有必然联系,比如 CentOS Stream 也是滚动发行版,但是它的软件与 RHEL 差不多旧;Fedora 33 是常规发行版,它的软件库(除了桌面环境和 glibc 之类)和滚动发行版一样新。

1赞

第二,软件的新旧

基于稳定性考量。一般情况下,常规发行版中的软件都会经过足够的测试,确定足够稳定,没有 bug。与依赖关系无关(没有什么发行版处理不好依赖关系)。

1赞

第三,为什么 Appimage 可以在稳定版上运行最新软件?

常规的 Linux 软件,都是使用系统共享库,因此会受到系统版本限制。Appimage 在打包软件本体时,把依赖也一并打包了,所以不受限制。Windows 软件不受限制大多也是这个原因。

2赞

我觉得这和技术没有什么关系,稳定版更像是社会契约。我承诺这个版本稳定支持十年,你就可以安安心心地使用上十年。

Debian 社区把一种对新版本的强迫需求归结为 “Shiny New Staff(object)Syndrome”,即 “新版综合症 “ 或者 “新奇事物综合症”。

当你明白 “新版本=好” 根本 不成立 的时候,这个问题就迎刃而解了。

https://wiki.debian.org/DontBreakDebian#Don.27t_suffer_from_Shiny_New_Stuff_Syndrome

举例来说:

  • 开源操作系统的开发,是由散布在世界各地的各种各样的团体和个人开发的,是一个很混乱的系统。每个组件的新版本并不一定能和其它组件完美协作。都升级到新版本可能会一团糟(参考 Arch)

  • 对于许多商业软件,尤其是服务器上,版本变更可能等于无法继续运行原有的业务,或者增加开发成本。我现有的业务,比那几个新功能重要无数倍。

  • 对于许多从事重要工作的人来说,如果旧版本能满足需求,就没有必要换新版本。比如说,做自然科学研究的人,读博第一年我用这些软件能完成研究,那第二年如果没有新需求,也就没有必要升级,要不只会增加没有必要的学习成本。你更新换代改变了软件的使用方式,破坏了我的工作方式,我更重要的使命就会受到阻碍。

  • 如果你是爱因斯坦,那天用 Arch 然后把你的工作给滚没了,人类的历史进程就会被推后几十年 :)

  • 对于基础设施级别的软件,比如说 Linux kernal,gcc, glibc。他们升级新版本,就意味着一些软件可能无法再编译或者运行。发行版必须给开发者足够时间来迁移。

  • 。。。

所谓的滚动发行版,其实也只有桌面用户(用电脑并没有特别重要的工作,电脑挂掉了损失不大)和开发者比较流行。


Windows 特别地方在于,巨硬和用户达成了一个时间超长的 “稳定版” 契约。Windows 操作系统的许多组件,只要推送到用户手上,支持的时间长度就长的可怕。这些系统组件可以确保新老程序都可以运行,也就是所谓的 “兼容性”。

微软很清楚,只要做好兼容性,就可以长期保持霸主的地位。微软的用户也很清楚,我用微软的技术,就不用太担心日后会有运行不了或者不支持的情况。

Windows 如果打破了兼容性,出了 Windows11, Windows 12, Windows13, Windows14… 你 Windows10 用户不升级到新版本,也就不能 “系统版本不变的情况下升级软件” 了。

苹果的 MacOS 和 iOS 就是微软的反面例子。每年一个版本,每波都会让一部分程序无法运行。如果那些老程序背后没人更新,那软件就会随时间而挂掉。依赖那些软件的用户,就只好留着旧版,永远不升级操作系统(也就是你说的不能随意更新)。如果你用的软件以来操作系统的新的特性,那你就被迫要升级新版 MacOS 或 iOS 版本。

你看起来的 “Windows 系统软件版本不变,就能升级软件”,其实是成堆成堆的钱和工程师的投入,来确保兼容性。“不升级操作系统,也能升级软件” 其实是假象。以微软的速度,一般人应该感受不到微软删掉旧东西导致软件无法升级的情况。差不多需要用一个版本的 windows 十几年,才会发现自己用不上某个软件的新版本 :)

现在许多有历史的软件,比如说 Chrome/Firefox 早就不支持支持 WinXP 了,对 WinXP 的用户来说也是不能自由地升级到新版本的 Chrome/Firefox 呀。

从微软对待用户的态度的角度来说,应该是值得尊敬的公司,甚至有点伟大的味道。


开源世界其实也有一样的操作,RHEL 和 SUSE 都支持十年左右,(SUSE 15 支持到 2031 年)。我为特定版本的 RHEL 或 SUSE 开发程序,对用户来说,也是可以在十年内 “不升级操作系统,随意升级软件”。

软件开发者,只要打包一个新的 RPM 包,就可以推送到客户手中长期支持的操作系统中,和 Windows 桌面上的 “随意升级” 一模一样,只不过他们的用户都是在服务器上 :)


这句话其实并不准确,openSUSE 可以直接从 OBS 添加开发仓库,Debian 上可以启用 Testing 仓库,Ubuntu 可以用 PPA, Fedora 有 Copr, 都可以用上新版软件。另外你也可以从软件作者手里面拿到源码,然后自己编译。但是这两者都不一定可靠,尤其是一些比较关键的组件。


https://personalexcellence.co/blog/shiny-object-syndrome/

5赞

Linus Trovalds 也很清楚这个问题,内核开发的第一条规则就是"永远不要破坏用户空间(userspace)"

比如当年那条著名的 “Mauro, SHUT THE FUCK UP!” 的邮件,把一个说 “内核没问题,用户有问题” 的人骂得贼惨。

如果其它的开发者,比如说 GNOME/GTK & Glibc 那帮人也能一样谨慎地更新,现在你也可以很随意地升级。

Mauro, SHUT THE FUCK UP!

It’s a bug alright - in the kernel. How long have you been a
maintainer? And you still haven’t learnt the first rule of kernel
maintenance?

If a change results in user programs breaking, it’s a bug in the
kernel. We never EVER blame the user programs. How hard can this be to
understand?

WE DO NOT BREAK USERSPACE!

Seriously. How hard is this rule to understand? We particularly don’t
break user space with TOTAL CRAP. I’m angry, because your whole email
was so horribly wrong, and the patch that broke things was so
obviously crap. The whole patch is incredibly broken shit. It adds an
insane error code (ENOENT), and then because it’s so insane, it adds a
few places to fix it up (“ret == -ENOENT ? -EINVAL : ret”).

The fact that you then try to make excuses for breaking user space,
and blaming some external program that used to work, is just
shameful. It’s not how we work.

Fix your f*cking “compliance tool”, because it is obviously broken.
And fix your approach to kernel programming.

Linus

1赞

appimage、Flatpak、Snap 都是把依赖库与应用本身打包在一起的,包含了程序运行的所有需要,自然不受限于发行版本号。各大 Linux 发行版都是二进制发行版,无法很好地支持同一软件的不同版本在一个系统中并存,自然无法支持最新版的软件。FreeBSD 主要是因为它的 ports 系统,Linux 你也可以用 Gentoo 啊,编译安装系统并且又新又稳定。如果你觉得 Gentoo 稳定版仍然不够新(相比 arch 和 openSUSE Tw 慢很多),在 Gentoo 的 portage 帮助下可以混合使用不同分支下的软件,不就解决问题了吗

1赞

不同操作系统的哲学可以类比不同类型的房子:

Linux 点发行版:相当于精装修房,保证在这个版本(房间)内的官方源软件(预装家具)的稳定和互相兼容,但软件(家具)不一定是最新的,你自己添加的第三方软件(自己添置的家具)不在保障范围内。

Linux 滚动版:相当于酒店套房,可以源源不断添加新元素,但无法保证长期的稳定性(一些滚动版甚至也不承诺短期的稳定性,用户需要自己负责)。尤其对企业应用来说这一点是很不友好的。

BSD 系:相当于毛坯房,提供一个健壮而稳定的基础系统(基础系统是作为一个整体被维护的,换句话说也是 “固化” 的,比如你不能单独升级作为基础系统一部分的 OpenSSH 版本),你可以自己添加第三方软件(如通过 FreeBSD 的 ports),但第三方软件不在保障范围内(不能保证所有 ports 都能互相兼容,并且上游可能根本没有考虑过适配 BSD 系的问题,维护靠各个 ports 的维护者)。

Windows:也是提供一个基础系统,不对第三方软件负责。但和 BSD 系不同的是由于它在桌面端的高市场占有率,大部分兼容性问题都被软件开发者积极解决了。

感谢各位的解答,脑子清楚了许多。

发行版官方软件源中的软件的维护和支持是发行版提供的,而不是软件的作者?那么发行版团队本身的技术水平就很重要了。
也听说过有人拿滚动版在服务器上用,但大都属于个人行为,比如自己的服务器随便搞,或者对数据、网络之类不太关心的企业的网管瞎折腾,有因为滚挂挨骂的,只是挨骂这么简单说明服务器对这个企业不是很重要,出了问题只是带来些麻烦而不是实质损失。牵涉到实际损益的都用的稳定版,甚至很老的版本。
Windows 以及相关软件的成功,利益驱动因素应该占了很大比重。

编译太麻烦了。FreeBSD 现在的二进制包系统也很好用了,而且只比源码晚三四天左右(如果用 Latest 的话),但很多设置都要手动搞,个人桌面用的话不如 Linux 的桌面向发行版舒服,更没有 YaST 这么惬意的工具。Gentoo 那种纯编译就算了,我对编译有阴影,当年老电脑上装 FreeBSD 玩,用 xfce,但是默认二进制包的 thunar 没有开启 hal,于是编译了一下,于是就有阴影了。

appimage 打包的时候也不一定能打去全,或者无法打全。最新的 vnote3.0 在 Leap 15.2 中就不好用,因为 glibc 版本问题。

Freebsd 也有稳定 Stable 和开发 Current 两个分支,你说的和源码之差几天的应该是开发分支 Current 吧。

可能 freebsd 在直接就开着 Current?他们不可能更新那么疯狂的。

编译太麻烦了。FreeBSD 现在的二进制包系统也很好用了,而且只比源码晚三四天左右(如果用 Latest 的话)

FreeBSD 如果用二进制包的话可能会出现补丁发布不及时的情况,貌似是因为服务器资源有限。有时候 quarterly 的安全修复甚至比 latest 更及时。

比如 CVE-2021-3156 这个 sudo 安全漏洞,openSUSE 在上个月 27 日就已经发布了二进制补丁,而 FreeBSD 到今天在 latest 上还有多个基础系统版本没有得到二进制的补丁,不过 ports 和 quarterly 更新得很及时。

在生产环境中,稳定压倒一切。
对于非专业的个人用户来说,机会成本也是要考虑的,不稳定的版本会带来大量时间和精力的付出,而这些付出并不能带来什么收益,虽说增强了一些折腾和解决问题的能力,但相对于研究操作系统的技术人员那种带有明确目的性且有预期收益的折腾来说,这种散乱的折腾有些不值,可能远不如锻炼身体。

就是 release 用的 port,pkg 默认是 quarterly,改成 latest 可以和源码尽量保持同步,让 pkg install 和 make install 协调共存。但改完之后依然是 release,current 专用的 port 是用不了的。
https://docs.freebsd.org/en_US.ISO8859-1/books/handbook/ports-using.html 开篇的 warning
https://docs.freebsd.org/en_US.ISO8859-1/books/handbook/pkgng-intro.html 4.4.2
官方文档建议只用一种方式(port 或 pkg)安装和管理软件,且指出 quarterly 的包更能保证稳定性,但二者也能共用。

滚动版的目的是什么呢?给用户提供比较新的软件还是为稳定版做测试?亦或是单纯为了某种理想?

现在有一类新的发行方式,叫 “Immutable OS”。主要原理是把操作系统打包固化,然后通过容器包装来部署应用程序,这样就能使用新版软同时确保可靠性。以此解决一些传统的隔一段时间出 “稳定版” 的缺陷和滚动更新的不稳定。

现在的竞争者至少有 Fedora Sliverblue, openSUSE MicroOS/Kubic, Endless OS…

过几天的 FOSDEM 上会有一个人讲

https://www.redhat.com/sysadmin/immutability-silverblue

https://linux.cn/article-12153-1.html

2赞

一个发行版要照顾到基本操作系统和软件库中所有应用,这个工作量很大啊。

Silverblue 热度蛮高的,关注的 youtuber 最近几个月经常说