BSD 与 GPL:圣人与常人

有时候会看到这种言论:GPL 太邪恶了,一旦你用了 GPL 许可协议下的源码,你自己的修改就必须是 GPL 开源的。不像 BSD 或者 MIT —— 你可以随意修改代码,而且随意使用 —— 这才是真正的自由。

我觉得这就是 BSD 目前的生态不及 Linux 的原因之一 —— 得不到保障的自由终究是有限的。

GPL 给用户全部的自由,除了从此以后没有放弃自由的自由。而 BSD 给了用户全部的自由,就是不保障以后如何。BSD 协议正是 BSD 生态的阿喀琉斯之踵。还有,请读者不要误解,本文仅仅是谈许可协议带来的不同,不是谈操作系统设计哪个更好的。

背景知识

事先声明,我不是律师,所以这里的讨论都不是法律建议,而是更加技术上的内容。

大多数自由软件都有一个自由软件的“许可条款”,代表版权(或者著作权)所有者把自由软件的 代码 授权给用户“自由的”使用。

这一自由包含以下几点:

  • 自由之零:不论目的为何,有使用该软件的自由。
  • 自由之一:有研究该软件如何运作的自由,并且得以修改该软件来符合用户自身的需求。获取该软件之源码为达成此目的之前提。
  • 自由之二:有重新散布该软件的自由,所以每个人都可以借由散布自由软件来敦亲睦邻。
  • 自由之三:有改善再利用该软件的自由,并且可以发表修订后的版本供公众使用,如此一来,整个社群都可以受惠。如前项,获取该软件之源码为达成此目的之前提。

有许多常见的许可条款,比如 GPL、Apache License或者 BSD License 等,他们都满足以上四点要求,因此在这些许可下面的软件都是自由软件。而且前面第四点包含了获取源代码,因此自由软件也是开源软件。

但是有些协议走的更“远”(或者说更“激进”)。这些协议要求用户在修改代码后同样承诺修改后的版本的自由——也就是说,修改后的版本也要以相同协议开放源码(或者相关部分源码)。这样,开发者就能从其他做了改进的用户那里“拿回代码”,然后整合到自己的原始版本里面。GPL 、 LGPL 与 MPL 便是这种能够拿回代码的开源协议。与之相对,BSD、Apache 等许可协议不要求拿回代码,修改后的版本可以转为闭源。

不求回报的 BSD

BSD 许可协议是个相当宽松的许可协议,其开发者也对用户相当宽松 —— 代码随便你用,开源自然好,闭源也无所谓。

即使抛开一众 Unix 遗产软件,BSD 的代码在某种意义上可能早就遍地开花。

看看计算机行业的巨头们: Windows 在 TCP/IP 的实现上用了 BSD 的代码。Apple 的 Darwin 更是基于 4.4 BSD 的正统 Unix,真正 POSIX 兼容。著名家用主机 Sony PlayStation 的操作系统也基于 FreeBSD,著名掌机 Nintendo Switch 也是如此。

看到这些,可能给人这么一种错觉:既然这么多大公司用 BSD,那个人用户使用 FreeBSD 或者 OpenBSD 等自由 BSD 操作系统的时候体验应该也不错吧?

现实令人遗憾 —— 不求回报的 BSD 自然如他们所愿 —— 没拿到什么回报。

想在 FreeBSD 上面玩游戏?就算大公司用 FreeBSD 在游戏业界赚得盆满钵满,普通 FreeBSD 用户也别指望在上面分到一杯羹。

FreeBSD 不能直接运行 PlayStation 或者 Nintendo Switch 的游戏。要么找个开源的游戏,然后看看有没有人移植他,或者装个兼容层或者模拟器。FreeBSD 内置了 Linux 兼容层,用户也可以自行安装 Wine。

问题是,这些生态 Linux 都有。Steam 甚至有原生 Linux 版。BSD 的大公无私没有为其带来回报。

那么 Apple Darwin 对 FreeBSD 或者 OpenBSD 生态有助益吗?大概也是没有的。技术上讲,Darwin 虽然是 POSIX 还是正统 BSD 后代,但是有着自己的扩展 API,将 Apple Darwin 的程序移植到其他 BSD 上没那么容易。况且 Apple 不给代码,社区就算有兴趣移植也做不到。

Apple 和 Sony、Nintendo 这些公司也没给 BSD 多少经济上的支持。FreeBSD 基金会的捐赠者名单透露出的数据很有意思:Apple 对 FreeBSD 基金会的捐赠一直在 1000-4999 美元这个量级,常年被 Google 轧着一头,微软还比 Apple 多捐个 0 在后面,有些时候连 Nginx 捐的钱都比 Apple 多。而 Sony、Nintendo 之类的连捐赠的影子都没有。

OpenBSD (他们写了 OpenSSH)则一直没得到过 Apple 的捐赠。Google 和微软倒是捐了点。

不求回报就真的没有回报。而遗憾的现实是,如果不强行让公司做点什么,他们就会用一句谢谢打发开源开发者,然后自己赚几个亿。

我不希望给读者造成 “Apple 这些用了 BSD 的公司都是白嫖怪”的印象。Quora 上有人声称 Apple 使用了一些 FreeBSD 代码,并把改进开源回了社区。但是我没找到其他 Apple 对 FreeBSD 做贡献的证据。Netflix 使用 FreeBSD 来做视频推流的服务器,他们雇佣了全职工程师在 FreeBSD 上工作,优化其网络栈。但是同样,Netflix 也整了几个工程师在 Linux 这边——上次他们整的大新闻就是 Fedora 帧指针的那件事。

务实的原则

我喜欢(GPL)版本 2,并且我仍然觉得版本 2 是一个非常棒的协议, 理由是:「我给你源代码,你给我你对它的修改,我们就扯平了」
——Linus Torvalds

Linux 成功的一个基础以及核心就是: 我给你源代码,你给我你对它的修改,我们就扯平了。 这是相当直接且务实的思维。这一思维也常见于其他成功的开源社区项目中。

且不说 Linux 内核这种一大堆公司贡献的开源项目。咱谈谈用户态的东西。

Office 这块, LibreOffice(MPL,允许混合闭源代码,但在MPL授权下的代码文件必须保持MPL授权) 有许多来自 RHEL 与 Collabora 的贡献者,用户能直接享受到来自这些大公司的贡献。ONLYOFFICE 与 GhostScript 等软件直接更激进,使用 AGPL 来维护自己的商业模型 —— 只要你 AGPL,那我的代码你可以自由使用,如果你想闭源商用,那请乖乖交钱。

说到游戏,Value 多年前就在 Linux 游戏平台上投资。他们开发了 Proton 这一 Wine 衍生版(Wine 在 LGPL 协议下面),为 Steam 上的游戏提供开箱即用的 Linux 支持,当然,也是开源的。Value 使用了 KDE (也是 GPL/LGPL 协议)作为 Steam Deck 的桌面环境,所以他们直接请开发者开发他们需要的功能,并支付报酬。

GPL、MPL 等要求“返还代码”的许可协议促使商业公司参与到社区中来,与所有人分享开发成果。因此没有人能独占这些成果。虽然大公司能够主导开发方向,小开发者也能自由使用或修改这些代码来满足他的需要。上游也许会因为大公司的开发方向而不接受这些贡献,但是有需求的开发者永远可以合理合法的维护自己的分叉版本,而且使用大公司的代码。

这就也是 Linux 硬件支持要优于 BSD 系的原因。想要使用 Linux,厂商要么开源自己的驱动,要么大费周章学 Nvidia ,因为 Linux 内核不保证 ABI ,只能手动跟进每个内核版本,或者学 Google,开发硬件抽象层,绕过 GPL。如果厂商能把驱动推到 Linux 主线,每个做更改的开发者都有义务保证他们的更改不会破坏这些驱动,维护成本反而被分摊到了社区。厂商轻松,用户也高兴。

而用 BSD,厂商没有开源驱动的义务与必要。

GPL 给了用户使用软件的自由,也给了用户公开修改后代码的义务。这里自由的权利与义务对等。而自由的核心就是“承担义务”。比如有人想自己买车,而不是使用公共交通,那么他就得承担保养车与遵守交通规则的义务——承担的义务比坐公交要更多。

而 BSD 用户可以毫不费力的获取到以上贡献,因为他们是开源的。BSD 给了自由却不要求义务,而这就是现状的根源。

“开源的目的就是给你用”

也有一些特殊的开源项目。他们不要求“拿回源码”却非常成功。

SQLite 的开发者选择将代码散播在公有领域,而且 SQLite 也是使用最广泛的、最可靠嵌入式数据库(也许没有之一),这是无私分享模式的巨大成功。但是 SQLite 他们不接受外部贡献,所有代码都由开发者团队写成,其中的每个人都签署了协议保证他们有权力将代码公开到公有领域。因此,其开发过程是半封闭的。

Apple 也开发了 LLVM 这一伟大的开源编译器框架(Apache 协议开源)。Google 也开源了著名的 Android 操作系统(内核 Linux,用户态 Apache,含私有组件)与流行的开源浏览器 Google Chromium (BSD 与其他许可混合)。这些大公司为了保证控制力,也没有采取开源社区的开发方式,而是半开放。

这些项目都有一个共同点:项目的方向与意图完全由组织主导。开源是为了让用户更加方便的使用,而不是为了社区参与。“开源的目的就是给你用”。他们并不依赖修改代码的用户来改进软件。采用不要求“拿回代码”的许可协议符合他们的需求。但也意味着他们能瞬间闭源后续版本,或者结合闭源软件打包销售。

这种项目对于用户的自由没什么保证 —— Chromium 最近打算使用 Manifest V3 限制去广告扩展的能力,就是这种项目之弊端的最好论证。这些项目非常优秀,但是用户的自由并不是他们的考量的核心因素之一。

结语

现实情况就是,许多商业公司用了 BSD,但是没有为 BSD 生态带来多少起色。许多公司用了 Linux,这块的改进有一些反馈到了社区。BSD 协议决定了 BSD 现在生态上的缺口。

所以 BSD 是慈善家, GPL 是正常人。GPL 等协议维护的正是中小开发者与用户的自由,让大公司承担使用开源软件的时候也贡献代码的义务。如果用户想表达对开源软件生态的支持,对于个人与中小开发者权利的维护,使用或者开发 GPL、 LGPL 与 MPL 协议下的开源软件是更加有意义的选择。

也请不要误解——BSD 式的慈善当然好。我尊重且鼓励 BSD 协议的代码。这种情况开发者与用户不需要(也不能)“拿回代码”,因此是无私(至少看起来如此)且友善的分享。但是因为有慈善家就攻击正常人“道德败坏”就有点不合适了。更别提在 LLVM 之前的 BSD 操作系统基本上全是 GCC 编译的。用 BSD 批评 GPL 多多少少有点“端起碗吃饭,放下筷骂娘”的黑色幽默。

“BSD 与 GPL:圣人与常人”的一个回复

  1. 想起閻錫山的一句話「各取所需是圣人制度。各取所值是贤人制度。劳资合一是常人制度。私产生息是盗贼制度。常人多只好行常人制度,贤人多可行贤人制度,圣人多始可行圣人制度。」,這是閻錫山對資本主義和共產主義經濟制度的觀點,我覺得 BSD 和 GPL 協議的問題有類於此,現如今聖人太少,常人太多,故整體上使用 BSD 不可行,應行要求付出和收穫對等的「常人制度」GPL.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注