从阿里云os和Google之争看开源协议

最近IT界比较大的事件就算是阿里云os和Google之争,里面的细节没有人知道,但是通过这个事情,我对目前常用的开源协议有了一些了解,也借此机会梳理和总结一下。

自从自由软件之父理查德·斯托曼(Richard Stallman)发起的GNU(GNU's not uinix:说实在的,我也不知道他想表达什么) 运动,开源运动如火如荼的发展起来,现在开源已经成为常态了。至少开发人员应该或多或少的知道一点,但是基本上所有的开发都应该使用过开源产品,例如我们最常用的apache。

由于理查德·斯托曼的认知,认为软件应该就是应该自由和开放的,开发人员应该很容易获得源代码以及进行改动,再把改动之后的源代码发布出来,就这么简单的一个想法,在加上Linus Torvalds 等牛逼黑客的加入,GNU影响力越来越大。GNU发布了GPL协议,这个协议和当初创世人的理念有关。

 

GPL(General Public License)协议主要特点:

  • 所有的源代码都是公开的,可以自由使用。但是是有版权的
  • 如果对GPL的开源代码进行修改,就必须把修改之后的代码进行开源
  • 如果引用了GPL的代码库,就必须开源你引用部分的代码。相当于你的代码中如果有一行代码引入了GPL协议的库函数,就必须把整个代码开源。就是所说的传染性
  • 如果使用的是GPL产品,没有上面的限制。这个说实在的,我觉得真不好界定。例如java中的openjdk,如果你只是使用他的编译器编译你的java程序,是没有必要开源你的java程序
  • GPL是free(自由的),但是是可以收费的。我们经常认为开源的就是免费的,这个是不对的。

从上面的限制来看,GPL开源协议还是有很大的传染性的。如果一个商业公司引用了开源代码或者库函数,就必须开源引用它的整个代码。有一些公司不愿意开源咋办,就不能用了。毕竟对于商业公司来说,代码是我的资产,我没有必要开源,所以这个协议对商业公司不是很友好

LGPL(GNU Lesser General Public License):是GPL的变种,这个是宽松的GPL,对于商业公司比较友好,如果使用了LGPL的库,可以不开源的你的代码。与GPL的最大不同是,可以私有使用LGPL授权的自由软件,开发出来的新软件可以是私有的而不需要是自由软件。所以任何公司在使用自由软件之前应该保证在LGPL或其它GPL变种的授权下。

 

BSD(FreeBSD Copyright Information):这个算是宽松的协议了,你可以使用和修改它的源代码,注明使用了他就可以了,你自己的代码是可以私有的。只要别侵权就可以,比如直接copy了源代码,说是你自己写的,这样就不对了。

 

Apache Licene:这个和BSD差不多,但是要注意几点,如果修改了源代码,要注明修改了什么。开源代码的商标,专利,所有权都要保留的,不能说修改了开源apache 协议的开源代码,就直接把代码的作者写成你,这样是不对的。发布产品的时候,对于自己修改的apache 开源代码,不能够变成其他的开源协议。

 

MIT:这个说实在的,我个人见的比较少,这个算是最自由的协议了,和BSD一样,但是修改了MIT源码,可以加入自己的授权。 

常用的也就上面几种

 

下面来看看 android的问题

由于android 使用linux的代码库,按照道理来说,android必须以GPL的协议进行开源,但是考虑到GPL对商业上非常不友好,一旦有公司想优化andorid,对android进行定制,也必须开源这一部分代码。但是google怎么做的了,这个是另外一个篇文章分析里面的一部分

“Linux kernel 的版权是 GPL。

这下问题来了:如果你是硬件厂商,希望你的硬件能在 Linux kernel 下运作,那么就必须要有驱动程序。如果驱动程序的程序代码公开,等于硬件规格也公开的差不多了。许多厂商不愿意这么做,所以就提供编好的驱动程序,但不提供原始码。

Android 的重点就是商业应用,Google采用了一些手法来绕过这问题。他们把驱动程序移到 "userspace",也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 "userspace" 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就行啦。”

所以阿里云OS也应该避免不了,至少要公开这个后门部门的源代码,所以按照道理来说,阿里云要公开这一部分代码,貌似没有公开,好奇它是怎么绕开的。

 

下面是一些常用的开源产品的授权协议:

tomcat:Apache Licene

android:Apache Licene

spring:Apache Licene

openjdk:GPL

Mysql:GPL

Jquery:MIT(貌似是最近改的)

JBoss:LGPL

Nginx:BSD

 

发现通用的代码库和开发框架,大多是Apache Licene 授权的,开源的产品大多数是LGPL授权的,apache的产品多是apache license。