學習本身是件很玄乎的事情,有些人潇潇灑灑沒見怎麼用心就能夠獲得很好的成績,而有些人則相反,投懸梁錐刺骨也還是成績平平收獲平平。這裡面很大一部分的原因就是方法。當然因為每個人的情況並不相同,對於linux內核學習這件事來說,也就沒有這樣一個標准的方法存在,但是我們仍然可以來共同探討一下如何才能更加有效的去學習linux內核。
本期特邀請中國Linux內核領域的權威專家將針對在Linux內核學習過程中遇到的問題,給予解答。歡迎午飯積極提問,與專家一起討論!
專家著作: 《Linux內核修煉之道》 《linux那些事兒之我是USB》
本期專家: 任橋偉
擅長領域: Linux內核與驅動
專家簡介: 西安交通大學本科、上海交通大學碩博,資深研發工程師、項目經理、51CTO做客專家,專注於Linux內核與驅動開發。著有《Linux內核修煉之道》(人民郵電出版社)、《Linux那些事》(電子工業出版社)等備受網友關注的專業圖書。
精選本期網友提問與專家解答,以供網友學習參考。
Q: 我想問一下專家,為了成為一名合格的網絡工程師,他應該了解linux的那些方面?
A: 既然是作為一名網絡工程師,首要的自然網絡方面的基礎,比如局域網、廣域網、各種網絡協議等,操作系統本身只是作為將這些網絡知識給予利用的一個平台。如果是希望從事linux平台上的工作,那麼就需要對linux操作系統的系統架構以及工作原理進行一定程度的了解,當然對linux系統本身的使用也要非常的熟練,特別是要能夠熟練的掌握linux平台上網絡相關的命令、工具。
Q:我想深入學習LINUX,打算從LINUX 0.01那一萬行代碼開始,你看合適嗎?我接觸LINIX不多,只有一些粗淺的知識,謝謝。
A: 你的問題實際上可以分解為兩個問題:如何深入學習linux,或者說如何學習linux內核?從哪一個版本開始學習比較合適,比如0.01?
對於第一個問題,根據你描述的自己的情況,我的建議是:
1. “先會使用它”,這也是linus本人的回答,也就是說首先要能夠熟練的使用linux操作系統。如果連linux是什麼、常用的操作都不會就去研究內核,是不可能入“門”的。
2. 看懂內核源碼需要一些操作系統、C語言等的基礎。
3. 對內核有個整體的理解和認識。這方面,lkd這本書,和我的linux內核修煉之道應該都能夠幫助你。
4. 會配置和編譯內核,看得懂內核中的Kconfig和Makefile文件,這兩個文件就是內核中的地圖,看得懂它們,在內核裡就不會迷路。
5. 記住,學習內核就是學習內核的源代碼,任何內核有關的書籍都是基於內核,www.linuxidc.com 又不高於內核的。內核源碼本身就是最好的參考資料,其他任何經典或非經典的書最多只是起到個輔助作用,不能也不應該取代內核代碼在我們學習過程中的主導地位。因此你要做得是選擇內核的一個部分或子系統,以韓峰同志對待日記的態度,嚴謹而細致得理解每一段代碼的實現,多問多想多記。切勿抱著走馬觀花,得過且過的態度。
其實也就是我在linux內核修煉之道中總結的:全面了解抓基本,興趣導向深鑽研;融入社區做貢獻,堅持堅持再堅持。
下面是第二個問題,從哪一個版本開始學習比較合適?
我個人建議從新的內核開始,固然新內核的代碼非常龐大,但並沒有說非要求大求全,追求每個部分都要理解。學內核忌諱求大而全,如果對哪部分比較感興趣,研究相關的源碼和change就行了,當然仁者見仁智者見智,自己如果覺得從低版本開始更好更適合,那采用這種方式也未嘗不可,畢竟各人的路還是各自走的。
Q:盡管我知道Linux的內核有難度, 但是我還是想知道我要把C語言(或者匯編,再者其它語言)學到什麼程度才能有足夠的知識去學習Linux內核? -------感謝專家的回答.
A:在《Linux內核修煉之道》的3.1節專門對類似問題做了回答,概括就是:
首先,學習Linux內核並不僅僅只需要C語言的知識,還需要掌握一些操作系統的理論基礎,甚至包括一些硬件的常識,畢竟linux內核源碼是一個操作系統的核心代碼。
其次,對於C語言來說,也不需要很精通,但要能夠鏈表等數據結構的C實現,當然對C越熟悉會越有幫助,意思就是說起碼要能夠看懂C代碼。我們在研究分析內核源碼的過程中,要去體會內核源碼的美。
Q:老師你好,我現在的目標是做linux系統管理員。我現在的公司是在給移動做電子商務平台的,服務器也是用的linux的。但是我們很多權限都沒有,他們是有自己的系統組的負責管理linux的各種事務。我覺得現在的環境不大利於我的linux學習,老師有什麼方法或者建議給我嗎?或者說我學習linux的一些注意事項或者方法?? 謝謝了
A:首先,環境是可以自己創造的,公司的沒有提供很多的權限,可以在自己的PC上搭建實踐的環境啊。下面是我個人的一些建議,希望對你有用。
1. 從命令開始從基礎開始。了解Linux 的基礎知識,包括用戶管理、群組的概念等;掌握常用的命令。
2. 作為一個linux系統管理員,要適應與習慣在命令行下工作的方式,並勤於實踐。
3. 學習shell等腳本語言。
4. 有一定的網絡的基礎,包括路由概念、OSI七層網絡模型、TCP/IP模型及相關服務對應的層次等。
5. 學會使用文檔,學會在linux社區尋求幫助與分享經驗。
Q:學習linux內核需要什麼樣的基礎呢?
A:《Linux內核修煉之道》的3.1節即為介紹內核學習的技術基礎:
1. 熟練使用Linux操作系統。Linux操作系統是Linux內核在用戶層面的具體體現,只有熟練掌握Linux的基本操作,才能在內核學習的過程中達到事半功倍的效果。
2. 掌握操作系統理論基礎。只需要掌握操作系統中比較基礎的理論,比如分時(time-shared)和實時(real-time)的區別,進程的概念,CPU和系統總線、內存的關系等。
3. 掌握C語言基礎。不需要很精通C語言,但能夠理解鏈表、散列表等數據結構的C實現,用過GCC編譯器。當然,越熟悉C語言就會越有幫助。
Q:我想問一下 ,學習Linux的過程中, 在真實的機器上操作和在虛擬機上操作有什麼不同麼?需不需要真實的構建一台純Linux系統的機器去進行學習?
A:先打個不是很恰當的比方,就像聯通的iphone作為iphone的閹割版,基本上並不會影響我們的使用。同樣,虛擬機上的linux也基本上不會影響我們去學習各種linux的操作,特別是對於新手。但是有條件的話,我建議還是直接安裝個linux系統在機子裡,這樣起碼可以避免心理上對windows的那種依賴。