怎么参与Linux主线内核开发

无论您的工作是否与Linux内核开发有关,您一定据说过这一世界上十分知名的开源项目。它是由LinusTorvalds于1991年在Usenet的comp.os.minix新闻组上发布的操作系统内核经过社区不断演变而成,兼容POSIX标准,被广泛运用于服务器、移动终端(Android操作系统生态)和桌面PC等领域。

Linux内核社区是一个开放宽容的开源社区,正是因为这份开放与宽容和一群极具geek精神的专家及开源公司持续不断地投入,Linux生态能够持续健康发展。众人拾柴火焰高,因而请相信深度linux系统,有益于codebase的补丁更改递交到主线内核并指摘事。

本文假设读者了解git的使用方法,且仅讨论通常流程不展开技术细节。

一、开发流程

linux内核开发社区_linux内核开发是干什么_linux内核社区

当前Linux主线由LinusTorvalds高手维护,主线开发就是将自己创作的补丁递交到Linus前辈的主线分支里。

每位新内核版本的发布前就会经历数个-rc小版本的公开测试和修补,那些-rc[1]和最终版本[2]的发布也都由Linus高手亲力亲为。容易理解linux教程,对于像Linux如此庞大的代码规模,Linus高手本人是难以亲自完成整个内核维护的。因而Linux内核开发按代码拓扑界定为各个子系统管理,绝大多数子系统都有maintainer(或maintainer团队)义务负责维护。

通常来说,新特点都须要在-rc1前合入,-rc1发布前通常有两周合入期,这个时间段Linus高手会处理各个子系统maintainer递交的pullrequestslinux内核开发社区,并反馈是否接受这种子系统的更改(可能就会有些有意思的讨论。。图片),因而这一时期被称为mergewindow。一旦mergewindow关掉,从-rc2到-final(每位rc一周)不再容许新特点合入,而专注于该版本质量的提高,Linus高手依然会处理各个子系统maintainer递交的pullrequests,不过这种pullrequest只会专注于bugfix上。一个新版本的发布周期大约为2个月左右linux内核开发社区,周而复始。

如上图所示(作者GregKH),每位maintainer负责它所属维护范围的补丁搜集和测试工作,之后交给更初一级maintainer,直至最终被Linus拉入自己的分支中。各级maintainer在-rc1~-final间拉取重要的修补并及时递交给上级,而新特点则会pending直至下个版本的-final~-rc1的mergewindow中进行。至于个别不明归属的补丁可能会步入AndrewMorton的queue中,所以对于这种补丁,你须要吸引akpm高手的注意:)(其实akpm高手主要负责-mmtree)

linux内核开发社区_linux内核社区_linux内核开发是干什么

另外须要留心上图中的-next库房,它是由StephenRothwell高手维护的快照分支,目的是彰显已合入各maintainers分支但没有合入Linux主线的递交,通常来说这个分支负责合入主线前的冲突处理和整体系统测试。作为开发者您也须要关注这个-next分支来了解最新开发全景动态!

顺带提一下stable和LTS内核。新的Linux版本发布后,它都会被列入stable内核管理,直至下一个新版本内核发布为止。这个期间所有被标记了Fixes和Ccstable的稳定性和安全主线补丁会被回合到老的stable内核中。比较老旧的内核书籍可能会介绍奇偶版本规则(比如2.4、2.6稳定,2.3、2.5不稳定),但这一规则已经过时。LTS版本为常年演化版本,它可以被社区支持历时数年,通常每年下半年会形成一个LTS版本,一般每5个版本形成一个LTS版本(比如4.4、4.9、4.14、4.19,5.4似乎除外图片)

二、下载Linux源码

你们一定访问过,它是由Linux基金会营运的内核代码托管网站,用于储存Linux主线、stable、LTS和各个子系统分支及内核周边工具源码。

作为用户,你们可能平日关注的是此网站里发布的stable或则LTS内核源码包。而作为内核开发者,如上文所言,Linux主线分支就是Linus高手的分支,因而克隆一份最新主线git仓可以了解下当前已合入主线的既定事实递交。

linux内核开发是干什么_linux内核开发社区_linux内核社区

Linux主线git仓地址为:

git:///pub/scm/linux/kernel/git/torvalds/linux.git

当您想修补某一个子系统的bug时,由上文所述,克隆该子系统的独立git树是非常必要的,这种信息记录在源码的MAINTAINERS里。您可以通过scripts/get_maintainer.pl来查询,比如查看fs/erofs的信息,可以输入:

scripts/get_maintainer.pl--scm-ffs/erofs

linux内核开发社区_linux内核社区_linux内核开发是干什么

当您须要开发独立特点(尤其是跨模块特点)或则须要了解下您的补丁对全系统开发动态的影响时,-next也是须要关注的一个库房。

-next库房的git地址为:

git:///pub/scm/linux/kernel/git/next/linux-next.git

三、制作补丁

你们可能尝试过github开发的fork+pull模式,是的,Linux内核演化本质上也是一种基于电邮列表的fork+pull模式。只是因为信任链的问题,Linus或则大maintainers可能不太会直接接受未经社区测试的pullrequest。所以一般情况下是各开发者自行制做补丁(集)再通过电子短信发送到可能接受补丁的maintainers、邮件列表和潜在可能帮助您review的内核开发者们。

linux内核社区_linux内核开发是干什么_linux内核开发社区

正规的内核递交流程在发送前须要检测末尾Signed-off-by标志来标注您(或则您的组织)的所有权并容许将其彰显到内核中(更正规的描述见[3]),注意通常来说该递交的原作者须要跟Signed-off-by标志对应。通过gitcommit--amend--signoff命令可以很便捷地附加该标志。

我个人习惯在整理补丁前checkout到一个临时开发分支,apply并确认各补丁基本正常后,使用gitformat-patch-M-opatchesorigin/dev等这种命令生成补丁文件。这种补丁文件使用一种canonicalpatchformat,它似乎是一种易于短信发送的格式。您可以通过vim等文本编辑工具进一步后处理补丁,比如降低changelog。通过scripts/checkpatch.pl检测补丁中的代码和递交风格问题。

通过scripts/get_maintainer.pl来查询maintainers和须要发送的电邮列表。最后通过gitsend-email来发出补丁(集)。更详尽的说明可以看内核源码中的ReST英文文档:Documentation/translations/zh_CN/process/submitting-patches.rst[3]

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复