162306a36Sopenharmony_ci.. include:: ../disclaimer-zh_CN.rst
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci:Original: :ref:`Documentation/process/2.Process.rst <development_process>`
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci:Translator:
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci 时奎亮 Alex Shi <alex.shi@linux.alibaba.com>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci:校译:
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci 吴想成 Wu XiangCheng <bobwxc@email.cn>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci.. _cn_development_process:
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci开发流程如何进行
1662306a36Sopenharmony_ci================
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci90年代早期的Linux内核开发是一件相当松散的事情,涉及的用户和开发人员相对较少。
1962306a36Sopenharmony_ci由于拥有数以百万计的用户群,且每年有大约2000名开发人员参与进来,内核因此必须
2062306a36Sopenharmony_ci发展出许多既定流程来保证开发的顺利进行。要参与到流程中来,需要对此流程的进行
2162306a36Sopenharmony_ci方式有一个扎实的理解。
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci总览
2462306a36Sopenharmony_ci----
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci内核开发人员使用一个松散的基于时间的发布过程,每两到三个月发布一次新的主要
2762306a36Sopenharmony_ci内核版本。最近的发布历史记录如下:
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	======  =================
3062306a36Sopenharmony_ci	5.0	2019年3月3日
3162306a36Sopenharmony_ci	5.1	2019年5月5日
3262306a36Sopenharmony_ci	5.2	2019年7月7日
3362306a36Sopenharmony_ci	5.3	2019年9月15日
3462306a36Sopenharmony_ci	5.4	2019年11月24日
3562306a36Sopenharmony_ci	5.5	2020年1月6日
3662306a36Sopenharmony_ci	======  =================
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci每个5.x版本都是一个主要的内核版本,具有新特性、内部API更改等等。一个典型的5.x
3962306a36Sopenharmony_ci版本包含大约13000个变更集,变更了几十万行代码。因此,5.x是Linux内核开发的前
4062306a36Sopenharmony_ci沿;内核使用滚动开发模型,不断集成重大变化。
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci对于每个版本的补丁合并,遵循一个相对简单的规则。在每个开发周期的开头,“合并
4362306a36Sopenharmony_ci窗口”被打开。这时,被认为足够稳定(并且被开发社区接受)的代码被合并到主线内
4462306a36Sopenharmony_ci核中。在这段时间内,新开发周期的大部分变更(以及所有主要变更)将以接近每天
4562306a36Sopenharmony_ci1000次变更(“补丁”或“变更集”)的速度合并。
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci(顺便说一句,值得注意的是,合并窗口期间集成的更改并不是凭空产生的;它们是经
4862306a36Sopenharmony_ci提前收集、测试和分级的。稍后将详细描述该过程的工作方式。)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci合并窗口持续大约两周。在这段时间结束时,Linus Torvalds将声明窗口已关闭,并
5162306a36Sopenharmony_ci释放第一个“rc”内核。例如,对于目标为5.6的内核,在合并窗口结束时发生的释放
5262306a36Sopenharmony_ci将被称为5.6-rc1。-rc1 版本是一个信号,表示合并新特性的时间已经过去,稳定下一
5362306a36Sopenharmony_ci个内核的时间已经到来。
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci在接下来的6到10周内,只有修复问题的补丁才应该提交给主线。有时会允许更大的
5662306a36Sopenharmony_ci更改,但这种情况很少发生;试图在合并窗口外合并新功能的开发人员往往受不到
5762306a36Sopenharmony_ci友好的接待。一般来说,如果您错过了给定特性的合并窗口,最好的做法是等待下一
5862306a36Sopenharmony_ci个开发周期。(偶尔会对未支持硬件的驱动程序进行例外;如果它们不改变已有代码,
5962306a36Sopenharmony_ci则不会导致回归,应该可以随时被安全地加入)。
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci随着修复程序进入主线,补丁速度将随着时间的推移而变慢。Linus大约每周发布一次
6262306a36Sopenharmony_ci新的-rc内核;在内核被认为足够稳定并最终发布前,一般会达到-rc6到-rc9之间。
6362306a36Sopenharmony_ci然后,整个过程又重新开始了。
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci例如,这里是5.4的开发周期进行情况(2019年):
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	==============  ==============================
6862306a36Sopenharmony_ci	九月 15         5.3 稳定版发布
6962306a36Sopenharmony_ci	九月 30         5.4-rc1 合并窗口关闭
7062306a36Sopenharmony_ci	十月 6          5.4-rc2
7162306a36Sopenharmony_ci	十月 13         5.4-rc3
7262306a36Sopenharmony_ci	十月 20         5.4-rc4
7362306a36Sopenharmony_ci	十月 27         5.4-rc5
7462306a36Sopenharmony_ci	十一月 3        5.4-rc6
7562306a36Sopenharmony_ci	十一月 10       5.4-rc7
7662306a36Sopenharmony_ci	十一月 17       5.4-rc8
7762306a36Sopenharmony_ci	十一月 24       5.4 稳定版发布
7862306a36Sopenharmony_ci	==============  ==============================
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci开发人员如何决定何时结束开发周期并创建稳定版本?最重要的指标是以前版本的
8162306a36Sopenharmony_ci回归列表。不欢迎出现任何错误,但是那些破坏了以前能工作的系统的错误被认为是
8262306a36Sopenharmony_ci特别严重的。因此,导致回归的补丁是不受欢迎的,很可能在稳定期内删除。
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci开发人员的目标是在稳定发布之前修复所有已知的回归。在现实世界中,这种完美是
8562306a36Sopenharmony_ci很难实现的;在这种规模的项目中,变数太多了。需要说明的是,延迟最终版本只会
8662306a36Sopenharmony_ci使问题变得更糟;等待下一个合并窗口的更改将变多,导致下次出现更多的回归错误。
8762306a36Sopenharmony_ci因此,大多数5.x内核都有一些已知的回归错误,不过,希望没有一个是严重的。
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci一旦一个稳定的版本发布,它的持续维护工作就被移交给“稳定团队”,目前由
9062306a36Sopenharmony_ciGreg Kroah-Hartman领导。稳定团队将使用5.x.y编号方案不定期地发布稳定版本的
9162306a36Sopenharmony_ci更新。要合入更新版本,补丁必须(1)修复一个重要的缺陷,且(2)已经合并到
9262306a36Sopenharmony_ci下一个开发版本主线中。内核通常会在其初始版本后的一个以上的开发周期内收到
9362306a36Sopenharmony_ci稳定版更新。例如,5.2内核的历史如下(2019年):
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	==============  ===============================
9662306a36Sopenharmony_ci        七月 7 	        5.2 稳定版发布
9762306a36Sopenharmony_ci	七月 13	        5.2.1
9862306a36Sopenharmony_ci	七月 21	        5.2.2
9962306a36Sopenharmony_ci	七月 26	        5.2.3
10062306a36Sopenharmony_ci	七月 28	        5.2.4
10162306a36Sopenharmony_ci	七月 31	        5.2.5
10262306a36Sopenharmony_ci	...	        ...
10362306a36Sopenharmony_ci	十月 11         5.2.21
10462306a36Sopenharmony_ci	==============  ===============================
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci5.2.21是5.2版本的最终稳定更新。
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci有些内核被指定为“长期”内核;它们将得到更长时间的支持。在本文中,当前的长期
10962306a36Sopenharmony_ci内核及其维护者是:
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	======  ================================	================
11262306a36Sopenharmony_ci	3.16	Ben Hutchings				(长期稳定内核)
11362306a36Sopenharmony_ci	4.4	Greg Kroah-Hartman & Sasha Levin	(长期稳定内核)
11462306a36Sopenharmony_ci	4.9	Greg Kroah-Hartman & Sasha Levin
11562306a36Sopenharmony_ci	4.14	Greg Kroah-Hartman & Sasha Levin
11662306a36Sopenharmony_ci	4.19	Greg Kroah-Hartman & Sasha Levin
11762306a36Sopenharmony_ci	5.4	Greg Kroah-Hartman & Sasha Levin
11862306a36Sopenharmony_ci	======  ================================	================
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci长期支持内核的选择纯粹是维护人员是否有需求和时间来维护该版本的问题。
12162306a36Sopenharmony_ci目前还没有为即将发布的任何特定版本提供长期支持的已知计划。
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci补丁的生命周期
12462306a36Sopenharmony_ci--------------
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci补丁不会直接从开发人员的键盘进入主线内核。相反,有一个稍微复杂(如果有些非
12762306a36Sopenharmony_ci正式)的过程,旨在确保对每个补丁进行质量审查,并确保每个补丁实现了一个在主线
12862306a36Sopenharmony_ci中需要的更改。对于小的修复,这个过程可能会很快完成,,而对于较大或有争议的
12962306a36Sopenharmony_ci变更,可能会持续数年。许多开发人员的沮丧来自于对这个过程缺乏理解或者试图绕过它。
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci为了减少这种挫败,本文将描述补丁如何进入内核。下面的介绍以一种较为理想化的
13262306a36Sopenharmony_ci方式描述了这个过程。更详细的过程将在后面的章节中介绍。
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci补丁通常要经历以下阶段:
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci- 设计。这就是补丁的真正需求——以及满足这些需求的方式——所在。设计工作通常
13762306a36Sopenharmony_ci  是在不涉及社区的情况下完成的,但是如果可能的话,最好是在公开的情况下完成
13862306a36Sopenharmony_ci  这项工作;这样可以节省很多稍后再重新设计的时间。
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci- 早期评审。补丁被发布到相关的邮件列表中,列表中的开发人员会回复他们可能有
14162306a36Sopenharmony_ci  的任何评论。如果一切顺利的话,这个过程应该会发现补丁的任何主要问题。
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci- 更广泛的评审。当补丁接近准备好纳入主线时,它应该被相关的子系统维护人员
14462306a36Sopenharmony_ci  接受——尽管这种接受并不能保证补丁会一直延伸到主线。补丁将出现在维护人员的
14562306a36Sopenharmony_ci  子系统树中,并进入 -next 树(如下所述)。当流程进行时,此步骤将会对补丁
14662306a36Sopenharmony_ci  进行更广泛的审查,并发现由于将此补丁与其他人所做的工作合并而导致的任何
14762306a36Sopenharmony_ci  问题。
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci- 请注意,大多数维护人员也有日常工作,因此合并补丁可能不是他们的最优先工作。
15062306a36Sopenharmony_ci  如果您的补丁得到了需要更改的反馈,那么您应该进行这些更改,或者解释为何
15162306a36Sopenharmony_ci  不应该进行这些更改。如果您的补丁没有评审意见,也没有被其相应的子系统或
15262306a36Sopenharmony_ci  驱动程序维护者接受,那么您应该坚持不懈地将补丁更新到当前内核使其可被正常
15362306a36Sopenharmony_ci  应用,并不断地发送它以供审查和合并。
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci- 合并到主线。最终,一个成功的补丁将被合并到由LinusTorvalds管理的主线存储库
15662306a36Sopenharmony_ci  中。此时可能会出现更多的评论和/或问题;对开发人员来说应对这些问题并解决
15762306a36Sopenharmony_ci  出现的任何问题仍很重要。
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci- 稳定版发布。大量用户可能受此补丁影响,因此可能再次出现新的问题。
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci- 长期维护。虽然开发人员在合并代码后可能会忘记代码,但这种行为往往会给开发
16262306a36Sopenharmony_ci  社区留下不良印象。合并代码消除了一些维护负担,因为其他人将修复由API更改
16362306a36Sopenharmony_ci  引起的问题。但是,如果代码要长期保持可用,原始开发人员应该继续为代码负责。
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci内核开发人员(或他们的雇主)犯的最大错误之一是试图将流程简化为一个“合并到
16662306a36Sopenharmony_ci主线”步骤。这种方法总是会让所有相关人员感到沮丧。
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci补丁如何进入内核
16962306a36Sopenharmony_ci----------------
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci只有一个人可以将补丁合并到主线内核存储库中:Linus Torvalds。但是,在进入
17262306a36Sopenharmony_ci2.6.38内核的9500多个补丁中,只有112个(大约1.3%)是由Linus自己直接选择的。
17362306a36Sopenharmony_ci内核项目已经发展到一个没有一个开发人员可以在没有支持的情况下检查和选择每个
17462306a36Sopenharmony_ci补丁的规模。内核开发人员处理这种增长的方式是使用围绕信任链构建的助理系统。
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci内核代码库在逻辑上被分解为一组子系统:网络、特定体系结构支持、内存管理、视
17762306a36Sopenharmony_ci频设备等。大多数子系统都有一个指定的维护人员,其总体负责该子系统中的代码。
17862306a36Sopenharmony_ci这些子系统维护者(松散地)是他们所管理的内核部分的“守门员”;他们(通常)
17962306a36Sopenharmony_ci会接受一个补丁以包含到主线内核中。
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci子系统维护人员每个人都管理着自己版本的内核源代码树,通常(并非总是)使用Git。
18262306a36Sopenharmony_ciGit等工具(以及Quilt或Mercurial等相关工具)允许维护人员跟踪补丁列表,包括作者
18362306a36Sopenharmony_ci信息和其他元数据。在任何给定的时间,维护人员都可以确定他或她的存储库中的哪
18462306a36Sopenharmony_ci些补丁在主线中找不到。
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci当合并窗口打开时,顶级维护人员将要求Linus从存储库中“拉出”他们为合并选择
18762306a36Sopenharmony_ci的补丁。如果Linus同意,补丁流将流向他的存储库,成为主线内核的一部分。
18862306a36Sopenharmony_ciLinus对拉取中接收到的特定补丁的关注程度各不相同。很明显,有时他看起来很
18962306a36Sopenharmony_ci关注。但是一般来说,Linus相信子系统维护人员不会向上游发送坏补丁。
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci子系统维护人员反过来也可以从其他维护人员那里获取补丁。例如,网络树是由首先
19262306a36Sopenharmony_ci在专用于网络设备驱动程序、无线网络等的树中积累的补丁构建的。此存储链可以
19362306a36Sopenharmony_ci任意长,但很少超过两个或三个链接。由于链中的每个维护者都信任那些管理较低
19462306a36Sopenharmony_ci级别树的维护者,所以这个过程称为“信任链”。
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci显然,在这样的系统中,获取内核补丁取决于找到正确的维护者。直接向Linus发送
19762306a36Sopenharmony_ci补丁通常不是正确的方法。
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ciNext 树
20062306a36Sopenharmony_ci-------
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci子系统树链引导补丁流到内核,但它也提出了一个有趣的问题:如果有人想查看为
20362306a36Sopenharmony_ci下一个合并窗口准备的所有补丁怎么办?开发人员将感兴趣的是,还有什么其他的
20462306a36Sopenharmony_ci更改有待解决,以了解是否存在需要担心的冲突;例如,更改核心内核函数原型的
20562306a36Sopenharmony_ci修补程序将与使用该函数旧形式的任何其他修补程序冲突。审查人员和测试人员希望
20662306a36Sopenharmony_ci在所有这些变更到达主线内核之前,能够访问它们的集成形式的变更。您可以从所有
20762306a36Sopenharmony_ci相关的子系统树中提取更改,但这将是一项复杂且容易出错的工作。
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci解决方案以-next树的形式出现,在这里子系统树被收集以供测试和审查。这些树中
21062306a36Sopenharmony_ci由Andrew Morton维护的较老的一个,被称为“-mm”(用于内存管理,创建时为此)。
21162306a36Sopenharmony_ci-mm 树集成了一长串子系统树中的补丁;它还包含一些旨在帮助调试的补丁。
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci除此之外,-mm 还包含大量由Andrew直接选择的补丁。这些补丁可能已经发布在邮件
21462306a36Sopenharmony_ci列表上,或者它们可能应用于内核中未指定子系统树的部分。同时,-mm 作为最后
21562306a36Sopenharmony_ci手段的子系统树;如果没有其他明显的路径可以让补丁进入主线,那么它很可能最
21662306a36Sopenharmony_ci终选择-mm 树。累积在-mm 中的各种补丁最终将被转发到适当的子系统树,或者直接
21762306a36Sopenharmony_ci发送到Linus。在典型的开发周期中,大约5-10%的补丁通过-mm 进入主线。
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci当前-mm 补丁可在“mmotm”(-mm of the moment)目录中找到:
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci        https://www.ozlabs.org/~akpm/mmotm/
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci然而,使用MMOTM树可能会十分令人头疼;它甚至可能无法编译。
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci下一个周期补丁合并的主要树是linux-next,由Stephen Rothwell 维护。根据设计
22662306a36Sopenharmony_cilinux-next 是下一个合并窗口关闭后主线的快照。linux-next树在Linux-kernel 和
22762306a36Sopenharmony_ciLinux-next 邮件列表中发布,可从以下位置下载:
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci        https://www.kernel.org/pub/linux/kernel/next/
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ciLinux-next 已经成为内核开发过程中不可或缺的一部分;在一个给定的合并窗口中合并
23262306a36Sopenharmony_ci的所有补丁都应该在合并窗口打开之前的一段时间内找到进入Linux-next 的方法。
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ciStaging 树
23562306a36Sopenharmony_ci----------
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci内核源代码树包含drivers/staging/目录,其中有许多驱动程序或文件系统的子目录
23862306a36Sopenharmony_ci正在被添加到内核树中。它们在仍然需要更多的修正的时候可以保留在driver/staging/
23962306a36Sopenharmony_ci目录中;一旦完成,就可以将它们移到内核中。这是一种跟踪不符合Linux内核编码或
24062306a36Sopenharmony_ci质量标准的驱动程序的方法,人们可能希望使用它们并跟踪开发。
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ciGreg Kroah Hartman 目前负责维护staging 树。仍需要修正的驱动程序将发送给他,
24362306a36Sopenharmony_ci每个驱动程序在drivers/staging/中都有自己的子目录。除了驱动程序源文件之外,
24462306a36Sopenharmony_ci目录中还应该有一个TODO文件。TODO文件列出了驱动程序需要接受的暂停的工作,
24562306a36Sopenharmony_ci以及驱动程序的任何补丁都应该抄送的人员列表。当前的规则要求,staging的驱动
24662306a36Sopenharmony_ci程序必须至少正确编译。
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ciStaging 是一种让新的驱动程序进入主线的相对容易的方法,它们会幸运地引起其他
24962306a36Sopenharmony_ci开发人员的注意,并迅速改进。然而,进入staging并不是故事的结尾;staging中
25062306a36Sopenharmony_ci没有看到常规进展的代码最终将被删除。经销商也倾向于相对不愿意使用staging驱动
25162306a36Sopenharmony_ci程序。因此,在成为一个合适的主线驱动的路上,staging 仅是一个中转站。
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci工具
25462306a36Sopenharmony_ci----
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci从上面的文本可以看出,内核开发过程在很大程度上依赖于在不同方向上聚集补丁的
25762306a36Sopenharmony_ci能力。如果没有适当强大的工具,整个系统将无法在任何地方正常工作。关于如何使用
25862306a36Sopenharmony_ci这些工具的教程远远超出了本文档的范围,但还是用一点篇幅介绍一些关键点。
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci到目前为止,内核社区使用的主要源代码管理系统是git。Git是在自由软件社区中开发
26162306a36Sopenharmony_ci的许多分布式版本控制系统之一。它非常适合内核开发,因为它在处理大型存储库和
26262306a36Sopenharmony_ci大量补丁时性能非常好。它也以难以学习和使用而著称,尽管随着时间的推移它变得
26362306a36Sopenharmony_ci更好了。对于内核开发人员来说,对Git的某种熟悉几乎是一种要求;即使他们不将它
26462306a36Sopenharmony_ci用于自己的工作,他们也需要Git来跟上其他开发人员(以及主线)正在做的事情。
26562306a36Sopenharmony_ci
26662306a36Sopenharmony_ci现在几乎所有的Linux发行版都打包了Git。Git主页位于:
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci        https://git-scm.com/
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ci此页面包含了文档和教程的链接。
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci在不使用git的内核开发人员中,最流行的选择几乎肯定是Mercurial:
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci        http://www.seleric.com/mercurial/
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ciMercurial与Git共享许多特性,但它提供了一个界面,许多人觉得它更易于使用。
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci另一个值得了解的工具是Quilt:
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci        https://savannah.nongnu.org/projects/quilt
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ciQuilt 是一个补丁管理系统,而不是源代码管理系统。它不会随着时间的推移跟踪历史;
28362306a36Sopenharmony_ci相反,它面向根据不断发展的代码库跟踪一组特定的更改。一些主要的子系统维护人员
28462306a36Sopenharmony_ci使用Quilt来管理打算向上游移动的补丁。对于某些树的管理(例如-mm),quilt 是
28562306a36Sopenharmony_ci最好的工具。
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_ci邮件列表
28862306a36Sopenharmony_ci--------
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci大量的Linux内核开发工作是通过邮件列表完成的。如果不加入至少一个某个列表,
29162306a36Sopenharmony_ci就很难成为社区中的一个“全功能”成员。但是,Linux邮件列表对开发人员来说也是
29262306a36Sopenharmony_ci一个潜在的危险,他们可能会被一堆电子邮件淹没、违反Linux列表上使用的约定,
29362306a36Sopenharmony_ci或者两者兼而有之。
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci大多数内核邮件列表都在vger.kernel.org上运行;主列表位于:
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci        http://vger.kernel.org/vger-lists.html
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci不过,也有一些列表托管在别处;其中一些列表位于
30062306a36Sopenharmony_ciredhat.com/mailman/listinfo30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci当然,内核开发的核心邮件列表是linux-kernel。这个列表是一个令人生畏的地方:
30362306a36Sopenharmony_ci每天的信息量可以达到500条,噪音很高,谈话技术性很强,且参与者并不总是表现出
30462306a36Sopenharmony_ci高度的礼貌。但是,没有其他地方可以让内核开发社区作为一个整体聚集在一起;
30562306a36Sopenharmony_ci不使用此列表的开发人员将错过重要信息。
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci以下一些提示可以帮助在linux-kernel生存:
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci- 将邮件转移到单独的文件夹,而不是主邮箱文件夹。我们必须能够持续地忽略洪流。
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci- 不要试图跟上每一次谈话——没人会这样。重要的是要筛选感兴趣的主题(但请注意
31262306a36Sopenharmony_ci  长时间的对话可能会偏离原来的主题,尽管未改变电子邮件的主题)和参与的人。
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci- 不要回复挑事的人。如果有人试图激起愤怒,请忽略他们。
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci- 当回复Linux内核电子邮件(或其他列表上的电子邮件)时,请为所有相关人员保留
31762306a36Sopenharmony_ci  Cc: 抄送头。如果没有确实的理由(如明确的请求),则不应删除收件人。一定要
31862306a36Sopenharmony_ci  确保你要回复的人在抄送列表中。这个惯例也使你不必在回复邮件时明确要求被抄送。
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci- 在提出问题之前,搜索列表存档(和整个网络)。有些开发人员可能会对那些显然
32162306a36Sopenharmony_ci  没有完成家庭作业的人感到不耐烦。
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci- 避免顶部回复(把你的答案放在你要回复的引文上面的做法)。这会让你的回答更难
32462306a36Sopenharmony_ci  理解,印象也很差。
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci- 在正确的邮件列表发问。linux-kernel 可能是通用的讨论场所,但它不是寻找所有
32762306a36Sopenharmony_ci  子系统开发人员的最佳场所。
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci最后一点——找到正确的邮件列表——是开发人员常出错的地方。在linux-kernel上
33062306a36Sopenharmony_ci提出与网络相关的问题的人几乎肯定会收到一个礼貌的建议,转到netdev列表上提出,
33162306a36Sopenharmony_ci因为这是大多数网络开发人员经常出现的列表。还有其他列表可用于scsi、video4linux、
33262306a36Sopenharmony_ciide、filesystem等子系统。查找邮件列表的最佳位置是与内核源代码一起打包的
33362306a36Sopenharmony_ciMAINTAINERS文件。
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci开始内核开发
33662306a36Sopenharmony_ci------------
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci关于如何开始内核开发过程的问题很常见——个人和公司皆然。同样常见的是失误,这
33962306a36Sopenharmony_ci使得关系的开始比本应的更困难。
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci公司通常希望聘请知名的开发人员来启动开发团队。实际上,这是一种有效的技术。
34262306a36Sopenharmony_ci但它也往往是昂贵的,而且对增加有经验的内核开发人员的数量没有多大帮助。考
34362306a36Sopenharmony_ci虑到时间投入,可以让内部开发人员加快Linux内核的开发速度。利用这段时间可以
34462306a36Sopenharmony_ci让雇主拥有一批既了解内核又了解公司的开发人员,还可以帮助培训其他人。从中期
34562306a36Sopenharmony_ci来看,这通常是更有利可图的方法。
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci可以理解的是,单个开发人员往往对起步感到茫然。从一个大型项目开始可能会很
34862306a36Sopenharmony_ci吓人;人们往往想先用一些较小的东西来试试水。由此,一些开发人员开始创建修补
34962306a36Sopenharmony_ci拼写错误或轻微编码风格问题的补丁。不幸的是,这样的补丁会产生一定程度的噪音,
35062306a36Sopenharmony_ci这会分散整个开发社区的注意力,因此,它们越来越被人不看重。希望向社区介绍
35162306a36Sopenharmony_ci自己的新开发人员将无法通过这些方式获得他们期待的反响。
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ciAndrew Morton 为有抱负的内核开发人员提供了如下建议
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci::
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	所有内核开发者的第一个项目肯定应该是“确保内核在您可以操作的所有
35862306a36Sopenharmony_ci	机器上始终完美运行”。通常的方法是和其他人一起解决问题(这可能需
35962306a36Sopenharmony_ci	要坚持!),但就是如此——这是内核开发的一部分。
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci(http://lwn.net/Articles/283982/)
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci在没有明显问题需要解决的情况下,通常建议开发人员查看当前的回归和开放缺陷
36462306a36Sopenharmony_ci列表。从来都不缺少需要解决的问题;通过解决这些问题,开发人员将从该过程获得
36562306a36Sopenharmony_ci经验,同时与开发社区的其他成员建立相互尊重。
366