前言html
我依然記得在2004年我剛開始使用Ubuntu 4.04的日子,做爲學生,能夠在Ubuntu網站上申請免費的安裝盤,幾天之後,一個包含CD的包裹就到了:linux
從那時候開始,我在Linux平臺上度過了不少編程時光,從Linux和Linux社區中學到了不少,我必須得說,經過學習Linux,我變成了一個更好的程序員。 ios
若是你有志於在計算機編程領域長久地發展,必定要學習Linux,可是到底學習什麼?怎麼學習?程序員
這是一份給初學者從零開始學Linux的指南。shell
爲何要學習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內核社區有本身的協做風格,你須要學習這些規則。
你的第一個被接受的補丁,將會是你的一個里程碑,當你在一個領域內有了足夠的知識和技能後,切換到別的領域會變的簡單。
成爲內核開發的大師須要花費不少年時間,快樂地編程吧!