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:




