从事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计划 ,希望有朝一日,从操作系统到各式应用软件,都能免费开源得让大家使用。
而具体的办法,就是在发布软件的同时包括我们今天提到的 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自传《知识为了好玩》
- 当时的演讲者是理查德·斯多曼(Richard Stallman) 。 此人是自由软件的鼓吹者。
- 1983年, 他开始研究UNIX的一个替代物, 将其称作GNU系统, 其含义是“GUN不是
- UNIX”(GNU是“GNU is Not UNIX”的字首缩略语--译注) 。 这
- 更重要的是, RMS(理查德·斯多曼希望别人这样称呼他) 还撰写了《自由软件宣
- 言》 和自由软件产权证书, 即GPL。 他首先提出的关于开放源代码的概念完全是有意的,
- 而并非出于偶然, 和UNIX最初的开放发展理念是相吻合的。
- 我后来为Linux使用的就是GPL。 就这样, 我再一次走在了自己的前面。
- 事实是, 为了使Linux有用, 我曾依赖过很多在网上免费下载的工具――我把自己
- 放到了巨人的肩膀上。
- 这些免费软件中最重要的是GCC编译器, 它是理查德·斯多曼的杰
- 作, 并且已经在公共执照协会(GPL)上注册了版权。 在GPL条款之下, 钱不是问题, 只要
- 有人愿意买, 你可以卖一百万美元。 但是, 你必须提供软件来源。 而得到或买到你的来源
- 的人, 将拥有和你一样多的对于该程序的。
- 这实在是很高明的一招。 我认可GPL的原则,
- 但是和那些认为所有的软件创新都应该在GPL下向全世界公开的顽固的GPL信仰者不同,我认为发明者本人有决定如何处置自己的发明的权利。
- 于是, 我抛弃了自己旧有的版权声明, 采纳了GPL的内容, 一个斯多曼也曾经和他的
- 律师一道签署过的文件(因为有律师的参与, 该文件被搞得洋洋洒洒有好几页)。
- 我担心, 在现实中, 如果有个美国人侵犯了我的版权, 我无法对其提起诉讼。 现在
- 这仍是我的担心。 状告某人侵权很容易, 而我的担心是, 有的人会即使被起诉也继续从事
- 这种违法行为, 除非加诸某种强制执行的法律行动他们才会停止。 同时我也不断地担心,
- 在像中国这样的地方, 企业并不承认GPL的效力, 从而也不会尊重我的版权。
- 事实上, 这些地方的法律体系对侵犯版权的制止在当时并不得力(中国已经签署了一
- 系列的国际公约, 林纳斯在这里谈的是1991年的情况――译注), 而且, 为防止违法行为
- 的投入在这些地方被认为是不划算的。 大软件公司和唱片公司曾作过努力, 但是成效不
- 大。
- 不过, 事实减轻了我的担忧。 有的人确实会暂时侵犯我的版权, 但是他们往往也是那
- 些尊重版权、 反馈改进意见、 使系统功能得以提高的人。 他们将是系统升级过程中的一分
- 子。
- 总的来说, 我从两个方面看版权。 比如一个每月挣五十美元的人, 他可能会为一个软
- 件花费二百五十美元吗? 如果花一点钱买非法拷贝软件, 而把五个月的工资用于吃饱肚
- 子, 我一点不觉得他不道德。 这种侵权是道义上可以接受的。 去追捕这种“侵权者”是不道
- 德的, 更不要说简直就是愚蠢的。 就Linux而言, 谁在乎如果只将其用于个人目的时, 一
- 个人是否真正遵循了GPL呢? 那些想藉此赚大钱的人们, 才是真正不道德的, 不管他们是
- 在美国还是非洲, 也不管程度如何。
- 贪欲从来就不是善的。
- 正如开放源代码在1998年吸引了全世界的目光, 最大的争议之一就在于其名字本身。 在此
- 之前, 已有了诸如GPL所许可的“自由软件”, 我们会提到软件共享现象, 以及通常所谈论
- 的“自由软件运动”。 这一用法源于“自由软件基金会”(Free Software Foundation) , 该基
- 金会由理查德·斯多曼于1985年为促进自由软件工程而创立, 比如GUN和由他发起的FreeUNIX。
- 没准, 像艾立克·雷蒙德这样的新教徒会发现新闻记者们全搞错了。
- “free”一词真的意
- 味着免收任何费用吗? “free”真的意味着没有任何限制吗? “free”真的意味着自由自在吗?
- 经过几周私人信函的往来, 我们最终达成了一致意见: 比起“free”来, 我们更愿意使
- 用“open”(开放) 一词。 从此, 自由软件运动变成了开放软件运动。 对于那些乐意将此一
- 场运动的人来讲, 我猜这的确是一场运动。 自由软件基金会仍然被称之为自由软件基金
- 会, 而理查德·斯多曼也仍旧是幕后在心理上进行策划的人。
三、其他开源协议(BSD,Apache,LGPL,MIT)
其他开源协议比较
1. BSD开源协议(original BSD license、FreeBSD license、Original BSD license)
BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。
但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,
需要满足三个条件:
- 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
- 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
- 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
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类似:
- 需要给代码的用户一份Apache Licence,如果你修改了代码,需要在被修改的文件中说明。
- 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
- 如果再发布的产品中包含一个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)只是规定是谁对作品享有权利,而具体享有哪些权力,需要参照当地法律。
比如一种定义是:
根据规定,作者享受下列权利:
- 以本名、化名或以不署名的方式发表作品;
- 保护作品的完整性;
- 修改已经发表的作品;
- 因观点改变或其他正当理由声明收回已经发表的作品,但应适当赔偿出版单位损失;
- 通过合法途径,以出版、复制、播放、表演、展览、摄制片、翻译或改编等形式使用作品;
- 因他人使用作品而获得经济报酬。上述权利受到侵犯,作者或其他版权所有者有权要求停止侵权行为和赔偿损失。
2. license
在此基础上,作者还可以制定授权协议(license),来具体地界定使用者的权利。
也就是说,
- 作者的具体权利 = 当地法律规定的版权(copyright) + 自己在作品中添加的授权协议(license)。
即
- 权利 = 版权(copyright) + 授权协议(license)
比如,商业化的授权协议(license)可能会倾向于强调,使用者的哪些行为是侵权行为,从而保护自己的商业利益。
3. copyleft
而与这一商业化的授权风格相对的是,RMS等人引领的copyleft的思潮。这一思想在保护作者的基本版权之余, 可以让作者通过在作品中添加开源协议(license),从而放大用户的权力。
比如我们今天的主角,RMS在198为GNU项目拟定的 GLP 协议,允许用户自由地运行、研究、分享和修改源代码。
本文转载自微信公众号「一口Linux」