Linux 内核达到了又一个重要里程碑。最新的 Linux 7.2 开发树 在所有跟踪文件中包含约 43.2 百万 total 行,或者根据 tokei 和 scc 工具报告,约 42.6 百万 语言感知行。
我们在官方 v7.2-rc1 标签上使用 4 种不同的代码计数工具独立验证了这些数字。根据我们的测量,这是迄今为止最大的 Linux 内核源代码树。
乍一看,这个数字可能很大。但这并不意味着 Linux 变得臃肿。相反,它表明了两件事:Linux 今天支持多少硬件,以及内核继续发展的活跃程度。
让我们看看发生了什么变化。
Linux 7.2 突破 42 百万行大关
我使用多种代码计数工具测量了 Linux 7.2-rc1 Git 树。为了演示,我使用了确切的 v7.2-rc1 标签提交(dc59e4fea9d8)。
ostechnix@fedora:~/linux$ git log --oneline -1
dc59e4fea9d8 (HEAD -> master, tag: v7.2-rc1, origin/master, origin/HEAD) Linux 7.2-rc1
ostechnix@fedora:~/linux$ git describe --tags
v7.2-rc1
ostechnix@fedora:~/linux$ git rev-parse HEAD
dc59e4fea9d83f03bad6bddf3fa2e52491777482
以下是每个工具发现的结果:
我在同一个 Fedora VM 会话中,针对同一个 Git 检出(dc59e4fea9d8),使用相同的工具版本运行了所有四个工具。这使得结果可以直接比较和复现。
早期使用 cloc v1.96 的测试产生了几乎相同的 total 40,414,638。微小的差异来自 cloc v2.08 的改进,它识别了一些额外的文件格式,如 Jinja Template 和 Snakemake。
Tokei 和 scc 几乎完全一致,两者都报告约 42.58 百万 total 行。它们的独立结果仅相差 2,159 行(约 0.005%),使它们成为 Linux 源代码树最一致的语言感知测量结果。
相比之下,默认的 cloc 运行少计了内核约 2.17 百万 行,因为它默认不识别 Linux 设备树(.dts/.dtsi)源文件。我通过重新运行 cloc 并添加以下参数验证了这一点:
cloc --force-lang="C",dts --force-lang="C",dtsi .
这使 cloc 的 total 增加了约 2.1 百万 行,使其结果与 tokei 和 scc 接近一致。
我在 Linux 7.1 和 7.2-rc1 上都重现了相同的行为,确认差异来自 cloc 的默认语言识别,而不是内核本身的变化。
“43 百万”标题的来源
对仓库中所有跟踪文件进行原始 wc -l 计数,得到 43,179,595 行。这就是“43 百万行”标题的来源。
这个数字与 tokei 和 scc 报告的 total 之间存在约 597,000 行的差距。这种差异的存在是因为 wc -l 计算每个跟踪文件中的每一行,而语言感知工具则有意排除或不同地分类许多非源文件。示例包括文档、元数据、图像、证书以及仓库中的其他非源或未识别格式。
值得注意的是,一个干净的 Linux 内核 Git 检出 不包含已编译的 .dtb 二进制文件 和 没有 firmware/ 目录(固件 blob 在 linux-firmware 仓库中单独维护)。因此,这些文件不会导致这种差异。
简而言之,43 百万 标题在技术上是准确的,因为它反映了 Git 树中存储的每一行。然而,tokei 和 scc 报告的 42.58 百万 数字是内核源代码更准确的测量。
Linux 7.2 延续内核的增长
为了测量内核在此开发周期中的增长量,我在最终的 Linux 7.1 版本上使用相同的 Fedora VM、工具版本和方法重复了相同的测量。
结果显示所有三种测量方法之间具有显著的一致性。tokei 和 scc 都报告 Linux 在 Linux 7.1 和 7.2-rc1 之间增加了约 563,000 语言感知行,代表在一个开发周期内增长了约 1.3%。原始 wc -l 计数显示类似大小的增加,为 572,677 行。
这听起来很惊人,但完全在意料之中。每个 Linux 内核版本都会添加对新处理器、平台、文件系统、驱动程序、虚拟化技术和安全改进的支持,同时继续完善现有子系统。
根据 Linux 7.1 最终发布说明,超过 2,000 名开发者 贡献了更改,包括超过 300 名首次贡献者。如此规模的持续贡献自然会随着时间的推移转化为源代码树的稳定增长。
Linux 即使在删除旧代码后仍在增长
这个里程碑的一个令人惊讶的方面是,即使在删除遗留代码的同时,Linux 内核代码仍在继续增长。
Linux 7.1 开始放弃对 Intel i486 处理器的支持,删除了超过 140,000 行过时代码,包括遗留的 PCMCIA 主机控制器和 ISDN 驱动程序。Linux 7.2 通过删除额外的 i486 相关代码以及几个过时的驱动程序和遗留的 x86 组件,继续这种清理工作。
换句话说,Linux 开发者不断平衡添加和删除。虽然新的硬件支持、架构、驱动程序、文件系统和安全功能扩展了内核,但过时的代码会定期退役,以减少维护负担并保持项目的现代化。
为什么 Linux 内核如此庞大?
答案是 驱动程序。
Linux 内核支持令人难以置信的多种硬件。每张显卡、存储控制器、网卡、笔记本电脑功能、USB 设备和嵌入式平台都需要内核支持。
随着新硬件进入市场,开发者添加新的驱动程序。同时,他们保持与现有设备的兼容性。因此,内核的大部分增长来自硬件支持。内核核心调度或内存管理代码的增长非常少。
AMDGPU 仍然是最大的驱动程序
最大的贡献者仍然是 AMD 图形子系统。
组合的 AMDGPU 和 AMDKFD 驱动程序包含约 6.35 百万行 代码。这使其成为整个 Linux 内核中最大的驱动程序。
Linus Torvalds 指出了一个有趣的事情。一个大型拉取请求中大约三分之一是 AMD GPU 寄存器定义文件。这些文件大多是生成的数据。它们帮助 Linux 与现代 AMD 图形硬件通信。
更大并不意味着更慢
许多人认为更多的代码行意味着更慢的软件。但 Linux 内核并非如此。
大部分额外代码的存在是为了支持许多用户永远不会拥有的硬件。其中很多存在于可加载模块中。这些模块仅在匹配的硬件存在时激活。
因此,内核在扩展硬件兼容性的同时不断改进。这适用于桌面、服务器、笔记本电脑、嵌入式系统、云平台和超级计算机。
计算 Linux 内核代码的总行数
任何人都可以克隆 Linux 内核仓库并进行测量。首先,获取内核源代码:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
完整克隆约 5 GB。你可以向 git 命令添加 --depth=1 以进行浅克隆(约 1.5 GB):
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
在本指南中,我使用了完整克隆。
方法 1:cloc(广泛引用的参考工具)
cloc 是内核行计数最常用的工具。
# Install
sudo apt install cloc # Debian/Ubuntu
sudo dnf install cloc # Fedora/RHEL
sudo pacman -S cloc # Arch
现在,运行:
cloc --progress=1 .
注意末尾的点(.)。意思是——我们指示 cloc 分析当前目录。
根据你的硬件,cloc 扫描完整的 Linux 源代码树可能需要 几分钟。在我的 Fedora VM 上,它在大约 3–4 分钟 内完成。
示例输出:
94718 text files.
82309 unique files.
12415 files ignored.
github.com/AlDanial/cloc v 2.08 T=276.85 s (297.3 files/s, 145986.6 lines/s)
----------------------------------------------------------------------------------------
Language files blank comment code
----------------------------------------------------------------------------------------
C 36898 3801120 2908960 19610084
C/C++ Header 26648 791061 1600637 8405094
JSON 833 2 0 553530
reStructuredText 4011 197901 81994 540661
YAML 5675 104970 25957 518427
Assembly 1343 47625 99191 230030
Bourne Shell 1321 40912 27301 159379
Rust 473 15277 52795 114347
Python 428 21148 18854 90203
Text 975 19724 0 89632
make 3188 12948 13377 60578
SVG 87 98 1311 56094
Perl 69 6811 4558 34796
XML 32 1514 1706 23049
yacc 10 723 442 4848
PO File 7 1106 1269 4336
Bourne Again Shell 63 631 416 2584
lex 10 366 355 2219
C++ 9 356 143 1917
awk 16 374 480 1743
CSV 11 126 0 1413
Jinja Template 102 69 98 794
NAnt script 2 167 0 610
Logos 4 115 0 547
Markdown 9 162 3 514
XML (Qt/GTK) 1 50 0 486
XSD 1 46 9 349
CSS 4 71 96 244
Cucumber 1 40 97 199
TeX 1 6 73 155
TNSDL 2 33 0 140
Windows Module Definition 2 20 0 137
Linker Script 5 25 11 126
Snakemake 5 15 13 125
Clojure 36 1 0 95
m4 1 15 1 95
XSLT 5 13 26 61
BitBake 5 65 178 58
Umka 2 20 0 54
TOML 3 9 12 36
MATLAB 1 17 37 35
INI 3 6 0 34
sed 2 23 52 31
vim script 1 3 12 27
HTML 2 4 5 25
Ruby 1 4 0 25
Velocity Template Language 1 0 0 15
----------------------------------------------------------------------------------------
SUM: 82309 5065792 4840469 30509981
----------------------------------------------------------------------------------------
注意: cloc 不识别设备树源文件(.dts/.dtsi)。这是它少计内核的部分原因(参见本指南前面的分析)。
要仅测量 AMD 图形驱动程序,运行:
cloc drivers/gpu/drm/amd
方法 2:tokei(更快、更准确,推荐)
tokei 比 cloc 快得多。它还能正确计数设备树文件。这使其成为 Linux 内核更准确的选择。
首先,确保系统已安装 Rust。然后,使用 cargo 包管理器安装 tokei:
cargo install tokei
tokei 也可在某些发行版的官方仓库中获得,因此你可以使用默认包管理器安装,如下所示:
sudo apt install tokei
brew install tokei
现在,运行:
tokei .
示例输出:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Language Files Lines Code Comments Blanks
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AWK 13 2805 1923 500 382
Alex 4 662 547 0 115
ASN.1 15 656 441 87 128
Assembly 11 5781 5445 0 336
GNU Style Assembly 1337 371255 270423 56888 43944
Autoconf 6 459 395 30 34
Automake 3 31 23 3 5
BASH 62 3038 2094 437 507
Bazel 81 1829 1474 54 301
Bitbake 3 13 4 6 3
C 36910 26320472 19615926 2909605 3794941
C Header 26813 10822880 8416361 1615212 791307
C++ 7 2291 1969 81 241
C++ Header 2 125 59 55 11
CSS 4 411 244 97 70
Device Tree 6343 2097441 1724154 92401 280886
Forge Config 15 1352 321 744 287
Gherkin (Cucumber) 1 336 199 97 40
Happy 10 6013 5290 0 723
HEX 2 173 173 0 0
INI 2 13 6 5 2
Jinja2 149 1187 966 145 76
JSON 1043 607008 607006 0 2
Lex 10 2940 2218 356 366
LD Script 13 552 427 40 85
Makefile 3203 87274 60667 13531 13076
Module-Definition 2 157 137 0 20
Objective-C 1 89 72 0 17
Pacman's makepkg 1 134 91 13 30
Perl 61 43189 33862 4009 5318
PO File 7 6711 3346 2259 1106
Python 439 130209 102002 8291 19916
RPM Specfile 1 215 174 14 27
ReStructuredText 4011 820556 622655 0 197901
Ruby 1 29 25 0 4
Shell 1172 219683 153221 27411 39051
Snakemake 5 153 125 13 15
SVG 87 57503 56094 1311 98
SWIG 1 252 154 27 71
TeX 1 234 155 73 6
Plain Text 981 109702 0 89924 19778
TOML 3 57 36 12 9
Unreal Script 5 618 371 156 91
Apache Velocity 1 15 15 0 0
Vim Script 1 42 33 6 3
XSL 10 200 122 52 26
XML 32 26269 23572 1452 1245
YAML 5673 648526 529448 23888 95190
─────────────────────────────────────────────────────────────────────────────────
HTML 2 29 25 0 4
|- JavaScript 1 7 7 0 0
(Total) 36 32 0 4
─────────────────────────────────────────────────────────────────────────────────
Markdown 9 534 0 385 149
|- BASH 1 2 2 0 0
|- C 1 20 12 6 2
|- Rust 1 98 76 13 9
|- YAML 1 25 22 0 3
(Total) 679 112 404 163
─────────────────────────────────────────────────────────────────────────────────
Rust 473 143187 114374 13573 15240
|- Markdown 351 39084 913 29885 8286
(Total) 182271 115287 43458 23526
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total 89042 42584526 32359896 4893147 5331483
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
它在 一分钟内 完成,并与 scc 的结果紧密匹配(参见下一节)。
方法 3:scc(最快,带有复杂度指标)
scc 与 tokei 的准确性相匹配。它还报告每种语言的 圈复杂度。这对于理解内核的哪些部分最难维护很有用。
确保系统已安装 Golang,然后运行以下命令安装 scc:
go install github.com/boyter/scc/v3@latest
现在,运行:
scc .
示例输出:
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
C 36,910 26,320,472 3,795,058 2,909,421 19,615,993 2,566,279
C Header 26,813 10,822,880 791,303 1,614,799 8,416,778 66,444
Device Tree 6,343 2,097,441 280,886 92,367 1,724,188 36
YAML 5,672 648,427 104,949 25,934 517,544 0
ReStructuredTe… 4,011 820,556 197,878 0 622,678 0
Makefile 3,203 87,274 13,076 13,531 60,667 464
Assembly 1,348 377,036 41,691 49,680 285,665 3,505
Shell 1,174 220,250 37,034 26,897 156,319 12,925
JSON 1,043 607,008 2 0 607,006 0
Plain Text 981 109,702 19,777 0 89,925 0
Rust 473 182,419 15,156 52,407 114,856 10,808
Python 439 130,209 15,774 13,048 101,387 15,323
Jinja 149 1,187 76 145 966 193
SVG 87 57,503 98 1,311 56,094 2
Perl 67 46,073 6,048 4,183 35,842 5,246
BASH 63 3,399 513 413 2,473 324
DOT 36 1,261 81 62 1,118 0
XML 32 26,269 1,465 1,755 23,049 0
AWK 17 3,102 311 232 2,559 532
CSV 11 1,539 126 0 1,413 0
Extensible Sty… 10 200 26 0 174 0
Happy 10 6,013 723 0 5,290 0
LEX 10 2,940 366 355 2,219 0
Markdown 9 679 162 0 517 0
LD Script 8 390 60 29 301 0
C++ 7 2,291 241 81 1,969 332
Autoconf 6 459 34 30 395 11
License 5 422 84 0 338 0
Snakemake 5 153 15 13 125 0
Unreal Script 5 618 91 156 371 21
Alex 4 662 115 0 547 0
CSS 4 411 70 97 244 0
Raku 3 213 19 21 173 33
Systemd 3 167 25 63 79 0
TOML 3 57 8 12 37 0
Bazel 2 777 167 177 433 6
C++ Header 2 125 11 55 59 2
HEX 2 173 0 0 173 0
HTML 2 34 4 5 25 0
INI 2 13 2 5 6 0
Module-Definit… 2 157 20 0 137 4
bait 2 64 4 15 45 9
sed 2 106 23 53 30 0
CloudFormation… 1 99 17 2 80 0
Gherkin Specif… 1 336 40 97 199 0
MATLAB 1 89 17 37 35 3
Ruby 1 29 4 0 25 1
Scallop 1 3 0 0 3 0
TeX 1 234 6 73 155 0
Vim Script 1 42 3 12 27 5
XML Schema 1 404 46 0 358 0
───────────────────────────────────────────────────────────────────────────────
Total 88,988 42,582,367 5,323,705 4,807,573 32,451,089 2,682,508
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $1,473,621,894
Estimated Schedule Effort (organic) 219.99 months
Estimated People Required (organic) 595.12
───────────────────────────────────────────────────────────────────────────────
Processed 1595970277 bytes, 1595.970 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
在 v7.2-rc1 树上,scc 还估计了从头重建内核的成本。使用 COCOMO 有机模型,估计约为 $1.47 亿。你可以在输出末尾附近看到这个细节。
方法 4:wc -l(快速全文件完整性检查)
wc 命令计算每个文件中的每一行,无论类型如何。这包括二进制和非文本文件。它产生所有四个工具中最高的数字。
find . -not -path './.git/*' -type f \
| xargs wc -l 2>/dev/null \
| awk '/total/{sum += $1} END{print sum}'
示例输出:
43179595
请注意,wc 不是语言感知的代码计数器。但它为 Git 树中存储的 total 行数提供了一个有用的上限。
注意: 不要在末尾添加 | tail -1(即 -L)。当有数万个文件时,xargs 会将它们分成多个批次。每个批次打印自己的 total 行。使用 tail -1 只捕获最后一个批次的子 total。这会产生一个严重错误的结果。
工具比较
Linux 7.2 代码统计摘要
在提交 dc59e4fea9d8(标签:v7.2-rc1)上测量,2026 年 30 月 2026 日:
结论
突破 42 百万行 不仅仅是一个有趣的统计数据。它反映了世界上最大的协作软件项目之一的规模。
Linux 内核维护者不断添加对新硬件的支持。同时,他们删除已到达使用寿命终点的平台的代码。结果是一个在需要的地方增长、在可能的地方变得更干净的内核。
对于 Linux 爱好者来说,这个里程碑再次提醒我们内核开发的速度有多快。它也显示了支持从微小嵌入式板到世界上最快的超级计算机的所有一切需要多少工作。
来源:




