Hiện nay ở Việt Nam cũng như trên toàn thế giới, Windows đang là hệ điều hành thống trị trên thị trường desktop và laptop. Ít ai biết đến sự tồn tại của các hệ điều hành khác Windows trong trị trường này. Một vài HĐH trong số đó có thể kể đến như Linux, và phổ biến hơn là macOS, vốn có thiết kế ưu việt hơn và ổn định hơn Windows rất nhiều do lịch sử phát triển của chúng, nhưng lại ít được biết đến hơn với người dùng cơ bản do nhiều lý do chủ quan lẫn khách quan. Hôm nay mình sẽ giới thiệu hệ điều hành đầu tiên trong số đó: Linux, hay chính xác hơn là GNU/Linux. Phần sau của bài viết sẽ giải thích kỹ hơn về tên gọi này. Nhưng trước tiên, chúng ta phải nói hệ điều hành là gì trước đã.

I. Hệ điều hành là gì?

Hệ điều hành (operating system) là hệ thống điều hành các hoạt động của một hệ thống máy tính. Nó hoạt động như một môi trường để các phần mềm khác (như ứng dụng văn phòng, chỉnh sửa ảnh, game, ...) có thể hoạt động được. Nếu không có hệ điều hành, máy tính sẽ không thể nào hoạt động được.
Cần hiểu khái niệm "máy tính" ở đây được hiểu theo nghĩa rộng, có nghĩa là bất kì thiết bị nào có khả năng xử lí tự động kể cả hệ thống điều khiển đèn giao thông, bảng quảng cáo, điện thoại cục gạch, máy chiếu, máy in, máy photocopy, smartphone, tablet, ... Thậm chí những thành phần như con chuột, màn hình, bàn phím, ... cũng được xem là các máy tính đơn giản vì bên trong chúng đều có các vi mạch xử lí tín hiệu, gửi về thứ lớn hơn mà chúng ta hay gọi là "máy tính". Trong tất cả những thứ này, dù đơn giản hay phức tạp, cũng tồn tại những đoạn chương trình đưa ra chỉ thị giúp chúng có thể hoạt động được. Những đoạn chương trình đó được gọi là hệ điều hành. Nếu không có hệ điều hành, những thiết bị đó chỉ đơn giản là một khối vật chất vô hồn.
Nếu hệ điều hành đủ phức tạp (điều khiển các thiết bị như smartphone, laptop, desktop, TV thông minh, ...), người ta sẽ chỉ gọi nó là hệ điều hành. Với những hệ điều hành đơn giản (hoạt động trên điện thoại cục gạch, máy chiếu, ...) người ta sẽ gọi nó là firmware (phần dẻo/phần sụn/phần giữa). Từ đây trở đi, chúng ta chỉ bàn tới các hệ điều hành phức tạp chạy trên các thiết bị từ smartphone hoặc tương tự trở lên.
Mỗi hệ điều hành có cách thức điều hành máy tính khác nhau, nên phần mềm viết ra cho hệ điều hành này không thể nào chạy trên hệ điều hành kia. Mỗi hệ điều hành cũng đều có các ưu nhược điểm khác nhau. Ví dụ như macOS thích hợp để làm việc hơn là giải trí, đặc biệt là các công việc liên quan đến lập trình. Nó có giao diện đẹp, ổn định hơn Windows rất nhiều nhưng nó có ít người dùng vì một phần MacBook có giá thành quá cao (vì vậy gọi là mắcbook sẽ chuẩn hơn), cũng như macOS chơi game khá kém so với Windows trên cùng một phần cứng, mà giới trẻ ở VN cũng như trên thế giới đa phần thích chơi game. Ngoài ra, một số phần mềm đặc dụng như CAD cũng không có phiên bản cho macOS, hoặc có nhưng rất hạn chế về tính năng so với phiên bản dành cho Windows.

II. Unix và Windows

Có thể nói thế giới hệ điều hành ở thời điểm hiện tại (2021) được chia làm 2 nhóm: Windows và không-phải-Windows, mà thường là Unix.
Windows, và không-phải-Windows
Unix-like OSes (họ hệ điều hành tương tự Unix) là tên gọi chung cho các hệ điều hành có nguồn gốc từ Unix (Unix là gì thì các bạn đọc phần dưới sẽ hiểu rõ hơn). Nếu phân loại theo mức độ tương thích dựa trên tiêu chuẩn POSIX, chúng được chia làm 2 nhánh chính:
  •     - POSIX-certified, thường được "dân gian" gọi tắt luôn là Unix (dù khá là không đúng). Nhóm này bao gồm BSD Net1, NeXTSTEP, macOS, SunOS/Solaris, ... Chúng là các hệ điều hành có mã nguồn kế thừa trực tiếp từ Research UNIX ở AT&T (cái này các bạn đọc phần lịch sử ở dưới sẽ hiểu rõ hơn). Chúng tuân theo một số tiêu chuẩn thiết kế hệ thống nhất định để được "chứng nhận" là tương thích hoàn toàn với hệ điều hành Unix. Ở cấp độ phổ thông, nhóm này bây giờ gần như đã tuyệt chủng gần hết, chỉ còn macOS là sống.
    •     - POSIX-compliant, là các hệ điều hành có mã nguồn không kế thừa trực tiếp từ Unix mà được phát triển một cách độc lập, cố "nhái" lại khung sườn của Unix để tạo ra một hệ thống tương thích (compliant) với Unix (bao gồm MINIX, GNU/Linux, Android, FreeBSD, ...). HĐH ở nhóm POSIX-compliant không tương thích hoàn toàn với Unix mà chỉ tương thích một phần (gần như toàn bộ) với Unix mà thôi. Cả 2 cái này mình sẽ bàn kĩ hơn ở cuối bài.
Chú thích: POSIX là tập hợp các tiêu chuẩn cốt lõi trong bộ các tiêu chuẩn phân loại một hệ điều hành có là Unix-like hay không. Thực tế thì POSIX không hoàn toàn nói lên được hệ điều hành đó có là Unix-like hay không, nhưng để đơn giản hóa vấn đề thì chúng ta nên tạm chấp nhận như vậy. 
Linux được phát triển từ Unix, mà Unix vốn là hệ điều hành chính chạy trên các máy chủ của các doanh nghiệp, trường đại học, viện nghiên cứu, ... từ gần 10 năm trước khi Windows ra đời. Windows được phát triển từ MS-DOS (sau này tách ra riêng thành Windows NT - mình sẽ có bài khác nói về Windows), vốn hướng đến đối tượng các doanh nghiệp nhỏ và người dùng cá nhân (gia đình). Cần lưu ý là Linux không phải Unix, chỉ là một HĐH tương tự Unix. Cái này mình sẽ nói đến ở cuối bài sau.
Họ Unix thường là các hệ điều hành đa nhiệm, đa người dùng, có nghĩa là cùng một lúc có thể có nhiều người dùng sử dụng chung một hệ thống máy tính thông qua nhiều trạm teletypewriter kết nối đến một máy tính trung tâm. Windows (ít nhất tới Windows 10 20H2) chỉ là hệ điều hành đơn người dùng (có thể tạo nhiều người dùng nhưng tại một thời điểm chỉ có 1 người dùng có thể sử dụng được).
Hai nhóm hệ điều hành này hướng đến các đối tượng hoàn toàn khác nhau, nhưng môi trường sử dụng của họ Unix trong lịch sử đã làm nó trở nên ổn định và dễ bảo trì hơn Windows. Tuy nhiên, các "con cháu" họ Unix sau này như GNU/Linux, macOS, iOS, Android, firmware của PS4, Nintendo Switch, ... lại được sử dụng rộng rãi cho người dùng cá nhân.
Hiện nay, Linux chỉ chiếm khoảng 2% thị phần máy tính cá nhân, nhưng lại đang thống trị thị trường máy chủ trên Internet với thị phần gần gấp đôi Windows Server. Ngoài ra, từ 2017, Linux đã và đang thống trị 100% thị trường TOP500 siêu máy tính trên toàn thế giới (trước đó là Unix). Bài đọc thêm chi tiết về thông tin này mình sẽ để ở phần tài liệu tham khảo.
Thị phần các HĐH trên TOP500 siêu máy tính (nguồn: Wikipedia)
Những hệ điều hành thuộc họ Unix, nhất là Linux, có tính chất cực kỳ linh hoạt. Chúng có thể hoạt động ở bất cứ đâu, trên gần như bất cứ thiết bị nào (miễn là có đủ sức mạnh xử lí). Từ những chiếc siêu máy tính, đến những chiếc máy tính cá nhân, đến những thiết bị cầm tay nhỏ gọn như điện thoại di động hay máy tính bảng. Android (Linux) và iOS (BSD) đều là những hệ điều hành thuộc họ Unix.
Những cục router wifi nếu đủ mạnh mẽ đều đều được trang bị một phiên bản thu nhỏ của Linux hoặc BSD đóng vai trò như firmware của chúng. Nếu bạn muốn "em yêu khoa học, bạn cũng có thể cài một bản Linux tên là OpenWRT nên chính chiếc router TP-Link của nhà mình để mở rộng thêm nhiều tính năng hơn cho nó. Cần lưu ý là 1 chiếc router TP-Link giá rẻ (ví dụ như TL-WR841N) chỉ có 8 MB "ổ cứng" và 64 MB RAM.

III. Lịch sử của Linux

1. Unix - tiền thân của Linux

Vào năm 1969, phòng thí nghiệm Bell Labs của AT&T (một trong những nhà cung cấp dịch vụ viễn thông lớn nhất Hoa Kỳ) đã phát triển một hệ điều hành gọi là "Unix". Unix ban đầu được viết bằng Assembly (Hợp ngữ), vốn khá khổ biến ở thời đó. Cần lưu ý MS-DOS được phát hành vào tận năm 1981 và 2 năm sau đó Windows mới ra đời. Đôi khi Unix được nhắc tới bởi ký tự 'X' (như trong A/UX hay Mac OS X).
File:Pdp11-unixv7.png - Wikimedia Commons
Giao diện của Unix Version 7, 1979 chạy trong một trình giả lập (nguồn: Wikipedia)
WinWorld: Mac OS X 10.1
Giao diện người dùng của Mac OS X 10.1, 2001 - phiên bản Mac OS đầu tiên xây dựng trên nền Unix (nguồn: WinWorld)
Lúc đó, đĩa mềm vẫn còn là một thứ gì đó khá xa xỉ. Những chiếc máy tính thời đó đã "nhỏ gọn" hơn xưa, khi chỉ còn to bằng vài cái tủ quần áo ghép lại. Dữ liệu của chúng được nạp từ các băng từ (giống như các cuộn băng cát-xét khổng lồ), và thiết bị nhập/xuất chuẩn là các máy teletypewriter (nhìn giống như máy đánh chữ). Các bạn có thể xem thêm ở video này.
PDP-7 - Wikipedia
Máy tính PDP-7, 1965 (nguồn: Wikipedia)
Unix được thiết kế theo hướng module hóa "do one thing and do it well", gọi là "Unix Philosophy" (Triết lý Unix). Nó khá là khó dịch cho đầy đủ nghĩa nên mình sẽ để bản tiếng Anh gốc ở đây (nguồn từ Wikipedia):
1. Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features". 
2. Expect the output of every program to become the input to another, as yet unknown, program. Don't clutter output with extraneous information. Avoid stringently columnar or binary input formats. Don't insist on interactive input.
3. Design and build software, even operating systems, to be tried early, ideally within weeks. Don't hesitate to throw away the clumsy parts and rebuild them.
4. Use tools in preference to unskilled help to lighten a programming task, even if you have to detour to build the tools and expect to throw some of them out after you've finished using them.
Năm 1971, Unix đã được viết lại bằng ngôn ngữ C. Thực ra C ban đầu sinh ra để viết các phần mềm ứng dụng cho Unix.
Do Luật Chống độc quyền của chính phủ Mỹ, AT&T bị buộc phải công bố mã nguồn của Unix cho bất cứ người nào có nhu cầu. Kết quả là Unix đã phát triển nhanh chóng, được các tổ chức học thuật và doanh nghiệp sử dụng rộng rãi. Các nhánh lớn của Unix có thể kể đến như:
    - Berkeley Software Distribution (BSD): được phát triển bởi Đại học California, Berkeley. BSD là một trong các nhánh lớn nhất của Unix còn sống tới hiện nay. BSD là nền tảng cốt lõi của các hệ điều hành Apple hiện đại như macOS, iOS, tvOS, …, firmware của các hệ máy console như PS4, Nintendo Switch, …
    - Ngoài ra, chúng ta còn có Xenix (Microsoft), SunOS/Solaris (Sun Microsystems, hiện nay là Oracle), AIX (IBM), ...
Các hệ điều hành kể trên đều là POSIX-certified (các bạn có thể đọc thêm về tiêu chuẩn POSIX ở đây: https://en.wikipedia.org/wiki/POSIX).
Cần nói thêm một tí, các phần mềm hệ thống trong Unix có thể được đơn giản hóa (một cách rất đơn giản) thành 2 phần chính: kernel (hạt nhân) và bộ các công cụ hệ thống (system utilities, bao gồm các lệnh ls, cat, awk, find, grep, cd, shell, ...). Qua các phần mềm hệ thống (đang xét đến riêng nhóm này), người dùng có thể ra lệnh cho hạt nhân của hệ điều hành điều khiển phần cứng của máy tính để thực hiện các tác vụ tính toán cần thiết.
Năm 1984, lệnh chống độc quyền đối với AT&T đã kết thúc, nên họ đã biến Unix trở thành một phần mềm độc quyền (mã nguồn đóng) để kinh doanh.
Một năm trước đó (1983), một dự án phần mềm miễn phí là GNU Project (viết tắt đệ quy của GNU is Not Unix) đã được thiết lập bởi Richard Stallman nhằm mục đích viết ra một hệ điều hành tương thích hoàn toàn với Unix (gọi là Unix-like, hay "tương tự Unix"), toàn bộ được cấu thành bởi các phần mềm miễn phí (và mã nguồn mở). 
Cần nhấn mạnh lại là GNU và các hệ điều hành Unix-like khác không phải là Unix mà chỉ được thiết kế dựa trên khung sườn của Unix. Nghĩa là, mục tiêu của dự án GNU là viết lại hoàn toàn một hệ điều hành có cấu trúc và hành vi "ăn theo" hệ điều hành Unix (bao gồm bộ công cụ cốt lõi như ls, cat, awk, find, grep, cd, ...) mà không kế thừa từ mã nguồn của Unix gốc như các hệ điều hành BSD, AIX, .... Do đó, GNU là một hệ điều hành POSIX-compliant.
Năm 1987, một giáo sư khoa học máy tính tên là Andrew S. Tanenbaum đã viết một hệ điều hành Unix-like tối giản tên là MINIX nhắm đến đối tượng các sinh viên muốn tìm hiểu về hệ điều hành. Tuy nhiên, nó bị giới hạn chỉ được sử dụng trong môi trường giáo dục.
Đầu những năm 90, đa phần các chương trình cơ bản của GNU Project như trình biên dịch, bộ thư viện, trình soạn thảo văn bản, command line shell, ... đã hoàn thiện. GNU chỉ còn thiếu một kernel tương thích với Unix để có thể tạo thành một hệ điều hành hoàn chỉnh. Kernel mà họ đang viết cho hệ điều hành này, gọi là GNU Hurd, đang lâm vào bế tắc.
Cần phải nói thêm, g++, trình biên dịch C++ được sử dụng phổ biến nhất hiện nay là một thành phần của GCC, viết tắt của GNU Compiler Collection (trước kia là GNU C Compiler).

2. Linux

Năm 1991, một chàng sinh viên trẻ đang học tại Đại học Helsinki (Phần Lan) tên là Linus Torvalds cảm thấy rất hứng thú với các thể loại hệ điều hành, đặc biệt là MINIX. Nhưng anh này cảm thấy khá bức xúc vì MINIX bị giới hạn chỉ được dùng trong môi trường giáo dục nên đã chơi lớn, viết ra luôn một kernel của riêng mình, và gọi nó là Linux.
Thời gian đầu, Linux sử dụng các phần mềm hệ thống từ dự án MINIX. Tuy nhiên khi đã có được nền tảng vững chắc, Linus, với sự trợ giúp của các lập trình viên, đã quyết định tích hợp các chương trình trong dự án GNU với kernel Linux của mình để tạo nên một hệ điều hành hoàn chỉnh, được phát hành với giấy phép GNU GPL, đảm bảo cho người dùng cuối tự do chạy, nghiên cứu, sửa đổi và chia sẻ các phần mềm.
Hệ điều hành hoàn chỉnh được cấu thành bởi kernel Linux và bộ phần mềm GNU được gọi là Hệ điều hành GNU/Linux, mà hiện nay thường được gọi tắt là Linux. Thực tế, Linux không phải là hệ điều hành mà chỉ là cái lõi bên trong mà thôi. Tất cả các "lệnh Linux" như cd, ls, cat, find, ... thực chất là các lệnh của bộ công cụ GNU. Nói chính xác hơn, đây là các lệnh của của tiêu chuẩn POSIX, được implement (triển khai) bởi dự án GNU. Các lệnh này sau đó mới giao tiếp với kernel (hạt nhân) của hệ điều hành, là Linux để ra lệnh cho phần cứng thực hiện các tác vụ cần thiết. 
Cái lõi Linux đó có thể kết hợp với các bộ phần mềm khác để tạo ra các hệ điều hành khác nhau, ví dụ như Android được kết hợp từ kernel Linux và các thành phần khác do Google (ban đầu là Công ty Android) phát triển, không dùng các phần mềm từ bộ GNU. Có nghĩa là, Android cũng có các lệnh cd, ls, cat, ... nhưng các lệnh đó không phải là các lệnh của bộ công cụ GNU, mà là các lệnh của một bộ công cụ tên là toybox do Google phát triển. Toybox chỉ bao gồm một số lệnh cơ bản của tiêu chuẩn Unix nên rõ ràng không thể làm việc đầy đủ như một máy tính Linux thực thụ được, dù bản thân Android  có thể được xem là một Linux distro (Linux Foundation và Google đều đồng ý về cách gọi này).
Hình trên là giản đồ bao gồm, nhưng không giới hạn đến các nhánh chính của Unix. Trong đó Linux và GNU (và vài thằng khác) không phải là "cháu ruột" (một nhánh chính thức) của Unix mà chỉ là "con nhận nuôi" (có thiết kế tương tự) mà thôi. Chúng ta cũng thấy được 2 thằng iOS và Android mà fan chọi đá nhau vỡ đầu thực chất cũng là họ hàng xa của nhau.
[Đón đọc phần 2: Cấu trúc hệ điều hành Linux]

Về tên gọi *nix/Unix-like: đây là chủ đề được bàn tán sôi nổi từ tận khi Unix bị chia thành nhiều nhánh cho đến tận ngày hôm nay. Vì Unix là một nhãn hiệu kinh doanh, nên ngay cả các hệ thống phát triển trực tiếp từ Unix như AIX, A/UX cũng không thể tự gọi chúng là Unix, mà là Unix-like (tương tự Unix) để tránh bản quyền. Ngoài cách phân loại theo tiêu chuẩn POSIX như đã nêu ở đầu bài, ta có thể phân loại lại thành 2 nhánh chính như sau (ngoại trừ nhánh số 1):
  a) Hệ điều hành Unix gốc (Research UNIX) phát triển ở AT&T.
  b) Các hệ điều hành có mã nguồn kế thừa trực tiếp từ Unix: BSD Net1, AIX HP-UX, Solaris, ... (thường được gọi là genetic Unix).
  c) Các hệ điều hành phát triển độc lập với Unix, cố gắng "nhái" lại Unix: FreeBSD, macOS, MINIX, GNU Hurd, GNU/Linux, ...
Thường người ta sẽ xem nhóm (b) là những hệ điều hành "con cháu" trực tiếp của Unix, và trong các biểu đồ người ta sẽ thường gọi chung bọn nó là Unix luôn. Linux thì người ta sẽ tách ra thành một nhóm riêng vì nó không phải con cháu gì cả. Tuy nhiên cũng có một số người gộp chung cả (b) và (c) lại và gọi chung bọn nó là Unix.
Cách phân loại này sẽ chính xác hơn vì POSIX nói chung là một tập các tiêu chuẩn giữa các hệ điều hành Unix/Unix-like với nhau và các hệ điều hành khác. Thực tế nếu bạn cài MSYS2, MinGW, Cygwin, ... lên Windows thì lúc đó Windows cũng có thể được xem là tuân thủ theo tiêu chuẩn POSIX, dù nó chẳng liên quan gì đến Unix (ta không xét WSL, vì bản thân distro chạy trong WSL là một máy ảo Linux gần như hoàn chỉnh, có kernel riêng, hoạt động độc lập với NT kernel của Windows).
Tuy nhiên, trong nhóm "nhái" lại có những cái "nhái" giống hơn (như hàng nhái loại 1, loại 2, ...). Độ "nhái" này được đo bằng tiêu chuẩn POSIX như mình đã nói ở trên (lúc này đã giới hạn lại chỉ trong tập hợp các hệ điều hành Unix-like). Ví dụ, macOS "nhái" Unix giống hơn là Linux.
Ghi chú: FreeBSD là sản phẩm được phát triển "chính thống" từ các nhà phát triển của BSD Net1 (phiên bản đầu tiên của BSD), nhưng để tránh bản quyền (do trong BSD Net1 có chứa mã nguồn của Unix, sau này bị biến thành một sản phẩm thương mại) nên họ quyết định thay thế tất cả mã nguồn độc quyền của Unix bằng mã nguồn của chính họ, vì thế nên BSD đã chuyển từ Unix gốc sang tương tự Unix như ngày nay.
Other parties frequently treat "Unix" as a genericized trademark. Some add a wildcard character to the name to make an abbreviation like "Un*x" or "*nix", since Unix-like systems often have Unix-like names such as AIX, A/UX, HP-UX, IRIX, Linux, Minix, Ultrix, Xenix, and XNU.

Tài liệu tham khảo