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