Nhân Linux đã đạt một cột mốc quan trọng mới. Cây phát triển Linux 7.2 mới nhất chứa khoảng 43.2 triệu total dòng trên tất cả các tệp được theo dõi, hoặc khoảng 42.6 triệu dòng mã thực tế (language-aware) theo các công cụ tokei và scc.

Chúng tôi đã độc lập kiểm chứng các con số này trên tag chính thức v7.2-rc1 bằng 4 công cụ đếm mã khác nhau. Dựa trên các phép đo của chúng tôi, đây là cây mã nguồn nhân Linux lớn nhất từ trước đến nay.

Thoạt nhìn, con số đó có vẻ rất lớn. Nhưng nó không có nghĩa là Linux đã trở nên phình to. Thay vào đó, nó cho thấy hai điều: lượng phần cứng mà Linux hỗ trợ ngày nay, và mức độ tích cực phát triển của nhân.

Hãy xem những gì đã thay đổi.

Linux 7.2 vượt mốc 42 triệu dòng

Tôi đã đo cây Git Linux 7.2-rc1 bằng nhiều công cụ đếm mã. Để minh họa, tôi sử dụng commit tag v7.2-rc1 chính xác (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

Dưới đây là kết quả từ mỗi công cụ:

Tôi đã chạy cả bốn công cụ trong cùng một phiên Fedora VM trên cùng một bản sao Git (dc59e4fea9d8) với cùng phiên bản công cụ. Điều này làm cho kết quả có thể so sánh trực tiếp và tái lập được.

Một thử nghiệm trước đó với cloc v1.96 cho ra total gần như giống hệt 40,414,638 dòng. Sự khác biệt nhỏ đến từ các cải tiến trong cloc v2.08, giúp nhận diện thêm một số định dạng tệp như Jinja Template và Snakemake.

Tokei và scc gần như hoàn toàn khớp nhau, cả hai đều báo cáo khoảng 42.58 triệu total dòng. Kết quả độc lập của chúng chỉ khác nhau 2,159 dòng (khoảng 0.005%), khiến chúng trở thành các phép đo ngôn ngữ nhất quán nhất của cây mã nguồn nhân.

So sánh, lần chạy mặc định của cloc đếm thiếu nhân khoảng 2.17 triệu dòng vì nó không nhận diện các tệp nguồn Device Tree Linux (.dts/.dtsi) theo mặc định. Tôi đã xác minh điều này bằng cách chạy lại cloc với:

cloc --force-lang="C",dts --force-lang="C",dtsi .

Điều này làm tăng total của cloc thêm khoảng 2.1 triệu dòng, đưa kết quả của nó gần với cả tokei và scc.

Tôi đã tái lập hành vi tương tự trên cả Linux 7.1 và 7.2-rc1, xác nhận rằng sự khác biệt đến từ khả năng nhận diện ngôn ngữ mặc định của cloc chứ không phải do thay đổi trong chính nhân.

Cách tiêu đề "43 triệu" được suy ra

Một đếm wc -l thô trên mọi tệp được theo dõi trong kho lưu trữ cho ra 43,179,595 dòng. Đây là nguồn gốc của tiêu đề "43 triệu dòng".

Có khoảng cách khoảng 597,000 dòng giữa con số này và total được báo cáo bởi tokei và scc. Sự khác biệt này tồn tại vì wc -l đếm mọi dòng trong mọi tệp được theo dõi, trong khi các công cụ nhận biết ngôn ngữ cố tình loại trừ hoặc phân loại nhiều tệp không phải nguồn khác nhau. Ví dụ bao gồm tài liệu, siêu dữ liệu, hình ảnh, chứng chỉ và các định dạng không phải nguồn hoặc không được nhận diện khác trong toàn bộ kho lưu trữ.

Cần lưu ý rằng một bản sao Git nhân Linux sạch không chứa tệp nhị phân .dtb đã biên dịch và không có thư mục firmware/ (các blob firmware được duy trì riêng trong kho linux-firmware). Do đó, các tệp đó không đóng góp vào sự khác biệt này.

Tóm lại, tiêu đề 43 triệu là chính xác về mặt kỹ thuật vì nó phản ánh mọi dòng được lưu trữ trong cây Git. Tuy nhiên, con số 42.58 triệu do tokei và scc báo cáo là phép đo chính xác hơn về mã nguồn của nhân.

Linux 7.2 tiếp tục tăng trưởng

Để đo mức tăng trưởng của nhân trong chu kỳ phát triển này, tôi đã lặp lại các phép đo tương tự trên bản phát hành Linux 7.1 cuối cùng, sử dụng cùng Fedora VM, phiên bản công cụ và phương pháp.

Kết quả cho thấy sự nhất quán đáng kể giữa cả ba phương pháp đo. Cả tokei và scc đều báo cáo rằng Linux đã tăng khoảng 563,000 dòng mã thực tế giữa Linux 7.1 và 7.2-rc1, tương ứng với mức tăng trưởng khoảng 1.3% trong một chu kỳ phát triển. Một đếm wc -l thô cho thấy mức tăng tương tự là 572,677 dòng.

Nghe có vẻ ấn tượng, nhưng điều này hoàn toàn được mong đợi. Mỗi bản phát hành nhân Linux đều bổ sung hỗ trợ cho các bộ xử lý, nền tảng, hệ thống tệp, trình điều khiển, công nghệ ảo hóa và cải tiến bảo mật mới, đồng thời tiếp tục tinh chỉnh các hệ thống con hiện có.

Theo ghi chú phát hành cuối cùng của Linux 7.1, hơn 2,000 nhà phát triển đã đóng góp thay đổi, bao gồm hơn 300 người đóng góp lần đầu. Sự đóng góp bền bỉ ở quy mô đó tự nhiên dẫn đến sự tăng trưởng ổn định của cây mã nguồn theo thời gian.

Linux tiếp tục tăng trưởng ngay cả sau khi xóa mã cũ

Một khía cạnh đáng ngạc nhiên của cột mốc này là mã nhân Linux tiếp tục tăng ngay cả khi loại bỏ mã kế thừa.

Linux 7.1 bắt đầu ngừng hỗ trợ bộ xử lý i486 của Intel, loại bỏ hơn 140,000 dòng mã lỗi thời, bao gồm các bộ điều khiển PCMCIA kế thừa và trình điều khiển ISDN. Linux 7.2 tiếp tục dọn dẹp bằng cách loại bỏ thêm mã liên quan đến i486 cùng với một số trình điều khiển lỗi thời và các thành phần x86 kế thừa.

Nói cách khác, các nhà phát triển Linux liên tục cân bằng giữa việc thêm mới và loại bỏ. Trong khi hỗ trợ phần cứng mới, kiến trúc, trình điều khiển, hệ thống tệp và tính năng bảo mật mới mở rộng nhân, mã lỗi thời thường xuyên được loại bỏ để giảm gánh nặng bảo trì và giữ cho dự án hiện đại.

Tại sao nhân Linux lại lớn như vậy?

Câu trả lời là trình điều khiển.

Nhân Linux hỗ trợ một loạt phần cứng đáng kinh ngạc. Mọi card đồ họa, bộ điều khiển lưu trữ, bộ điều hợp mạng, tính năng laptop, thiết bị USB và nền tảng nhúng đều cần hỗ trợ từ nhân.

Khi phần cứng mới ra mắt thị trường, các nhà phát triển thêm trình điều khiển mới. Đồng thời, họ duy trì khả năng tương thích với các thiết bị hiện có. Do đó, hầu hết sự tăng trưởng của nhân đến từ hỗ trợ phần cứng. Rất ít sự tăng trưởng đến từ mã lập lịch hoặc quản lý bộ nhớ cốt lõi của nhân.

AMDGPU vẫn là trình điều khiển lớn nhất

Người đóng góp lớn nhất vẫn là hệ thống con đồ họa AMD.

Trình điều khiển kết hợp AMDGPU và AMDKFD chứa khoảng 6.35 triệu dòng mã. Điều này làm cho nó trở thành trình điều khiển lớn nhất trong toàn bộ nhân Linux.

Linus Torvalds đã chỉ ra một điều thú vị. Khoảng một phần ba của một pull request lớn bao gồm các tệp định nghĩa thanh ghi AMD GPU. Các tệp này chủ yếu là dữ liệu được sinh ra. Chúng giúp Linux giao tiếp với phần cứng đồ họa AMD hiện đại.

Lớn hơn không có nghĩa là chậm hơn

Nhiều người cho rằng nhiều dòng mã hơn đồng nghĩa với phần mềm chậm hơn. Đó không phải là cách nhân Linux hoạt động.

Hầu hết mã bổ sung tồn tại để hỗ trợ phần cứng mà nhiều người dùng sẽ không bao giờ sở hữu. Phần lớn nó nằm trong các mô-đun có thể tải. Các mô-đun này chỉ kích hoạt khi phần cứng tương ứng có mặt.

Kết quả là, nhân tiếp tục cải thiện trong khi mở rộng khả năng tương thích phần cứng. Điều này áp dụng cho máy tính để bàn, máy chủ, máy tính xách tay, hệ thống nhúng, nền tảng đám mây và siêu máy tính.

Đếm tổng số dòng trong mã nhân Linux

Bất kỳ ai cũng có thể sao chép kho lưu trữ nhân Linux và đo nó. Đầu tiên, lấy mã nguồn nhân:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux

Một bản sao đầy đủ có kích thước khoảng 5 GB. Bạn có thể thêm --depth=1 vào lệnh git để có bản sao nông (shallow clone) thay thế (khoảng 1.5 GB):

git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Trong hướng dẫn này, tôi đã sử dụng bản sao đầy đủ.

Phương pháp 1: cloc (công cụ tham khảo phổ biến)

cloc là công cụ thường được sử dụng nhất để đếm dòng nhân.

# Install
sudo apt install cloc        # Debian/Ubuntu
sudo dnf install cloc        # Fedora/RHEL
sudo pacman -S cloc          # Arch

Bây giờ, chạy:

cloc --progress=1 .

Lưu ý dấu chấm (.) ở cuối. Nghĩa là chúng ta yêu cầu cloc phân tích thư mục hiện tại.

Tùy thuộc vào phần cứng của bạn, cloc có thể mất vài phút để quét toàn bộ cây mã nguồn Linux. Trên Fedora VM của tôi, nó hoàn thành trong khoảng 3–4 phút.

Đầu ra mẫu:

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
----------------------------------------------------------------------------------------

Lưu ý: cloc không nhận diện các tệp nguồn Device Tree (.dts/.dtsi). Đây là một phần lý do tại sao nó đếm thiếu nhân (xem phân tích ở đầu hướng dẫn này).

Để chỉ đo trình điều khiển đồ họa AMD, chạy:

cloc drivers/gpu/drm/amd

Phương pháp 2: tokei (nhanh hơn và chính xác hơn, khuyến nghị)

tokei nhanh hơn đáng kể so với cloc. Nó cũng đếm chính xác các tệp Device Tree. Điều này làm cho nó trở thành lựa chọn chính xác hơn cho nhân Linux.

Đầu tiên, đảm bảo Rust được cài đặt trên hệ thống của bạn. Sau đó, cài đặt tokei bằng trình quản lý gói cargo:

cargo install tokei

tokei cũng có sẵn trong kho chính thức của một số bản phân phối, vì vậy bạn có thể cài đặt nó bằng trình quản lý gói mặc định như sau:

sudo apt install tokei
brew install tokei

Bây giờ, chạy:

tokei .

Đầu ra mẫu:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Nó hoàn thành trong dưới một phút và khớp chặt chẽ với kết quả của scc (xem phần tiếp theo).

Phương pháp 3: scc (nhanh nhất, có số liệu độ phức tạp)

scc khớp với độ chính xác của tokei. Nó cũng báo cáo độ phức tạp cyclomatic theo từng ngôn ngữ. Điều này hữu ích để hiểu phần nào của nhân khó bảo trì nhất.

Đảm bảo Golang được cài đặt trên hệ thống của bạn và sau đó chạy lệnh sau để cài đặt scc:

go install github.com/boyter/scc/v3@latest

Bây giờ, chạy:

scc .

Đầu ra mẫu:

───────────────────────────────────────────────────────────────────────────────
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)
───────────────────────────────────────────────────────────────────────────────

Trên cây v7.2-rc1, scc cũng ước tính chi phí để xây dựng lại nhân từ đầu. Ước tính khoảng $1.47 tỷ, sử dụng mô hình COCOMO hữu cơ. Bạn có thể thấy chi tiết này gần cuối đầu ra.

Phương pháp 4: wc -l (kiểm tra nhanh tất cả tệp)

Lệnh wc đếm mọi dòng trong mọi tệp, bất kể loại. Điều này bao gồm các tệp nhị phân và không phải văn bản. Nó cho ra con số cao nhất trong bốn công cụ.

find . -not -path './.git/*' -type f \
| xargs wc -l 2>/dev/null \
| awk '/total/{sum += $1} END{print sum}'

Đầu ra mẫu:

43179595

Xin lưu ý rằng wc không phải là công cụ đếm mã nhận biết ngôn ngữ. Nhưng nó cung cấp một giới hạn trên hữu ích cho total số dòng được lưu trữ trong cây Git.

Lưu ý: Không thêm | tail -1 ở cuối. Khi có hàng chục nghìn tệp, xargs chia chúng thành nhiều lô. Mỗi lô in ra dòng total riêng. Sử dụng tail -1 chỉ nắm được total con của lô cuối cùng. Điều này tạo ra kết quả sai nghiêm trọng.

So sánh công cụ

Tóm tắt thống kê mã Linux 7.2

Đo trên commit dc59e4fea9d8 (tag: v7.2-rc1), tháng 30, 2026:

Kết luận

Vượt qua 42 triệu dòng không chỉ là một thống kê thú vị. Nó phản ánh quy mô của một trong những dự án phần mềm hợp tác lớn nhất thế giới.

Những người bảo trì nhân Linux tiếp tục bổ sung hỗ trợ cho phần cứng mới. Đồng thời, họ loại bỏ mã cho các nền tảng đã hết vòng đời. Kết quả là một nhân phát triển ở nơi cần thiết và trở nên sạch hơn ở nơi có thể.

Đối với những người đam mê Linux, cột mốc này là một lời nhắc nhở khác về tốc độ phát triển của nhân. Nó cũng cho thấy bao nhiêu công việc đổ vào việc hỗ trợ mọi thứ, từ các bảng mạch nhúng nhỏ đến các siêu máy tính nhanh nhất thế giới.

Nguồn: