| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux 之十五 Kernel 仓库、Kernel 协作方式、订阅邮件列表、提交 PATCH -> 正文阅读 |
|
[系统运维]Linux 之十五 Kernel 仓库、Kernel 协作方式、订阅邮件列表、提交 PATCH |
kernel.org??kernel.org 是 Linux 内核源代码的最主要分发站点,主要包括 kernel.org 网站及 Git 存储库等基础设施。其主要作用是托管 Linux 内核开发人员和各种 Linux 内核发行版的维护者使用的源代码存储库。此外,它也是 Linux Kernel 协作开发的控制中心。 ??目前,Linux Kernel 采用自己搭建的 Git 代码托管平台来管理 Linux Kernel 源代码,每一个部分都有自己独立的源代码仓库,并独立维护,然后再由专人再进行合并为一个整体,并且 Linux Kernel 至今还在使用邮件列表和补丁提交的开源协作方式。早期的一些开源项目都是使用邮件列表及 IRC 这两种方式进行协作开发:
??多数使用自建 Git 托管平台的开源软件同时也会在 GitHub 等公共在线托管平台上建立镜像仓库。例如 Yocto Project 相关代码仓库,Linux Kernel 的几个主要仓库等等。注意,镜像仓库往往都是为了查看源码的方便,一般官方都不推荐在镜像仓库中反馈问题等协作。 The Linux Kernel Organization??Linux Kernel Organization 是一家向公众分发 Linux Kernel 和其他开源软件的公益公司。成立于 2002 年,总部位于位于加利福尼亚州洛杉矶市,被美国国税局认定为 501?3 私人运营基金会。 ??Linux Kernel Organization 负责运营 kernel.org 网站及相关基础设施。但是,Linux Kernel Organization 貌似没啥人,它由 The Linux Foundation 管理,资金、技术支持、人力支持等也都是由 The Linux Foundation 提供。 The Linux Foundation??Linux 基金会(The Linux Foundation)是 2000 年由开源码发展实验室(Open Source Development Labs,OSDL)与自由标准组织(Free Standards Group,FSG)联合起来成立的。致力于促进,保护和推进 Linux 内核协同开发,并支持“历史上最大的共享技术资源”。 ??Linux 基金会赞助 Linux 创建者 Linus Torvalds 和首席维护者 Greg Kroah-Hartman 的工作,也通过活动、培训和认证以及开源项目扩展了其支持计划。此外,Linux 基金会下还有许多独立的项目(例如 Xen Project、Yocto Project)。 Kernel 源码仓库??根据不同的开发情况,Kernel 将源代码分为了一个主线仓库(Mainline)、一个稳定版仓库(Stable)、一个集成测试仓库(Linux-next)和众多的子系统仓库(Subsystem)等一系列独立的仓库。每个仓库都有专人进行维护,独立开发,互相不影响!
??如果在国内直接访问 Kernel 的原始代码仓库(貌似是位于荷兰),速度是非常慢的。不过好消息是,Code Aurora Forum 在北京提供了一个 Linux Kernel 的镜像仓库:https://kernel.source.codeaurora.cn/。这个镜像仓库与 git.kernel.org 是一模一样的,并且都是由同一个团队在管理,因此其更新速度与 git.kernel.org 基本也是同步的。
??所有的 Kernel 源码仓库都是以主线仓库(Mainline)为基础的。乍看之下,Linux Kernel 代码管理很像是 Monorepo 模式,所有东西都被收纳在由 Linus Torvalds 维护的 Mainline 仓库当中。 Linux Kernel 虽然为所有内容提供一套作为共享命名空间的单一文件层级结构,但出于不同应用需求与关注重点,各 repo 又保持着相互独立。换言之,Linux 内核项目更像是个由众多 repo 构成的 Monotree,而非 Monorepo。 Mainline??Mainline 这个仓库是由 Linus Torvalds 本尊亲自维护的。它是所有新特性被引入到最终发布的 Linux Kernel 的地方。该仓库的官方地址是:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git。此外,该仓库还在 Github 上做了一个镜像仓库:https://github.com/torvalds/linux。
??Mainline 仓库只有一个 master 分支,就相当于一棵树的主干,代表着 Linux Kernel 的发展方向。只有 Linus Torvalds 有权限在 Mainline 仓库中合并代码。Mainline 仓库是在不断发展的(周期性不断增加新功能),也因此,Mainline 仓库不需要额外的分支。对于每个达到发布要求的版本,Linus 本人就会采用打 tag 的方式进行发布,发布周期通常是 9 ~ 10 周。 ??在 Linux 1.0 之前,采用是的是 ??某一个正式版和下一个候选版之间的时期叫做合并窗口期,比如,5.17 至 5.18-rc1 之间就是 5.18 版本的合并窗口期。这个合并窗口期大约是 2 周左右。只有在合并窗口期里才允许增加新特性,后续阶段( RC 版本)只允许缺陷修订(Bugfix)。
??由于 Mainline 仓库是在周期性不断增加新特性,新特性往往意味着更多的 BUG,尽管在 RC 阶段,Mainline 仓库的 Kernel 会重点关注于问题的修复,但是仍然不能保证 Mainline 仓库的 Kernel 稳定性可能并不是很好。除非开发者确实想要提前体验一些新的特性,否则不建议使用 Mainline 仓库的 Kernel。 Linux-stable??Linux-stable 仓库用于跟踪已经发布的 Linux Kernel 版本,进行各种 BUG 的修复。其主要维护者是 Linux 社区的第二大人物 Greg Kroah-Hartman。该仓库的官方位置是 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/。同样,该仓库也在 Github 上建立了一个镜像仓库:https://github.com/gregkh/linux。
??当 Linus Torvalds 在其维护的 Mainline 仓库中发布了一个新的版本后(即 Mainline 仓库中新建 Tag( 例如 5.17 )后),紧接着他就会从 Mainline 仓库的 master 分支上 pull 一份到 Linux-stable 的 master 分支,同时 checkout 出来一个基于当前最新 master 分支(例如,5.17)的新分支(例如 linux-5.17.y)。分支名字采用在 Mainline 发布的版本号后加一个
??并不是每个发布的稳定版的 Kernel 都会被广泛使用,Kernel 的版本迭代速度还是挺快的。当一个稳定版本被发布之后,到下一个稳定版本发布之前,该稳定版本通常仅会包含几次修订。其中,有些稳定版(例如 5.15 版)会被标记为 LTS(Long Term Support),这些版本的 Kernel 会在相当长的一段时间内一直被维护(
??然而,提交到 Mainline 仓库的修复补丁到底能不能在已经发布的旧版上很好的工作也是个未知数(绝大部分是没问题的)。此外,针对已发布的旧版的集成测试是比较少的。因此,没有定量或定性指标可以用来明确地说哪个版本的内核更稳定!
Subsystem??Linux Kernel 将源码划分为了一些相对独立的子系统,每个子系统都有专门的人员负责维护,各个子系统的仓库可以在 https://git.kernel.org 上找到。具体的维护者可以在 Kernel 源码目录下的
??子系统仓库通常会包含一个 next 分支,有些大型的子系统甚至单独建立一个 next 仓库,用于存放那些需要提交到 Linux-next 的补丁。此外,子系统维护人员反过来可以从其他维护人员那里获取补丁。例如,网络树是由网络设备驱动程序、无线网络等专用树中积累的补丁构建而成。 Linux-next??Linux-next 仓库用于存放那些希望在下一个 merge 窗口期被合入 Mainline 的补丁代码,主要由 Stephen Rothwell 维护。官方原始仓库地址是:https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git。
??Linux Kernel 中的各个子系统每天都在进行更改,有些更改甚至是跨子系统的,在将子系统树中的更新合并到主线树之前,需要对它们进行集成测试。Linux-next 仓库就是用来处理这个集成测试的。该仓库几乎每天都会将所有子系统树拉入其中,通过这种方式,linux-next 给出了在下一个合并期间将进入主线内核的那些补丁的基本情况。 ??Linux-next 包含最前沿的 Linux Kernel 特性,仓库几乎每天都会新建一个 Tag,命名规则是 加入 Linux 社区??Linux Kernel 至今还在使用邮件列表和补丁提交的开源协作方式。要加入 Linux 社区,就是了解 Linux Kernel 的协作开发模式、流程及各种规范,并严格遵守相关规定。
??在多年的发展中,Linux 社区制定了一系列严格的规范,例如 源代码的编码规范、代码提交规范等等。Linux Kernel 官方文档 Working with the kernel development community 中有专门章节来详细介绍如何加入 Linux 社区。 邮件列表??邮件列表里面包含了多个邮件地址,当用户发邮件给一个真实存在的邮件列表时,里面包含的邮件地址都能收到这封邮件。邮件列表是一种常见而实用的电子邮件应用功能,本质是通过一种简单的方法,实现群发邮件的功能:其他人都可以收到某人发送到邮件列表的邮件。
VGER.KERNEL.ORG??VGER.KERNEL.ORG 是 Linux 邮件列表服务站点。页面上列出了目前已知的所有 Linux 子系统的邮件订阅地址,后台的邮件服务器 VGER’s Majordomo 负责处理我们的订阅。
??成为 Linux 开发者的第一步就是在 http://vger.kernel.org/vger-lists.html 这里找到自己要贡献的某个部分,然后订阅对应的邮件列表。订阅或者取消订阅非常简单,只需要向 majordomo@vger.kernel.org 发送特定内容的邮件即可。订阅服务器对订阅邮件的内容有严格的要求:
??由于邮件列表内容非常多(linux-kernel 邮件列表每天都有 200 ~ 300 封邮件),建议单独采用一个邮箱来进行订阅。此外,有网友反应国内部分邮箱面对大量邮件可能会给屏蔽。我当初是专门申请了一个 Google 的 Gmail 来订阅相关邮件列表。以下是我订阅 linux-embedded 的整个过程:
其他邮件列表??除了官方的 VGER.KERNEL.ORG 之外,还有一些其他的 Linux 邮件列表,lists.infradead.org 和 listman.redhat.com 也是常用的邮件列表。这些邮件列表里通常会有一些 VGER.KERNEL.ORG 没有的订阅列表。
邮件存档??Linux Kernel 官方提供了 lore.kernel.org 用于存档所有的 Linux 协作开发往来邮件内容。但是 lore.kernel.org 上的存档并不全,每个独立的模块还可能在其他地方提供订阅邮件的存档(http://vger.kernel.org/vger-lists.html 列表中会有说明)。 文档??Kernel 的文档(源码目录/Documentation/*)使用的是 Sphinx 搭建的文档系统。Sphinx 是基于 Python 的,使用的是 reStructuredText 语言格式,文件扩展名通常是 .rst。Sphinx 文档系统使用 make 命令来生成发布的文档,可以生成 html、pdf 等格式。 ??Kernel 文档在线托管地址是:https://docs.kernel.org/。在线版文档就是使用 Sphinx 基于 提交 PATCH??想要为 Linux Kernel 贡献自己的代码必须要严格遵守 Linux 社区的相关规范。这些规范在 Linux Kernel 官方文档 Working with the kernel development community 中有专门章节介绍来详细介绍。包括但不限于编码规范、邮件列表使用、PATCH 格式、邮件的格式等等。 ??不要视图直接往 clone 的仓库推送代码,只有对应仓库的维护人员才有权限。前面不止一次说过,Linux Kernel 至今还在使用邮件列表和补丁提交的开源协作方式。基本流程如下图所示: 环境及工具??工欲善其事必先利其器。Linux 的开发需要使用 Linux 环境,可以选择自己喜欢的任意 Linux 发行版(我这里使用的是 Ubuntu 22.04 LTS)。其他一些工具,例如,git、git-email、make、gcc 等根据自己的环境使用对应的命令进行安装即可。
??为了确保发送的 PATCH 格式不会出错,一般使用 Git 自身提供的命令 选择 Kernel 源码??接下来就是正确选择并获取 Kernel 源代码树。直接克隆 Linus Torvalds 的 Mainline 仓库是一个选择,但是,更多的情况是针对特定的子系统进行开发。大多数子系统维护人员都有他们自己的代码仓库,通常,查看 Kernel 源代码目录下的 MAINTAINERS 文件(或者在线文档 https://docs.kernel.org/process/maintainers.html)查找对应的仓库地址。
??一些开发人员建议将 linux-next 作为未来开发的主要分支,linux-next 分支确实远远超出主干,并且更能代表新的改进将合并到主干。但是,linux-next 的波动性往往使它成为一个艰难的发展目标。正如 linux-next 树的维护者 Stephen Rothwell 所说:“linux-next 工作方式的一个缺点是,因为它每天都要重新创建,所以不能真正将任何要合并到其中的东西建立在它的基础上。” 修改代码??接下来就是修改代码,然后提交修改。尽量保证每个 Commit 中的修改在逻辑功能上是独立的,一个 Commit 中包含多种类型的修改将导致 PATCH 不能独立。可以通过查看文件修改的文件的历史的方式,看看别人提交的格式:
每一行都不要超过 75 个字符,过长的内容请自觉换行:
生成 PATCH??保证每个补丁只解决一个问题。如果修改包含了很多的 Commit,则需要根据情况拆分为多个不同的 PATCH。注意,每个 PATCH 都必须经过了自己严格的测试,最基础的一点就是保证编译没有任何错误。如果 PATCH 经过了其他人的测试,在提交请务必添加 Tested-by 标签。 ??生成 PATCH 就比较简单了,主要就是对于
??接下来需要运行命令 发送 PATCH??保证 PATCH 没有任何问题后,就可以把 PATCH 发送给上游维护者了。首先,通过运行命令 参考
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 13:58:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |