Linux的修煉之道:從小工到專家
作者:CoderCat
原文地址:https://www.coderscat.com/how-to-learn-linux
翻譯:碼農翻身,已獲翻譯授權
前言
我依然記得在2004年我剛開始使用Ubuntu 4.04的日子,作為學生,可以在Ubuntu網站上申請免費的安裝盤,幾天以后,一個包含CD的包裹就到了:
從那時候開始,我在Linux平臺上度過了很多編程時光,從Linux和Linux社區中學到了很多,我必須得說,通過學習Linux,我變成了一個更好的程序員。
如果你有志于在計算機編程領域長久地發展,一定要學習Linux,但是到底學習什么?怎么學習?
這是一份給初學者從零開始學Linux的指南。
為什么要學習Linux?
也許你聽說過Linux是黑客的一個很酷的工具,或者Linux對開發人員更加友好, 我認為學習Linux有三個原因:
1. Linux統治了服務器市場
大多數服務器都跑Linux, 程序員尤其是Web程序員,你的程序也會跑在Linux上,你需要在Linux上部署代碼,維護服務器。
2. 學習系統級和底層編程
隨著物聯網的來臨,更多的軟件涉及到底層編程,使用C/C++編程是基本要求,這種開發通常需要精通Linux技能。
3. 通過Linux學習計算機的基礎知識
Linux是個開源項目,全世界成千上萬的人在維護它,有很多關于Linux內部知識的資源和優秀書籍,對學習操作系統有極大幫助。
Linux學習指南
對Linux的學習分為幾個層次:
1. 日常使用
2. 在Linux上進行應用開發,操作和維護
3. 系統級開發
4. 內核開發
很明顯,需要一層層地學習,越往下越難。
碼農翻身注:
對于普通程序員來說,做到第二層就差不多了。
對于想成為某個領域專家的程序員,需要達到第三層。
最后一層可能只有少數人,他們可能是自由職業者,黑客,還有不少是大公司的員工。
在開始有趣的旅程之前,先來推薦一本Linus Torvalds的自傳:
日常使用
這包括:
- 如何login , logout
- 如何聯網
- 如何打開命令行窗口
- 如何使用命令行安裝/卸載軟件
- 如何編輯文本文件
- 如何創建,移動,刪除文件
- 如何查看壓縮文件,提取內容。
這個階段最難的部分就是從圖形界面轉向命令行。我的建議是就像學游泳那樣,把自己扔到水里。不入水永遠都學不會游泳。
所以,一定要在你的PC上安裝一個Linux。你可以使用多系統,但是不要嘗試虛擬機,因為你很容易就會放棄Linux。
到底使用哪個版本的Linux呢?現在可能有十個常見的版本,選擇最主流的就好,比如Ubuntu, CentOS等。他們直接的主要區別就是GUI和軟件包管理方式。
Linux上的應用開發
Linux上有各種各樣的應用開發,例如Web應用,桌面GUI應用,命令行等等。
你可能需要學習Web開發,C/C++/Python或者其他編程語言。
在Linux上做開發和在Windows上的體驗不同,這里通常沒有一個強大的IDE。大部分時候,你的工具鏈是一系列的小工具,你需要在shell中把他們“連”在一起。
你需要學習的是:
- 在一個編輯器中寫代碼, 常見的編輯器是Vim/Emacs/VSCode
- 如何編譯你的程序
- 如何從命令行啟動你的程序
- 使用調試器來尋找bug
學習一些Shell腳本編程必不可少, 至少你得學到能看懂常見Shell的水平。
現在很多程序員更喜歡Python/Ruby, 但是仍然有很多之前開發的shell腳本需要維護。
你需要建立屬于你自己的Linux開發環境。把配置文件都記錄下來(比如使用Git)。如果你的開發環境搞得很好,編程的效率會有五倍提升。
《Linux Bible》 and 《Linux命令行大全》會對命令行和開發環境有個非常好的介紹。
碼農翻身注:在國內,自然是《鳥哥的Linux私房菜》了。
在這一階段花費的學習時間比較長,要保持耐心。
系統級開發
如果你的目標是開發那些“底層”的軟件,比如存儲程序,網絡程序,那必須要進入這一層次。
系統級編程和應用層編程大不相同,主要涉及操作系統和網絡的東西。
你需要學習那些Linux內核對外提供的接口,由于歷史和性能的原因,大部分都是C語言的。
使用GDB來調試程序也是必備的技能,你可以參考《Debuging with GDB》,Valgrind 是另外一個有用的內存檢查工具。
《Linux 系統編程》,《Linux系統編程手冊》都是非常好的書。
網絡是系統編程的一個重要編程領域,《Unix網絡編程》是你最好的選擇。
能走到這個階段可是不簡單,只有很少程序員有使用C/C++編程的能力,現代的程序員一般使用更加高級的編程語言例如Python, Ruby ,Java。
技術潮起潮落,但是基礎總是不變,系統編程的核心知識能提升你的技能,擴展你的設計能力。
內核開發
成為內核開發人員,那要求可是相當高,能走到這一步,你將是一位受人景仰的英雄人物。 在這個時候,你應該已經學過操作系統的課程了。
內核包含很多子模塊:內存管理,進程調度,虛擬內存,文件系統,設備管理等。還有很多輔助開發的命令:readelf, nm, ipcs, iostat, objdump, free, chrt, pmap, uptime, top, pidstat, etc.
Robot Love寫的《Linux Kernel Development》是講述內核開發最好的入門書, 它會給你提供一個很好的內核概覽。
中文版名稱是《Linux 內核設計與實現》,由陳莉君教授翻譯。
還有一些內核開發的好書:
《現代操作系統》
《深入理解LINUX內核》
《深入Linux內核架構》
切記,Linux內核開發的領域太多,初學者不可能同時涉及所有領域。你的學習策略應該是:
1. 獲取Linux內核的概覽。
一個好方法就是讀《Linux 內核設計與實現》,或者去讀一下Linux早期版本的源碼,因為代碼要少很多,這里有很多早期的版本:https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/old-versions/
大約兩周的時間就可以完成。
碼農翻身注:兩周的時間太短了!
MIT開發的教學操作系統xv6也是一個不錯的選擇:https://pdos.csail.mit.edu/6.828/2012/xv6.html
2 專注在特定子模塊
選一個你最感興趣的模塊,試圖理解它的設計和細節,參與內核開發的社區,閱讀相關的文檔,加入Linux的mail list;查看別人的補丁,提交你的補丁。
Linux內核社區有自己的協作風格,你需要學習這些規則。
你的第一個被接受的補丁,將會是你的一個里程碑,當你在一個領域內有了足夠的知識和技能后,切換到別的領域會變的簡單。
成為內核開發的大師需要花費很多年時間,快樂地編程吧!
相關鏈接:
Linux 內核接口: https://en.wikipedia.org/wiki/Linux_kernel_interfaces
Valgrind : http://valgrind.org/
https://www.coderscat.com/to-be-a-programmer
Linux HowTo : https://www.kernel.org/doc/html/v4.16/process/howto.html
Linux 郵件列表 : https://lkml.org/
xv6閱讀資料: https://pdos.csail.mit.edu/6.828/2019/reference.html
【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】