跟涛哥一起学嵌入式第07集:GNU/Linux和Linux有
GNU、GNU/Linux、Linux 之间到底是什么关系?什么是自由软件?什么是GPL协议?什么是自由软件基金会?什么是GNU耻辱榜?有多年开发经验的Linux工程师,估计也没怎么关注过这些问题。今天就以自由软件发展的角度,给大家科普一下它们之间的关系。
1
想了解他们之间的关系,从Windows说起估计比较容易理解。Windows操作系统,大家都很熟悉:当微软发布OS新版本,你迫不及待地把它安装到你的电脑上,开机重启,你会发现,除了Windows操作系统,还有很多其它软件:office软件满足你的日常办公;Windows player可以听歌看电影;使用Visual studio软件,你可以开发桌面程序,发布自己的软件。也就是说,Windows发布的操作系统,不仅仅是一个操作系统,而是一个操作系统生态:开发者可以在这个平台上,使用微软提供的编译器工具、第三方开发工具,开发各种各样的软件:QQ、绝地求生、荒野行动、浏览器、网页、论坛.....,人们在这个平台上扮演着各种角色:使用者、开发者,一起维护和壮大这个生态。
2
GNU是一个操作系统,GNU是 "GNU's Not Unix" 的递归缩写 ,它的正确发音是:葛奴,而不是直接读G-N-U 或 new。GNU操作系统是一个类似Windows的自由软件操作系统,包括整个生态:操作系统内核、编译器、调试器等开发工具、办公软件、桌面游戏等自由软件。
3
GNU工程发起于1984年,带头大哥是Richard Stallman, 就是写了Emacs、GNU C编译器、GNU C调试器的这位大名鼎鼎的×××。GNU工程的目标是:构建一个类似Unix的操作系统,包括内核、编译器、编辑器、电子表格、邮件软件、图形界面、应用库、游戏软件等。或者说,就是构建一个类似Windows生态的操作系统(当时Windows还没问世),方便计算机用户和开发者方便快乐地使用计算机。
GNU工程一个巨大的工程:开发一整套操作系统,包括内核、编译器、调试器、开发工具、应用软件等,绝非一个人或一个团队所能完成的,因此在1985年10月,成了了自由软件基金会(Free Software Foundation,FSF),它初期用来给GNU募集资金。
为什么要发起这个工程呢?很简单,因为当时计算机上的几乎所有软件都是专有软件(Proprietary software)。什么是专有软件呢?就是使用、修改、分发受到限制的软件,作者拥有这个软件的版权,不开源,只发布编译过的二进制版本的程序。一般商业公司比较支持专有软件。但是,对于行业发展来说,这不是个好事情,技术分享,互相迭×××发,才能更好地促进软件行业的成长。
与专有软件对应的是自由软件(free software),自由软件可以不受限制地自由使用、复制、研究、修改和分发。对,没有看错,就是这么自由!它要求是公开源码的,任何人都可以获得这份代码,可以修改,然后以其它版本再次发布、分发。这里需要注意的是,自由软件不等于免费软件(freeware),它也可以买卖,比如Linux操作系统光盘。这里的自由是权利问题,不是价格问题,自由软件有四项基本自由:
使用自由:可以免费获取源码、使用
学习自由:有权利研究如何运作、实现
修改自由:可以改进该软件,发布改进
发布自由:重新发布你修改的版本
GNU工程要求:GNU操作系统,包括内核在内的整套软件,都必须是由自由软件构成。
4
GNU工程的目标,是构建一个包括内核在内的操作系统生态。在早期,在自由软件基金会的支持下,大多数自由软件项目都是以完成某项具体工作为目标。比如,Donald Knuth编写一个文本排版软件(TeX);Bob Scheifler开发一个窗口系统(X Window);Richard Stallman 开发了C编译器和调试器。 GNU工程也在开发一个操作系统内核,叫hurd,但是开发不是很顺利,后来Linus Torvalds编写一个类似Unix的内核(Linux) ,这样,整个操作系统的组件就齐全了,GNU/Linux操作系统就发布了。
Linux仅仅是一个内核,你可以从官网上下载这份源码;而GNU/Linux是一个操作系统,类似于Windows操作系统,包括Linux内核、编译器、编辑器、桌面系统、应用程序等整个生态。
我们讲过,GNU工程发布的GNU/Linux操作系统都是有自由软件构成的,所以任何人都有修改、分发的权利。所以,你也会看到GNU操作系统的分发版本:GNU/hurd,这有点类似于Windows操作系统的win7、XP、win10版本。
通过GNU工程发布的软件,一般会以GNU冠名。比如GCC,全名就是GNU Compiler Collection ,即GNU编译器套件;如果你开发一个chess的象棋游戏,通过GNU发布,这个软件就是:GNU Chess[官网];你编写一个连连看小游戏,如果通过GNU发布,这个软件名字就是:GNU 连连看。
5
自由软件基金会(FSF),由Richard Stallman建立。成立的初衷就是为开发GNU操作系统募集资金,它是一个美国民间的非盈利组织。在早期,FSF的基金主要用来雇佣程序员来开发自由软件。1990年以后,随着写自由软件的公司和个人越来越多,各种版权、法律、结构上的问题也越来越多。所以,现在自由软件基金的雇员和自愿者一般主要从事版权、法律相关的工作:比如GPL的施行,监督版权、GNU许可证等。当然,现在自由软件基金会也会开展跟多的自由软件项目,不仅仅是GNU工程,开发更多的自由软件,完善自由软件的理念。
6
GPL即GNU GPL,全称 GNU General Public License,翻译成中文就是:GNU通用公共许可证,GPL协议是干嘛用的呢?这个还得从自由软件说起。
通过上面的学习,我们知道,自由软件是开源的、可以任意修改和发布的。正是这一特性,自由软件再以一种不可思议的速度发展,自由软件不仅为成千上万的使用者、开发者提供了便利,也为很多商业软件公司提供了方便。自由软件是一座巨大的宝库,很多商业软件都是基于自由软件的基础上进行开发,节省了大量的人力、物力。有些自由软件,甚至比商业软件还好用,比如Linux、Git、ffmpeg、Libav、mplayer等。
按照自由软件的规则,你免费获取了自由软件的源码想,可以修改,可以发布。本着人人为我,我为人人的原则,你发布的软件也必须开源,供其他人学习、使用、修改。GPL协议就是用来维护这个规则的:开放软件的版权限制。你开发一个软件,使用了别人使用GPL协议发布的源码,那么,不好意思,你的软件也必须通过GPL协议发布,全部开放源码。
GPL这种自由开放的模式,对于技术分享、学习是个好事情,但是对于很多商业公司却很头疼。比如,一个公司,想基于自由软件FFmpeg解码库,开发一个"迷你影音"播放器,但是又不想把自己开发的源码、商业秘密分享出去,怎么办?没关系,除了GPL协议,还有其它协议,比如LGPL协议可以解决这个问题。
7
LGPL是 GNU Lesser General Public License (GNU 宽通用公共许可证)的缩写。GPL协议要求你的源码全部开放,这简直要了商业公司的命。LGPL协议可以解决这个问题,LGPL协议跟GPL协议基本上一样,只是缩小了你要公开源码的范围:缩小到动态链接库。比如,你想基于FFmpeg这个库开发一个影音播放器,如果你使用了基于GPL协议发布的FFmpeg解码库,不好意思,你要开放你的整个软件源码;如果你使用了基于LGPL协议发布的FFmpeg解码库,你在项目中,可以以库的形式来使用FFmpeg,但如果你对这个解码库进行修改,必须再次以LGPL协议发布,这些FFmpeg源码最后以库的形式被应用在你的商业项目中。对于你软件中的其它源码,那是你的商业秘密,不用公开。
从上可以看到,无论是GPL,还是LGPL,都是自由软件开发者和商业软件开发者之间的一个博弈。如果所有的自由软件都以GPL协议发布,那商业公司就用不了了,自由软件的价值也大打折扣;而通过LGPL协议发布,一方面可以促进自由软件的发展,另一方面,也可以和商业软件共存。
8
自由软件是个巨大的宝库,很多自由软件甚至比商业软件还优秀、还有用。这也吸引了大量的商业软件公司,喜欢从这个巨大宝库中,挑挑拣拣,找出自己喜欢的自由软件,修修改改,加以包装,就以商业软件的形式出售盈利了。
无论是GPL协议,还是LGPL协议,虽然它制定了自由软件的发布规则,但GNU毕竟是一个民间组织,跟那些商业巨头、商业流氓相比,人微言轻,有时候打官司也打不过,没办法,只能使用阿Q精神精神胜利法:我奈何不了你,我要让你上耻辱榜,公开羞辱你们,看你害燥不害燥!
比如自由软件FFmpeg,很多播放器都是基于此进行二次开发,但是当作商业软件使用,违反了自由软件的协议。在FFmpeg官网上,有一个耻辱软件榜,很多违反自由软件协议的商业软件都被列在了这里,包括韩国赫赫有名的播放器KMPlayer以及知名的一些播放器等,有兴趣可以自己搜,很多软件都被钉在了这个耻辱柱上。特定到官网上去看看,发现很多都被撤下来了,一直在待更新状态....,但是在FFmpeg的GitHub上有备份:FFmpeg耻辱柱
除了GPL协议、LGPL协议,还有其它各种协议,比如Apache、BSD、Mozilla等,除此之外,还有各种开源软件、共享软件、绿色软件、免费软件等,大家如果有兴趣,可以自己了解下。
嵌入式学习QQ群:3284757626微信公众号:宅学部落
王老师的51CTO学院课程视频:51CTO学院-王利涛-嵌入式视频教程
王老师的淘宝店:wanglitao.taobao.com