姓名:李鸿彬
学号:16040520011
转载自https://www.zhihu.com/question/38070637,有删节
【嵌牛导读】通常我们说Linux,是说Linux Kernel,这个东西在The Linux Kernel Archives这个网站上维护。但老实说,Linux在什么网站上维护是个很无所谓的问题,Linux的版本管理引领了一个时代,称为“分布式版本管理”,区别于传统的“中心式版本管理”
【嵌牛鼻子】[Linux和GNU/Linux] 【商业公司的加入】 【Android】【Linux的维护模型】
【嵌牛提问】Linux 战略或生态圈是什么?
【嵌牛正文】作者:in nek
[Linux和GNU/Linux]
传统中心式的版本管理,管理工具本身已经决定了哪个是中心,因为只有中心上才有所有的历史记录,其他人手上只有某个时刻的形态(revision,snapshot),而Linux的管理措施是,你从某个点上取下一个版本,这个版本就具有所有历史记录,从物理形态上说,它和原始的那个管理中心没有任何区别。
所以,今天你从http://kernel.org上通过git取一个最新版本出来,然后你出来声称,这才是Linux Kernel的开发中心,这没有任何问题。
但事实当然不是这样,因为这个中心除了依靠定义,还依靠开发者的认同,你一个人的世界,一个人开发,你说你那个是中心,这没有问题,但Linux是一大群人一起做的开发,你没有办法让所有人都加入这个阵营,你那个就不是中心。它可以是你个人的中心,也可以是你开的那个公司的中心,但它不是行业的中心。
这个时候你是否开始明白Linus Torvards的强大了?无论是Intel、Google还是HP、Qualcomm,这些公司多么强大,大家认可的中心是Linus Torvards个人电脑上的那个分支。
我在知乎上得赞最多的是这个回答:《道德经》讲了什么?为什么它广受推崇? - in nek 的回答。但也许大家不知道,我其实对讨论“国学”话题是没有太大兴趣的,我描述那个模型,是因为我需要借它的概念来描述Linux的代码维护模型而已。
Linux走到今天,是一个“人心”模型,Linus Torvards得到所有人的认同,不是因为他个人的开发能力有多强(再强也强不过这么多公司养的一大群Fellow吧?),而是他代表了所有人(这个圈子的开发者)的利益。他才最大程度地“合道”。理解这一点,你才会明白Linux的维护策略和发展方法。Linus对这个问题是有清晰的认知的,大家可以去看他的自传《Just For Fun》,里面对他的维护哲学有很明白的表述的。
好了,我们偏题太远。我们接着谈Linux这个词语的语义。我们说,Linux是个Kernel,这和我们一般大众的理解的范围有所不同,我们总是把Linux和Windows并列,但Linux这个词语在开发者看来,它只是内核,就相当于Windows的System32目录下的那个ntoskrnl.exe那个文件,沧海一栗,它是一个完整的操作系统中最核心的那部分代码(所以叫内核么:))
Linus最初开发Linux的时候,也就是觉得有必要开发一个真正实用的(对比Minix,一个教学用的系统),不需要购买的,可以用于他的PC的一个小系统。他已经有一些基本的外部工具了(当时Unix世界已经有不少人在开发开源的工具了,但大家并没有内核),所以他需要的是一个可以把他的PC驱动起来的内核,于是,他就开始开发了他的内核。在这个内核发布以后,一直立志推动自由软件运动的GNU项目的领导者Richard Stallman对它发生了兴趣。
这里又要偏一下题了,不少人可能对自由软件运动有误解,觉得它的理想是让软件不要钱。但英语中free是有两个含义的,一个对应我们中文的“免费”,另一个对应我们中文的“自由”。自由软件运动提倡的是后者,不是前者,请注意,不是前者。前者是给自由软件运动泼污水。自由是基于权利的:你把软件卖给我了,却不给我源代码,我自己的软件,为什么我不能修改它的行为?——所以,请把源代码一起给我,让我有修改软件的逻辑。我不评价这种观点对不对,但Anyway,我们得首先搞清楚Stallman的诉求。
为了实现他的理想,Stallman召集了更多的人,要实现(不是开发,也就是说,如果有人肯提供代码,他就把这个东西接纳进来)一个自由的操作系统,这个操作系统包括所有必须的Unix工具,而且所有代码开源。这个项目就叫GNU,GNU是一个递归的定义,它叫GNU is not Unix。很有点程序员调侃的意思。GNU项目开发了很多的工具,包括一个称为Mach的操作系统内核。Mach是个很学院派的设计,采用了业界最先进的“微内核”架构理念(估计要被人K:我个人认为所有的微内核都是学院派的意淫,我分析过QNX和NT的商用模型和代码,所有这些系统,等他们成功商用的时候,他们都在相当程度上背叛了他们初衷,原因参考这里:Linux 为什么还要坚持使用宏内核? - in nek 的回答),所以这个系统一直开发得半死不活,Stallman等不了,看着Linux的发展势头,他就直接去了找Linus,两人一拍即合,所以就有了GNU/Linux。
其实Stallman和Linus是两个很不一样的人,前者更注重理想,后者则更注重解决问题。所以,加入GNU项目后,Linus就更注重让代码和GNU的工具整合,比如很多操作系统自身不好解决的问题,就可以放到GNU的gcc工具链中解决。这种策略迅速让GNU的各种项目之间互相抱团,形成了更大的圈子。Stallman看起来就更注重让人们注意到Linux和GNU/Linux这两个名字是不同的,前者是操作系统内核,后者才是一个包括所有工具的“操作系统”。
看起来,Linus是个更务实的人,Stallman是个更务虚的人。但我个人不是这样看,我认为他们都是务实的人,只是工作在不同的层面。这就好比一个1000开发人员的公司的CTO,如果专职写代码,这就不叫务实。
无论两人初衷和策略如何吧,反正通过GNU运动的抱团,GNU/Linux的生态链迅速壮大,让它有了争雄的底子。
【商业公司的加入】
但仅仅通过自由软件运动是不够的,这个世界都是一样的人,一个圈子有1000人,一个圈子有1000000人,然后你说第一个圈子能开发出一个比第二个圈子更好的软件,这是中二少年或者看戏闲人才有的想法。
在GNU/Linux实力大幅增强的时候,IBM从中看到了机会,当时大型机市场初现萎缩的趋势,在硬件设备的可靠性逐步提高,服务器更大规模使用后,低端的PC服务器给IBM这种传统大型服务器厂家带来很大的挑战,微软的霸主地位又吃掉了这个市场的大部分利润,所以IBM决定扶持Linux。这是Linux从2.2.x版本升级到2.4.x版本的核心动力,IBM几乎是不计成本地把他在大型服务器上得到的那些商业级的经验大量向Linux灌输,现在Linux用得到处都是的关键无锁技术RCU,就是IBM贡献的结果。这个事情当时是非常震撼的,即使IBM做得非常低调,多家Unix版权的拥有者都跳起来告IBM和Linux,说侵犯了他们的版权,跳得最欢的是SCO了,SCO和IBM扩日持久的诉讼,是那几年我们做行业跟踪的最大八卦了:)当然,今天我们都已经知道了,戏里才有奇迹,这个世界没有那么多奇迹,和蓝色巨人对抗的结果就是一个死字。这个事情终究以SCO的破产落幕了。
GNU/Linux终于凭着这个机会走到了行业的主流道路上,Linux终于成为行业的中坚力量。
一样的故事发生在Win-tel联盟的分裂,Intel也开始大幅提高对Linux设备的支持,这样一步步走来,我们就眼看着大部分外设的驱动,从仅支持Windows,跑到同时支持Windows和Linux,再到首先支持Linux,然后才支持Windows,乃至不支持Windows。这就是抱团的力量。
当然,这种情况更多发生在服务器市场,桌面市场找不到好的商业模式,这个问题则不明显。其实这个过程中,Windows做了一个非常成功的运作,他们首先和所有银行合作,解决了网银支付的问题,这种问题,没有人可以和Windows对抗(包括Mac),这一局奠定了Windows在个人用户市场的地位(我知道你们还有其他理由,比如游戏等,但这个理由才是最硬的,但无所谓啦,所有条件都只是一部分事实,我们关注的是我们整个讨论的逻辑链),直到最近几年移动互联网的兴起,才让银行支付很大程度上和Windows解绑。
【Android】
然后就是Google的Android。Android这个东西外行有很多误解,我在这里给大家一个比较简单的名称空间。Android大概可以包括5个部分,从上到下,包括这些几个:
应用:就是我们平时看到是微信啊,高德地图啊这些apk,apk可能是Google自己写的(比如Android内置的“照片”之类的),但更多是第三方写的,大量的第三方软件如何使用Android,控制了Google如何发展Android,但反过来,Google也控制了这些第三方软件的发展。
Android框架:这包括所有的提供给应用的基础设施,就相当于GNU/Linux外面包的一大堆工具,这里请大家不要和Android自身定义的Framework混淆了,Android的代码介绍中,Framework只包括Java部分,我这里不这样分,以便读者聚焦,这个部分包括一个Java虚拟机,提供给Apk的Java库(原来的Framework部分),为了让这个Java库跑得更快的C++写的其他库。这些代码的版权是Apache版权,简单说,既可以开源,也可以公开。Google的宣传中,经常说Android是Apache版权,是Google认为,这个部分才是Android,你也可以认为这是狭义的Android,而包括其他部分的是广义的Android。很大程度上Android框架其实是一个类似Windows的图形界面那样的而一个“应用”,只是这个应用很大,大到用户都直接和它接触。
HAL:硬件抽象层。不少人望文生义,以为这是“用户态驱动”,或者“驱动的抽象”。这是错误的,HAL是底层操作系统和Android框架的接口层。驱动仍是底层操作系统的事。简单说,我的Android框架需要一个照相的接口,我定义我自己怎么调你底层操作系统,操作系统上要适配出一个库来提供接口给我,这个库,就叫HAL
操作系统支持库:Bionic。操作系统内核都需要通过一种特殊的技术,称为“系统调用”去使用,但我们平时编程序都使用函数调用,这个部分提供操作系统调用的封装,这个库最基础的部分称为libc,我们平时编程中常用的如malloc啊,printf啊之类的调用,都在这里提供,GNU/Linux提供的那个libc,就叫glibc。显而易见,承载了Stallman的理想,glibc是LGPL版权的。Google不想被这个版权绑定,他们基于BSD的libc重新开发了一个libc,这个libc就叫Bionic,也是apache版权的。
操作系统内核:最后就是Linux了,Android使用Linux内核,提供驱动的支持。
所以读者可以明白,你说Android也是一个Linux,这话不对。但你说Android和Linux没有关系,这也不对。实际上,Android的框架设计上,是可以换一个操作系统(内核)的,比如你换成FreeBSD,然后修改HAL和Bionic这两层的实现,你就可以实现一个新的Android平台。但现实是这样做成本很高。因为Android用到的各个SoC厂家的驱动,包括各种屏,Modem,Wifi的驱动,都是为Linux写的,Linux代表一个合作的中心,换掉这个合作的中心,你就放弃到这一个大腿,你就需要自己维护一条更粗的大腿。
说这么多,是想让大家都明白,Linux已经超出GNU/Linux的范围,被广泛用户各种新的实践中。Linux的力量,正来自这种“众人之所欲”,大家都靠着Linux的生态圈在讨生活。
【Linux的维护模型】
如果你对http://kernel.org有所了解,你会知道Linux的维护策略有点类似我在这里谈的Android的第一把刀:如何理解Google的Android战略? - in nek 的回答。也就是“唯快不破”,Linux比Android还快得多。你可以用下面的数据体会一下:
Linux2个半月升级一次版本,每个版本大概最终修改10000个PatchSet(你可以认为是一个用户可以感知的特性),我们算每个PatchSet卷入的代码是100行,这就有100万行的“文字”要看。而且不是抒情小说的行哦,是侦探小说的行哦。每行都要动脑的哦。而我们一般工程师的开发效率是每天25-50行代码。就算不算设计和测试,纯写代码,也不过是200-400行(那些喜欢把相同逻辑拷贝100遍的垃圾工程师的输出不算,那种代码是要被Linus当众羞辱的),这样算来,即使Linus每天不眠不休看这些代码,他也看不完。
所以Linus实际有一批核心维护者,他们负责每个子系统的维护,比如网络子系统,维护者就是David S. Miller,如果你的网卡驱动需要修改,你就不用找Linus,你找Dave就好了,你把你要修改的补丁准备好,发给David,抄送给所有受影响的邮件列表和相关人员(这些东西都可以在你准备好补丁后,通过运行Linux代码中的脚本来得到),David会Review这些代码,如果他没有意见,其他人也不在这个过程中跳出来找你麻烦,他就会把你的程序合入他的分支。Linus每隔一段时间,就会告诉所有的二级维护者,告诉他们现在可以合入代码了,这些二级维护者就会准备他们给Linus的分支,让Linus一次把所有代码收进去。
Linus开始收代码的过程称为Open Windows,有两个星期,代码上去,进行简单的修整(如果不行就抛弃那个补丁,反正一定要能跑),最后就会进入RC(预发布)周期,Linus不断发布RC0, RC1这样的版本,让不同的子分支的人提意见,只要意见有道理,对应的修改就会被删除。这样经过7个星期,RC7以后,一个新的Linux内核版本就会发布。
一般来说,大部分发行版(包括如Android这样的版本)不会立即使用最新的Linux内核,因为用于商业,频繁的改动既不利于质量的可靠性,也不利于用户接口的稳定性。但大部分的发行版都会在开发新版本的时候,升级到一个较新的Linux内核的版本上。
正如我们前面说的,Linux快速的改动,是所有厂商都背离不起的,比如你是做服务器的,你只是做了硬件,最多就写一些驱动,但你是否支持用户使用Xen呢?Xen的新特性是基于最新的Linux内核写的,你不升级到最新的内核,你怎么保证用户可以用Xen呢?反过来是一样的,你是Xen的供应商,你停留在一个固定的内核版本上,但服务器的供应商都支持最新的内核,那你要支持这些新的硬件吗?这样的互相制约下,大家都要千方百计把代码放到Linux中了,Linux就成为一个标准组织了。
这就是Linux的生态,它是一个OS的中心标准,是所有主流厂商合作的平台,它已经吸够了力量,短时间内,如果技术没有巨大的变化,已经没有人可以摧毁它了。
网友评论