一篇带你了解GPL前世今生

系统 Linux
从事Linux开发的朋友一定都听过GPL,那么到底什么是GPL呢?他有什么作用呢?本文给大家做详细讲解。

[[440575]]

从事Linux开发的朋友一定都听过GPL,那么到底什么是GPL呢?他有什么作用呢?本文给大家做详细讲解。

一、GNU/GPL

在讲解GPL之前,我们必须先了解什么是GNU?

1. 什么是GNU

GNU:GNU's not unix。也叫革奴计划。

GNU的创始人,理查德·马修·斯托曼。

GNU是一个自由的操作系统,其内容软件完全以GPL方式发布。

这个操作系统是GNU计划的主要目标,名称来自**GNU's Not Unix!**的缩写 【这种递归式命名方法也只有程序猿大神才能想起来】

可以说GNU也是一个软件集合,如:Emas,gcc,bash,gawk等。

由于没有内核(可以理解成还在实验室里就GNU系统就被淘汰了)。

因为GNU的设计类似Unix,但它不包含具著作权的Unix代码。

2. GNU历史

在二战(1939-1945)结束后,计算机产业刚刚兴起的时候,闭源软件的概念还未出生。那是个一切代码都免费共享,可以随意修改、再发行的时代。

后来,开始有人只发行闭源的程序,这通常是一种原始代码几乎不可能被单纯地破译的二进制文件。1983年,IBM成为大型企业中第一个发行闭源软件的公司;AT&T公司紧随其后,原本免费的Unix在更新后要价数万美元…

平日使用的Unix突然开始收费,还如此昂贵,这让很多人难以接受。

其中,有一个叫Richard Stallman(人称 RMS)的人站出来了。他推出了 GNU计划 ,希望有朝一日,从操作系统到各式应用软件,都能免费开源得让大家使用。

[[440576]]

而具体的办法,就是在发布软件的同时包括我们今天提到的 GPL 许可证。

3. 什么是GPL

GPL许可协议(GNU General Public License):只要软件中包含有其他GPL协议的产品或代码,那么该软件就必须也采用GPL许可协议且开源及免费。

具有以下特点:

  • 复制自由:允许将软件复制到任何人的电脑中,并且不限制复制的数量。
  • 传播自由:允许以各种形式进行传播。
  • 收费传播:允许在各种媒介上出售该软件,但必需提前让买家知道这个软件是可以免费获得的,并解释收费的理由(一般来讲都是能够为用户提供某种服务,以技术服务的形式来收费)。
  • 修改自由:允许开发人员增加或删除软件的功能,但必须依然基于GPL许可协议授权。

4. 通俗的讲下GPL到底有什么作用?

总结成一句话,修改后必须以GPL授权开源发布。

只要在代码中加入这个名叫GPL的许可证,你就能保证软件的用户能够自由地运行、研究、分享和修改你的代码了。

而且,从你的软件衍生出的一切修改版本,都必须遵守这个许可协议。

一个有意思的地方是,拥有代码的人有权利用代码开发软件并盈利。

但是,在有人花钱买走软件之后,这个人可以随意把买到的软件分享给其他人,而不必担心侵权,甚至是被告上法庭——因为对于遵守开源协议的软件来说,压根不存在“盗版”的概念。

由此可见,开源协议大大地提高了软件使用者的权利。

理解了GNU的精神,也就能理解GPL在说些什么,其实就是开源。

在现实生活中,我们受益于 GPL的地方,其实很多,几乎所有的操作系统,除了windows,其他的几乎都是基于linux开源代码改写的。

5. 举例

以下是Linux内核中网卡DM9000的驱动程序版权声明:

DM9000是Davicom公司生产的一款非常流行的网卡芯片。

第一个红框声明了代码的版权属于作者 Sten Wang 。第二个红框则是说使用者需要遵守 GPL协议(GNU General Public License)。

二、GPL与Linux

Linus Torvalds 认为 GPL 是 Linux 成功的重要部分

虽然不是每个开源软件都喜欢 GPL,但是如果没有 GPL ,或许不会有如今的 Linux 和整个开源世界。

以下节选自Linus Torvalds自传《知识为了好玩》

  1. 当时的演讲者是理查德·斯多曼(Richard Stallman) 。 此人是自由软件的鼓吹者。 
  2. 1983年, 他开始研究UNIX的一个替代物, 将其称作GNU系统, 其含义是“GUN不是 
  3. UNIX”(GNU是“GNU is Not UNIX”的字首缩略语--译注) 。 这 
  4.  
  5. 更重要的是, RMS(理查德·斯多曼希望别人这样称呼他) 还撰写了《自由软件宣 
  6. 言》 和自由软件产权证书, 即GPL。 他首先提出的关于开放源代码的概念完全是有意的, 
  7. 而并非出于偶然, 和UNIX最初的开放发展理念是相吻合的。 
  8.  
  9. 我后来为Linux使用的就是GPL。 就这样, 我再一次走在了自己的前面。 
  10. 事实是, 为了使Linux有用, 我曾依赖过很多在网上免费下载的工具――我把自己 
  11. 放到了巨人的肩膀上。  
  12.  
  13. 这些免费软件中最重要的是GCC编译器, 它是理查德·斯多曼的杰 
  14. 作, 并且已经在公共执照协会(GPL)上注册了版权。 在GPL条款之下, 钱不是问题, 只要 
  15. 有人愿意买, 你可以卖一百万美元。 但是, 你必须提供软件来源。 而得到或买到你的来源 
  16. 的人, 将拥有和你一样多的对于该程序的。  
  17.  
  18. 这实在是很高明的一招。 我认可GPL的原则, 
  19. 但是和那些认为所有的软件创新都应该在GPL下向全世界公开的顽固的GPL信仰者不同,我认为发明者本人有决定如何处置自己的发明的权利。 
  20. 于是, 我抛弃了自己旧有的版权声明, 采纳了GPL的内容, 一个斯多曼也曾经和他的 
  21. 律师一道签署过的文件(因为有律师的参与, 该文件被搞得洋洋洒洒有好几页)。 
  22.  
  23.  我担心, 在现实中, 如果有个美国人侵犯了我的版权, 我无法对其提起诉讼。 现在 
  24. 这仍是我的担心。 状告某人侵权很容易, 而我的担心是, 有的人会即使被起诉也继续从事 
  25. 这种违法行为, 除非加诸某种强制执行的法律行动他们才会停止。 同时我也不断地担心, 
  26. 在像中国这样的地方, 企业并不承认GPL的效力, 从而也不会尊重我的版权。 
  27.  
  28. 事实上, 这些地方的法律体系对侵犯版权的制止在当时并不得力(中国已经签署了一 
  29. 系列的国际公约, 林纳斯在这里谈的是1991年的情况――译注), 而且, 为防止违法行为 
  30. 的投入在这些地方被认为是不划算的。 大软件公司和唱片公司曾作过努力, 但是成效不 
  31. 大。 
  32.  
  33. 不过, 事实减轻了我的担忧。 有的人确实会暂时侵犯我的版权, 但是他们往往也是那 
  34. 些尊重版权、 反馈改进意见、 使系统功能得以提高的人。 他们将是系统升级过程中的一分 
  35. 子。  
  36.  
  37. 总的来说, 我从两个方面看版权。 比如一个每月挣五十美元的人, 他可能会为一个软 
  38. 件花费二百五十美元吗? 如果花一点钱买非法拷贝软件, 而把五个月的工资用于吃饱肚 
  39. 子, 我一点不觉得他不道德。 这种侵权是道义上可以接受的。 去追捕这种“侵权者”是不道 
  40. 德的, 更不要说简直就是愚蠢的。 就Linux而言, 谁在乎如果只将其用于个人目的时, 一 
  41. 个人是否真正遵循了GPL呢? 那些想藉此赚大钱的人们, 才是真正不道德的, 不管他们是 
  42. 在美国还是非洲, 也不管程度如何。 
  43.  
  44. 贪欲从来就不是善的。 
  45.  
  46. 正如开放源代码在1998年吸引了全世界的目光, 最大的争议之一就在于其名字本身。 在此 
  47. 之前, 已有了诸如GPL所许可的“自由软件”, 我们会提到软件共享现象, 以及通常所谈论 
  48. 的“自由软件运动”。 这一用法源于“自由软件基金会”(Free Software Foundation) , 该基 
  49. 金会由理查德·斯多曼于1985年为促进自由软件工程而创立, 比如GUN和由他发起的FreeUNIX。 
  50. 没准, 像艾立克·雷蒙德这样的新教徒会发现新闻记者们全搞错了。  
  51.  
  52. free”一词真的意 
  53. 味着免收任何费用吗? “free”真的意味着没有任何限制吗? “free”真的意味着自由自在吗? 
  54. 经过几周私人信函的往来, 我们最终达成了一致意见: 比起“free”来, 我们更愿意使 
  55. 用“open”(开放) 一词。 从此, 自由软件运动变成了开放软件运动。 对于那些乐意将此一 
  56. 场运动的人来讲, 我猜这的确是一场运动。 自由软件基金会仍然被称之为自由软件基金 
  57. 会, 而理查德·斯多曼也仍旧是幕后在心理上进行策划的人。 

三、其他开源协议(BSD,Apache,LGPL,MIT)

其他开源协议比较

1. BSD开源协议(original BSD license、FreeBSD license、Original BSD license)

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,

需要满足三个条件:

  1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
  2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
  3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在 必要的时候可以修改或者二次开发。

2. Apache(Apache License, Version 2.0、Apache License, Version1.1、Apache License, Version 1.0)

Apache Licence是著名的非盈利开源组织Apache采用的协议。

该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。

需要满足的条件也和BSD类似:

  1. 需要给代码的用户一份Apache Licence,如果你修改了代码,需要在被修改的文件中说明。
  2. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  3. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。

你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需 要并作为开源或商业产品发布/销售。

3. LGPL(GNU Lesser General Public License)

LGPL是GPL的一个为主要为类库使用设计的开源协议。

和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。

LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。

这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。

因此LGPL协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

4. MIT(MIT)

MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制。

也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

四、 大名鼎鼎Android内核是Linux,那他是如何规避GPL的

下图是一个完整的Android软件系统所用到的所有协议分布。

与Android关系最为密切的主要包括两个方面:驱动和glibc

1. glibc

glibc是linux上的主流的c运行时库,几乎每个linux程序都会简介的依赖c运行时库。

由于glibc是gpl授权的,因此如果采用glibc作为crt,按照前述问题的第二条,这些程序必须开源。

因此安卓采用bionic作为c运行时库替代glibc来规避gpl

2. 驱动

再说驱动,Android是基于Linux 内核开发的,Linux内核是GPL授权。

传统的驱动是要作为内核模块被加入到内核中的。

而内核模块属于Linux内核的衍生产品,需要遵守GPL协议开源发布。

Android是由开放手机联盟共同完成的,为了保护联盟中手机生产商的利益,驱动不能被完全开源。

因此安卓引入HAL,给linux内核开了个后门,增加了一些系统调用。

HAL在内核的部分按照GPL的要求开源。

驱动开发者可以在用户态使用这些新增的系统调用完成驱动的开发。从而在驱动方面规避了GPL。

进一步了解:

Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空间(Kernel Space), 其中,硬件抽象层运行在用户空间,而Linux内核驱动程序运行在内核空间。为什么要这样安排呢?把硬件抽象层和内核驱动整合在一起放在内核空间不可行吗?

从技术实现的角度来看,是可以的,然而从商业的角度来看,把对硬件的支持逻辑都放在内核空间,可能会损害厂家的利益。我们知道,Linux内核源代码版权遵循GNU License,而Android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,在手机市场竞争激烈的今天,这对厂家来说,损害是非常大的。

因此,Android才会想到把对硬件的支持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。

也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。大家想想,Android放在内核空间的驱动程序对硬件的支持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的支持,硬件就完全不能用了,这也是为什么说Android是开放系统而不是开源系统的原因。

五、软件其他几个相关的版权概念

1. copyright

copyright就是俗称的版权,也叫著作权。

版权又称著作权,用来表述创作者因其文学和艺术作品而享有的权利。版权的取得有两种方式:自动取得和登记取得。在中国,按照著作权法规定,作品完成就自动有版权(百度百科)。

简单来说,版权(copyright)只是规定是谁对作品享有权利,而具体享有哪些权力,需要参照当地法律。

比如一种定义是:

根据规定,作者享受下列权利:

  1. 以本名、化名或以不署名的方式发表作品;
  2. 保护作品的完整性;
  3. 修改已经发表的作品;
  4. 因观点改变或其他正当理由声明收回已经发表的作品,但应适当赔偿出版单位损失;
  5. 通过合法途径,以出版、复制、播放、表演、展览、摄制片、翻译或改编等形式使用作品;
  6. 因他人使用作品而获得经济报酬。上述权利受到侵犯,作者或其他版权所有者有权要求停止侵权行为和赔偿损失。

2. license

在此基础上,作者还可以制定授权协议(license),来具体地界定使用者的权利。

也就是说,

  • 作者的具体权利 = 当地法律规定的版权(copyright) + 自己在作品中添加的授权协议(license)。

  • 权利 = 版权(copyright) + 授权协议(license)

比如,商业化的授权协议(license)可能会倾向于强调,使用者的哪些行为是侵权行为,从而保护自己的商业利益。

3. copyleft

而与这一商业化的授权风格相对的是,RMS等人引领的copyleft的思潮。这一思想在保护作者的基本版权之余, 可以让作者通过在作品中添加开源协议(license),从而放大用户的权力。

比如我们今天的主角,RMS在198为GNU项目拟定的 GLP 协议,允许用户自由地运行、研究、分享和修改源代码。

本文转载自微信公众号「一口Linux」

 

责任编辑:姜华 来源: 一口Linux
相关推荐

2021-05-20 06:57:16

RabbitMQ开源消息

2010-05-07 09:33:28

GNU GPL开源许可协议

2019-07-11 10:29:28

操作系统虚拟机Linux

2023-05-12 08:19:12

Netty程序框架

2021-07-28 10:02:54

建造者模式代码

2021-06-30 00:20:12

Hangfire.NET平台

2021-08-11 07:02:21

npm包管理器工具

2021-07-14 08:24:23

TCPIP 通信协议

2021-11-24 08:51:32

Node.js监听函数

2021-08-02 06:34:55

Redis删除策略开源

2021-11-08 08:42:44

CentOS Supervisor运维

2019-08-05 10:08:25

软件操作系统程序员

2019-06-10 14:53:15

分布式架构应用服务

2016-11-08 19:19:06

2016-11-03 13:33:31

2021-01-06 05:23:15

ServiceMesh网络阿帕网

2021-07-08 06:30:03

Linux CPULinux 系统

2021-08-14 10:01:43

Python条件语句Python基础

2021-02-02 18:39:05

JavaScript

2020-11-10 10:48:10

JavaScript属性对象
点赞
收藏

51CTO技术栈公众号