Linux
Linux là tên gọi dùng để chỉ các hệ điều hành tương tự UNIX được xây dựng xoay quanh nhân Linux và hệ sinh thái phần mềm của chúng. Theo nghĩa hẹp, Linux là nhâ...
| Phân loại | Hệ điều hành tương tự UNIX, Phần mềm tự do, Phần mềm nguồn mở |
|---|---|
| Thành phần cốt lõi | Nhân Linux |
| Nhà phát triển đầu tiên | Linus Torvalds |
| Phát hành lần đầu | ngày 17 tháng 9 năm 1991 |
| Ngôn ngữ triển khai nhân | C, Hợp ngữ, một phần Rust |
| Công cụ phát triển và xây dựng | Make, Kbuild, Kconfig, Tập lệnh shell, Perl, Python |
| Trình biên dịch chính | GCC, Clang |
| Kiến trúc nhân | Nhân nguyên khối, Mô-đun nhân có thể nạp |
| Nền tảng được hỗ trợ | x86, ARM, ARM64, RISC-V, PowerPC, MIPS, s390 và các nền tảng khác |
| Không gian người dùng | GNU, BusyBox, không gian người dùng Android và các hệ thống khác |
| Giấy phép nhân | GPL-2.0-only |
Linux là tên gọi dùng để chỉ các hệ điều hành tương tự UNIX được xây dựng xoay quanh nhân Linux và hệ sinh thái phần mềm của chúng. Theo nghĩa hẹp, Linux là nhân hệ điều hành được Linus Torvalds bắt đầu phát triển vào năm 1991. Theo nghĩa rộng, thuật ngữ này chỉ một hệ điều hành hoàn chỉnh kết hợp nhân Linux với các thư viện hệ thống, công cụ dòng lệnh, hệ thống khởi tạo, trình quản lý gói, môi trường đồ họa và các ứng dụng.[1]
Nhân Linux quản lý việc thực thi tiến trình và luồng, bộ nhớ ảo, hệ thống tệp, trình điều khiển thiết bị, mạng, bảo mật và tài nguyên phần cứng. Bản thân nhân không tạo thành một hệ điều hành hoàn chỉnh mà người dùng thông thường có thể sử dụng. Trong thực tế, một hệ thống được xây dựng bằng cách kết hợp nhiều thành phần không gian người dùng khác nhau bên trên nhân. Một tập hợp hệ điều hành lựa chọn các thành phần này và cung cấp kèm cơ chế cài đặt, cập nhật cùng cấu hình mặc định được gọi là một bản phân phối Linux.
Nhiều bản phân phối Linux sử dụng các công cụ hệ thống và thư viện do dự án GNU phát triển. Vì vậy, dự án GNU và Quỹ Phần mềm Tự do gọi các hệ thống này là GNU/Linux. Tuy nhiên, trong tài liệu kỹ thuật thông thường và môi trường công nghiệp, cách gọi toàn bộ hệ điều hành đơn giản là Linux đã trở nên phổ biến.[2] Bên cạnh đó, cũng tồn tại những hệ điều hành như Android, sử dụng nhân Linux nhưng không sử dụng không gian người dùng truyền thống lấy GNU làm trung tâm.
Linux không phải là một hệ điều hành trực tiếp kế thừa mã nguồn của UNIX, mà là một hệ thống triển khai độc lập các giao diện và nguyên tắc thiết kế tương tự UNIX. Ban đầu, Linux được phát triển cho máy tính cá nhân sử dụng bộ xử lý Intel 80386, nhưng về sau đã được chuyển sang nhiều kiến trúc bộ xử lý khác nhau, bao gồm x86, ARM, ARM64, PowerPC, RISC-V và s390.[3]
Theo truyền thống, nhân Linux sử dụng kiến trúc nguyên khối, nhưng cung cấp một hệ thống mô-đun nhân cho phép nạp hoặc gỡ bỏ trong thời gian chạy các chức năng như trình điều khiển thiết bị và hệ thống tệp. Kiến trúc này cho phép các chức năng cốt lõi hoạt động trong cùng một không gian địa chỉ của nhân, đồng thời vẫn có thể kết hợp có chọn lọc các thành phần dành cho từng loại phần cứng và chức năng.
Mã nguồn chính thức của nhân Linux được phân phối theo các điều khoản GPL-2.0-only. Việc sửa đổi và phân phối lại mã nguồn nhân được cho phép, còn các tác phẩm phái sinh được phân phối phải tuân theo các điều kiện của giấy phép này. Các chương trình không gian người dùng thông thường sử dụng nhân thông qua lời gọi hệ thống được áp dụng một ngoại lệ riêng dành cho lời gọi hệ thống, vì vậy chương trình không bắt buộc phải sử dụng cùng giấy phép với nhân.[4]
Linux được sử dụng trong nhiều môi trường khác nhau, bao gồm máy chủ, điện toán đám mây, siêu máy tính, thiết bị mạng, điện thoại thông minh, thiết bị nhúng, hệ thống ô tô và máy tính cá nhân. Thay vì một tổ chức trung tâm duy nhất phát triển toàn bộ hệ điều hành như một sản phẩm thống nhất, Linux hình thành một hệ sinh thái phân tán, trong đó cộng đồng phát triển nhân, các dự án phân phối, nhà sản xuất phần cứng, doanh nghiệp và các nhà phát triển cá nhân cùng phát triển và tích hợp những thành phần khác nhau.
Lịch sử
Ảnh hưởng của UNIX và MINIX
Quá trình phát triển Linux chịu ảnh hưởng từ UNIX và MINIX, một hệ thống được triển khai lại nhằm phục vụ giáo dục. Sau khi tiếp xúc với UNIX tại Đại học Helsinki vào năm 1990, Linus Torvalds bắt đầu quan tâm đến hệ điều hành cũng như chế độ bảo vệ, cơ chế quản lý bộ nhớ và khả năng đa nhiệm của bộ xử lý Intel 80386. Vào thời điểm đó, các hệ thống UNIX thương mại được sử dụng tại trường đại học và doanh nghiệp có nhiều hạn chế về giá cả và khả năng tiếp cận, khiến cá nhân khó có thể cài đặt chúng trên máy tính của mình và tự do sửa đổi phần bên trong.
Torvalds đã cài đặt MINIX, hệ điều hành do Andrew Tanenbaum phát triển để phục vụ giảng dạy về hệ điều hành, trên máy tính cá nhân sử dụng bộ xử lý 80386 của mình. MINIX được cung cấp kèm mã nguồn nên có thể dùng để nghiên cứu cấu trúc hệ điều hành, nhưng hệ thống này chú trọng thiết kế đơn giản cho mục đích giáo dục và phiên bản khi đó chưa tận dụng đầy đủ các chức năng của 80386. Torvalds sử dụng MINIX làm môi trường phát triển và tài liệu tham khảo, nhưng không sao chép mã nguồn MINIX vào Linux mà tự viết một nhân mới một cách độc lập.
Linux sử dụng giao diện người dùng kiểu UNIX và cách bố trí hệ thống tệp ban đầu tương tự MINIX. Đây là một lựa chọn thực dụng nhằm giúp các chương trình UNIX hiện có dễ dàng được chuyển sang Linux, đồng thời cho phép bắt đầu quá trình phát triển và cài đặt bằng MINIX. Tuy nhiên, Linux không đi theo kiến trúc vi nhân của MINIX mà phát triển thành một nhân nguyên khối, trong đó quản lý tiến trình, quản lý bộ nhớ, hệ thống tệp và trình điều khiển thiết bị được đặt trong cùng một không gian địa chỉ của nhân.
Torvalds cũng tham khảo giao diện POSIX để xây dựng một môi trường tương thích với các chương trình UNIX. Vào tháng 7 năm 1991, ông đã hỏi trên nhóm tin comp.os.minix liệu có thể tìm được tài liệu tiêu chuẩn POSIX ở dạng máy có thể đọc hay không. Đối với những phần không thể tiếp cận đầy đủ tài liệu tiêu chuẩn, ông tham khảo tài liệu UNIX có sẵn tại trường đại học và các tài liệu liên quan đến MINIX để triển khai lời gọi hệ thống.[5]
Việc Linux giống UNIX không có nghĩa là nó kế thừa mã nguồn gốc của UNIX. Linux là một nhân tương tự UNIX, triển khai lại bằng mã mới các hành vi và giao diện mà chương trình UNIX mong đợi, còn MINIX là nền tảng giúp bắt đầu quá trình phát triển và chuẩn bị các chương trình ban đầu.
Từ chương trình đầu cuối đến nhân hệ điều hành
Ngay từ đầu, Torvalds không lập kế hoạch xây dựng một hệ điều hành hoàn chỉnh. Đầu năm 1991, ông bắt đầu viết một chương trình đầu cuối trên máy tính 80386 của mình để kết nối với hệ thống UNIX của Đại học Helsinki và đọc các nhóm tin.
Chương trình này không phải là một ứng dụng thông thường chạy bên trên một hệ điều hành hiện có, mà trực tiếp điều khiển phần cứng sau khi máy tính khởi động. Để tìm hiểu chế độ bảo vệ và chức năng chuyển đổi tác vụ của 80386, Torvalds đã tạo một chương trình trong đó hai tiến trình luân phiên xuất ký tự lên màn hình, sau đó bổ sung xử lý bàn phím và truyền thông nối tiếp. Để lưu nội dung trao đổi với máy tính của trường đại học, ông cũng triển khai trình điều khiển đĩa và chức năng hệ thống tệp.
Khi chức năng chuyển đổi tiến trình, xử lý ngắt, nhập liệu đầu cuối, truy cập đĩa và hệ thống tệp lần lượt được bổ sung, chương trình đầu cuối đơn giản này dần mang hình dạng gần với một nhân hệ điều hành. Sau đó Torvalds bắt đầu triển khai các lời gọi hệ thống để có thể chạy chương trình UNIX trong môi trường này. Về sau, ông giải thích rằng đến một thời điểm nào đó mình nhận ra đã xây dựng được một phần đáng kể các chức năng cần thiết cho một nhân hệ điều hành.[6]
Quá trình phát triển ban đầu được thực hiện trên MINIX. Torvalds sử dụng GCC trong MINIX để biên dịch nhân Linux, ghi ảnh nhân được tạo ra vào đĩa mềm rồi khởi động lại máy tính để thử nghiệm. Khi Linux bị treo hoặc xảy ra lỗi, ông lại khởi động vào MINIX, sửa mã nguồn và lặp lại cùng một quy trình.
Vì vậy, Linux ban đầu chưa thể tự cung cấp một môi trường phát triển hoàn toàn độc lập chỉ bằng nhân của nó. Để xây dựng nhân và chuẩn bị đĩa, vẫn cần MINIX và GCC chạy trên MINIX. Linux trước hết được tạo ra và khởi động với sự trợ giúp của một hệ điều hành khác, sau đó dần phát triển thành môi trường có thể tự chạy chương trình và tự biên dịch lại chính nó.
Môi trường hệ điều hành chạy các chương trình GNU
Chỉ riêng nhân Linux không thể cho phép người dùng nhập lệnh, biên dịch chương trình hoặc quản lý tệp. Để thử nghiệm nhân trong thực tế, Torvalds đã chuyển sang Linux các chương trình GNU vốn đã được phát triển dưới dạng phần mềm tự do.
Các chương trình cốt lõi được chuyển sang trong giai đoạn đầu gồm Bash và GCC. Bash cung cấp một shell để người dùng nhập lệnh và chạy chương trình, còn GCC biên dịch mã nguồn C thành tệp thực thi. Sau đó, GNU Make, GNU Sed, các công cụ quản lý tệp, chương trình nén và nhiều công cụ khác cũng có thể chạy trên Linux.
Vào tháng 8 năm 1991, Torvalds cho biết ông đã chạy thành công Bash 1.08 và GCC 1.40 trên Linux. Điều này cho thấy dù bản thân nhân chưa phải là toàn bộ hệ điều hành, nó vẫn có thể kết hợp với các chương trình không gian người dùng hiện có để tạo thành một môi trường kiểu UNIX có khả năng thực hiện công việc thực tế.[7]
Các tệp thực thi ban đầu được chuẩn bị chéo trong MINIX. Sau khi đặt các tệp nhị phân Bash và GCC dành cho Linux cùng hệ thống tệp gốc lên đĩa bằng MINIX, người dùng khởi động Linux và nhân sẽ thực thi chúng. Ở giai đoạn này, Linux đảm nhiệm việc khởi động và thực thi tiến trình, còn môi trường dòng lệnh và công cụ phát triển mà người dùng nhìn thấy do các chương trình GNU cung cấp.
Linux 0.02 có thể chạy Bash, GCC, GNU Make, GNU Sed và các chương trình khác, nhưng vẫn cần MINIX để biên dịch và cài đặt nhân. Khi đó, Torvalds mô tả Linux không phải là một hệ thống độc lập dành cho người dùng không có MINIX, mà là một nhân dành cho các nhà phát triển quan tâm đến hệ điều hành và bộ xử lý 80386.[8]
Khi nhân, thư viện và trình biên dịch tiếp tục phát triển, người ta có thể biên dịch chính nhân Linux trên Linux. Khi môi trường phát triển không còn phụ thuộc vào MINIX, Linux trở thành một hệ thống tự lưu trữ, có khả năng xây dựng mã nguồn của chính nó trong môi trường thực thi của mình. Quá trình này là một bước quan trọng trong sự chuyển đổi của Linux từ một nhân có thể khởi động thành nền tảng cho một hệ điều hành độc lập.
Việc Linux kết hợp với các công cụ GNU giúp loại bỏ nhu cầu phải phát triển toàn bộ không gian người dùng mới từ đầu. Dự án GNU đã có sẵn shell, trình biên dịch, trình liên kết, công cụ xử lý tệp nhị phân, chương trình quản lý tệp và nhiều tiện ích tương thích UNIX, nhưng nhân GNU Hurd mà GNU đang phát triển khi đó vẫn chưa hoàn thiện. Ngược lại, Linux có một nhân hoạt động được nhưng thiếu không gian người dùng hoàn chỉnh. Khi hai thành phần này kết hợp, một môi trường hệ điều hành kiểu UNIX hoàn chỉnh và có thể sử dụng tự do được hình thành trong thời gian tương đối ngắn.
Công bố và khởi đầu của quá trình phát triển cộng tác
Ngày 25 tháng 8 năm 1991, Torvalds thông báo trên nhóm tin comp.os.minix rằng ông đang xây dựng một hệ điều hành tự do dành cho các máy tính tương thích AT sử dụng bộ xử lý 386 và 486. Ông mô tả đây là một dự án sở thích và yêu cầu người dùng MINIX chia sẻ ý kiến về những chức năng họ thích hoặc cảm thấy bất tiện.
Bài viết này gần với lời kêu gọi người tham gia vào một hệ thống đang được phát triển hơn là thông báo về một sản phẩm hoàn chỉnh. Torvalds giải thích rằng hệ thống có một số điểm tương tự MINIX nhưng không chứa mã MINIX, phụ thuộc nhiều vào phần cứng 80386 và chỉ hỗ trợ loại đĩa cứng AT mà ông sở hữu.[9]
Mã nguồn Linux 0.01 được công bố vào tháng 9 năm 1991 trên máy chủ FUNET tại Phần Lan. Phiên bản này không phải là một hệ thống hoàn chỉnh mà người dùng thông thường có thể cài đặt và sử dụng ngay, mà gần với mã nguồn phục vụ phát triển, đòi hỏi môi trường và công cụ thực thi riêng. Ari Lemmke, người quản lý máy chủ FTP, đã dùng tên Linux cho thư mục trên máy chủ thay vì Freax, tên mà Torvalds từng nghĩ đến, và Linux từ đó trở thành tên chính thức của dự án.
Linux 0.02, được công bố vào tháng 10 năm 1991, có thể chạy các chương trình như Bash và GCC. Torvalds cung cấp toàn bộ mã nguồn nhân và đề nghị các nhà phát triển khác xem xét mã hoặc thử sửa đổi những chức năng họ cần. Khi đó Linux có quy mô nhỏ, tương đối phù hợp để một nhà phát triển cá nhân có thể hiểu toàn bộ cấu trúc và trực tiếp bổ sung chức năng.
Sau khi mã nguồn được công khai qua Internet, nhiều nhà phát triển bắt đầu thử nghiệm Linux trên phần cứng của riêng họ, gửi báo cáo lỗi và mã sửa đổi. Hỗ trợ cho các bộ điều khiển đĩa, card đồ họa và thiết bị mạng mà Torvalds không thể tự tiếp cận được bổ sung thông qua đóng góp từ bên ngoài. Các nhà phát triển khác nhau cũng bắt đầu phụ trách hệ thống tệp mới, chức năng mạng và cải tiến quản lý bộ nhớ.
Phương thức phát triển công khai của Linux khác với cách một nhà phát triển hoàn thiện toàn bộ thiết kế trước rồi mới phân phối sản phẩm đã triển khai. Một phiên bản ban đầu có thể chạy được được công bố nhanh chóng, sau đó kết quả thử nghiệm và bản vá từ người dùng thực tế liên tục được tích hợp. Torvalds dần chuyển từ vai trò trực tiếp viết toàn bộ mã sang vai trò người bảo trì, xem xét các thay đổi và quyết định đoạn mã nào sẽ được đưa vào phiên bản chính thức.
Thay đổi giấy phép và sự phổ biến
Linux ban đầu sử dụng giấy phép riêng của Torvalds, cho phép sử dụng và phân phối lại mã nguồn nhưng hạn chế việc phân phối để đổi lấy tiền. Điều kiện này có thể hạn chế hoạt động của các nhà phân phối và doanh nghiệp muốn bán bản sao phần mềm hoặc cung cấp phần mềm cùng dịch vụ hỗ trợ trả phí.
Khi công bố Linux 0.12, Torvalds cho biết ông sẽ loại bỏ điều kiện cấm phân phối thương mại và thay đổi giấy phép để tương thích với các điều khoản copyleft của GNU. Điều kiện mới bắt đầu được áp dụng từ tháng 2 năm 1992, và Linux sau đó được phân phối theo phiên bản 2 của GNU GPL.[10]
GPL cho phép bất kỳ ai sử dụng, sửa đổi Linux và bán các bản sao của nó. Đổi lại, khi phân phối một nhân đã sửa đổi, nhà phân phối phải cung cấp cho người nhận mã nguồn tương ứng và cùng các quyền tự do đó. Cấu trúc này ngăn Linux bị một doanh nghiệp cụ thể chuyển đổi thành sản phẩm độc quyền, đồng thời vẫn cho phép hoạt động kinh doanh dựa trên việc bán bản phân phối, phương tiện cài đặt, hỗ trợ kỹ thuật và phần cứng.
Việc thay đổi giấy phép giúp Linux và không gian người dùng GNU dễ dàng được phân phối cùng nhau hơn cả về mặt pháp lý lẫn kỹ thuật. Các trường đại học và nhà phát triển cá nhân có thể tải hệ thống về nghiên cứu mà không phải trả phí, còn doanh nghiệp có thể đưa Linux vào sản phẩm hoặc bán cho khách hàng, đồng thời trực tiếp phát triển những chức năng cần thiết. Khi kết quả phát triển được công bố trở lại, người dùng và doanh nghiệp khác cũng có thể tận dụng chúng.
Khoảng thời gian Linux 0.12, các chức năng như bộ nhớ ảo và điều khiển tác vụ được bổ sung, đồng thời các ảnh đĩa có thể cài đặt cũng bắt đầu được cung cấp. Số lượng người muốn thử Linux tăng lên, và phương thức tự tìm rồi kết hợp nhân cùng nhiều công cụ khác nhau từ một máy chủ FTP duy nhất dần bộc lộ hạn chế.
Sự xuất hiện của các bản phân phối đầu tiên
Người dùng Linux thời kỳ đầu phải tải ảnh nhân, Bash, GCC, thư viện C, công cụ quản lý tệp và chương trình cài đặt từ nhiều địa chỉ FTP khác nhau rồi tự kết hợp chúng. Họ cũng phải điều chỉnh để các phiên bản thư viện mà từng chương trình yêu cầu tương thích với nhau, trong khi việc chuẩn bị phân vùng đĩa cứng, đĩa khởi động và đĩa gốc phần lớn được thực hiện thủ công.
Để giải quyết vấn đề này, các bản phân phối Linux xuất hiện, cung cấp nhân, chương trình không gian người dùng, thư viện và quy trình cài đặt trong một gói thống nhất. Bản phân phối không tạo ra một nhân hệ điều hành mới mà lựa chọn nhân Linux, sau đó quản lý các chương trình, thiết lập và phương thức cài đặt, cập nhật được sử dụng bên trên nhân đó.
Trong giai đoạn đầu của Linux đã tồn tại nhiều gói không chính thức tập hợp đĩa khởi động và hệ thống tệp gốc, vì vậy việc xác định đâu là bản phân phối đầu tiên phụ thuộc vào tiêu chí sử dụng. Có thể tính cả những bộ sưu tập ban đầu chỉ đóng gói tệp thực thi Linux và các công cụ, nhưng MCC Interim Linux thường được nhắc đến như bản phân phối đầu tiên cho phép xây dựng một hệ thống Linux độc lập thông qua quy trình cài đặt mà không cần một hệ điều hành khác.
MCC Interim Linux do Owen Le Blanc tại Trung tâm Máy tính Manchester của Anh tạo ra và được công bố lần đầu vào tháng 2 năm 1992. Khi cài đặt Linux 0.11, Le Blanc gặp bất tiện vì phải tìm riêng các công cụ phân vùng hoạt động được và những chương trình cần thiết từ nhiều nơi khác nhau. Với mục tiêu cung cấp một quy trình cài đặt đơn giản và hoàn chỉnh hơn, cùng chức năng sao lưu và khôi phục, ông đã đóng gói nhân và nhiều tiện ích thành một bộ đĩa mềm.[11]
MCC Interim Linux tự động hóa một phần quá trình cài đặt, nhưng phạm vi phần mềm đi kèm còn hạn chế. SLS, xuất hiện cùng năm, cung cấp một hệ thống lớn hơn bao gồm X Window System, chương trình mạng và công cụ phát triển, nhờ đó được sử dụng rộng rãi. SLS cho phép người dùng cài đặt một môi trường kiểu UNIX tương đối hoàn chỉnh mà không cần tự lắp ráp Linux, đồng thời trực tiếp ảnh hưởng đến nhiều bản phân phối xuất hiện sau đó.
Patrick Volkerding không hài lòng với phương thức cài đặt và quản lý chất lượng của SLS nên đã tạo ra một hệ thống sửa đổi từ nó. Theo yêu cầu của người dùng, hệ thống này được công bố vào tháng 7 năm 1993 dưới tên Slackware 1.0.[12] Slackware duy trì cấu trúc tương đối đơn giản và phương thức quản trị gần với UNIX, trở thành một bản phân phối được phát triển trong thời gian dài.
Cuối năm 1992, Yggdrasil Linux/GNU/X xuất hiện. Yggdrasil là một trong những bản phân phối thương mại đầu tiên sử dụng CD-ROM làm phương tiện phân phối chính và cung cấp môi trường có thể chạy hệ thống trực tiếp từ đĩa CD. Đối với người dùng có kết nối Internet chậm hoặc không được cung cấp kết nối, CD-ROM là một phương tiện hiệu quả để phân phối khối lượng lớn phần mềm.
Tháng 8 năm 1993, Ian Murdock khởi động dự án Debian. Debian tiến xa hơn phương thức một cá nhân hoặc doanh nghiệp công bố một bản phân phối hoàn chỉnh, với mục tiêu biến chính bản phân phối thành một dự án phát triển cộng tác công khai. Dự án chia phần mềm thành các gói nhỏ, quản lý có hệ thống quan hệ phụ thuộc và quá trình nâng cấp, đồng thời hình thành một cơ cấu vận hành cho phép bất kỳ ai cũng có thể tham gia phát triển.[13]
Từ giai đoạn này, người dùng Linux bắt đầu lựa chọn các bản phân phối có mục đích và phương thức vận hành khác nhau thay vì tự lắp ráp nhân. Bản phân phối đảm nhiệm việc cài đặt, quản lý gói, sửa lỗi bảo mật, tài liệu và hỗ trợ người dùng, cho phép các nhà phát triển nhân Linux tập trung vào phần cứng và các chức năng cốt lõi của hệ điều hành.
Linux 1.0 và sự mở rộng nhận thức đại chúng
Linux đã được biết đến qua Usenet và FTP từ giai đoạn đầu, nhưng ban đầu chủ yếu được sử dụng bởi các nhà phát triển hệ điều hành, người dùng tại trường đại học và các kỹ thuật viên quen thuộc với UNIX. Do quá trình cài đặt phức tạp và phần cứng được hỗ trợ còn hạn chế, đây chưa phải là một hệ thống mà người dùng máy tính cá nhân thông thường có thể dễ dàng tiếp cận.
Khi các bản phân phối tổ chức lại quy trình cài đặt và cấu hình chương trình, phạm vi người dùng có thể thử Linux được mở rộng. Tại các trường đại học và viện nghiên cứu, khả năng sử dụng môi trường phát triển UNIX và dịch vụ mạng trên các máy tính 386 và 486 thông thường thay cho máy trạm UNIX đắt tiền bắt đầu được chú ý. Sinh viên và nhà phát triển có thể đọc và sửa đổi toàn bộ mã nguồn hệ điều hành, sau đó chia sẻ ngay các thay đổi qua Internet.
Khi số lượng nhóm tin, danh sách thư và máy chủ nhân bản FTP liên quan đến Linux tăng lên, quá trình phát triển cũng diễn ra nhanh hơn. Số người dùng càng tăng thì Linux càng được thử nghiệm trên nhiều phần cứng hơn, dẫn đến việc bổ sung các trình điều khiển thiết bị, hệ thống tệp và chức năng mạng mới. Những chức năng được cải tiến lại được chuyển đến nhiều người dùng hơn thông qua các bản phân phối, tạo thành một chu trình liên tục.
Ngày 14 tháng 3 năm 1994, Linux 1.0 được công bố.[14] Phiên bản 1.0 tượng trưng cho việc Linux đã vượt qua giai đoạn dự án cá nhân mang tính thử nghiệm và đạt đến mức có thể được gán một số phiên bản ổn định. Với mạng TCP/IP, nhiều hệ thống tệp, bộ nhớ ảo và môi trường tiến trình kiểu UNIX, Linux có thể được sử dụng trong thực tế làm máy chủ Internet và hệ thống phát triển.
Khoảng thời gian Linux 1.0, sách và tạp chí chuyên về Linux, nhóm người dùng và các bản phân phối thương mại bắt đầu xuất hiện. Linux không chỉ có thể được tải miễn phí qua Internet mà còn được phân phối dưới dạng phương tiện cài đặt đi kèm CD-ROM và sách, nhờ đó tiếp cận được cả những người dùng có khả năng truy cập mạng hạn chế.
Linux không bị ràng buộc với máy tính của một nhà sản xuất cụ thể mà chạy trên máy tính cá nhân đa dụng. Các nhà phát triển UNIX hiện có có thể sử dụng shell, trình biên dịch và chương trình mạng quen thuộc. Nhờ khả năng tự do chuyển đổi và sửa đổi, các phòng thí nghiệm đại học, nhà cung cấp dịch vụ Internet và doanh nghiệp nhỏ bắt đầu sử dụng Linux cho máy chủ web, thư điện tử, DNS, máy chủ tệp và nhiều mục đích khác.
Bản phân phối thương mại và ngành dịch vụ hỗ trợ
Khi Linux bắt đầu được sử dụng trong công việc thực tế, các doanh nghiệp xuất hiện không chỉ để cung cấp phương tiện cài đặt mà còn bán các gói phần mềm đã được kiểm chứng, bản cập nhật, tài liệu và hỗ trợ kỹ thuật. Những công ty như Red Hat và SUSE xây dựng bản phân phối dựa trên phần mềm được phân phối tự do, đồng thời cung cấp dịch vụ bảo trì và hỗ trợ dài hạn cho khách hàng doanh nghiệp.
Trong mô hình kinh doanh này, khách hàng không trả tiền chủ yếu cho quyền chạy phần mềm, mà trả cho một bản phân phối được cấu hình ổn định, các bản cập nhật bảo mật, khả năng xử lý sự cố và chứng nhận. Ngay cả khi mã nguồn được công khai, các tổ chức lớn vẫn cần một nhà cung cấp có trách nhiệm quyết định phiên bản nên sử dụng, kiểm chứng các thay đổi và ứng phó khi xảy ra lỗi.
Các công ty phân phối thuê nhà phát triển làm việc trên nhân và các dự án không gian người dùng để trực tiếp cải tiến chức năng. Họ bổ sung vào Linux các chức năng mà khách hàng doanh nghiệp yêu cầu, như hỗ trợ bộ nhớ dung lượng lớn, nhiều bộ xử lý, thiết bị lưu trữ, hiệu năng mạng, bảo mật và quản trị, rồi gửi các thay đổi đó lên dự án thượng nguồn. Việc đưa chức năng vào nhân chính thức có lợi hơn so với duy trì một bản sửa đổi riêng bên trong một doanh nghiệp, vì nó giúp duy trì khả năng tương thích với các phiên bản sau và giảm chi phí quản lý dài hạn.
Các nhà sản xuất phần cứng cũng mở rộng trình điều khiển và hỗ trợ nền tảng dành cho Linux. Khi hệ điều hành chạy ổn định trên máy chủ, bộ xử lý và thiết bị lưu trữ của họ, họ có thể thu hút khách hàng mới. Việc hỗ trợ một nhân chung cũng giúp giảm gánh nặng phải tự phát triển hoặc chuyển đổi riêng từng hệ điều hành tương tự UNIX khác nhau.
Sự chấp nhận và đóng góp của doanh nghiệp
Cuối thập niên 1990, Linux mở rộng sự hiện diện trên thị trường máy chủ Internet. Có thể xây dựng dịch vụ bằng cách kết nối nhiều máy chủ x86 giá rẻ, trong khi các chương trình máy chủ UNIX có thể được chuyển sang tương đối dễ dàng. Những công việc không phụ thuộc vào môi trường đồ họa máy tính để bàn, như máy chủ web, cơ sở dữ liệu và dịch vụ mạng, là các lĩnh vực đầu tiên Linux giành được khả năng cạnh tranh.
Lý do doanh nghiệp chấp nhận Linux, một hệ thống do một cá nhân khởi xướng, nằm ở các điều kiện kỹ thuật và kinh tế mà hệ thống cung cấp chứ không phải xuất thân của nhà phát triển. Không giống các hệ điều hành độc quyền của một nhà sản xuất phần cứng cụ thể, Linux có thể được chuyển sang thiết bị của nhiều nhà sản xuất, đồng thời cho phép truy cập mã nguồn để trực tiếp sửa đổi chức năng và lỗi cần thiết. Việc tận dụng kiến thức và phần mềm của các nhà phát triển UNIX hiện có cũng tương đối dễ dàng.
Đối với doanh nghiệp, Linux không chỉ đơn giản là một hệ điều hành miễn phí. Hệ thống giúp giảm chi phí cấp phép phần mềm, đồng thời cho phép lựa chọn phần cứng và nhà cung cấp hỗ trợ, qua đó giảm sự phụ thuộc dài hạn vào sản phẩm của một nhà cung cấp cụ thể. Nhiều doanh nghiệp cũng có thể cùng chia sẻ chi phí phát triển một nhân chung, trong khi mỗi công ty bán phần cứng, phần mềm trung gian, cơ sở dữ liệu và hỗ trợ kỹ thuật của riêng mình.
Trong các năm 1998 và 1999, Intel đầu tư vào Red Hat, còn IBM, Hewlett-Packard, Silicon Graphics và nhiều nhà sản xuất phần cứng khác công bố kế hoạch hỗ trợ Linux. Năm 1999, IBM tuyên bố sẽ hợp tác với Red Hat để hỗ trợ Linux trên máy chủ và máy trạm của mình. Một trong những rào cản lớn đối với việc áp dụng Linux trong doanh nghiệp khi đó là thiếu nhà cung cấp chịu trách nhiệm hỗ trợ khi xảy ra vấn đề. Sự tham gia của IBM và các nhà sản xuất máy chủ lâu đời đã đem lại độ tin cậy thương mại cho Linux.[15]
Sau đó, IBM chuyển Linux không chỉ sang máy chủ x86 mà còn sang hệ thống Power và máy tính lớn S/390, đồng thời đầu tư 1 tỷ đô la Mỹ vào phát triển và tiếp thị Linux trong năm 2001. Thay vì bán giấy phép Linux, IBM có thể bán máy chủ chạy Linux, phần mềm trung gian, cơ sở dữ liệu, dịch vụ tư vấn và hỗ trợ kỹ thuật. Việc hỗ trợ Linux như một nền tảng chung cũng cho phép công ty cung cấp cùng một hệ sinh thái phần mềm trên nhiều dòng sản phẩm phần cứng của mình.[16]
Sự tham gia của doanh nghiệp không biến Linux thành một hệ điều hành thương mại khép kín. Theo GPL, các thay đổi đối với nhân được phân phối phải đi kèm mã nguồn, còn để được đưa vào nhân chính thức, mã phải trải qua quá trình đánh giá công khai và được người bảo trì chấp thuận. Nhà phát triển doanh nghiệp và nhà phát triển cá nhân sử dụng cùng một quy trình phát triển, còn việc đóng góp có được chấp nhận hay không được quyết định dựa trên chất lượng mã, khả năng bảo trì và mức độ phù hợp với cấu trúc hiện có hơn là tổ chức mà người đóng góp trực thuộc.
Doanh nghiệp cùng chia sẻ chi phí phát triển Linux trong khi vẫn có được những chức năng cần thiết cho hoạt động kinh doanh riêng. Cộng đồng nhân nhận được các nhà phát triển toàn thời gian, thiết bị thử nghiệm, tài liệu, sự kiện và cơ sở hạ tầng do doanh nghiệp hỗ trợ. Thông qua mối quan hệ này, Linux phát triển từ một dự án chủ yếu dựa vào tình nguyện viên thành một dự án có nền tảng công nghiệp, được cùng phát triển bởi nhà phát triển cá nhân, trường đại học, công ty phân phối, nhà sản xuất bán dẫn và máy chủ, cùng các doanh nghiệp điện toán đám mây.
Từ máy chủ đến nhiều nền tảng khác nhau
Việc doanh nghiệp chấp nhận Linux trước hết mở rộng trong lĩnh vực máy chủ và thiết bị mạng. Trong môi trường máy chủ, tính ổn định, hiệu năng mạng, quản trị từ xa và tự động hóa quan trọng hơn giao diện đồ họa, còn Linux có thể tận dụng phương thức vận hành UNIX truyền thống và các chương trình máy chủ phần mềm tự do.
Ngoài máy chủ máy tính cá nhân đa dụng, Linux còn được chuyển sang máy tính lớn, siêu máy tính, bộ định tuyến và thiết bị nhúng. Vì mã nguồn được công khai, nhân có thể được sửa đổi cho phù hợp với kiến trúc bộ xử lý và thiết bị mới, đồng thời cũng có thể cấu hình một hệ thống nhỏ bằng cách chỉ lựa chọn các chức năng cần thiết.
Trong thập niên 2000, các doanh nghiệp Internet quy mô lớn chấp nhận Linux làm nền tảng vận hành số lượng lớn máy chủ đa dụng. Để cải thiện hiệu năng và khả năng mở rộng của trung tâm dữ liệu riêng, các doanh nghiệp này phát triển và đóng góp vào nhân những chức năng liên quan đến bộ lập lịch, hệ thống tệp, mạng và ảo hóa.
Android sử dụng nhân Linux làm nền tảng cho hệ điều hành điện thoại thông minh, qua đó đưa Linux đến số lượng lớn thiết bị tiêu dùng. Android sử dụng không gian người dùng và môi trường ứng dụng khác với các bản phân phối GNU/Linux truyền thống, nhưng phần lõi quản lý tiến trình, bộ nhớ, trình điều khiển thiết bị và bảo mật vẫn sử dụng nhân Linux.
Sau khi điện toán đám mây và container phổ biến, namespace, cgroups, mạng ảo và các chức năng hệ thống tệp của Linux trở thành nền tảng cho việc vận hành dịch vụ quy mô lớn. Linux bắt đầu như một nhân sở thích dành cho một máy tính cá nhân, nhưng thông qua mã nguồn công khai, giấy phép cho phép phân phối lại và quá trình phát triển chung của các bản phân phối cùng doanh nghiệp, nó đã phát triển thành phần mềm hệ thống cốt lõi được chia sẻ trong nhiều môi trường điện toán khác nhau.
Tên gọi và phạm vi
Nguồn gốc tên gọi Linux
Trong giai đoạn đầu phát triển, Linus Torvalds từng định sử dụng tên Freax cho dự án. Tên này được ghép từ free, mang nghĩa tự do, freak, chỉ người kỳ lạ hoặc quá đam mê một điều gì đó, và chữ x, vốn thường được sử dụng trong tên các hệ thống tương tự UNIX. Ông cũng từng nghĩ đến cái tên Linux, được tạo từ tên của mình, nhưng ban đầu không sử dụng vì cho rằng nó có thể khiến ông trông quá tự đề cao bản thân.
Năm 1991, khi Torvalds muốn công bố mã nguồn nhân trên máy chủ FTP FUNET của Phần Lan, Ari Lemmke, quản trị viên của máy chủ, đã tạo một thư mục để tải mã lên. Lemmke không thích tên Freax và đã tự đặt tên thư mục là linux mà không trao đổi riêng với Torvalds. Khi mã nguồn công khai được tải xuống và biết đến dưới tên này, Linux dần trở thành tên chính thức của dự án, và Torvalds cũng chấp nhận nó.[17]
Tên Linux thường được hiểu là sự kết hợp giữa tên Linus của Torvalds và UNIX. Nói một cách chính xác, đối tượng đầu tiên mà tên này dùng để chỉ là nhân do Torvalds phát triển. Tuy nhiên, khi các hệ điều hành hoàn chỉnh và bản phân phối được xây dựng bằng nhân Linux trở nên phổ biến, Linux cũng bắt đầu được dùng để chỉ không chỉ nhân mà cả toàn bộ hệ điều hành được xây dựng bên trên nó.
Nhân và hệ điều hành
Theo nghĩa hẹp, Linux là nhân Linux. Nhân quản lý tiến trình, bộ nhớ, hệ thống tệp, mạng, trình điều khiển thiết bị và tài nguyên phần cứng, đồng thời cung cấp giao diện lời gọi hệ thống để các chương trình không gian người dùng có thể sử dụng phần cứng.
Chỉ riêng nhân không thể tạo nên một môi trường hệ điều hành thông thường cho phép người dùng trực tiếp nhập lệnh, sao chép tệp hoặc biên dịch chương trình. Để xây dựng một hệ thống có thể sử dụng trong thực tế, cần có các thành phần không gian người dùng sau đây.
- Thư viện chuẩn C cho phép chương trình sử dụng các chức năng của nhân
- Shell để nhập lệnh và chạy chương trình
- Các công cụ cơ bản để quản lý tệp, tiến trình, người dùng và mạng
- Trình biên dịch và trình liên kết để biên dịch và liên kết chương trình
- Hệ thống khởi tạo để khởi động hệ thống và các dịch vụ
- Hệ thống quản lý gói để cài đặt và cập nhật phần mềm
- Tùy theo nhu cầu, hệ thống đồ họa, môi trường máy tính để bàn và ứng dụng
Một hệ thống kết hợp các thành phần này với nhân Linux và cung cấp chúng dưới dạng có thể cài đặt được gọi là bản phân phối Linux. Vì vậy, Debian, Fedora và Alpine Linux sử dụng cùng một họ nhân Linux, nhưng có thể khác nhau về công cụ và thư viện không gian người dùng, định dạng gói, hệ thống khởi tạo và chính sách quản trị.
Ý nghĩa của từ Linux cần được phân biệt theo ngữ cảnh của câu. Khi nói về phát triển nhân, lời gọi hệ thống, trình điều khiển hoặc phiên bản nhân, Linux thường chỉ nhân. Ngược lại, trong các cách diễn đạt như “cài đặt Linux”, “vận hành máy chủ Linux” hoặc “chương trình dành cho Linux”, Linux thường mang nghĩa toàn bộ môi trường hệ điều hành được xây dựng trên nhân Linux.
Linux thời kỳ đầu và các công cụ GNU
Khi Torvalds phát triển Linux vào năm 1991, về lý thuyết ông có thể viết mới toàn bộ các chương trình không gian người dùng kiểu UNIX bên ngoài nhân. Tuy nhiên, việc đồng thời phát triển từ đầu shell, trình biên dịch, trình liên kết, thư viện, chương trình quản lý tệp và các công cụ phát triển đòi hỏi phạm vi công việc rộng hơn nhiều so với chỉ phát triển nhân.
Vào thời điểm đó, dự án GNU đã phát triển nhiều thành phần với mục tiêu tạo ra một hệ điều hành tương thích UNIX có thể được sử dụng tự do. GCC, GNU Binutils, Bash, GNU Make và nhiều công cụ dòng lệnh đã tồn tại, đồng thời được thiết kế để có thể chạy trên các hệ điều hành tương tự UNIX khác. Ngược lại, GNU Hurd, nhân riêng mà GNU đang phát triển, vẫn chưa đạt đến giai đoạn có thể được sử dụng như một hệ điều hành thông thường.
Linux ở trong tình trạng ngược lại. Nó có một nhân hoạt động được nhưng không có không gian người dùng hoàn chỉnh để chạy bên trên. Torvalds sử dụng GCC để biên dịch nhân và thử nghiệm hệ thống bằng cách chuyển Bash cùng GCC sang chạy trên Linux. Nhờ sử dụng các công cụ GNU, ông có thể xây dựng một môi trường phát triển thực tế trên Linux mà không cần viết mới các chương trình nền tảng như shell và trình biên dịch.
Việc phần mềm GNU được sử dụng trong quá trình phát triển Linux ban đầu mang ý nghĩa lớn hơn sự tiện lợi đơn thuần. Để Linux phát triển thành một hệ thống độc lập có khả năng tự biên dịch và chạy các chương trình UNIX thông thường, nó cần trình biên dịch, trình liên kết, shell và thư viện. Khi đó, phần mềm GNU là lựa chọn thực tế nhất trong số các bộ công cụ đã đủ hoàn thiện và có thể được sử dụng, sửa đổi tự do.
Tuy nhiên, Linux không được thiết kế để phụ thuộc về mặt kỹ thuật chỉ vào GNU. Nhân Linux không yêu cầu một shell, thư viện C hay bộ công cụ dòng lệnh cụ thể. Miễn là có thể sử dụng giao diện lời gọi hệ thống của nhân, người ta có thể xây dựng nhiều loại không gian người dùng khác nhau.
Tên gọi GNU/Linux
Quỹ Phần mềm Tự do và Richard Stallman cho rằng các hệ thống kết hợp nhân Linux với không gian người dùng GNU nên được gọi là GNU/Linux. Theo quan điểm này, Linux không phải là một hệ điều hành hoàn chỉnh mà là nhân được bổ sung vào hệ thống GNU. Cách gọi này nhấn mạnh rằng phần lớn shell, thư viện C, trình biên dịch và các lệnh cơ bản được sử dụng trong những bản phân phối thông thường đều do dự án GNU phát triển.
Dự án GNU giải thích rằng họ đã phát triển một hệ điều hành tự do hoàn chỉnh tương thích UNIX từ năm 1984 và đã hoàn thiện phần lớn các thành phần chính, ngoại trừ nhân, trước khi Linux xuất hiện. Sau đó, nhân Linux được kết hợp với các thành phần GNU để hình thành một hệ điều hành tự do có thể sử dụng trong thực tế. Vì vậy, GNU cho rằng tên GNU/Linux nên được sử dụng để thể hiện nguồn gốc của toàn bộ hệ thống và vai trò của dự án GNU.[18]
Dự án GNU không xem vấn đề tên gọi chỉ đơn giản là việc ghi nhận những bên đóng góp. Theo dự án này, nếu gọi toàn bộ hệ điều hành là Linux, lịch sử và triết lý của dự án hệ điều hành phần mềm tự do do GNU khởi xướng trước đó sẽ bị che khuất, đồng thời việc phân biệt nhân Linux với toàn bộ hệ điều hành cũng trở nên khó khăn hơn. Vì vậy, GNU khuyến nghị gọi các bản phân phối được xây dựng xoay quanh không gian người dùng GNU là GNU/Linux và giới hạn tên Linux cho nhân.[19]
Debian phản ánh sự phân biệt này trong tên chính thức, gọi bản phân phối sử dụng nhân Linux là Debian GNU/Linux. Trước đây Debian cũng từng phát triển các biến thể sử dụng nhân GNU Hurd hoặc FreeBSD, vì vậy cách gọi GNU/Linux cũng được dùng như một tên cụ thể để chỉ sự kết hợp giữa không gian người dùng GNU và nhân Linux.
Quan điểm của Torvalds
Torvalds thừa nhận rằng dự án GNU và các công cụ GNU đóng vai trò quan trọng trong quá trình phát triển và phổ biến Linux thời kỳ đầu. Ông nhiều lần đề cập rằng nếu không có GCC thì việc phát triển Linux của mình sẽ khó khăn hơn rất nhiều, đồng thời phần mềm GNU đã đóng góp lớn cho Linux và hệ sinh thái phần mềm tự do.
Tuy nhiên, ông không đồng ý với quan điểm rằng mọi hệ thống sử dụng Linux đều nên được gọi chung là GNU/Linux. Trong bộ phim tài liệu 《Revolution OS》, Torvalds cho rằng việc dự án GNU tự tạo một bản phân phối Linux rồi gọi nó là GNU/Linux là hoàn toàn hợp lý, nhưng việc gọi toàn bộ các hệ thống dựa trên Linux bằng tên GNU/Linux là không phù hợp.[20]
Theo quan điểm của Torvalds, một bản phân phối là kết quả kết hợp không chỉ nhân Linux và phần mềm GNU mà còn X Window System, môi trường máy tính để bàn và phần mềm từ vô số dự án độc lập. Ngay cả khi GNU chiếm một phần quan trọng, không thể liệt kê tên của mọi dự án tạo nên toàn bộ hệ thống trong tên gọi, và đơn vị tạo ra bản phân phối có thể tự đặt tên như Debian Linux hoặc Red Hat Linux.
Ông cũng không cho rằng tên Linux nhất thiết phải chỉ giới hạn ở nhân. Không giống một ứng dụng thông thường tồn tại độc lập trong hệ điều hành, nhân tạo nên môi trường thực thi cốt lõi giữa phần cứng và không gian người dùng. Vì vậy, ông chấp nhận thông lệ sử dụng Linux vừa làm tên của nhân, vừa làm tên gọi chung cho họ hệ điều hành được xây dựng xoay quanh nhân Linux.
Sự khác biệt giữa hai bên không nằm nhiều ở việc có công nhận đóng góp của GNU hay không, mà gần hơn với vấn đề phạm vi nào được xem là một hệ điều hành và những yếu tố nào cần được phản ánh trong tên gọi. Tên GNU/Linux thể hiện rõ sự kết hợp giữa không gian người dùng GNU và nhân Linux, đồng thời nhấn mạnh vai trò lịch sử của dự án GNU. Tên Linux bao quát một họ hệ điều hành và hệ sinh thái rộng hơn được hình thành xoay quanh nhân, đồng thời là tên gọi đã được sử dụng rộng rãi trong thực tế và công nghiệp.
Các hệ thống Linux sử dụng GNU
Nhiều bản phân phối Linux đa dụng truyền thống sử dụng các thành phần của dự án GNU làm không gian người dùng cốt lõi. Cấu hình tiêu biểu gồm:
- glibc làm thư viện chuẩn C
- GCC làm trình biên dịch
- GNU Binutils làm trình liên kết và bộ công cụ tệp nhị phân
- Bash làm shell
- GNU Coreutils làm các lệnh cơ bản
- GNU Make làm công cụ xây dựng
Debian, Ubuntu, Fedora và nhiều bản phân phối khác được cấu thành chủ yếu từ sự kết hợp này có thể được gọi về mặt kỹ thuật là GNU/Linux. Tuy nhiên, các hệ thống này cũng chứa vô số thành phần không thuộc dự án GNU, như systemd, OpenSSH, X.Org, Wayland, KDE Plasma, GNOME và Firefox.
Vì vậy, GNU/Linux cũng không phải là một tên liệt kê toàn bộ mọi thành phần của một bản phân phối. Có thể hiểu đây là tên gọi nhấn mạnh sự kết hợp giữa hai nền tảng lịch sử là nhân Linux và không gian người dùng GNU.
Các hệ thống Linux được cấu thành không có GNU
Nhân Linux có thể được sử dụng làm nền tảng cho một hệ điều hành hoàn chỉnh ngay cả khi không có không gian người dùng GNU. Nếu thay thế thư viện C, shell, các lệnh cơ bản, trình biên dịch và trình liên kết bằng những triển khai khác, người ta có thể xây dựng một hệ thống Linux không phụ thuộc vào các thành phần GNU.
Alpine Linux sử dụng thư viện C musl thay cho glibc và xây dựng không gian người dùng cơ bản chủ yếu quanh BusyBox thay cho nhiều lệnh của GNU Coreutils. Alpine đặt nhẹ, đơn giản và bảo mật làm các mục tiêu chính, đồng thời được sử dụng rộng rãi trong container, máy chủ và môi trường nhúng.[21]
BusyBox tập hợp shell cùng các lệnh quản lý tệp, tiến trình và mạng trong một tệp thực thi duy nhất. Bản thân nó không phải là một hệ điều hành hoàn chỉnh, nhưng khi được sử dụng cùng nhân Linux, thư viện C và các thành phần khởi động, nó có thể tạo nên một hệ thống Linux nhỏ hoạt động mà không cần GNU Coreutils hoặc Bash.[22]
Chimera Linux được phát triển với mục tiêu rõ ràng là trở thành một bản phân phối đa dụng không sử dụng không gian người dùng GNU. Hệ thống sử dụng musl làm thư viện C, các công cụ thuộc họ FreeBSD trong không gian người dùng cơ bản, đồng thời sử dụng LLVM, Clang và LLD làm trình biên dịch và trình liên kết hệ thống thay cho GCC cùng GNU Binutils. Vì Chimera không sử dụng các lệnh GNU, GNU C Library và bộ công cụ GNU trong hệ thống cơ bản, dự án tự mô tả mình là một hệ điều hành dựa trên Linux chứ không phải GNU/Linux.[23]
Android cũng sử dụng nhân Linux nhưng có cấu trúc khác với không gian người dùng GNU/Linux truyền thống. Android sử dụng Bionic, thư viện C riêng của mình, thay cho glibc, còn môi trường ứng dụng và các dịch vụ hệ thống được xây dựng xoay quanh Android Runtime cùng framework Android.[24] Các công cụ dòng lệnh cơ bản cũng khác với những bản phân phối máy tính để bàn và máy chủ lấy GNU Coreutils làm trung tâm.
Trong các hệ thống nhúng như bộ định tuyến, TV, thiết bị lưu trữ và thiết bị công nghiệp, cấu hình kết hợp nhân Linux với BusyBox, musl hoặc một thư viện C nhỏ khác cũng được sử dụng. Những hệ thống này có thể bao gồm một số chương trình GNU, nhưng không xem không gian người dùng GNU là điều kiện bắt buộc trong cấu trúc hệ điều hành.
Phạm vi áp dụng của tên gọi
Linux và GNU/Linux không phải lúc nào cũng chỉ chính xác cùng một phạm vi.
Linux có thể dùng để chỉ những đối tượng sau.
- Nhân Linux do Linus Torvalds khởi xướng
- Họ hệ điều hành sử dụng nhân Linux
- Một bản phân phối Linux cụ thể
- Hệ sinh thái phát triển và phần mềm hình thành xoay quanh Linux
GNU/Linux thường dùng để chỉ những đối tượng sau.
- Hệ điều hành kết hợp nhân Linux với không gian người dùng GNU
- Bản phân phối Linux sử dụng các công cụ GNU và glibc làm thành phần cốt lõi
- Hệ thống Linux được gọi theo cách nhấn mạnh đóng góp lịch sử và triết học của dự án GNU
Mọi hệ thống GNU/Linux đều sử dụng nhân Linux, nhưng không phải mọi hệ điều hành dựa trên Linux đều là GNU/Linux. Có những bản phân phối như Alpine Linux có thể sử dụng một số chương trình GNU nhưng xây dựng không gian người dùng cơ bản bằng musl và BusyBox, đồng thời cũng có các hệ thống như Chimera Linux và Android xây dựng rõ ràng một không gian người dùng khác biệt với GNU.
Trong thực tế, Linux đã trở thành tên gọi phổ biến dùng cho cả nhân lẫn họ hệ điều hành. GNU/Linux được sử dụng khi cần thể hiện rõ hơn cấu trúc và lịch sử của một hệ thống lấy các thành phần GNU làm trung tâm. Dù lựa chọn cách gọi nào, điều quan trọng là phải làm rõ trong ngữ cảnh cụ thể rằng từ đó đang chỉ nhân, không gian người dùng hay toàn bộ bản phân phối.
Cấu trúc hệ thống
Hệ điều hành dựa trên Linux không phải là một chương trình đơn lẻ mà được tạo thành bằng cách kết hợp nhân Linux với nhiều thành phần trong không gian người dùng. Nhân quản lý phần cứng, tiến trình, bộ nhớ và thiết bị, còn bên trên nó là các thư viện hệ thống, hệ thống khởi tạo, shell, công cụ quản trị, môi trường đồ họa và ứng dụng.
Việc lựa chọn từng thành phần thay đổi tùy theo bản phân phối và mục đích sử dụng. Ngay cả khi dùng cùng nhân Linux, một hệ thống có thể sử dụng musl thay cho glibc, chọn một hệ thống khởi tạo khác thay cho systemd hoặc được cấu hình làm máy chủ không có môi trường đồ họa. Vì vậy, không tồn tại một cấu hình không gian người dùng hoàn chỉnh duy nhất mà mọi bản phân phối Linux bắt buộc phải cùng sử dụng.
Firmware và bộ nạp khởi động
Khi máy tính được bật nguồn, firmware được thực thi trước tiên để khởi tạo bộ xử lý, bộ nhớ, thiết bị lưu trữ và phần cứng cơ bản. Trên máy tính cá nhân, vai trò này chủ yếu do UEFI hoặc BIOS đời cũ đảm nhiệm.
Firmware thực thi bộ nạp khởi động từ một thiết bị có khả năng khởi động. Bộ nạp khởi động đưa ảnh nhân Linux sẽ sử dụng và ảnh không gian người dùng ban đầu vào bộ nhớ, đồng thời truyền các tham số dòng lệnh và thông tin phần cứng cho nhân. Trên hệ thống cài đặt nhiều hệ điều hành hoặc nhiều phiên bản nhân, nó cũng có thể cung cấp một trình đơn để người dùng chọn đối tượng khởi động.
Các bộ nạp khởi động được sử dụng trong hệ thống Linux gồm:
- GNU GRUB
- systemd-boot
- U-Boot
- SYSLINUX
- Cấu hình UEFI trực tiếp thực thi nhân Linux
Bộ nạp khởi động không phải là một thành phần cố định bắt buộc của bản thân Linux. Tùy nền tảng, firmware có thể trực tiếp thực thi nhân, còn trong thiết bị nhúng có thể sử dụng bộ nạp khởi động chuyên dụng như U-Boot. Vai trò quan trọng của nó là chuẩn bị trạng thái để nhân có thể chạy và truyền các thông tin khởi động cần thiết.[25]
Nhân Linux
Khi bộ nạp khởi động chuyển quyền điều khiển, nhân Linux bắt đầu thực thi. Nhân khởi tạo các chức năng quản lý bộ xử lý và bộ nhớ, phát hiện thiết bị khả dụng, đồng thời chuẩn bị các trình điều khiển và hệ thống tệp cần thiết.
Nhân cung cấp các chức năng cốt lõi sau đây giữa chương trình người dùng và phần cứng.
- Thực thi tiến trình và luồng
- Quản lý bộ nhớ ảo
- Truy cập tệp và thiết bị lưu trữ
- Trình điều khiển thiết bị
- Truyền thông mạng
- Kiểm tra người dùng và quyền hạn
- Giao tiếp liên tiến trình
- Cách ly và giới hạn tài nguyên
Nhân không phải là toàn bộ môi trường vận hành mà người dùng thông thường trực tiếp thao tác. Để tiếp tục quá trình khởi động, hệ thống phải gắn hệ thống tệp gốc và thực thi tiến trình đầu tiên trong không gian người dùng. Nội dung chi tiết về cấu trúc bên trong, phương thức phát triển, lời gọi hệ thống và trình điều khiển của nhân được trình bày trong Nhân Linux.
Không gian người dùng ban đầu
Trong nhiều trường hợp, hệ thống Linux không thể sử dụng ngay hệ thống tệp gốc thực tế. Nguyên nhân là hệ thống tệp gốc có thể được mã hóa hoặc cần đến ổ đĩa lôgic, RAID phần mềm, thiết bị lưu trữ mạng hay trình điều khiển chưa được tích hợp trực tiếp vào nhân.
Để giải quyết vấn đề này, bộ nạp khởi động có thể đưa initramfs hoặc dạng cũ hơn là initrd vào bộ nhớ cùng với nhân. Ảnh này được sử dụng làm hệ thống tệp gốc tạm thời và chứa các chương trình cùng trình điều khiển tối thiểu cần thiết để tìm và gắn hệ thống tệp gốc thực tế.[26]
Tùy theo bản phân phối và cấu hình hệ thống, không gian người dùng ban đầu có thể thực hiện các tác vụ sau.
- Nạp các mô-đun nhân cần thiết
- Phát hiện thiết bị lưu trữ và hệ thống tệp
- Mở khóa thiết bị được mã hóa
- Kích hoạt RAID phần mềm và ổ đĩa lôgic
- Chuẩn bị hệ thống tệp gốc qua mạng
- Kiểm tra và gắn hệ thống tệp gốc thực tế
- Chuyển quyền điều khiển sang chương trình init trong không gian người dùng thực tế
initramfs thường được cung cấp dưới dạng một tập hợp tệp cpio đã nén. Nhân giải nén nó vào bộ nhớ và sử dụng làm hệ thống tệp gốc ban đầu, sau đó chuyển sang hệ thống tệp gốc thực tế khi quá trình chuẩn bị hoàn tất.
Không phải mọi hệ thống Linux đều cần một initramfs phức tạp. Nếu các trình điều khiển cần thiết đã được tích hợp trong nhân và hệ thống tệp gốc có thể được gắn trực tiếp từ một thiết bị lưu trữ cục bộ đơn giản, không gian người dùng ban đầu có thể được bỏ qua hoặc cấu hình rất nhỏ.
Hệ thống tệp gốc
Hệ thống tệp gốc là cây thư mục cơ bản của hệ thống, bắt đầu từ /. Khi nhân và không gian người dùng ban đầu gắn hệ thống tệp gốc thực tế, hệ thống có thể truy cập chương trình người dùng, tệp cấu hình, thư viện và dữ liệu hệ thống.
Các bản phân phối Linux truyền thống sử dụng cấu trúc thư mục chịu ảnh hưởng từ FHS. FHS cung cấp hướng dẫn để bố trí chương trình, cấu hình, dữ liệu thay đổi và tệp người dùng tại những vị trí nhất quán trong các hệ thống tương tự UNIX.[27]
Các thư mục chính thường có vai trò như sau.
| Thư mục | Mục đích chính |
|---|---|
/ | Điểm bắt đầu của toàn bộ cây hệ thống tệp |
/boot | Ảnh nhân và các tệp liên quan đến khởi động |
/etc | Tệp cấu hình áp dụng cho toàn hệ thống |
/usr | Chương trình, thư viện và dữ liệu dùng chung |
/var | Dữ liệu thay đổi như nhật ký, bộ nhớ đệm và cơ sở dữ liệu |
/home | Thư mục nhà của người dùng thông thường |
/root | Thư mục nhà của người dùng root |
/run | Dữ liệu trạng thái thời gian chạy được tạo sau khi khởi động |
/tmp | Tệp tạm thời |
/dev | Các tệp đặc biệt đại diện cho thiết bị |
/proc | Hệ thống tệp ảo cung cấp trạng thái tiến trình và nhân |
/sys | Hệ thống tệp ảo biểu diễn thiết bị và đối tượng nhân |
/mnt, /media | Vị trí gắn các hệ thống tệp khác và phương tiện di động |
/usr thường lưu trữ tệp thực thi, thư viện và dữ liệu không phụ thuộc kiến trúc. FHS định nghĩa /usr là cây thư mục chính cho dữ liệu chỉ đọc có thể dùng chung, đồng thời phân biệt nó với dữ liệu khác nhau theo từng máy hoặc liên tục thay đổi trong khi hệ thống hoạt động.[28]
Các bản phân phối thực tế có thể không triển khai FHS hoàn toàn giống nhau. Một số bản phân phối hợp nhất /bin, /sbin và /lib vào các thư mục tương ứng bên dưới /usr, rồi duy trì các đường dẫn cũ bằng liên kết tượng trưng. Trên các hệ thống dùng hệ thống tệp gốc chỉ đọc hoặc cập nhật nguyên tử, quyền ghi và cách bố trí của những thư mục truyền thống cũng có thể khác.
Hệ thống init
Khi nhân chuẩn bị xong hệ thống tệp gốc, nó thực thi tiến trình đầu tiên trong không gian người dùng. Tiến trình này thường có mã định danh tiến trình PID 1 và đảm nhiệm vai trò init, khởi động và quản lý phần còn lại của không gian người dùng.
Hệ thống init chịu trách nhiệm cho các công việc sau.
- Gắn các hệ thống tệp thiết yếu
- Chuẩn bị thiết bị và thư mục thời gian chạy
- Khởi động dịch vụ hệ thống
- Quản lý thứ tự thực thi và quan hệ phụ thuộc giữa các dịch vụ
- Khởi động môi trường đăng nhập
- Xử lý tắt máy và khởi động lại
- Thu dọn các tiến trình con đã kết thúc
Nhiều bản phân phối hiện đại sử dụng systemd làm hệ thống init và trình quản lý dịch vụ. Khi chạy với PID 1, systemd quản lý hệ thống tệp, thiết bị, socket và dịch vụ theo từng đơn vị, đồng thời khởi động các thành phần cần cho quá trình khởi động theo quan hệ phụ thuộc.[29]
Linux không bắt buộc phải sử dụng systemd. Tùy theo bản phân phối và mục đích hệ thống, có thể sử dụng các cơ chế init khác như:
- SysV init
- OpenRC
- runit
- s6
- BusyBox init
- Chương trình init đơn giản được tự phát triển
Trong một hệ thống nhúng nhỏ, một chương trình duy nhất có thể chạy với PID 1 và chỉ khởi động những ứng dụng cần thiết. Ngược lại, trong bản phân phối máy tính để bàn và máy chủ, quản lý thiết bị, phiên người dùng, mạng, nhật ký và nhiều dịch vụ nền thường được tích hợp với hệ thống init.
Dịch vụ hệ thống
Hệ thống init khởi động nhiều chương trình nền cung cấp chức năng của hệ điều hành. Những chương trình này thường được gọi là dịch vụ hoặc daemon.
Ví dụ về các dịch vụ gồm:
- Cấu hình mạng và quản lý kết nối
- Thu thập nhật ký hệ thống
- Đồng bộ thời gian
- Truy cập từ xa
- Quản lý thiết bị
- Lập lịch tác vụ
- Quản lý nguồn điện
- Quản lý máy in và âm thanh
- Máy chủ web và cơ sở dữ liệu
- Màn hình đăng nhập đồ họa
Trên hệ thống máy chủ, máy chủ web, cơ sở dữ liệu và dịch vụ quản trị từ xa có thể là thành phần trung tâm. Trên hệ thống máy tính để bàn, trình quản lý hiển thị, máy chủ âm thanh, Bluetooth và dịch vụ quản lý mạng thường được bổ sung. Một hệ thống nhúng có thể chỉ chạy một số ít dịch vụ cần thiết cho chức năng của sản phẩm.
Dịch vụ chịu ảnh hưởng từ cấu hình mặc định và chính sách quản lý của bản phân phối. Ngay cả với cùng một chương trình, quyền người dùng dùng để chạy, thư mục lưu dữ liệu, thời điểm khởi động và quan hệ phụ thuộc với dịch vụ khác có thể khác nhau giữa các bản phân phối.
Thư viện hệ thống
Chương trình không gian người dùng thường sử dụng các hàm do thư viện hệ thống cung cấp thay vì trực tiếp thực hiện lời gọi hệ thống của nhân. Thư viện hệ thống cung cấp giao diện chuẩn để chương trình xử lý tệp, bộ nhớ, tiến trình, mạng và luồng, đồng thời chuyển chúng thành lời gọi hệ thống Linux khi cần thiết.
Các thư viện chuẩn C tiêu biểu được sử dụng trong bản phân phối Linux gồm:
glibc được sử dụng trong nhiều bản phân phối đa dụng và cung cấp API hệ thống cùng chức năng thời gian chạy cho các chương trình được viết bằng C và các ngôn ngữ tương thích với C. Khi chương trình yêu cầu chức năng như nhập xuất hoặc tạo tiến trình, hàm thư viện có thể thực hiện lời gọi hệ thống Linux cần thiết.[30]
Không phải mọi chức năng của nhân đều nhất thiết có hàm bao bọc trong thư viện, và chương trình cũng có thể trực tiếp sử dụng lời gọi hệ thống. Tuy nhiên, việc thông qua thư viện giúp che giấu cách gọi khác nhau theo kiến trúc và các khác biệt về tương thích, đồng thời cho phép sử dụng giao diện gần với POSIX hoặc tiêu chuẩn C hơn.
Ngoài thư viện C, hệ thống có thể cài đặt thư viện dùng chung cho mã hóa, nén, đồ họa, âm thanh, quốc tế hóa và môi trường thời gian chạy của ngôn ngữ lập trình. Chương trình được liên kết động sẽ nạp các thư viện dùng chung cần thiết vào bộ nhớ thông qua bộ nạp khi thực thi.
Shell và công cụ dòng lệnh
Shell là chương trình không gian người dùng diễn giải lệnh của người dùng và thực thi chương trình. Shell không phải là một phần của nhân và một hệ thống có thể đồng thời cài đặt nhiều loại shell khác nhau.
Các shell tiêu biểu gồm:
- Bash
- Dash
- Zsh
- Fish
- KornShell
- BusyBox ash
Shell không chỉ thực thi lệnh mà còn cung cấp chuyển hướng đầu vào và đầu ra, pipe, biến môi trường, điều khiển tác vụ và thực thi tập lệnh. Trong quản trị hệ thống và tự động hóa, tập lệnh shell kết hợp nhiều chương trình được sử dụng rộng rãi.
Các lệnh cơ bản như ls, cp, mv, grep, sed và mount cũng không nằm trong nhân. Các dự án không gian người dùng như GNU Coreutils, util-linux, BusyBox và Toybox cung cấp những chương trình này.
Lệnh người dùng nhập trong thiết bị đầu cuối thường được xử lý theo luồng sau.
- Thiết bị đầu cuối chuyển dữ liệu nhập cho shell.
- Shell phân tích lệnh và đối số.
- Shell tìm tệp thực thi và khởi động một tiến trình mới.
- Chương trình yêu cầu chức năng của nhân thông qua thư viện và lời gọi hệ thống.
- Kết quả được chuyển đến thiết bị đầu cuối, tệp hoặc chương trình khác.
Nhờ cấu trúc này, ngay cả khi dùng cùng một nhân Linux, shell và công cụ dòng lệnh vẫn có thể được cấu hình hoàn toàn khác nhau. Bản phân phối đa dụng thường cung cấp nhiều công cụ dưới dạng chương trình riêng biệt, còn hệ thống nhỏ có thể cung cấp nhiều lệnh chỉ bằng một BusyBox.
Thiết bị và quản lý thiết bị động
Trong Linux, nhiều thiết bị xuất hiện trong không gian người dùng dưới dạng tệp đặc biệt bên dưới /dev. Chương trình mở, đọc hoặc ghi tệp thiết bị theo cách tương tự tệp thông thường để sử dụng chức năng do trình điều khiển cung cấp.
Trong các bản phân phối đa dụng hiện đại, khi nhân phát hiện thiết bị hoặc thông báo thay đổi trạng thái, trình quản lý thiết bị trong không gian người dùng sẽ xử lý sự kiện đó. Trình quản lý thiết bị có thể tạo nút thiết bị cần thiết, thiết lập quyền và khởi động chương trình hoặc dịch vụ bổ sung dựa trên thông tin thiết bị.
Trong các bản phân phối sử dụng systemd, chức năng này thường do systemd-udevd đảm nhiệm. Các hệ thống khác có thể sử dụng một triển khai udev độc lập hoặc trình quản lý thiết bị nhỏ hơn như mdev.
sysfs được gắn tại /sys hiển thị cây phân cấp của thiết bị, trình điều khiển và đối tượng nhân cho không gian người dùng. procfs được gắn tại /proc cung cấp tiến trình, trạng thái hệ thống và một số thiết lập nhân thông qua giao diện giống tệp. Hai hệ thống này không phải hệ thống tệp thông thường được lưu trên đĩa mà là các hệ thống tệp ảo được nhân cung cấp động trong khi chạy.
Người dùng và môi trường đăng nhập
Hệ thống Linux phân biệt quyền sở hữu của tiến trình và tệp thông qua người dùng và nhóm. Mỗi tiến trình có mã định danh người dùng và mã định danh nhóm, còn nhân dựa trên các giá trị này để kiểm tra quyền truy cập vào tệp, thiết bị và chức năng mạng.
Người dùng có thể đăng nhập qua bảng điều khiển cục bộ, màn hình đăng nhập đồ họa hoặc dịch vụ truy cập từ xa như SSH. Trong quá trình đăng nhập, các thông tin sau thường được chuẩn bị.
- Mã định danh người dùng và nhóm
- Thư mục nhà
- Shell mặc định
- Biến môi trường
- Giới hạn tài nguyên
- Phiên và dịch vụ riêng của người dùng
- Chính sách xác thực và truy cập
Thông tin tài khoản người dùng theo truyền thống được lưu trong /etc/passwd, /etc/group và các tệp liên quan. Trong môi trường mạng, có thể sử dụng LDAP, Kerberos và các hệ thống xác thực tập trung khác.
Phương thức xác thực thường được cấu hình thông qua PAM. PAM cung cấp giao diện xác thực theo mô-đun, cho phép chương trình sử dụng mật khẩu, khóa bảo mật, xác thực sinh trắc học và dịch vụ xác thực tập trung theo một cách thống nhất.
Gói phần mềm và cấu hình bản phân phối
Vai trò lựa chọn nhân cùng các chương trình không gian người dùng rồi kết hợp chúng thành một hệ thống có thể cài đặt chủ yếu thuộc về bản phân phối Linux. Bản phân phối không chỉ tập hợp chương trình mà còn quản lý tùy chọn xây dựng, cấu trúc thư mục, cấu hình mặc định và quan hệ phụ thuộc để các thành phần có thể hoạt động cùng nhau.
Bản phân phối thường cung cấp các yếu tố sau.
- Nhân Linux hoặc gói nhân
- Thư viện hệ thống
- Hệ thống init và dịch vụ cơ bản
- Shell và công cụ quản trị
- Trình quản lý gói và kho phần mềm
- Cập nhật bảo mật
- Chương trình cài đặt
- Cấu hình và chính sách mặc định
- Tài liệu và hệ thống hỗ trợ
Trình quản lý gói cài đặt chương trình cùng thư viện theo từng gói và đồng thời giải quyết các quan hệ phụ thuộc cần thiết. Tùy bản phân phối, các cơ chế khác nhau như dpkg và APT, RPM và DNF, pacman, APK hoặc XBPS được sử dụng.
Hệ thống quản lý gói không phải là chức năng của nhân Linux. Ngay cả khi dùng cùng một nhân, phương thức cài đặt gói, cấu trúc kho và chính sách cập nhật vẫn do bản phân phối quyết định. Các hệ thống như ảnh container hoặc thiết bị nhúng cũng có thể không bổ sung gói trong khi chạy mà thay thế toàn bộ ảnh hệ thống.
Môi trường đồ họa
Môi trường đồ họa là một thành phần tùy chọn của hệ thống Linux. Máy chủ và hệ thống nhúng có thể hoạt động chỉ với dòng lệnh và dịch vụ mạng mà không cần ngăn xếp đồ họa.
Môi trường đồ họa của hệ thống Linux để bàn thường được cấu thành từ nhiều lớp.
- Trình điều khiển thiết bị đồ họa trong nhân
- Thư viện đồ họa không gian người dùng như Mesa
- Trình tổng hợp Wayland hoặc máy chủ X11
- Trình quản lý cửa sổ hoặc trình tổng hợp
- Môi trường máy tính để bàn
- Bộ công cụ đồ họa
- Ứng dụng
Trong môi trường Wayland, trình tổng hợp thường đồng thời phụ trách tổng hợp màn hình, bố trí cửa sổ và xử lý đầu vào. Trong môi trường X11, máy chủ X trung gian hóa đầu vào và đầu ra màn hình, còn một trình quản lý cửa sổ riêng quản lý vị trí và phần trang trí của cửa sổ.
Các môi trường máy tính để bàn tiêu biểu gồm KDE Plasma, GNOME, Xfce, Cinnamon và LXQt. Môi trường máy tính để bàn tích hợp bảng điều khiển, trình quản lý tệp, công cụ thiết lập, thông báo và ứng dụng cơ bản, nhưng không phải là thành phần bắt buộc của Linux.
Ứng dụng và môi trường thực thi
Trình duyệt web, trình soạn thảo, trò chơi, máy chủ và công cụ phát triển mà người dùng trực tiếp sử dụng đều là ứng dụng trong không gian người dùng. Ứng dụng sử dụng thư viện hệ thống và môi trường thời gian chạy, rồi cuối cùng dùng chức năng của nhân thông qua lời gọi hệ thống.
Trên Linux, chương trình có thể được thực thi dưới các dạng sau.
- Tệp thực thi ELF gốc
- Tập lệnh thông dịch như shell và Python
- Chương trình máy ảo như Java Virtual Machine
- Định dạng Flatpak, Snap và AppImage
- Chương trình bên trong container
- Một số chương trình Windows thông qua Wine
Môi trường thực thi của ứng dụng chịu ảnh hưởng từ phiên bản thư viện, hệ thống tệp và chính sách quyền của bản phân phối. Gói của bản phân phối được xây dựng để tích hợp với hệ thống tương ứng, trong khi gói đa dụng và container cung cấp kèm một số thư viện cần thiết để giảm khác biệt giữa các bản phân phối.
Khả năng thay thế thành phần
Một đặc điểm quan trọng của hệ thống Linux là các thành phần không gian người dùng không bị ràng buộc trong một tổ hợp cố định duy nhất. Bản phân phối hoặc nhà sản xuất hệ thống có thể lựa chọn gần như mọi tầng tùy theo mục đích sử dụng.
Ví dụ, có thể tạo các cấu hình sau.
- Sử dụng musl thay cho glibc
- Sử dụng OpenRC hoặc runit thay cho systemd
- Sử dụng BusyBox thay cho GNU Coreutils
- Sử dụng Dash hoặc Zsh thay cho Bash
- Sử dụng systemd-boot hoặc U-Boot thay cho GRUB
- Chỉ chạy dịch vụ máy chủ mà không có môi trường máy tính để bàn
- Sử dụng ảnh hệ thống chỉ đọc mà không có trình quản lý gói
Ngay cả khi thay thế thành phần, hệ thống vẫn có thể được cấu thành nếu giao diện không gian người dùng của nhân Linux cùng thư viện và cấu trúc tệp mà chương trình yêu cầu vẫn tương thích. Ngược lại, ngay cả khi sử dụng cùng một nhân Linux, nếu không gian người dùng và phương thức quản trị khác biệt lớn thì trải nghiệm sử dụng và phương thức vận hành cũng sẽ khác nhau.
Vì vậy, hệ điều hành dựa trên Linux có thể được hiểu không phải như một sản phẩm đơn lẻ mà là một họ hệ điều hành kết hợp nhiều dự án độc lập và thành phần của bản phân phối trên nền tảng chung là nhân Linux.
Cấu trúc nhân
Cốt lõi của hệ điều hành dựa trên Linux là nhân Linux. Nhân Linux thực thi giữa chương trình không gian người dùng và phần cứng, đồng thời quản lý thời gian xử lý, bộ nhớ, thiết bị lưu trữ, mạng và thiết bị ngoại vi.
Nhân Linux sử dụng kiến trúc nhân nguyên khối, trong đó các chức năng chính của hệ điều hành cùng thực thi trong một không gian địa chỉ của nhân. Quản lý tiến trình, quản lý bộ nhớ, hệ thống tệp, mạng và trình điều khiển thiết bị không chạy dưới dạng các tiến trình người dùng thông thường tách biệt, mà hoạt động như những hệ thống con bên trong nhân.
Tuy nhiên, không phải mọi chức năng đều chỉ được đưa vào một tệp thực thi cố định duy nhất. Trình điều khiển thiết bị, hệ thống tệp và một số chức năng mạng có thể được tích hợp trực tiếp khi xây dựng nhân hoặc được tạo thành mô-đun nhân có thể nạp. Mô-đun có thể được nạp vào nhân đang chạy khi cần thiết, nhờ đó hệ thống vẫn duy trì kiến trúc nguyên khối nhưng có thể lựa chọn chức năng theo mục đích sử dụng và phần cứng.[31]
Không gian người dùng và không gian nhân
Linux chia môi trường thực thi thành hai phần lớn là không gian người dùng và không gian nhân. Ứng dụng thông thường, shell và dịch vụ hệ thống chạy trong không gian người dùng, không thể tùy ý truy cập trực tiếp dữ liệu nội bộ của nhân hoặc phần cứng.
Khi chương trình không gian người dùng cần mở tệp, cấp phát bộ nhớ, tạo tiến trình hoặc thực hiện giao tiếp mạng, nó yêu cầu nhân xử lý thông qua lời gọi hệ thống. Nhân kiểm tra tính hợp lệ và quyền hạn của yêu cầu, gọi hệ thống con cần thiết rồi trả kết quả về không gian người dùng. Ngoài lời gọi hệ thống, Linux còn cung cấp nhiều giao diện không gian người dùng khác như ioctl, Netlink, /proc, /sys và tệp thiết bị.[32]
Ranh giới này giúp giảm khả năng lỗi của ứng dụng trực tiếp ảnh hưởng đến toàn bộ nhân và là nền tảng để áp dụng quyền truy cập theo từng người dùng và tiến trình. Ngược lại, lỗi trong nhân hoặc mô-đun nhân có thể dẫn đến việc toàn bộ hệ thống dừng hoạt động hoặc dữ liệu bị hư hỏng vì chúng được thực thi với quyền hạn cao.
Quản lý tiến trình và thực thi
Nhân quản lý chương trình đang chạy theo đơn vị tiến trình và luồng. Mỗi đơn vị thực thi được liên kết với các thông tin như không gian bộ nhớ, tệp đang mở, quyền người dùng và trạng thái thực thi.
Bộ lập lịch quyết định tác vụ nào trong số các tác vụ có thể chạy sẽ được thực thi trên bộ xử lý nào. Nó xử lý không chỉ chương trình tương tác thông thường và tác vụ máy chủ mà còn cả tác vụ thời gian thực, mức ưu tiên và mức độ ưu tiên đối với từng bộ xử lý.
Việc tạo và kết thúc tiến trình, truyền tín hiệu, chờ, quản lý luồng và chia sẻ tài nguyên cũng được thực hiện thông qua mô hình thực thi do nhân cung cấp. Namespace phân tách phạm vi mà tiến trình nhìn thấy, như mã định danh tiến trình, hệ thống tệp và mạng, còn cgroups phân loại và giới hạn mức sử dụng CPU, bộ nhớ và tài nguyên nhập xuất của một tập hợp tiến trình. cgroup v2 cung cấp chức năng tổ chức tiến trình theo cấu trúc phân cấp và phân phối tài nguyên dựa trên cấu trúc đó.[33]
Quản lý bộ nhớ
Hệ thống con quản lý bộ nhớ cung cấp cho mỗi tiến trình một không gian địa chỉ ảo độc lập và ánh xạ địa chỉ ảo tới các trang bộ nhớ vật lý. Nhờ đó, nhiều chương trình có thể chạy trên cùng một hệ thống mà không trực tiếp truy cập bộ nhớ của nhau.
Nhân quản lý các chức năng liên quan đến bộ nhớ sau đây.
- Cấp phát và thu hồi trang bộ nhớ vật lý
- Không gian địa chỉ ảo riêng cho từng tiến trình
- Ánh xạ tệp thực thi và thư viện dùng chung
- Ánh xạ bộ nhớ cho phép sử dụng tệp như bộ nhớ
- Bộ nhớ đệm trang
- Bộ nhớ dùng chung
- Swap
- Xử lý tình trạng thiếu bộ nhớ
Bộ nhớ mà chương trình người dùng yêu cầu không phải lúc nào cũng được cấp phát ngay lập tức trong bộ nhớ vật lý. Khi xảy ra lỗi trang, nhân có thể chuẩn bị trang cần thiết hoặc đọc dữ liệu từ tệp, đồng thời cũng có thể chuyển dữ liệu ít được sử dụng sang thiết bị swap.
Hệ thống tệp ảo
Hệ thống tệp ảo của nhân Linux kết nối nhiều hệ thống tệp khác nhau thông qua một giao diện tệp thống nhất. Chương trình người dùng có thể sử dụng các thao tác chung như open, read, write và stat mà không cần biết thiết bị lưu trữ thực tế đang dùng ext4, XFS, Btrfs, NFS hay một hệ thống tệp khác.
Hệ thống tệp ảo vừa cung cấp giao diện hệ thống tệp cho không gian người dùng, vừa tạo một tầng trừu tượng cho phép nhiều cách triển khai hệ thống tệp cùng tồn tại bên trong nhân.[34]
Trong Linux, không chỉ tệp lưu trữ thông thường mà cả thiết bị, tiến trình và trạng thái nhân cũng được biểu diễn dưới dạng tương tự tệp. Các ví dụ gồm tệp thiết bị trong /dev, thông tin tiến trình và hệ thống trong /proc, cùng giao diện thiết bị và đối tượng nhân trong /sys.
Trình điều khiển thiết bị
Trình điều khiển thiết bị cho phép nhân giao tiếp với phần cứng. Thiết bị lưu trữ, giao diện mạng, thiết bị đồ họa, thiết bị nhập liệu, thiết bị USB và nhiều loại bộ điều khiển bus được kết nối với các hệ thống con của nhân thông qua trình điều khiển.
Trình điều khiển có thể được tích hợp vào nhân hoặc cung cấp dưới dạng mô-đun. Khi một thiết bị mới được phát hiện, mô hình thiết bị của nhân kết nối thiết bị với trình điều khiển phù hợp. Chương trình quản lý thiết bị trong không gian người dùng có thể hỗ trợ việc nạp mô-đun cần thiết, tạo tệp thiết bị và thiết lập quyền.
Khả năng hỗ trợ phần cứng rộng của Linux không chỉ được xây dựng bởi một nhóm phát triển trung tâm duy nhất. Cộng đồng nhân, nhà sản xuất bán dẫn, nhà sản xuất thiết bị, bản phân phối và doanh nghiệp hệ thống cùng duy trì trình điều khiển và nền tảng chung cho từng dòng phần cứng.
Mạng
Ngăn xếp mạng của Linux kết nối giao diện socket của ứng dụng với giao thức mạng, định tuyến, lọc gói tin và trình điều khiển thiết bị mạng.
Chương trình người dùng thường tạo socket để sử dụng TCP, UDP và các phương thức giao tiếp khác. Nhân xử lý dữ liệu theo giao thức, thực hiện quyết định định tuyến rồi truyền và nhận dữ liệu thông qua trình điều khiển thiết bị mạng.
Hệ thống con mạng bao gồm các chức năng sau.
- IPv4 và IPv6
- TCP và UDP
- Socket miền UNIX cục bộ
- Định tuyến và chuyển tiếp
- Quản lý giao diện mạng
- Tường lửa và lọc gói tin
- Thiết bị mạng ảo
- Bridge và tunnel
- Network namespace
- Điều khiển lưu lượng
Những chức năng này không chỉ được sử dụng cho máy chủ và bộ định tuyến mà còn làm nền tảng để cấu hình container, máy ảo và mạng điện toán đám mây.
Bảo mật và kiểm soát truy cập
Nhân Linux kiểm soát quyền truy cập tài nguyên dựa trên người dùng, nhóm, quyền tệp và thông tin xác thực của tiến trình. Ngoài mô hình quyền UNIX truyền thống, nó còn cung cấp Linux capabilities để chia nhỏ quyền hạn, seccomp để giới hạn lời gọi hệ thống và Linux Security Modules để áp dụng chính sách bảo mật.
Thông qua kiến trúc Linux Security Modules, các mô-đun bảo mật như SELinux, AppArmor và Smack có thể áp dụng chính sách bổ sung tại những điểm truy cập tài nguyên quan trọng trong nhân. Namespace và cgroups cũng được sử dụng để xây dựng môi trường cách ly bằng cách giới hạn phạm vi hệ thống mà tiến trình có thể nhìn thấy và tài nguyên mà nó có thể sử dụng.
Nhân phân biệt bộ nhớ không gian người dùng với bộ nhớ nhân, đồng thời sử dụng quy trình kiểm tra và sao chép riêng khi truy cập dữ liệu không gian người dùng. Trên phần cứng được hỗ trợ, nhân cũng tận dụng các cơ chế bảo vệ nhằm ngăn bộ nhớ không gian người dùng bị thực thi tùy ý hoặc bị truy cập theo cách không mong muốn.[35]
Mô-đun và cấu hình nhân
Nhân Linux cho phép lựa chọn hoặc loại bỏ nhiều chức năng trong quá trình xây dựng. Kiến trúc bộ xử lý, trình điều khiển thiết bị, hệ thống tệp, giao thức mạng và chức năng bảo mật được cấu hình thông qua thiết lập Kconfig.
Chức năng được chọn có thể được xây dựng theo một trong các dạng sau.
- Tích hợp trực tiếp vào ảnh nhân
- Xây dựng thành mô-đun nhân có thể nạp
- Loại khỏi hệ thống
Chức năng được tích hợp trong ảnh nhân có thể sử dụng ngay từ giai đoạn đầu của quá trình khởi động. Chức năng được xây dựng dưới dạng mô-đun có thể được nạp khi cần và thường được cung cấp dưới dạng tệp .ko. Nhân kiểm tra các symbol và thông tin phiên bản mà mô-đun yêu cầu, đồng thời có thể từ chối nạp mô-đun không tương thích.[36]
Các bản phân phối thường cung cấp tương đối nhiều chức năng dưới dạng mô-đun để có thể sử dụng trên nhiều loại phần cứng. Hệ thống nhúng có thể chỉ tích hợp những chức năng cần thiết vào nhân và loại bỏ phần còn lại nhằm giảm kích thước, thời gian khởi động và bề mặt tấn công.
Sự kết hợp giữa các hệ thống con
Các hệ thống con của nhân Linux không hoàn toàn tách biệt như những chương trình độc lập. Ngay cả trong một thao tác đơn giản như tiến trình đọc tệp, nhiều thành phần có thể cùng tham gia, bao gồm xử lý lời gọi hệ thống, bộ mô tả tệp, hệ thống tệp ảo, bộ nhớ đệm trang, quản lý bộ nhớ và trình điều khiển thiết bị lưu trữ.
Vì các chức năng chính trực tiếp phối hợp trong cùng một không gian nhân, việc gọi và truyền dữ liệu giữa các hệ thống con có thể được thực hiện hiệu quả. Đồng thời, lỗi trong một hệ thống con cũng có khả năng ảnh hưởng đến các phần khác và toàn bộ hệ thống, vì vậy kiểm soát đồng thời, an toàn bộ nhớ và tính ổn định của giao diện được xem là những vấn đề quan trọng trong quá trình phát triển nhân.
Cấu trúc mã nguồn chi tiết, bộ lập lịch, trình quản lý bộ nhớ, lời gọi hệ thống, đồng bộ hóa, mô hình trình điều khiển và quy trình phát triển của nhân Linux được trình bày trong Nhân Linux.
Quản trị và vận hành
Linux được sử dụng rộng rãi làm nền tảng cho máy chủ, trung tâm dữ liệu, điện toán đám mây, thiết bị viễn thông, cơ sở công nghiệp và ứng dụng doanh nghiệp. Trong môi trường công nghiệp, vận hành Linux không chỉ có nghĩa là đăng nhập vào từng máy chủ rồi thực thi lệnh. Nó bao gồm toàn bộ hoạt động lựa chọn bản phân phối và phiên bản mà tổ chức sử dụng, đồng thời quản lý nhất quán cấu hình, gói phần mềm, chính sách bảo mật, ứng phó sự cố và vòng đời của từ hàng trăm đến hàng trăm nghìn hệ thống.
Trong môi trường cá nhân hoặc quy mô nhỏ, quản trị viên có thể trực tiếp cấu hình từng hệ thống. Tuy nhiên, trong môi trường thương mại, điều quan trọng là biến các tác vụ giống nhau thành quy trình có thể lặp lại, đồng thời lưu lại lịch sử thay đổi và phạm vi trách nhiệm. Vì vậy, hoạt động vận hành Linux thường đồng thời xử lý các lĩnh vực sau.
- Chuẩn hóa hệ điều hành và phần cứng
- Cài đặt tự động và quản lý cấu hình
- Kiểm soát tài khoản và quyền truy cập
- Gói phần mềm và cập nhật bảo mật
- Thu thập nhật ký, chỉ số và thông tin truy vết
- Sao lưu và khôi phục sau thảm họa
- Ứng phó sự cố và duy trì tính liên tục của dịch vụ
- Tuân thủ quy định và tiêu chuẩn bảo mật
- Hỗ trợ dài hạn và chuyển đổi phiên bản
- Phối hợp với nhà cung cấp và cộng đồng nguồn mở
Bản phân phối dành cho doanh nghiệp
Nhân Linux và phần lớn phần mềm không gian người dùng đều có thể được bất kỳ ai tải xuống và sử dụng. Tuy nhiên, thay vì tự kết hợp các bản phân phối cộng đồng trong môi trường vận hành, doanh nghiệp đôi khi lựa chọn bản phân phối dành cho doanh nghiệp có hỗ trợ dài hạn và bảo đảm chất lượng.
Các bản phân phối Linux doanh nghiệp tiêu biểu gồm:
- Red Hat Enterprise Linux
- SUSE Linux Enterprise Server
- Ubuntu LTS và Ubuntu Pro
- Oracle Linux
- Nhiều bản phân phối phái sinh có hỗ trợ thương mại
Bản phân phối doanh nghiệp không biến phần mềm nguồn mở thành một hệ điều hành độc quyền. Thay vào đó, nó cung cấp một sản phẩm trong đó nhân, thư viện và chương trình không gian người dùng tại một thời điểm nhất định được kiểm chứng cùng nhau và duy trì ổn định trong một khoảng thời gian xác định.
Ngay cả sau khi phiên bản thượng nguồn mới được công bố, bản phân phối doanh nghiệp vẫn chuyển ngược các bản sửa lỗi bảo mật và lỗi quan trọng về phiên bản cũ. Phương thức này cho phép giải quyết vấn đề bảo mật trong khi giảm bớt những thay đổi chức năng lớn có thể ảnh hưởng đến ứng dụng và quy trình quản trị.
Red Hat chia mỗi phiên bản chính của RHEL thành nhiều giai đoạn hỗ trợ và thay đổi phạm vi cung cấp cải tiến chức năng, hỗ trợ phần cứng, sửa lỗi bảo mật và lỗi hệ thống theo từng giai đoạn.[37] SUSE cũng công bố vòng đời cho từng sản phẩm và cung cấp bảo trì dài hạn, bao gồm hỗ trợ mở rộng cho một số sản phẩm.[38]
Thứ doanh nghiệp mua không chỉ là quyền chạy Linux. Gói đăng ký hoặc hợp đồng hỗ trợ thường bao gồm các yếu tố sau.
- Gói phần mềm và ảnh cài đặt đã được kiểm chứng
- Khuyến cáo bảo mật và gói sửa lỗi
- Phiên bản ổn định được duy trì dài hạn
- Tài liệu kỹ thuật và cơ sở tri thức
- Phân tích sự cố và hỗ trợ kỹ thuật
- Chứng nhận phần cứng và phần mềm cụ thể
- Quyền sử dụng công cụ quản trị và bảo mật
- Bảo trì mở rộng và hỗ trợ chuyển đổi phiên bản
Ngay cả khi mã nguồn được công khai, một tổ chức quy mô lớn vẫn khó có thể tự phân tích mọi lỗi và viết mọi bản vá. Hợp đồng hỗ trợ là phương tiện để bảo đảm có nhà cung cấp tham gia phân tích và sửa lỗi khi xảy ra vấn đề, cùng phạm vi hỗ trợ và quy trình phản hồi rõ ràng.
Chuẩn hóa nền tảng
Doanh nghiệp thường giới hạn môi trường Linux được phép sử dụng trong tổ chức theo những tiêu chuẩn nhất định. Nếu tự do kết hợp nhiều bản phân phối và phiên bản, khả năng tương thích ứng dụng, vá bảo mật, hỗ trợ kỹ thuật và đào tạo quản trị viên sẽ trở nên phức tạp.
Nền tảng tiêu chuẩn thường quy định những yếu tố sau.
- Bản phân phối và phiên bản chính được phê duyệt
- Nhân và kho gói được phép sử dụng
- Phần cứng và loại máy ảo được hỗ trợ
- Hệ thống tệp và cách bố trí đĩa
- Thiết lập mạng và phân giải tên
- Phương thức xác thực và kiểm soát truy cập
- Công cụ ghi nhật ký và giám sát
- Chính sách sao lưu và lưu giữ dữ liệu
- Tiêu chuẩn tăng cường bảo mật
- Khác biệt giữa môi trường phát triển, thử nghiệm và vận hành
Dựa trên các tiêu chuẩn này, tổ chức tạo ảnh cài đặt chung hoặc ảnh hệ thống cơ sở. Trong môi trường đám mây có thể sử dụng ảnh máy ảo, trên máy chủ vật lý có thể sử dụng tệp cài đặt tự động và khởi động qua mạng, còn thiết bị nhúng có thể sử dụng ảnh firmware chỉ đọc.
Ảnh cơ sở thường không chứa sẵn mọi ứng dụng mà chỉ cung cấp cấu hình tối thiểu cần cho vận hành, thiết lập bảo mật và tác nhân quản trị. Dịch vụ thực tế được triển khai sau đó thông qua công cụ tự động hóa hoặc container.
Chuẩn hóa không có nghĩa là duy trì vĩnh viễn mọi máy chủ ở trạng thái hoàn toàn giống nhau. Cơ sở dữ liệu, máy chủ web, nút tính toán và thiết bị mạng có thể cần các cấu hình khác nhau. Thay vào đó, hệ thống được phân loại theo vai trò và thiết bị cùng vai trò phải tuân theo cùng chính sách và quy trình triển khai.
Cài đặt tự động và cung cấp tài nguyên
Trong môi trường quy mô lớn, con người không trực tiếp lặp lại quá trình cài đặt hệ điều hành. Khi máy chủ được chuẩn bị, hệ thống sẽ tự động cấu hình đĩa rồi cài đặt Linux, hoặc sao chép và khởi chạy một ảnh hệ thống được tạo trước.
Các phương thức được sử dụng trong quá trình cung cấp tài nguyên tự động gồm:
- PXE và khởi động qua mạng
- Định nghĩa cài đặt tự động như Kickstart và AutoYaST
- Ảnh máy ảo đám mây
- Cấu hình ban đầu bằng cloud-init
- Đường ống xây dựng ảnh
- Hệ thống cung cấp máy chủ vật lý
- Mẫu container và máy ảo
Trong quá trình cung cấp, tên máy chủ, địa chỉ mạng, thiết bị lưu trữ, thông tin xác thực quản trị, kho gói và kết nối với hệ thống giám sát được thiết lập tự động. Hệ thống sau khi cài đặt có thể được đăng ký vào cơ sở dữ liệu quản lý tài sản hoặc hệ thống khám phá dịch vụ.
Định nghĩa cài đặt tự động cũng có thể được quản lý phiên bản cùng mã nguồn. Điều này cho phép theo dõi ai đã thay đổi thiết lập nào và áp dụng cùng cấu hình đã được kiểm chứng trong môi trường thử nghiệm vào môi trường vận hành.
Quản lý cấu hình
Cấu hình của hệ thống Linux đang vận hành có thể thay đổi theo thời gian. Nếu quản trị viên trực tiếp sửa tệp, thêm gói hoặc để lại thay đổi tạm thời trong quá trình ứng phó sự cố, trạng thái thực tế có thể khác với cấu hình tiêu chuẩn ban đầu. Hiện tượng này được gọi là độ lệch cấu hình.
Công cụ quản lý cấu hình khai báo trạng thái mà hệ thống phải duy trì và áp dụng lặp lại trạng thái đó trên nhiều thiết bị. Các công cụ tiêu biểu gồm Ansible, Puppet, Chef và Salt.
Đối tượng quản lý cấu hình có thể gồm:
- Gói cần cài đặt và gói cần gỡ bỏ
- Trạng thái chạy của dịch vụ
- Nội dung và quyền của tệp cấu hình
- Người dùng và nhóm
- SSH và chính sách xác thực
- Quy tắc tường lửa
- Gắn thiết bị lưu trữ
- Thiết lập chuyển tiếp nhật ký
- Triển khai ứng dụng
- Tác vụ định kỳ và giới hạn hệ thống
Máy chủ quản lý cấu hình có thể tập trung gửi lệnh đến từng hệ thống, hoặc tác nhân trên mỗi nút có thể định kỳ nhận và áp dụng chính sách trung tâm. Phương thức không cài tác nhân, sử dụng SSH và các công cụ hệ thống hiện có, cũng được sử dụng.
Định nghĩa tự động hóa thường được viết sao cho dù thực thi cùng một tác vụ nhiều lần, kết quả không thay đổi một cách không cần thiết. Nhờ đó có thể tạo máy chủ mới ở cùng trạng thái với máy chủ hiện có, phát hiện cấu hình bị thay đổi sai hoặc khôi phục trạng thái ban đầu.
Quản lý tài khoản và truy cập
Linux cung cấp mô hình kiểm soát truy cập UNIX truyền thống sử dụng tài khoản root, người dùng thông thường, nhóm và quyền tệp. Trong môi trường công nghiệp, mô hình này được kết hợp với xác thực tập trung, quản lý dựa trên vai trò và hệ thống kiểm toán.
Quản trị viên thường không trực tiếp thực hiện công việc hằng ngày bằng tài khoản root. Thay vào đó, họ đăng nhập bằng tài khoản cá nhân rồi dùng công cụ như sudo để chỉ thực thi những lệnh quản trị đã được phê duyệt với quyền cao. Phương thức này giúp dễ dàng ghi lại người thực hiện, thời gian thực hiện và phân biệt quyền theo từng người dùng.
Trong tổ chức lớn, thông tin tài khoản không được tạo riêng trên từng máy chủ mà được liên kết với hệ thống thư mục và xác thực tập trung như LDAP, Kerberos hoặc Active Directory. Khi người dùng rời tổ chức hoặc thay đổi vai trò, tài khoản và quyền trung tâm được sửa đổi rồi phản ánh trên nhiều hệ thống Linux.
Quản lý truy cập trong môi trường công nghiệp có thể sử dụng các yếu tố sau.
- Tài khoản quản trị riêng cho từng cá nhân
- Khóa công khai hoặc chứng chỉ SSH
- Xác thực đa yếu tố
- Chính sách
sudo - Thư mục người dùng tập trung
- Thông tin xác thực truy cập có thời hạn ngắn
- Hệ thống quản lý quyền truy cập đặc quyền
- Ghi lại lệnh và phiên làm việc
- Tách biệt tài khoản dịch vụ và tài khoản con người
Dịch vụ cũng được chạy bằng người dùng riêng thay vì toàn bộ quyền root bất cứ khi nào có thể. Linux capabilities và chính sách kiểm soát truy cập có thể được sử dụng để chỉ cấp những quyền cần thiết.
Quản lý bản vá và lỗ hổng
Trong môi trường thương mại, cập nhật không chỉ là công việc nhằm có được chức năng mới mà còn là một quy trình vận hành để kiểm soát lỗ hổng và lỗi. Tổ chức xác định hệ điều hành và danh sách gói đang sử dụng, đánh giá lỗ hổng được công bố có ảnh hưởng đến hệ thống của mình hay không, rồi phân phối gói sửa lỗi.
Cập nhật bảo mật thường trải qua quy trình sau.
- Thu thập thông tin lỗ hổng và khuyến cáo từ nhà cung cấp.
- Xác định bản phân phối và phiên bản gói bị ảnh hưởng.
- Đánh giá mức độ rủi ro và khả năng bị lộ ra bên ngoài.
- Áp dụng cập nhật trong môi trường thử nghiệm.
- Kiểm chứng ứng dụng và chức năng hệ thống.
- Triển khai vào môi trường vận hành trong khoảng thời gian bảo trì.
- Kiểm tra hệ thống cập nhật thất bại và nhu cầu khởi động lại.
- Lưu kết quả áp dụng vào hồ sơ kiểm toán.
Nếu cập nhật tất cả máy chủ cùng lúc, một lỗi chung có thể ảnh hưởng đến toàn bộ dịch vụ. Vì vậy, bản cập nhật thường được áp dụng trước trên một số máy thử nghiệm và hệ thống không trọng yếu rồi dần mở rộng phạm vi. Nếu phát hiện sự cố, cần chuẩn bị khả năng quay lại gói cũ hoặc khôi phục ảnh hệ thống trước đó.
Cập nhật nhân và thư viện cốt lõi có thể yêu cầu khởi động lại hệ thống hoặc tiến trình. Để giảm thời gian gián đoạn, lưu lượng được chuyển sang các nút khác trước khi lần lượt khởi động lại từng máy.
Một số bản phân phối cung cấp chức năng vá trực tiếp để áp dụng một phạm vi hạn chế các bản sửa lỗ hổng nhân lên hệ thống đang chạy. Livepatch của Ubuntu được thiết kế để áp dụng các bản sửa cho lỗ hổng nhân quan trọng lên nhân đang hoạt động, qua đó giảm nhu cầu khởi động lại ngay lập tức.[39] Vá trực tiếp không thay thế được mọi thay đổi của nhân, vì vậy kế hoạch cập nhật đầy đủ và khởi động lại định kỳ vẫn được duy trì riêng.
Quản lý vòng đời
Đối với hệ thống doanh nghiệp, không chỉ độ ổn định tại thời điểm cài đặt mà cả thời hạn nhận bản sửa bảo mật và hỗ trợ kỹ thuật cũng rất quan trọng. Tổ chức lập kế hoạch triển khai, duy trì, nâng cấp và loại bỏ dựa trên vòng đời của bản phân phối.
Quản lý vòng đời thông thường gồm các giai đoạn sau.
- Đánh giá bản phân phối và phiên bản sẽ triển khai
- Chứng nhận ứng dụng và phần cứng
- Phát triển ảnh tiêu chuẩn và quy trình vận hành
- Triển khai vào vận hành
- Vá định kỳ và cập nhật nhỏ
- Thử nghiệm phiên bản chính tiếp theo
- Di chuyển theo từng giai đoạn
- Loại bỏ phiên bản cũ và dọn dẹp dữ liệu
Hệ thống cũ có thể khó được nâng cấp ngay lập tức do khả năng tương thích ứng dụng và quy định. Bản phân phối doanh nghiệp đôi khi cung cấp gói hỗ trợ mở rộng với một phạm vi hạn chế các bản sửa bảo mật và hỗ trợ kỹ thuật cho những môi trường này.
Tuy nhiên, hỗ trợ mở rộng được sử dụng như phương tiện để có thêm thời gian di chuyển chứ không phải thay thế vĩnh viễn việc chuyển phiên bản. Phần cứng và ứng dụng mới có thể không hỗ trợ bản phân phối cũ, còn chức năng bảo mật và công cụ phát triển mới thường tập trung vào phiên bản hiện đại.
Tổ chức vận hành quản lý bản phân phối, phiên bản, ngày kết thúc hỗ trợ, đơn vị phụ trách và kế hoạch chuyển đổi của từng dịch vụ dưới dạng thông tin tài sản. Việc chuyển phiên bản cũng có thể được phân tán trong nhiều năm để tránh phải thay thế mọi hệ thống cùng lúc ngay trước khi hết hỗ trợ.
Giám sát và khả năng quan sát
Trạng thái vận hành của hệ thống Linux được quan sát qua nhật ký, chỉ số và thông tin truy vết thực thi. Thay vì trực tiếp kiểm tra màn hình từng máy chủ, thông tin từ nhiều hệ thống được gửi đến hệ thống thu thập trung tâm và cảnh báo được phát ra khi phát hiện trạng thái bất thường.
Các đối tượng giám sát chính gồm:
- Mức sử dụng và tải CPU
- Mức sử dụng bộ nhớ và swap
- Dung lượng đĩa và độ trễ nhập xuất
- Lỗi mạng và lưu lượng xử lý
- Trạng thái tiến trình và dịch vụ
- Nhật ký hệ thống và ứng dụng
- Lỗi hệ thống tệp và thiết bị lưu trữ
- Xác thực thất bại và sự kiện bảo mật
- Thời gian phản hồi của ứng dụng
- Tỷ lệ thành công của yêu cầu người dùng
Linux cung cấp thông tin vận hành thông qua /proc, /sys, nhật ký hệ thống, bộ đếm hiệu năng và nhiều giao diện nhân khác. Tác nhân thu thập có thể truyền thông tin này đến cơ sở dữ liệu chuỗi thời gian hoặc hệ thống nhật ký trung tâm.
Giám sát không kết thúc ở việc kiểm tra tài nguyên hệ thống. Máy chủ có thể vẫn đang chạy nhưng yêu cầu thực tế của khách hàng lại thất bại, vì vậy tỷ lệ thành công, độ trễ và lưu lượng xử lý ở cấp ứng dụng cũng được đo lường.
Cảnh báo có thể được phát ra không chỉ dựa trên ngưỡng đơn giản mà còn theo bất thường kéo dài trong một khoảng thời gian, sự kết hợp của nhiều tín hiệu và mục tiêu mức dịch vụ. Quá nhiều cảnh báo có thể khiến người vận hành bỏ sót vấn đề quan trọng, vì vậy chính sách cảnh báo được điều chỉnh quanh những điều kiện thực sự cần hành động.
Nhật ký và kiểm toán
Hệ thống và ứng dụng Linux ghi nhật ký về quá trình khởi động, bắt đầu và kết thúc dịch vụ, xác thực, lỗi và sự kiện bảo mật. Trong môi trường sử dụng systemd, journald có thể thu thập nhật ký hệ thống, ngoài ra còn có các triển khai như rsyslog và syslog-ng.
Trong môi trường công nghiệp, nhật ký thường không chỉ được lưu trên từng máy chủ mà còn được gửi đến hệ thống nhật ký trung tâm. Nhật ký tập trung giúp bảo tồn hồ sơ ngay cả khi máy chủ bị hư hại hoặc dữ liệu cục bộ bị xóa, đồng thời cho phép liên kết và phân tích sự kiện xảy ra trên nhiều hệ thống theo trình tự thời gian.
Hồ sơ kiểm toán có thể bao gồm các thông tin sau.
- Đăng nhập quản trị và nâng quyền
- Thay đổi người dùng và nhóm
- Sửa đổi tệp cấu hình quan trọng
- Cài đặt và gỡ bỏ gói
- Bắt đầu và dừng dịch vụ
- Thay đổi chính sách bảo mật
- Truy cập tệp quan trọng
- Sự kiện mạng và xác thực
Tổ chức có yêu cầu về bảo mật và quy định sẽ thiết lập riêng thời hạn lưu giữ, quyền truy cập, mã hóa và phương thức chống sửa đổi nhật ký. Thay vì ghi lại vô hạn mọi lệnh, phạm vi kiểm toán được thiết kế dựa trên tài sản cần bảo vệ và sự kiện cần thiết cho điều tra.
Tính sẵn sàng cao và ứng phó sự cố
Trong dịch vụ thương mại, nhiều hệ thống được cấu hình cùng nhau để toàn bộ dịch vụ vẫn tiếp tục hoạt động ngay cả khi một máy chủ Linux dừng. Tính sẵn sàng cao không phải là một chức năng đơn lẻ của hệ điều hành mà được triển khai bằng cách kết hợp ứng dụng, mạng, thiết bị lưu trữ và quy trình vận hành.
Các phương thức thường được sử dụng gồm:
- Cân bằng tải giữa nhiều máy chủ
- Cấu hình chủ động–dự phòng hoặc nhiều nút chủ động
- Sao chép dữ liệu
- Phát hiện lỗi và chuyển đổi tự động
- Khởi động lại máy ảo và container
- Phân bố giữa nhiều trung tâm dữ liệu hoặc vùng sẵn sàng
- Kiểm tra trạng thái dịch vụ
- Duy trì công suất dự phòng
Phần mềm quản lý cụm kiểm tra trạng thái nút và dịch vụ, đồng thời có thể khởi động tài nguyên bị lỗi trên một nút khác. Cơ sở dữ liệu và hệ thống lưu trữ cũng có thể cung cấp chức năng sao chép và đồng thuận riêng.
Tự động khôi phục không phải lúc nào cũng an toàn. Nếu hai nút đồng thời cho rằng mình là nút bình thường do mất kết nối mạng, chúng có thể thực hiện ghi xung đột lên cùng dữ liệu. Để ngăn điều này, các chức năng như quorum, fencing và chặn quyền truy cập thiết bị lưu trữ được sử dụng.
Quy trình ứng phó sự cố không chỉ bao gồm phục hồi kỹ thuật mà còn gồm gọi người phụ trách, thông báo cho người dùng, phân tích nguyên nhân và hành động tiếp theo. Sau khi khôi phục, nguyên nhân trực tiếp và các điều kiện khiến sự cố lan rộng được phân tích để cải thiện giám sát, tự động hóa và cấu trúc hệ thống.
Sao lưu và khôi phục sau thảm họa
Tính sẵn sàng cao giúp giảm gián đoạn dịch vụ nhưng không thay thế sao lưu để xử lý việc xóa hoặc hỏng dữ liệu, triển khai sai và xâm nhập bảo mật. Hệ thống sao chép cũng có thể nhanh chóng sao chép dữ liệu sai sang nhiều nút.
Đối tượng sao lưu trong môi trường Linux có thể gồm:
- Cơ sở dữ liệu và dữ liệu người dùng
- Cấu hình ứng dụng
- Khóa mã hóa và chứng chỉ
- Định nghĩa triển khai và tự động hóa
- Ảnh hệ thống
- Hồ sơ kiểm toán và vận hành
Chính sách sao lưu được thiết kế theo mục tiêu điểm khôi phục, thể hiện cần phục hồi dữ liệu đến thời điểm nào, và mục tiêu thời gian khôi phục, thể hiện cần đưa dịch vụ hoạt động trở lại trong bao lâu sau sự cố.
Bản sao lưu được lưu trên thiết bị hoặc khu vực khác với hệ thống gốc, và một số bản sao có thể được cách ly khỏi tài khoản vận hành. Không chỉ kiểm tra sự tồn tại của tệp sao lưu mà còn cần định kỳ thử khôi phục thực tế để xác nhận quy trình phục hồi và tính hợp lệ của dữ liệu.
Kế hoạch khôi phục sau thảm họa có thể giả định sự cố toàn bộ trung tâm dữ liệu, gián đoạn một khu vực đám mây, ransomware hoặc lỗi của người vận hành. Tổ chức lập tài liệu và thử nghiệm quy trình tạo lại hệ thống Linux cùng ứng dụng trong môi trường thay thế, sau đó phục hồi dữ liệu và cấu hình mạng.
Tăng cường bảo mật và tuân thủ
Trạng thái cài đặt mặc định của Linux trong môi trường công nghiệp có thể chưa đáp ứng mọi yêu cầu bảo mật của tổ chức. Đơn vị vận hành chỉ kích hoạt những dịch vụ cần thiết và điều chỉnh quyền tệp, tài khoản, mạng cùng thiết lập nhân theo tiêu chuẩn.
Tăng cường bảo mật có thể bao gồm các công việc sau.
- Gỡ bỏ gói và dịch vụ không sử dụng
- Hạn chế đăng nhập root từ xa
- Áp dụng xác thực mạnh và xác thực đa yếu tố
- Hạn chế truy cập bằng tường lửa và mạng
- Áp dụng chính sách SELinux hoặc AppArmor
- Kích hoạt chức năng kiểm toán
- Mã hóa và quản lý khóa
- Điều chỉnh tham số bảo mật của nhân và hệ thống
- Kiểm tra thay đổi và lỗ hổng
- Xác minh tính toàn vẹn của quá trình khởi động và phần mềm
Trong lĩnh vực tài chính, y tế, công cộng và quốc phòng, ngoài chính sách nội bộ, tổ chức có thể phải đáp ứng pháp luật, tiêu chuẩn ngành và tiêu chuẩn bảo mật của chính phủ. Sản phẩm Linux doanh nghiệp và dịch vụ quản lý đôi khi cung cấp hỗ trợ cho tiêu chuẩn CIS, mô-đun mật mã được xác thực theo FIPS và các tiêu chuẩn như DISA STIG. Ubuntu Pro cung cấp khả năng bảo trì bảo mật dài hạn cùng các chức năng liên quan đến FIPS, CIS và DISA STIG dưới dạng dịch vụ doanh nghiệp.[40]
Tuân thủ không kết thúc sau khi áp dụng thiết lập một lần. Trạng thái có thể thay đổi do các thay đổi trong vận hành và lỗ hổng mới, vì vậy hệ thống được kiểm tra định kỳ, đồng thời những mục lệch khỏi tiêu chuẩn được báo cáo hoặc tự động sửa.
Vận hành ảo hóa và đám mây
Linux trong môi trường thương mại có thể được cài đặt trực tiếp trên máy chủ vật lý, nhưng cũng thường chạy dưới dạng máy ảo, phiên bản đám mây công cộng hoặc máy chủ container.
Trong môi trường ảo hóa, hệ thống được tạo bằng cách sao chép mẫu hoặc ảnh thay vì trực tiếp cài đặt hệ điều hành. Máy chủ có thể được xem không phải là thiết bị riêng biệt được quản lý thủ công trong thời gian dài, mà là tài nguyên được tự động tạo và loại bỏ khi cần.
Trong vận hành đám mây, các yếu tố sau được kết hợp với quản lý Linux.
- Ảnh và loại phiên bản máy
- Mạng ảo và chính sách tường lửa
- Lưu trữ khối và đối tượng
- Tự động mở rộng
- Cân bằng tải
- Quyền đám mây dựa trên vai trò
- Siêu dữ liệu và thông tin xác thực tạm thời
- Hạ tầng dưới dạng mã
- Quản lý mức sử dụng và chi phí
Nhà cung cấp đám mây có thể phối hợp với nhà phát hành bản phân phối để cung cấp ảnh Linux kèm hợp đồng hỗ trợ. Người dùng có thể thanh toán chi phí đăng ký cùng phí sử dụng đám mây hoặc liên kết hợp đồng doanh nghiệp hiện có với phiên bản đám mây.
Đám mây không loại bỏ hoàn toàn trách nhiệm quản trị. Ngay cả khi nhà cung cấp quản lý phần cứng vật lý và một số dịch vụ nền tảng, người dùng vẫn phải quản lý gói, tài khoản, ứng dụng, dữ liệu và chính sách truy cập bên trong máy ảo.
Máy chủ container
Linux cung cấp môi trường thực thi container dựa trên namespace và cgroups. Trong môi trường công nghiệp, hệ điều hành máy chủ có thể được duy trì tương đối nhỏ và nhất quán, còn ứng dụng cùng thư viện phụ thuộc được triển khai dưới dạng ảnh container.
Việc quản lý máy chủ Linux vẫn cần thiết trong vận hành container. Vì mọi container dùng chung nhân của máy chủ, lỗ hổng nhân, cạn kiệt tài nguyên, quyền truy cập thiết bị và thiết lập cách ly có thể ảnh hưởng đến toàn bộ nút.
Vận hành máy chủ container bao gồm các yếu tố sau.
- Cập nhật nhân và runtime của máy chủ
- Xác minh nguồn gốc và chữ ký của ảnh container
- Kiểm tra lỗ hổng ảnh
- Giới hạn CPU và bộ nhớ
- Chính sách mạng
- Quản lý bí mật và chứng chỉ
- Thu thập nhật ký và chỉ số
- Thay thế và rút tải khỏi nút
- Quản lý thiết bị lưu trữ và dữ liệu lâu dài
Hệ thống điều phối như Kubernetes tự động hóa việc bố trí, khởi động lại, khám phá dịch vụ và mở rộng container. Trong trường hợp này, quản trị viên quản lý trạng thái triển khai đã khai báo và chính sách của toàn bộ cụm thay vì trực tiếp kết nối vào từng container.
Quản lý thay đổi và triển khai
Thay đổi trên hệ thống Linux vận hành có thể là nguyên nhân chính gây sự cố và sự kiện bảo mật. Doanh nghiệp quản lý thay đổi gói, cấu hình và ứng dụng thông qua quy trình cho phép yêu cầu, xem xét, thử nghiệm, triển khai và khôi phục.
Thay đổi thường lần lượt đi qua môi trường phát triển, thử nghiệm, chuẩn bị và vận hành. Việc triển khai cùng mã tự động hóa, gói hoặc ảnh với chỉ thiết lập khác nhau theo môi trường giúp giảm chênh lệch giữa kết quả thử nghiệm và vận hành.
Các phương thức triển khai gồm:
- Cập nhật tuần tự mọi nút
- Triển khai canary, áp dụng trước cho một số nút
- Triển khai xanh–lam, vận hành song song môi trường cũ và mới
- Thay thế toàn bộ ảnh hệ thống
- Cập nhật cuốn chiếu ảnh container
- Kích hoạt theo giai đoạn bằng cờ tính năng
Trước khi thay đổi, phương thức khôi phục, ảnh hưởng đến dịch vụ và tiêu chuẩn giám sát được xác định. Nếu tỷ lệ lỗi hoặc độ trễ vượt chuẩn sau triển khai, hệ thống có thể tự động hoặc thủ công quay về phiên bản trước.
Bản thân hệ điều hành cũng có thể được quản lý như một ảnh bất biến. Thay vì liên tục thêm gói vào máy chủ đang chạy, việc thay thế máy chủ bằng ảnh mới giúp giảm độ lệch cấu hình giữa các nút.
Hỗ trợ kỹ thuật và phân chia trách nhiệm
Linux được cấu thành từ nhiều dự án và doanh nghiệp, vì vậy khi xảy ra lỗi, không phải lúc nào cũng có thể xác định ngay thành phần gây ra vấn đề. Cần phân tích xem nguyên nhân nằm ở nhân, phần cứng, tầng ảo hóa, thư viện, cơ sở dữ liệu hay ứng dụng.
Hợp đồng hỗ trợ doanh nghiệp có thể cung cấp một đầu mối duy nhất để tiếp nhận và tái hiện vấn đề, đồng thời phối hợp với dự án liên quan hoặc nhà sản xuất phần cứng. Nhà cung cấp xác định gói, cấu hình và phạm vi chứng nhận phần cứng được hỗ trợ, rồi cung cấp bản sửa lỗi hoặc giải pháp tạm thời trong phạm vi đó.
Bên trong tổ chức, trách nhiệm có thể được phân chia như sau.
- Nhóm nền tảng quản lý ảnh Linux và dịch vụ chung.
- Nhóm mạng và lưu trữ quản lý hạ tầng nền.
- Nhóm bảo mật quản lý quyền truy cập, lỗ hổng và chính sách tuân thủ.
- Nhóm ứng dụng chịu trách nhiệm vận hành mã dịch vụ và dữ liệu.
- Tổ chức kỹ thuật độ tin cậy trang web phụ trách tự động hóa, quan sát và ứng phó sự cố.
- Văn phòng chương trình nguồn mở quản lý giấy phép sử dụng và chính sách đóng góp bên ngoài.
Ngoài cách phân chia vai trò nghiêm ngặt, cũng có cấu trúc trong đó một nhóm sản phẩm cùng phụ trách phát triển và vận hành, còn nhóm nền tảng chung cung cấp chức năng cơ sở.
Đóng góp cho dự án nguồn mở
Doanh nghiệp không chỉ sử dụng Linux và phần mềm nguồn mở liên quan mà còn thuê nhà phát triển để gửi chức năng và bản sửa đổi lên dự án thượng nguồn.
Nếu doanh nghiệp chỉ duy trì các thay đổi riêng trong nội bộ, mỗi khi phiên bản nhân hoặc bản phân phối mới được phát hành, các thay đổi đó phải được áp dụng lại. Khi bản sửa được đưa vào dự án chính thức, nó có thể được các nhà phát triển khác xem xét và thử nghiệm, đồng thời gánh nặng bảo trì dài hạn được chia sẻ với cộng đồng.
Các đối tượng đóng góp gồm:
- Trình điều khiển phần cứng mới
- Cải tiến hiệu năng máy chủ và mạng
- Hệ thống tệp và chức năng lưu trữ
- Chức năng ảo hóa và container
- Bản sửa bảo mật
- Báo cáo lỗi và thử nghiệm
- Tài liệu và hạ tầng phát triển
- Nhân lực bảo trì dài hạn và hỗ trợ tài chính
Linux Foundation cung cấp một nền tảng hợp tác trung lập để doanh nghiệp và nhà phát triển cùng vận hành dự án nguồn mở, đồng thời hướng dẫn chiến lược và cơ cấu tổ chức nhằm tham gia và quản lý các dự án nguồn mở mà doanh nghiệp phụ thuộc.[41]
Đóng góp của doanh nghiệp không chỉ là hoạt động từ thiện. Đây cũng là hoạt động kinh doanh nhằm đưa chức năng cần thiết cho sản phẩm của mình vào mã chính thức, chia sẻ chi phí phát triển thông qua bảo trì chung và tham gia định hướng kỹ thuật cùng chất lượng của dự án.
Công cụ quản trị và kiểm soát tập trung
Tổ chức quy mô lớn thường không quản lý riêng từng máy chủ Linux mà quản lý tài sản, bản vá, chính sách và trạng thái trên một nền tảng tập trung.
Hệ thống quản trị trung tâm có thể cung cấp các chức năng sau.
- Danh sách hệ thống và phiên bản đã đăng ký
- Trạng thái gói và lỗ hổng
- Triển khai cập nhật hàng loạt
- Kiểm tra cấu hình và tuân thủ
- Thực thi tác vụ từ xa
- Sao chép kho và nội dung
- Trạng thái đăng ký và hỗ trợ
- Báo cáo và hồ sơ kiểm toán
- Quản trị ngoại tuyến trong môi trường bị ngắt Internet
Landscape của Canonical tự động hóa vá bảo mật, kiểm toán, truy cập và công việc tuân thủ cho tập hợp hệ thống Ubuntu, đồng thời có thể vận hành trong môi trường mạng bị tách biệt.[42] Red Hat và SUSE cũng cung cấp sản phẩm quản trị hệ thống và nội dung cho các bản phân phối doanh nghiệp của mình.
Công cụ tập trung không tích hợp hoàn toàn mọi môi trường. Tổ chức vận hành nhiều bản phân phối, đám mây và thiết bị mạng có thể kết hợp công cụ quản trị riêng của từng bản phân phối với hệ thống tự động hóa và giám sát đa dụng.
Vận hành Linux trong môi trường công nghiệp
Lý do Linux được chấp nhận trong môi trường công nghiệp không thể chỉ được giải thích bằng chi phí giấy phép. Linux có thể được sử dụng trên nhiều phần cứng cùng môi trường ảo hóa và đám mây, đồng thời có thể được sửa đổi theo yêu cầu tự động hóa và sản phẩm dựa trên mã nguồn cùng giao diện công khai.
Doanh nghiệp sử dụng một nền tảng được nhiều tổ chức cùng duy trì thay vì tự phát triển từ đầu nhân và không gian người dùng chung. Bên trên nền tảng đó, họ cung cấp cơ sở dữ liệu, phần mềm trung gian, dịch vụ đám mây, thiết bị mạng, sản phẩm công nghiệp và hỗ trợ kỹ thuật.
Vận hành Linux thương mại kết hợp khả năng tự do sửa đổi với quy trình vận hành có kiểm soát. Mã nguồn và các thành phần hệ thống có thể được công khai, nhưng môi trường vận hành thực tế được quản lý dưới các phiên bản đã phê duyệt, gói đã kiểm chứng, thay đổi tự động và hệ thống hỗ trợ có trách nhiệm.
Vì vậy, trong môi trường công nghiệp, Linux không chỉ được sử dụng như một hệ điều hành có thể cài đặt miễn phí mà còn như một hệ thống nền tảng bao gồm nền tảng được duy trì dài hạn, chuỗi cung ứng, công cụ vận hành, nhân lực kỹ thuật và hệ sinh thái phát triển cộng tác.
Bảo mật
Bảo mật của Linux được hình thành từ sự kết hợp giữa các chức năng cách ly tiến trình và kiểm soát truy cập do nhân cung cấp, cơ chế quản lý gói và cập nhật bảo mật của bản phân phối, cấu hình ứng dụng cùng quy trình quản trị của tổ chức vận hành. Việc mã nguồn nhân Linux được công khai không tự động khiến hệ thống trở nên an toàn hoặc dễ bị tổn thương. Mã nguồn công khai cho phép nhiều nhà phát triển và nhà nghiên cứu bảo mật xem xét, thử nghiệm, nhưng do quy mô mã rất lớn, phạm vi hỗ trợ phần cứng đa dạng và đặc tính nhân chạy với quyền hạn cao, lỗi và lỗ hổng vẫn liên tục được phát hiện.
Phạm vi bảo mật của hệ thống dựa trên Linux không chỉ bao gồm nhân Linux mà còn cả bộ nạp khởi động, thư viện hệ thống, shell, dịch vụ mạng, kho gói và các ứng dụng được cài đặt. Vì vậy, một sự cố thường được gọi là “lỗ hổng Linux” trên thực tế có thể là lỗi của chính nhân, lỗ hổng trong chương trình không gian người dùng, vấn đề cấu hình của bản phân phối hoặc một cuộc tấn công chuỗi cung ứng phần mềm.
Mô hình bảo mật cơ bản
Linux sử dụng mô hình người dùng, nhóm, tiến trình và quyền sở hữu tệp được phát triển từ UNIX. Mỗi tiến trình có mã định danh người dùng, mã định danh nhóm và nhiều thông tin xác thực bảo mật khác nhau. Nhân kiểm tra các thông tin này khi tiến trình truy cập tệp, thiết bị, tiến trình khác và chức năng mạng.
Theo truyền thống, người dùng có toàn bộ quyền quản trị được biểu diễn bằng tài khoản root. Người dùng thông thường chạy chương trình với quyền hạn chế và chỉ thực hiện những tác vụ quản trị cần thiết với quyền cao thông qua công cụ như sudo.
Tệp được thiết lập quyền đọc, ghi và thực thi cho chủ sở hữu, nhóm và những người dùng khác. Danh sách kiểm soát truy cập cho phép cấp quyền chi tiết hơn cho người dùng và nhóm cụ thể. Mô hình này cung cấp khả năng cách ly cơ bản nhưng có thể không đủ để ngăn kẻ tấn công đã chiếm được quyền root hoặc lỗi trong quá trình kiểm tra quyền.
Linux cung cấp capabilities, chia quyền của root thành nhiều đơn vị nhỏ hơn. Một chương trình có thể chỉ nhận những quyền cần thiết để cấu hình mạng, thay đổi mã định danh người dùng hoặc thực hiện một số thao tác hệ thống nhất định mà không cần toàn bộ quyền quản trị. Tuy nhiên, những quyền có phạm vi rất rộng như CAP_SYS_ADMIN trên thực tế bao gồm nhiều chức năng quản trị, vì vậy cần được cấp ở mức tối thiểu.
Kiểm soát truy cập bắt buộc
Ngoài quyền tệp truyền thống, Linux còn cung cấp kiến trúc LSM. LSM là một cấu trúc chung cho phép gắn các kiểm tra bảo mật quan trọng đối với tệp, tiến trình, socket và thông tin xác thực vào bên trong nhân.[43]
Các hệ thống bảo mật tiêu biểu sử dụng LSM gồm:
SELinux áp dụng chính sách kiểm soát truy cập bắt buộc chi tiết dựa trên nhãn bảo mật của người dùng, tiến trình, tệp và các đối tượng khác. AppArmor sử dụng hồ sơ riêng cho từng chương trình để giới hạn tệp và chức năng mà chương trình có thể truy cập. Những chính sách này được dùng để giảm phạm vi truy cập của kẻ tấn công vào toàn bộ hệ thống ngay cả khi ứng dụng bị xâm nhập.
Landlock cho phép một tiến trình người dùng tự giới hạn phạm vi truy cập hệ thống tệp của chính mình. Ứng dụng có thể thu hẹp vùng tệp mà bản thân và tiến trình con được phép truy cập mà không cần quyền quản trị cao.[44]
Kiểm soát truy cập bắt buộc không loại bỏ lỗ hổng trong chương trình. Thay vào đó, khi lỗ hổng bị khai thác, nó giới hạn dữ liệu mà kẻ tấn công có thể đọc hoặc sửa đổi và những hành động có thể thực hiện, qua đó giảm phạm vi thiệt hại.
Cách ly tiến trình và giảm bề mặt tấn công
Linux cung cấp nhiều chức năng để giảm phạm vi chức năng nhân và tài nguyên hệ thống mà chương trình có thể sử dụng.
seccomp giới hạn các lời gọi hệ thống mà một tiến trình có thể thực hiện. Sandbox của trình duyệt web, runtime container và dịch vụ mạng có thể chặn những lời gọi hệ thống không cần thiết cho hoạt động bình thường để giảm bề mặt tấn công vào nhân.
Namespace phân tách các tài nguyên hệ thống mà tiến trình nhìn thấy, như mã định danh tiến trình, điểm gắn, giao diện mạng, người dùng và tên máy chủ. cgroups giới hạn CPU, bộ nhớ và tài nguyên nhập xuất mà tiến trình có thể sử dụng. Hai chức năng này là nền tảng của cách ly container, nhưng vì các container trên cùng một máy chủ chia sẻ một nhân Linux nên nếu tồn tại lỗ hổng trong nhân, vẫn có khả năng vượt qua ranh giới cách ly.
Tài liệu tự bảo vệ của nhân Linux mô tả cách sử dụng seccomp để giảm số điểm vào nhân mà tiến trình có thể truy cập, đồng thời hạn chế việc nạp mô-đun nhân hoặc sử dụng mô-đun đã ký để khiến kẻ tấn công đã giành quyền cao khó bổ sung mã vào nhân hơn.[45]
Dịch vụ nên được chạy bằng người dùng riêng khi có thể, đồng thời có thể kết hợp hệ thống tệp chỉ đọc, thư mục bị giới hạn, capabilities và bộ lọc lời gọi hệ thống. systemd và runtime container cũng có thể cung cấp những chức năng nhân này dưới dạng thiết lập cách ly riêng cho từng dịch vụ.
Đặc điểm của lỗ hổng nhân
Nhân Linux chạy với quyền cao và xử lý yêu cầu từ mọi tiến trình cùng thiết bị, vì vậy lỗ hổng trong nhân có thể gây ảnh hưởng lớn hơn lỗi trong ứng dụng thông thường. Nếu khai thác thành công, kẻ tấn công có thể nâng quyền từ người dùng thông thường lên root, thoát khỏi ranh giới container hoặc ảo hóa, làm hệ thống ngừng hoạt động hay làm lộ thông tin.
Lỗ hổng có thể xuất hiện trong các khu vực sau.
- Sử dụng bộ nhớ sau khi đã giải phóng và giải phóng hai lần
- Truy cập vượt ngoài giới hạn bộ đệm
- Tràn số nguyên và kiểm tra độ dài sai
- Điều kiện tranh chấp
- Lỗi quản lý số tham chiếu và vòng đời đối tượng
- Lỗi kiểm tra con trỏ từ không gian người dùng
- Thiếu kiểm tra quyền đối với tệp và thư mục
- Lỗi xác thực dữ liệu đầu vào của gói mạng và hệ thống tệp
- Lỗi trong trình điều khiển thiết bị và xử lý
ioctl - Lỗi theo dõi trạng thái của bộ xác minh eBPF
- Rò rỉ thông tin thông qua thực thi suy đoán của CPU và bộ nhớ đệm
Phần lớn nhân Linux được viết bằng C. C phù hợp để điều khiển trực tiếp phần cứng và bộ nhớ, nhưng không tự động kiểm tra giới hạn mảng hoặc vòng đời đối tượng nên có thể xảy ra lỗi an toàn bộ nhớ.
Các nhà phát triển nhân đã bổ sung nền tảng để có thể sử dụng Rust trong một số hệ thống con. Việc dùng Rust không thay thế ngay mã C hiện có, nhưng là một trong những hướng nhằm giảm một số lỗi an toàn bộ nhớ như sử dụng sau khi giải phóng và truy cập con trỏ sai ngay ở giai đoạn biên dịch đối với mã mới.
Dirty COW
Dirty COW, được công bố năm 2016, là một lỗ hổng điều kiện tranh chấp trong quá trình xử lý copy-on-write của nhân Linux. Trong quá trình hai thao tác đồng thời diễn ra trên một tệp được ánh xạ chỉ đọc, lỗ hổng có thể vượt qua kiểm tra quyền và thay đổi nội dung tệp.
Kẻ tấn công có thể lợi dụng lỗ hổng này để sửa đổi tệp thực thi hoặc tệp hệ thống mà mình không có quyền ghi, rồi nâng quyền từ người dùng cục bộ lên root. Lỗ hổng được gán mã CVE-2016-5195.[46]
Dirty COW đã tồn tại trong nhân trong thời gian dài, nhưng sau khi khả năng khai thác thực tế được xác nhận, các bản phân phối lớn và nhà sản xuất thiết bị đã phát hành nhân được sửa. Sự cố này cho thấy chỉ vì bản sửa đã được đưa vào nhân Linux thượng nguồn không có nghĩa là mọi người dùng được bảo vệ ngay lập tức. Bản phân phối và quản trị viên máy chủ phải cung cấp và cài đặt gói đã sửa, còn nhà sản xuất Android và thiết bị nhúng cũng phải áp dụng bản sửa vào nhân của từng sản phẩm.
Dirty Pipe
Dirty Pipe, được công bố năm 2022, là lỗ hổng cho phép ghi đè dữ liệu tệp trong bộ nhớ đệm trang do một cờ chưa được khởi tạo trong triển khai pipe của nhân Linux. Nó có thể ảnh hưởng cả những tệp mà người dùng có quyền đọc nhưng không có quyền ghi, và trong điều kiện phù hợp có thể sửa đổi tệp hệ thống để nâng quyền.
Lỗ hổng này ảnh hưởng đến một số phiên bản từ Linux 5.8 trở đi và được gán mã CVE-2022-0847.[47]
Dirty Pipe được sửa bằng cách khởi tạo đúng cờ gây ra vấn đề, và bản sửa được đưa vào các dòng nhân ổn định được hỗ trợ cùng gói của bản phân phối. Quản trị viên phải cập nhật lên nhân đã sửa do bản phân phối cung cấp và khởi động lại hệ thống.
Dirty COW và Dirty Pipe là những lỗi triển khai khác nhau nhưng có điểm chung là người dùng thông thường có thể lợi dụng lỗi quản lý tệp và bộ nhớ trong nhân để giành quyền cao. Sau đó, ngoài việc sửa từng lỗ hổng cụ thể, các biện pháp phòng thủ chung như tăng cường khởi tạo bộ nhớ, kiểm tra vòng đời đối tượng và mở rộng thử nghiệm vẫn tiếp tục được bổ sung.
Lỗ hổng phần cứng
Linux phải ứng phó không chỉ với lỗi trong mã nhân mà còn với lỗ hổng bảo mật của chính bộ xử lý. Các lỗ hổng thực thi suy đoán như Spectre và Meltdown cho phép suy luận thông tin của tiến trình khác hoặc của nhân bằng cách lợi dụng cơ chế tối ưu hóa thực thi và hoạt động bộ nhớ đệm của CPU.
Những vấn đề này không chỉ là lỗ hổng của Linux, nhưng nhân phải triển khai các biện pháp giảm thiểu như phân tách không gian địa chỉ người dùng và nhân, kiểm soát dự đoán nhánh, làm sạch bộ nhớ đệm cùng trạng thái thực thi. Một số biện pháp có thể ảnh hưởng đến hiệu năng tùy loại bộ xử lý và mục đích sử dụng hệ thống.
Nhân Linux quản lý tài liệu riêng về phạm vi ảnh hưởng, chức năng giảm thiểu và phương thức cấu hình trong quá trình khởi động cũng như khi chạy đối với từng lỗ hổng CPU đã biết.[48]
Bản phân phối có thể cung cấp bản cập nhật vi mã CPU cùng với cập nhật nhân. Người vận hành sử dụng nhật ký nhân, giao diện /sys và công cụ kiểm tra của bản phân phối để xác nhận trạng thái giảm thiểu được áp dụng trên hệ thống.
Tự bảo vệ của nhân
Cải thiện bảo mật Linux không chỉ dừng ở việc sửa từng lỗ hổng đã phát hiện. Trong quá trình phát triển nhân, các chức năng phòng thủ được bổ sung nhằm khiến lỗ hổng khó phát sinh hơn hoặc khiến kẻ tấn công khó chuyển một lỗi tồn tại thành quyền nâng cao trong thực tế.
Các phương thức phòng thủ tiêu biểu gồm:
- Đặt vùng bộ nhớ không cần thực thi thành không thể thực thi
- Tách biệt bộ nhớ nhân có thể ghi và bộ nhớ nhân có thể thực thi
- Ngẫu nhiên hóa địa chỉ mã và dữ liệu của nhân
- Bảo vệ ngăn xếp và bảo vệ luồng điều khiển
- Hạn chế truy cập bộ nhớ không gian người dùng
- Khởi tạo đối tượng và bộ nhớ heap
- Làm sạch ngăn xếp nhân và thông tin nhạy cảm
- Ngăn tràn số đếm tham chiếu
- Bảo vệ dữ liệu nhân chỉ đọc
- Ký và hạn chế nạp mô-đun nhân
- Hạn chế dòng lệnh nhân và giao diện gỡ lỗi
Mục tiêu của tự bảo vệ nhân không phải là bảo đảm ngăn chặn hoàn toàn từng lỗ hổng, mà là loại bỏ các dạng lỗi lặp lại, tăng số điều kiện cần thiết cho một cuộc tấn công và giảm tỷ lệ thành công khi khai thác lỗ hổng.[49]
Bản phân phối kích hoạt một số chức năng này thông qua cấu hình xây dựng nhân và chính sách bảo mật mặc định. Vì một số chức năng có thể ảnh hưởng đến hiệu năng, khả năng tương thích và khả năng gỡ lỗi, không phải mọi bản phân phối và thiết bị đều sử dụng cùng một cấu hình.
Xem xét mã và kiểm tra tự động
Thay đổi của nhân Linux được xem xét công khai thông qua danh sách thư của từng hệ thống con và các nhà bảo trì. Bản vá được gửi có thể được xem xét không chỉ về tính chính xác của chức năng mà còn về khả năng tương thích với giao diện hiện có, tính đồng thời, quản lý bộ nhớ và ảnh hưởng bảo mật.
Công cụ phân tích tĩnh, cảnh báo trình biên dịch và các chức năng kiểm tra khi chạy như KASAN, UBSAN, KMSAN và lockdep cũng được sử dụng trong phát triển và thử nghiệm. Chúng giúp phát hiện truy cập bộ nhớ sai, sử dụng giá trị chưa khởi tạo, hành vi không xác định và lỗi khóa.
Fuzzing tự động tạo ra nhiều tổ hợp lời gọi hệ thống và dữ liệu đầu vào để tìm lỗi khiến nhân rơi vào trạng thái bất thường. syzkaller và syzbot của Google tự động tái hiện sự cố đã phát hiện và báo cáo cho nhà phát triển liên quan, đồng thời đã được dùng để tìm nhiều lỗ hổng và lỗi thông thường trong nhân Linux.[50]
Fuzzing và kiểm tra tự động không thể tìm được mọi lỗi logic và vấn đề quyền hạn. Vì vậy, việc xem xét mã, nghiên cứu bảo mật thủ công và báo cáo lỗi từ môi trường vận hành thực tế được sử dụng cùng nhau.
Báo cáo và sửa lỗ hổng
Nhân Linux có một cơ chế liên hệ bảo mật cho phép xem xét và sửa vấn đề trước khi công khai. Lỗ hổng có nguy cơ tức thời có thể được báo cáo qua danh sách bảo mật riêng tư, nơi người phụ trách bảo mật và nhà bảo trì hệ thống con liên quan xác nhận vấn đề rồi chuẩn bị bản sửa.[51]
Mã đã sửa được đưa vào nhân thượng nguồn và nếu đáp ứng điều kiện áp dụng thì cũng được chuyển ngược vào các dòng nhân ổn định được hỗ trợ. Bản phân phối áp dụng bản sửa vào nhân của mình rồi công bố khuyến cáo bảo mật và gói cập nhật.
Dự án nhân Linux hoạt động như một cơ quan đánh số CVE riêng, phân tích các commit sửa lỗi trong những nhân được hỗ trợ và gán mã CVE. Thông tin CVE của lỗ hổng nhân cùng commit sửa lỗi được công bố qua danh sách công khai.[52]
Trong phát triển nhân, đôi khi khó phân biệt hoàn toàn lỗi bảo mật với lỗi thông thường. Một sự cố đơn giản hoặc lỗi kiểm tra giới hạn cũng có thể trở thành lỗ hổng bảo mật nếu nó nằm trên đường xử lý đầu vào mà kẻ tấn công kiểm soát được. Vì vậy, trong môi trường vận hành, thay vì chỉ chọn cài những bản vá được ghi rõ là CVE, việc liên tục áp dụng cập nhật nhân ổn định do bản phân phối cung cấp thường được khuyến nghị.
Cập nhật bảo mật của bản phân phối
Ngay cả khi bản sửa của nhân Linux đã được công bố, hệ thống thực tế cũng không tự động được bảo vệ. Bản phân phối phải áp dụng bản sửa vào phiên bản nhân và gói của mình, xây dựng, thử nghiệm rồi phân phối qua kho phần mềm.
Nhóm bảo mật của bản phân phối thực hiện các công việc sau.
- Xác định phiên bản và cấu hình mặc định bị ảnh hưởng
- Xem xét bản sửa từ dự án thượng nguồn
- Chuyển ngược bản sửa vào phiên bản sản phẩm hiện có
- Xây dựng và thử nghiệm gói cập nhật
- Công bố khuyến cáo bảo mật và mức độ ảnh hưởng
- Thu hồi gói dễ bị tổn thương
- Duy trì phiên bản hỗ trợ dài hạn
- Truyền thông tin cho khách hàng và bản phân phối hạ nguồn
Bản phân phối doanh nghiệp đôi khi chỉ áp dụng bản sửa bảo mật cần thiết vào phiên bản hiện tại thay vì nâng toàn bộ chương trình lên phiên bản mới, nhằm duy trì khả năng tương thích ứng dụng. Vì vậy, ngay cả khi chuỗi phiên bản gói trông giống một phiên bản dễ bị tổn thương của dự án thượng nguồn, bản vá của bản phân phối có thể đã được áp dụng.
Để áp dụng hoàn toàn bản cập nhật nhân, thông thường phải khởi động lại để chạy nhân mới. Một số môi trường dùng vá trực tiếp để áp dụng một phạm vi hạn chế các bản sửa nhân trong khi hệ thống đang chạy, nhưng không thể xử lý mọi thay đổi mà không khởi động lại.
Chuỗi cung ứng phần mềm
Hệ thống Linux không chỉ được cấu thành từ mã do nhân và bản phân phối trực tiếp viết. Nó còn bao gồm thư viện, công cụ xây dựng, chương trình nén và dịch vụ mạng từ rất nhiều dự án nguồn mở độc lập.
Thay vì tìm lỗ hổng trong chương trình công khai, kẻ tấn công có thể nhắm vào tài khoản quản trị dự án, hệ thống xây dựng, tệp phân phối và kho gói. Nếu mã độc được chèn vào một tệp trông như được phát hành bởi nhà phát triển hợp pháp, nó có thể lan sang nhiều bản phân phối và sản phẩm.
Các phương thức sau được sử dụng để giảm nguy cơ này.
- Chữ ký số cho mã nguồn và gói
- Xác minh siêu dữ liệu kho
- Xem xét mã bởi nhiều nhà bảo trì
- Cách ly môi trường xây dựng
- Bản dựng có thể tái tạo
- Quản lý phụ thuộc và danh mục vật liệu phần mềm
- Xác thực đa yếu tố cho tài khoản nhà bảo trì
- So sánh tệp phát hành với kho mã nguồn
- Theo dõi nguồn gốc gói và lịch sử thay đổi
Bảo mật chuỗi cung ứng không chỉ là vấn đề an toàn mã của từng chương trình mà còn là việc quản lý ai có thể thay đổi, xây dựng và ký mã nguồn.
Sự cố cửa hậu XZ Utils
Tháng 3 năm 2024, mã độc được che giấu tinh vi đã được phát hiện trong các bản phát hành 5.6.0 và 5.6.1 của XZ Utils. Sự cố này được gán mã CVE-2024-3094.
Một phần thành phần độc hại không xuất hiện nguyên dạng trong kho mã nguồn thông thường mà được ẩn trong tarball phân phối và quá trình xây dựng. Nó được thiết kế để chèn mã độc vào liblzma trong một số môi trường xây dựng Linux cụ thể, rồi ảnh hưởng đến xử lý xác thực của máy chủ OpenSSH được liên kết với thư viện này thông qua systemd trong một số bản phân phối.[53]
Andres Freund, một nhà phát triển PostgreSQL, đã phát hiện vấn đề khi điều tra mức sử dụng CPU và độ trễ bất thường trong quá trình kết nối SSH cùng lỗi từ công cụ phân tích trên môi trường thử nghiệm Debian. Ngày 29 tháng 3 năm 2024, ông công bố kết quả phân tích trên danh sách thư oss-security.
XZ Utils không phải là một thành phần của nhân Linux mà là công cụ nén và thư viện có thể sử dụng trên nhiều hệ điều hành. Vì vậy, xem đây là sự cố trong đó cửa hậu được đưa vào nhân Linux là không chính xác. Tuy nhiên, mã tấn công nhắm vào cấu hình xây dựng của một số bản phân phối Linux và đường thực thi OpenSSH, đồng thời tìm cách lợi dụng chuỗi cung ứng của một thư viện cốt lõi trong bản phân phối Linux, nên được đánh giá là một sự cố bảo mật lớn của hệ sinh thái Linux.
Các phiên bản bị ảnh hưởng chủ yếu đã được đưa vào Fedora Rawhide, giai đoạn thử nghiệm của Fedora Linux 40 và kho phát triển hoặc thử nghiệm của Debian, openSUSE cùng một số hệ thống khác. Sự cố được phát hiện trước khi những phiên bản này được phân phối rộng rãi trong các bản phân phối doanh nghiệp ổn định. Red Hat và nhiều bản phân phối đã thu hồi gói bị ảnh hưởng và hướng dẫn quay lại phiên bản XZ an toàn trước đó.[54][55]
Sự cố này là một cuộc tấn công chuỗi cung ứng, trong đó một người đã giành được lòng tin của dự án trong thời gian dài rồi chèn mã độc vào hệ thống phát hành và xây dựng. Nó cho thấy chỉ xem xét mã nguồn công khai là chưa đủ, mà còn phải xác minh tarball được phân phối thực tế, kết quả xây dựng, quyền của nhà bảo trì và cấu trúc vận hành dự án.
Diễn biến cụ thể của các nỗ lực xâm nhập lớn như sự cố XZ Utils cùng những lỗ hổng của nhân và bản phân phối được trình bày trong Các sự cố lỗ hổng bảo mật Linux.
Bảo mật và phát triển công khai
Phương thức phát triển công khai của Linux có thể có lợi cho việc phát hiện và sửa lỗ hổng vì bất kỳ ai cũng có thể phân tích mã. Nhà nghiên cứu bảo mật, doanh nghiệp, trường đại học và nhà phát triển bản phân phối có thể phân tích cùng một mã và đề xuất bản vá, trong khi quá trình sửa đổi và lịch sử thay đổi mã cũng được công khai.
Tuy nhiên, việc mã được công khai không có nghĩa là mọi phần đều được đủ số người xem xét. Một số hệ thống con và dự án không gian người dùng phụ thuộc vào rất ít nhà bảo trì, còn trình điều khiển cũ và các điều kiện biên phức tạp có thể không được xem xét trong thời gian dài. Kẻ tấn công cũng có thể phân tích mã nguồn công khai để tìm lỗ hổng.
Vì vậy, bảo mật Linux chịu ảnh hưởng của những điều kiện sau nhiều hơn là chỉ việc mã có công khai hay không.
- Nhân lực bảo trì của dự án
- Phạm vi xem xét mã và thử nghiệm
- Cơ chế báo cáo lỗ hổng
- Tốc độ đưa bản sửa vào phiên bản ổn định
- Việc cung cấp cập nhật của bản phân phối và nhà sản xuất thiết bị
- Tốc độ áp dụng bản vá của người vận hành
- Cấu hình thực tế của dịch vụ và tài khoản
- Độ tin cậy của chuỗi cung ứng phần mềm
Linux với mã nguồn công khai cung cấp nền tảng để nhiều tổ chức cùng tìm và sửa lỗ hổng, nhưng mức độ an toàn của hệ thống thực tế phụ thuộc vào toàn bộ quá trình đưa bản sửa đến sản phẩm và môi trường vận hành.
Tăng cường hệ thống
Linux là một hệ điều hành đa dụng nên cấu hình mặc định không được tối ưu cho mọi mô hình đe dọa. Máy chủ Internet, máy tính để bàn, điện thoại thông minh, máy chủ container và thiết bị điều khiển công nghiệp yêu cầu những chức năng và chính sách bảo mật khác nhau.
Trong hệ thống thực tế, các công việc tăng cường sau có thể được áp dụng tùy mục đích sử dụng.
- Gỡ bỏ dịch vụ và gói không cần thiết
- Hạn chế đăng nhập root từ xa
- Sử dụng khóa SSH và xác thực đa yếu tố
- Hạn chế truy cập bằng tường lửa và mạng
- Kích hoạt SELinux hoặc AppArmor
- Áp dụng người dùng riêng và nguyên tắc đặc quyền tối thiểu cho từng dịch vụ
- Cách ly bằng seccomp và namespace
- Hạn chế nạp mô-đun nhân
- Sử dụng Secure Boot cùng nhân và mô-đun đã ký
- Kiểm tra tính toàn vẹn của tệp và mã thực thi
- Thu thập tập trung nhật ký và kiểm toán
- Cập nhật gói và nhân định kỳ
- Xây dựng kế hoạch sao lưu và ứng phó xâm nhập
Chỉ kích hoạt chức năng bảo mật là chưa đủ; chính sách phải được thiết lập phù hợp với hoạt động thực tế của dịch vụ. Quy tắc cho phép quá rộng hoặc chính sách kiểm soát truy cập bắt buộc không được sử dụng có thể không cung cấp khả năng bảo vệ thực tế ngay cả khi về hình thức đã được kích hoạt.
Phạm vi của bảo mật
Linux được sử dụng trong máy chủ, máy tính để bàn, điện thoại thông minh, điện toán đám mây và hệ thống nhúng, vì vậy khó có thể đánh giá bằng một mức độ bảo mật duy nhất. Một máy chủ dùng bản phân phối mới, được cập nhật định kỳ và áp dụng đặc quyền tối thiểu cùng chức năng cách ly có thể có trạng thái bảo mật rất khác với một thiết bị mạng sử dụng nhân đã hết hỗ trợ mà không được sửa đổi, dù cả hai cùng thuộc họ nhân Linux.
Bảo mật của nhân Linux chỉ là một trong các yếu tố sau và không thể tách rời khỏi chúng.
- Phần cứng và firmware
- Quá trình khởi động và nhân
- Thư viện và dịch vụ không gian người dùng
- Chuỗi cung ứng gói của bản phân phối
- Ứng dụng
- Xác thực và kiểm soát truy cập
- Cấu hình mạng
- Chính sách vận hành và cập nhật
- Hành vi của người dùng và quản trị viên
Vì vậy, bảo mật Linux nên được hiểu không phải là đặc tính của một “hệ điều hành không có lỗ hổng”, mà là một quá trình liên tục phát hiện, công bố và sửa lỗ hổng, sau đó chuyển bản sửa đến nhiều bản phân phối và thiết bị khác nhau.
Ảo hóa và container
Linux không chỉ chạy trực tiếp trên máy chủ vật lý và máy tính cá nhân mà còn được sử dụng rộng rãi làm hệ điều hành máy chủ và khách của máy ảo, làm nhân dùng chung cho container và làm nút điện toán đám mây. Khả năng hỗ trợ phần cứng, quản lý tiến trình, mạng, namespace và kiểm soát tài nguyên do Linux cung cấp đã trở thành nền tảng quan trọng của các môi trường ảo hóa và container hiện đại.
Ảo hóa là công nghệ trừu tượng hóa CPU, bộ nhớ, thiết bị lưu trữ và thiết bị ngoại vi để một máy tính vật lý có thể hoạt động như nhiều máy tính độc lập. Mỗi máy ảo thường chạy nhân và hệ điều hành riêng.
Container là công nghệ ảo hóa cấp hệ điều hành, trong đó các tiến trình cùng chia sẻ một nhân máy chủ nhưng có hệ thống tệp, mạng, danh sách tiến trình và môi trường người dùng được tách biệt. Vì không cung cấp riêng toàn bộ phần cứng ảo như máy ảo, container có thể khởi chạy nhiều môi trường cách ly nhanh hơn với ít tài nguyên hơn.
Cả hai công nghệ đều được tạo ra nhằm tách biệt nhiều tác vụ trên cùng một hệ thống vật lý và sử dụng tài nguyên hiệu quả, nhưng khác nhau về tầng cách ly và phương thức thực thi.
Bối cảnh dẫn đến nhu cầu ảo hóa
Máy tính và máy chủ thời kỳ đầu có giá cao, vì vậy việc để một tác vụ hoặc một tổ chức độc quyền sử dụng toàn bộ một hệ thống có thể gây lãng phí tài nguyên. Ngay cả khi dung lượng CPU và bộ nhớ tăng lên, từng ứng dụng riêng lẻ không phải lúc nào cũng sử dụng toàn bộ tài nguyên.
Các hệ thống chia sẻ thời gian cho phép nhiều người dùng cùng sử dụng một máy tính, nhưng phương thức chỉ tách biệt các tiến trình bên trong cùng một hệ điều hành khó cung cấp nhiều hệ điều hành khác nhau hoặc những môi trường quản trị hoàn toàn độc lập. Nếu việc thử nghiệm phần mềm hệ thống làm nhân ngừng hoạt động, các tác vụ khác trên cùng máy tính cũng có thể bị ảnh hưởng.
Ảo hóa tìm cách giải quyết những vấn đề sau bằng cách chia một máy tính vật lý thành nhiều máy tính lôgic.
- Cho phép nhiều tổ chức và người dùng sử dụng độc lập cùng một hệ thống
- Chạy đồng thời nhiều hệ điều hành và phiên bản khác nhau
- Tách môi trường phát triển và thử nghiệm khỏi môi trường vận hành thực tế
- Giới hạn phạm vi ảnh hưởng của sự cố và cấu hình sai
- Hợp nhất nhiều máy chủ có mức sử dụng thấp vào một máy chủ vật lý
- Duy trì hệ điều hành và ứng dụng cũ
- Sao chép, di chuyển và khôi phục theo đơn vị máy ảo
- Nhanh chóng chuẩn bị máy chủ cần thiết trước khi trực tiếp mua phần cứng
Ảo hóa là công nghệ xuất hiện trước Linux. Khái niệm máy ảo đã được phát triển trên máy tính lớn từ thập niên 1960 và được sử dụng để chia một máy tính lớn thành nhiều hệ thống độc lập. Sau đó, khi máy chủ x86 được triển khai hàng loạt trong môi trường doanh nghiệp, ảo hóa lại trở nên quan trọng đối với việc hợp nhất máy chủ và cách ly môi trường phát triển.
Trong các trung tâm dữ liệu vào thập niên 1990 và đầu thập niên 2000, mỗi dịch vụ thường được bố trí trên một máy chủ vật lý riêng. Phương thức này đơn giản trong việc tránh xung đột và sự cố giữa các ứng dụng, nhưng mức sử dụng tài nguyên trung bình của từng máy chủ thấp, trong khi chi phí mua thiết bị, điện năng, làm mát và không gian tăng lên. Máy ảo cho phép đặt nhiều dịch vụ với các môi trường hệ điều hành khác nhau trên cùng một máy chủ lớn.
Máy ảo và hypervisor
Máy ảo là một môi trường thực thi trông giống như một máy tính độc lập có CPU, bộ nhớ, thiết bị lưu trữ, giao diện mạng và firmware. Hệ điều hành khách có thể nhận thức rằng mình đang chạy trên phần cứng vật lý hoặc sử dụng giao diện được thiết kế cho môi trường ảo hóa.
Phần mềm tạo và chạy nhiều máy ảo cũng như phân phối tài nguyên cho chúng được gọi là hypervisor. Hypervisor phân bổ thời gian thực thi trên CPU thực cho máy ảo, liên kết bộ nhớ khách với bộ nhớ máy chủ và cung cấp thiết bị lưu trữ cùng thiết bị mạng ảo.
Hypervisor thường được chia thành hai loại dựa trên vị trí thực thi.
Hypervisor loại 1 chạy trực tiếp trên phần cứng vật lý và quản lý máy ảo như đơn vị thực thi chính. Xen và nhiều sản phẩm ảo hóa máy chủ thương mại thuộc loại này.
Hypervisor loại 2 chạy như một ứng dụng bên trên hệ điều hành thông thường. Các chương trình ảo hóa dùng để thử hệ điều hành khác hoặc tạo môi trường phát triển trên máy tính để bàn là ví dụ tiêu biểu.
Sự phân loại này không phải lúc nào cũng rõ ràng trong triển khai thực tế. KVM bổ sung chức năng ảo hóa vào nhân Linux, đồng thời sử dụng QEMU và các công cụ quản lý trong không gian người dùng Linux thông thường. Toàn bộ hệ thống có thể được dùng như một hypervisor máy chủ trực tiếp chạy máy ảo trên phần cứng, nhưng đồng thời vẫn tận dụng trình điều khiển thiết bị và bộ lập lịch của hệ điều hành Linux thông thường.
Ảo hóa hoàn toàn và bán ảo hóa
Các bộ xử lý x86 thời kỳ đầu có những lệnh và đặc điểm thực thi khiến việc ảo hóa hiệu quả hệ điều hành hiện có trở nên khó khăn. Hypervisor phải phát hiện và xử lý thay các lệnh đặc quyền do hệ điều hành khách thực thi hoặc tự động chuyển đổi mã đang chạy.
Trong ảo hóa hoàn toàn, một môi trường tương tự máy tính vật lý được cung cấp để có thể chạy hệ điều hành khách mà không cần sửa đổi. Hệ điều hành khách có thể sử dụng nguyên trạng ảnh được thiết kế cho phần cứng thông thường, nhưng quá trình trung gian hóa lệnh đặc quyền và truy cập thiết bị có thể gây thêm chi phí.
Trong bán ảo hóa, hệ điều hành khách nhận biết mình đang chạy trong môi trường ảo hóa và sử dụng lời gọi hypervisor cùng thiết bị chuyên dụng cho ảo hóa thay vì trực tiếp điều khiển phần cứng. Cách này từng giúp giảm một phần chi phí ảo hóa x86 mà chỉ phần mềm khó xử lý hiệu quả.
Xen là hypervisor phát triển từ nghiên cứu XenoServer của Đại học Cambridge và trong giai đoạn đầu chủ yếu sử dụng bán ảo hóa với hệ điều hành khách đã được sửa đổi. Xen chạy nhiều hệ điều hành trên một hypervisor loại 1 nhỏ, còn Linux thường phụ trách thiết bị và quản lý máy ảo trong miền quản trị gọi là dom0.[56]
Sau khi các phần mở rộng ảo hóa phần cứng như Intel VT-x và AMD-V trở nên phổ biến, hệ điều hành không sửa đổi cũng có thể được chạy hiệu quả. CPU cung cấp chức năng chuyển đổi trạng thái thực thi giữa hệ điều hành khách và hypervisor, đồng thời trung gian hóa an toàn các thao tác đặc quyền.
Máy ảo hiện đại thường sử dụng ảo hóa phần cứng nhưng kết hợp các thiết bị bán ảo hóa như Virtio cho hoạt động nhập xuất lưu trữ và mạng. CPU cùng bộ nhớ được thực thi bằng ảo hóa phần cứng, còn nhập xuất sử dụng trình điều khiển chuyên dụng cho ảo hóa trong hệ điều hành khách để cải thiện hiệu năng.
QEMU
QEMU là trình mô phỏng và chương trình ảo hóa nguồn mở triển khai nhiều bộ xử lý cùng hệ thống máy tính khác nhau. QEMU có thể cung cấp mô hình toàn bộ máy tính, bao gồm CPU, bộ nhớ, chipset, thiết bị lưu trữ, card mạng và thiết bị ngoại vi.[57]
QEMU có thể mô phỏng bằng phần mềm kiến trúc bộ xử lý khác với máy chủ. Ví dụ, nó có thể chạy hệ thống ARM hoặc RISC-V trên máy tính x86, hoặc được sử dụng để phát triển và thử nghiệm firmware cùng hệ điều hành khi không có phần cứng thực tế.
Mô phỏng toàn bộ lệnh CPU bằng phần mềm có tính linh hoạt cao nhưng có thể chậm hơn thực thi trực tiếp trên phần cứng. Khi kiến trúc bộ xử lý của máy chủ và máy khách giống nhau và có hỗ trợ ảo hóa phần cứng, QEMU có thể kết hợp với KVM để thực thi trực tiếp mã khách trên CPU thực.
Trong môi trường ảo hóa Linux, QEMU thường đảm nhiệm các vai trò sau.
- Tạo tiến trình máy ảo
- Cung cấp firmware và mô hình phần cứng ảo
- Quản lý ảnh đĩa và thiết bị lưu trữ ảo
- Cung cấp thiết bị mạng ảo
- Cung cấp đồ họa, bảng điều khiển và truy cập từ xa
- Lưu và khôi phục trạng thái máy ảo
- Di chuyển máy ảo đang chạy
- Thực thi CPU thông qua giao diện KVM
Vì vậy, nếu KVM cung cấp nền tảng ảo hóa CPU và bộ nhớ bên trong nhân, QEMU đảm nhiệm việc cấu thành một máy tính ảo thực tế trong không gian người dùng.
KVM
KVM là hệ thống con ảo hóa cho phép nhân Linux sử dụng chức năng ảo hóa phần cứng để chạy máy ảo. KVM được công bố năm 2006, được đưa vào Linux 2.6.20 và phát hành cùng nhân chính thức vào tháng 2 năm 2007.[58]
KVM sử dụng các phần mở rộng ảo hóa của bộ xử lý như Intel VT-x và AMD-V. Khi mô-đun KVM được nạp, Linux có thể tạo CPU ảo, quản lý bộ nhớ khách và cho phép chương trình không gian người dùng điều khiển máy ảo thông qua giao diện /dev/kvm.
Mỗi máy ảo KVM xuất hiện trong Linux dưới dạng một tiến trình thông thường, còn CPU ảo chạy dưới dạng luồng. Vì vậy, bộ lập lịch, trình quản lý bộ nhớ, chính sách NUMA, cgroups và chức năng bảo mật của Linux cũng có thể được sử dụng để quản lý máy ảo.
KVM thường được kết hợp với QEMU. KVM tăng tốc việc thực thi CPU khách, còn QEMU cung cấp thiết bị ảo, đĩa, mạng, firmware và chức năng quản lý. Tầng quản lý như libvirt quản lý việc tạo, lưu trữ, mạng và vòng đời của máy ảo QEMU·KVM thông qua giao diện thống nhất.
Việc KVM được tích hợp vào nhân Linux cho phép bản phân phối, nhà sản xuất máy chủ và nhà cung cấp đám mây sử dụng chính Linux làm máy chủ ảo hóa mà không cần bổ sung một tầng nhân đóng riêng biệt. Khả năng tận dụng trực tiếp trình điều khiển thiết bị, hỗ trợ phần cứng và hệ thống cập nhật bảo mật hiện có của Linux cũng góp phần thúc đẩy sự phổ biến của KVM.
Ứng dụng của ảo hóa
Ảo hóa dựa trên Linux được sử dụng trong các lĩnh vực sau.
- Hợp nhất máy chủ
- Đám mây công cộng và đám mây riêng
- Môi trường phát triển và thử nghiệm
- Ảo hóa máy tính để bàn
- Bảo tồn hệ thống và ứng dụng cũ
- Phân tích mã độc và bảo mật
- Phát triển nhân và hệ điều hành
- Ảo hóa chức năng mạng
- Hệ thống nhúng và ô tô
- Dịch vụ lưu trữ cho nhiều khách hàng
Nhà cung cấp đám mây chia tài nguyên máy chủ vật lý thành nhiều máy ảo để cung cấp cho khách hàng. Khách hàng có thể tạo máy chủ ảo bằng cách lựa chọn dung lượng CPU, bộ nhớ và thiết bị lưu trữ cần thiết mà không phải mua phần cứng thực tế.
Mỗi máy ảo chạy một nhân độc lập nên trên cùng một máy chủ có thể chạy không chỉ nhiều bản phân phối Linux khác nhau mà còn Windows, BSD và các hệ điều hành khác. Vì được tách biệt ở cấp nhân, máy ảo đôi khi được sử dụng làm ranh giới cách ly mạnh hơn container thông thường.
Ngược lại, mỗi máy ảo chứa nhân và dịch vụ hệ thống riêng nên sử dụng nhiều bộ nhớ cùng không gian lưu trữ hơn và cần thời gian khởi động tương đối dài. Trong môi trường cần nhanh chóng khởi chạy số lượng lớn ứng dụng giống nhau, container có thể hiệu quả hơn.
Nhu cầu ảo hóa cấp hệ điều hành
Không phải mọi tác vụ đều cần một nhân hệ điều hành riêng. Việc tạo một máy ảo hoàn chỉnh cho từng tác vụ như máy chủ web, cơ sở dữ liệu và ứng dụng có thể chạy trên cùng một nhân Linux đòi hỏi thêm bộ nhớ và không gian lưu trữ.
Dịch vụ lưu trữ Internet cần cung cấp cho nhiều khách hàng trên cùng một máy chủ các môi trường Linux độc lập. Mỗi khách hàng cần quản lý tiến trình, tệp, địa chỉ mạng và tài khoản người dùng của riêng mình, nhưng nếu cung cấp cho từng khách hàng một máy ảo có nhân riêng thì số lượng môi trường có thể chạy trên cùng phần cứng sẽ giảm.
Ảo hóa cấp hệ điều hành giải quyết vấn đề này bằng cách chia không gian người dùng thành nhiều phần trong khi vẫn dùng chung một nhân. Phương thức này mang lại các lợi ích sau.
- Tạo và khởi động môi trường ảo nhanh
- Sử dụng ít bộ nhớ và không gian lưu trữ
- Chạy nhiều môi trường hơn trên cùng một máy chủ
- Tách biệt các dịch vụ cùng dựa trên Linux
- Duy trì tính nhất quán giữa môi trường phát triển và thực thi
- Phân phối ứng dụng cùng các thành phần phụ thuộc dưới dạng một gói
- Giới hạn mức sử dụng tài nguyên theo tiến trình
- Thu hẹp phạm vi ảnh hưởng của sự cố dịch vụ và xung đột cấu hình
Các cơ chế cách ly cấp hệ điều hành thời kỳ đầu không có hình thức giống container hiện đại. Chức năng hạn chế đường dẫn hệ thống tệp, kiểm soát tài nguyên tiến trình, cách ly mạng và người dùng được phát triển vào những thời điểm khác nhau rồi mới được kết hợp thành một môi trường thực thi container thống nhất.
chroot và cơ chế cách ly ban đầu
Chức năng chroot của UNIX thay đổi thư mục gốc mà tiến trình nhận biết thành một thư mục khác. Nhờ đó, chương trình không thể truy cập tệp bên ngoài một cây thư mục cụ thể qua các đường dẫn thông thường.
chroot được sử dụng để tách biệt môi trường xây dựng, hệ thống phục hồi, dịch vụ FTP và môi trường thử nghiệm. Tuy nhiên, danh sách tiến trình, mạng, mã định danh người dùng và nhân vẫn được chia sẻ nguyên trạng với máy chủ, đồng thời nó không được thiết kế như một ranh giới bảo mật hoàn chỉnh đối với tiến trình có quyền cao.
Container Linux hiện đại không chỉ thay đổi đường dẫn hệ thống tệp mà còn sử dụng nhiều loại namespace, kiểm soát tài nguyên, capabilities và chính sách bảo mật cùng nhau. Vì vậy, chroot có thể được xem là một trong những tiền thân lịch sử của container nhưng bản thân nó không phải là một container hoàn chỉnh.
OpenVZ và máy chủ riêng ảo
Từ cuối thập niên 1990, các dự án sửa đổi nhân Linux để chạy nhiều không gian người dùng Linux tách biệt trên cùng một máy chủ đã được phát triển. Virtuozzo và nền tảng nguồn mở của nó là OpenVZ là những triển khai quan trọng thời kỳ đầu của ảo hóa cấp hệ điều hành.
Quá trình phát triển OpenVZ bắt đầu khoảng năm 1999 trên nền Linux 2.2, và các công nghệ cốt lõi được công bố theo GNU GPL vào năm 2005.[59]
OpenVZ cung cấp cho mỗi môi trường hệ thống tệp, tiến trình, cấu hình mạng và môi trường người dùng độc lập. Mọi môi trường ảo chia sẻ nhân Linux của máy chủ, còn tài nguyên như CPU và bộ nhớ có thể được giới hạn riêng cho từng môi trường.
Phương thức này phù hợp để nhà cung cấp dịch vụ lưu trữ web chia một máy chủ vật lý thành nhiều máy chủ riêng ảo rồi bán cho khách hàng. Nó có thể cung cấp cho mỗi khách hàng một không gian người dùng Linux độc lập với quyền root trong khi sử dụng ít tài nguyên hơn máy ảo hoàn chỉnh.
OpenVZ thời kỳ đầu sử dụng các bản vá nhân riêng chưa được đưa vào nhân Linux chính thức. Sau đó, khi namespace và cgroups được phát triển trong Linux thượng nguồn, LXC và các môi trường thực thi khác có thể tạo container mà không cần bản vá riêng.
Linux namespace
Linux namespace là chức năng của nhân làm cho những tài nguyên vốn được chia sẻ trên toàn hệ thống hiển thị khác nhau đối với từng tập hợp tiến trình. Tiến trình bên trong namespace hoạt động như thể có một bản sao độc lập của tài nguyên tương ứng.[60]
Linux cung cấp các namespace sau.
| Namespace | Đối tượng được tách biệt |
|---|---|
| Mount | Điểm gắn và cách nhìn hệ thống tệp |
| PID | Mã định danh tiến trình và cây tiến trình |
| Network | Giao diện mạng, địa chỉ, định tuyến và cổng |
| IPC | System V IPC và hàng đợi thông điệp POSIX |
| UTS | Tên máy chủ và tên miền |
| User | Mã định danh người dùng, nhóm và capabilities |
| Cgroup | Cây cgroup mà tiến trình nhìn thấy |
| Time | Một số giá trị thời gian hệ thống |
Bên trong PID namespace, tiến trình đầu tiên của container có thể hiển thị là PID 1, nhưng trên máy chủ nó vẫn là một tiến trình thông thường có PID khác. Network namespace có thể chứa giao diện mạng, bảng định tuyến và quy tắc tường lửa riêng.
User namespace có thể ánh xạ mã định danh người dùng bên trong container sang mã định danh khác trên máy chủ. Nhờ đó, một tiến trình trông như root bên trong container có thể chạy với quyền người dùng thông thường trên máy chủ, tạo nền tảng cho container không đặc quyền.
Namespace tách biệt những gì tiến trình có thể nhìn thấy nhưng không tự động giới hạn lượng tài nguyên mà nó sử dụng. Để ngăn container tiêu thụ toàn bộ bộ nhớ hoặc thời gian CPU của máy chủ, namespace phải được sử dụng cùng cgroups.
cgroups
cgroups là chức năng của nhân Linux dùng để gom tiến trình vào các nhóm phân cấp, phân phối, giới hạn và đo lường tài nguyên như CPU, bộ nhớ, nhập xuất và số lượng tiến trình.
cgroups cần thiết vì ngay cả khi môi trường quan sát của tiến trình được tách biệt, cạnh tranh tài nguyên vẫn tiếp tục xảy ra. Nếu một container sử dụng toàn bộ bộ nhớ hoặc tạo quá nhiều tiến trình, nó có thể ảnh hưởng đến các dịch vụ khác và toàn bộ hệ điều hành trên cùng máy chủ.
cgroups cung cấp các chức năng sau.
- Kiểm soát tỷ lệ sử dụng CPU và vị trí thực thi
- Giới hạn và thống kê mức sử dụng bộ nhớ
- Kiểm soát nhập xuất thiết bị khối
- Giới hạn số lượng tiến trình có thể tạo
- Tạm dừng một tập hợp tiến trình
- Đo lường và hạch toán mức sử dụng tài nguyên
- Thiết lập mức ưu tiên theo nhóm tiến trình
Trong cgroup v1, mỗi bộ điều khiển tài nguyên có thể xây dựng một cây phân cấp riêng. Cách này linh hoạt nhưng phát sinh vấn đề phức tạp và thiếu nhất quán khi nhiều công cụ quản lý tạo các cây khác nhau.
cgroup v2 cung cấp cấu trúc quản lý mọi tiến trình và bộ điều khiển tài nguyên trong một cây phân cấp thống nhất. Mỗi tiến trình thuộc về một cgroup, còn tài nguyên có thể được phân phối và ủy quyền theo quan hệ giữa nhóm cha và nhóm con.[61]
cgroups không chỉ được sử dụng cho container mà còn cho quản lý dịch vụ systemd, phiên người dùng, tác vụ điện toán hiệu năng cao và giới hạn tài nguyên máy ảo.
LXC
LXC là tập hợp công cụ và thư viện không gian người dùng tạo và quản lý container bằng namespace, cgroups, capabilities cùng các chức năng bảo mật của nhân Linux. LXC được phát triển từ năm 2008 và trở thành một trong những môi trường thực thi container đa dụng thời kỳ đầu kết hợp các chức năng cách ly trong Linux thượng nguồn thay vì sử dụng bản vá nhân riêng.[62]
LXC có thể chạy không chỉ một ứng dụng duy nhất mà cả một không gian người dùng Linux hoàn chỉnh có hệ thống init và nhiều dịch vụ. Hình thức này được gọi là container hệ thống.
Container hệ thống cung cấp trải nghiệm quản trị tương tự máy ảo nhưng chia sẻ cùng nhân Linux với máy chủ. Bên trong container có thể sử dụng không gian người dùng của một bản phân phối khác, nhưng không thể chạy nhân hệ điều hành khác với máy chủ.
LXC kết hợp các chức năng sau.
- Tạo namespace
- Kiểm soát tài nguyên bằng cgroup
- Chuẩn bị hệ thống tệp gốc
- Kết nối giao diện mạng
- Ánh xạ mã định danh người dùng và nhóm
- Giới hạn capabilities
- Chính sách AppArmor và seccomp
- Khởi động và dừng container
- Quản lý bảng điều khiển và hệ thống tệp
Các tầng quản lý và dự án liên quan phát triển từ LXC được sử dụng để vận hành container hệ thống chạy dài hạn theo cách tương tự máy ảo. Incus quản lý container hệ thống và máy ảo bằng phương thức chung, đồng thời sử dụng namespace và cgroups của Linux cho container.[63]
Container ứng dụng
Container thời kỳ đầu thường được sử dụng như máy chủ ảo nhỏ chứa nhiều dịch vụ và hệ thống init. Sau đó, phương thức container ứng dụng, trong đó một ứng dụng cùng các thành phần phụ thuộc được đóng gói để phân phối, trở nên phổ biến.
Container ứng dụng không tập trung vào việc quản lý dài hạn toàn bộ một hệ điều hành mà đưa vào ảnh các tệp, thư viện và cấu hình cần thiết để chạy một chương trình cụ thể. Thay vì trực tiếp sửa đổi trạng thái của container đang chạy, người ta thường xây dựng ảnh mới rồi thay thế container.
Phương thức này nhằm giảm tình trạng chương trình hoạt động bình thường trong môi trường phát triển nhưng thất bại trong môi trường thử nghiệm hoặc vận hành do khác biệt phiên bản thư viện hay cấu hình. Khi ứng dụng và thành phần phụ thuộc được phân phối trong cùng một ảnh, có thể tạo môi trường thực thi tương đối nhất quán ngay cả khi hạ tầng khác nhau.
Container ứng dụng phát triển từ các nhu cầu sau.
- Giảm khác biệt giữa môi trường phát triển, thử nghiệm và vận hành
- Ngăn xung đột thành phần phụ thuộc giữa các ứng dụng
- Triển khai nhanh và có thể lặp lại
- Cập nhật và khôi phục độc lập theo từng dịch vụ
- Đạt mật độ triển khai cao trên máy chủ quy mô lớn
- Tự động mở rộng và chạy tác vụ tạm thời
- Triển khai theo đơn vị microservice
- Chuỗi cung ứng phần mềm dựa trên ảnh
Docker
Docker được công bố năm 2013 như một nền tảng giúp nhà phát triển và người vận hành dễ dàng tạo và phân phối container Linux. Docker không phải là dự án đầu tiên phát triển namespace hoặc cgroups, nhưng đã tích hợp các chức năng nhân Linux hiện có với định dạng ảnh, công cụ xây dựng, registry, mạng và giao diện dòng lệnh.[64]
Docker ban đầu sử dụng LXC làm nền tảng thực thi, sau đó phát triển thư viện riêng mang tên libcontainer. libcontainer về sau phát triển thành runc, runtime cấp thấp của Open Container Initiative.
Các yếu tố góp phần làm Docker phổ biến gồm:
- Định nghĩa quy trình xây dựng ảnh bằng tệp văn bản
- Ảnh phân tầng và bộ nhớ đệm
- Quản lý tên và phiên bản ảnh
- Kho ảnh công khai và riêng tư
- Lệnh thực thi container nhất quán
- Quản lý mạng và volume
- Phương thức thực thi giống nhau giữa máy phát triển và máy chủ
- Phân phối ứng dụng cùng thành phần phụ thuộc dưới dạng một gói
Docker phổ biến hóa phương thức xem container không phải như một máy ảo nhỏ mà như một đơn vị chuẩn để xây dựng và truyền tải ứng dụng. Khi container kết thúc, thay vì lưu vĩnh viễn trạng thái bên trong, người ta thường tạo container mới từ ảnh và lưu dữ liệu cần thiết trong volume hoặc cơ sở dữ liệu bên ngoài.
Ảnh container và runtime
Ảnh container là tập hợp tệp chủ yếu chỉ đọc, chứa mã ứng dụng, thư viện, công cụ và hệ thống tệp cơ sở cần để thực thi. Ảnh thường được cấu thành từ nhiều tầng, trong đó các tầng nền chung có thể được chia sẻ giữa nhiều ảnh.
Bản thân ảnh không phải là một tiến trình đang chạy. Runtime container chuẩn bị ảnh thành hệ thống tệp, thiết lập namespace, cgroups và chính sách bảo mật rồi thực thi chương trình trong ảnh.
Môi trường container Linux hiện đại sử dụng nhiều thành phần có vai trò khác nhau.
- runc là runtime cấp thấp tạo một tiến trình container theo đặc tả thực thi OCI.
- containerd quản lý việc truyền và lưu ảnh, vòng đời container và việc thực thi runc.
- CRI-O chạy container OCI theo giao diện runtime container của Kubernetes.
- Podman cung cấp công cụ người dùng để quản lý container và Pod mà không cần daemon.
- Docker Engine tích hợp việc xây dựng ảnh, mạng, volume và quản lý container.
Năm 2015, Docker đóng góp công nghệ ảnh và runtime container cho Open Container Initiative. Dựa trên đó, đặc tả ảnh OCI và đặc tả runtime OCI được phát triển. Việc tiêu chuẩn hóa tạo nền tảng để ảnh được xây dựng bằng một công cụ có thể chạy trên nhiều runtime tương thích.[65]
Điều phối container
Một hoặc hai container có thể được chạy bằng các lệnh riêng lẻ, nhưng để bố trí hàng nghìn container trên nhiều máy chủ cần một tầng quản lý riêng. Container phải được bố trí lại khi máy chủ gặp lỗi hoặc lưu lượng tăng, đồng thời cần quản lý địa chỉ mạng, thiết bị lưu trữ, thông tin bí mật và quá trình cập nhật.
Hệ thống điều phối container cung cấp các chức năng sau.
- Bố trí container
- Duy trì số lượng bản sao cần thiết
- Khởi động lại và bố trí lại khi xảy ra lỗi
- Khám phá dịch vụ và cân bằng tải
- Cập nhật dần dần và quay lui
- Tự động mở rộng
- Kết nối thiết bị lưu trữ
- Quản lý cấu hình và thông tin bí mật
- Yêu cầu và giới hạn tài nguyên
- Quản lý trạng thái nút
Kubernetes là hệ thống điều phối tiêu biểu cung cấp các chức năng này. Người dùng không trực tiếp chỉ định từng container phải chạy trên máy chủ nào mà khai báo trạng thái ứng dụng mong muốn, còn tầng điều khiển duy trì cụm thực tế phù hợp với trạng thái đó.
Bản thân Kubernetes không triển khai cách ly container. Runtime container và nhân Linux trên từng nút thực hiện việc cách ly tiến trình và tài nguyên thực tế, còn Kubernetes điều phối việc bố trí cùng vòng đời của container trên nhiều nút.
Khác biệt giữa máy ảo và container
Máy ảo và container khác nhau về tầng cách ly.
| Phân loại | Máy ảo | Container |
|---|---|---|
| Đối tượng được ảo hóa | Phần cứng vật lý | Không gian người dùng của hệ điều hành |
| Nhân | Mỗi máy ảo có nhân riêng | Chia sẻ nhân máy chủ |
| Hệ điều hành | Có thể chạy nhiều hệ điều hành khác nhau | Thông thường cần cùng họ nhân |
| Thời gian khởi động | Tương đối dài | Tương đối ngắn |
| Mức sử dụng tài nguyên | Cần nhân và dịch vụ riêng | Chủ yếu gồm chương trình và không gian người dùng |
| Ranh giới cách ly | Hypervisor và phần cứng ảo | Namespace và chức năng bảo mật của nhân |
| Công nghệ tiêu biểu | KVM, Xen, QEMU | LXC, Docker, containerd, Podman |
| Mục đích chính | Cách ly hệ điều hành, máy ảo đám mây | Phân phối ứng dụng và thực thi mật độ cao |
Máy ảo có nhân riêng, vì vậy ngay cả khi nhân khách bị xâm nhập, nó thường vẫn được tách trực tiếp khỏi nhân máy chủ. Container chia sẻ nhân máy chủ nên lỗ hổng nhân có thể ảnh hưởng đến ranh giới cách ly.
Ngược lại, container không cần khởi động một nhân riêng nên có thể được tạo nhanh và cho phép cấu hình nhiều môi trường thực thi hơn trong cùng dung lượng bộ nhớ và thiết bị lưu trữ.
Kết hợp máy ảo và container
Trong đám mây và trung tâm dữ liệu thực tế, máy ảo và container thường được sử dụng cùng nhau. Một phương thức phổ biến là tạo nhiều máy ảo trên máy chủ vật lý rồi chạy nhiều container bên trong từng máy ảo.
Máy ảo tách biệt tương đối mạnh giữa các khách hàng, tổ chức và vùng bảo mật, còn container cho phép triển khai ứng dụng nhanh và chạy mật độ cao bên trong từng máy ảo.
Phương thức kết hợp mang lại các lợi ích sau.
- Cách ly máy ảo theo khách hàng hoặc tổ chức
- Triển khai container theo từng ứng dụng
- Tách biệt yêu cầu về nhân và bản phân phối khác nhau
- Chính sách mạng và bảo mật theo đơn vị máy ảo
- Mở rộng và thay thế nhanh theo đơn vị container
- Phân chia trách nhiệm quản lý phần cứng vật lý và ứng dụng
Dịch vụ Kubernetes được quản lý trên đám mây công cộng cũng thường cung cấp từng nút dưới dạng máy ảo rồi chạy container Linux bên trên.
Một số môi trường thực thi tìm cách kết hợp mức cách ly của máy ảo với tốc độ khởi động và phương thức quản lý của container. Ví dụ gồm chạy container bên trong máy ảo nhẹ hoặc cung cấp một nhân chuyên dụng nhỏ cho từng container hay Pod.
Cách ly và bảo mật
Container không chỉ đơn giản là chức năng phân tách tên tiến trình. Cách ly thực tế được cấu thành bằng cách kết hợp nhiều chức năng bảo mật Linux.
- Tách biệt cách nhìn tài nguyên bằng namespace
- Giới hạn mức sử dụng tài nguyên bằng cgroups
- Chia nhỏ quyền root bằng capabilities
- Giới hạn lời gọi hệ thống bằng seccomp
- Kiểm soát truy cập bằng SELinux và AppArmor
- Hệ thống tệp chỉ đọc
- Ánh xạ UID bằng user namespace
- Giới hạn truy cập thiết bị
- Chính sách mạng và tường lửa
- Ảnh đã ký và xác minh chuỗi cung ứng
Cấu hình trong đó tiến trình chạy với quyền root bên trong container cũng có cùng quyền trên máy chủ có thể làm tăng rủi ro. Sử dụng user namespace và container rootless cho phép ánh xạ root bên trong container sang người dùng thông thường trên máy chủ.
Nếu không có giới hạn cgroups, một container có thể sử dụng quá mức CPU và bộ nhớ của máy chủ, ảnh hưởng đến dịch vụ khác. Tài liệu bảo mật LXC cũng chỉ ra rằng trong môi trường không có giới hạn cgroup mặc định, container có thể làm cạn kiệt bộ nhớ, tiến trình và tài nguyên mạng.[66]
Cách ly container không giống hoàn toàn với máy ảo. Khi chạy tác vụ không đáng tin cậy, tùy mô hình đe dọa có thể kết hợp máy ảo, hệ thống vật lý riêng hoặc sandbox bổ sung.
Ý nghĩa đối với Linux
Bằng việc cung cấp cả công nghệ ảo hóa và container, Linux cho phép xây dựng môi trường thực thi ở nhiều tầng khác nhau giữa phần cứng vật lý và ứng dụng.
KVM và Xen cung cấp nền tảng để chạy nhiều hệ điều hành và nhân khác nhau trên cùng một máy chủ. QEMU triển khai phần cứng ảo và các kiến trúc bộ xử lý khác, còn libvirt cùng nhiều nền tảng đám mây quản lý những máy ảo này ở quy mô lớn.
Namespace và cgroups trở thành nền tảng để cách ly nhiều không gian người dùng và kiểm soát tài nguyên trên cùng một nhân Linux. LXC và OpenVZ cung cấp các môi trường hệ thống Linux độc lập, còn Docker và hệ sinh thái OCI phổ biến hóa phương thức đóng gói ứng dụng cùng thành phần phụ thuộc thành ảnh để phân phối.
Ảo hóa tách máy chủ khỏi phần cứng, còn container tách ứng dụng khỏi từng môi trường cài đặt hệ điều hành riêng biệt. Cả hai công nghệ được sử dụng như những nền tảng cốt lõi của hệ sinh thái Linux, cho phép hợp nhất máy chủ, điện toán đám mây, triển khai tự động và vận hành dịch vụ quy mô lớn.
Môi trường phát triển
Linux được sử dụng rộng rãi làm môi trường phát triển hệ điều hành, chương trình máy chủ, ứng dụng máy tính để bàn, phần mềm nhúng và nhân hệ điều hành. Trình biên dịch, trình liên kết, shell, trình soạn thảo, công cụ tự động hóa xây dựng, trình gỡ lỗi và công cụ phân tích hiệu năng cần cho quá trình phát triển được cung cấp thông qua kho gói của bản phân phối. Phần lớn các công cụ này có thể được kết hợp trên dòng lệnh hoặc sử dụng trong môi trường phát triển tích hợp.
Không tồn tại một bộ công cụ chính thức duy nhất cho môi trường phát triển Linux. Ngay cả với cùng một dự án C hoặc C++, nhà phát triển có thể chọn GCC hoặc Clang, trực tiếp sử dụng Make hay Ninja, hoặc dùng các hệ thống xây dựng cấp cao hơn như CMake, Meson và Autotools. Trình soạn thảo cũng có thể được lựa chọn từ các trình soạn thảo chạy trong terminal như Vim và Emacs đến KDevelop, GNOME Builder, Qt Creator cùng nhiều môi trường phát triển thương mại.
Khả năng lựa chọn này là một đặc điểm của văn hóa phát triển Linux, nhưng cũng khiến mỗi dự án có thể yêu cầu những công cụ và thiết lập khác nhau. Bản phân phối thường cung cấp chương trình phát triển dưới dạng các gói riêng lẻ hoặc bộ công cụ phát triển, còn dự án xác định môi trường cần thiết thông qua tài liệu xây dựng và tệp tự động hóa.
Shell và môi trường dòng lệnh cơ bản
Phát triển trên Linux theo truyền thống tập trung vào shell và công cụ dòng lệnh. Shell không chỉ thực thi chương trình mà còn đảm nhiệm thao tác với tệp và thư mục, kết nối đầu vào và đầu ra, thiết lập biến môi trường và tự động hóa nhiều công cụ.
Các shell được sử dụng rộng rãi trong môi trường phát triển gồm:
- Bash
- Zsh
- Fish
- Dash
- KornShell
- Nushell
Bash được sử dụng làm shell tương tác hoặc môi trường thực thi tập lệnh trong nhiều bản phân phối Linux. Zsh được dùng nhờ khả năng tự động hoàn thành mở rộng và tùy biến dấu nhắc, còn Fish nhấn mạnh tính tiện dụng tương tác với tô sáng cú pháp và đề xuất ngay trong cấu hình mặc định. Dash là một shell thuộc họ POSIX đã lược bớt chức năng, có tốc độ khởi chạy nhanh và có thể được sử dụng cho tập lệnh hệ thống.
Trong shell, các chương trình cơ bản sau thường được kết hợp.
- Tìm tệp bằng
findvàfd - Tìm kiếm và xử lý văn bản bằng
grep,ripgrepvàawk - Chuyển đổi văn bản bằng
sed - Xử lý dữ liệu bằng
sort,uniq,cutvàxargs - Truyền dữ liệu qua mạng bằng
curlvàwget - Nén và lưu trữ bằng
tar,gzip,xzvàzstd - So sánh thay đổi bằng
diff,patchvàcmp - Xử lý JSON và YAML bằng
jqvàyq - Quản lý phiên terminal bằng
tmuxvà GNU Screen
Mỗi chương trình tập trung vào một tác vụ nhỏ và đầu ra của một chương trình có thể được chuyển thành đầu vào của chương trình khác thông qua pipe. Nhà phát triển có thể lọc và chuyển đổi kết quả tìm kiếm tệp hoặc chỉ trích xuất lỗi từ nhật ký xây dựng bằng cách kết hợp lệnh mà không cần một chương trình lớn riêng biệt.
Trình biên dịch
Khi phát triển chương trình gốc trên Linux, các chuỗi công cụ biên dịch tiêu biểu là GCC và LLVM·Clang.
GCC hỗ trợ C, C++, Objective-C, Fortran, Ada cùng nhiều ngôn ngữ khác và đã được sử dụng để xây dựng không gian người dùng GNU, nhân Linux cùng vô số dự án nguồn mở. gcc và g++ được sử dụng rộng rãi lần lượt làm lệnh biên dịch C và C++, nhưng trong quá trình xây dựng thực tế chúng gọi nhiều chương trình khác, bao gồm bộ tiền xử lý, trình hợp dịch và trình liên kết.
Clang là frontend cho các ngôn ngữ thuộc họ C của dự án LLVM. Nó cung cấp thông báo chẩn đoán, tích hợp công cụ và chức năng phân tích tĩnh, đồng thời sử dụng giao diện dòng lệnh tương thích phần lớn với GCC. Nhân Linux cũng có thể được xây dựng bằng GCC hoặc Clang trong những cấu hình được hỗ trợ.
Trình biên dịch thường thực hiện các công việc sau.
- Tiền xử lý mã nguồn
- Kiểm tra cú pháp và kiểu
- Tạo biểu diễn trung gian
- Tối ưu hóa mã
- Tạo mã máy cho bộ xử lý đích
- Tạo thông tin gỡ lỗi và chẩn đoán
- Áp dụng tùy chọn tăng cường bảo mật
- Gọi giai đoạn liên kết
Biên dịch chéo để tạo chương trình cho nền tảng khác với máy chủ đang chạy cũng được sử dụng rộng rãi trên Linux. Có thể xây dựng tệp thực thi và nhân dành cho ARM64, RISC-V hoặc bộ xử lý nhúng trên hệ thống x86-64. Tên trình biên dịch thường chứa kiến trúc đích và ABI.
Ngoài C và C++, có thể cài đặt rustc của Rust, go của Go, javac của Java, Free Pascal cùng nhiều triển khai ngôn ngữ khác thông qua gói của bản phân phối hoặc chuỗi công cụ riêng của ngôn ngữ. Các ngôn ngữ thường không yêu cầu quá trình biên dịch gốc riêng như Python, Ruby, Perl và tập lệnh shell cũng được sử dụng rộng rãi cho phát triển và tự động hóa trên Linux.
Trình hợp dịch và trình liên kết
Mã hợp dịch và tệp đối tượng do trình biên dịch tạo ra được chuyển thành tệp thực thi hoặc thư viện thông qua trình hợp dịch và trình liên kết.
GNU Binutils cung cấp các công cụ chính sau.
as— trình hợp dịchld— trình liên kếtar— công cụ lưu trữ thư viện tĩnhnm— hiển thị symbol trong đối tượngobjdump— phân tích đối tượng và tệp thực thiobjcopy— chuyển đổi định dạng và section của đối tượngreadelf— hiển thị cấu trúc ELFstrip— loại bỏ symbol và thông tin gỡ lỗi không cần thiếtaddr2line— chuyển địa chỉ thành vị trí mã nguồn
Hệ sinh thái LLVM có trình liên kết LLD và các công cụ tương ứng như llvm-ar, llvm-objdump và llvm-readelf. Dự án có thể sử dụng kết hợp công cụ GNU và LLVM hoặc lựa chọn trình biên dịch cùng trình liên kết một cách độc lập.
Tệp thực thi gốc và thư viện dùng chung trên Linux chủ yếu sử dụng định dạng ELF. Các công cụ như readelf, objdump và nm được dùng để phân tích header, section, symbol và phụ thuộc thư viện động của tệp thực thi.
Make và tự động hóa xây dựng
Một chương trình nhỏ có thể được tạo bằng một lệnh trình biên dịch, nhưng dự án có nhiều tệp nguồn, thư viện và mã được tạo tự động cần quản lý quan hệ phụ thuộc giữa các tệp cùng thứ tự xây dựng.
Make định nghĩa tệp mục tiêu, tệp phụ thuộc và lệnh tạo chúng trong Makefile. Nó chỉ có thể xây dựng lại mã nguồn đã thay đổi và các kết quả bị ảnh hưởng, đồng thời đã được sử dụng lâu dài trong các dự án Linux và UNIX.
Makefile có thể chứa các nội dung sau.
- Quy tắc biên dịch tệp nguồn thành tệp đối tượng
- Quy tắc liên kết tệp đối tượng thành tệp thực thi hoặc thư viện
- Xử lý mã và tài nguyên được tạo
- Cài đặt và gỡ bỏ
- Chạy kiểm thử
- Tạo tài liệu
- Dọn dẹp
- Tùy chọn theo từng nền tảng
Ngoài GNU Make còn có BSD Make và nhiều triển khai khác. Mỗi triển khai khác nhau về quy tắc mặc định và cú pháp mở rộng, vì vậy có thể cần kiểm tra phiên bản Make mà dự án yêu cầu.
Ninja là công cụ xây dựng được thiết kế để thực thi nhanh kế hoạch xây dựng do các công cụ cấp cao như CMake và Meson tạo ra, thay vì để con người trực tiếp viết những tệp xây dựng phức tạp. Nó tập trung vào chi phí khởi động nhỏ và xây dựng song song, đồng thời được sử dụng trong các dự án lớn.
Autotools
GNU Autotools là bộ công cụ truyền thống tạo tập lệnh cấu hình và Makefile để phần mềm có thể được xây dựng trên nhiều hệ điều hành tương tự UNIX và nhiều môi trường trình biên dịch khác nhau.
Các thành phần chính gồm:
- Autoconf
- Automake
- Libtool
- M4
- Các phép kiểm tra cấu hình được sử dụng cùng pkg-config
Autoconf tạo tập lệnh configure để kiểm tra hàm, header, thư viện và đặc điểm trình biên dịch của hệ thống. Người dùng có thể quen với phương thức xây dựng chương trình trong thư mục mã nguồn theo thứ tự ./configure, make, make install.
Autotools hỗ trợ rộng rãi cả những môi trường UNIX cũ và cung cấp nhiều phép kiểm tra đã được tích lũy trong các dự án. Tuy nhiên, các tệp được tạo cùng tầng macro phức tạp và khó theo dõi lỗi, vì vậy dự án mới đôi khi lựa chọn CMake hoặc Meson.
CMake
CMake đọc định nghĩa dự án độc lập với nền tảng và trình biên dịch rồi tạo hệ thống xây dựng gốc như Makefile, tệp Ninja hoặc dự án dành cho môi trường phát triển tích hợp. Thay vì trực tiếp thực hiện mọi công việc biên dịch, CMake tạo quy tắc xây dựng phù hợp với bộ sinh được chọn.[67]
Dự án CMake thường định nghĩa các thông tin sau trong tệp CMakeLists.txt.
- Dự án và ngôn ngữ sử dụng
- Tệp thực thi và thư viện
- Tệp nguồn và đường dẫn header
- Tùy chọn biên dịch và macro
- Tìm kiếm thư viện bên ngoài
- Quy tắc cài đặt
- Kiểm thử
- Tạo gói
CMake cho phép tách nhiều thư mục xây dựng từ cùng một cây mã nguồn. Cùng một dự án có thể được xây dựng riêng với cấu hình gỡ lỗi và phát hành, GCC và Clang, hoặc cấu hình thư viện tĩnh và thư viện dùng chung.
Trong biên dịch chéo, tệp toolchain định nghĩa hệ điều hành đích, trình biên dịch, sysroot và đường dẫn tìm kiếm. CMake được sử dụng rộng rãi trong các dự án C và C++ đa nền tảng, nhưng khi dự án trở nên phức tạp, biến, thiết lập toàn cục và cơ chế tìm mô-đun có thể trở nên khó hiểu.
Meson
Meson là hệ thống xây dựng hướng đến tốc độ xây dựng cao và định nghĩa dự án dễ đọc. Nó sử dụng cú pháp khai báo riêng và thường dùng Ninja làm công cụ thực thi xây dựng thực tế.[68]
Dự án Meson định nghĩa tệp thực thi, thư viện và phụ thuộc trong tệp meson.build. Thư viện bên ngoài được tìm bằng dependency(), còn kiểm thử, quy tắc cài đặt và tùy chọn xây dựng có thể được cấu hình cùng nhau.
Meson hỗ trợ nhiều ngôn ngữ như C, C++, Objective-C, Fortran, D và Rust, đồng thời được sử dụng trong các dự án máy tính để bàn và phần mềm hệ thống Linux. Nó mặc định sử dụng thư mục xây dựng riêng và tách giai đoạn cấu hình khỏi giai đoạn xây dựng thực tế.
Meson cung cấp cú pháp tương đối ngắn gọn và quá trình xây dựng Ninja nhanh, nhưng để chuyển một dự án lớn đã được xây dựng bằng Autotools hoặc CMake, hệ thống xây dựng có thể phải được viết lại.
Các công cụ xây dựng khác
Hệ sinh thái Linux sử dụng nhiều công cụ xây dựng khác nhau tùy theo ngôn ngữ, quy mô và yêu cầu tái tạo của dự án.
- Bazel hướng đến kho mã đa ngôn ngữ quy mô lớn, bản dựng có thể tái tạo, bộ nhớ đệm từ xa và thực thi phân tán.
- Các công cụ thuộc họ Buck quản lý bản dựng gia tăng của cơ sở mã lớn.
- SCons cho phép viết định nghĩa xây dựng bằng tập lệnh Python.
- xmake cung cấp định nghĩa dự án dựa trên Lua và tích hợp gói.
- Premake tạo dự án cho nhiều hệ thống xây dựng từ định nghĩa Lua.
- Ccache lưu kết quả của đầu vào biên dịch giống nhau để giảm thời gian xây dựng lặp lại.
- distcc phân phối tác vụ biên dịch C và C++ đến nhiều máy tính.
- Icecream phân bổ tác vụ biên dịch cho nhiều nút xây dựng trong mạng.
Công cụ xây dựng và quản lý gói theo từng ngôn ngữ cũng là một phần của môi trường phát triển.
- Cargo — Rust
- Chuỗi công cụ Go và Go modules
- Maven và Gradle — Java cùng các ngôn ngữ JVM
- pip, Poetry, uv và setuptools — Python
- npm, Yarn và pnpm — JavaScript
- Bundler — Ruby
- Cabal và Stack — Haskell
Những công cụ này không chỉ đảm nhiệm biên dịch mà còn có thể tải phụ thuộc, quyết định phiên bản, chạy kiểm thử, tạo tài liệu và phân phối gói.
Quản lý mã nguồn
Git là hệ thống quản lý phiên bản phân tán ban đầu được Linus Torvalds phát triển cho quá trình phát triển nhân Linux, và được sử dụng rộng rãi trong Linux cùng phát triển nguồn mở.
Trong kho Git, mỗi nhà phát triển có thể giữ toàn bộ lịch sử thay đổi và nhánh ở máy cục bộ. Họ có thể commit, so sánh và làm việc với nhánh khi không có kết nối mạng, sau đó trao đổi thay đổi với kho khác.
Các công cụ và dịch vụ liên quan đến Git được sử dụng trong phát triển Linux gồm:
- Công cụ dòng lệnh Git
- GitHub
- GitLab
- Codeberg
- Gerrit
- cgit và Gitweb
- Bản vá qua email và
git send-email - Patchwork
- SourceHut
Quá trình phát triển nhân Linux không chỉ sử dụng pull request trên nền web mà vẫn tập trung vào việc gửi và xem xét bản vá qua danh sách thư. git format-patch tạo bản vá email từ commit, còn git send-email gửi chúng đến danh sách phát triển.
Bên trên Git còn có các giao diện terminal như Tig, Lazygit và GitUI cùng nhiều ứng dụng đồ họa. Một số nhà phát triển chỉ sử dụng dòng lệnh, còn những người khác dùng tích hợp Git trong IDE và yêu cầu hợp nhất trên dịch vụ lưu trữ mã.
Trình soạn thảo
Linux cung cấp nhiều loại trình soạn thảo, từ trình soạn thảo văn bản đơn giản đến môi trường lập trình có khả năng mở rộng.
Vim và Neovim là các trình soạn thảo theo chế độ có thể chạy trong terminal. Chúng cung cấp chỉnh sửa tập trung vào bàn phím, macro, plugin và tích hợp máy chủ ngôn ngữ. Vì có thể sử dụng trên máy chủ từ xa và môi trường cài đặt tối thiểu, chúng được dùng rộng rãi trong quản trị hệ thống và phát triển.
Emacs có thể được mở rộng bằng Lisp để xây dựng môi trường khám phá mã, gỡ lỗi, quản lý phiên bản, shell, email và soạn thảo tài liệu xoay quanh trình soạn thảo văn bản. Việc lựa chọn giữa Vim và Emacs từ lâu cũng là chủ đề đùa vui và tranh luận trong văn hóa nhà phát triển.
Trên máy tính để bàn Linux còn sử dụng các trình soạn thảo sau.
- Kate
- GNOME Text Editor
- Gedit
- Geany
- Sublime Text
- Zed
- Helix
- Lapce
- Nhiều trình soạn thảo mã dựa trên Electron
Kate là trình soạn thảo văn bản nâng cao của KDE, cung cấp chức năng dự án, terminal, máy chủ ngôn ngữ và plugin. Geany kết hợp trình soạn thảo tương đối nhẹ với một số chức năng IDE cơ bản.
Trình soạn thảo có thể hỗ trợ tự động hoàn thành, đi đến định nghĩa, chẩn đoán lỗi và đổi tên thông qua giao thức máy chủ ngôn ngữ. Các máy chủ ngôn ngữ như clangd, rust-analyzer, gopls, Pyright và nhiều triển khai khác có thể được sử dụng độc lập với trình soạn thảo, nhờ đó trình soạn thảo terminal cũng có thể có chức năng phân tích mã tương tự IDE lớn.
Môi trường phát triển tích hợp
Trên Linux có thể sử dụng môi trường phát triển tích hợp đa dụng hoặc được thiết kế cho một desktop và ngôn ngữ cụ thể.
KDevelop là IDE do KDE phát triển, hỗ trợ C, C++, Python, QML cùng nhiều ngôn ngữ khác. Nó cho phép xem tài liệu CMake, Qt và trang hướng dẫn trực tiếp trong trình soạn thảo. Các công cụ như Clang-Tidy và Heaptrack có thể được kết nối thông qua plugin.[69]
GNOME Builder là IDE được thiết kế cho phát triển ứng dụng GNOME. Nó tích hợp GTK, GLib, Flatpak, Meson và các công cụ phát triển GNOME, đồng thời cung cấp môi trường để tạo và kiểm thử ứng dụng cho nền tảng GNOME.[70]
Qt Creator là IDE tập trung vào ứng dụng Qt và phát triển C++. Nó tích hợp CMake, qmake, chỉnh sửa QML, trình gỡ lỗi và công cụ thiết kế giao diện người dùng.
Ngoài ra, các môi trường sau cũng được sử dụng trên Linux.
- CLion
- Eclipse
- IntelliJ IDEA
- Android Studio
- NetBeans
- Code::Blocks
- GNAT Studio
- Eric
- Spyder
- RStudio
- Các IDE theo ngôn ngữ của JetBrains
- Môi trường phát triển chạy trong trình duyệt web
IDE tích hợp chỉnh sửa, xây dựng, gỡ lỗi và quản lý phiên bản vào một màn hình, nhưng bên trong thường gọi các công cụ độc lập như GCC, Clang, GDB, CMake và Git. Vì vậy, cùng một dự án có thể được xử lý bằng cả IDE và dòng lệnh.
Phát triển ứng dụng máy tính để bàn
Ứng dụng máy tính để bàn Linux không bị ràng buộc với một bộ công cụ đồ họa duy nhất. Nhà phát triển có thể lựa chọn nhiều môi trường desktop, toolkit và binding ngôn ngữ khác nhau.
GTK là toolkit đồ họa được sử dụng trong GNOME và nhiều ứng dụng desktop. Nó tập trung vào API C và cung cấp binding cho Rust, Python, Vala cùng nhiều ngôn ngữ khác. Ứng dụng GNOME có thể sử dụng GLib, GObject, GIO và các thư viện nền tảng GNOME cùng nhau.
Qt là framework ứng dụng đa nền tảng dựa trên C++. Nó cung cấp giao diện dựa trên widget, QML·Qt Quick, mạng, đa phương tiện và nhiều chức năng hệ thống, đồng thời là nền tảng của KDE Plasma và các ứng dụng KDE.
Ngoài ra còn có các công nghệ đồ họa sau.
- SDL
- GLFW
- Dear ImGui
- wxWidgets
- FLTK
- EFL
- Tk
- Electron
- Tauri
- Avalonia
- JavaFX
Sự khác biệt giữa môi trường Wayland và X11, desktop portal, trình chọn tệp, thông báo, giao diện chủ đề và khả năng tiếp cận cũng được xem xét trong quá trình phát triển ứng dụng desktop. Ứng dụng được phân phối bằng Flatpak có thể sử dụng giao diện portal khi truy cập tệp, thiết bị và chức năng desktop bên ngoài sandbox.
Trình gỡ lỗi
GDB là trình gỡ lỗi gốc được sử dụng rộng rãi trên Linux. Nó có thể tạm dừng chương trình đang chạy, lần theo mã nguồn và lệnh hợp dịch, đồng thời kiểm tra biến, bộ nhớ, thanh ghi và ngăn xếp lời gọi.
GDB được dùng cho các tác vụ sau.
- Thiết lập breakpoint và watchpoint
- Thực thi từng dòng hoặc từng lệnh
- Kiểm tra ngăn xếp lời gọi hàm
- Hiển thị và sửa đổi biến cùng bộ nhớ
- Chuyển đổi giữa các luồng
- Phân tích core dump
- Gỡ lỗi mục tiêu từ xa
- Kết nối vào tiến trình đang chạy
Hệ sinh thái LLVM có LLDB. LLDB tận dụng thông tin kiểu và gỡ lỗi của Clang cùng LLVM, đồng thời được sử dụng để gỡ lỗi C, C++, Objective-C, Swift và các ngôn ngữ khác.
Các giao diện terminal như GDB TUI cùng phần mở rộng GDB Dashboard, GEF và pwndbg giúp hiển thị thanh ghi, mã hợp dịch và bản đồ bộ nhớ dễ đọc hơn. IDE có thể sử dụng GDB hoặc LLDB làm backend trong khi cung cấp breakpoint và cửa sổ biến dạng đồ họa.
Truy vết lời gọi hệ thống và thư viện
Khi cần kiểm tra cách chương trình sử dụng tệp, mạng và chức năng tiến trình, các công cụ truy vết khác ngoài trình gỡ lỗi mã nguồn được sử dụng.
strace ghi lại lời gọi hệ thống Linux mà chương trình thực hiện cùng kết quả. Nó hữu ích khi điều tra tệp không tìm thấy, quyền bị từ chối, kết nối mạng thất bại và quá trình tạo tiến trình.
ltrace có thể truy vết hàm thư viện động mà chương trình gọi. ldd hiển thị các thư viện dùng chung mà tệp thực thi yêu cầu, còn tùy chọn chẩn đoán của bộ nạp động được dùng để phân tích quá trình tìm thư viện và liên kết symbol.
fuser và lsof tìm tiến trình đang sử dụng tệp, cổng hoặc thiết bị. ss kiểm tra trạng thái socket mạng, còn ip quản lý hoặc kiểm tra giao diện, địa chỉ và định tuyến.
Những công cụ này có thể quan sát hoạt động đang diễn ra mà không cần biên dịch lại chương trình, vì vậy được sử dụng không chỉ trong môi trường phát triển mà còn trong phân tích sự cố trên máy chủ thực tế.
Kiểm tra bộ nhớ và hành vi không xác định
Chương trình C và C++ có thể gặp lỗi như sử dụng con trỏ sai, rò rỉ bộ nhớ và truy cập ngoài giới hạn mảng. Trên Linux có thể sử dụng nhiều công cụ để kiểm tra hành vi bộ nhớ của chương trình khi chạy.
Memcheck của Valgrind chạy chương trình trong một môi trường thực thi ảo để tìm việc sử dụng bộ nhớ chưa khởi tạo, thao tác đọc và ghi không hợp lệ, rò rỉ bộ nhớ cùng nhiều lỗi khác. Nó cung cấp thông tin chi tiết nhưng có thể làm tốc độ thực thi chương trình chậm đi đáng kể.
Sanitizer của trình biên dịch chèn mã kiểm tra vào chương trình.
- AddressSanitizer — truy cập bộ nhớ sai và lỗi vòng đời đối tượng
- UndefinedBehaviorSanitizer — hành vi không xác định
- ThreadSanitizer — tranh chấp dữ liệu
- MemorySanitizer — sử dụng bộ nhớ chưa khởi tạo
- LeakSanitizer — rò rỉ bộ nhớ
Sanitizer được sử dụng trong kiểm thử và tích hợp liên tục, và thường có một cấu hình kiểm tra riêng khác với bản dựng phát hành thông thường.
Electric Fence, Dr. Memory và nhiều chức năng gỡ lỗi bộ cấp phát khác cũng có thể được sử dụng. Các bộ cấp phát bộ nhớ như glibc, jemalloc và mimalloc có thể cung cấp thống kê cùng tùy chọn chẩn đoán.
Phân tích hiệu năng
Linux cung cấp nhiều công cụ để phân tích hiệu năng CPU, bộ nhớ, đĩa và mạng.
perf là công cụ phân tích sử dụng hệ thống con sự kiện hiệu năng của nhân Linux. Nó có thể thu thập bộ đếm hiệu năng phần cứng, sự kiện nhân và ngăn xếp lời gọi hàm để phân tích vị trí sử dụng thời gian CPU.
perf stat thu thập thống kê như số lệnh, lỗi bộ nhớ đệm và dự đoán nhánh trong quá trình chạy lệnh, còn perf record và perf report ghi và hiển thị hồ sơ lấy mẫu.
Các công cụ khác gồm:
time— thời gian thực thi lệnh và mức sử dụng tài nguyêntop,htop,btop— tiến trình và tài nguyên hệ thốngvmstat— thống kê tiến trình, bộ nhớ và nhập xuấtiostat— hiệu năng thiết bị khốipidstat— CPU và nhập xuất theo tiến trìnhsar— ghi hoạt động hệ thốngiftop,nethogs— mức sử dụng mạngiotop— nhập xuất thiết bị lưu trữ theo tiến trình- FlameGraph — trực quan hóa mẫu ngăn xếp lời gọi
- Heaptrack — truy vết cấp phát heap
- Hotspot — phân tích đồ họa dữ liệu
perf - Callgrind và KCachegrind — phân tích quan hệ lời gọi và chi phí
- Tracy — phân tích frame và vùng theo thời gian thực
- sysprof — trình phân tích hệ thống thuộc hệ sinh thái GNOME
Phân tích hiệu năng cần xem xét không chỉ phép tính bên trong chương trình mà còn lời gọi hệ thống, lập lịch, lỗi trang, bộ nhớ đệm, mạng và thời gian chờ thiết bị lưu trữ.
ftrace và eBPF
ftrace là nền tảng truy vết hàm và sự kiện bên trong nhân Linux. Nó có thể ghi lời gọi hàm nhân, sự kiện bộ lập lịch, ngắt và độ trễ, đồng thời được sử dụng thông qua giao diện /sys/kernel/tracing cùng nhiều công cụ cấp cao.
eBPF cho phép chạy chương trình đã được xác minh tại nhiều điểm trong nhân để xử lý mạng, lời gọi hệ thống, truy vết và chính sách bảo mật.
Các công cụ phát triển và quan sát dựa trên eBPF gồm:
- BCC
- bpftrace
- libbpf
- bpftool
- Cilium
- Nhiều nền tảng quan sát hiệu năng và bảo mật
bpftrace gắn các tập lệnh ngắn vào tracepoint, kprobe, uprobe và các điểm khác để phân tích hoạt động của nhân cùng chương trình người dùng. libbpf và CO-RE cung cấp nền tảng để viết chương trình eBPF và chạy chúng trên nhiều cấu hình nhân.
eBPF rất mạnh nhưng chịu ảnh hưởng từ phiên bản nhân, quyền hạn, quy tắc của verifier và chính sách bảo mật. Nhà phát triển ứng dụng thông thường không nhất thiết phải trực tiếp sử dụng nó; eBPF cũng thường được dùng trong triển khai nội bộ của các công cụ phân tích hiệu năng, mạng và bảo mật.
Phân tích tĩnh và chất lượng mã
Các công cụ phân tích mã nguồn và biểu diễn trung gian mà không thực thi chương trình cũng là một phần của môi trường phát triển Linux.
- Clang-Tidy
- Clang Static Analyzer
- Chức năng phân tích tĩnh của GCC
- Cppcheck
- Coverity
- CodeQL
- Semgrep
- Infer
- Sparse
- Smatch
- Coccinelle
Sparse được sử dụng để kiểm tra ký hiệu không gian địa chỉ và cách dùng kiểu trong mã nhân Linux. Coccinelle sử dụng ngôn ngữ bản vá ngữ nghĩa để tìm và chuyển đổi các mẫu lặp lại trong mã C, đồng thời được dùng để xử lý thay đổi API nhân và phát hiện mẫu lỗi.
Các công cụ định dạng mã gồm clang-format, astyle, uncrustify, rustfmt, Black và Prettier. Dự án có thể kiểm tra định dạng cùng kết quả phân tích tĩnh trong CI để duy trì phong cách mã và tiêu chuẩn chất lượng cơ bản.
Kiểm thử và tích hợp liên tục
Dự án Linux kết hợp framework kiểm thử theo từng ngôn ngữ, tập lệnh shell, máy ảo và container để xây dựng môi trường kiểm thử tự động.
Trong C và C++, các công cụ kiểm thử sau được sử dụng.
- CTest
- GoogleTest
- Catch2
- Boost.Test
- Criterion
- CMocka
- Unity
Nhân và phần mềm hệ thống có thể thực hiện kiểm thử khởi động trong máy ảo riêng hoặc dùng QEMU để kiểm thử nhiều kiến trúc và cấu hình. KUnit hỗ trợ kiểm thử đơn vị bên trong nhân Linux, còn kselftest cung cấp tập hợp kiểm thử xác minh chức năng nhân từ không gian người dùng.
Các dịch vụ và công cụ được sử dụng trong môi trường tích hợp liên tục gồm:
- GitHub Actions
- GitLab CI/CD
- Jenkins
- Buildbot
- Cirrus CI
- Zuul
- Woodpecker CI
- Hệ thống xây dựng nội bộ
CI tự động thực hiện xây dựng, kiểm thử, phân tích tĩnh và tạo gói khi mã nguồn thay đổi. Nó cũng có thể kiểm thử nhiều bản phân phối, trình biên dịch và kiến trúc bộ xử lý theo dạng ma trận.
Phát triển nhân và mô-đun
Phát triển nhân Linux yêu cầu môi trường xây dựng và thực thi khác với chương trình không gian người dùng thông thường. Nhân sử dụng hệ thống Kbuild riêng và lựa chọn chức năng cùng trình điều khiển được xây dựng thông qua Kconfig.
Môi trường phát triển nhân thường sử dụng các công cụ sau.
- GCC hoặc Clang
- GNU Make
- Binutils hoặc công cụ LLVM
- Git
- bc, flex và bison
- pahole
- cpio
- QEMU
- GDB
- Sparse
- Coccinelle
- objtool
- perf và ftrace
- KUnit và kselftest
- syzkaller
Mô-đun nhân bên ngoài sử dụng thư mục xây dựng của nhân đã cài đặt và giao diện Kbuild để tạo tệp .ko. Mô-đun có thể được nạp trong khi hệ thống đang chạy, nhưng phải phù hợp với cấu hình, symbol và ABI của nhân hiện tại.
Lỗi trong quá trình phát triển mô-đun có thể làm toàn bộ hệ thống ngừng hoạt động, vì vậy máy ảo hoặc thiết bị thử nghiệm riêng thường được sử dụng. Với QEMU và KVM, có thể nhanh chóng khởi động ảnh nhân, tạo lại máy ảo bị dừng hoặc kết nối GDB.
Bản vá nhân trải qua kiểm tra phong cách mã, xây dựng, phân tích tĩnh và nhiều kiểm thử tự động. Quy trình phát triển nhân chi tiết được trình bày trong Nhân Linux.
Phát triển nhúng
Linux được sử dụng trong bộ định tuyến, ô tô, thiết bị công nghiệp, TV và máy tính nhỏ, vì vậy công cụ biên dịch chéo và tạo ảnh hệ thống rất quan trọng.
Buildroot tạo ảnh hệ thống nhúng nhỏ bằng cách lựa chọn nhân Linux, bộ nạp khởi động, thư viện C và các gói không gian người dùng.
Yocto Project sử dụng recipe và layer để xây dựng bản phân phối Linux, SDK, gói và ảnh dành riêng cho từng sản phẩm. Nó được dùng để quản lý cấu hình xây dựng có thể tái tạo cho nhiều sản phẩm phần cứng và dòng sản phẩm được duy trì dài hạn.
Ngoài ra còn có OpenEmbedded, PTXdist và hệ thống xây dựng OpenWrt. Nhà phát triển xây dựng cùng lúc U-Boot, nhân, device tree và hệ thống tệp gốc, sau đó kiểm thử thiết bị qua JTAG, bảng điều khiển nối tiếp và khởi động mạng.
QEMU mô phỏng một số phần cứng khi bo mạch thực tế chưa sẵn sàng hoặc cần kiểm thử tự động. Trên thiết bị thực có thể sử dụng gỡ lỗi từ xa GDB, gdbserver, OpenOCD và trình gỡ lỗi riêng của nhà sản xuất.
Đóng gói
Ứng dụng Linux có thể chỉ cung cấp mã nguồn, nhưng cũng có thể được đóng gói để người dùng cài đặt thông qua trình quản lý gói của bản phân phối.
Các định dạng và công cụ đóng gói chính gồm:
- Gói Debian cùng
dpkg-buildpackagevà debhelper - RPM và rpmbuild
- PKGBUILD và makepkg của Arch Linux
- APKBUILD và abuild của Alpine Linux
- ebuild của Gentoo
- Biểu thức Nix
- Định nghĩa gói GNU Guix
Gói bản phân phối tích hợp chương trình vào cấu trúc tệp, thư viện, hệ thống bảo mật và cập nhật của bản phân phối tương ứng. Khác với việc cài trực tiếp từ mã nguồn, trình quản lý gói có thể theo dõi tệp được cài, phụ thuộc, quá trình nâng cấp và gỡ bỏ.
Các định dạng độc lập với bản phân phối gồm Flatpak, Snap và AppImage. Flatpak sử dụng runtime, sandbox và portal để cung cấp ứng dụng desktop cho nhiều bản phân phối. AppImage đóng gói ứng dụng và các tệp cần thiết thành một ảnh thực thi duy nhất.
Môi trường phát triển có thể tái tạo
Gói của bản phân phối Linux thường được cài trên toàn hệ thống, vì vậy phiên bản thư viện và trình biên dịch mà các dự án khác nhau yêu cầu có thể xung đột. Các công cụ cách ly và tái tạo môi trường phát triển bổ sung cho mô hình này.
Container cho phép định nghĩa bản phân phối và gói mà dự án cần dưới dạng ảnh. Dockerfile hoặc Containerfile ghi lại quy trình cài đặt môi trường phát triển và xây dựng, đồng thời cho phép sử dụng cùng ảnh trong CI và máy tính của nhà phát triển.
Distrobox và Toolbox cung cấp môi trường bản phân phối phục vụ phát triển được tích hợp chặt chẽ với desktop máy chủ trên Podman hoặc công nghệ container khác. Người dùng có thể sử dụng trình biên dịch và gói của bản phân phối khác mà không thay đổi bản phân phối hiện tại.
Nix và GNU Guix cấu hình gói cùng môi trường phát triển theo kiểu khai báo. Có thể chuẩn bị lại phiên bản trình biên dịch và thư viện cụ thể từ cùng một định nghĩa và cài đặt đồng thời nhiều phiên bản.
direnv áp dụng biến môi trường theo dự án khi đi vào thư mục và gỡ bỏ chúng khi rời khỏi. Môi trường ảo Python, trình quản lý toolchain Rust, SDKMAN và trình quản lý phiên bản theo từng ngôn ngữ cũng tách biệt môi trường ngôn ngữ cho từng dự án.
Tài liệu và hướng dẫn
Trong môi trường phát triển Linux, cách sử dụng chương trình và giao diện hệ thống thường được cung cấp dưới dạng tài liệu cục bộ.
man hiển thị trang hướng dẫn cho lệnh, lời gọi hệ thống, hàm thư viện và tệp cấu hình. Dự án Linux man-pages lập tài liệu cho nhiều giao diện không gian người dùng của nhân và thư viện C.
Chương trình GNU đôi khi cung cấp hướng dẫn chi tiết ở định dạng Info. Tài liệu phân cấp có thể được đọc bằng lệnh info, và cùng hướng dẫn cũng thường được cung cấp trên web.
apropos và man -k tìm trang hướng dẫn liên quan từ phần mô tả. Devhelp tìm kiếm và hiển thị tài liệu API thuộc hệ sinh thái GNOME và GTK, còn Qt Assistant cùng chức năng tích hợp tài liệu của IDE cho phép khám phá API Qt.
Doxygen, Sphinx, MkDocs, rustdoc, Javadoc và nhiều trình tạo tài liệu khác tạo tài liệu API và tài liệu dự án từ mã nguồn cùng tệp tài liệu.
Terminal và tùy biến dành cho nhà phát triển
Nhà phát triển Linux đôi khi cấu hình terminal không chỉ như cửa sổ nhập lệnh mà như một môi trường làm việc được sử dụng trong thời gian dài.
Các trình giả lập terminal gồm:
- Konsole
- GNOME Console và GNOME Terminal
- Kitty
- Alacritty
- WezTerm
- Foot
- Tilix
- Terminator
- XTerm
Nhà phát triển thiết lập phông chữ, màu sắc, độ trong suốt, nền, tab và màn hình chia đôi. Nerd Fonts và phông biểu tượng được dùng để hiển thị ký hiệu trong dấu nhắc và danh sách tệp.
Các công cụ và framework dấu nhắc gồm:
- Starship
- Powerlevel10k
- Oh My Zsh
- Prezto
- Oh My Posh
- Bash-it
Dấu nhắc có thể hiển thị thư mục hiện tại, nhánh Git, trạng thái thay đổi, môi trường ngôn ngữ đang hoạt động và kết quả của lệnh trước. Nếu hiển thị quá nhiều thông tin, thời gian khởi động shell và chuyển thư mục có thể chậm, vì vậy người dùng đôi khi chỉ lựa chọn những mục cần thiết.
Trang trí desktop và dotfiles
Desktop Linux cho phép thay đổi sâu trình quản lý cửa sổ, panel, giao diện chủ đề và phím tắt. Một số nhà phát triển quản lý bố cục và hình thức môi trường làm việc chi tiết không kém chính công cụ phát triển.
Có thể sử dụng môi trường desktop hoàn chỉnh như KDE Plasma và GNOME hoặc trình quản lý cửa sổ dạng lát như i3, Sway, Hyprland, Awesome và dwm.
Trong môi trường dạng lát, cửa sổ được bố trí bằng bàn phím và terminal, trình soạn thảo cùng trình duyệt có thể được đặt ở vị trí cố định cho từng không gian làm việc. Người dùng cũng có thể kết hợp Waybar, Polybar, Rofi, Wofi và nhiều daemon thông báo để tạo môi trường desktop riêng.
Kho tập hợp tệp cấu hình của shell, trình soạn thảo, terminal, Git và trình quản lý cửa sổ thường được gọi là dotfiles. Người dùng sử dụng kho Git, công cụ quản lý liên kết tượng trưng, GNU Stow, chezmoi hoặc yadm để triển khai cùng thiết lập trên nhiều máy tính.
Việc tùy biến này không bắt buộc cho phát triển, nhưng cho thấy môi trường Linux có thể được điều chỉnh theo quy trình làm việc riêng. Hiện tượng dành quá nhiều thời gian cho việc cấu hình cũng trở thành chủ đề đùa vui trong văn hóa desktop Linux.
Thông tin hệ thống và trang trí màn hình
Người dùng Linux đôi khi sử dụng chương trình hiển thị logo bản phân phối cùng thông tin phần cứng, nhân và môi trường desktop khi mở terminal.
Fastfetch là công cụ hiển thị hệ điều hành, nhân, CPU, GPU, bộ nhớ, desktop và thông tin terminal cùng logo. Nó có mục đích tương tự Neofetch và được phát triển với mục tiêu tăng hiệu năng cùng mở rộng chức năng.[71]
Các công cụ như Screenfetch, Pfetch và Onefetch cũng tồn tại. Thay vì thông tin hệ thống, Onefetch hiển thị thành phần ngôn ngữ, commit, giấy phép và các thông tin khác của kho Git.
Những chương trình này không cung cấp thông tin bắt buộc cho quá trình phát triển mà chủ yếu được dùng để nhanh chóng kiểm tra trạng thái hệ thống hoặc thể hiện môi trường cá nhân trong ảnh chụp màn hình. Logo, màu sắc và hình ảnh tùy chỉnh cũng có thể được sử dụng như một phần của thiết kế desktop và terminal.
Lệnh giải trí và văn hóa nhà phát triển
Trong Linux và các hệ thống tương tự UNIX có nhiều chương trình gần như không có mục đích thực dụng hoặc được tạo ra để trang trí đầu ra của lệnh theo cách vui nhộn. Những công cụ này không bắt buộc cho phát triển hệ thống nhưng thể hiện văn hóa dòng lệnh kết hợp tự do các chương trình nhỏ và khiếu hài hước của nhà phát triển.
cowsay đặt câu được nhập vào bong bóng thoại và hiển thị như lời nói của một con bò ASCII hoặc động vật khác. Ngoài con bò mặc định còn có thể chọn chim cánh cụt, rồng, ma và nhiều hình khác, đồng thời có thể truyền đầu ra của lệnh khác qua pipe.
fortune xuất ngẫu nhiên các câu ngắn, câu đùa hoặc châm ngôn. Khi kết hợp như fortune | cowsay, con bò có thể nói một câu ngẫu nhiên.
lolcat áp dụng màu cầu vồng lên văn bản đầu vào. Nó có thể làm kết quả xây dựng hoặc banner trông bắt mắt hơn, nhưng cũng có thể phá hỏng ý nghĩa màu sắc của thông báo lỗi nên không phù hợp với nhật ký tự động hóa thực tế.
cmatrix hiển thị các ký tự rơi xuống trong terminal gợi nhớ đến bộ phim 《Ma trận》. Nó không có chức năng phân tích hệ thống hoặc phát triển mà được sử dụng để trang trí và trình diễn terminal.
Ngoài ra còn có các công cụ sau.
sl— chương trình cho tàu hỏa chạy qua màn hình khi nhập nhầmlsnyancat— hiển thị hoạt ảnh Nyan Cat trong terminalasciiquarium— bể cá ASCIIpipes.sh— hiển thị các ống chuyển động trong terminalhollywood— chia màn hình thành nhiều bảng phân tích giả giống cảnh hack trong phimboxes— tạo khung ASCII quanh văn bảnfigletvàtoilet— tạo chữ ASCII lớnponysay— hiển thị nhân vật ngựa con nói một câucbonsai— cho cây bonsai phát triển trong terminalgenact— hiển thị hoạt động giả như đang thực hiện công việc quan trọngoneko— hiển thị mèo chạy theo con trỏ chuột trên màn hình- Nhiều trình bảo vệ màn hình của XScreenSaver
Nhiều chương trình trong số này có thể được cài đặt thực tế từ kho gói. Một số bắt đầu như bài tập lập trình hoặc dự án nguồn mở nhỏ, sau đó có nhiều triển khai và biến thể khác nhau.
Cũng có nhiều công cụ sử dụng hình ảnh mèo. cat vốn là lệnh UNIX thực dụng dùng để nối và xuất nội dung tệp, nhưng tên của nó đã tạo ra nhiều trò đùa kết hợp với hình mèo. bat bổ sung tô sáng cú pháp và hiển thị thay đổi Git cho chức năng xuất tệp tương tự cat, còn nyancat chỉ hiển thị hình mèo chuyển động. oneko khiến mèo đuổi theo con trỏ trên desktop.
Những công cụ này cho thấy Linux không chỉ là hệ điều hành máy chủ dành cho công việc mà còn là môi trường máy tính cá nhân nơi người dùng trực tiếp tạo và chia sẻ các chương trình nhỏ.
Công cụ dòng lệnh thay thế hiện đại
Một số chương trình không nhằm loại bỏ hoàn toàn lệnh UNIX truyền thống mà được phát triển như công cụ thay thế cải thiện khả năng sử dụng tương tác và đầu ra trực quan.
bat— xuất tệp với tô sáng cú pháp và tích hợp Giteza— liệt kê thư mục với loại tệp, trạng thái Git và dạng câyfd— tìm kiếm tệp với giá trị mặc định đơn giảnripgrep— tìm kiếm văn bản đệ quy tốc độ caodust— trực quan hóa dung lượng đĩa theo thư mụcduf— hiển thị mức sử dụng hệ thống tệp dưới dạng bảngprocs— hiển thị danh sách tiến trình dễ đọcbottom— trình giám sát tài nguyên hệ thốngdelta— hiển thị Git diff và diff thông thường với tô sáng cú phápfzf— bộ chọn fuzzy đa dụngzoxide— chuyển thư mục dựa trên lịch sử sử dụngtldr— cung cấp ngắn gọn ví dụ thường dùng của lệnh
Các công cụ này thường được sử dụng với tên riêng trong shell tương tác thay vì trực tiếp thay thế lệnh hiện có để duy trì khả năng tương thích của tập lệnh. Công cụ POSIX truyền thống có thể sử dụng trên gần như mọi môi trường UNIX, còn công cụ hiện đại cung cấp đầu ra phong phú và giá trị mặc định thuận tiện hơn nhưng yêu cầu cài đặt thêm.
Lựa chọn môi trường phát triển
Bộ công cụ tối thiểu cần thiết để phát triển trên Linux thay đổi theo mục tiêu. Với chương trình C, trình soạn thảo, trình biên dịch, trình liên kết và công cụ xây dựng là nền tảng. Với tập lệnh Python, chỉ cần trình thông dịch và công cụ môi trường ảo là có thể bắt đầu. Phát triển nhân cần thêm phụ thuộc xây dựng chuyên dụng, máy ảo, công cụ truy vết và phân tích tĩnh.
Trong dự án lớn, các tổ hợp sau thường được sử dụng.
- Quản lý mã nguồn và lịch sử thay đổi bằng Git
- Biên dịch bằng GCC hoặc Clang
- Định nghĩa xây dựng bằng CMake hoặc Meson
- Thực thi xây dựng thực tế bằng Ninja hoặc Make
- Phân tích lỗi bằng GDB và Sanitizer
- Phân tích hiệu năng bằng perf và công cụ eBPF
- Kiểm thử nhiều bản phân phối và trình biên dịch trong CI
- Phân phối kết quả dưới dạng gói hoặc ảnh container
Nhà phát triển cá nhân có thể tự do cấu hình trình soạn thảo, dấu nhắc shell, terminal và desktop. Có thể chỉ sử dụng Vim cùng Make trong môi trường console tối thiểu hoặc kết hợp IDE đồ họa, môi trường phát triển dựa trên container và nhiều công cụ tự động hóa.
Đặc điểm của môi trường phát triển Linux không nằm ở việc mọi chức năng được cố định trong một sản phẩm duy nhất. Nó nằm ở khả năng lựa chọn và kết hợp trên cùng một hệ thống từ những lệnh UNIX lâu đời, máy chủ ngôn ngữ hiện đại, IDE quy mô lớn và công cụ shell nhỏ cho đến công cụ phân tích hiệu năng công nghiệp và những chương trình giải trí khiến mèo chạy khắp màn hình.
Phát triển nhân
nhân Linux, thành phần trung tâm của các hệ điều hành dựa trên Linux, không phải là sản phẩm do một doanh nghiệp hoặc một tổ chức phát triển cố định độc quyền tạo ra. Nó được phát triển chung bởi các nhà phát triển cá nhân, trường đại học, nhà sản xuất bán dẫn và phần cứng, nhà cung cấp bản phân phối Linux, doanh nghiệp điện toán đám mây cùng các công ty trong nhiều ngành công nghiệp.
Nhà phát triển có thể đề xuất trình điều khiển thiết bị, hệ thống tệp, hỗ trợ bộ xử lý, chức năng mạng và bản sửa lỗi mà mình cần. Tuy nhiên, mã được đề xuất không tự động được đưa ngay vào nhân Linux chính thức. Mỗi thay đổi phải trải qua quy trình xem xét công khai của hệ thống con liên quan, đi qua kho của nhà bảo trì rồi mới được tích hợp vào mainline cuối cùng.
Quá trình phát triển nhân Linux gần với một cấu trúc phân tán, trong đó cộng đồng phát triển và nhà bảo trì của từng hệ thống con chịu trách nhiệm cho lĩnh vực tương ứng, hơn là một mô hình trung tâm phân công công việc cho mọi nhà phát triển. Bản phát hành cuối cùng được tạo từ một kho mainline duy nhất, nhưng hoạt động phát triển và xem xét thực tế diễn ra song song trên nhiều danh sách thư và kho Git.
Thông tin chi tiết về triển khai nội bộ của nhân, thư mục mã nguồn, phương thức xây dựng và giao diện lập trình được trình bày trong Nhân Linux.
Các chủ thể phát triển
Những nhà phát triển có nền tảng và mục đích khác nhau tham gia quá trình phát triển nhân Linux.
- Nhà phát triển cá nhân và tình nguyện viên
- Trường đại học và viện nghiên cứu
- Nhà phát triển bản phân phối Linux
- Nhà sản xuất bán dẫn và bộ xử lý
- Nhà sản xuất máy chủ, thiết bị lưu trữ và thiết bị mạng
- Nhà sản xuất điện thoại thông minh và thiết bị nhúng
- Nhà cung cấp đám mây và trung tâm dữ liệu
- Doanh nghiệp ô tô và hệ thống công nghiệp
- Nhà nghiên cứu bảo mật
- Công ty tư vấn và chuyên phát triển nhân
Linux thời kỳ đầu được phát triển chủ yếu xoay quanh cá nhân Linus Torvalds, nhưng khi số lượng phần cứng và chức năng được hỗ trợ tăng lên, dự án phát triển đến quy mô mà một người không thể trực tiếp xem xét và quản lý toàn bộ mã. Vì vậy, cấu trúc nhà bảo trì phụ trách từng lĩnh vực như hệ thống tệp, mạng, kiến trúc bộ xử lý và trình điều khiển thiết bị được hình thành.
Nhà phát triển doanh nghiệp tham gia phát triển nhân để triển khai chức năng cần cho sản phẩm của công ty hoặc giải quyết vấn đề về hiệu năng và độ ổn định. Nhà sản xuất bán dẫn hỗ trợ bộ xử lý mới và chức năng quản lý nguồn điện, nhà sản xuất thiết bị phát triển trình điều khiển, còn doanh nghiệp đám mây có thể cải tiến ảo hóa, mạng, quản lý tài nguyên và hiệu năng hệ thống quy mô lớn.
Mã do doanh nghiệp viết cũng thường phải trải qua xem xét công khai và được nhà bảo trì chấp thuận trước khi đưa vào nhân chính thức. Doanh nghiệp có thể duy trì một bản sửa đổi riêng chỉ trong nội bộ, nhưng nếu tích hợp vào nhân chính thức, họ có thể giảm gánh nặng phải áp dụng lại cùng thay đổi mỗi khi phiên bản mới xuất hiện, đồng thời nhận được sự xem xét và bảo trì chung từ các nhà phát triển khác.
Nhà phát triển tham gia dự án nhân Linux sử dụng cùng định dạng bản vá và quy trình xem xét bất kể quan hệ lao động. Tuy nhiên, vì những nhà phát triển toàn thời gian tham gia lâu dài có thể viết và duy trì nhiều mã hơn, các doanh nghiệp thuê nhà phát triển nhân có thể chiếm tỷ trọng lớn trong khối lượng đóng góp thực tế.
Vai trò của Linus Torvalds
Linus Torvalds là nhà phát triển khởi xướng dự án nhân Linux và là nhà bảo trì cấp cao chịu trách nhiệm tích hợp cuối cùng cho nhân mainline.
Hiện nay Torvalds không trực tiếp xem xét từ đầu mọi bản vá của nhân. Phần lớn thay đổi trước hết được nhà phát triển và nhà bảo trì của hệ thống con liên quan xem xét, sau đó đi qua nhiều tầng kho và được chuyển đến dưới dạng một tập hợp thay đổi Git đã được sắp xếp.
Torvalds xem xét các pull request do những nhà bảo trì cấp cao gửi và hợp nhất chúng vào kho mainline. Ở giai đoạn này, các yếu tố sau được cân nhắc.
- Thay đổi đã trải qua đầy đủ quá trình xem xét trong hệ thống con hay chưa
- Thời điểm hợp nhất có phù hợp với chu kỳ phát hành hiện tại hay không
- Có xung đột với hệ thống con khác hay không
- Có làm hỏng khả năng tương thích với không gian người dùng hiện có hay không
- Việc thử nghiệm có tương xứng với quy mô và mức rủi ro của thay đổi hay không
- Có báo cáo về hồi quy hoặc vấn đề thiết kế hay không
- Lịch sử thay đổi giữa người gửi và nhà bảo trì có rõ ràng hay không
Quá trình phát triển nhân Linux được phân tán rộng rãi, nhưng việc hợp nhất mainline cuối cùng được tập trung hóa. Tài liệu chính thức giải thích rằng hơn 100 nhà bảo trì quản lý thay đổi trong kho riêng của họ, rồi chúng được hợp nhất vào kho mainline ở bước cuối. Công việc này thường do Torvalds thực hiện, nhưng trong quá trình phát triển Linux 4.19 năm 2018, Greg Kroah-Hartman từng tạm thời đảm nhiệm việc tích hợp cuối cùng.[72]
Torvalds không trực tiếp duy trì mọi phiên bản ổn định và hỗ trợ dài hạn. Các dòng ổn định sau mainline do những nhà bảo trì nhân ổn định riêng phụ trách.
Hệ thống con
Nhân Linux được phân phối dưới dạng một cây mã nguồn duy nhất, nhưng trong quá trình phát triển được chia thành nhiều hệ thống con.
Các lĩnh vực tiêu biểu gồm:
- Kiến trúc bộ xử lý
- Bộ lập lịch tiến trình
- Quản lý bộ nhớ
- Hệ thống tệp ảo
- Từng hệ thống tệp riêng
- Thiết bị khối và thiết bị lưu trữ
- Ngăn xếp mạng
- Đồ họa và DRM
- USB và PCI
- Thiết bị nhập liệu
- Âm thanh
- Bảo mật
- Ảo hóa
- eBPF
- Quản lý nguồn điện
- Nền tảng và trình điều khiển thiết bị
- Tài liệu và công cụ phát triển
Mỗi hệ thống con có thể có danh sách thư, nhà bảo trì, kho Git và quy tắc xử lý bản vá riêng. Những hệ thống con lớn lại được chia tiếp thành nhiều lĩnh vực nhỏ hơn và nhà bảo trì theo từng trình điều khiển.
Ví dụ, thay đổi đối với một trình điều khiển thiết bị mạng cụ thể trước hết được gửi đến nhà bảo trì của trình điều khiển hoặc lĩnh vực mạng tương ứng. Bản vá sau khi vượt qua xem xét và thử nghiệm được đưa vào kho của hệ thống con mạng, rồi có thể được đưa vào pull request để hợp nhất mainline.
Cấu trúc phân tầng này cho phép nhà phát triển có kinh nghiệm trong lĩnh vực tương ứng xem xét chất lượng và thiết kế trước, mà không yêu cầu Torvalds phải là chuyên gia về mọi chi tiết phần cứng và chức năng.
Nhà bảo trì
Nhà bảo trì là nhà phát triển chịu trách nhiệm phát triển và tích hợp thay đổi cho một tệp, trình điều khiển, hệ thống con hoặc dòng phát hành cụ thể.
Nhà bảo trì không chỉ bảo tồn mã hiện có. Họ thường thực hiện các công việc sau.
- Xem xét bản vá mới
- Đưa ra ý kiến về thiết kế và giao diện
- Kiểm tra báo cáo lỗi và hồi quy
- Yêu cầu gửi lại phiên bản đã sửa
- Kết nối nhà phát triển với người xem xét liên quan
- Quản lý thứ tự áp dụng và quan hệ phụ thuộc giữa các bản vá
- Vận hành kho Git của hệ thống con
- Sắp xếp thay đổi để gửi vào bản phát hành mainline tiếp theo
- Quản lý chất lượng mã và khả năng tương thích lâu dài
- Tìm nhà bảo trì kế nhiệm cho mã không còn được quản lý
Nhà bảo trì không cần trực tiếp viết toàn bộ mã. Vai trò quan trọng là hiểu các thay đổi trong lĩnh vực phụ trách, tìm đúng người xem xét và quyết định thay đổi nào được chấp nhận vào kho chính thức.
Tệp MAINTAINERS trong mã nguồn nhân ghi lại nhà bảo trì, người xem xét, danh sách thư, đường dẫn tệp liên quan và kho Git cho từng lĩnh vực. Nhà phát triển có thể sử dụng scripts/get_maintainer.pl để tìm người và danh sách cần gửi bản vá dựa trên tệp đã sửa cùng lịch sử commit.
Nhà bảo trì không phải là một chức vụ cố định do tổ chức trung tâm bổ nhiệm, mà là vai trò hình thành khi một người liên tục đóng góp trong lĩnh vực tương ứng và đảm nhận trách nhiệm xem xét cùng quản lý. Nhà bảo trì hiện tại có thể bổ sung đồng bảo trì mới hoặc chuyển giao trách nhiệm, còn nhà phát triển mới có thể đứng ra làm nhà bảo trì cho lĩnh vực không còn được quản lý.
Do mỗi hệ thống con có tốc độ phát triển, mức rủi ro, nhóm người dùng và cấu trúc kỹ thuật khác nhau, quy trình chi tiết cũng có thể khác. Ngoài quy trình phát triển chung, tài liệu nhân còn cung cấp quy tắc bổ sung cho mạng, SoC và nhiều cây của nhà bảo trì.[73]
Viết và gửi bản vá
Thay đổi của nhân Linux thường được gửi theo đơn vị bản vá. Bản vá không chỉ chứa phần khác biệt của mã mà còn bao gồm lý do thay đổi, tình huống xảy ra vấn đề, phương thức giải quyết, kết quả thử nghiệm và thông tin liên quan.
Phần mô tả bản vá được khuyến nghị không chỉ ghi những gì đã thay đổi mà còn làm rõ các nội dung sau.
- Vấn đề xảy ra trong mã hiện có
- Ảnh hưởng thực tế của vấn đề
- Phương thức giải quyết đã lựa chọn
- Khác biệt so với các giải pháp khác
- Ảnh hưởng đến khả năng tương thích không gian người dùng
- Môi trường và kết quả đã thử nghiệm
- Báo cáo lỗi và commit liên quan
- Có cần áp dụng vào nhân ổn định hay không
Một chức năng lớn có thể được chia thành nhiều bản vá có thể xem xét và gửi dưới dạng chuỗi bản vá. Mỗi bản vá nên có một mục đích độc lập nếu có thể, đồng thời thường được cấu thành để có thể xây dựng và hoạt động theo thứ tự khi các bản vá trước đã được áp dụng.
Dự án nhân sử dụng Git, nhưng trong phần lớn hệ thống con, việc gửi và xem xét bản vá qua email vẫn là phương thức trung tâm thay vì pull request trên website. Nhà phát triển có thể dùng git format-patch để tạo bản vá email từ commit và git send-email để gửi đến nhà bảo trì cùng danh sách thư công khai liên quan.
Bản vá chứa dòng Signed-off-by thể hiện chữ ký của tác giả. Dòng này xác nhận rằng nhà phát triển có quyền gửi đóng góp và đồng ý với các điều kiện của Chứng nhận nguồn gốc của nhà phát triển.
Signed-off-by không có nghĩa là mã đã được xem xét đầy đủ. Trong quá trình xem xét, các thẻ riêng sau có thể được bổ sung.
Reviewed-by— người xem xét đã kiểm tra mã và đồng ýAcked-by— đồng ý với thay đổiTested-by— đã thử nghiệm trong một môi trường cụ thểReported-by— người đầu tiên báo cáo vấn đềSuggested-by— người đề xuất hướng giải quyếtFixes— commit trước đó nơi vấn đề bắt đầuCc: stable— yêu cầu xem xét áp dụng vào nhân ổn định
Những thẻ này được dùng để theo dõi thay đổi đã trải qua quá trình xem xét và thử nghiệm nào.
Xem xét công khai
Bản vá được gửi sẽ được nhà phát triển và nhà bảo trì liên quan xem xét trên danh sách thư công khai. Người xem xét có thể kiểm tra không chỉ phong cách mã mà còn thiết kế, tính đồng thời, vòng đời bộ nhớ, xử lý lỗi, hiệu năng, bảo mật và khả năng tương thích không gian người dùng.
Nếu phát hiện vấn đề trong quá trình xem xét, nhà phát triển gửi phiên bản mới đã phản ánh ý kiến. Tiêu đề bản vá có thể ghi v2, v3 và phần mô tả cũng nêu những gì đã thay đổi so với phiên bản trước.
Việc gửi bản vá không bảo đảm sẽ nhận được phản hồi hoặc được chấp nhận. Nhà bảo trì liên quan có thể đang bận, đối tượng và phương thức gửi có thể sai, hoặc cộng đồng chưa đạt đồng thuận về nhu cầu và thiết kế của thay đổi.
Chức năng quy mô lớn thường được thảo luận với cộng đồng liên quan từ giai đoạn thiết kế thay vì chỉ công bố lần đầu sau khi mã đã hoàn thiện. Đề xuất ban đầu có thể được gửi dưới dạng RFC để nhận ý kiến về hướng triển khai và giao diện.
Xem xét công khai vừa là quá trình tìm lỗi trong mã, vừa là quá trình quyết định thiết kế có thể được duy trì lâu dài. Vì nhiều bản phân phối, thiết bị và ứng dụng có thể phụ thuộc vào giao diện được đưa vào nhân, khả năng tương thích và chi phí bảo trì về sau được xem trọng hơn việc chỉ triển khai chức năng trước mắt.
Kho của nhà bảo trì và đường hợp nhất
Bản vá vượt qua quá trình xem xét được áp dụng vào kho Git của nhà bảo trì liên quan. Tuy nhiên, không phải mọi bản vá đều chỉ đi qua một bước trước khi đến Torvalds.
Trong lĩnh vực quy mô lớn, đường đi có thể được hình thành như sau.
- Nhà bảo trì trình điều khiển hoặc lĩnh vực nhỏ nhận bản vá.
- Bản vá được thử nghiệm trong kho của nhà bảo trì cấp nhỏ.
- Nhà bảo trì hệ thống con cấp cao lấy thay đổi.
- Thay đổi được thử nghiệm cùng các thay đổi khác trong kho tích hợp hệ thống con.
- Trong cửa sổ hợp nhất, nhà bảo trì cấp cao gửi pull request cho Torvalds.
- Torvalds hợp nhất thay đổi vào kho mainline.
Ở mỗi giai đoạn, chữ ký và lịch sử Git của tác giả ban đầu, người xem xét và nhà bảo trì áp dụng bản vá được duy trì. Nhờ đó có thể theo dõi con đường mà mã đi vào nhân chính thức.
Kho hệ thống con có thể có nhánh riêng cho chức năng đang phát triển và nhánh sửa lỗi khẩn cấp cho bản phát hành hiện tại. Chức năng mới chờ cửa sổ hợp nhất tiếp theo, còn bản sửa hồi quy nghiêm trọng có thể được gửi trong thời gian ứng viên phát hành hiện tại.
linux-next
Khi nhiều nhà bảo trì phát triển độc lập, những thay đổi vẫn xây dựng bình thường trong từng kho riêng có thể xung đột hoặc gây lỗi khi được hợp nhất cùng nhau vào mainline.
linux-next là cây nhân thử nghiệm tích hợp trước nhiều kho hệ thống con có khả năng được đưa vào cửa sổ hợp nhất mainline tiếp theo. Nhà bảo trì có thể đưa thay đổi của mình vào linux-next để phát hiện xung đột với hệ thống con khác, lỗi xây dựng và vấn đề tích hợp trước khi cửa sổ hợp nhất bắt đầu.
linux-next không phải là bản phát hành Linux chính thức tiếp theo và cũng không phải là nhân dành cho môi trường vận hành ổn định. Đây là điểm tích hợp phục vụ phát triển, kết hợp sớm các ứng viên hợp nhất trong tương lai để thử nghiệm.
Hệ thống xây dựng và thử nghiệm khởi động tự động kiểm tra linux-next cùng nhiều cây của nhà bảo trì trên nhiều kiến trúc và cấu hình. Vấn đề được phát hiện sẽ được báo cáo cho nhà phát triển hoặc nhà bảo trì phụ trách bản vá tương ứng.
Chu kỳ phát hành mainline
Quá trình phát triển mainline của nhân Linux nhìn chung theo chu kỳ lặp dựa trên thời gian. Hiện nay một phiên bản mainline mới thường được công bố khoảng mỗi 9 đến 10 tuần.[74]
Một chu kỳ phát hành được chia thành hai phần lớn là cửa sổ hợp nhất và giai đoạn ứng viên phát hành.
Khi một phiên bản mainline mới được công bố, cửa sổ hợp nhất cho phiên bản tiếp theo mở trong khoảng hai tuần. Trong thời gian này, các nhà bảo trì hệ thống con gửi đến Torvalds các chức năng và thay đổi lớn đã được xem xét, thử nghiệm trong chu kỳ phát triển trước.
Cửa sổ hợp nhất thường tiếp nhận các thay đổi sau.
- Hỗ trợ thiết bị và bộ xử lý mới
- Hệ thống tệp và chức năng mạng mới
- Cải tiến lớn của hệ thống con
- Thay đổi API nội bộ và cấu trúc
- Công việc dọn dẹp ảnh hưởng đến nhiều tệp
- Nền tảng chức năng tổng thể của phiên bản tiếp theo
Khi cửa sổ hợp nhất kết thúc, Torvalds công bố ứng viên phát hành đầu tiên là -rc1. Sau đó, trọng tâm chuyển từ chức năng lớn mới sang sửa lỗi và hồi quy.
Một ứng viên phát hành mới thường được công bố mỗi tuần.
-rc1-rc2-rc3- …
- Phiên bản chính thức
Phần lớn chu kỳ phát triển trải qua khoảng bảy hoặc tám ứng viên phát hành. Nếu có nhiều vấn đề hoặc cần thử nghiệm bổ sung, có thể xuất hiện nhiều ứng viên hơn.
Nếu phát hiện vấn đề nghiêm trọng trong thời gian ứng viên phát hành, thay đổi có thể được sửa hoặc hoàn nguyên khỏi mainline. Phiên bản chính thức không phải là tuyên bố rằng mọi lỗi đã biết đều biến mất, mà là trạng thái mainline tại thời điểm được đánh giá rằng việc hợp nhất chức năng mới đã hoàn thành và có thể chuyển sang giai đoạn ổn định cùng phát triển tiếp theo.
Cửa sổ hợp nhất
Cửa sổ hợp nhất không phải là khoảng hai tuần để lần đầu gửi ý tưởng mới. Chức năng lớn cần được phát triển và xem xét trên danh sách thư liên quan từ rất lâu trước khi cửa sổ mở.
Nhà bảo trì thường không gửi đột ngột thay đổi lớn chưa được xem xét đầy đủ hoặc chưa được thử nghiệm trong linux-next vào cửa sổ hợp nhất. Cửa sổ hợp nhất gần hơn với giai đoạn tích hợp các thay đổi hệ thống con đã được chuẩn bị vào mainline.
Không phải mọi thay đổi đều bị cấm sau cửa sổ hợp nhất. Lỗi và hồi quy được phát hiện trong phiên bản hiện tại, sửa tài liệu và thay đổi có mức rủi ro thấp vẫn có thể được đưa vào trong thời gian ứng viên phát hành. Tuy nhiên, khi thời điểm phát hành đến gần, phạm vi và mức rủi ro của thay đổi được chấp nhận sẽ giảm.
Cấu trúc này phân biệt thời điểm tích hợp chức năng và ổn định hóa mà không làm tốc độ phát triển chậm quá mức. Nhà phát triển có thể tiếp tục chuẩn bị chức năng cho phiên bản tiếp theo trong kho hệ thống con, trong khi mainline tập trung sửa lỗi cho phiên bản hiện tại.
Hồi quy
Trong phát triển nhân Linux, hồi quy là hiện tượng chức năng hoạt động bình thường ở phiên bản trước không còn hoạt động sau một thay đổi mới.
Hồi quy có thể gồm các trường hợp sau.
- Phần cứng hiện có không khởi động được
- Trình điều khiển thiết bị không hoạt động
- Hiệu năng hoặc mức tiêu thụ điện năng suy giảm nghiêm trọng
- Giao diện mà ứng dụng sử dụng bị thay đổi
- Hành vi của tệp hoặc mạng thay đổi
- Hệ thống dừng hoặc dữ liệu bị mất
Nhân Linux xem việc không làm hỏng chương trình không gian người dùng hiện có là một nguyên tắc quan trọng. Vì vậy, ngay cả thay đổi có thiết kế sạch hơn cũng có thể bị sửa hoặc hoàn nguyên nếu gây ra vấn đề thực tế cho chương trình và môi trường vận hành hiện có.
Khi hồi quy được báo cáo, việc tìm và sửa thay đổi liên quan có thể được ưu tiên hơn chức năng mới của bản phát hành hiện tại. Nếu khó giải quyết nguyên nhân ngay lập tức, commit gây vấn đề có thể được hoàn nguyên rồi thiết kế lại trong chu kỳ phát triển sau.
Phiên bản mainline chính thức
Khi giai đoạn ứng viên phát hành kết thúc, Torvalds công bố một phiên bản mainline mới theo dạng 6.x. Phiên bản này trở thành điểm chuẩn chứa các chức năng và bản sửa của chu kỳ phát triển tương ứng.
Việc thay đổi chữ số đầu tiên của số phiên bản mainline không nhất thiết biểu thị một sự gián đoạn kỹ thuật căn bản hoặc phá vỡ khả năng tương thích. Những lần chuyển sang Linux 3.0, 4.0, 5.0 và 6.0 gần với lựa chọn quản lý nhằm tránh số phiên bản trở nên quá lớn.
Khi phiên bản mainline mới được công bố, cửa sổ hợp nhất của phiên bản tiếp theo bắt đầu ngay. Đồng thời, phiên bản vừa công bố được chuyển sang nhà bảo trì nhân ổn định và có thể nhận các bản cập nhật ổn định như 6.x.1, 6.x.2.
Nhân ổn định
Sau khi một phiên bản mainline được công bố, dòng nhân ổn định được duy trì để sửa những lỗi được phát hiện sau đó.
Nhân ổn định thường không bổ sung chức năng mới. Những bản sửa lỗi rõ ràng đã được đưa vào mainline và cũng cần thiết cho phiên bản ổn định hiện có sẽ được chuyển ngược.
Bản sửa được đưa vào nhân ổn định phải đáp ứng những điều kiện như sau.
- Sửa một vấn đề thực tế
- Phạm vi sửa nhỏ và rõ ràng
- Đã được chấp nhận trong mainline
- Sửa lỗi ảnh hưởng đến người dùng
- Không thay đổi không cần thiết chức năng và giao diện hiện có
- Vấn đề thực sự áp dụng cho phiên bản ổn định tương ứng
Bản cập nhật nhân ổn định được công bố khi cần và có thể xuất hiện khoảng một lần mỗi tuần. Khi phiên bản mainline mới được phát hành, dòng ổn định thông thường trước đó thường kết thúc bảo trì sau một vài bản sửa tiếp theo.[75]
Bản vá nhân ổn định trải qua giai đoạn xem xét công khai. Nhà bảo trì ổn định công bố tập hợp bản vá ứng viên, cho nhà phát triển và người thử nghiệm thời gian kiểm tra vấn đề rồi mới phát hành bản cập nhật chính thức.
Nguyên tắc là bản sửa của nhân ổn định phải được đưa vào mainline trước. Nếu chỉ sửa dòng ổn định mà không phản ánh vào mainline, cùng lỗi có thể xuất hiện lại ở phiên bản sau.[76]
Nhân hỗ trợ dài hạn
Một số phiên bản mainline được lựa chọn làm nhân hỗ trợ dài hạn, được duy trì lâu hơn dòng ổn định thông thường. Chúng thường được gọi là nhân LTS.
Dòng hỗ trợ dài hạn cũng không liên tục bổ sung chức năng lớn mới. Những bản sửa lỗi và bảo mật quan trọng, cùng các bản sửa phần cứng cần thiết đã được xác nhận trong mainline, được lựa chọn và chuyển ngược.
Không phải mọi phiên bản mainline đều trở thành phiên bản hỗ trợ dài hạn. Việc một bản phát hành được chọn làm dòng LTS phụ thuộc vào nhu cầu duy trì phiên bản đó và liệu nhà bảo trì có đủ thời gian cùng tài nguyên để phụ trách hay không. Không có quy tắc cố định rằng một phiên bản tương lai đã định trước chắc chắn sẽ trở thành LTS.[77]
Nhân hỗ trợ dài hạn có thể được sử dụng trong các môi trường sau.
- Bản phân phối Linux doanh nghiệp
- Android và điện thoại thông minh
- Thiết bị nhúng và công nghiệp
- Hệ thống ô tô
- Máy chủ vận hành dài hạn
- Sản phẩm cần nhiều thời gian chứng nhận và kiểm chứng
Thời gian bảo trì chính thức của nhân LTS và thời gian hỗ trợ thực tế của sản phẩm có thể khác nhau. Bản phân phối và nhà sản xuất thiết bị có thể thêm bản vá riêng dựa trên một dòng LTS và tiếp tục bảo trì sau khi hỗ trợ chính thức của nhân thượng nguồn kết thúc.
Ngược lại, tên gọi hỗ trợ dài hạn không có nghĩa mọi trình điều khiển và chức năng tự động được hỗ trợ trong suốt vòng đời sản phẩm. Mức độ bảo mật và ổn định thực tế phụ thuộc vào việc nhà bảo trì, bản phân phối và nhà sản xuất liên tục áp dụng bản sửa cần thiết rồi chuyển chúng đến sản phẩm.
Danh sách các dòng mainline, ổn định và hỗ trợ dài hạn đang hoạt động, nhà bảo trì phụ trách cùng thời điểm kết thúc hỗ trợ dự kiến được quản lý trong danh sách phát hành của kernel.org.[78]
Nhà bảo trì ổn định và hỗ trợ dài hạn
Nhân ổn định và hỗ trợ dài hạn do những nhà bảo trì riêng, khác với mainline, phụ trách. Họ xem xét các bản vá đã được sửa trong mainline và quyết định chúng có thể áp dụng cho từng dòng ổn định hay không.
Nếu cùng một lỗi tồn tại trong nhiều dòng nhân, nhà bảo trì có thể chuyển ngược bản vá phù hợp với cấu trúc mã của từng phiên bản. Nếu bản sửa áp dụng cho mainline mới không thể áp dụng nguyên trạng vào nhân cũ, cần điều chỉnh bổ sung.
Nhà bảo trì ổn định thực hiện các công việc sau.
- Lựa chọn ứng viên cho dòng ổn định từ các bản sửa mainline
- Xem xét thẻ
Cc: stablevà ứng viên được thu thập tự động - Chuyển ngược bản vá cho phù hợp với mã nhân cũ
- Xây dựng và thử nghiệm tự động
- Công bố ứng viên ổn định và yêu cầu xem xét
- Loại bỏ hoặc sửa bản vá có vấn đề
- Công bố bản cập nhật ổn định và lịch sử thay đổi
- Quyết định thời điểm kết thúc hỗ trợ
Càng duy trì một dòng cũ lâu, khác biệt mã với mainline mới càng lớn và việc chuyển ngược bản vá càng khó. Hỗ trợ dài hạn không đơn thuần là giữ nguyên số phiên bản, mà là hoạt động phát triển cần xem xét, thử nghiệm liên tục và sự hỗ trợ thực tế từ người dùng cùng doanh nghiệp.
Nhân của bản phân phối
Các bản phân phối như Debian, Fedora, Ubuntu, Red Hat Enterprise Linux và SUSE Linux Enterprise thường tạo nhân bản phân phối phù hợp với chính sách của mình thay vì cung cấp nguyên trạng nhân mainline từ kernel.org.
Dựa trên một phiên bản mainline hoặc hỗ trợ dài hạn cụ thể, bản phân phối có thể bổ sung các thay đổi sau.
- Chuyển ngược bản sửa bảo mật và lỗi
- Bổ sung hỗ trợ phần cứng
- Tích hợp chức năng bản phân phối và môi trường cài đặt
- Thiết lập tăng cường bảo mật
- Chức năng doanh nghiệp cụ thể
- Sửa đổi hiệu năng và quản lý nguồn
- Đóng gói và ký mô-đun
- Quản lý ABI nhân được bản phân phối hỗ trợ
Bản phân phối doanh nghiệp có thể cung cấp một ABI nhân ổn định trong thời gian dài nhằm duy trì khả năng tương thích với không gian người dùng và mô-đun nhân của bên thứ ba. Nhân Linux thượng nguồn không bảo đảm sự ổn định vĩnh viễn của ABI mô-đun nội bộ, vì vậy chính sách tương thích này do bản phân phối quản lý riêng.
Chỉ nhìn chuỗi phiên bản của nhân bản phân phối có thể không đủ để đánh giá chính xác chức năng và mức độ sửa bảo mật được bao gồm. Bản phân phối thường chuyển ngược các bản vá cần thiết vào phiên bản hiện có mà không nâng toàn bộ số phiên bản.
Vì vậy, để đánh giá hỗ trợ và trạng thái bảo mật của nhân trên hệ thống thực tế, cần kiểm tra không chỉ phiên bản kernel.org mà còn lịch sử thay đổi gói, khuyến cáo bảo mật và vòng đời hỗ trợ của bản phân phối.
Thử nghiệm và tự động hóa
Nhân Linux hỗ trợ rất nhiều phần cứng, kiến trúc bộ xử lý và cấu hình xây dựng, vì vậy một nhà phát triển hoặc nhà bảo trì không thể trực tiếp thử nghiệm mọi tổ hợp.
Quá trình phát triển nhân sử dụng các phương thức thử nghiệm sau.
- Xây dựng tự động cho nhiều kiến trúc và cấu hình
- Thử nghiệm khởi động trên thiết bị thực và máy ảo
- Kiểm thử nội bộ của nhân
- Bộ kiểm thử theo từng hệ thống con
- Phân tích tĩnh
- Sanitizer và kiểm tra bộ nhớ
- Fuzzing
- Kiểm thử hồi quy hiệu năng và điện năng
- Kiểm thử tích hợp linux-next
- Kiểm thử sản phẩm của bản phân phối và doanh nghiệp
Các dịch vụ kiểm thử tự động công khai và hệ thống thử nghiệm nội bộ của doanh nghiệp liên tục xây dựng, chạy các bản vá mới cùng kho của nhà bảo trì. Khi xảy ra lỗi, kết quả có thể được báo cáo đến nhà phát triển và danh sách thư liên quan.
KUnit cung cấp kiểm thử đơn vị bên trong nhân, còn kselftest kiểm thử chức năng và giao diện nhân từ không gian người dùng. syzkaller tự động tạo tổ hợp lời gọi hệ thống để tìm sự cố nhân và vấn đề bảo mật.
Việc kiểm thử tự động thành công không có nghĩa mọi phần cứng và trường hợp sử dụng đã được xác minh. Do Linux hỗ trợ số lượng thiết bị và cấu hình rất lớn, thử nghiệm và báo cáo lỗi của người dùng thực tế, bản phân phối cùng nhà sản xuất cũng đóng vai trò quan trọng đối với chất lượng phát hành.
Báo cáo lỗi và hồi quy
Khi phát hiện vấn đề nhân, người dùng và nhà phát triển có thể tìm hệ thống con cùng nhà bảo trì bị ảnh hưởng để báo cáo. Nhiều vấn đề nhân được gửi trực tiếp đến nhà bảo trì và danh sách thư công khai liên quan thay vì một trình theo dõi lỗi trung tâm duy nhất.[79]
Một báo cáo lỗi hữu ích có thể bao gồm các thông tin sau.
- Phiên bản nhân chính xác xảy ra vấn đề
- Phiên bản cuối cùng còn hoạt động bình thường
- Phần cứng và cấu hình hệ thống
- Cấu hình nhân
- Quy trình tái hiện
- Nhật ký nhân và thông báo lỗi
- Kết quả tìm commit gây hồi quy bằng bisect
- Bản vá bên ngoài và thông tin bản phân phối đã áp dụng
- Chương trình tối thiểu tái hiện vấn đề
Chức năng bisect của Git cho phép lặp lại thử nghiệm giữa phiên bản bình thường và phiên bản có vấn đề để tìm thay đổi đầu tiên làm lỗi xuất hiện. Khi xác định được commit nguyên nhân, tác giả và nhà bảo trì có thể hiểu và sửa vấn đề dễ dàng hơn.
Lỗ hổng bảo mật có thể sử dụng quy trình báo cáo riêng tư khác với lỗi thông thường. Nhà bảo trì hệ thống con bị ảnh hưởng và nhóm bảo mật nhân có thể phối hợp chuẩn bị bản sửa cùng việc phân phối trước khi công khai.
Phương thức đóng góp
Đóng góp cho nhân Linux không chỉ giới hạn ở việc viết chức năng lớn hoặc trình điều khiển mới. Nhà phát triển mới tham gia cũng có thể đóng góp bằng các cách sau.
- Báo cáo lỗi có thể tái hiện
- Tìm commit nơi hồi quy bắt đầu
- Sửa lỗi tài liệu
- Giải quyết cảnh báo trình biên dịch
- Sửa vấn đề được phát hiện bằng phân tích tĩnh và fuzzing
- Sửa lỗi nhỏ trong trình điều khiển hiện có
- Viết mã kiểm thử
- Dọn dẹp mã và chú thích cũ
- Thử nghiệm bản vá của nhà phát triển khác
- Xem xét mã
- Hỗ trợ phần cứng mới
- Cải thiện tài liệu kỹ thuật và ví dụ, không phải bản dịch
Nhà phát triển trước hết có thể xem danh sách thư và các bản vá gần đây của hệ thống con mình quan tâm, rồi kiểm tra tệp MAINTAINERS cùng hướng dẫn phát triển của lĩnh vực đó.
Trước khi tạo bản vá, cần xác nhận vấn đề vẫn tồn tại trong mainline mới nhất hoặc cây nhà bảo trì liên quan. Một vấn đề chỉ xuất hiện trong nhân bản phân phối cũ có thể đã được sửa ở thượng nguồn, và khi đó yêu cầu bản phân phối chuyển ngược bản sửa có thể phù hợp hơn.
Tài liệu phát triển nhân Linux giải thích không chỉ cách lập trình kỹ thuật mà còn cách viết bản vá, gửi email, phản hồi xem xét và phương thức làm việc của cộng đồng.[80]
Quyền sở hữu mã và giấy phép
Việc đóng góp mã vào nhân Linux không có nghĩa bản quyền được chuyển giao tập trung cho Torvalds hoặc Linux Foundation. Thông thường, từng người đóng góp hoặc chủ lao động của họ giữ bản quyền đối với mã đã viết và cho phép phân phối mã đó theo điều kiện giấy phép của nhân.
Nhân Linux chủ yếu được phân phối theo điều kiện GPL-2.0-only, còn tệp và thành phần có thể hiển thị định danh giấy phép SPDX.
Vì nhiều nhà phát triển và doanh nghiệp đóng góp mã mà mỗi bên giữ bản quyền riêng vào một dự án chung, một tổ chức cụ thể khó có thể sở hữu độc quyền toàn bộ nhân hoặc tùy ý chuyển nó sang giấy phép đóng.
Người đóng góp xác nhận rằng mình có quyền gửi mã thông qua quy trình Developer Certificate of Origin. Nhà phát triển doanh nghiệp cũng có thể phải tuân theo chính sách và quy trình phê duyệt đóng góp nguồn mở của chủ lao động.
Nền tảng phát triển và Linux Foundation
Việc phát triển kỹ thuật và chấp nhận bản vá của nhân Linux do Torvalds, các nhà bảo trì và cộng đồng phát triển phụ trách. Linux Foundation không trực tiếp chỉ đạo bản vá nhân hoặc thuê toàn bộ nhà bảo trì.
Linux Foundation hỗ trợ các nền tảng phát triển sau.
- Hỗ trợ hoạt động của Torvalds và một số nhà phát triển chủ chốt
- kernel.org và hạ tầng liên quan
- Sự kiện và cộng tác giữa nhà phát triển
- Đào tạo và chứng nhận
- Nền tảng hợp tác trung lập giữa doanh nghiệp và cộng đồng
- Hỗ trợ pháp lý và vận hành cho dự án nguồn mở
Doanh nghiệp có thể tham gia với tư cách thành viên Linux Foundation hoặc trực tiếp thuê nhà phát triển, đồng thời tài trợ thiết bị thử nghiệm, hạ tầng phát triển, sự kiện và dự án.
Ngay cả khi có tổ chức hỗ trợ tài chính và cơ sở vận hành, việc bản vá nào được đưa vào mainline vẫn thường được quyết định thông qua xem xét kỹ thuật công khai và cấu trúc nhà bảo trì.
Phát triển phân tán và tích hợp tập trung
Quá trình phát triển nhân Linux không hoàn toàn tập trung cũng không hoàn toàn phân tán.
Hoạt động phát triển và xem xét được phân tán rộng rãi trên các hệ thống con, doanh nghiệp, kho của nhà phát triển cá nhân và danh sách thư. Mỗi nhà bảo trì có quyền phán đoán đáng kể trong lĩnh vực chuyên môn của mình, còn nhiều kho đồng thời chuẩn bị cho bản phát hành tiếp theo.
Ngược lại, việc tích hợp mainline cuối cùng và công bố phiên bản chính thức tập trung quanh kho của Torvalds. Các bản phát hành ổn định và hỗ trợ dài hạn cũng được quản lý quanh những nhà bảo trì cùng kho chính thức được chỉ định.
Cấu trúc này giảm khả năng nhân Linux chính thức bị chia không giới hạn thành nhiều nhánh không tương thích, đồng thời không yêu cầu một người trực tiếp quản lý mọi chi tiết mã. Nó tận dụng chuyên môn của hệ thống con và năng lực phát triển phân tán, nhưng vẫn cung cấp điểm chuẩn chung và đường trách nhiệm cho bản phát hành cuối cùng.
Bất kỳ ai cũng có thể sao chép, sửa đổi nhân Linux và tạo phiên bản riêng. Tuy nhiên, nền tảng chung được bản phân phối, nhà sản xuất phần cứng và nhà phát triển ứng dụng sử dụng cùng nhau được hình thành chủ yếu quanh mainline cùng các dòng ổn định và hỗ trợ dài hạn.
Vì vậy, quá trình phát triển nhân Linux không chỉ được tạo thành từ mã nguồn công khai, mà còn được vận hành như một quá trình cộng tác liên tục kết hợp lòng tin giữa các nhà bảo trì, lịch sử xem xét, phát hành và ổn định định kỳ cùng quá trình thử nghiệm của vô số người dùng và doanh nghiệp.
Tiêu chuẩn và khả năng tương thích
Linux không phải là một hệ điều hành được phân nhánh trực tiếp từ mã nguồn UNIX nguyên bản. Đây là một hệ điều hành tương tự UNIX được Linus Torvalds và các nhà phát triển sau này triển khai độc lập dựa trên việc tham khảo giao diện và phương thức hoạt động của UNIX.
Việc được phân loại là tương tự UNIX không nhất thiết có nghĩa hệ thống phải chia sẻ phả hệ mã nguồn với UNIX nguyên bản hoặc đã nhận chứng nhận UNIX chính thức. Khái niệm này thể hiện mối quan hệ về cấu trúc và văn hóa, như hệ thống tệp phân cấp, mô hình đa người dùng và đa nhiệm, tiến trình cùng bộ mô tả tệp, sự kết hợp giữa shell và các công cụ dòng lệnh nhỏ, cũng như việc tuân theo lời gọi hệ thống và giao diện lập trình thuộc họ UNIX.
Khả năng tương thích của Linux không được quyết định bởi một tiêu chuẩn duy nhất. Ở cấp mã nguồn, POSIX và ISO C có ảnh hưởng; đối với dòng lệnh và cách bố trí tệp là POSIX cùng FHS; đối với khả năng tương thích tệp thực thi giữa các bản phân phối Linux là LSB; còn giữa nhân và không gian người dùng là ABI không gian người dùng riêng của Linux.
UNIX và hệ điều hành tương tự UNIX
Tên gọi UNIX đồng thời mang nhiều ý nghĩa khác nhau, gồm phả hệ hệ điều hành trong lịch sử, tiêu chuẩn kỹ thuật và nhãn hiệu.
Theo nghĩa lịch sử, UNIX chỉ hệ điều hành được phát triển tại Bell Labs từ năm 1969 cùng System V, BSD và nhiều dòng thương mại phát sinh từ nó. Linux không trực tiếp bắt nguồn từ phả hệ mã nguồn này và cũng không phải là hệ thống được tạo ra bằng cách sao chép mã nguồn UNIX.
Theo nghĩa kỹ thuật, các hệ điều hành tuân theo mô hình tiến trình và tệp, shell, lời gọi hệ thống cùng tập quán lập trình do UNIX hình thành được gọi rộng rãi là hệ điều hành tương tự UNIX. Linux được phân loại là tương tự UNIX theo nghĩa này.
Trong khi đó, UNIX viết hoa là nhãn hiệu đã đăng ký do The Open Group quản lý. Để một sản phẩm cụ thể được sử dụng nhãn hiệu UNIX, sản phẩm đó phải vượt qua quá trình kiểm tra tính phù hợp và chứng nhận đối với Single UNIX Specification của The Open Group. Chỉ triển khai phần lớn giao diện POSIX hoặc hoạt động tương tự UNIX không tự động khiến sản phẩm trở thành một hệ thống UNIX chính thức.[81]
Nhân Linux và các bản phân phối Linux thông thường không được chứng nhận UNIX dưới dạng một sản phẩm duy nhất đại diện cho toàn bộ hệ sinh thái. Vì Linux được cấu thành từ nhiều bản phân phối và tổ hợp không gian người dùng độc lập, cũng khó kiểm thử “toàn bộ Linux” như một sản phẩm cố định.
Tuy nhiên, việc sử dụng nhân Linux hoặc không gian người dùng GNU tự nó không ngăn cản khả năng nhận chứng nhận UNIX. Nếu một nhà sản xuất tạo ra sản phẩm hệ điều hành có cấu hình và phiên bản cố định, đáp ứng các yêu cầu của Single UNIX Specification rồi hoàn thành chứng nhận, sản phẩm đó có thể sử dụng nhãn hiệu UNIX. Vì vậy, câu “Linux không phải UNIX” chủ yếu có nghĩa toàn bộ Linux không thuộc phả hệ UNIX nguyên bản hoặc không phải một sản phẩm được chứng nhận chính thức duy nhất, chứ không phủ nhận khả năng một sản phẩm dựa trên Linux có thể được chứng nhận về mặt kỹ thuật.
POSIX
POSIX là tiêu chuẩn định nghĩa giao diện chuẩn giữa hệ điều hành và ứng dụng nhằm giúp chương trình dễ dàng được chuyển sang nhiều hệ thống UNIX và tương tự UNIX khác nhau.
POSIX định nghĩa các lĩnh vực sau.
- Tạo và thực thi tiến trình
- Thao tác tệp và thư mục
- Bộ mô tả tệp và nhập xuất
- Tín hiệu
- Người dùng và nhóm
- Thời gian và bộ hẹn giờ
- Luồng và đồng bộ hóa
- Socket và nhiều giao diện hệ thống
- Ngôn ngữ shell
- Các tiện ích cơ bản như
awk,sed,grepvàmake - Biến môi trường và locale
- Môi trường cơ bản cần để xây dựng và thực thi chương trình
Phiên bản chính hiện nay của POSIX là POSIX.1-2024, đồng thời được phát hành dưới tên IEEE Std 1003.1-2024 và The Open Group Base Specifications Issue 8. Tiêu chuẩn này định nghĩa một môi trường thực thi chuẩn bao gồm không chỉ API hệ điều hành mà cả shell và các tiện ích phổ biến.[82][83]
POSIX không quy định phương thức triển khai nhân cụ thể. Dù sử dụng nhân nguyên khối hay vi nhân, hệ thống tệp và bộ lập lịch khác nhau, một môi trường vẫn có thể tương thích POSIX nếu cung cấp cho ứng dụng giao diện và hành vi chuẩn.
Nhân Linux cung cấp nhiều lời gọi hệ thống và ngữ nghĩa thực thi cần cho POSIX, còn thư viện C như glibc và musl, shell cùng chương trình không gian người dùng như Coreutils hoàn thiện API và lệnh chuẩn. Vì vậy, khả năng tương thích POSIX không phải là thuộc tính của riêng nhân Linux mà là thuộc tính của toàn bộ môi trường gồm nhân, thư viện C, shell và công cụ dòng lệnh.
glibc đồng thời cung cấp giao diện ISO C, POSIX, BSD, System V và các phần mở rộng GNU. Chương trình có thể sử dụng macro kiểm tra tính năng và tùy chọn biên dịch để chỉ hiển thị chức năng được POSIX định nghĩa hoặc sử dụng phần mở rộng Linux và GNU.[84]
Khả năng tương thích POSIX và phần mở rộng Linux
Việc có thể chạy chương trình POSIX trên Linux không có nghĩa mọi chức năng của Linux đều nằm trong tiêu chuẩn POSIX. Linux cung cấp nhiều giao diện và phần mở rộng riêng không được POSIX định nghĩa.
Các chức năng đặc thù Linux tiêu biểu gồm:
- epoll
- inotify
- signalfd và eventfd
- futex
- namespace
- cgroups
- eBPF
- seccomp
- io_uring
- Netlink
- Linux capabilities
- Nhiều lời gọi hệ thống và
ioctldành riêng cho Linux
Chương trình trực tiếp sử dụng những chức năng này có thể tận dụng hiệu năng cao hoặc khả năng riêng của Linux, nhưng khi chuyển sang hệ điều hành tương tự UNIX khác cần sửa mã hoặc chuẩn bị tầng tương thích.
Chương trình coi trọng tính di động thường sử dụng giao diện POSIX cho chức năng chung và tách riêng phần triển khai hiệu năng cao theo từng hệ điều hành. Ví dụ, một tầng trừu tượng xử lý sự kiện có thể dùng epoll trên Linux và kqueue trên BSD cùng macOS.
Ngược lại, cũng không thể khẳng định Linux cung cấp hoàn hảo mọi chức năng tùy chọn và hành vi chi tiết của POSIX trong mọi cấu hình. Các chức năng chuẩn khả dụng có thể khác nhau tùy thư viện C, shell, tiện ích được cài đặt và cấu hình tính năng mà bản phân phối lựa chọn.
Single UNIX Specification
Single UNIX Specification là tiêu chuẩn hệ điều hành UNIX do The Open Group quản lý. Phần cốt lõi được phát triển chung với POSIX và định nghĩa các giao diện cùng môi trường mà sản phẩm được chứng nhận UNIX phải cung cấp.
POSIX và Single UNIX Specification chia sẻ phần lớn nội dung nhưng mục đích không hoàn toàn giống nhau. POSIX định nghĩa giao diện chuẩn nhằm hỗ trợ tính di động của ứng dụng, còn Single UNIX Specification cấu thành các yêu cầu dành cho một hệ thống UNIX có thể được chứng nhận.
The Open Group quy định chỉ những sản phẩm đáp ứng Single UNIX Specification và vượt qua quy trình chứng nhận mới được sử dụng nhãn hiệu UNIX.[85]
Đây là lý do dù Linux triển khai rộng rãi giao diện POSIX và UNIX, các bản phân phối Linux thông thường không tự động được gọi là UNIX. Nhãn hiệu UNIX không phải là tên gọi chung mô tả sự tương đồng trong triển khai mà là dấu chứng nhận được cấp cho một sản phẩm và phiên bản cụ thể.
Trong phát triển phần mềm thực tế, khả năng hỗ trợ POSIX và các giao diện UNIX phổ biến thường có ảnh hưởng trực tiếp hơn việc hệ thống có được chứng nhận UNIX hay không. Chương trình chạy trên Linux, BSD và macOS có thể được viết dựa trên API POSIX cùng công cụ xây dựng chung.
Linux Standard Base
Ngay cả khi dùng cùng nhân, các bản phân phối Linux vẫn có thể khác về thư viện C, cách bố trí tệp, định dạng gói, shell mặc định và thư viện được cung cấp. Những khác biệt này tạo ra vấn đề trong đó tệp thực thi được xây dựng trên một bản phân phối không thể chạy nguyên trạng trên bản phân phối khác.
LSB được phát triển nhằm xác định một môi trường thực thi chung cho nhiều bản phân phối Linux, qua đó nâng cao tính di động và khả năng tương thích nhị phân của ứng dụng.
LSB đề cập đến các nội dung sau.
- Thư viện và hàm hệ thống chung
- Giao diện tệp thực thi và bộ liên kết động
- ABI theo từng kiến trúc bộ xử lý
- Lệnh cơ bản và môi trường shell
- Môi trường dành cho tập lệnh cài đặt chương trình
- Cách bố trí hệ thống tệp
- Thư viện đồ họa và desktop
- Runtime ngôn ngữ cùng giao diện in ấn và xử lý hình ảnh
Nếu POSIX chủ yếu hướng đến tính di động ở cấp mã nguồn, LSB cố gắng định nghĩa cả giao diện nhị phân để ứng dụng Linux đã biên dịch cho một kiến trúc bộ xử lý cụ thể có thể chạy trên nhiều bản phân phối tương thích.
LSB không phải là tiêu chuẩn nhằm hợp nhất mọi bản phân phối Linux thành một hệ thống duy nhất. Mục tiêu là cung cấp một nền tảng chung mà ứng dụng thương mại có thể phụ thuộc vào, trong khi mỗi bản phân phối vẫn giữ trình quản lý gói, chính sách quản trị và chức năng bổ sung riêng.
LSB 5.0 được công bố năm 2015 và được cung cấp trong kho lưu trữ đặc tả của Linux Foundation. LSB 5.0 phát triển từ LSB 3.1, vốn tương ứng với ISO/IEC 23360 trước đó, nhưng tài liệu LSB 5.0 do Linux Foundation phát hành nêu rõ rằng bản thân nó không được xem là phiên bản tiêu chuẩn ISO.[86]
ISO/IEC 23360
LSB cũng được thông qua thành tiêu chuẩn quốc tế. Họ tiêu chuẩn ISO/IEC 23360 dựa trên Linux Standard Base và quy định giao diện ứng dụng cùng môi trường thực thi chung của hệ thống Linux.
ISO/IEC 23360 tách đặc tả chung khỏi đặc tả theo từng kiến trúc bộ xử lý. Phần chung định nghĩa các giao diện cần được cung cấp giống nhau trên nhiều triển khai Linux, còn phần theo kiến trúc định nghĩa giao diện nhị phân thay đổi theo bộ xử lý, như quy ước gọi, định dạng dữ liệu và cấu trúc tệp thực thi.
Họ ISO/IEC 23360 được phát hành năm 2006 tương ứng với LSB 3.1. Phiên bản này sau đó được rút lại và các tài liệu ISO/IEC 23360 phiên bản 2021 được phát hành với cấu trúc mới nhằm phản ánh dòng LSB 5.[87]
Phiên bản 2021 được chia thành nhiều phần như sau.
- ISO/IEC 23360-1-1 — định nghĩa chung
- ISO/IEC 23360-1-2 — đặc tả Core chung
- ISO/IEC 23360-1-3 — đặc tả Desktop chung
- ISO/IEC 23360-1-4 — đặc tả ngôn ngữ
- ISO/IEC 23360-1-5 — đặc tả hình ảnh
- ISO/IEC TS 23360-1-6 — đặc tả đồ họa và GTK 3
- ISO/IEC 23360-2-2 và các phần khác — đặc tả Core cho từng kiến trúc bộ xử lý
Ví dụ, ISO/IEC 23360-2-2:2021 định nghĩa giao diện Core cho kiến trúc x86-32, còn ISO/IEC 23360-8-2:2021 cung cấp đặc tả Core cho kiến trúc S390X.[88][89]
ISO/IEC 23360 không quy định thiết kế nội bộ của nhân Linux hoặc cách quản trị của mọi bản phân phối. Đây là tiêu chuẩn định nghĩa môi trường hệ thống chung mà ứng dụng đã biên dịch và tập lệnh cài đặt có thể phụ thuộc vào.
ISO cũng phát hành ISO/IEC TR 24715:2006 nhằm phân tích những lĩnh vực xung đột hoặc được quy định khác nhau giữa POSIX và LSB. Báo cáo kỹ thuật này tổng hợp sự khác biệt giữa đặc tả POSIX trong ISO/IEC 9945 và đặc tả LSB trong ISO/IEC 23360.[90]
Điều này cho thấy Linux không phải là môi trường sao chép nguyên trạng POSIX mà là một nền tảng có ABI, thư viện và giao diện riêng của Linux được xây dựng bên trên nền tảng POSIX.
Ảnh hưởng và giới hạn của LSB
LSB đóng vai trò quan trọng trong giai đoạn Linux bắt đầu cạnh tranh với UNIX thương mại và trên thị trường máy chủ. Nhà cung cấp phần mềm độc lập có thể giảm chi phí tạo và kiểm thử tệp thực thi riêng cho từng bản phân phối, còn các bản phân phối có thể tham khảo thư viện chung và cách bố trí tệp.
LSB để lại những ảnh hưởng sau.
- Xác lập nhu cầu về ABI chung giữa các bản phân phối Linux
- Xác định đối tượng chứng nhận cho ứng dụng thương mại
- Lập tài liệu ELF và quy ước gọi theo từng kiến trúc
- Làm rõ quan hệ giữa POSIX và giao diện riêng của Linux
- Thống nhất cách bố trí hệ thống tệp khi kết hợp với FHS
- Cung cấp hệ thống kiểm thử giữa bản phân phối và nhà cung cấp ứng dụng
- Tiêu chuẩn hóa quốc tế các giao diện Linux qua ISO
Tuy nhiên, khi hệ sinh thái Linux phát triển, việc áp dụng LSB trong thực tế cũng bộc lộ giới hạn. Thư viện desktop và đồ họa thay đổi nhanh, còn không phải bản phân phối nào cũng có thể cung cấp cùng phiên bản thư viện và gói trong thời gian dài. Các bản phân phối tiếp nhận công nghệ mới không được LSB quy định, còn một số giao diện LSB không theo kịp đầy đủ thay đổi của môi trường phát triển thực tế.
Trong phân phối ứng dụng Linux hiện đại, ngoài việc dựa vào LSB còn sử dụng các phương thức sau.
- Cung cấp gói gốc riêng cho từng bản phân phối
- Xây dựng trong môi trường glibc cũ để mở rộng phạm vi tương thích
- Phân phối các thư viện cần thiết cùng chương trình
- Sử dụng runtime chung như Flatpak và Snap
- Cung cấp tập hợp tệp dưới dạng AppImage
- Cố định toàn bộ không gian người dùng trong ảnh container
- Cung cấp mã nguồn và quy trình xây dựng tự động
Vì vậy, LSB và ISO/IEC 23360 vẫn quan trọng như những tiêu chuẩn lịch sử và kỹ thuật về khả năng tương thích Linux, nhưng không phải là các đặc tả thống nhất hoàn toàn mọi bản phân phối và phương thức phân phối ứng dụng hiện nay.
Filesystem Hierarchy Standard
FHS cung cấp tiêu chuẩn chung về cách bố trí tệp và thư mục trong hệ điều hành tương tự UNIX.
FHS định nghĩa mục đích của các thư mục sau.
/bin/boot/dev/etc/home/lib/media/mnt/opt/run/sbin/srv/tmp/usr/var
Mục tiêu của FHS là cho phép bản phân phối, ứng dụng, công cụ quản trị hệ thống và tài liệu cùng đưa ra những giả định chung về vị trí tệp. FHS 3.0 được công bố năm 2015 và cung cấp quy tắc bố trí tệp hỗ trợ khả năng tương tác giữa ứng dụng, công cụ quản trị, công cụ phát triển và tập lệnh trong hệ thống tương tự UNIX.[91]
FHS không bắt đầu với tên gọi và phạm vi áp dụng cho mọi hệ điều hành tương tự UNIX. Nó bắt nguồn từ công việc FSSTND năm 1993 nhằm sắp xếp cấu trúc thư mục Linux, sau đó đổi tên thành FHS khi phạm vi được mở rộng sang các hệ thống tương tự UNIX khác.[92]
Các bản phân phối Linux thực tế có thể không tuân theo FHS hoàn toàn giống nhau. usr merge, hợp nhất /bin, /sbin và /lib vào bên dưới /usr, cùng các phương thức phân phối mới như ảnh hệ thống chỉ đọc và cập nhật nguyên tử đang thay đổi cấu trúc thư mục truyền thống.
Ảnh hưởng của FHS không nằm ở việc một đường dẫn cụ thể tuyệt đối không bao giờ thay đổi. Giá trị của nó nằm ở việc tạo ra một tiêu chuẩn chung để các bản phân phối và phần mềm khác nhau có thể thảo luận về vị trí tệp.
C và các tiêu chuẩn ngôn ngữ
Nhiều chương trình trong không gian người dùng Linux được viết bằng C và sử dụng đồng thời tiêu chuẩn ISO C cùng API POSIX.
ISO C định nghĩa cú pháp ngôn ngữ và thư viện chuẩn, nhưng phần lớn không định nghĩa các chức năng hệ điều hành như tạo tiến trình, duyệt thư mục, socket và tài khoản người dùng. POSIX mở rộng các giao diện hệ điều hành này xoay quanh ngôn ngữ C.
Quan hệ tiêu chuẩn thông thường của chương trình Linux có thể được phân loại như sau.
- ISO C — ngôn ngữ và thư viện C cơ bản
- POSIX — tiến trình, tệp, luồng, shell và API hệ điều hành kiểu UNIX
- Linux UAPI — lời gọi hệ thống và chức năng chỉ tồn tại trên Linux
- LSB·ISO/IEC 23360 — môi trường thực thi nhị phân chung của bản phân phối Linux
- ABI bộ xử lý — quy ước gọi, cách bố trí dữ liệu và định dạng tệp thực thi
Các ngôn ngữ như C++, Rust, Go và Java cũng được sử dụng trên Linux, nhưng cuối cùng runtime và thư viện chuẩn của ngôn ngữ sẽ gọi giao diện không gian người dùng POSIX hoặc Linux.
ABI không gian người dùng Linux
Một tiêu chuẩn quan trọng trong khả năng tương thích thực tế giữa nhân Linux và ứng dụng là ABI không gian người dùng. Nó bao gồm số và đối số lời gọi hệ thống, ioctl, thông điệp Netlink, giao diện /proc và /sys, cùng API không gian người dùng dành riêng cho thiết bị.
Nhân Linux xem việc không làm hỏng không gian người dùng hiện có là một nguyên tắc rất quan trọng. Tài liệu nhân giải thích rằng khả năng tương thích được duy trì đối với các giao diện không gian người dùng ổn định, và phần lớn giao diện như lời gọi hệ thống được kỳ vọng sẽ không biến mất mà tiếp tục được cung cấp.[93]
Nhờ nguyên tắc này, tệp thực thi Linux cũ thường có thể tiếp tục chạy trên nhân mới. Nhân mới duy trì lời gọi hệ thống và hành vi hiện có trong khi bổ sung chức năng mới.
Header của nhân cũng thường được thiết kế có xét đến khả năng tương thích ngược. Chương trình được xây dựng cho thư viện C sử dụng header nhân cũ có thể chạy trên nhân mới, nhưng chương trình yêu cầu header và chức năng mới có thể không chạy trên nhân cũ.[94]
Tuy nhiên, không phải mọi giao diện /proc, /sys, giao diện gỡ lỗi và API thử nghiệm đều có cùng mức độ ổn định. Tài liệu nhân phân loại ABI không gian người dùng thành ổn định, thử nghiệm, dự kiến loại bỏ, đã loại bỏ và các nhóm khác.
ABI nội bộ của nhân
Khác với khả năng tương thích mạnh của ABI không gian người dùng, API nội bộ và ABI mô-đun nhân Linux nói chung không được cố định ổn định trên toàn bộ mainline.
Các hàm và cấu trúc dữ liệu nội bộ mà trình điều khiển thiết bị và hệ thống tệp sử dụng có thể thay đổi trong quá trình phát triển nhân. Nếu phải duy trì vĩnh viễn giao diện nội bộ cũ, việc loại bỏ thiết kế sai và mã trùng lặp sẽ trở nên khó khăn, đồng thời có thể cản trở cải tiến toàn bộ nhân.
Trình điều khiển nằm trong cây nhân chính thức được sửa cùng trong một thay đổi khi API nội bộ thay đổi. Ngược lại, mô-đun nhân được phân phối riêng bên ngoài có thể phải sửa mã nguồn hoặc xây dựng lại cho từng phiên bản nhân mới.
Một số bản phân phối doanh nghiệp ổn định riêng một ABI nhân giới hạn nhằm hỗ trợ mô-đun của bên thứ ba trong suốt vòng đời sản phẩm. Đây không phải tiêu chuẩn được toàn bộ Linux mainline bảo đảm mà là chính sách tương thích sản phẩm do bản phân phối tương ứng cung cấp.
Tài liệu nhân Linux giải thích rằng ABI lời gọi hệ thống của không gian người dùng được duy trì ổn định lâu dài, nhưng việc cố định giao diện trình điều khiển nội bộ của nhân sẽ cản trở tốc độ phát triển và chất lượng mã.[95]
Kiến trúc bộ xử lý và khả năng tương thích nhị phân
Khả năng tương thích của tệp thực thi Linux chịu ảnh hưởng không chỉ từ giao diện hệ điều hành mà còn từ kiến trúc bộ xử lý và ABI.
ABI bộ xử lý định nghĩa các yếu tố sau.
- Kích thước số nguyên và con trỏ
- Căn chỉnh kiểu dữ liệu trong bộ nhớ
- Phương thức truyền đối số hàm và giá trị trả về
- Các thanh ghi phải sử dụng
- Cách bố trí ngăn xếp
- Quy ước lời gọi hệ thống
- Định dạng đối tượng và tệp thực thi
- Quy tắc bộ liên kết động và thư viện dùng chung
Tệp thực thi dành cho x86-64 không thể trực tiếp chạy trên Linux ARM64. Dù hai hệ thống cùng cung cấp họ nhân Linux và API POSIX, tập lệnh CPU cùng quy ước chi tiết của định dạng nhị phân vẫn khác nhau.
Linux chủ yếu sử dụng ELF làm định dạng tệp thực thi và thư viện dùng chung. Chỉ riêng ELF không bảo đảm toàn bộ khả năng tương thích; ABI kiến trúc, thư viện C, bộ liên kết động và phiên bản thư viện cần thiết cũng phải phù hợp.
Đây cũng là lý do LSB và ISO/IEC 23360 tách phần chung khỏi phần theo từng kiến trúc.
Khả năng tương thích thư viện và bản phân phối
Ngay cả khi dùng cùng kiến trúc CPU và nhân Linux, tệp thực thi không phải lúc nào cũng chạy trên mọi bản phân phối.
Chương trình có thể phụ thuộc vào các yếu tố sau.
- Thư viện C như glibc hoặc musl
- Thư viện chuẩn C++ và phiên bản symbol
- Đường dẫn của bộ liên kết động
- Tên và phiên bản thư viện dùng chung
- Vị trí của tệp và cấu hình
- Thư viện đồ họa và desktop
- Bản vá do bản phân phối áp dụng
- Phiên bản và chức năng nhân tối thiểu
- Mức tập lệnh CPU
Chương trình được xây dựng bằng glibc có thể không chạy nguyên trạng trên bản phân phối dựa trên musl. Tệp thực thi yêu cầu symbol mới của glibc hiện đại có thể thất bại trên bản phân phối cũ, trong khi chương trình được xây dựng nhắm đến glibc cũ có khả năng tương đối cao sẽ chạy trên bản phân phối mới.
Gói của bản phân phối được xây dựng lại trên chính bản phân phối đó và cung cấp kèm thông tin phụ thuộc nhằm xử lý những khác biệt này. Nếu nhà cung cấp phần mềm muốn phát hành một tệp thực thi đa dụng duy nhất, họ phải xác định phiên bản thư viện và nhân tối thiểu được hỗ trợ rồi xây dựng, thử nghiệm trong môi trường tương thích.
Khả năng tương thích dòng lệnh
Môi trường shell Linux tương tự các lệnh UNIX và POSIX, nhưng triển khai lệnh thực tế có thể cung cấp các phần mở rộng khác nhau.
GNU Coreutils, GNU sed và GNU grep cung cấp tùy chọn dài, định dạng đầu ra bổ sung, biểu thức chính quy mở rộng và chức năng phù hợp với môi trường Linux bên cạnh các chức năng POSIX. Công cụ họ BSD và triển khai BusyBox có thể sử dụng cùng tên lệnh nhưng khác về tùy chọn và hành vi chi tiết.
Tập lệnh shell POSIX dễ được chuyển sang nhiều môi trường tương tự UNIX nếu chỉ sử dụng /bin/sh và tiện ích chuẩn. Ngược lại, việc dùng mảng Bash, process substitution và tùy chọn lệnh riêng của GNU sẽ giới hạn môi trường có thể thực thi.
Ngay cả trong Linux, /bin/sh có thể trỏ đến Bash, Dash, BusyBox ash hoặc shell khác. Vì vậy, tập lệnh yêu cầu chức năng của một shell cụ thể phải chỉ rõ trình thông dịch phù hợp.
Khả năng tương thích mã nguồn và nhị phân
Khi nói về khả năng tương thích, cần phân biệt giai đoạn tương thích được đề cập.
Khả năng tương thích mã nguồn là khả năng biên dịch lại cùng mã nguồn trên hệ thống khác rồi thực thi. POSIX và ISO C chủ yếu hỗ trợ loại tính di động này.
Khả năng tương thích nhị phân là khả năng chạy tệp thực thi đã biên dịch trên hệ thống khác mà không cần xây dựng lại. ABI bộ xử lý, thư viện C, bộ liên kết động và các tiêu chuẩn như LSB có ảnh hưởng.
Khả năng tương thích hành vi không chỉ có nghĩa chương trình chạy được mà còn là quyền tệp, tín hiệu, luồng, mạng và công cụ dòng lệnh hoạt động theo đúng ý nghĩa mà chương trình mong đợi.
Khả năng tương thích quản trị là mức độ giống nhau trong cách cài gói, quản lý dịch vụ, thiết lập mạng và cấu hình hệ thống. Lĩnh vực này chịu ảnh hưởng mạnh từ chính sách bản phân phối hơn là POSIX hoặc ABI nhân.
Hai bản phân phối Linux có thể cung cấp khả năng tương thích mã nguồn POSIX nhưng sử dụng trình quản lý gói và cấu hình dịch vụ hoàn toàn khác nhau. Ngược lại, container có thể phân phối toàn bộ không gian người dùng cùng nhau để phần nào vượt qua khác biệt nhị phân và quản trị giữa các bản phân phối.
Tiêu chuẩn trên thực tế
Trong hệ sinh thái Linux, ngoài các tiêu chuẩn quốc tế chính thức còn có những giao diện được tiếp nhận rộng rãi và đóng vai trò tiêu chuẩn trên thực tế.
Ví dụ gồm:
- Định dạng tệp thực thi ELF
- Phần mở rộng GNU và Linux của glibc
- Đơn vị dịch vụ và giao diện liên quan của systemd
- Các đặc tả desktop của freedesktop.org
- XDG Base Directory Specification
- D-Bus
- Giao thức Wayland
- Đặc tả ảnh và runtime OCI
- Devicetree binding
- Virtio
- Hỗ trợ UEFI và ACPI của Linux
- Siêu dữ liệu gói theo từng bản phân phối
Trong số này, một số được Linux Foundation, freedesktop.org, OASIS hoặc tổ chức tiêu chuẩn hóa khác quản lý, còn một số trở thành chuẩn trên thực tế khi các triển khai lớn được sử dụng rộng rãi.
Linux cung cấp một môi trường trong đó giao diện mới có thể nhanh chóng được áp dụng và kiểm chứng trên hệ thống thực tế thông qua triển khai công khai. Trong các lĩnh vực container và đám mây, khởi tạo phần cứng, đồ họa và quản lý thiết bị, những giao diện được sử dụng rộng rãi trên Linux cũng ảnh hưởng đến các hệ thống khác và tiêu chuẩn công nghiệp.
Ảnh hưởng của Linux đối với tiêu chuẩn
Linux bắt đầu như một hệ điều hành triển khai các tiêu chuẩn UNIX và POSIX hiện có, nhưng sau khi phổ biến, nó cũng ảnh hưởng đến sự hình thành của giao diện hệ thống và tiêu chuẩn công nghiệp mới.
Ảnh hưởng của Linux xuất hiện dưới các hình thức sau.
- Cung cấp nền tảng hệ điều hành chung trên nhiều kiến trúc bộ xử lý
- Hình thành tiêu chuẩn quốc tế dành riêng cho Linux thông qua LSB
- Thiết lập tiêu chuẩn chung về bố trí thư mục thông qua FHS
- Việc sử dụng rộng rãi ELF và System V ABI trong thực tế
- Phổ biến mô hình container sử dụng cgroups và namespace
- Phổ biến giao diện thiết bị ảo thông qua Virtio
- Mở rộng phương thức mô tả phần cứng nhúng bằng Devicetree
- Xuất hiện các tầng tương thích nhắm đến lời gọi hệ thống và ABI Linux
- Phát triển đặc tả OCI và cloud-native lấy Linux làm trung tâm
- Kiểm chứng tiêu chuẩn trong thực tế thông qua triển khai tham chiếu nguồn mở
Các hệ điều hành và tầng tương thích khác nhằm triển khai ABI Linux để chạy ứng dụng Linux hiện có cũng đang được phát triển. Điều này cho thấy chỉ khả năng tương thích POSIX không thể thay thế hoàn toàn hệ sinh thái ứng dụng dành cho Linux, và lời gọi hệ thống cùng hành vi riêng của Linux đã trở thành một tiêu chuẩn nền tảng quan trọng.
Giới hạn của tiêu chuẩn hóa
Tiêu chuẩn hóa Linux không khiến mọi bản phân phối và phần mềm trở nên hoàn toàn giống nhau.
POSIX định nghĩa chức năng chung nhưng không bao gồm toàn bộ chức năng mới nhất của Linux. LSB hướng đến khả năng tương thích nhị phân nhưng khó theo kịp toàn bộ hệ sinh thái desktop và thư viện thay đổi nhanh. FHS cung cấp tiêu chuẩn chung về thư mục, nhưng các hệ thống dựa trên ảnh mới và việc hợp nhất /usr đang làm thay đổi cách bố trí truyền thống.
Nhân Linux duy trì ABI không gian người dùng ổn định, nhưng các yếu tố sau có thể khác giữa các bản phân phối.
- Định dạng gói và kho phần mềm
- Thư viện C
- Hệ thống init
- Shell mặc định và triển khai lệnh
- Cách bố trí hệ thống tệp
- Chính sách bảo mật
- Môi trường đồ họa
- Cấu hình nhân được hỗ trợ
- Chính sách cập nhật và hỗ trợ dài hạn
Các tiêu chuẩn không loại bỏ những khác biệt này mà cung cấp một nền tảng chung tối thiểu để chương trình và hệ thống có thể phụ thuộc vào.
Khả năng tương thích của Linux được duy trì đồng thời bởi tiêu chuẩn quốc tế, ABI không gian người dùng công khai, chính sách của bản phân phối và tập quán triển khai thực tế. Linux được phân loại là tương tự UNIX không phải vì một chứng nhận hoặc phả hệ mã duy nhất, mà vì nó tuân theo giao diện và mô hình lập trình phát triển từ UNIX, đồng thời mở rộng chúng một cách độc lập để phát triển thành một tiêu chuẩn nền tảng mới trên thực tế.
Các lĩnh vực ứng dụng chính
Linux được sử dụng trong nhiều môi trường điện toán khác nhau, từ máy chủ đa dụng và điện toán đám mây đến điện thoại thông minh, siêu máy tính, thiết bị mạng, ô tô và thiết bị nhúng nhỏ. Vì không phải là một sản phẩm cố định duy nhất mà cho phép lựa chọn nhân, không gian người dùng và cấu hình bản phân phối theo mục đích, Linux có thể được áp dụng cho các hệ thống có quy mô và hình thức khác nhau.
Các lĩnh vực sử dụng Linux rộng rãi không dùng cùng một cấu hình. Trong trung tâm dữ liệu, bản phân phối đa dụng và chức năng ảo hóa đóng vai trò trung tâm; trên điện thoại thông minh, không gian người dùng Android được kết hợp; còn trong thiết bị nhúng, ảnh hệ thống nhỏ chỉ giữ lại những chức năng cần thiết được sử dụng.
Máy chủ và dịch vụ Internet
Linux được sử dụng làm nền tảng cho máy chủ web, cơ sở dữ liệu, máy chủ tệp, thư điện tử, DNS và nhiều dịch vụ mạng khác. Nguyên nhân là hệ thống dễ quản trị từ xa và tự động hóa, có thể chạy nhiều phần mềm máy chủ thương mại và nguồn mở, đồng thời vẫn vận hành được với cấu hình tối thiểu không có môi trường đồ họa.
Trong môi trường máy chủ, Linux được sử dụng cho những mục đích sau.
- Máy chủ web và ứng dụng
- Cơ sở dữ liệu
- Dịch vụ tệp và thiết bị lưu trữ
- Thư điện tử và DNS
- Dịch vụ xác thực và thư mục
- Máy chủ trò chơi
- Xử lý và phát trực tuyến nội dung đa phương tiện
- Hệ thống nghiệp vụ nội bộ
- Tìm kiếm và xử lý dữ liệu quy mô lớn
Doanh nghiệp có thể trực tiếp vận hành Linux trong trung tâm dữ liệu riêng hoặc sử dụng bản phân phối có hỗ trợ thương mại. Ngay cả khi cùng dựa trên Linux, bản phân phối doanh nghiệp coi trọng tính ổn định và hỗ trợ dài hạn, bản phân phối ưu tiên nhanh chóng tiếp nhận chức năng mới và bản phân phối nhỏ dành cho container có thể đảm nhiệm những vai trò khác nhau.
Điện toán đám mây
Linux là môi trường thực thi chính cho máy ảo, container và hệ thống quản lý đám mây. Ảo hóa bằng KVM, container bằng namespace và cgroups, mạng ảo cùng các công cụ tự động hóa đã phát triển chủ yếu xoay quanh Linux.
Trong đám mây, Linux có thể được sử dụng ở các tầng sau.
- Hệ điều hành máy chủ của máy vật lý
- Máy ảo cung cấp cho khách hàng
- Máy chủ container
- Nút Kubernetes
- Thiết bị lưu trữ và mạng
- Dịch vụ điều khiển đám mây
- Nền tảng của môi trường thực thi serverless
Linux chạy không chỉ trên máy chủ x86-64 thông thường mà còn trên ARM64 và nhiều kiến trúc bộ xử lý khác, vì vậy phù hợp để nhà cung cấp đám mây cung cấp nhiều loại phần cứng theo mục đích và chi phí. Nhân Linux hiện hỗ trợ nhiều kiến trúc bộ xử lý 32 bit và 64 bit.[96]
Siêu máy tính và điện toán hiệu năng cao
Linux được sử dụng trong các siêu máy tính thực hiện tính toán khoa học, dự báo thời tiết, mô phỏng vật lý, huấn luyện trí tuệ nhân tạo và tính toán kỹ thuật quy mô lớn.
Hệ thống điện toán hiệu năng cao kết hợp hàng nghìn nút tính toán trở lên với bộ tăng tốc, mạng tốc độ cao và thiết bị lưu trữ song song. Linux phù hợp với môi trường này vì có thể sửa mã nguồn và điều chỉnh bộ xử lý, mạng, bộ lập lịch cùng hệ thống tệp cho phù hợp với cấu trúc hệ thống.
Linux dành cho siêu máy tính có thể không được sử dụng dưới dạng giống một bản phân phối desktop thông thường. Nhà sản xuất và viện nghiên cứu tích hợp các thành phần sau trên nền Linux.
- Bộ lập lịch tác vụ song song quy mô lớn
- MPI và môi trường truyền thông song song
- GPU và bộ tăng tốc tính toán
- Kết nối liên nút tốc độ cao
- Hệ thống tệp song song
- Cài đặt và quản lý nút tự động
- Giám sát sự cố và quản lý điện năng
TOP500 cung cấp thống kê về họ hệ điều hành của các siêu máy tính lớn trên thế giới, trong đó họ Linux đã trở thành nền tảng chiếm ưu thế trong điện toán hiệu năng cao hiện đại.[97]
Điện thoại thông minh và thiết bị di động
Android được xây dựng trên nhân Linux. Android sử dụng thư viện C Bionic, Android Runtime và framework ứng dụng khác với bản phân phối GNU/Linux truyền thống, nhưng nhân Linux vẫn nằm ở phần cốt lõi quản lý tiến trình, bộ nhớ, thiết bị và mạng.
Nhân Android dựa trên nhân hỗ trợ dài hạn Linux thượng nguồn và tích hợp các thay đổi cùng hỗ trợ thiết bị cần cho Android.[98]
Trên điện thoại thông minh, Linux phụ trách các chức năng sau.
- Quản lý tiến trình ứng dụng
- Quản lý bộ nhớ và nguồn điện
- Màn hình và thiết bị nhập liệu
- Camera và âm thanh
- Mạng di động và mạng không dây
- Thiết bị lưu trữ và hệ thống tệp
- Bảo mật và cách ly ứng dụng
- Trình điều khiển phần cứng riêng của nhà sản xuất
Nhờ sự phổ biến của Android, nhân Linux trở thành phần mềm nền tảng được sử dụng trong số lượng lớn thiết bị tiêu dùng, ngay cả khi người dùng thông thường không trực tiếp cài đặt một bản phân phối Linux.
Hệ thống nhúng và thiết bị gia dụng
Linux được sử dụng trong bộ định tuyến, TV, hộp giải mã, thiết bị lưu trữ, camera, bộ điều khiển công nghiệp và nhiều thiết bị thông minh khác.
Trong hệ thống nhúng, có thể lựa chọn chỉ những chức năng cần cho sản phẩm để tạo cấu hình nhân và không gian người dùng nhỏ. Nhà sản xuất tận dụng trình điều khiển thiết bị và chức năng mạng của Linux, đồng thời bổ sung ứng dụng và giao diện người dùng riêng.
Các đối tượng sử dụng tiêu biểu gồm:
- Bộ định tuyến và điểm truy cập không dây
- TV thông minh và thiết bị đa phương tiện
- NAS và thiết bị lưu trữ
- Camera an ninh
- Robot và máy bay không người lái
- Thiết bị tự động hóa nhà máy
- Thiết bị y tế và đo lường
- Biển báo kỹ thuật số
- Máy tính bo mạch đơn
- Cổng IoT
Các công cụ như Buildroot và Yocto Project được dùng để kết hợp bộ nạp khởi động, nhân Linux, thư viện và ứng dụng thành ảnh hệ thống dành riêng cho sản phẩm.
Linux không hoàn toàn có cùng đặc tính với một hệ điều hành thời gian thực chuyên dụng, nhưng những cấu hình giảm độ trễ bằng PREEMPT_RT và lập lịch ưu tiên cũng được sử dụng trong môi trường công nghiệp, âm thanh và điều khiển. Những phần yêu cầu thời gian thực cực kỳ nghiêm ngặt và mức sử dụng tài nguyên rất nhỏ có thể sử dụng thêm một hệ điều hành thời gian thực riêng.
Thiết bị mạng và viễn thông
Linux được sử dụng trong bộ định tuyến, tường lửa, thiết bị cân bằng tải, cổng VPN và thiết bị hạ tầng viễn thông. Nguyên nhân là nhân cung cấp nhiều giao thức mạng, xử lý gói tin, định tuyến, bridge và chức năng mạng ảo.
Trong lĩnh vực mạng, Linux được sử dụng cho các mục đích sau.
- Bộ định tuyến và cổng Internet
- Tường lửa và thiết bị ngăn chặn xâm nhập
- Máy chủ VPN
- Thiết bị mạng không dây
- Hạ tầng nhà mạng
- Mạng được định nghĩa bằng phần mềm
- Ảo hóa chức năng mạng
- Switch ảo và mạng container
- Phân tích và giám sát lưu lượng
Nhà sản xuất thiết bị mạng có thể xây dựng hệ thống chuyên dụng bằng cách kết hợp giao diện quản trị, trình điều khiển và chức năng xử lý gói tin cần cho sản phẩm thay vì sử dụng nguyên trạng một bản phân phối Linux thông thường.
eBPF và XDP được dùng để quan sát hoặc xử lý nhanh gói mạng bên trong nhân Linux. Các công nghệ này cũng được sử dụng trong mạng đám mây, bảo mật, cân bằng tải và công cụ quan sát.
Ô tô và hệ thống vận tải
Linux được sử dụng trong hệ thống thông tin giải trí trên xe, bảng đồng hồ, telematics, dịch vụ kết nối phương tiện và nền tảng ô tô được định nghĩa bằng phần mềm.
Automotive Grade Linux là dự án trong đó nhà sản xuất ô tô cùng các doanh nghiệp linh kiện và công nghệ cộng tác phát triển nền tảng phần mềm nguồn mở cho phương tiện. Dự án cung cấp nền tảng chung cho giao diện người dùng trên xe, chức năng kết nối, ảo hóa và liên kết với đám mây.[99]
Trên phương tiện, các chức năng có mức độ quan trọng về an toàn khác nhau phải được tách biệt, vì vậy Linux không đơn độc phụ trách mọi chức năng điều khiển. Linux có thể được sử dụng cho hệ thống thông tin giải trí và dịch vụ kết nối, còn những lĩnh vực như phanh và lái yêu cầu thời gian thực nghiêm ngặt cùng an toàn chức năng có thể sử dụng thêm hệ điều hành thời gian thực hoặc nền tảng an toàn riêng.
Các cấu trúc sử dụng công nghệ ảo hóa để chạy tách biệt Linux và hệ điều hành thời gian thực trên cùng một máy tính trong xe cũng đang được phát triển.
Công nghiệp và điện toán biên
Linux được sử dụng làm nền tảng cho thiết bị biên triển khai tại nơi dữ liệu được tạo ra, như nhà máy, cơ sở phát điện, trạm viễn thông, cửa hàng và hệ thống logistics.
Hệ thống biên có thể thực hiện các công việc sau tại hiện trường thay vì gửi toàn bộ dữ liệu lên đám mây trung tâm.
- Thu thập dữ liệu cảm biến
- Phân tích hình ảnh và âm thanh
- Điều khiển và giám sát trạng thái thiết bị
- Lọc và chuyển đổi dữ liệu
- Suy luận trí tuệ nhân tạo
- Đồng bộ hóa với đám mây
- Hoạt động độc lập khi mạng gặp sự cố
Linux có ưu điểm là có thể sử dụng cùng một họ công cụ phát triển và quản trị từ thiết bị ARM nhỏ đến máy chủ công nghiệp có GPU. Container cũng cho phép triển khai lên thiết bị hiện trường các dịch vụ được phát triển trên đám mây.
Máy tính để bàn và máy tính cá nhân
Linux cũng được sử dụng làm hệ điều hành desktop cho máy tính cá nhân và máy trạm. Người dùng có thể lựa chọn KDE Plasma, GNOME, Xfce cùng nhiều môi trường desktop khác và chạy trình duyệt web, phần mềm soạn thảo tài liệu, đồ họa, đa phương tiện và công cụ phát triển.
Linux desktop chủ yếu được lựa chọn bởi những nhóm người dùng sau.
- Nhà phát triển phần mềm
- Quản trị viên hệ thống và mạng
- Người dùng phần mềm tự do
- Người muốn tự cấu hình hệ điều hành
- Người dùng máy trạm khoa học và kỹ thuật
- Người cần hệ thống nhẹ cho máy tính cũ
- Người coi trọng bảo mật và quyền riêng tư
Trên thị trường desktop dành cho người tiêu dùng phổ thông, tỷ lệ sử dụng Linux nhỏ hơn Windows và macOS, đồng thời có thể thiếu một số ứng dụng thương mại, trò chơi và hỗ trợ chính thức từ nhà sản xuất cho phần cứng cụ thể. Ngược lại, Linux có thế mạnh về công cụ phát triển, môi trường máy chủ, quản lý gói và khả năng tùy biến.
Trong lĩnh vực trò chơi, số lượng trò chơi có thể chạy trên Linux đã tăng nhờ sự phát triển của Steam, Proton, Vulkan và trình điều khiển đồ họa. Các thiết bị chơi game cầm tay và hệ thống chơi game chuyên dụng dựa trên Linux cũng đã xuất hiện.
Phát triển phần mềm
Linux được sử dụng làm môi trường làm việc để phát triển máy chủ, hệ thống nhúng, hệ điều hành và phần mềm nguồn mở. Trình biên dịch, công cụ xây dựng, trình gỡ lỗi, công cụ phân tích hiệu năng, container và máy ảo có thể được sử dụng trên cùng một hệ thống.
Linux đặc biệt liên quan mật thiết đến việc phát triển trong những lĩnh vực sau.
- Dịch vụ web và đám mây
- Phần mềm hệ thống C và C++
- Nhân Linux và trình điều khiển thiết bị
- Linux nhúng
- Container và Kubernetes
- Phần mềm mạng
- Tính toán khoa học và trí tuệ nhân tạo
- Ứng dụng đa nền tảng
Nhà phát triển có thể sử dụng một desktop Linux cá nhân hoặc phát triển từ hệ điều hành khác bằng cách kết nối đến máy chủ Linux từ xa, máy ảo hoặc container.
Giáo dục và nghiên cứu
Linux được sử dụng trong giáo dục khoa học máy tính, hệ điều hành, mạng và bảo mật vì mã nguồn cùng công cụ phát triển có thể được sử dụng công khai.
Sinh viên và nhà nghiên cứu có thể thực hiện các công việc sau.
- Thí nghiệm lời gọi hệ thống và tiến trình của hệ điều hành
- Phân tích mã nhân và trình điều khiển
- Nghiên cứu trình biên dịch và ngôn ngữ lập trình
- Thí nghiệm giao thức mạng
- Cấu hình hệ thống phân tán
- Phân tích lỗ hổng bảo mật và kỹ thuật phòng thủ
- Nghiên cứu tính toán song song và trí tuệ nhân tạo
- Phát triển hệ thống tệp và bộ lập lịch mới
Máy ảo và container cho phép tạo và khởi tạo lại nhiều môi trường Linux mà không làm hỏng thiết bị thực. Máy tính bo mạch đơn giá thấp cũng được sử dụng để đào tạo về hệ điều hành và điều khiển phần cứng.
Hệ thống chuyên dụng
Linux cũng được tích hợp trong các sản phẩm chuyên dụng không hiển thị như một hệ điều hành thông thường đối với người dùng. Máy bán hàng tự động, kiosk, hệ thống giải trí trên máy bay, thiết bị phát sóng cùng nhiều hệ thống kiểm tra và đo lường có thể sử dụng Linux làm nền tảng bên trong.
Trong các sản phẩm này, desktop hoặc shell thông thường không được hiển thị và chỉ một ứng dụng cụ thể được chạy khi bật nguồn. Hệ điều hành phụ trách điều khiển thiết bị, mạng, cập nhật và phục hồi lỗi, nhưng người dùng có thể không trực tiếp nhận biết Linux.
Linux ban đầu được phát triển cho máy tính cá nhân x86 32 bit, nhưng hiện nay hỗ trợ nhiều kiến trúc bộ xử lý và loại thiết bị.[100] Nhờ khả năng di động và cấu hình linh hoạt này, Linux đã phát triển không phải thành một hệ điều hành giới hạn trong một thị trường cụ thể, mà thành một họ hệ điều hành được sử dụng làm nền tảng chung từ máy chủ đa dụng đến thiết bị tiêu dùng và hệ thống công nghiệp.
Hệ sinh thái và quản trị
Linux không phải là một sản phẩm đơn lẻ chỉ được cấu thành từ nhân Linux, mà là một hệ sinh thái kết hợp cộng đồng phát triển nhân, các bản phân phối, những dự án không gian người dùng như GNU, nhà sản xuất phần cứng, nhà cung cấp đám mây, nhà phát triển ứng dụng và các nhóm người dùng.
Không tồn tại một tổ chức trung tâm duy nhất chỉ huy toàn bộ hệ sinh thái Linux. Nhân được phát triển thông qua hệ thống nhà bảo trì riêng, các bản phân phối kết hợp nhân với không gian người dùng theo tổ chức và chính sách của mình, còn môi trường desktop, trình biên dịch, thư viện hệ thống và ứng dụng đều do những dự án độc lập quản lý.
Linux Foundation là một tổ chức phi lợi nhuận lớn hỗ trợ hệ sinh thái này, nhưng không phải là chủ sở hữu hay cơ quan chỉ đạo kỹ thuật của toàn bộ Linux. Tên gọi Linux, quá trình phát triển nhân, các bản phân phối và dự án không gian người dùng được vận hành dưới những chủ thể và cơ chế quản trị khác nhau.
Hệ sinh thái phân tán
Các thành phần của hệ điều hành dựa trên Linux được phát triển trong nhiều dự án độc lập.
Các chủ thể cấu thành tiêu biểu gồm:
- Cộng đồng phát triển nhân Linux
- Dự án GNU
- Cộng đồng các bản phân phối như Debian, Fedora và Arch Linux
- Các công ty phân phối như Red Hat, Canonical và SUSE
- Các dự án desktop như GNOME và KDE
- systemd, OpenRC cùng nhiều dự án cấu hình hệ thống
- Các dự án thư viện C như glibc và musl
- Các dự án trình biên dịch như GCC và LLVM
- Các dự án đồ họa liên quan đến X.Org và Wayland
- Các dự án container và đám mây như Docker, containerd và Kubernetes
- Nhà sản xuất phần cứng và bán dẫn
- Nhà phát triển ứng dụng và phần mềm nguồn mở
Mỗi dự án có kho mã, lịch phát hành, nhà bảo trì và quy tắc đóng góp riêng. Việc mã được đưa vào nhân Linux không có nghĩa chương trình không gian người dùng liên quan cũng do cùng một tổ chức quản lý, và quyết định của một dự án cũng không tự động áp dụng cho toàn bộ hệ sinh thái Linux.
Cấu trúc này ngăn một tổ chức đơn lẻ kiểm soát toàn bộ Linux, nhưng cũng khiến việc phối hợp thay đổi giữa các thành phần trở nên khó khăn. Bản phân phối lựa chọn phiên bản được công bố từ nhiều dự án, áp dụng bản vá và cấu hình rồi tích hợp chúng thành một hệ thống thực tế có thể sử dụng.
Quản trị nhân Linux
Nhân Linux không được phát triển theo phương thức một hội đồng quản trị pháp nhân bỏ phiếu quyết định các chức năng kỹ thuật. Nhà phát triển và nhà bảo trì của từng hệ thống con xem xét bản vá trên danh sách thư công khai, sau đó chuyển những thay đổi đã được xem xét qua nhiều kho Git để đi vào mainline.
Mã nguồn nhân được chia thành các hệ thống con như mạng, quản lý bộ nhớ, hệ thống tệp, kiến trúc bộ xử lý, đồ họa và trình điều khiển thiết bị. Phần lớn hệ thống con có nhà bảo trì chịu trách nhiệm tổng thể cho khu vực mã tương ứng. Họ đóng vai trò như cổng kiểm soát, quyết định bản vá có được chấp nhận và gửi lên mainline hay không.[101]
Dự án nhân có hơn 100 nhà bảo trì vận hành các kho riêng. Quá trình phát triển và xem xét được phân tán trên nhiều kho, nhưng ở bước cuối cùng các thay đổi được tích hợp vào kho mainline. Công việc này thường do Linus Torvalds đảm nhiệm.[102]
Torvalds là người sáng lập nhân Linux và nhà bảo trì cấp cao nhất, nhưng không trực tiếp viết toàn bộ mã hoặc xem xét mọi bản vá từ đầu. Nhà bảo trì hệ thống con xem xét và sắp xếp thay đổi trong lĩnh vực chuyên môn rồi gửi pull request cho Torvalds.
Trong cấu trúc này, đóng góp kỹ thuật, hoạt động bảo trì liên tục và sự tín nhiệm từ các nhà phát triển khác quan trọng hơn chức danh chính thức. Khi một nhà phát triển đóng góp lâu dài cho một lĩnh vực, xem xét bản vá và đảm nhận trách nhiệm, họ có thể trở thành đồng bảo trì hoặc nhà bảo trì.
Quyết định kỹ thuật
Thay đổi trong nhân Linux thường được quyết định thông qua bản vá và thảo luận kỹ thuật thay vì biểu quyết theo đa số. Nhà phát triển gửi mã thực tế, còn nhà phát triển và nhà bảo trì liên quan xem xét thiết kế, hiệu năng, bảo mật, khả năng tương thích và khả năng duy trì dài hạn.
Khi có bất đồng, những yếu tố sau ảnh hưởng đến quyết định.
- Vấn đề thực tế cần giải quyết có rõ ràng hay không
- Có duy trì khả năng tương thích với không gian người dùng hiện có hay không
- Ảnh hưởng đến các hệ thống con khác là gì
- Có đủ thử nghiệm và trường hợp sử dụng hay không
- Có nhà phát triển duy trì mã lâu dài hay không
- Có phương thức giải quyết đơn giản hoặc tổng quát hơn hay không
- Lợi ích của thay đổi có biện minh cho độ phức tạp và rủi ro hay không
Cuối cùng, trong một hệ thống con cụ thể, nhà bảo trì phụ trách quyết định có chấp nhận bản vá hay không; ở giai đoạn tích hợp mainline, Torvalds có thể chấp nhận hoặc từ chối pull request.
Quyết định của nhà bảo trì không mang tính tuyệt đối hoặc vĩnh viễn. Nhà phát triển không đồng ý có thể đưa ra lại căn cứ kỹ thuật và bản vá đã sửa, hoặc thảo luận giải pháp thay thế trong cộng đồng liên quan. Họ cũng có thể phân nhánh mã nguồn để tạo nhân riêng theo giấy phép phần mềm tự do, nhưng phải chịu chi phí tiếp tục duy trì khác biệt với mainline chính thức.
Vai trò của bản phân phối
Dù cộng đồng nhân Linux phát triển nhân, họ không trực tiếp cấu thành toàn bộ hệ điều hành mà người dùng cài đặt. bản phân phối Linux kết hợp nhân với chương trình không gian người dùng, trình quản lý gói, chương trình cài đặt và chính sách bảo mật.
Bản phân phối đưa ra những quyết định sau.
- Phiên bản nhân và bản vá được sử dụng
- Thư viện C và công cụ dòng lệnh cơ bản
- Hệ thống init và cấu hình dịch vụ
- Định dạng gói và kho phần mềm
- Môi trường đồ họa và ứng dụng mặc định
- Thiết lập bảo mật
- Bộ xử lý và phần cứng được hỗ trợ
- Chu kỳ cập nhật
- Thời điểm kết thúc hỗ trợ
- Chính sách đưa phần mềm tự do và không tự do vào hệ thống
Có những bản phân phối được vận hành chủ yếu bởi cộng đồng như Debian và Arch Linux, cũng có những bản phân phối trong đó doanh nghiệp cung cấp sản phẩm và hỗ trợ kỹ thuật như Red Hat Enterprise Linux, Ubuntu và SUSE Linux Enterprise. Fedora là ví dụ về hình thức nhận hỗ trợ doanh nghiệp trong khi cộng đồng công khai tham gia phát triển.
Bản phân phối có thể chuyển nguyên trạng mã của dự án thượng nguồn, nhưng cũng có thể áp dụng bản sửa lỗi và bản vá tích hợp riêng. Những sửa đổi khó duy trì lâu dài thường có lợi hơn nếu được gửi lên dự án thượng nguồn để đưa vào mã chính thức.
Linux Foundation
Linux Foundation là tổ chức phi lợi nhuận hỗ trợ phát triển Linux, nhiều công nghệ nguồn mở và hoạt động hợp tác công nghiệp. Hiện nay tổ chức này hỗ trợ không chỉ Linux mà còn nhiều dự án về đám mây, container, mạng, ô tô, bảo mật, trí tuệ nhân tạo và tiêu chuẩn mở.
Linux Foundation tự mô tả là một nền tảng hợp tác trung lập giúp nhà phát triển và tổ chức phát triển, quản lý và mở rộng các dự án cùng hệ sinh thái công nghệ mở.[103]
Các hoạt động hỗ trợ chính liên quan trực tiếp đến Linux gồm:
- Hỗ trợ hoạt động và việc làm của các nhà phát triển chủ chốt
- Hỗ trợ hạ tầng kernel.org
- Tổ chức sự kiện và hội nghị kỹ thuật dành cho nhà phát triển
- Hỗ trợ pháp lý và nhãn hiệu
- Cung cấp không gian hợp tác giữa doanh nghiệp và cộng đồng phát triển
- Đào tạo và chứng nhận kỹ thuật
- Chương trình bảo mật nguồn mở và chuỗi cung ứng
- Cung cấp công cụ quản lý vận hành và tài chính dự án
- Hỗ trợ tiêu chuẩn hóa và ứng dụng trong công nghiệp
Linux Kernel Organization, đơn vị vận hành kernel.org, nằm dưới sự quản lý của Linux Foundation, còn tổ chức cung cấp hỗ trợ kỹ thuật, tài chính và nhân lực cần thiết để vận hành hạ tầng.[104]
Linux Foundation không sở hữu mã nguồn nhân hoặc phê duyệt mọi bản vá. Tổ chức cung cấp nền tảng phát triển cùng hỗ trợ hành chính, pháp lý và tài chính, nhưng các quyết định kỹ thuật của nhân được đưa ra theo quy trình của Torvalds, nhà bảo trì hệ thống con và cộng đồng phát triển.
Sự hình thành của Linux Foundation
Linux Foundation được thành lập với tên gọi và cơ cấu hiện nay vào năm 2007 khi Open Source Development Labs và Free Standards Group, hai tổ chức hỗ trợ ngành công nghiệp Linux, hợp nhất.
Open Source Development Labs cung cấp nền tảng phát triển, thử nghiệm và hỗ trợ các nhà phát triển chủ chốt để doanh nghiệp cùng nhà phát triển có thể áp dụng Linux vào máy chủ và hệ thống công nghiệp. Linus Torvalds cũng thực hiện công việc phát triển nhân dưới sự hỗ trợ của tổ chức này.
Free Standards Group thúc đẩy Linux Standard Base và các hoạt động tiêu chuẩn hóa liên quan nhằm nâng cao khả năng tương thích giữa các bản phân phối Linux cùng tính di động của phần mềm thương mại.
Việc hợp nhất hai tổ chức kết hợp hỗ trợ phát triển nhân, tiêu chuẩn hóa công nghiệp và hợp tác doanh nghiệp trong một nền tảng phi lợi nhuận duy nhất. Sau đó, Linux Foundation mở rộng từ một tổ chức tập trung vào Linux thành một tổ chức bảo trợ quy mô lớn hỗ trợ nhiều dự án nguồn mở.
Thành viên doanh nghiệp và sự tham gia tài chính
Linux Foundation không chỉ vận hành bằng các khoản quyên góp cá nhân. Nhiều doanh nghiệp công nghệ, viễn thông, bán dẫn, ô tô và tài chính tham gia với tư cách thành viên, đồng thời cung cấp tài chính và nhân lực.
Trong nhóm thành viên cấp cao nhất được Linux Foundation công bố năm 2026 có Google cùng Ericsson, Fujitsu, Hitachi, Huawei, Intel, Meta, Microsoft, NEC, Oracle, Qualcomm, IBM·Red Hat và Samsung.[105]
Thành viên của tổ chức có thể tham gia hệ sinh thái bằng các phương thức sau.
- Hỗ trợ tài chính
- Tham gia hội đồng quản trị và ban điều hành theo từng chương trình
- Tuyển dụng nhà phát triển
- Tài trợ sự kiện và hạ tầng
- Tham gia một dự án nguồn mở cụ thể
- Phát triển tiêu chuẩn chung và quy cách công nghiệp
- Hỗ trợ chương trình bảo mật và giáo dục
- Công bố công nghệ của doanh nghiệp dưới dạng nguồn mở
Việc là thành viên Linux Foundation không có nghĩa doanh nghiệp đã đóng góp một lượng mã cụ thể vào nhân Linux. Ngược lại, doanh nghiệp hoặc cá nhân không phải thành viên vẫn có thể gửi bản vá nhân và trở thành nhà bảo trì.
Cấp thành viên và cơ cấu hội đồng của tổ chức liên quan đến quản trị tài chính và tổ chức, tách biệt với quyền chấp nhận bản vá nhân Linux. Dù sở hữu cấp thành viên cao, doanh nghiệp cũng không có quyền đưa một thay đổi nhân không phù hợp về kỹ thuật vào mainline.
Đóng góp nhân của doanh nghiệp
Nhân Linux phát triển nhờ sự đóng góp không chỉ của tình nguyện viên cá nhân mà còn của những nhà phát triển được doanh nghiệp tuyển dụng. Tài liệu phát triển nhân chính thức giải thích rằng trong một chu kỳ phát triển có thể có hơn 1.000 nhà phát triển cùng hơn 100 doanh nghiệp hoặc nhà phát triển độc lập tham gia.[106]
Trong lịch sử, những doanh nghiệp có nhiều nhà phát triển tham gia phát triển nhân gồm:
- Intel
- Red Hat
- IBM
- Samsung
- SUSE
- AMD
- Oracle
- Qualcomm
- Renesas
- Microsoft
- Meta
- NVIDIA
- Nhiều nhà sản xuất bán dẫn và thiết bị khác
Khối lượng đóng góp và thứ hạng theo doanh nghiệp thay đổi tùy giai đoạn khảo sát và phiên bản nhân, vì vậy không thể xem là một bảng xếp hạng cố định. Ngoài ra, có những doanh nghiệp có ít commit hơn nhưng duy trì hệ thống con phức tạp hoặc cung cấp bản sửa bảo mật và hạ tầng thử nghiệm.
Doanh nghiệp đóng góp vào nhân vì những nhu cầu kinh doanh sau.
- Hỗ trợ bộ xử lý và thiết bị mới
- Cải thiện hiệu năng máy chủ và trung tâm dữ liệu
- Chức năng đám mây và ảo hóa
- Hỗ trợ Android và thiết bị tiêu dùng
- Ô tô và thiết bị công nghiệp
- Hệ thống tệp và thiết bị lưu trữ
- Thiết bị mạng và viễn thông
- Chức năng bảo mật và quan sát
- Quản lý điện năng
- Giảm chi phí bảo trì dài hạn cho sản phẩm của mình
Khi chức năng được đưa vào nhân chính thức, việc hỗ trợ phần cứng và dịch vụ của doanh nghiệp trên nhiều bản phân phối trở nên dễ dàng hơn. Thay vì duy trì bản vá nội bộ riêng trong thời gian dài, doanh nghiệp có thể chia sẻ chi phí với các nhà phát triển khác và cùng quản lý mã khi nhân thượng nguồn thay đổi.
Nhà phát triển cá nhân và cộng đồng
Dù doanh nghiệp tham gia sâu, nhân Linux không phải là dự án chỉ thuộc về một liên minh doanh nghiệp. Nhà phát triển không thuộc doanh nghiệp cụ thể, sinh viên, nhà nghiên cứu và chuyên gia tư vấn độc lập cũng tham gia bằng bản vá, xem xét, tài liệu và thử nghiệm.
Đóng góp không chỉ giới hạn ở phát triển chức năng mới.
- Báo cáo lỗi
- Tìm nguyên nhân hồi quy
- Thử nghiệm bản vá
- Xem xét mã
- Cải thiện tài liệu
- Phân tích tĩnh và fuzzing
- Sửa lỗ hổng bảo mật
- Duy trì trình điều khiển cũ
- Quản lý công cụ phát triển và hạ tầng
Trong phát triển nhân, vai trò của nhà bảo trì xem xét bản vá và chịu trách nhiệm lâu dài quan trọng không kém người viết mã. Ngay cả mã do doanh nghiệp viết cũng khó được chấp nhận nếu không có chủ thể tiếp tục duy trì hoặc ảnh hưởng đến các hệ thống khác chưa được xem xét đầy đủ.
Phương thức phát triển dựa trên danh sách thư và kho Git công khai cho phép nhà phát triển thuộc nhiều tổ chức và khu vực khác nhau tham gia theo cùng một quy trình. Tuy nhiên, văn hóa bản vá qua email, lượng kiến thức kỹ thuật lớn và phương thức xem xét công khai cũng có thể tạo rào cản gia nhập cao đối với người mới.
Quan hệ giữa đóng góp và ảnh hưởng
Ảnh hưởng trong nhân Linux không được quyết định chỉ bởi cấp thành viên của tổ chức hoặc quy mô doanh nghiệp. Nhà phát triển liên tục viết và xem xét mã trong một lĩnh vực, đồng thời ứng phó lỗi lâu dài, có thể đạt được mức tín nhiệm và quyền phán đoán cao trong hệ thống con đó.
Doanh nghiệp có thể xây dựng ảnh hưởng kỹ thuật bằng cách tuyển dụng nhà phát triển và hỗ trợ họ tham gia lâu dài. Tuy nhiên, đây không phải là quyền ép buộc chấp nhận bản vá, mà là phương thức bảo đảm khả năng tham gia thảo luận thiết kế, triển khai thực tế và chịu trách nhiệm bảo trì.
Chức năng được đưa vào mã nhân có thể ảnh hưởng không chỉ sản phẩm của một doanh nghiệp mà toàn bộ người dùng. Nhà bảo trì xem xét liệu yêu cầu của một doanh nghiệp có xung đột với cấu trúc dài hạn của toàn bộ nhân hay không.
Nếu yêu cầu doanh nghiệp quá đặc thù, nó có thể phải được thiết kế lại thành giao diện đa dụng hoặc duy trì dưới dạng mô-đun và bản vá riêng ngoài nhân chính thức. Ngược lại, chức năng mà nhiều người dùng và doanh nghiệp cùng cần có khả năng phát triển thành một hệ thống con chính thức.
Nhãn hiệu và quyền sở hữu
Nhãn hiệu tên Linux thuộc sở hữu của Linus Torvalds, còn Linux Mark Institute phụ trách cấp phép sử dụng và các công việc liên quan. Điều này không có nghĩa Linux Foundation sở hữu tên gọi Linux.
Bản quyền mã nhân Linux cũng không tập trung vào một tổ chức duy nhất. Mỗi nhà phát triển và doanh nghiệp giữ bản quyền đối với phần mã mình viết và phân phối nó theo điều kiện giấy phép của nhân Linux.
Vì có nhiều chủ sở hữu bản quyền, một doanh nghiệp khó có thể mua lại toàn bộ nhân Linux hoặc tùy ý chuyển nó sang giấy phép đóng. Những quyết định ảnh hưởng đến toàn bộ mã, như thay đổi giấy phép nhân, sẽ phát sinh vấn đề phải có sự đồng ý của rất nhiều chủ thể quyền.
Linux Foundation có thể hỗ trợ về nhãn hiệu, pháp lý và giấy phép nguồn mở, nhưng không phải là chủ sở hữu bản quyền duy nhất của toàn bộ nhân.
Quy tắc ứng xử
Cộng đồng nhân Linux đã áp dụng quy tắc ứng xử mà nhà phát triển phải tuân theo trong quá trình xem xét kỹ thuật. Quy tắc này yêu cầu cung cấp môi trường không có hành vi quấy rối bất kể nền tảng của người đóng góp, đồng thời tập trung bất đồng vào vấn đề kỹ thuật thay vì công kích cá nhân.[107]
Phát triển nhân từ lâu được biết đến với phong cách giao tiếp rất trực tiếp và đôi khi gay gắt. Khi quy mô dự án và sự đa dạng của người tham gia tăng lên, cần có quy trình phân biệt phê bình kỹ thuật với công kích cá nhân và xử lý vấn đề nội bộ cộng đồng.
Quy tắc ứng xử không thay thế phán đoán kỹ thuật. Bản vá vẫn được xem xét theo chất lượng mã, nhu cầu, khả năng tương thích và khả năng duy trì, nhưng quy tắc cung cấp tiêu chuẩn cộng đồng nhằm tránh xúc phạm hoặc loại trừ người tham gia trong quá trình đó.
Quan hệ với GNU
Dự án GNU không phải là tổ chức phát triển nhân Linux hoặc dự án trực thuộc Linux Foundation. GNU và Linux bắt đầu độc lập và có cộng đồng cùng cơ chế quản trị riêng.
GNU phát triển nhiều thành phần không gian người dùng như GCC, Bash, GNU Binutils, GNU Make, GNU Coreutils và glibc nhằm tạo một hệ điều hành tương thích UNIX tự do. Khi Linux xuất hiện, những công cụ này đóng vai trò quan trọng trong việc xây dựng một môi trường phát triển và sử dụng hoàn chỉnh trên nhân Linux.
Dự án GNU gọi hệ thống kết hợp không gian người dùng GNU với nhân Linux là GNU/Linux. Phía GNU nhấn mạnh rằng Linux là nhân, còn một phần đáng kể của hệ thống được sử dụng rộng rãi được tạo bởi dự án GNU.[108]
Tuy nhiên, bản thân nhân Linux không do dự án GNU quản lý, và Linux Foundation cũng không chỉ đạo dự án GNU. Các quyết định kỹ thuật của những thành phần GNU như GCC và glibc được đưa ra dưới hệ thống riêng của nhà bảo trì dự án GNU và Free Software Foundation.
Ngoài ra, không phải mọi hệ thống dựa trên Linux đều sử dụng không gian người dùng GNU. Android sử dụng Bionic cùng không gian người dùng riêng của Android, còn Alpine Linux được cấu thành chủ yếu từ musl và BusyBox. Vì vậy, GNU có quan hệ quan trọng với lịch sử Linux và nhiều bản phân phối, nhưng không phải chủ thể quản trị bắt buộc của toàn bộ hệ sinh thái Linux.
Phần mềm tự do và nguồn mở
Trong hệ sinh thái Linux cùng tồn tại hai quan điểm phần mềm tự do và nguồn mở, có nhiều phần giao nhau nhưng khác nhau về trọng tâm.
GNU và Free Software Foundation nhấn mạnh quyền tự do của người dùng trong việc chạy, nghiên cứu, sửa đổi và chia sẻ chương trình như giá trị trung tâm. Linux Foundation cùng nhiều doanh nghiệp thường giải thích nguồn mở xoay quanh hợp tác công khai, phát triển chung, đổi mới công nghiệp và hiệu quả kinh tế.
Giấy phép GPL của nhân Linux cho phép sử dụng, sửa đổi và phân phối lại mã, đồng thời yêu cầu mã nhân phái sinh được phân phối tiếp tục duy trì những quyền tự do tương tự. Trên nền tảng pháp lý này, hoạt động phần mềm tự do của cá nhân và phát triển thương mại của doanh nghiệp có thể cùng diễn ra.
Hai quan điểm có thể cùng ủng hộ một phần mềm và quy trình phát triển nhưng khác nhau về mục đích và cách diễn đạt. Trong hệ sinh thái Linux có cả các bản phân phối theo triết lý phần mềm tự do của GNU lẫn những tổ chức chủ yếu vận hành theo phát triển nguồn mở thực dụng và hỗ trợ thương mại.
Các tổ chức và dự án liên quan
Hệ sinh thái Linux không chỉ được cấu thành từ Linux Foundation. Nhiều tổ chức phi lợi nhuận và quỹ quản lý phần mềm liên quan.
- Free Software Foundation — GNU và phong trào phần mềm tự do
- Software Freedom Conservancy — hỗ trợ nhiều dự án phần mềm tự do và nguồn mở
- GNOME Foundation — hệ sinh thái GNOME
- KDE e.V. — hỗ trợ pháp lý và tài chính cho cộng đồng KDE
- Apache Software Foundation — các dự án máy chủ và xử lý dữ liệu
- Eclipse Foundation — công cụ phát triển và dự án công nghiệp
- Cloud Native Computing Foundation — Kubernetes và hệ sinh thái cloud-native
- Open Source Initiative — định nghĩa nguồn mở và giấy phép
- Debian Project — cộng đồng bản phân phối Debian
- X.Org Foundation — hỗ trợ các dự án liên quan đến đồ họa
Các tổ chức như Cloud Native Computing Foundation nằm dưới Linux Foundation nhưng có cơ quan giám sát kỹ thuật và cấu trúc vận hành riêng. Không phải mọi dự án trực thuộc các tổ chức này đều tuân theo cơ chế quản trị của nhân Linux.
Phối hợp hệ sinh thái
Hệ sinh thái Linux phân tán được phối hợp thông qua hội nghị nhà phát triển, danh sách thư, tiêu chuẩn công khai và quá trình tích hợp của bản phân phối thay vì một hệ thống mệnh lệnh chính thức.
Những sự kiện như Linux Plumbers Conference và Linux Kernel Maintainers Summit là nơi nhà phát triển từ nhiều hệ thống con thảo luận vấn đề chung và giao diện trong tương lai. Các bản phân phối và dự án desktop cũng tổ chức hội nghị nhà phát triển cùng kế hoạch phát hành riêng.
Các đặc tả của freedesktop.org, D-Bus, desktop portal và XDG cung cấp giao diện chung giữa nhiều desktop và ứng dụng Linux khác nhau. Các tiêu chuẩn liên quan đến OCI và Kubernetes nâng cao khả năng tương thích giữa công cụ container và nhà cung cấp đám mây.
Khi phối hợp thất bại, những hệ thống init, định dạng gói, môi trường đồ họa và API khác nhau có thể cạnh tranh. Điều này gây trùng lặp phát triển và vấn đề tương thích, nhưng cũng ngăn một công nghệ duy nhất bị áp đặt lên toàn bộ hệ sinh thái và cho phép nhiều cách tiếp cận cạnh tranh với nhau.
Đặc điểm quản trị
Cơ chế quản trị Linux có các đặc điểm sau.
- Chủ thể quản lý nhân và các dự án không gian người dùng được tách biệt.
- Quyết định kỹ thuật tập trung vào mã thực tế và xem xét công khai.
- Trách nhiệm được phân tán cho nhà bảo trì của từng hệ thống con.
- Việc tích hợp cuối cùng của nhân mainline được tập trung hóa.
- Cá nhân và doanh nghiệp có thể đóng góp qua cùng một quy trình công khai.
- Doanh nghiệp tham gia bằng cách tuyển dụng nhà phát triển và hỗ trợ tài chính.
- Tư cách thành viên của tổ chức được phân biệt với quyền chấp nhận bản vá kỹ thuật.
- Mã nguồn và bản quyền được phân tán giữa nhiều người đóng góp.
- Bản phân phối độc lập lựa chọn thành phần và chính sách.
- Có quyền phân nhánh dự án nhưng phải chịu chi phí bảo trì.
Cấu trúc này là một trong những yếu tố giúp Linux phát triển từ dự án cá nhân thành nền tảng công nghiệp toàn cầu mà không bị sáp nhập vào sản phẩm đơn lẻ của một doanh nghiệp cụ thể.
Đồng thời, các vấn đề vẫn tiếp tục xuất hiện, như những hệ thống con quan trọng phụ thuộc vào số ít nhà bảo trì, nhu cầu doanh nghiệp xung đột với định hướng dài hạn của cộng đồng và yêu cầu phối hợp thay đổi giữa nhiều dự án. Quản trị Linux không phải là một thể chế cố định đã hoàn thiện, mà là một cấu trúc hợp tác công khai liên tục được điều chỉnh theo quy mô kỹ thuật và sự thay đổi của các chủ thể tham gia.
Mối quan hệ với các hệ điều hành khác
Linux không được tạo ra bằng cách trực tiếp kế thừa mã nguồn của một hệ điều hành có trước, mà là một nhân hệ điều hành được phát triển độc lập dựa trên việc tham khảo cấu trúc và giao diện lập trình của UNIX. Tài liệu nhân Linux cũng mô tả Linux là một triển khai được viết mới từ đầu nhằm cung cấp chức năng tương tự UNIX và hướng đến khả năng tương thích với POSIX cùng Single UNIX Specification.[109]
Vì vậy, Linux không chia sẻ trực tiếp phả hệ mã nguồn với UNIX nhưng thường được phân loại là một hệ điều hành tương tự UNIX. Nó chia sẻ nhiều khái niệm cơ bản với môi trường UNIX như tiến trình và bộ mô tả tệp, hệ thống tệp phân cấp, shell và công cụ dòng lệnh, mô hình người dùng cùng quyền hạn.
Sau khi mở rộng sang máy chủ, desktop, điện thoại thông minh và lĩnh vực nhúng, Linux vừa cạnh tranh với các hệ điều hành khác, vừa đóng vai trò kết nối ứng dụng và môi trường phát triển giữa chúng thông qua ảo hóa, tầng tương thích và các tiêu chuẩn chung.
UNIX
Linux chịu ảnh hưởng mạnh từ UNIX nhưng không thuộc phả hệ mã nguồn UNIX trong lịch sử. Khác với những hệ điều hành được phân nhánh trực tiếp từ UNIX nguyên bản như System V và BSD, Linux được triển khai độc lập dựa trên giao diện, tài liệu công khai cùng kinh nghiệm sử dụng MINIX và các hệ thống UNIX có trước.
Hai dòng hệ thống chia sẻ những khái niệm sau.
- Tiến trình và tín hiệu
- Bộ mô tả tệp
- Phương thức xử lý mọi tài nguyên thông qua giao diện tương tự tệp
- Người dùng, nhóm và quyền tệp
- Shell và pipe
- Hệ thống tệp phân cấp
- Tệp thiết bị
- Lập trình hệ thống dựa trên ngôn ngữ C
- API thuộc họ POSIX
Linux tuân theo truyền thống thiết kế UNIX nhưng đồng thời phát triển các giao diện riêng như epoll, cgroups, namespace, eBPF và io_uring. Những chức năng này không nằm trong tiêu chuẩn UNIX truyền thống và hình thành đặc điểm độc lập của nền tảng Linux.
UNIX là nhãn hiệu đã đăng ký do The Open Group quản lý, vì vậy tên gọi sản phẩm UNIX chính thức chỉ có thể được sử dụng cho hệ điều hành và phiên bản cụ thể đã được chứng nhận. Các bản phân phối Linux thông thường không được chứng nhận UNIX dưới dạng một sản phẩm cố định duy nhất, nên về kỹ thuật thường được mô tả là tương tự UNIX thay vì UNIX.
BSD
Họ BSD và Linux chia sẻ giao diện kiểu UNIX cùng phương thức phát triển nguồn mở, nhưng có phả hệ, giấy phép và cấu trúc phát triển khác nhau.
FreeBSD, OpenBSD và NetBSD phát triển trên nền mã kế thừa từ BSD UNIX nguyên bản. Linux tham khảo hành vi của UNIX và BSD nhưng mã nhân được viết riêng.
Các khác biệt chính giữa hai dòng gồm:
- Trong Linux, nhân và không gian người dùng thường được phát triển bởi những dự án khác nhau.
- Các dự án BSD thường quản lý nhân và không gian người dùng cơ bản cùng nhau trong một cây mã nguồn hệ điều hành.
- Nhân Linux sử dụng giấy phép thuộc họ GPL.
- Họ BSD chủ yếu sử dụng giấy phép BSD cho phép đưa mã đã sửa vào sản phẩm mà không nhất thiết phải công khai lại.
- Linux có nhiều bản phân phối độc lập.
- Trong BSD, FreeBSD, OpenBSD và NetBSD bản thân mỗi dự án là một hệ điều hành hoàn chỉnh.
Linux và BSD cùng triển khai giao diện POSIX và UNIX nên nhiều chương trình nguồn mở có thể được chuyển giữa hai hệ thống ở cấp mã nguồn. Tuy nhiên, lời gọi hệ thống, quản lý mạng, giao diện thiết bị và tùy chọn lệnh có thể khác nên vẫn cần sửa đổi.
Công nghệ cũng được trao đổi giữa hai bên. Linux từng sử dụng mã mạng, công cụ và nhiều thành phần có giấy phép cho phép từ BSD, còn các hệ điều hành BSD cũng có thể tiếp nhận phần mềm, hệ thống tệp, trình điều khiển và công cụ không gian người dùng được sử dụng rộng rãi trên Linux.
FreeBSD cung cấp Linuxulator, một tầng tương thích nhị phân tùy chọn để chạy tệp thực thi Linux. Tầng này kết nối tệp thực thi Linux ELF và lời gọi hệ thống với môi trường FreeBSD, cho phép chạy một số chương trình Linux chưa sửa đổi.[110]
Linux và BSD đã cạnh tranh trong máy chủ, thiết bị mạng, hệ thống lưu trữ và môi trường nhúng. Linux xây dựng phạm vi rộng hơn về phần cứng, hỗ trợ doanh nghiệp, bản phân phối và hệ sinh thái đám mây, còn BSD duy trì vị trí riêng nhờ hệ thống cơ bản tích hợp, giấy phép cho phép rộng và thế mạnh trong một số lĩnh vực mạng cùng lưu trữ.
macOS và Darwin
macOS là hệ điều hành desktop do Apple phát triển, sử dụng nhân XNU và nền tảng Darwin thay vì nhân Linux.
Darwin là nền tảng hệ điều hành kết hợp công nghệ thuộc họ Mach với các thành phần BSD. Vì vậy, khác với Linux, macOS có quan hệ mã nguồn trực tiếp với công nghệ UNIX và BSD trong lịch sử. Apple công khai mã nguồn của Darwin cùng nhiều thành phần liên quan.[111]
macOS và Linux chia sẻ môi trường lập trình POSIX và tương tự UNIX, nên các công cụ và chương trình sau có thể được sử dụng trên cả hai hệ thống.
- Shell và chương trình terminal
- Trình biên dịch C và C++
- Git
- Python và nhiều ngôn ngữ lập trình
- API hệ thống POSIX
- Chương trình máy chủ thuộc họ UNIX
- Nhiều công cụ dòng lệnh nguồn mở
Tuy nhiên, hai hệ thống khác nhau về nhân, môi trường đồ họa, trình điều khiển thiết bị, quản lý gói và API ứng dụng. Ứng dụng Linux không thể mặc nhiên chạy nguyên trạng trên macOS; mã nguồn có thể cần được xây dựng lại hoặc sửa phần phụ thuộc vào hệ điều hành.
macOS sử dụng Aqua, Cocoa, Metal và các framework riêng của Apple. Desktop Linux chủ yếu được xây dựng quanh GTK, Qt, Wayland hoặc X11, nên ứng dụng đồ họa không có khả năng tương thích nhị phân trực tiếp.
Apple từng cung cấp một số phiên bản macOS dưới dạng sản phẩm được chứng nhận phù hợp với tiêu chuẩn UNIX. Điều này tạo ra khác biệt rằng một cấu hình sản phẩm macOS cụ thể đã nhận chứng nhận UNIX chính thức, dù cả Linux và macOS đều thuộc họ tương tự UNIX.
Linux và macOS cạnh tranh trong lĩnh vực desktop dành cho nhà phát triển và môi trường phát triển máy chủ UNIX, nhưng trong thực tế chúng cũng thường được sử dụng cùng nhau, như truy cập từ macOS đến máy chủ và container Linux từ xa hoặc chạy Linux trong máy ảo.
Windows
Windows là hệ điều hành có phả hệ, cấu trúc hệ thống và giao diện lập trình khác với Linux. Dòng Windows NT phát triển xoay quanh nhân riêng của Microsoft, Win32 API và mô hình đối tượng NT thay vì UNIX.
Linux và Windows đã cạnh tranh lâu dài trên thị trường máy tính cá nhân và máy chủ.
Windows có thế mạnh trong các lĩnh vực sau.
- Máy tính cá nhân dành cho người tiêu dùng phổ thông
- Ứng dụng desktop thương mại
- Môi trường Active Directory doanh nghiệp
- Trò chơi dựa trên DirectX
- Hỗ trợ phần cứng từ nhà sản xuất
- Công cụ phát triển và phần mềm nghiệp vụ của Microsoft
Linux xây dựng vị trí mạnh trong các lĩnh vực sau.
- Máy chủ web và Internet
- Đám mây và container
- Siêu máy tính
- Thiết bị mạng
- Hệ thống nhúng
- Môi trường phát triển nguồn mở
- Tùy biến và tự động hóa hệ điều hành
Tệp thực thi và API hệ thống của hai bên về cơ bản không tương thích. Chương trình Windows sử dụng định dạng PE cùng API Win32 và NT, còn chương trình Linux chủ yếu dùng ELF, lời gọi hệ thống Linux và API thuộc họ POSIX.
Tuy nhiên, cùng một ứng dụng và dịch vụ có thể được cung cấp trên cả hai hệ thống nhờ tiêu chuẩn mạng, ngôn ngữ lập trình, định dạng tệp và framework đa nền tảng. Java, .NET, Qt, Electron và công nghệ web được sử dụng để trừu tượng hóa khác biệt hệ điều hành.
Khi hoạt động Azure cùng mảng máy chủ và công cụ phát triển được mở rộng, Microsoft bắt đầu xem Linux không chỉ là hệ điều hành cạnh tranh mà còn là nền tảng hỗ trợ cốt lõi. Môi trường phát triển và vận hành kết hợp Windows với Linux cũng trở nên phổ biến.
Windows Subsystem for Linux
WSL là chức năng cho phép chạy bản phân phối Linux và chương trình dòng lệnh bên trong Windows.
WSL 1 ban đầu sử dụng tầng tương thích chuyển lời gọi hệ thống Linux thành chức năng của nhân Windows. Nó không trực tiếp chạy nhân Linux mà xử lý các lời gọi hệ thống do chương trình Linux ELF yêu cầu trong môi trường Windows NT.
WSL 2 chuyển sang phương thức chạy nhân Linux thực trong một máy ảo nhẹ. Nhờ đó, nó cung cấp khả năng tương thích lời gọi hệ thống, container, hệ thống tệp và mạng cao hơn trước.
Microsoft mô tả WSL là chức năng được thiết kế để sử dụng môi trường và công cụ Linux trên Windows mà không cần máy ảo truyền thống riêng biệt hoặc khởi động kép.[112]
Trong WSL có thể cài đặt không gian người dùng của Ubuntu, Debian, openSUSE và nhiều bản phân phối Linux khác. Nhà phát triển có thể sử dụng trình soạn thảo, trình duyệt và ứng dụng nghiệp vụ dành cho Windows trong khi đồng thời dùng shell Linux, trình biên dịch, trình quản lý gói và công cụ container.
WSL không biến Windows thành Linux. Windows vẫn là hệ điều hành máy chủ, còn môi trường Linux được tích hợp với tệp, mạng, đồ họa và công cụ phát triển của Windows.
Sự phổ biến của WSL khiến môi trường phát triển Linux không còn giới hạn ở người dùng desktop Linux. Nhà phát triển Windows cũng có thể sử dụng cục bộ một môi trường tương tự máy chủ Linux để xây dựng và thử nghiệm phần mềm dành cho Linux.
Wine và ứng dụng Windows
Wine là tầng tương thích cho phép chạy ứng dụng Windows trên các hệ điều hành thuộc họ POSIX như Linux, BSD và macOS.
Wine không chạy một hệ điều hành Windows hoàn chỉnh trong máy ảo. Nó tự triển khai Win32 cùng các API liên quan mà chương trình Windows gọi, rồi kết nối chúng với chức năng đồ họa, tệp và mạng của hệ điều hành máy chủ. Tên Wine bắt nguồn từ cụm từ viết tắt đệ quy “Wine Is Not an Emulator”.[113]
Wine cung cấp các thành phần sau.
- Bộ nạp tệp thực thi Windows
- Triển khai Win32 và nhiều DLL Windows
- Thiết lập tương tự Windows Registry
- Chuyển đổi Direct3D và API đồ họa
- Kết nối đường dẫn tệp Windows với hệ thống tệp UNIX
- Tích hợp âm thanh và thiết bị nhập liệu
Không phải mọi chương trình Windows đều hoạt động hoàn hảo. Chương trình phụ thuộc vào trình điều khiển cụ thể, thành phần nhân, quản lý quyền kỹ thuật số, phần mềm chống gian lận hoặc hành vi nội bộ mới của Windows có thể không chạy hoặc bị hạn chế.
Proton của Valve dựa trên Wine và tích hợp lớp chuyển đổi DirectX, bản vá cùng môi trường thực thi cần cho trò chơi. Nhờ đó, nhiều trò chơi dành cho Windows có thể chạy trong môi trường Steam dựa trên Linux.
Wine cho thấy quan hệ giữa Linux và Windows không chỉ là cạnh tranh, mà hệ sinh thái ứng dụng còn có thể được kết nối thông qua tầng tương thích.
Android
Android là hệ điều hành sử dụng nhân Linux nhưng có không gian người dùng và nền tảng ứng dụng khác với bản phân phối Linux desktop hoặc máy chủ thông thường.
Android sử dụng các thành phần sau.
- Nhân Linux
- Thư viện C Bionic
- Android Runtime
- Giao tiếp liên tiến trình dựa trên Binder
- Framework ứng dụng Android
- APK và hệ thống gói Android
- Thành phần đồ họa và đa phương tiện riêng của Android
Android Open Source Project mô tả nhân là thành phần trung tâm của hệ điều hành giao tiếp với phần cứng thiết bị, đồng thời sử dụng cấu trúc tách phần độc lập với phần cứng khỏi mô-đun riêng của nhà sản xuất.[114]
Nhân Linux của Android dựa trên nhân Linux mainline và hỗ trợ dài hạn nhưng bổ sung chức năng cùng hỗ trợ thiết bị cần cho Android. Trong quá trình phát triển Android common kernel, thay đổi từ Linux mainline liên tục được hợp nhất và các chức năng Android được quản lý.[115]
Android không sử dụng GNU Coreutils, glibc hoặc môi trường desktop Linux thông thường. Vì vậy, dù dựa trên nhân Linux, nó thường không được phân loại là một bản phân phối GNU/Linux truyền thống.
Ứng dụng Linux thông thường không chạy nguyên trạng trên Android, và ứng dụng Android cũng không trực tiếp chạy trên desktop Linux thông thường. Tuy nhiên, hai môi trường chia sẻ cùng họ nhân và nhiều thư viện nguồn mở, đồng thời công nghệ chạy tương hỗ dựa trên container và tầng tương thích đang được phát triển.
Sự phổ biến của Android đã biến nhân Linux thành một trong những nền tảng thiết bị tiêu dùng được sử dụng rộng rãi nhất trên thế giới.
ChromeOS
ChromeOS và nền tảng nguồn mở ChromiumOS của nó cũng là những hệ điều hành sử dụng nhân Linux.
ChromiumOS ban đầu sử dụng một nhân dựa trên Ubuntu cụ thể, sau đó phát triển theo hướng trực tiếp theo dõi Linux mainline thượng nguồn và áp dụng những thay đổi cần thiết về chức năng cùng độ ổn định.[116]
ChromeOS được thiết kế xoay quanh trình duyệt web và dịch vụ đám mây, đồng thời có cấu trúc khởi động, bảo mật, cập nhật và giao diện người dùng khác với bản phân phối desktop Linux thông thường.
ChromeOS dựa trên Linux nhưng được thiết kế để người dùng không trực tiếp quản trị một hệ thống Linux truyền thống. Phân vùng hệ thống, cập nhật và môi trường thực thi ứng dụng được cấu hình theo hệ thống quản lý của Google.
Chức năng Crostini sử dụng máy ảo và container để cung cấp một môi trường phát triển Linux riêng bên trong ChromeOS. Thay vì chạy tùy ý chương trình Linux trực tiếp trên hệ thống máy chủ, ChromeOS cách ly chúng trong container Linux bên trong máy ảo.[117]
Vì vậy, ChromeOS có cấu trúc phân tầng, vừa sử dụng nhân Linux làm nền tảng nội bộ, vừa cung cấp lại một môi trường người dùng Linux riêng thông qua ảo hóa.
Hệ điều hành nhúng và chuyên dụng
Linux được sử dụng làm nhân cho nhiều hệ điều hành chuyên dụng và nền tảng sản phẩm.
TV thông minh, bộ định tuyến, hệ thống thông tin giải trí trên ô tô, thiết bị mạng và hệ thống công nghiệp có thể xây dựng không gian người dùng, môi trường đồ họa và giao diện quản trị riêng bên trên nhân Linux.
Những hệ thống này có thể không cung cấp cho người dùng trình quản lý gói hoặc shell giống một bản phân phối Linux thông thường. Hệ điều hành có thể chỉ chạy một ứng dụng cụ thể và được cập nhật bằng cách thay thế toàn bộ ảnh hệ thống.
Các dòng hệ điều hành chuyên dụng dựa trên Linux gồm:
- Android và các hệ điều hành di động phái sinh
- ChromeOS và ChromiumOS
- Nền tảng TV thông minh
- Bản phân phối dành cho bộ định tuyến và thiết bị mạng
- Nền tảng Linux dành cho ô tô
- Hệ thống dựa trên Linux cho máy chơi game và thiết bị chơi game cầm tay
- Hệ điều hành NAS và thiết bị lưu trữ
- Ảnh Linux dành cho công nghiệp và robot
Dù sử dụng cùng nhân Linux, những hệ thống này có thể không trực tiếp tương thích với nhau vì không gian người dùng, API ứng dụng và phương thức quản trị khác nhau.
Hệ điều hành thời gian thực
Linux là một hệ điều hành đa dụng nhưng có thể đáp ứng yêu cầu thời gian thực bằng cách giảm độ trễ lập lịch và độ trễ ưu tiên.
Linux sử dụng PREEMPT_RT và chính sách lập lịch thời gian thực được áp dụng trong điều khiển công nghiệp, âm thanh, viễn thông và một số hệ thống ô tô. Tuy nhiên, không phải mọi cấu hình Linux đều bảo đảm giới hạn thời gian nghiêm ngặt.
Hệ điều hành thời gian thực thường ưu tiên khả năng dự đoán rằng một tác vụ sẽ hoàn thành trong thời gian xác định. FreeRTOS, QNX, VxWorks và nhiều RTOS nhỏ cung cấp điều khiển thời gian thực nghiêm ngặt trong môi trường chức năng và tài nguyên hạn chế.
Trong sản phẩm phức tạp, Linux và hệ điều hành thời gian thực có thể được sử dụng cùng nhau.
- Linux xử lý đồ họa, mạng, tệp và ứng dụng.
- Hệ điều hành thời gian thực phụ trách động cơ, cảm biến và điều khiển quan trọng về an toàn.
- Hypervisor tách biệt hai hệ điều hành trên cùng phần cứng.
- Bộ xử lý hoặc vi điều khiển riêng thực hiện tác vụ thời gian thực.
Trong quan hệ này, Linux thường không thay thế hoàn toàn RTOS mà bổ sung cho nó bằng không gian người dùng phong phú và khả năng kết nối.
Hệ điều hành khách và máy chủ của máy ảo
Linux có thể chạy cùng các hệ điều hành khác thông qua tầng ảo hóa.
Linux chạy dưới dạng hệ điều hành khách trong các môi trường ảo hóa như KVM, Xen, Hyper-V và VMware. Ngược lại, Linux sử dụng KVM và QEMU có thể trở thành máy chủ chạy Windows, BSD và những bản phân phối Linux khác.
Ảo hóa cho phép các quan hệ sau.
- Chạy Windows Server trên máy chủ Linux
- Chạy máy ảo Linux trên máy chủ Windows
- Chạy môi trường phát triển Linux trên macOS
- Chạy nhiều hệ điều hành khách hàng trên máy chủ đám mây Linux
- Tách biệt Linux và hệ điều hành thời gian thực trên một thiết bị
- Duy trì hệ điều hành cũ trên phần cứng mới
Các giao diện dành riêng cho ảo hóa như Virtio và thiết bị tổng hợp của Hyper-V cải thiện hiệu quả nhập xuất giữa các hệ điều hành. Nhân Linux chứa mã hỗ trợ cả máy chủ và hệ điều hành khách cho nhiều hypervisor.
Ảnh hưởng đến các hệ điều hành khác
Linux bắt đầu dưới ảnh hưởng của UNIX, nhưng sau khi phát triển đã tác động ngược lại đến cấu trúc và hệ sinh thái công nghiệp của những hệ điều hành khác.
Các ảnh hưởng chính gồm:
- Phát triển quy mô lớn dựa trên kho công khai và quản lý phiên bản phân tán
- Mở rộng việc công khai nguồn của các thành phần hệ điều hành
- Xuất hiện môi trường phát triển và tầng lời gọi hệ thống tương thích Linux
- Phổ biến mô hình container cùng cgroups và namespace
- Hình thành Linux như nền tảng trung tâm trong thiết kế hệ điều hành đám mây
- Mở rộng trình điều khiển nguồn mở và hỗ trợ phần cứng
- Phổ biến kho gói và cơ chế cập nhật tự động
- Đánh giá lại môi trường shell và dòng lệnh dành cho nhà phát triển
Việc Windows trực tiếp cung cấp môi trường phát triển Linux thông qua WSL, BSD duy trì tầng tương thích nhị phân Linux và ChromeOS cung cấp container phát triển Linux cho thấy hệ sinh thái công cụ và ứng dụng Linux đã trở thành một đối tượng tương thích độc lập.
Cạnh tranh và khả năng tương tác
Mối quan hệ giữa Linux và các hệ điều hành khác khó có thể được giải thích như một cuộc cạnh tranh đơn giản trong đó một bên hoàn toàn thay thế bên còn lại.
Trên máy tính cá nhân, Linux, Windows và macOS cạnh tranh bằng những ứng dụng và trải nghiệm người dùng khác nhau. Trong máy chủ và đám mây, Linux giữ vị trí mạnh, nhưng Windows Server và các sản phẩm UNIX vẫn được sử dụng trong một số môi trường doanh nghiệp cùng ứng dụng cụ thể.
Trên điện thoại thông minh, Android sử dụng nhân Linux nhưng cạnh tranh như một nền tảng riêng với iOS của Apple. Trong phương tiện và hệ thống công nghiệp, Linux cùng nhiều hệ điều hành thời gian thực phân chia vai trò cho nhau.
Trong môi trường phát triển, nhiều hệ điều hành có thể được sử dụng đồng thời trên cùng một máy tính.
- Sử dụng công cụ Linux qua WSL trên Windows
- Chạy ứng dụng Windows bằng Wine trên Linux
- Sử dụng container và máy ảo Linux trên macOS
- Chạy tệp nhị phân Linux trên FreeBSD
- Vận hành máy ảo Windows và BSD trên máy chủ Linux
- Xây dựng cùng mã nguồn POSIX trên nhiều hệ điều hành
Vì vậy, Linux vừa cạnh tranh với các hệ điều hành khác vừa kết nối với chúng thông qua POSIX, tiêu chuẩn mạng, ảo hóa và tầng tương thích. Sự phổ biến của Linux không phải là kết quả của việc một hệ điều hành thống nhất toàn bộ môi trường, mà gần hơn với quá trình trong đó nhiều hệ điều hành tiếp tục giữ vai trò riêng trong khi tiếp nhận giao diện và công cụ phát triển Linux làm nền tảng chung.
Ảnh hưởng
Linux khởi đầu như một nhân tương thích UNIX mang tính thử nghiệm của một nhà phát triển cá nhân, nhưng sau đó phát triển thành nền tảng chung kết nối máy chủ, đám mây, điện thoại thông minh, siêu máy tính, thiết bị nhúng và hệ thống công nghiệp. Ảnh hưởng của nó không chỉ nằm ở số lượng thiết bị trực tiếp sử dụng Linux. Linux còn tạo ra những thay đổi trong phương thức cộng tác phát triển nguồn mở, cách hỗ trợ phần cứng, phân phối phần mềm và cấu trúc vận hành đám mây.
Công nghiệp hóa phát triển nguồn mở
Phần mềm tự do và các dự án mã nguồn công khai đã tồn tại trước Linux, nhưng Linux trở thành một ví dụ tiêu biểu cho thấy cá nhân và doanh nghiệp ở nhiều khu vực trên thế giới có thể công khai cùng phát triển một hệ thống cốt lõi quy mô lớn.
Các thay đổi của nhân Linux được xem xét trên danh sách thư và kho Git công khai, còn nhà phát triển cá nhân cùng những doanh nghiệp cạnh tranh với nhau vẫn đóng góp vào cùng một cơ sở mã. Nhà sản xuất bán dẫn, nhà cung cấp đám mây, công ty phân phối và nhà sản xuất thiết bị cùng chia sẻ chi phí duy trì nhân chung trong khi phát triển những chức năng mà mỗi bên cần.
Phương thức này phổ biến mô hình kinh doanh trong đó doanh nghiệp không chỉ sử dụng nguồn mở như phần mềm miễn phí mà còn tuyển dụng nhà phát triển, trực tiếp đóng góp cho dự án thượng nguồn và tham gia định hướng kỹ thuật.
Phương thức cộng tác phát triển hình thành quanh Linux cũng ảnh hưởng đến các lĩnh vực sau.
- Ngôn ngữ lập trình và trình biên dịch
- Cơ sở dữ liệu
- Máy chủ web
- Container và đám mây
- Trí tuệ nhân tạo và xử lý dữ liệu
- Hệ điều hành mạng
- Nền tảng ô tô và nhúng
- Tiêu chuẩn công nghiệp và triển khai tham chiếu công khai
Thành công của Linux mở rộng nhận thức rằng ngay cả phần mềm nền tảng vốn được doanh nghiệp phát triển độc quyền cũng có thể được nhiều tổ chức công khai cùng phát triển.
Git và phát triển phân tán
Khi phát sinh vấn đề liên quan đến công cụ quản lý phiên bản hiện có trong quá trình phát triển nhân Linux, Linus Torvalds đã phát triển Git vào năm 2005. Git được thiết kế để xử lý cây mã nguồn nhân rất lớn, số lượng nhánh lớn, quá trình hợp nhất nhanh và các kho phân tán của nhà phát triển.
Sau đó, Git vượt ra ngoài nhân Linux và trở thành một trong những hệ thống quản lý phiên bản phân tán tiêu biểu của phát triển phần mềm. GitHub, GitLab, Codeberg cùng nhiều dịch vụ lưu trữ mã cũng phát triển xoay quanh kho Git, nhánh và xem xét mã.
Vì vậy, Linux để lại ảnh hưởng trực tiếp không chỉ đối với công nghệ hệ điều hành mà còn đối với phương thức cộng tác phần mềm hiện đại. Cách nhà phát triển sao chép toàn bộ kho, quản lý commit và nhánh độc lập rồi trao đổi thay đổi mà không cần luôn kết nối với máy chủ trung tâm đã trở nên phổ biến.
Nền tảng máy chủ và Internet
Linux trở thành nền tảng thực thi chính cho máy chủ web, cơ sở dữ liệu, dịch vụ mạng và các nền tảng Internet quy mô lớn. Mã nguồn công khai, môi trường quản trị có thể tự động hóa và phạm vi hỗ trợ phần cứng máy chủ rộng cho phép nhà cung cấp dịch vụ Internet cấu hình hệ thống theo yêu cầu riêng.
Trong môi trường máy chủ dựa trên Linux, người dùng có thể lựa chọn kết hợp phần cứng từ nhiều nhà sản xuất, phần mềm nguồn mở và hỗ trợ thương mại thay vì phải mua hệ điều hành cùng phần cứng của một nhà cung cấp dưới dạng một gói duy nhất.
Trong quá trình này, các phương thức vận hành sau trở nên phổ biến.
- Quản trị dòng lệnh từ xa
- Phân phối tập trung thông qua kho gói
- Tự động hóa cấu hình và xây dựng hệ thống
- Cấu hình hệ điều hành tối thiểu cho từng dịch vụ
- Quản lý nhiều máy chủ như một tập hợp
- Sử dụng giao thức công khai và phần mềm máy chủ nguồn mở
- Tái tạo hệ thống bằng mã và ảnh
Dịch vụ Internet hiện đại không chỉ được cấu thành từ Linux, nhưng Linux đã trở thành nền tảng chung nơi máy chủ web, cơ sở dữ liệu, runtime ngôn ngữ và hệ thống phân tán được thực thi.
Điện toán đám mây
Linux được sử dụng làm hệ điều hành máy chủ và khách, nhân container cùng nền tảng mạng của điện toán đám mây hiện đại.
KVM cho phép Linux được sử dụng như một hypervisor, còn namespace và cgroups trở thành nền tảng cho cách ly container và quản lý tài nguyên. Trên những chức năng này, OpenStack, Docker, Kubernetes cùng nhiều nền tảng đám mây đã phát triển.
Khi Linux được sử dụng rộng rãi trong môi trường đám mây, hệ điều hành không chỉ còn được xem là một sản phẩm cài lâu dài trên một máy chủ vật lý và quản lý thủ công. Nó còn được xử lý như ảnh máy ảo và máy chủ container có thể tự động tạo và thay thế khi cần.
Các phương thức vận hành được phổ biến dưới ảnh hưởng của Linux gồm:
- Hạ tầng dưới dạng mã
- Triển khai máy chủ dựa trên ảnh
- Tự động tạo máy ảo và container
- Cấu hình hệ thống gần như bất biến
- Dịch vụ phân tán và tự động mở rộng
- Mạng được định nghĩa bằng phần mềm
- Quan sát quy mô lớn và tự động phục hồi
Linux trở thành nền tảng để nhà cung cấp đám mây cung cấp nhiều bộ xử lý, thiết bị lưu trữ và công nghệ mạng khác nhau dưới cùng một môi trường hệ điều hành chung.
Hệ sinh thái container
Namespace và cgroups của Linux trở thành thành phần cốt lõi của công nghệ container, cho phép tách biệt nhiều không gian người dùng trên cùng một nhân.
Ảo hóa cấp hệ điều hành phát triển từ các container hệ thống như OpenVZ và LXC, còn Docker phổ biến phương thức đóng gói ứng dụng cùng thành phần phụ thuộc thành ảnh để phân phối. Sau đó, một hệ sinh thái trong đó nhiều công cụ có thể tương tác với nhau được hình thành xoay quanh đặc tả OCI, containerd, CRI-O và Kubernetes.
Container ảnh hưởng đến các phương thức phát triển phần mềm sau.
- Giảm khác biệt giữa môi trường phát triển và vận hành
- Tách biệt thành phần phụ thuộc theo từng ứng dụng
- Triển khai và quay lui theo đơn vị ảnh
- Kiến trúc microservice
- Tích hợp liên tục và triển khai liên tục
- Sử dụng tài nguyên máy chủ với mật độ cao
- Di chuyển ứng dụng giữa các môi trường đám mây
Container không giải quyết mọi vấn đề về ảo hóa và phân phối, nhưng trở thành một ví dụ tiêu biểu cho việc chức năng nhân Linux đã thay đổi đơn vị truyền tải ứng dụng.
Siêu máy tính và tính toán khoa học
Linux đã trở thành nền tảng hệ điều hành chiếm ưu thế trong siêu máy tính và điện toán hiệu năng cao. Theo thống kê họ hệ điều hành của TOP500, Linux xuất hiện như nền tảng chung trên thực tế của các siêu máy tính hiện đại.[118]
Viện nghiên cứu và nhà sản xuất có thể sửa mã nguồn Linux để điều chỉnh cho bộ xử lý và bộ tăng tốc quy mô lớn, mạng tốc độ cao cùng hệ thống tệp song song. Phương thức áp dụng tối ưu hóa riêng cho phần cứng trên một nền tảng Linux chung được mở rộng, thay vì phụ thuộc vào UNIX độc quyền của một nhà sản xuất cụ thể.
Sự phổ biến của Linux cho phép siêu máy tính sử dụng những công cụ phát triển, ngôn ngữ và thư viện nguồn mở tương tự máy chủ thông thường. Một quy trình trong đó chương trình nghiên cứu được phát triển trên máy trạm Linux quy mô nhỏ rồi chuyển sang hệ thống tính toán lớn cũng được hình thành.
Điện toán di động
Việc Android sử dụng nhân Linux đã đưa Linux vượt ra ngoài máy chủ và máy tính dành cho nhà phát triển để trở thành nền tảng của số lượng lớn thiết bị di động tiêu dùng.
Android sử dụng không gian người dùng và hệ thống ứng dụng khác với bản phân phối GNU/Linux thông thường, nhưng nhân Linux vẫn nằm ở nền tảng quản lý tiến trình, bộ nhớ, thiết bị và bảo mật. Nhân Android kết hợp các thay đổi liên quan đến Android trên cơ sở nhân Linux hỗ trợ dài hạn thượng nguồn.[119]
Nhờ đó, nhân Linux được sử dụng trong điện thoại thông minh, máy tính bảng, TV, hệ thống Android dành cho ô tô và nhiều thiết bị tiêu dùng. Ngay cả khi người dùng thông thường không trực tiếp nhận biết tên Linux, họ vẫn tiếp xúc với các môi trường sử dụng nhân Linux.
Sự phổ biến của Android cho thấy Linux có thể được sử dụng làm nhân của một nền tảng ứng dụng độc lập mà không cần môi trường desktop truyền thống.
Hệ sinh thái nhúng và phần cứng
Linux ban đầu được phát triển cho máy tính cá nhân x86, nhưng sau đó được chuyển sang ARM, ARM64, RISC-V, MIPS, PowerPC và nhiều kiến trúc bộ xử lý khác. Tài liệu nhân Linux hiện quản lý riêng nhiều kiến trúc bộ xử lý đa dụng, máy chủ và nhúng.[120]
Nhà sản xuất có thể đóng góp trình điều khiển và mã nền tảng vào nhân thượng nguồn để hỗ trợ bộ xử lý và thiết bị mới trên Linux. Khi mã hỗ trợ được đưa vào nhân chính thức, cùng một phần cứng có thể được sử dụng trong nhiều bản phân phối và sản phẩm, vì vậy khả năng hỗ trợ Linux đôi khi ảnh hưởng đến tính cạnh tranh trên thị trường và mức độ thuận tiện khi phát triển phần cứng.
Trình điều khiển thiết bị, mạng, hệ thống tệp và chức năng quản lý nguồn của Linux cung cấp nền tảng để xây dựng bộ định tuyến, TV, thiết bị lưu trữ, cơ sở công nghiệp và hệ thống ô tô mà không phải phát triển mọi thành phần từ đầu.
Kết quả là Linux vừa được sử dụng như một hệ điều hành đa dụng, vừa như vật liệu để tạo ra hệ điều hành chuyên dụng cho từng sản phẩm.
Cấu trúc cạnh tranh giữa các hệ điều hành
Linux đã thay thế phần lớn vị trí của UNIX thương mại trong thị trường máy chủ và máy trạm. Trước đây, mỗi nhà sản xuất phần cứng thường cung cấp một hệ điều hành thuộc họ UNIX riêng, nhưng khi Linux chạy được trên nhiều kiến trúc và máy chủ, sự ràng buộc giữa phần cứng và hệ điều hành suy yếu.
Doanh nghiệp có thể lựa chọn bản phân phối Linux được nhiều nhà cung cấp hỗ trợ thay vì UNIX của một nhà sản xuất cụ thể, còn nhà sản xuất phần cứng có thể đầu tư vào hỗ trợ Linux thay vì tự duy trì một hệ điều hành đa dụng riêng.
Linux cũng ảnh hưởng đến Windows và macOS. Microsoft hỗ trợ Linux như một nền tảng phát triển và đám mây cốt lõi thông qua WSL và Azure, còn các hệ điều hành tương tự UNIX khác đôi khi cung cấp khả năng tương thích với tệp nhị phân hoặc môi trường phát triển Linux.
Ảnh hưởng của Linux không nằm ở việc thay thế toàn bộ các hệ điều hành khác bằng Linux, mà ở việc khiến các hệ điều hành và nền tảng khác xem ứng dụng, công cụ, container và môi trường máy chủ Linux như những đối tượng tương thích quan trọng.
Tự do sửa đổi và phát triển sản phẩm
Nhân Linux được phân phối theo điều kiện GPL-2.0-only, còn giấy phép áp dụng cho toàn bộ nhân cùng ngoại lệ lời gọi hệ thống được ghi rõ trong mã nguồn chính thức.[121]
Doanh nghiệp và cá nhân có thể nghiên cứu, sửa đổi nhân rồi sử dụng trong máy chủ, thiết bị và sản phẩm hệ điều hành riêng. Các nghĩa vụ giấy phép áp dụng đối với mã nhân phái sinh được phân phối, nhưng ứng dụng không gian người dùng thông thường chạy trên Linux không tự động trở thành GPL.
Cấu trúc này cho phép phần mềm tự do và sản phẩm thương mại cùng tồn tại trong một hệ sinh thái nhân. Doanh nghiệp có thể bán phần cứng, đám mây, dịch vụ hỗ trợ và ứng dụng độc quyền dựa trên Linux, trong khi vẫn công khai chia sẻ những cải tiến của nhân chung.
Văn hóa nhà phát triển
Linux làm giảm ranh giới giữa việc sử dụng và phát triển hệ điều hành. Người dùng có thể đọc mã nguồn nhân và công cụ hệ thống, sửa đổi bản phân phối hoặc trực tiếp cấu hình hệ thống của mình.
Trong môi trường này, những nét văn hóa sau phát triển.
- Xây dựng chương trình từ mã nguồn
- Thay đổi chức năng thông qua bản vá và fork
- Kết hợp dòng lệnh với các công cụ nhỏ
- Chia sẻ tệp cấu hình và tập lệnh tự động hóa
- Lựa chọn bản phân phối và môi trường desktop
- Báo cáo lỗi và đóng góp cho dự án thượng nguồn
- Vận hành máy chủ cá nhân và tự lưu trữ
- Tùy biến chi tiết môi trường người dùng
Linux vừa là một hệ điều hành máy chủ chuyên nghiệp, vừa đóng vai trò môi trường giáo dục và thử nghiệm để người dùng học cấu trúc bên trong của hệ điều hành và trực tiếp thay đổi nó.
Phạm vi ảnh hưởng
Ảnh hưởng của Linux không thể được giải thích bằng một giao diện người dùng cụ thể hoặc thành công của một bản phân phối duy nhất. Điểm cốt lõi là nhiều hệ điều hành, sản phẩm và dịch vụ khác nhau đã được tạo ra trên một nhân Linux chung.
Linux cùng thúc đẩy những thay đổi sau.
- Công nghiệp hóa hoạt động cộng tác phát triển công khai
- Thay đổi cấu trúc sản phẩm của hệ điều hành máy chủ đa dụng
- Phổ biến nền tảng đám mây và container
- Hình thành nền tảng phần mềm chung cho nhiều kiến trúc bộ xử lý
- Việc điện thoại thông minh và sản phẩm nhúng sử dụng nhân Linux
- Phổ biến công cụ phát triển nguồn mở và phương thức cộng tác
- Mở rộng đóng góp thượng nguồn từ nhà sản xuất phần cứng
- Linux ABI và môi trường thực thi trở thành một nền tảng trên thực tế
Linux được phát triển dưới ảnh hưởng của UNIX, nhưng sau đó đã góp phần mở rộng các khái niệm hệ điều hành tương tự UNIX sang máy chủ, thiết bị di động, đám mây và lĩnh vực nhúng, đồng thời ảnh hưởng đến việc hình thành những tiêu chuẩn mới cho công nghệ hệ điều hành.
Ưu điểm và hạn chế
Các đặc tính của Linux có thể trở thành ưu điểm hoặc hạn chế tùy theo mục đích sử dụng, bản phân phối, phần cứng và phương thức vận hành. Khả năng cấu hình tự do vốn là thế mạnh trong môi trường máy chủ và nhúng có thể bị người tiêu dùng phổ thông cảm nhận là phức tạp, còn tốc độ phát triển nhanh cùng nhiều lựa chọn đôi khi tạo ra khác biệt về khả năng tương thích.
Ưu điểm
Mã nguồn công khai và khả năng sửa đổi
Mã nguồn của nhân Linux được công khai và bất kỳ ai cũng có thể nghiên cứu hoặc sửa đổi. Tổ chức có thể bổ sung thiết bị và chức năng cần thiết, đồng thời điều chỉnh hiệu năng cùng chính sách bảo mật cho phù hợp với mục đích sản phẩm.
Quyền truy cập mã nguồn tạo khả năng để nhà phát triển hoặc doanh nghiệp khác tiếp tục bảo trì khi một nhà cung cấp cụ thể ngừng hỗ trợ. Nó cũng cho phép nhà nghiên cứu bảo mật, bản phân phối và nhà sản xuất phần cứng cùng xem xét và sửa một cơ sở mã chung.
GPL tạo nền tảng yêu cầu mã nhân phái sinh được phân phối phải tiếp tục được công khai, qua đó khuyến khích nhiều doanh nghiệp chia sẻ những cải tiến chung.
Khả năng cấu hình rộng
Linux cho phép lựa chọn chức năng theo mục đích, từ thiết bị nhúng nhỏ đến máy chủ quy mô lớn và siêu máy tính.
Nhà xây dựng hệ thống có thể thay đổi các thành phần sau.
- Chức năng và trình điều khiển của nhân
- Thư viện C
- Hệ thống init
- Shell và các lệnh cơ bản
- Hệ thống tệp
- Môi trường đồ họa
- Hệ thống quản lý gói
- Chính sách bảo mật
- Phương thức cập nhật
Trên máy chủ không cần desktop có thể loại bỏ các thành phần đồ họa, còn trên thiết bị nhúng chỉ cần đưa vào những trình điều khiển và chương trình cần thiết.
Hỗ trợ phần cứng đa dạng
Linux hỗ trợ nhiều kiến trúc bộ xử lý và loại thiết bị. Nó có thể được sử dụng không chỉ trên PC và máy chủ đa dụng mà còn trên điện thoại thông minh, bộ định tuyến, ô tô, thiết bị công nghiệp và máy tính bo mạch đơn.[122]
Khi nhà sản xuất phần cứng đóng góp trình điều khiển vào nhân chính thức, nhiều bản phân phối có thể chia sẻ cùng mã hỗ trợ. Phần cứng cũ và thiết bị chuyên dụng đôi khi cũng được hỗ trợ thông qua các nhà phát triển cộng đồng.
Môi trường máy chủ và tự động hóa
Linux cung cấp shell, truy cập từ xa, cấu hình dựa trên văn bản và công cụ quản lý gói, nhờ đó thuận tiện cho tự động hóa máy chủ.
Quá trình cài đặt, cấu hình, cập nhật và giám sát hệ thống có thể được định nghĩa bằng mã, đồng thời hệ thống có thể vận hành hoàn toàn mà không cần môi trường đồ họa. Khả năng hỗ trợ rộng cho container, máy ảo, quản lý cấu hình và công cụ đám mây cũng phù hợp với vận hành quy mô lớn.
Giao diện không gian người dùng ổn định
Nhân Linux xem việc không làm hỏng chương trình không gian người dùng hiện có là một nguyên tắc quan trọng. Nhiều giao diện không gian người dùng, bao gồm lời gọi hệ thống, được quản lý nhằm duy trì khả năng tương thích lâu dài.[123]
Chính sách này làm tăng khả năng chương trình cũ tiếp tục chạy trên nhân mới, đồng thời cho phép nhân cải tiến triển khai nội bộ mà vẫn duy trì khả năng tương thích của không gian người dùng.
Công cụ phát triển và hệ sinh thái phần mềm
Trên Linux có thể tự do sử dụng GCC, LLVM, Git, GDB, nhiều runtime ngôn ngữ cùng các công cụ xây dựng và phân tích. Chương trình máy chủ và đám mây có thể được trực tiếp phát triển, thử nghiệm trong một hệ thống Linux tương tự môi trường vận hành thực tế.
Phần lớn phần mềm máy chủ nguồn mở cung cấp Linux như một nền tảng hỗ trợ chính, còn thư viện và công cụ phát triển có thể được cài đặt qua kho của bản phân phối.
Lựa chọn bản phân phối và phương thức hỗ trợ
Người dùng có thể lựa chọn cấu hình phù hợp với mục đích từ bản phân phối cộng đồng, bản phân phối doanh nghiệp hỗ trợ dài hạn, bản phân phối nhỏ dành cho container và bản phân phối desktop.
Có thể sử dụng hỗ trợ cộng đồng miễn phí hoặc mua hỗ trợ kỹ thuật, chứng nhận và hợp đồng bảo trì dài hạn từ Red Hat, Canonical, SUSE cùng nhiều nhà cung cấp khác.
Khả năng chuyển sang bản phân phối hoặc công ty hỗ trợ khác thay vì chỉ phụ thuộc vào một nhà cung cấp cũng là một ưu điểm.
Chức năng bảo mật
Linux cung cấp người dùng và quyền hạn, capabilities và LSM, SELinux và AppArmor, seccomp, namespace và cgroups, chữ ký mô-đun nhân cùng nhiều chức năng tự bảo vệ.
Tùy theo mục đích hệ thống, có thể loại bỏ gói và dịch vụ không cần thiết rồi áp dụng kiểm soát truy cập bắt buộc cùng sandbox. Quá trình phát triển công khai và các nhóm bảo mật của nhiều bản phân phối cùng tham gia phát hiện và sửa lỗ hổng.
Tuy nhiên, chỉ việc các chức năng bảo mật tồn tại không tự động khiến hệ thống thực tế an toàn; cần cấu hình đúng và cập nhật liên tục.
Chi phí và mô hình kinh doanh
Linux không yêu cầu phí giấy phép theo từng thiết bị để sử dụng nhân, vì vậy có thể được áp dụng cho máy chủ và sản phẩm quy mô lớn. Tổ chức có thể chi trả cho hỗ trợ kỹ thuật, công cụ quản trị, chứng nhận và dịch vụ vận hành thay vì chỉ mua quyền sử dụng phần mềm.
Việc miễn phí tự nó không bảo đảm tổng chi phí vận hành thấp, nhưng quyền truy cập mã nguồn và khả năng lựa chọn nhà cung cấp mang lại sự linh hoạt về giấy phép và chiến lược sản phẩm.
Hạn chế
Sự phân tán của bản phân phối và môi trường
Linux có rất nhiều bản phân phối, môi trường desktop, định dạng gói và phương thức cấu hình hệ thống.
Sự đa dạng này mang lại quyền lựa chọn nhưng cũng tạo ra những gánh nặng sau cho nhà cung cấp phần mềm.
- Nhiều định dạng gói khác nhau
- Khác biệt phiên bản thư viện
- Khác biệt giữa glibc và musl
- Khác biệt về vị trí tệp và cấu hình
- Khác biệt về môi trường desktop và giao diện chủ đề
- Kiểm thử và hỗ trợ theo từng bản phân phối
- Chu kỳ cập nhật khác nhau
LSB, FHS và các đặc tả của freedesktop.org cung cấp nền tảng chung nhưng không thống nhất hoàn toàn mọi bản phân phối và ứng dụng. Các đặc tả của freedesktop.org cũng hướng đến việc nâng cao khả năng tương tác và công nghệ nền tảng chung giữa nhiều desktop phần mềm tự do.[124]
Thiếu phần mềm desktop thương mại
Một số ứng dụng thương mại chuyên nghiệp không cung cấp phiên bản Linux hoặc có chức năng và mức hỗ trợ hạn chế hơn phiên bản Windows hay macOS.
Đặc biệt, một số công cụ thiết kế công nghiệp, phần mềm sản xuất nội dung đa phương tiện, chương trình nội bộ doanh nghiệp và phần mềm quản lý thiết bị ngoại vi có thể không chính thức hỗ trợ Linux. Wine và máy ảo có thể chạy một số chương trình, nhưng không bảo đảm khả năng tương thích hoàn toàn.
Sự phát triển của ứng dụng web và công cụ phát triển đa nền tảng đã làm giảm khác biệt trong một số lĩnh vực, nhưng khả năng hỗ trợ ứng dụng vẫn là một hạn chế lâu dài đối với việc tiếp nhận Linux desktop.
Khác biệt trong hỗ trợ của nhà sản xuất phần cứng
Nhân Linux hỗ trợ phạm vi phần cứng rộng, nhưng không phải mọi nhà sản xuất đều cung cấp trình điều khiển và chương trình quản lý Linux.
Máy tính xách tay và thiết bị ngoại vi mới, thiết bị âm thanh hoặc hình ảnh chuyên nghiệp và một số chức năng GPU có thể được hỗ trợ trước trên Windows hoặc phụ thuộc vào trình điều khiển độc quyền. Với phần cứng không có tài liệu công khai, cộng đồng có thể phải phát triển trình điều khiển bằng kỹ thuật đảo ngược.
Ngược lại, thiết bị cũ đôi khi được Linux hỗ trợ lâu hơn Windows mới, vì vậy ưu và nhược điểm về hỗ trợ phần cứng thay đổi theo từng thiết bị.
Thiếu tính nhất quán trong trải nghiệm người dùng
Linux desktop cho phép lựa chọn KDE Plasma, GNOME, Xfce và nhiều trình quản lý cửa sổ, nhưng mỗi ứng dụng có thể sử dụng GTK, Qt, portal và cơ chế giao diện chủ đề khác nhau, làm hình thức và hành vi không đồng nhất.
Tùy bản phân phối và môi trường desktop, vị trí thiết lập, công cụ cập nhật, chương trình mặc định và quy trình xử lý sự cố có thể khác nhau, khiến tài liệu hỗ trợ cho người dùng phổ thông khó được thống nhất.
Khả năng tùy biến cao là ưu điểm đối với người dùng thành thạo, nhưng có thể trở thành sự phức tạp đối với người muốn một trải nghiệm nhất quán mà không cần cấu hình.
Chi phí học tập cao
Các bản phân phối desktop hiện đại có thể sử dụng ngay sau khi cài đặt, nhưng quản trị nâng cao và xử lý sự cố có thể yêu cầu kiến thức về shell, quyền tệp, dịch vụ, gói và nhật ký.
Các giải pháp trên Internet có thể không phù hợp với bản phân phối và phiên bản đang sử dụng. Nếu làm theo nguyên trạng các lệnh cũ hoặc thay đổi quyền nguy hiểm, trạng thái hệ thống có thể trở nên tồi tệ hơn.
Khả năng cấu hình Linux một cách chi tiết cũng đồng nghĩa người dùng phải đảm nhận nhiều lựa chọn và trách nhiệm hơn.
Thay đổi nhanh và vấn đề tương thích
Nhân Linux cố gắng duy trì ABI không gian người dùng ổn định, nhưng API nội bộ và giao diện mô-đun nhân không được cố định. Tài liệu chính thức giải thích rằng API trình điều khiển nội bộ và giao diện nhị phân của nhân không được ổn định vĩnh viễn.[125]
Trình điều khiển nằm trong cây nhân chính thức được sửa cùng với thay đổi nội bộ, nhưng mô-đun độc quyền bên ngoài có thể không xây dựng được hoặc không hoạt động trên nhân mới. Một số bản phân phối giảm vấn đề này bằng cách duy trì ABI nhân riêng, nhưng đây không phải bảo đảm của toàn bộ mainline.
Trong không gian người dùng, công nghệ đồ họa, âm thanh và desktop thay đổi nhanh cũng có thể gây ra vấn đề tương thích với ứng dụng cũ.
Nhiều chủ thể hỗ trợ
Có thể khó xác định vấn đề của hệ thống Linux phát sinh từ nhân, bản phân phối, trình điều khiển phần cứng, môi trường desktop hay ứng dụng.
Khác với sản phẩm trong đó một doanh nghiệp cung cấp toàn bộ hệ thống, kênh hỗ trợ của từng thành phần có thể bị phân tán. Trên bản phân phối cộng đồng, người dùng đôi khi phải tự báo lỗi đến đúng dự án thượng nguồn.
Bản phân phối doanh nghiệp, chứng nhận phần cứng và hợp đồng hỗ trợ kỹ thuật có thể cung cấp một đầu mối hỗ trợ duy nhất, nhưng đi kèm chi phí bổ sung và hạn chế về cấu hình được hỗ trợ.
Bảo trì dài hạn
Việc đưa Linux vào một sản phẩm không quá khó, nhưng để duy trì an toàn trong thời gian dài cần tiếp tục cung cấp cập nhật bảo mật cho nhân, không gian người dùng, bộ nạp khởi động và ứng dụng.
Một số thiết bị tiêu dùng giá rẻ và sản phẩm nhúng ngừng được cập nhật sau khi bán, khiến chúng tiếp tục sử dụng nhân cũ và không gian người dùng có lỗ hổng. Việc mã nguồn được công khai không có nghĩa nhà sản xuất thực sự cung cấp bản cập nhật cho thiết bị.
Nếu các sửa đổi riêng của sản phẩm khác quá xa nhân thượng nguồn, việc chuyển ngược bản vá bảo mật mới có thể trở nên khó khăn.
Thời gian thực và chứng nhận an toàn
Linux cung cấp PREEMPT_RT và chức năng lập lịch thời gian thực, nhưng trong các hệ thống dùng vi điều khiển rất nhỏ hoặc yêu cầu bảo đảm thời gian nghiêm ngặt, nó có thể phức tạp và nặng hơn một hệ điều hành thời gian thực chuyên dụng.
Trong các lĩnh vực cần chứng nhận an toàn chức năng như ô tô, hàng không, y tế và điều khiển công nghiệp, việc sử dụng toàn bộ Linux đa dụng cho chức năng quan trọng về an toàn đòi hỏi thêm quy trình kiểm chứng và hạn chế.
Các hệ thống này có thể được cấu hình để Linux phụ trách đồ họa, mạng và ứng dụng người dùng, còn hệ điều hành thời gian thực hoặc an toàn riêng đảm nhiệm phần điều khiển cốt lõi.
Mức sử dụng tài nguyên
Linux có thể được cấu hình nhỏ, nhưng một bản phân phối desktop thông thường với môi trường đồ họa hoàn chỉnh và nhiều dịch vụ nền có thể sử dụng lượng bộ nhớ và không gian lưu trữ đáng kể.
Trên thiết bị nhúng nhỏ, phần cứng cần để chạy nhân Linux, đơn vị quản lý bộ nhớ và không gian người dùng có thể là quá lớn. Một cảm biến hoặc thiết bị điều khiển đơn giản có thể được triển khai hiệu quả hơn chỉ bằng firmware hoặc RTOS dành cho vi điều khiển.
Tự do và trách nhiệm
Linux cho phép người dùng sửa đổi hệ thống trên phạm vi rộng, nhưng đồng thời cũng cho phép áp dụng sai nhân, gói, quyền hạn và thiết lập khởi động.
Việc cài đặt gói, tập lệnh và mô-đun nhân ngoài kho chính thức có thể làm giảm bảo mật và độ ổn định. Trách nhiệm lựa chọn một cấu hình an toàn và có thể duy trì giữa nhiều phương án thuộc về người dùng và tổ chức vận hành.
Đánh giá
Thế mạnh lớn nhất của Linux nằm ở quá trình phát triển công khai, khả năng di động rộng, khả năng cấu hình, giao diện không gian người dùng ổn định và hệ sinh thái công nghiệp khổng lồ. Những đặc điểm này đặc biệt có lợi trong các lĩnh vực cần điều chỉnh hệ thống theo mục đích như máy chủ, đám mây, hệ thống nhúng và siêu máy tính.
Ngược lại, sự phân tán của các bản phân phối và không gian người dùng, khác biệt trong phần mềm desktop thương mại và hỗ trợ của nhà sản xuất, độ phức tạp do nhiều lựa chọn cùng gánh nặng bảo trì dài hạn là những hạn chế.
Không thể đánh giá Linux có phù hợp hay không chỉ dựa trên việc nó có miễn phí hay không. Cần đồng thời xem xét ứng dụng và phần cứng cần thiết, yêu cầu bảo mật và thời gian thực, nhân lực vận hành cùng thời gian hỗ trợ.
Tài liệu liên quan
- Nhân Linux
- Bản phân phối Linux
- Hệ điều hành tương tự UNIX
- UNIX
- GNU
- GNU/Linux
- Phần mềm tự do
- Nguồn mở
- Linux Foundation
- Linux Standard Base
- POSIX
- Filesystem Hierarchy Standard
- Phần mềm hệ thống
- Hệ điều hành
- Nhân
- Nhân nguyên khối
- Lời gọi hệ thống
- Hệ thống tệp
- Shell
- Trình quản lý gói
- Máy chủ
- Điện toán đám mây
- Ảo hóa
- Container
- KVM
- Docker
- Kubernetes
- Linux nhúng
- Android
- ChromeOS
- Hệ điều hành thời gian thực
- Các sự cố lỗ hổng bảo mật Linux
- Mô-đun nhân Linux
- Linux namespace
- cgroups
- Git
- Linux.com: Linux là gì? ↩
- Dự án GNU: Câu hỏi thường gặp về GNU/Linux ↩
- Tài liệu nhân Linux: Các kiến trúc CPU ↩
- Tài liệu nhân Linux: Các quy tắc cấp phép của nhân Linux ↩
- Google Groups: Gcc-1.40 and a posix-question ↩
- Wired: The Greatest OS That (N)ever Was ↩
- Google Groups: What would you like to see most in minix? ↩
- Linus Torvalds: LINUX's History ↩
- Google Groups: What would you like to see most in minix? ↩
- Linux 0.12 release notes ↩
- Manchester Linux User Group: MCC Interim Release ↩
- A history of Slackware development ↩
- Debian Project: A Brief History of Debian ↩
- Linux kernel 1.0 source archive ↩
- Wired: IBM Does Linux ↩
- Wired: Open War ↩
- Wired: The Greatest OS That (N)ever Was ↩
- GNU Project: Linux and the GNU System ↩
- GNU Project: GNU/Linux FAQ ↩
- Revolution OS: Linus Torvalds on GNU/Linux ↩
- Alpine Linux: About ↩
- BusyBox FAQ: How do I build a Busybox-based system? ↩
- Chimera Linux: About ↩
- Android Open Source Project: Bionic ↩
- Linux Kernel Documentation: The kernel's command-line parameters ↩
- Linux Kernel Documentation: Early userspace support ↩
- Linux Foundation: Filesystem Hierarchy Standard 3.0 ↩
- Filesystem Hierarchy Standard: The /usr Hierarchy ↩
- systemd manual: systemd System and Service Manager ↩
- GNU C Library Manual: System Calls ↩
- Linux Kernel Documentation: Linux Kernel Makefiles ↩
- Linux Kernel Documentation: The Linux kernel user-space API guide ↩
- Linux Kernel Documentation: Control Group v2 ↩
- Linux Kernel Documentation: Overview of the Linux Virtual File System ↩
- Linux Kernel Documentation: Kernel Self-Protection ↩
- Linux Kernel Documentation: Building External Modules ↩
- Red Hat Enterprise Linux Life Cycle ↩
- SUSE: Product Support Lifecycle ↩
- Ubuntu: Linux Kernel Livepatch ↩
- Canonical: Ubuntu Pro ↩
- Linux Foundation: A Guide to Enterprise Open Source ↩
- Canonical: Landscape ↩
- Linux Kernel Documentation: Linux Security Modules ↩
- Linux Kernel Documentation: Landlock ↩
- Linux Kernel Documentation: Kernel Self-Protection ↩
- NIST NVD: CVE-2016-5195 ↩
- NIST NVD: CVE-2022-0847 ↩
- Linux Kernel Documentation: Hardware vulnerabilities ↩
- Linux Kernel Documentation: Kernel Self-Protection ↩
- Google Security Blog: Fuzzing internships for Open Source Software ↩
- Linux Kernel Documentation: Security bugs ↩
- Linux Kernel Documentation: CVEs ↩
- oss-security: backdoor in upstream xz/liblzma leading to ssh server compromise ↩
- Red Hat: CVE-2024-3094 ↩
- CISA: Reported Supply Chain Compromise Affecting XZ Utils ↩
- Xen Project: Hypervisor ↩
- QEMU Documentation: About QEMU ↩
- LWN: Ten years of KVM ↩
- OpenVZ Wiki: History ↩
- Linux man-pages: namespaces(7) ↩
- Linux Kernel Documentation: Control Group v2 ↩
- LXC: Introduction ↩
- Incus Documentation: About containers and VMs ↩
- Docker: What is a Container? ↩
- Docker: What is a Container? ↩
- LXC: Security ↩
- CMake Documentation: cmake(1) ↩
- Meson Build System: Overview ↩
- KDevelop: A cross-platform IDE ↩
- GNOME Developer Documentation: Builder ↩
- Fastfetch repository ↩
- Linux Kernel Documentation: Linux kernel project continuity ↩
- Linux Kernel Documentation: Subsystem and maintainer tree specific development process notes ↩
- kernel.org: Active kernel releases ↩
- kernel.org: Active kernel releases ↩
- Linux Kernel Documentation: Everything you ever wanted to know about Linux -stable releases ↩
- Linux Kernel Documentation: How the development process works ↩
- kernel.org: Active kernel releases ↩
- Linux Kernel Documentation: Reporting issues ↩
- Linux Kernel Documentation: HOWTO do Linux kernel development ↩
- The Open Group: UNIX Certification Program ↩
- IEEE Standards Association: IEEE/ISO/IEC 9945 ↩
- The Open Group Base Specifications Issue 8 ↩
- GNU C Library Manual ↩
- The Open Group: The UNIX Standard ↩
- Linux Foundation: LSB Specifications ↩
- ISO: ISO/IEC 23360-1:2006 ↩
- ISO Online Browsing Platform: ISO/IEC 23360-2-2:2021 ↩
- IEC Webstore: ISO/IEC 23360-8-2:2021 ↩
- ISO/IEC JTC 1/SC 22 Catalogue: ISO/IEC TR 24715:2006 ↩
- Linux Foundation: Filesystem Hierarchy Standard 3.0 ↩
- FHS 3.0: Background of the FHS ↩
- Linux Kernel Documentation: Linux ABI description ↩
- Linux Kernel Documentation: Exporting kernel headers for use by userspace ↩
- Linux Kernel Documentation: The Linux Kernel Driver Interface ↩
- kernel.org: About Linux Kernel ↩
- TOP500: Operating system family — Linux ↩
- Android Open Source Project: Kernel overview ↩
- Linux Foundation: Automotive Grade Linux SoDeV reference platform ↩
- Linux Kernel Documentation: CPU Architectures ↩
- Linux Kernel Documentation: How the development process works ↩
- Linux Kernel Documentation: Linux kernel project continuity ↩
- Linux Foundation ↩
- kernel.org: The Linux Kernel Organization ↩
- Linux Foundation: Google Renews Platinum Membership ↩
- Linux Kernel Documentation: Introduction ↩
- Linux Kernel Contributor Covenant Code of Conduct ↩
- GNU Project: Linux and the GNU System ↩
- Linux Kernel Documentation: Linux kernel release ↩
- FreeBSD Handbook: Linux Binary Compatibility ↩
- Apple Open Source ↩
- Microsoft Learn: What is the Windows Subsystem for Linux? ↩
- WineHQ: About Wine ↩
- Android Open Source Project: Architecture overview ↩
- Android Open Source Project: Android common kernels ↩
- ChromiumOS Design Documents: Kernel Design ↩
- ChromiumOS: Running Custom Containers Under ChromeOS ↩
- TOP500: Operating system family — Linux ↩
- Android Open Source Project: Kernel overview ↩
- Linux Kernel Documentation: CPU Architectures ↩
- Linux Kernel Documentation: Linux kernel licensing rules ↩
- Linux Kernel Documentation: CPU Architectures ↩
- Linux Kernel Documentation: Linux ABI description ↩
- freedesktop.org Specifications ↩
- Linux Kernel Documentation: The Linux Kernel Driver Interface ↩