Skip to content

第二百零七章:发布周期

飞升期

涉及内核源码:

林小源来到一片被巨大沙漏覆盖的天地。沙漏有三层,每一层的沙子颜色不同——上层是金色,中层是银色,下层是铜色。沙漏的颈部刻着版本号,沙子每落下一层,版本号就跳动一次。

一位手持日晷的老者站在沙漏旁边,他的长袍上绣着无数版本号——5.10、5.11、5.12……一直延伸到看不见的远方。

"你想往内核提交代码,"老者的声音缓慢而沉稳,"就必须理解内核的时间。"

林小源抬头望着那巨大的沙漏:"内核的发布周期?"

"九到十周,一个版本,"老者指着沙漏的上层,"前两周是 Merge Window——合并窗口。这两周里,新功能可以合入主线。维护者发送 pull request,Linus 合并。过了这两周,窗口关闭,新功能就进不去了。"

老者的手指移到中层:"然后是七到八周的 RC 版本。rc1、rc2、rc3……每周一个。这段时间只修 bug,不加新功能。直到 Linus 觉得足够稳定了,正式发布。"

"但你不要误会,"老者敲了敲日晷,"Merge Window 里的补丁不是这两周才写出来的。真正能进主线的新功能,早已在子系统树里待过,在 linux-next 里和别人的补丁一起编译、冲突、修正。合并窗口只是开门,不是临时炼丹。"

沙漏底部的铜色沙子缓缓堆积,形成一个新的版本号。

c
/*
 * 内核发布周期:
 *
 * 周期: 约 9-10 周
 *
 * 1. Merge Window (合并窗口): 2 周
 *    新功能合并
 *    维护者提交 pull request
 *    Linus 合并
 *
 * 2. RC 版本: 7-8 周
 *    rc1, rc2, rc3, ...
 *    修复 bug
 *    不添加新功能
 *    每周一个 rc 版本
 *
 * 3. 最终发布
 *    5.0, 5.1, 5.2, ...
 *    稳定版本
 *
 * 版本号:
 *   主版本.次版本.补丁版本
 *   5.15.0 — 主版本
 *   5.15.1 — 补丁版本
 *
 * LTS (长期支持):
 *   长期维护的版本
 *   2 年支持
 *   例如: 5.10, 5.15, 6.1
 *
 * 时间线:
 *   Week 0: 发布 5.x
 *   Week 0-2: Merge window
 *   Week 2: 发布 5.(x+1)-rc1
 *   Week 3: 发布 5.(x+1)-rc2
 *   ...
 *   Week 9: 发布 5.(x+1)
 */

/* 模拟发布周期 */
struct release {
    char version[16];
    char phase[32];
    int week;
    char description[128];
};

struct release releases[] = {
    {"5.15", "发布", 0, "稳定版本发布"},
    {"5.16-rc1", "Merge Window", 0, "新功能合并"},
    {"5.16-rc2", "RC", 1, "bug 修复"},
    {"5.16-rc3", "RC", 2, "bug 修复"},
    {"5.16-rc4", "RC", 3, "bug 修复"},
    {"5.16-rc5", "RC", 4, "bug 修复"},
    {"5.16-rc6", "RC", 5, "bug 修复"},
    {"5.16-rc7", "RC", 6, "bug 修复"},
    {"5.16", "发布", 7, "稳定版本发布"},
};

printf("=== 发布周期 — 内核的节奏 ===\n\n");

printf("内核有固定的发布周期:\n\n");

printf("--- 发布周期 ---\n");
int n = sizeof(releases) / sizeof(releases[0]);
for (int i = 0; i < n; i++) {
    printf("Week %d: %s (%s) — %s\n",
           releases[i].week, releases[i].version,
           releases[i].phase, releases[i].description);
}

printf("\n--- Merge Window ---\n");
printf("时间: 2 周\n");
printf("内容:\n");
printf("  新功能合并\n");
printf("  维护者提交 pull request\n");
printf("  Linus 合并\n\n");
printf("规则:\n");
printf("  只合并新功能\n");
printf("  不修复 bug\n\n");

printf("--- RC 版本 ---\n");
printf("时间: 7-8 周\n");
printf("内容:\n");
printf("  修复 bug\n");
printf("  不添加新功能\n");
printf("  每周一个 rc 版本\n\n");

printf("--- 版本号 ---\n");
printf("主版本.次版本.补丁版本\n");
printf("5.15.0 — 主版本\n");
printf("5.15.1 — 补丁版本\n\n");

printf("--- LTS ---\n");
printf("长期支持版本:\n");
printf("  2 年支持\n");
printf("  5.10, 5.15, 6.1\n\n");

printf("--- 发布规则 ---\n");
printf("1. Merge window 合并新功能\n");
printf("2. RC 版本只修复 bug\n");
printf("3. 不引入回归\n");
printf("4. Linus 最终决定发布\n");
printf("5. 新功能通常先进入子系统树和 linux-next\n");
破关试炼

节奏之试

主线合并窗口前,用于集成各子系统下一周期补丁、提前发现冲突的树通常叫什么?

答对后才能继续滑动和进入下一章。

老者带林小源走到沙漏的上层,金色的沙子正在急速下落。"Merge Window,"老者的语气变得紧张,"这是内核最繁忙的两周。"

林小源看到无数维护者在沙漏中忙碌穿梭,每个人手中都捧着一叠 pull request。他们争分夺秒地将新功能送入主线,因为窗口一关,就要再等九周。

"我见过维护者在 Merge Window 的最后一天提交了二十个 pull request,"老者摇着头,"也见过维护者错过了窗口,他的新功能只能等到下一个版本。Merge Window 是新功能的大门,但这扇门只开两周。"

林小源望着那扇正在缓缓关闭的金色大门,心中感受到了时间的紧迫。在内核的世界里,时机和代码同样重要。

"窗口关闭后,"老者指着中层的银色沙子,"就进入了 RC 阶段。这段时间,只有修复 bug 的补丁才能进入主线。新功能?等下一个窗口。这是铁律,没有例外。"

银色沙子中忽然浮出一枚黑点,像一粒杂质。老者的脸色沉了下来。

"回归。"他说。

那枚黑点迅速扩大,吞掉了周围几粒银沙。林小源听见远处传来用户的喊声:昨天还能启动的机器,今天挂起后醒不来;上个版本能跑的程序,新版本开始失败。

"内核开发第一戒,是不要让用户升级后失去原本能用的东西。"老者说,"RC 阶段不是补丁作者放手的时候。若你的改动造成回归,你要回应报告,配合定位,必要时先 revert。修复补丁要写 Fixes:,公开报告要写 Closes:,需要进入稳定版时还要标明 Cc: stable@vger.kernel.org。"

林小源看着那枚黑点被几位修士合力封住,心里第一次真正理解了"发布"二字的重量。代码合入,只是被更多人测试的开始。

破关试炼

回归之试

当补丁修复用户报告的回归时,指向公开报告、帮助工具关联修复的标签是什么?

答对后才能继续滑动和进入下一章。

老者从长袍上取下一个特殊的版本号——5.10,上面笼罩着一层持久的光芒。

"LTS,"老者将版本号递给林小源,"Long Term Support,长期支持。"

林小源接过版本号,感受到它比其他版本号更沉、更稳。

"普通的内核版本只维护到下一个版本发布。5.15 发布后,5.14 就不再维护了。但 LTS 不同,"老者的声音中带着敬意,"LTS 版本有两年的支持期。两年里,安全补丁和重要 bug 修复会持续回移到 LTS 版本。"

老者望向远方,那里有一片稳定的大陆,大陆上运行着无数 LTS 内核。"企业需要稳定。他们不能每隔九周就升级一次内核。LTS 让他们可以安心使用同一个版本两年,同时依然能获得安全更新。这就是 LTS 的价值——稳定。"

林小源望着那片大陆,明白了内核的发布不是一锤子买卖,而是一个持续维护的生态系统。

老者把 5.10 放回长袍,又取出一枚小得多的版本号:5.10.1

"这叫 stable update。"他说,"它不是新功能的后门。一个补丁要进入 stable,通常必须已经进了主线,而且修的是重要 bug。Fixes: 能帮助稳定团队判断影响范围,但它本身不等于请求回移;该写 Cc: stable@vger.kernel.org 的时候要写。"

林小源点头。飞升的路忽然从天门延伸到了凡间。主线上的每一次失误,都会通过 stable、longterm、发行版内核传到真实用户的机器上;主线上的每一次修复,也要沿着这些路回去。

破关试炼

稳定之试

希望重要 bug 修复被稳定版团队注意并回移时,补丁标签区常加入哪个 Cc 地址?

答对后才能继续滑动和进入下一章。

道藏笔记

内核启示

内核有固定的发布周期。

发布周期:

  • Merge Window (2 周) — 新功能合并
  • RC 版本 (7-8 周) — bug 修复
  • 最终发布 — 稳定版本

版本号:

  • 主版本.次版本.补丁版本
  • 5.15.0 — 主版本

LTS (长期支持):

  • 2 年支持
  • 企业使用

发布规则:

  • Merge window 合并新功能
  • RC 版本只修复 bug
  • Linus 最终决定发布
  • 新功能通常先在子系统树和 linux-next 中集成测试
  • 回归优先处理,必要时 revert
  • stable/LTS 只接收适合回移的重要修复

发布周期是节奏——让内核稳步前进。


破关试炼

道藏复核

发布周期里,新功能集中进入主线的两周窗口叫什么?

答对后才能继续滑动和进入下一章。

以修仙之名,悟内核之道