專家堂:[第171期]邁入Linux內(nèi)核學(xué)習(xí)的神圣殿堂
學(xué)習(xí)本身是件很玄乎的事情,有些人瀟瀟灑灑沒見怎么用心就能夠獲得很好的成績,而有些人則相反,投懸梁錐刺骨也還是成績平平收獲平平。這里面很大一部分的原因就是方法。當(dāng)然因為每個人的情況并不相同,對于linux內(nèi)核學(xué)習(xí)這件事來說,也就沒有這樣一個標(biāo)準(zhǔn)的方法存在,但是我們?nèi)匀豢梢詠砉餐接懸幌氯绾尾拍芨佑行У娜W(xué)習(xí)linux內(nèi)核。
本期特邀請中國Linux內(nèi)核領(lǐng)域的權(quán)威專家將針對在Linux內(nèi)核學(xué)習(xí)過程中遇到的問題,給予解答。歡迎午飯積極提問,與專家一起討論!
專家著作: 《Linux內(nèi)核修煉之道》 《linux那些事兒之我是USB》
本期專家: 任橋偉
擅長領(lǐng)域: Linux內(nèi)核與驅(qū)動
專家簡介: 西安交通大學(xué)本科、上海交通大學(xué)碩博,資深研發(fā)工程師、項目經(jīng)理、51CTO做客專家,專注于Linux內(nèi)核與驅(qū)動開發(fā)。著有《Linux內(nèi)核修煉之道》(人民郵電出版社)、《Linux那些事》(電子工業(yè)出版社)等備受網(wǎng)友關(guān)注的專業(yè)圖書。
查看本期門診精彩實錄:http://doctor.51cto.com/develop.php?cid=184
參與最新技術(shù)門診:http://doctor.51cto.com/
精選本期網(wǎng)友提問與專家解答,以供網(wǎng)友學(xué)習(xí)參考。
Q: 我想問一下專家,為了成為一名合格的網(wǎng)絡(luò)工程師,他應(yīng)該了解linux的那些方面?
A: 既然是作為一名網(wǎng)絡(luò)工程師,首要的自然網(wǎng)絡(luò)方面的基礎(chǔ),比如局域網(wǎng)、廣域網(wǎng)、各種網(wǎng)絡(luò)協(xié)議等,操作系統(tǒng)本身只是作為將這些網(wǎng)絡(luò)知識給予利用的一個平臺。如果是希望從事linux平臺上的工作,那么就需要對linux操作系統(tǒng)的系統(tǒng)架構(gòu)以及工作原理進行一定程度的了解,當(dāng)然對linux系統(tǒng)本身的使用也要非常的熟練,特別是要能夠熟練的掌握linux平臺上網(wǎng)絡(luò)相關(guān)的命令、工具。
Q:我想深入學(xué)習(xí)LINUX,打算從LINUX 0.01那一萬行代碼開始,你看合適嗎?我接觸LINIX不多,只有一些粗淺的知識,謝謝。
A: 你的問題實際上可以分解為兩個問題:如何深入學(xué)習(xí)linux,或者說如何學(xué)習(xí)linux內(nèi)核?從哪一個版本開始學(xué)習(xí)比較合適,比如0.01?
對于第一個問題,根據(jù)你描述的自己的情況,我的建議是:
1. “先會使用它”,這也是linus本人的回答,也就是說首先要能夠熟練的使用linux操作系統(tǒng)。如果連linux是什么、常用的操作都不會就去研究內(nèi)核,是不可能入“門”的。
2. 看懂內(nèi)核源碼需要一些操作系統(tǒng)、C語言等的基礎(chǔ)。
3. 對內(nèi)核有個整體的理解和認(rèn)識。這方面,lkd這本書,和我的linux內(nèi)核修煉之道應(yīng)該都能夠幫助你。
4. 會配置和編譯內(nèi)核,看得懂內(nèi)核中的Kconfig和Makefile文件,這兩個文件就是內(nèi)核中的地圖,看得懂它們,在內(nèi)核里就不會迷路。
5. 記住,學(xué)習(xí)內(nèi)核就是學(xué)習(xí)內(nèi)核的源代碼,任何內(nèi)核有關(guān)的書籍都是基于內(nèi)核,而又不高于內(nèi)核的。內(nèi)核源碼本身就是最好的參考資料,其他任何經(jīng)典或非經(jīng)典的書最多只是起到個輔助作用,不能也不應(yīng)該取代內(nèi)核代碼在我們學(xué)習(xí)過程中的主導(dǎo)地位。因此你要做得是選擇內(nèi)核的一個部分或子系統(tǒng),以韓峰同志對待日記的態(tài)度,嚴(yán)謹(jǐn)而細(xì)致得理解每一段代碼的實現(xiàn),多問多想多記。切勿抱著走馬觀花,得過且過的態(tài)度。
其實也就是我在linux內(nèi)核修煉之道中總結(jié)的:全面了解抓基本,興趣導(dǎo)向深鉆研;融入社區(qū)做貢獻,堅持堅持再堅持。
下面是第二個問題,從哪一個版本開始學(xué)習(xí)比較合適?
我個人建議從新的內(nèi)核開始,固然新內(nèi)核的代碼非常龐大,但并沒有說非要求大求全,追求每個部分都要理解。學(xué)內(nèi)核忌諱求大而全,如果對哪部分比較感興趣,研究相關(guān)的源碼和change就行了,當(dāng)然仁者見仁智者見智,自己如果覺得從低版本開始更好更適合,那采用這種方式也未嘗不可,畢竟各人的路還是各自走的。
Q:盡管我知道Linux的內(nèi)核有難度, 但是我還是想知道我要把C語言(或者匯編,再者其它語言)學(xué)到什么程度才能有足夠的知識去學(xué)習(xí)Linux內(nèi)核? -------感謝專家的回答.
A:在《Linux內(nèi)核修煉之道》的3.1節(jié)專門對類似問題做了回答,概括就是:
首先,學(xué)習(xí)Linux內(nèi)核并不僅僅只需要C語言的知識,還需要掌握一些操作系統(tǒng)的理論基礎(chǔ),甚至包括一些硬件的常識,畢竟linux內(nèi)核源碼是一個操作系統(tǒng)的核心代碼。
其次,對于C語言來說,也不需要很精通,但要能夠鏈表等數(shù)據(jù)結(jié)構(gòu)的C實現(xiàn),當(dāng)然對C越熟悉會越有幫助,意思就是說起碼要能夠看懂C代碼。我們在研究分析內(nèi)核源碼的過程中,要去體會內(nèi)核源碼的美。
Q:老師你好,我現(xiàn)在的目標(biāo)是做linux系統(tǒng)管理員。我現(xiàn)在的公司是在給移動做電子商務(wù)平臺的,服務(wù)器也是用的linux的。但是我們很多權(quán)限都沒有,他們是有自己的系統(tǒng)組的負(fù)責(zé)管理linux的各種事務(wù)。我覺得現(xiàn)在的環(huán)境不大利于我的linux學(xué)習(xí),老師有什么方法或者建議給我嗎?或者說我學(xué)習(xí)linux的一些注意事項或者方法?? 謝謝了
A:首先,環(huán)境是可以自己創(chuàng)造的,公司的沒有提供很多的權(quán)限,可以在自己的PC上搭建實踐的環(huán)境啊。下面是我個人的一些建議,希望對你有用。
1. 從命令開始從基礎(chǔ)開始。了解Linux 的基礎(chǔ)知識,包括用戶管理、群組的概念等;掌握常用的命令。
2. 作為一個linux系統(tǒng)管理員,要適應(yīng)與習(xí)慣在命令行下工作的方式,并勤于實踐。
3. 學(xué)習(xí)shell等腳本語言。
4. 有一定的網(wǎng)絡(luò)的基礎(chǔ),包括路由概念、OSI七層網(wǎng)絡(luò)模型、TCP/IP模型及相關(guān)服務(wù)對應(yīng)的層次等。
5. 學(xué)會使用文檔,學(xué)會在linux社區(qū)尋求幫助與分享經(jīng)驗。
Q:學(xué)習(xí)linux內(nèi)核需要什么樣的基礎(chǔ)呢?
A:《Linux內(nèi)核修煉之道》的3.1節(jié)即為介紹內(nèi)核學(xué)習(xí)的技術(shù)基礎(chǔ):
1. 熟練使用Linux操作系統(tǒng)。Linux操作系統(tǒng)是Linux內(nèi)核在用戶層面的具體體現(xiàn),只有熟練掌握Linux的基本操作,才能在內(nèi)核學(xué)習(xí)的過程中達到事半功倍的效果。
2. 掌握操作系統(tǒng)理論基礎(chǔ)。只需要掌握操作系統(tǒng)中比較基礎(chǔ)的理論,比如分時(time-shared)和實時(real-time)的區(qū)別,進程的概念,CPU和系統(tǒng)總線、內(nèi)存的關(guān)系等。
3. 掌握C語言基礎(chǔ)。不需要很精通C語言,但能夠理解鏈表、散列表等數(shù)據(jù)結(jié)構(gòu)的C實現(xiàn),用過GCC編譯器。當(dāng)然,越熟悉C語言就會越有幫助。
Q:我想問一下 ,學(xué)習(xí)Linux的過程中, 在真實的機器上操作和在虛擬機上操作有什么不同么?需不需要真實的構(gòu)建一臺純Linux系統(tǒng)的機器去進行學(xué)習(xí)?
A:先打個不是很恰當(dāng)?shù)谋确?,就像?lián)通的iphone作為iphone的閹割版,基本上并不會影響我們的使用。同樣,虛擬機上的linux也基本上不會影響我們?nèi)W(xué)習(xí)各種linux的操作,特別是對于新手。但是有條件的話,我建議還是直接安裝個linux系統(tǒng)在機子里,這樣起碼可以避免心理上對windows的那種依賴。
Q:請問專家一個問題,BSD內(nèi)核與LINUX內(nèi)核有什么差異。LINUX內(nèi)核比BSD內(nèi)核有什么優(yōu)勢?
A:建議你去看一下這篇文章:“Solaris、Linux和FreeBSD的內(nèi)核比較”
Q:我是一名企業(yè)網(wǎng)管,學(xué)習(xí)好linux有必要去玩LFS嗎
A:學(xué)習(xí)好Linux與去玩LFS應(yīng)該沒有必然的聯(lián)系,但是玩LFS或許是一個菜鳥變成高手的捷徑,它可以幫助我們學(xué)習(xí)Linux系統(tǒng)的內(nèi)部是如何工作的,并打下一個扎實的基礎(chǔ)。
Q:專家,你好,我接觸LINUX不太久,想了解和深入內(nèi)核,怎樣有個循序漸進的過程,從哪里開始?
A:通常語言及其庫的學(xué)習(xí)分為幾個層次,1.熟練使用,2.閱讀源碼,了解實現(xiàn)原理,3.對源碼進行擴展。同樣,linux內(nèi)核的學(xué)習(xí)也可以由淺入深劃分為幾個層次:全面了解抓基本,興趣導(dǎo)向深鉆研;融入社區(qū)做貢獻,堅持堅持再堅持。
第一層次全面了解抓基本是說:能夠?qū)inux以及內(nèi)核有個全面的認(rèn)識和了解,有個整體的概念,不求有多么深入,另外要掌握Linux內(nèi)核源代碼的分析方法。內(nèi)核源碼千千萬,還一直前仆后繼的往里面加,我們必須得掌握一種好的分析方法。
第二層次興趣導(dǎo)向深鉆研是說:在第一層次修煉中已經(jīng)對內(nèi)核有個全局的認(rèn)識和了解之后,接下來就應(yīng)該按照認(rèn)識的發(fā)展規(guī)律,以興趣為導(dǎo)向,尋找一個子系統(tǒng)或模塊,對它的代碼深入鉆研和分析,不懂的地方就通過社區(qū)、郵件列表或者直接發(fā)Email給maintainer請教等途徑弄懂,千萬不要得過且過,這樣分析下來,對同步、中斷等等內(nèi)核的很多機制也同樣會非常了解,俗話說一通則百通就是這個道理。
第三層次融入社區(qū)做貢獻是說:通過第二層次的修煉,你應(yīng)該對至少一到兩個部分有了很深入的理解,對內(nèi)核代碼采用的通用手法也已經(jīng)很熟悉,那么你應(yīng)該開始進入第三層次,努力融入到內(nèi)核的開發(fā)社區(qū),此時的你已經(jīng)不會再是社區(qū)中潛水小白的角色,而是會針對某個問題發(fā)表自己的見解。你已經(jīng)可以嘗試參與到內(nèi)核的開發(fā)中去,即使僅僅修改了內(nèi)核中的一個錯誤單詞,翻譯了一份大家需要的文檔,也是做出了自己的貢獻,會得到大家的認(rèn)可。
最后一個層次可以歸納為兩個字,就是“堅持”,能夠在內(nèi)核的修煉之道上走多遠,都取決于我們能夠堅持多久。
這些正是《Linux內(nèi)核修煉之道》中所總結(jié)的,具體可以參考書中或者我博客中所講的內(nèi)容。
Q:我是做javaee方面的,我們的服務(wù)器用的就是RedHat,我想學(xué)習(xí)服務(wù)器方面的配置,是不是用不著學(xué)習(xí)linux內(nèi)核啊。但是服務(wù)器的管理好像需要些一些腳本。那是不是內(nèi)核又必須要了解啊~
A:確實沒太大必要去學(xué)習(xí)內(nèi)核,不過對內(nèi)核了解一些的話,比如內(nèi)核的整體框架,應(yīng)該會對自己有一定的幫助。
Q:大學(xué)時學(xué)過一期的FEDORA 9,由于自身對LINUX感興趣,看過不少RHCE教程,并自學(xué)RHEL 5一年,對LINUX基本操作和服務(wù)的基本配置都有所掌握,但一直停留在這個基礎(chǔ)上,由于工作上也沒有涉及到LINUX,沒有實踐經(jīng)驗,只能自己模擬。想請教一下,對于我現(xiàn)在這種情況,如何尋找突破點,可以在LINUX上提高一個層次。
A:你這樣的情況,對于Linux的使用與配置應(yīng)該算是非常的嫻熟了,如果希望能夠提高一下,倒可以去玩一下LFS,再了解一下內(nèi)核,對內(nèi)核的框架結(jié)構(gòu)以及工作流程有一定的理解,當(dāng)然這些是基于你感興趣的基礎(chǔ)上。
Q:您好!我現(xiàn)在是一個培訓(xùn)學(xué)校的網(wǎng)絡(luò)管理員,但是我對于網(wǎng)絡(luò)的前景很茫然,不知道該確定那個方向,在網(wǎng)上查了一些資料,但是還是很猶豫,想請前輩們,詳細(xì)說一下網(wǎng)絡(luò)的發(fā)展前景,和所需要學(xué)習(xí)哪些具體的內(nèi)容。謝謝?。?!
A:說起發(fā)展前景,我相信任何方面只要做到足夠的專,都會非常的受歡迎和搶手的。
如果你自己本身很希望做這方面的事情,那就多研究研究這方面所需要的知識,比如網(wǎng)絡(luò),然后注意積累平時工作學(xué)習(xí)中遇到的問題以及解決辦法,這樣在某個階段量變才會引起質(zhì)變。
就像我在說如何學(xué)習(xí)內(nèi)核的時候說的,好奇心是一切事物發(fā)展的原動力,它決定了你在某一領(lǐng)域所能達到的成就。意思就是,遇到問題不要得過且過,盡力的去想辦法解決,或者去盡力的發(fā)現(xiàn)問題,你自己的水平會很快的得到提高的。
Q:我現(xiàn)在正在學(xué)習(xí)Linux的各種操作(想作為以后的工作方向),但是學(xué)習(xí)的時候有很多疑惑,感覺學(xué)這個好像沒什么用似的,也是一種操作系統(tǒng)嘛,能做些基本的操作就行了,那么我們學(xué)習(xí)Linux更深入一點到底能干什么?我真的想在這一行有所成,但是現(xiàn)在卻感覺很渺茫,不知道從事Linux到底能干什么。其實很羨慕那些做開發(fā)的人,C語言也學(xué)了,但是卻不知道從何做起,如果真讓我做個什么程序的話又什么都做不出來,老師您說,我現(xiàn)在應(yīng)該怎么學(xué)習(xí)比較好呢?
A: Linux和windows一樣,僅僅是一個操作系統(tǒng),我們能在上面做什么取決于我們希望利用它們做什么。如果僅僅是好奇著玩玩的話,那么一些基本的命令,圖形界面會使用就成了,如果是希望從事系統(tǒng)管理網(wǎng)絡(luò)管理方面的工作,那么應(yīng)該注意去培養(yǎng)自己shell、網(wǎng)絡(luò)知識等等方面的素質(zhì),如果希望往底層發(fā)展,比如從事驅(qū)動和內(nèi)核相關(guān)的開發(fā),那么就要對內(nèi)核有所理解,這個時候可以按照我在《Linux內(nèi)核修煉之道》里的方法去學(xué)習(xí),也可以尋找一種適合自己的學(xué)習(xí)方法。
不管做什么事情,最重要最關(guān)鍵的一步就是去開始,開發(fā)沒什么神秘的,你可以嘗試著寫一些小的東西,去找一些項目來做,或者自己做一些小玩意兒小游戲都是可以的。
Q:老師您好。我以后想做Linux 下的JAVA 開發(fā)。需要怎么做呢?先熟悉Linux 的基本操作,然后再移植過來?還是怎么的啊?感謝專家。
A:既然是Linux下的Java開發(fā),兩個關(guān)鍵點就是Linux和Java,也就是說Linux上的基本操作、環(huán)境配置和開發(fā)工具要比較的熟悉,起碼使用起來沒什么障礙,同時就是Java語言的掌握。
其實只要不做底層的開發(fā),不管windows還是linux也都只是提供了一個開發(fā)以及使用的環(huán)境和平臺,只是一個工具而已。
Q:請問如果成為一個合格的linux系統(tǒng)工程師,至少需要具備哪些方面的知識?能詳細(xì)談及一下嗎?
比如對系統(tǒng)的管理?對文件的管理?對磁盤的管理?對服務(wù)的管理?安全設(shè)置?除此之外還有嗎?在這些管理中哪些管理是比較重要的?shell編程對于系統(tǒng)管理來說重要嗎?內(nèi)核管理對系統(tǒng)管理重要嗎?謝謝老師的解答~~
A: 1. 還有網(wǎng)絡(luò)、數(shù)據(jù)庫等方面的知識。
2. shell等腳本的編程和使用是很重要的。
3. 對內(nèi)核研究很深確實沒太大必要,不過了解一些內(nèi)核的架構(gòu)和工作流程還是有幫助的。
Q:您好。我打算學(xué)習(xí)kernel,可是真的不知道從哪里入手。很想有一個互動的學(xué)習(xí)環(huán)境,因為學(xué)習(xí)內(nèi)核主要還是自己啃課本,太難入手了。
A:首先,對于如何入手,我在《Linux內(nèi)核修煉之道》里已經(jīng)總結(jié)了4個循序漸進的層次“全面了解抓基本,興趣導(dǎo)向深鉆研;融入社區(qū)做貢獻,堅持堅持再堅持”,具體的內(nèi)容,你可以看看這本書或者我的博客,上面說了很多我在學(xué)習(xí)內(nèi)核上的建議和感悟。
其次,要糾正一下你“學(xué)習(xí)內(nèi)核主要還是自己啃課本”的說法,記住,學(xué)習(xí)內(nèi)核就是學(xué)習(xí)內(nèi)核的源代碼,任何內(nèi)核有關(guān)的書籍都是基于內(nèi)核,而又不高于內(nèi)核的。內(nèi)核源碼本身就是最好的參考資料,其他任何經(jīng)典或非經(jīng)典的書最多只是起到個輔助作用,不能也不應(yīng)該取代內(nèi)核代碼在我們學(xué)習(xí)過程中的主導(dǎo)地位。
Q:我原來接觸Linux 比較多但是現(xiàn)在工作中好長時間沒有用了 搭建linux 服務(wù)都忘掉了 但是我還是很喜歡linux 我想知道linux 運維都需要知道哪些哦 我想去專攻
A:給一個我們以前招l(wèi)inux運維工程師的要求,你可以參考下:
1. 熟悉運維相關(guān)技術(shù),制定運維技術(shù)方案;
2. 至少熟悉一種腳本語言,能夠開發(fā)運維工具進行系統(tǒng)管理;
3. 熟悉運維相關(guān)的網(wǎng)絡(luò)技術(shù);
4. 熟悉大規(guī)模機群系統(tǒng)的維護管理;5. 深入理解Linux/FreeBSD系統(tǒng),有系統(tǒng)調(diào)優(yōu)經(jīng)驗者優(yōu)先。
Q:您好,學(xué)習(xí)內(nèi)核將來可以從事什么樣的工作?考取rhce,有用嗎?rhce,適合做什么樣的工作?請解惑,謝謝
A:1. 學(xué)習(xí)內(nèi)核可以從事內(nèi)核和驅(qū)動開發(fā)的工作啊。
2. 考取rhce貌似不是關(guān)鍵,關(guān)鍵的是自己的水平真正的提高了。
Q:我是北大青鳥的,我剛工作出來,現(xiàn)在干監(jiān)控,我想學(xué)linux,以后的道路不知道怎么走
A:想學(xué)就去學(xué)吧,很多事沒有去做的時候,是不知道做了之后會有多大的影響的。送你一句話,也是我《Linux內(nèi)核修煉之道》前言里的一句話:今天的必然正是由之前一系列的偶然所決定的。
Q:問問,初期學(xué)習(xí)linux 以什么版本學(xué)習(xí)為好。現(xiàn)在linux有很多版本,但是初期學(xué)習(xí)以那個版本為好。雖然命令大部分都一樣,但是還是有很多區(qū)別的吧。
A:如果你指的是發(fā)行版的話,那看自己喜好了,隨便哪個都成,現(xiàn)在用的比較多的是ubuntu。
如果你指的是內(nèi)核版本的話,我個人建議從新的內(nèi)核開始,固然新內(nèi)核的代碼非常龐大,但并沒有說非要求大求全,追求每個部分都要理解。學(xué)內(nèi)核忌諱求大而全,如果對哪部分比較感興趣,研究相關(guān)的源碼和change就行了,當(dāng)然仁者見仁智者見智,自己如果覺得從低版本開始更好更適合,那采用這種方式也未嘗不可,畢竟各人的路還是各自走的。
Q:老師 你好!使用LINUX系統(tǒng)有一段時間了,會一些操作等,能夠駕設(shè)一些服務(wù)器,但總感覺是機械化的操作,只知道不停得編輯配置文件,出現(xiàn)了問題,不知道哪里下手。靈活性不強,還是沒有一個非常全面的系統(tǒng)認(rèn)識,想深入內(nèi)核學(xué)習(xí),但好像英語能力差,是個瓶頸,怎么深入。
A:學(xué)習(xí)內(nèi)核,英語能力好當(dāng)然會有很大的幫助,不過差些也沒太大問題,主要是C等語言基礎(chǔ)能看得懂代碼,畢竟英語雖然是國際通用語言,但在開發(fā)層次上來說,通用的語言是代碼,呵呵。如果不知道怎么對內(nèi)核入門的話,可以去看看我的博客,或者我的那兩本書,應(yīng)該會有很大的幫助。
Q:如何對linux操作系統(tǒng)的系統(tǒng)架構(gòu)以及工作原理進行學(xué)習(xí)和了解
A:1. 玩一下LFS。
2. 找本內(nèi)核的入門書看看。
Q:Linux命令,看到眼花瞭亂的,記住這個又忘了那個,頭都大了,有沒有什么好的學(xué)習(xí)方法,看你都高級的工程師了。哈哈!謝謝了!
A:命令?用熟了就記得了,沒必要去記。旁邊放個手冊,用的時候如果忘了就看下,熟了就記得了。
【編輯推薦】