标签 C 下的文章

如何加入Linux内核开发社区(2)

本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本),原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第二章节的中译文。

2、内核开发过程是如何进行的

在20世纪90年代初,当时的Linux内核开发是一件非常松散的事情,涉及的用户和开发人员数量也相对较少。但随着每年数以百万计的用户和大约2000 名开发者的参与,内核制订出了许多过程来保证开发工作的顺利平滑地进行。为了成为内核开发过程的一个有效部分,扎实地了解内核开发过程是如何进行的是十分 必要的。

2.1、整体情况

内核开发者使用一种松散的基于时间的发布(release)过程,每2到3个月发布一个新内核版本。近期的发布历史记录如下:

2.6.26    7月13日,2008
2.6.25    4月16日,2008
2.6.24    1月24日,2008
2.6.23    10月9日,2007
2.6.22    7月8日,2007
2.6.21    4月25日,2007
2.6.20    2月7日,2007

每个2.6.x发布版本都是一个主要的内核发布版,其中包含了新特性、内部API变化以及其他更多内容。一个典型的2.6发布可能包括超过10000个变 更以及几十万行代码的改变。因此2.6是Linux内核开发的前沿;内核采用一种滚动开发的模型,持续不断地将重大变化整合进来。

关于每个发行版的补丁合并,大家遵循一个相对简单直接的规则。在每轮内核开发周期的开始,我们说"合并窗口"是打开的。那时,那些被认为已经足够稳定(并 且被开发社区接受)的代码会被合入主线内核。在这期间,内核将以接近每天1000个变化("补丁"或"变更")的速度将一个新开发周期的大量改变(以及所 有重大的变化)合入主线内核。

(顺便说一句,这是值得注意的是合并窗口阶段整合的变化不是凭空而来的;它们早已被收集、测试和提交到阶段树中的。这个过程是如何进行的在后续会有详细介绍)。

合并窗口持续打开约两周时间。在这段时间的末尾,Linus Torvalds会宣布合并窗口关闭并发布这一轮内核版本开发的第一个"rc"版本(译注:Release Candidate,发布候选版)。例如,对于版本号确定为2.6.26的内核来说,合并窗口关闭后发布的版本将称为2.6.26-rc1。-rc1的发 布是一个信号,预示着合并新特性的阶段已经过去了,开发工作进入了稳定内核版本的阶段。

在接下来的6到10个星期里,只有那些修正问题的补丁才应该提交到主线中。偶尔也会有某个特别重要的变化被允许提交到主线,但这种情况极其少见;那些尝试 在合并窗口之外提交新特性的开发者往往会收到一个不友好的对待。作为一般规则,如果你的特性错过了合并窗口,那你最好是等待下一个开发周期。(一个不常见 的例外是那些用于之前不支持的硬件的驱动程序;如果它们没有触及到树内代码,那么它们就不可能导致回退(regression),在任何时候添加都应该是 安全的。)

随着越来越多的修复进入主线,补丁率将随着时间的推移而下降。Linus大约每周发布一个新的-rc内核版本;在内核被认为足够稳定且最终的2.6.x版本发布之前,一个正常系列的版本号会演进到-rc6和-rc9之间。一旦版本稳定且最终内核版本发布,整个过程又将重新开始。

例如,下面是2.6.25内核开发周期的运行情况(所有日期均发生在2008年):

1月24日    2.6.24稳定版发布
2月10日    2.6.25-rc1, 合并窗口关闭
2月15日    2.6.25-rc2
2月24日    2.6.25-rc3
3月4日     2.6.25-rc4
3月9日     2.6.25-rc5
3月16日    2.6.25-rc6
3月25日    2.6.25-rc7
4月1日    2.6.25-rc8
4月11日    2.6.25-rc9
4月16日    2.6.25稳定版发布

开发人员是如何判断何时结束这一轮的开发周期并发布稳定版呢?他们采用的最重要的度量方法是上一个版本的regression列表。Bug虽然是不受欢迎 的,但那些存在于以前版本中的可导致系统崩溃的问题则被认为是更为严重的。因此,那些导致内核回退的补丁将遭受冷遇,并且非常可能在内核稳定化阶段被恢复 到原先状态。

开发者的目标是在稳定版内核发布之前修正所有已知的regressions。但在现实世界中,要想达成这种完美的目标十分困难;这种规模的项目存在太多的 变数。有某一点导致最终发布推迟就会使问题变得更加糟糕;等待下一个合并窗口的改变将会越来越多,并且会在下一个周期导致更多的regession出现。 因此,大多数2.6.x内核发布时只带有少了的已知regressions,然而,但愿这些regressions都不那么严重。

一旦稳定版内核发布,其后续的维护工作将交由"稳定版小组(stable team)"进行,目前这个小组成员包括Greg Kroah-Hartman和 Chris Wright。稳定版小组会不时地发布稳定版内核的更新版本,版本号采用2.6.x.y这种数字样式。如果想要被纳入更新版本,补丁必须(1)修正一个重 要的bug并且(2)已经被合入下一个内核开发版本的主线中了。我们还以2.6.25为例,其更新版本历史(截至本文撰写时)如下:

5月1日    2.6.25.1
5月6日    2.6.25.2
5月9日    2.6.25.3
5月15日    2.6.25.4
6月7日    2.6.25.5
6月9日    2.6.25.6
6月16日    2.6.25.7
6月21日    2.6.25.8
6月24日    2.6.25.9

一个已知内核的稳定版本的更新工作大约进行6个月左右;之后,稳定版的维护将由那些交付特定内核版本的发行商单独负责。

2.2、一个补丁的生命周期

补丁不会从开发者的键盘直接进入内核主线。相反,开发社区设计了一个稍显复杂的过程(虽然有些非正式)来保证每个补丁都能被评审以确保质量,且每个补丁都 实现了一个对内核主线有吸引力的改变。对于一些较小的修正来说,这个过程执行地很快,但对于较大的且有争议的改变来说,这个过程可能会持续数年。许多开发 人员所遭遇的挫折都是来自于缺乏对这一过程的理解或尝试绕开这一过程。

为了减少这类挫折,本文会详细说明补丁是如何进入到内核中的。接下来是一段关于这个过程的介绍,方式略有些理想化。更多详细的内容将在稍后的章节中给出。

通常一个补丁会经历如下几个阶段:

  * 设计。这里将对补丁的真正的需求以及如何满足这些需求进行设计。设计工作常常在社区之外完成,但如果可能的话,最好公开地进行这个设计工作;这可以节省大量后期重设计的时间。

  * 早期评审。补丁被发布到相关的邮件列表,列表中的开发者就此回复评论。如果一切进展顺利,这个过程应该可以找出补丁中的重大问题。

  * 更宽泛的评审。当补丁越来越接近于被主线合并时,它会被一个相关子系统的维护者接受,但这种接受并不保证这个补丁一定会进入主线。这个补丁会出现在这个维 护者的子系统树中并且进入阶段树(前面提到过)中。这个过程会为补丁带来更为广泛的评审,并发现其他人整合这个补丁后出现的任何问题。

  * 合并到主线。最终,一个成功的补丁将会被合并到由Linus Torvalds管理的主线库。这时会有更多评论以及/或问题出现;重要的是开发者应负责应对这些并修复提出的问题。

  * 稳定版发布。此时补丁潜在影响的用户数量变大了,因此,新问题可能再次出现。

  * 长期维护。虽然一个开发者可能在补丁代码合并入内核之后选择忘记代码,但这种行为将在开发社区中留下一个糟糕的印象。合并代码能消除一些维护负担,因为其 他人会修复那些因API变动引发的问题。但如果补丁代码长期内依旧有用,原开发者就应该继续对此代码负责。

一些内核开发者(或他们的雇佣者)所犯的最大的错误之一就是试图将这个过程裁剪到只剩下"合并代码到主线"这一步。这种做法必将导致每个参与到其中的开发者遭遇挫折。

2.3、补丁如何进入内核

这个世上只有一个人拥有将补丁合并入内核主线库的权限,他就是Linus Torvalds。但是,在所有进入2.6.25内核的12000个补丁中,只有250个(约2%)补丁是由Linus自己挑选的。内核经过长期发展,其 规模已经大到了没有哪个单独的开发者可以在没有辅助的情况下独立逐一检查和挑选补丁的地步了。内核开发者通过使用一个助理(lieutenant)系统来 应对内核规模的增长,这个系统建立在一个信任链上。

内核代码库被逻辑上划分为一组子系统:网络、特殊架构支持、内存管理、视频设备等。大多数子系统都有一个指定的维护者,这个开发者对这个子系统内部代码整 体负责。这些子系统为护着就是他们管理的内核部分的看门人(以一种松散的方式);通常他们就是接收即将包含到主线内核的补丁的那些人。

每个子系统维护者都维护一份自己的内核源码树,通常(但不总是)使用git源码管理工具。像git(以及类似的像quilt或mercurial)这样的 工具允许维护者跟踪一个补丁列表,包括作者信息以及其他元数据。在任何特定时间,维护者都能识别出在其库中的哪个补丁在主线库中无法找到。

当合并窗口打开,最高级的维护者将会请求Linus从他们的库中"拉(pull)"出他们精调细选的补丁。如果Linus同意,补丁会向上流入他的代码 库,成为主线内核的一部分。Linus对在"拉"操作中收到的补丁的关注度不同。显然,有时,他看起来相当关切。但通常,Linus信任那些子系统维护者 不会向上合入糟糕补丁的。

同样,子系统维护者们也可以从其他维护者那里"拉"补丁。例如,网络子系统源码树构造所基于的补丁最初就是在专注于网络设备驱动、无线网络等源码树中积累 的。这种源码库链可以任意长,但很少有超过2或3个环节的。由于链中的每个维护者都相信那些管理低级别源码树的开发者,因此这个过程也被称为"信任链"。

很显然,在这样一个系统中,欲将补丁提交到内核取决于找到正确的维护者。将补丁直接发给Linus通常不是一个正确的做法。

2.4、阶段树

子系统源码树链引导补丁流合入内核,但还有一个有趣的问题:如果某人想看看为下一个合并窗口准备的所有补丁,他应该如何做?开发者们对即将到来的其他改变 十分感兴趣,这样可以知道是否有冲突需要考虑;例如,一个改变了某内核函数原型的补丁将会与其他使用了该函数旧原型的补丁发生冲突。评审者与测试者需要在 这些改变进入主线内核之前在一个整合后的内核中使用它们。开发者可以从所有感兴趣的子系统源码树上"拉"改变,不过这可是一项不轻松且很容易出错的工作。

答案是使用阶段树(staging trees),从各个子系统树中收集补丁进行测试和评审。其中最古老的一颗阶段树由Andrew Morton维护,被称为"-mm"(用于内存管理,它就是这么开始的)。-mm树(译注:现在-mm树已不再开发和维护,替代它的是-next树)集成 的补丁来自于一个长长的子系统树列表;它还集成一些旨在帮助内核调试的补丁。

除此之外,-mm树还包含了一些重要的补丁集合,这些补丁都是由Andrew直接挑选的。这些补丁可能已经被发布在一个邮件列表中了,或者他们申请成为内 核的一部分,该部分尚没有指定的子系统树。因此,-mm扮演着一种可以最后依靠的子系统树的角色;如果一个欲入内核的补丁没有明确的路径,其很可能最终成 为-mm树的一部分。其他在-mm树中积累的杂项补丁最终要么被转发到一个合适的子系统树中,要么被直接发给Linus。在一个通常的开发周期中,约有 10%的进入到主线的补丁经过-mm树。

当前的-mm补丁在下面网站的首页总是能被找到(译注:所有内核tree在http://git.kernel.org/下面可以找到):

http://kernel.org/

那些想查看当前-mm树状态的开发者可以去获取"-mm of the moment"树,在这里可以找到(译注:网页打不开):

http://userweb.kernel.org/~akpm/mmotm/

但使用MMOTM树很可能会遭遇挫折,因为它甚至可能无法编译。

另外一个阶段树linux-next是最近才创立的,该树由Stephen Rothwell维护。linux-next树是一个快照,该快照是我们在下一个合并窗口关闭后所期望看到的主线版本的样子。当补丁收集完 毕,linux-next树会在linux-kernel和linux-next邮件列表中宣布;你可以从下面地址下载(译注:下面地址无法打开):

http://www.kernel.org/pub/linux/kernel/people/sfr/linux-next/

下面地址中搜集了一些有关linux-next树的信息:

http://linux.f-seidel.de/linux-next/pmwiki/

linux-next树如何适应内核开发过程依旧在改变。截止本文撰写时,第一个包含linux-next(2.6.26)的完整开发周期接近尾声;到目 前为止,linux-next树已经被证明是一个在合并窗口开启前用于查找和修复集成问题的很有价值的资源。关于linux-next是如何运作并建立 2.6.27合并窗口的等更多信息可参考http://lwn.net/Articles/287155/。

一些开发者开始建议linux-next应该被用作未来内核开发的目标。linux-next树不倾向于超前主线版本过多,而是更多的代表那个合并了任何 新改变的树。这种想法的不足之处在于linux-next树的反复无常会使它成为一个困难的开发目标。更多有关该主题的内容请参 见:http://lwn.net/Articles/289013/,别离开;大部分涉及linux-next的内容依旧在变化。

2.5、工具

从上面内容我们可以看出,内核开发过程严重依赖于将不同方向上补丁聚集成集合的能力。如果没有合适且功能强大的工具,整个事情将无法像现在这样顺利进行下去。至于教授大家如何使用这些工具已经超出本文所涉及的内容范畴了,不过这里仍然可以给予一些提示。

目前在内核开发社区占据主导地位的源码管理系统是git。Git是自由软件社区开发的多个分布式版本控制系统中的一个。它根据内核开发的需要进行了调优, 以至于它在处理大型源码库以及大量补丁时表现优异。它还以难学难用而闻名,不过随着时间推移,它已经变得更加易用了。某种程度上的熟悉git是对内核开发 者的一个要求;即使这些开发者在日常工作中并不使用git,他们也需要git跟上其他开发者的步伐,了解其他开发者(以及主线版本)所做的工作。

Git目前几乎包含在所有Linux发行版中。其主页在:

http://git-scm.com/

这个页面上有文档和教程页面的链接。尤其是,每个开发者都应该了解"Kernel Hacker's Guide to git",这些内容是专门针对内核开发的:

http://linux.yyz.us/git-howto.html

在不使用git的内核开发者中,最受欢迎的选择几乎肯定是Mercurial:

http://www.selenic.com/mercurial/

Mercurial具有许多与git相同的特性,不过你会发现它所提供的操作接口更加易用。

另外一个值得了解的工具是Quilt:

http://savannah.nongnu.org/projects/quilt/

Quilt是一个补丁管理系统,而不是一个源码管理系统。它不会跟踪那些随着时间推移的历史记录;相反,它以跟踪一个正在演化的代码库的一组特定改变为导 向。一些主要的子系统维护者使用quilt来管理那些即将向上合入的补丁。对于特定种类的树(例如,-mm)的管理,quilt是最佳工具。

2.6、邮件列表

大量Linux内核开发工作通过邮件列表完成。如果一个邮件列表都没有加入,很难成为一个社区的全功能(fully-functioning)成员。不过 Linux邮件列表对于开发者来说也是潜在的风险,开发者必须冒着被大量电子邮件掩埋、与Linux邮件列表使用约定相冲突的风险,或二者兼有。

大多数内核邮件列表运行在vger.kernel.org上;主邮件列表可以在下面页面找到:

http://vger.kernel.org/vger-lists.html

但在其他地方也运行着一些邮件列表,许多列表运行在lists.redhat.com上(译注:该页面已经无法打开)。

内核开发的核心邮件列表毫无疑问是linux-kernel。这个列表是一个令人生畏的地方;每天的邮件数量可达500封,充斥着各种噪音,对话里技术性 强,并且参与者不总是那么在意礼貌。不过,这世上没有其他地方是内核开发社区会作为整体一起参与的;那些拒绝加入这个列表的开发者将错过重要信息。

这里有一些提示可以帮助你在linux-kernel这个列表中生存下去:

  * 将这个列表中的mail放到一个单独的文件夹中,而不是放在你的主收件箱中。大家必须能在一段可接受的时间段里忽略掉这个邮件流。

  * 不要尝试关注每个对话–没有人这么做。对感兴趣的话题(但注意,长期进行的对话很可能偏离了原来的主题,但电子邮件的主题行却没有改变)以及参与者进行过滤很重要。

  * 不要上钩。如果有人试图挑起一次愤怒的回应,忽略它们。

  * 当回复linux-kernel列表邮件时(或在其他邮件列表),为所有参与者保留抄送列表。如果没有足够充分的理由(例如一个显式请求),你永远不应该 删除收件人。总是确保你回应的人在抄送列表中。这个约定也使得大家不再需要显式地请求在响应你的邮件中加上你的邮件地址了。

  * 在提问之前搜索邮件列表的归档(以及整个互联网)。一些开发者对那些显然没有做作业的人很不耐烦。

  * 避免上方张贴(即将你的答案放在你所回应的引用文字的上方)。因为这将使得你的回应难于阅读并且给大家留下一个糟糕的印象。

  * 在正确的邮件列表上提问。Linux-Kernel列表可能是一个一般的交汇点,但它却不是一个可以找到所有子系统开发者的最佳地方。

最后一点–找到正确的邮件列表–是一个新手开发者共同犯错的地方。在linux-kernel上咨询网络相关问题的开发者几乎肯定可以收到一 个礼貌的建议:去netdev列表提问,因为那里才是大多数网络开发者经常提问的地方。还有其他子系统列表,诸如SCSI、video4linux、 IDE、filesystem等。查找邮件列表的最好的地方是与内核代码打包在一起的MAINTAINERS文件。

2.7、开始内核开发

有关如何开始内核开发过程的问题十分常见–既有来自个体的,也有来自公司的。而同样常见的是那些导致开发者与社区的初始关系变得更加困难的失误。

公司常常指望雇佣到知名开发者以启动一个开发组。事实上,这种方法很有效。不过这样做的成本十分昂贵,并且并没有使得有经验的内核开发者池得以扩充。如果 给予一点时间上的投资,完全可能促使内部开发者加快Linux内核开发。花费这些时间能够让一个雇主拥有一批既懂内核又了解公司的开发人员,并且他们也可 以帮助训练其他开发人员。从中期效果来看,这往往是一个更加有利可图的方法。

个体开发者经常困惑于从何开始,这是可以理解的。开始一个大项目的开发可能让人感觉胆怯;人们起初常常用更小的项目试探。正因为如此,一些开发者机遇创建 一些补丁修正一些拼写错误或一些不重要的代码风格问题。不幸地是,这样的补丁制造了一些噪音,干扰了开发社区的整体开发。因此,开发者们越来越轻视这些补 丁。那些希望将自己介绍给社区的开发者们通过这种方式将无法得到他们期望的那种对待。

Andrew Morton给那些有抱负的内核开发者以下建议:

内核开发新手的第一个项目无疑应该是"确保内核可以始终在你拥有的所有机器上完美地运行"。这事通常的做法是与其他人合作解决问题(这可能需要坚持和毅力!)。不过这就挺好了– 它就是内核开发的一部分。
 
(http://lwn.net/Articles/283982/)

在缺少问题去修正的时候,一般来说我们建议开发者看看当前的regressions列表以及处于open状态的bugs。永远不会缺少待修复的问题;解决这些问题,开发者将获得有关过程方面的经验,同时,建立起同开发社区中其他开发者间的尊重。

如何加入Linux内核开发社区(1)

本文翻译自The Linux Foundation的《How to Participate in the Linux Community》(基于2012-03-21最新版本),原作者为Jonathan Corbet(corbet@lwn.net)。下面是该文章第一章节的中译文。

1、内核开发过程指南

本文旨在帮助那些在参与开发社区(community)工作过程中遭遇些许挫折的开发人员(以及他们的管理者)。对于那些不是十分熟悉Linux 内核开发(或通常所说的自由软件开发)的开发人员,本文将以一种易于理解的方式记录社区是如何进行开发工作的。虽然这里会提及一些技术资料,但更 多是面向过程的讨论,这些内容不需要你对内核编程有较深入的了解。

1.1、内容大纲

本文后面章节的内容涵盖了内核开发过程以及开发人员及其雇佣者所遇到的各种挫折。本文还列举了诸多内核代码应该被合并(merge)到官方内核 (主线,mainline)的原因,包括对用户自动可用(automatic availability to users)、社区提供各种形式的支持以及对内核开发演进方向的影响力等。被Linux内核采纳的代码必须使用GPL兼容许可证进行授权。

章节2介绍了Linux内核的开发过程,内核发布的周期以及合并窗口(merge window)机制。该章节还涵盖了补丁开发、评审以及合并周期等各种不同阶段。关于一些工具和邮件列表的讨论也包含在该章节中。我们鼓励那些想要开始内 核开发的开发者们去跟踪和修正bug,并以此作为最初阶段的练习。

章节3涵盖了早期阶段的项目规划(early-stage project planning),并重点强调了开发社区的尽早参与。

章节4中的内容是有关编码过程的;该章节讨论了其他开发人员在开发过程中所遇到的一些陷阱;涵盖了一些对补丁的要求;并介绍了一些用于帮助保证内 核补丁正确性的工具。

章节5谈到了发布补丁评审的过程。为了能让开发社区认真对待发布(post)的补丁,开发者必须对补丁内容进行适当的格式化和描述,并且开发者必 须将补丁发到合适的地方。遵循本章节中的建议可以最大化地提高你的补丁被开发社区接受的可能性。

章节6涵盖了发布补丁后要做的事情;发布补丁那刻离最终完成还差得很远。与评审者的合作是开发过程中的关键环节;这节提供了许多有关如何在这一重 要阶段避免问题的小建议。这里告诫开发者不要想当然的认为当补丁被合并到主线后工作就完成了。

章节7介绍了一些"高级"主题:使用git管理补丁以及评审其他开发人员发布的补丁。

章节8以更多的有关内核开发的信息来源作为结束此文。

1.2、这篇文档是关于什么的

Linux内核是现有最大的并且是最活跃的自由软件项目之一,它拥有600多万行代码以及超过1000名积极贡献者。自从1991年问世以 来,Linux内核已经逐渐演化成一种最佳的操作系统组件,在袖珍数字音乐播放器、桌面个人计算机、现有的超级计算机以及介于个人计算机与超级计 算机之间的所有类型系统上都有Linux内核在运行。它是一种几乎适合所有情况的稳定的、高效的和可伸缩的解决方案。

伴随着Linux内核的发展,希望参与内核开发的开发人员和公司的数量也迎来了一个较大的增长。硬件制造商想要确保Linux可以良好地支持他们 的产品,使得这些产品对Linux用户具有吸引力。那些将Linux作为一个组件集成到它们产品中的嵌入式系统供应商想要Linux能够尽可能地 满足和适合接下来的任务。而产品基于Linux的Linux发行版供应商以及其他软件供应商更是对Linux内核的能力、性能以及可靠性有着明确 的兴趣。最终用户也常常希望通过改变Linux来使得Linux更好地满足他们的需要。

Linux的一个最引入注目的特点就是它对开发者的平易近人;任何具备所需必要的技能的开发者都可以对Linux进行改进,影响Linux的发展 方向。专利产品无法提供这种开放性,这是自由软件开发过程的一个特质。但是,更可能的是,内核要比其他绝大多数自由软件项目更加开放。一个典型的 三个月内核开发周期可能涉及超过来自100多个不同公司的1000多名开发者(或没有受雇佣于任何公司)的开发工作。

在内核开发社区中工作不是特别难。不过,尽管这样,许多潜在的贡献者在尝试进行内核开发工作时都遇到过困难。内核开发社区逐步形成了自己与众不同 的运营方式,这种方式使得Linux内核在每天成千上万行代码被改变的情况下依旧运行顺畅(并且生产出高质量的产品)。因此Linux内核的开发 过程与专利产品的开发方法有着较大区别也就不足为奇了。

对新开发者来说,内核的开发过程可能看上去有些奇怪和咄咄逼人,但是其背后却有着充分的理由和丰富的经验作为支撑。那些不理解内核开发社区工作方 式(或者,更糟糕的是试图无视或规避)的开发者必将经历挫折。内核开发社区会帮助那些主动尝试学习内核开发过程的开发者们,而对那些不听从或不在 乎开发过程的开发者,开发社区的耐心也是有限的。

希望那些读过此篇文章的开发者们都能避免这样的挫折经历。这里虽然有大量资料需要阅读,但用不了多长时间阅读这些资料所付出的努力就会获得回报。 开发社区总是需要那些愿意帮助内核改善的开发者;接下来的内容应该可以帮助你 — 或者那些为你工作的开发者 — 加入到我们的社区。

1.3、贡献

本文由Jonathan Corbet,corbet@lwn.net撰写,并根据James Berry、Alex Chiang、Roland Dreier、Randy Dunlap、Jake Edge、Jiri Kosina、Matt Mackall、Amanda McPherson、Andrew Morton和Jochen VoB等人的评论作了改进。

Linux基金会(Linux Foundation)对这篇文章的撰写提供了支持;特别感谢Amanda McPherson,是她看到了这份努力的价值,并努力使之成为现实。

1.4、将代码合入主线的重要性

一些公司和开发者偶尔也想知道为何他们要这么麻烦地去学习如何参与内核开发社区的工作,并且要将代码合并到主线版本内核(主线版本内核由 Linus Torvalds负责维护,并且被Linux发行商作为基础版本使用)中去。就短期来讲,贡献代码可能看似是一种可避免的开销;并且独立保留代码并直接对 用户提供支持看起来也更加容易。但事情的真相是独立保留代码(树外,out of tree)是一种虚假经济(false economy)。

下面列举一些内核开发过程方面相关的内容,以此说明一下维护离树代码所要付出的代价,其中大部分将在本文后面有更详细的讨论。考虑:

  * 合并到主线内核的代码对所有Linux用户可用。它将自动出现在所有使能它(enable it)的发行版中。你无需考虑驱动盘、下载或支持不同发行版的多个版本的麻烦事;这对于开发者和最终用户而言都是奏效的。代码合入主线版本解决了大量发行 版以及支持的问题。

  * 尽管内核开发者们努力维护一个稳定的对用户空间的接口,但内部的内核API却是不断变化的。内部接口的不稳定性其实是一种蓄意的设计决策;它允许开发者们 随时做出根本性的改进,而这样做的结果将是获得更高质量的代码。不过这样的策略导致的一个结果就是任何离树代码要想和新内核一起工作就必须要有持 续的维护。维护离树代码就需要大量的工作,而这些工作仅仅是为了能让代码正常工作。

    相反,主线中的代码则不需要开发人员去修正那些因API变化而被破坏的代码。因此合并到主线的代码具有更低的维护成本。

  * 除此之外,内核中的代码经常被其他开发人员改进。授权你的用户社区与客户去改进你的产品常常能带来令人惊讶的结果。

  *  内核代码在合入主线前后都要经过评审。无论原开发者的技术水准有多么高超,评审过程总是能找到改进代码的方法。评审过程常常会发现严重bug以及安全问 题。这些结论对那些在封闭环境下开发出来的代码同样是成立的;这样的代码得益于外部开发者们的评审。而未经外部开发者评审的离树代码则是低质量的 代码。

  * 参与内核开发过程是你影响内核开发方向的一种方式。虽然旁观者的抱怨也会被倾听,但积极的开发者发出的声音显然更强健有力-并且他们具备实现这些改变以让 内核更好地满足他们需要的能力。

  * 当你的代码单独维护时,就存在这种可能性:第三方会贡献类似特性的一个不同的实现。一旦出现这种情况,再将你的代码合并到主线将变得更加困难 – 甚至是不可能。那样你就将面临不愉快的选择,(1)要么长期离树维护一个非标准特性,(2)要么放弃你的代码,让你的用户迁移到主线版本。

  * 贡献代码是整个保证开发过程正常运转的基本行为。通过贡献你的代码,你可以为内核添加新功能,提供能力以及那些对其他内核开发者有用的例子。如果你曾为 Linux开发过代码(或正在考虑这么做),你肯定对这个平台的持续成功十分感兴趣;而贡献代码就是帮助Linux成功的一种最佳方式。

上面的所有论证适用于任何离树内核代码,包括那些专有的或仅以二进制形式提供的代码。不过,在考虑发行任何仅二进制形式(binary- only)内核代码之前,你应该考虑下面一些额外因素:

  * 关于发行专有内核模块的法律条款充其量是模糊不清的;相当多的内核版权持有者认为绝大多数仅二进制模块是内核的衍生产品(derived product),因此他们的发行版违背了GNU通用公共许可证(GNU General Public License,下面还有更多关于这个许可证的说明)。笔者不是律师,本文中的内容千万不能被视为法律建议。闭源(closed-source)模块真正 的法律地位只能由法院判决决定。但无论如何困扰这些模块的不确定性是存在的。

  * 二进制模块增加了调试内核问题的难度,甚至于大多内核开发人员都不愿尝试。因此仅二进制模块的发行将增加你的用户获得社区支持的难度。

  * 对于仅二进制模块的发行者而言,支持也是更为困难的,他们必须为每个他们想要支持的发行版以及内核版本提供一个模块版本。一个模块需要几十个构建才能全面 覆盖到所有发行版和不同版本的内核,并且你的最终用户每次升级内核后都需要单独升级你的这个模块。

  * 上面所说的有关代码评审的内容对闭源代码而言更加适用。但由于代码不公开,无法被社区评审,因此毫无疑问将有严重问题。

嵌入式系统制造商特别可能被怂恿而忽视本节前面所说的那些内容,因为他们相信他们交付的是一个完备的产品,产品使用的是一个冻结了的内核版本,发 布后不需要再进行更多的开发了。这种说法忽略了被广受赞同的代码评审的价值以及允许最终用户向你的产品中添加能力的价值。但是这些产品的商业生命 周期也都有限,之后必须发布产品的新版本。在这一点上,代码在主线上且维护良好的制造商将占据更好的位置,并且可以更快地推出满足市场的新产品。

1.5、许可证

代码在若干许可证的授权下被贡献到Linux内核中,但所有代码必须与作为Linux内核整体许可证的GNU通用公共许可证版本2(GPLv2) 兼容。实际上,这意味着所有贡献的代码要么遵照GPLv2许可证(可选的,语言允许在更高版本的GPL许可证下发布),要么遵照三句版BSD许可 证。任何不遵照兼容许可证的贡献代码将不能被内核所接受。

对于贡献到内核中的代码,是不需要进行版权转让的。所有合入主线内核的代码保留其最初的所有权;因此内核目前已经有成千上万个所有者了。

这种所有权结构的一个含义是任何修改内核许可证的尝试是几乎注定会失败的。几乎没有什么实际情况可以得到所有版权所有者的同意(或者将他们的代码 从内核中移除)。因此,在可见的未来,看不到将许可证迁移到GPL版本3的希望。

所有贡献到内核的代码必须是正当的自由软件。因此,来自匿名(或笔名)的贡献者的代码将不会被接受。所有贡献者都被要求在他们的代码上"签别", 声明代码可与内核一起在GPL许可证下发行。那些没有被其原作者授权为自由软件的代码或存在版权相关问题风险的代码(例如那些从通过反向工程努力 获得的缺少适当保障的代码)将不能被贡献到内核中。

在Linux开发邮件列表中经常看到有关版权事宜相关的问题。这些问题一般不会缺少回答,但大家应该牢记回答这些问题的人不是律师,不能提供法律 建议。如果你有任何与Linux源代码相关的法律问题,你唯一的选择是与熟知这一领域的律师谈谈。依赖从技术邮件列表中获得的答案是一个危险的事情。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats