![i-love-linux](https://viblo.asia/uploads/0bfc8566-bb1f-4e8e-8fe0-bd537a86d500.jpeg) # Lời mở đầu Thời gian gần đây, tôi có nhiều hứng thú và muốn tìm hiểu về **Infrastructure**, một lĩnh vực tôi thấy là quá sức rộng lớn nhưng mà kiến thức bản thân thì quá ư là hạn hẹp (facepalm). Sau một vài tháng tìm hiểu, học tập, đọc sách, tôi cảm thấy thế giới của Linux thật là hấp dẫn và lôi cuốn. Tôi nhận ra một điều, đó là: > I love Linux Và đó cũng chính là động lực để tôi bắt đầu viết series mới này, **Become A SuperUser**. Tôi sẽ cố gắng viết ra những gì mình biết, những gì mình học được về thế giới của Linux, bởi tôi luôn nghĩ rằng viết ra những kiến thức mà mình học được sẽ giúp mình hiểu và nhớ chúng hơn. Cũng đã lâu lắm rồi, kể từ hồi tôi viết series về Laravel mang tên [Laravel Beauty](https://viblo.asia/thangtd90/posts/6BAMYk9Evnjz) , tôi mới lại có cảm hứng viết bài trên Viblo như thế này. Hy vọng series về Linux sẽ có ích cho nhiều bạn, và nhận được nhiều phản hồi tích cực như series về Laravel trước đây vậy. Trong bài viết đầu tiên của Series **Become A SuperUser**, tôi sẽ không bắt đầu ngay đi vào các vấn đề kỹ thuật của Linux, mà thay vào đó, tôi sẽ kể cho các bạn về câu chuyện lịch sử phát triển của nó, cũng như mối quan hệ giữa Linux với hệ điều hành nổi tiếng khác là Unix. Sở dĩ tôi rất muốn viết ra một bài như thế này là bởi chính bản thân tôi cũng đã từng có rất nhiều hiểu nhầm về Linux, và tôi nghĩ rằng cũng sẽ có nhiều người cũng có những hiểu nhầm giống như tôi. Tôi hy vọng rằng qua bài viết này, các bạn có thể có được một cái nhìn tổng quát về thế giới của Linux, trước khi đi sâu hơn về nó trong những bài viết tiếp theo. Hãy cùng bước vào thế giới của Linux nhé. # Unix & BSD Nhắc đến Linux thì trước tiên, ta phải quay ngược thời gian để tìm hiểu về một cái tên khác, đó là **Unix**. Unix là một hệ điều hành vốn ra đời đã từ rất lâu, tại phòng thí nghiệm Bell Labs của AT&T. Dự án được dẫn dắt bởi **Ken Thompson** và **Dennis Ritchie**, 2 nhà khoa học máy tính nổi tiếng. Công việc phát triển Unix chính thức được bắt đầu vào mùa hè năm 1969, và phiên bản đầu tiên của Unix được ra đời vào tháng 3 năm 1971, tiếp đó là phiên bản thứ 2 ra đời năm 1972. Ngoài lề một chút, nếu bạn gõ lệnh `date` trên một máy Linux, hay trên MacOS ... bạn sẽ nhận được một con số gọi là Unix Timestamp. Con số này là số giây tính từ thời điểm 00:00:00 ngày 1 tháng 1 năm 1970. Còn tại sao lại là thời điểm ngày 1 tháng 1 năm 1970 thì chắc giờ bạn cũng có câu trả lời rồi nhỉ. Đó chính là thời thời điểm mà Unix đang nằm trong quá trình phát triển đấy :D Ngoài lề một chút nữa, 2 thánh Ken Thompson và Dennis Ritchie chính là 2 người đã tạo ra B, ngôn ngữ lập trình vốn được support ở Unix những phiên bản đầu. Sau đó, vào năm 1972, Ritchie đã viết lại ngôn ngữ B, cải thiện nó tốt hơn, **để trở thành ngôn ngữ lập C**, ngôn ngữ lập trình còn rất phổ biến cho đến tận ngày nay. Hầu hết các components của Unix sau này đều được viết bằng C. Những năm sau của thập niên 70, AT&T chia sẻ Unix cho những tổ chức giáo dục, hay tổ chức thương mại bên ngoài, từ đó dẫn đến sự ra đời của nhiều phiên bản Unix khác nhau. Nổi bật nhất trong số đó là phiên bản giáo dục được xây dựng bởi Computer Systems Research Group thuộc **đại học California, Berkeley**. Phiên bản này được biết đến rộng rãi với cái tên **Berkeley Software Distribution**, hay **BSD**. Ban đầu, BSD được xây dựng dựa trên codebase cũng như design của Unix, tuy nhiên càng về sau, các phiên bản của Unix và BSD càng có những điểm đặc trưng, khác biêt, dẫn đến việc xảy ra những "cuộc chiến" để trở thành "tiêu chuẩn" giữa phiên bản Unix BSD và phiên bản Unix của AT&T mang tên mã System V. Kết quả là phần thắng thuộc về System V. Các phiên bản BSD sau đó đã xích gần lại System V hơn với việc học tập và đưa vào những tiêu chuẩn chung đã được công nhận. Nhánh BSD đi đến hồi kết của quá trình phát triển lịch sử của nó, với sự ra đời và của các open source project như: **FreeBSD**, **NetBSD** và **OpenBSD**. Phiên bản cuối cùng của BSD được giới thiệu năm 1995. Trong khi đó, phiên bản cuối cùng của Unix được phát triển bởi Bell Laps, phiên bản Unix 10, được ra mắt vào năm 1989. Mặc dù phiên bản chính thức của Unix, BSD đã dừng phát triển từ lâu, thế nhưng những di sản mà chúng để lại là rất lớn cho đến ngày hôm nay. Rất nhiều hệ điều hành, từ close source cho đến open source đựa dựa trên 2 nhánh này. Phiên bản thương mại, close source nổi tiếng, thành công nhất, có lẽ chính là MacOS đình đám của Apple. MacOS cũng như các hệ điều hành khác của Apple hiện nay là iOS, watchOS, và tvOS đều được dựa trên nền tảng của BSD. Và MacOS cũng là một trong số ít các hệ điều hành được coi là **Unix-like**, khi có được chứng nhận **Single UNIX Specification**. Chúng ta sẽ còn nói rõ hơn về khái niệm Unix-like ở phần cuối của bài viết này. # GNU Trong dòng chảy của sự phát triển của Unix, năm 1983 đã diễn ra một sự kiện quan trọng, là tiền đề cho những biến động lớn sau này. Tháng 9 năm 1983, **Richard Stallman** thông báo về sự ra đời của dự án **GNU** (GNU là viết tắt của từ **GNU's not Unix** =))) ![GNU](https://viblo.asia/uploads/8c79cedf-b5fc-4e88-885c-46a5d1c5591f.png) *Biểu tượng quen thuộc của GNU* Mục tiêu của dự án GNU là tạo ra được một hệ điều hành miễn phí, **giống** Unix, nơi mà mọi người có quyền tự do copy, phát triển, chỉnh sửa và phân phối phần mềm, và việc tái phân phối là không bị giới hạn. (Nên nhớ, Unix và các phiên bản rẽ nhánh từ Unix ban đầu đều là close source và bị ràng buộc bản quyền) Năm 1985, Richard thành lập tổ chức **Free Software Foundation**, hay [FSF](http://www.fsf.org/), một tổ chức phi lợi nhuận muốn thúc đẩy sự tự do trong trong phát triển phần mềm. Project GNU đã tạo ra được rất nhiều sản phẩm quan trọng như **GNU Compiler Collection (gcc)**, **GNU Debugger**, **GNU Emacs text editor (Emacs)**, **GNU build automator (make)** ... Ngoài ra còn phải kể đến giấy phép nổi tiếng được sử dụng rộng rãi nhất hiện nay: **GNU General Public License (GPL)** GNU Project đã đạt được nhiều thành tựu lớn, tạo ra được nhiều công cụ tương tự như những gì có trên Unix. **Tuy nhiên, GNU vẫn thiếu một thành phần quan trọng, mảnh ghép cuối cùng để nó trở thành một hệ điều hành hoàn chỉnh**. Đó chính là **Kernel**, phần thực hiện công việc điều khiển, giao tiếp với các thiết bị phần cứng (CPU, RAM, Devices ...). Và Linus Torvalds xuất hiện ... # Linux Ngày 25 tháng 8 năm 1991, một cậu sinh viên ở Phần Lan mang tên Linus Torvalds giới thiệu một sản phẩm cá nhân, sau này trở thành Linux Kernel. Đây là những gì Linus đã viết trên newsgroup ở Usenet: > I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since April, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). <br> > I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months [...] Yes - it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(. <br> > [...] It's mostly in C, but most people wouldn't call what I write C. It uses every conceivable feature of the 386 I could find, as it was also a project to teach me about the 386. As already mentioned, it uses a MMU, for both paging (not to disk yet) and segmentation. It's the segmentation that makes it REALLY 386 dependent (every task has a 64Mb segment for code & data - max 64 tasks in 4Gb. Anybody who needs more than 64Mb/task - tough cookies). [...] Some of my "C"-files (specifically mm.c) are almost as much assembler as C. [...] Unlike minix, I also happen to LIKE interrupts, so interrupts are handled without trying to hide the reason behind them. <br> Project của Linus nhanh chóng nhận được sự chú ý cùng với đó là những đóng góp của nhiều cá nhân, tổ chức. Sự kết hợp giữa nhân Linux, với các phần mềm của GNU đã tạo ra một hệ điều hành hoàn chỉnh, hệ điều hành hoàn toàn miễn phí đầu tiên. Nó được mang tên **GNU/Linux**. Thực tế hiện nay vẫn còn rất nhiều hiểu nhầm liên quan đến Linux. Bản thân tôi cũng đã từng trải qua thời gian dài hiểu nhầm như vậy :D Và dưới đây là một số điểm chắc bạn cũng có thể rút ra được khi đọc bài viết từ đầu đến giờ :D - Bản thân Linux chỉ là một Kernel, nó không phải là một hệ điều hành hoàn chỉnh. Hệ điều hành mà các bạn có thể vẫn đang sử dụng thực tế trên máy tính của mình có tên là **GNU/Linux**, nhưng có lẽ vì cái tên nó dài dòng nên người ta đã gọi ngắn gọn nó là Linux chăng. Việc lược bỏ đi GNU trong tên gọi hệ điều hành được cho là không công bằng, và đánh giá thấp vai trò của GNU. Tuy nhiên, biết sao được, nhiều người vẫn dùng cái tên Linux để thay cho tên gọi hệ điều hành GNU/Linux. Và khi nhắc đến Hệ Điều Hành Linux, ta cần hiểu đó là Hệ Điều Hành GNU/Linux. Trong series này tôi cũng sẽ sử dụng cách gọi đó, hệ điều hành Linux. - Hệ điều hành Linux hoàn toàn không sử dụng chung, hay kế thừa bất kỳ phần code nào của Unix, hay BSD. Nó được xây dựng mới hoàn toàn bởi Linus và GNU Project để có thể trở thành ... một phiên bản clone của Unix. Chính vì thế Linux và các hệ điều hành con cháu của Unix hiện nay (như MacOS chẳng hạn) có rất nhiều điểm giống nhau. Tôi đã từng thấy một anh hỏi về việc chạy lệnh `grep` trên Linux thì có option là `-P`, nhưng trên máy Mac của anh ý thì lệnh `grep` không có option đó, vậy phải giải quyết thế nào. Trước tôi cứ nghĩ mấy lệnh như `ls`, `cat`, `grep` ... các kiểu thì vốn nó chỉ là chung một ruột, dù chạy trên MacOS hay Linux đi chăng nữa. Thế nhưng hôm đó tôi mới nhận ra là hoá ra chúng là 2 công cụ khác nhau. Chạy lệnh `grep --help` hay `man grep` trên Ubuntu tôi nhận được một lời giới thiệu về phiên bản của **GNU**, còn chạy trên máy Mac, tôi nhận được thông báo về phiên bản **BSD**. Đương nhiên phần lớn các công cụ của GNU và BSD (Unix) sẽ giống nhau đến từng option một, thế nhưng cũng có những ngoại lệ đấy. Thi thoảng nếu bạn gặp phải trường hợp command trên máy Mac nó lại khác với command mình vẫn dùng trên máy Linux thì cũng đừng quá bất ngờ nhé. Và để sử dụng được command giống với trên Linux thì cách giải quyết cũng rất đơn giản thôi, bạn chỉ cần cài đặt biên bản của **GNU** lên máy Mac của mình thay thế cho phiên bản mặc định là được. Rất may là chúng chạy rất ổn định và có thể cài đặt dễ dàng bằng `homebrew` đấy. # Linux Distribution Linux chỉ là phần Kernel, còn GNU cung cấp các công cụ cần thiết chạy trên Kernel đó. Tuy nhiên, việc config Kernel như thế nào, cài đặt, sử dụng các phần mềm nào thì ta có thể tự do quyết định. Một số các tổ chức, công ty giúp chúng ta làm sẵn những việc đó với việc phối kết hợp Linux Kernel với các utilities, hay package manager để tạo ra một bản phân phối một hệ điều hành hoàn chỉnh. Chúng được gọi là **Linux Distribution**, hay **Distro**. Ngày nay, có vô vàn các bản phân phối Linux, nhiều cái rất quen thuộc, phổ biến, và cũng có nhiều distro có thể bạn còn chưa được nghe tên bao giờ. Một số Distro được sử dụng nhiều nhất có thể kể ra như Ubuntu, Debian, CentOS, Fedora, Redhat, Linux Mint .... Các Distro có thể được build dựa trên một Distro khác, dẫn đến việc một Distro có thể coi là cháu chắt của một Distro khác. Do đó, thực tế thì những Distro mà tôi kể ở trên chúng có nhiều quan hệ mật thiết với nhau lắm đấy :D Lại kể một chút câu chuyện về các Linux Distribution vậy. 2 Distro lâu đời nhất (và vẫn còn active đến thời điểm hiện tại) là `Slackware` và `Debian`. Chúng được tạo ra từ năm 1993. Các Distro con cháu của Slackware thì tôi không biết mấy, thế nhưng các Distro con cháu của Debian thì thực sự hiện đang làm mưa làm gió. Nhánh con cháu của Debian có lẽ cũng là nhánh Distro lớn nhất luôn. Bên cạnh chính bản thân Debian, những gương mặt nổi bật của nhánh này có thể kể đến đó là Ubuntu (được build dựa trên Debian), Linux Mint (được build dựa trên Ubuntu), hay Kali Linux. Ngoài ra, không thể không kể đến một nhánh Distro nổi tiếng khác, đó chính là `Redhat`, với Distro chủ đạo là **Red Hat Enterprise Linux (RHEL)**, một trong những Distro hướng tới khách hàng Enterprise của người khổng lồ Redhat. Bên cạnh việc cung cấp RHEL với tư cách là một Distro trả phí, thì Redhat còn cung cấp một Distro khác miễn phí cho cộng đồng, đó là **Fedora**. Thực tế thì các phiên bản Fedora thường được ra mắt thử nghiệm trước để lấy feedbacks và fix lỗi, sau đó RHEL sẽ được xây dựng trên phiên bản Fedora đã ổn đinh. Ngoài ra Redhat còn cung cấp miễn phí source code của hầu hết các thành phần trên RHEL, và cộng đồng có thể từ đó xây dựng lên phiên bản Distro ... "giống" với RHEL. Cái tên nổi bật nhất trong số này chính là **CentOS** (Community Enterprise Operating System). CentOS là một sản phẩm của cộng đồng (không phải là được Redhat support), hoàn toàn miễn phí với mong muốn đem lại một Distro với chất lượng Enterprise-class tương tự như RHEL (đương nhiên đồ miễn phí thì không bằng hàng chính chủ có phí được, nhưng CentOS vẫn được đánh giá rất cao) Bạn có thể theo dõi danh sách cụ thể các Linux Distro và sự phụ thuộc lẫn nhau giữa chúng thông qua [biểu đồ này](https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg) Để học tập và làm quen với Linux, thì theo ý kiến cá nhân của tôi, Ubuntu (hoặc Debian) cùng CentOS sẽ là bộ đôi mà bạn nên làm quen. Nó sẽ giúp bạn có được cái nhìn tổng quan, cũng như sự khác biệt giữa 2 nhánh Debian và Redhat. Bản thân tôi cũng có 2 cái máy ảo Ubuntu và CentOS để dùng mỗi khi cần =)) Bên cạnh Linux Distribution, hệ điều hành sử dụng nhân Linux và các thành phần của GNU, thì cũng có các hệ điều hành khác chỉ dựa trên nhân Linux. Và nổi bật nhất trong số đó chính là Android. Android có lẽ chính là hệ điều hành sử dụng nhân Linux phổ biến nhất cũng nên =)) # Linux Kernel version Tính đến thời hiểm hiện tại (7/1/2017), thì phiên bản Linux Stable mới nhất là 4.9. Bạn có thể check danh sách các bản release Linux kernel ở trang chủ của dự án tại https://www.kernel.org/ Ngoài ra, để kiểm tra version Kernel trên Distro mà bạn đang sử dụng, bạn có thể dùng lệnh `uname -r`. Ví dụ ``` $ uname -r 4.8.6-x86_64 // HDH của tôi đang sử dụng nhân Linux 4.8.6 dành cho máy tính x86_64, tức máy tính sử dụng vi xử lý Intel ``` Sử dụng lệnh `uname -a` sẽ in ra toàn bộ thông tin về hệ thống, hay `uname -o` sẽ in ra thông tin về tên hệ điều hành. Và khi đó bạn sẽ nhận được kết quả là tên hệ điều hành là `GNU/Linux` đấy, chứ không phải chỉ là Linux đâu. # Unix-like Ở phần đầu, tôi đã nhắc đến việc MacOS là một trong số ít các hệ điều hành được chứng nhận của **Single UNIX Specification (SUS)**, và được coi là một hệ điều hành **Unix-like**. Hiện thương hiệu **UNIX** thuộc bản quyền của tổ chức [The Open Group](http://www.opengroup.org/) (chú ý là các chữ cái trong tên thương hiệu UNIX đều được viết hoa, trong khi để chỉ hệ điều thành thì ta có thể viết Unix hoặc UNIX). Khái niệm "Unix-like" vốn được dùng để chỉ những hệ điều hành có được chứng nhận SUS, và có thể sử dụng thương hiệu UNIX. Một câu hỏi đặt ra là: Vậy theo định nghĩa ở trên thì Linux có phải là một hệ điều hành "Unix-like" hay không? Đáng tiếc câu trả lời là **Không**. Đã từng có dự án giúp Linux đạt được SUS, nhưng cuối cùng không đi đến đâu cả, và hiện tại các Distro Linux cũng không được phép sử dụng trademark UNIX. Bên cạnh cách hiểu "Unix-like" như là một phần gắn kèm với SUS, còn có những ý kiến cho rằng nên dùng từ Unix-like theo nghĩa rộng hơn. Cụ thể, có thể chia ra làm 3 loại Unix-like: - **Genetic UNIX**: Chỉ những hệ điều hành có liên quan trực tiếp đến codebase của phiên bản Unix của Bell Labs. - **Trademark UNIX**: Những hệ điều hành thoản mãn yêu cầu SUS và có thể sử dụng thương hiệu UNIX. - **Functional UNIX**: Những hệ điều hành "hoạt động giống Unix", và Linux có thể được xếp vào loại này. Dưới đây là một biểu đồ đơn giản mô tả quá trình hình thành và phát triển của Unix cũng như những hệ điều hành liên quan mật thiết đến Unix. ![unix-like](https://viblo.asia/uploads/1802c68e-9cd5-494f-9c20-1381bcc66ee3.png) # Lời kết Như vậy là tôi đã có thể giới thiệu qua về một vài điểm quan trọng trong thế giới của Linux, cũng như mối quan hệ lịch sử giữa Linux với Unix. Hy vọng có thể giúp các bạn giải đáp được những thắc mắc (nếu có) bấy lâu nay của mình :D Hẹn gặp lại trong bài viết tiếp theo của series **Become A SuperUser** này. ^^. # References - http://www.computerhope.com/history/unix.htm - http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/history.html - https://en.wikipedia.org/wiki/Unix - https://en.wikipedia.org/wiki/Linux - https://en.wikipedia.org/wiki/Linux_distribution - https://en.wikipedia.org/wiki/Berkeley_Software_Distribution - https://en.wikipedia.org/wiki/Unix-like - https://en.wikipedia.org/wiki/Single_UNIX_Specification