學Linux到底學什麼?

  • 2019 年 10 月 8 日
  • 筆記

來源:公眾號【編程珠璣】

作者:守望先生

網站:https://www.yanbinghu.com

前言

我們常常聽到很多人說要學學Linux或者被人告知說應該學學Linux,那麼學Linux到底要學什麼?

為什麼要學Linux

在回答學什麼之前,我們先看看為什麼要學。首先我們需要認識到的是,很多伺服器使用的是Linux系統,而作為伺服器應用程式的開發者或者維護者,如果不了解Linux的基本使用,該如何進行開發或者維護呢?

當然,也有可能你聽說Linux更高大上,或者是說Linux對開發者更加友好(Windows用戶把刀放下),這都是題外話了。

在我看來,學習Linux主要有以下兩點原因

  • 使用標準C/C++ 編寫運行在Linux上的應用程式
  • 編寫部署在Linux上的應用程式,如Python,Java web服務程式
  • 一探究竟。眾所周知,Linux開源,windows並非如此。

而對於Python,它有Python解釋器,Java有Java虛擬機,他們實際上對Linux的需求是沒有C/C++來的高。即便如此,Linux也是值得Python/Java開發者去學習的。如果你是做C/C++開發,那麼Linux是必備的,還記得當前被VC6支配的恐懼嗎?

Linux學習方向

那麼一般說的學Linux是要學什麼呢?方向不同,要學習的內容也不同,可以大致分為這麼幾個方向:

  • 運維,維護Linux伺服器
  • 應用開發,開發Linux應用程式
  • 底層開發

我本人是做Linux應用開發的,因此對於運維方向和底層方向不是很了解,這裡僅簡單說一下。

運維Linux主要需要學會對伺服器的基本部署,監控,配置,管理等等, 你可以認為,這些機器歸你管了,7*24小時保障它能正常提供服務(刪庫跑路就別做了),所以7月24日請對運維的朋友好點。也歡迎運維的朋友留言糾正或者補充我的說法。

底層開發需要了解uboot,文件系統,內核等底層相關內容,主要工作可能涉及文件系統裁剪,驅動開發,內核模組訂製(如記憶體管理,進程調度)等等。底層開發總體來說要求比較高。

應用開發自然是需要學習如何開發在Linux上運行的應用程式,如何定位Linux應用程式問題等等。

來源:公眾號【編程珠璣】 作者:守望先生

Linux應用開發學什麼

Linux的學習很多會以命令為主,因而初學會覺得枯燥甚至疑惑,滑鼠點點點就能完成的事,為什麼要劈里啪啦敲這麼多?這裡給出兩點理由,也歡迎你補充:

  • 出於資源的考慮,絕大部分Linux伺服器沒有圖形介面
  • 命令行便於自動化,將一系列操作寫入腳本,可代替手動操作

而它的學習我把它分為這麼幾個階段:

  • 基本使用
  • 開發調試
  • 系統認識

這三個階段對知識積累的要求不一樣,但總體來說並沒有嚴格的先後之分。

類於windows,當年你學習windows的時候學了什麼?

  • 開關機?
  • 安裝卸載軟體?如安裝影片播放器,音樂播放器(為啥要安這玩意?)。
  • 如何打開安裝的軟體?如打開瀏覽器上網,打開編輯器寫文檔
  • 如何存放自己的資料?移動,創建,刪除等等
  • 如何使用office 辦公軟體
  • ……

是不是想想好像也沒有特意地去學習?

那麼對於學習Linux來說也是類似的,就是學會這些最普通的使用,

  • 如何開關機
  • 如何上網
  • 如何打開命令行
  • 如何使用命令行安裝卸載軟體
  • 如何編輯文本
  • 如何創建,移動,刪除文件
  • 如何查看文件內容,解壓縮文件
  • ……

這個階段最難的就是從圖形介面到命令行的轉換

那麼第二階段呢,就需要學會:

  • 如何編寫Linux應用程式
  • 如何編譯或者構建你的程式
  • 如何運行你的程式
  • 如何定位程式bug

而第三階段,則是一個需要漫長的學習過程,但都是為開發服務,包括:

  • 理解並踐行一切皆文件
  • ELF文件,Linux主要可執行文件格式
  • Linux各大機制的基本原理,如進程調度,記憶體管理,虛擬記憶體,文件系統等,既然要寫Linux應用程式,怎麼能不了解它所在平台的主要機制呢?

越是疑難問題,越需要這些最基本的知識。

怎麼學?

來到了大家最關心的問題了,同樣的,每個人的情況不太一樣,這裡只給出我的個人建議。

關於第一階段,你可以先定個小目標,例如一段時間內學會在Linux下進行你的日常活動(玩遊戲就算了),例如編寫文檔,看影片等等。同時建議:

  • 選擇主流的發行版,如ubuntu,centos等,遇到問題時比較容易解決
  • 在window下安裝虛擬機,這樣Linux環境就隨你折騰了

在這期間,你可能需要了解

  • 使用apt-get或者yum安裝或卸載軟體
  • 使用tar,unzip,zip,gz等解壓縮命令安裝包
  • 了解運行環境,學會如何執行命令

這裡的學習你可以通過網上搜索資料(包括文檔和影片教程)或者購買相關書籍進行操練。如果你不想安裝虛擬機或者docker,你可以通過一些在線的Linux來體驗。

第二階段也是主要的階段,這一階段要學習的東西非常多,多是命令的學習,這裡同樣可以參考《鳥哥的Linux私房菜-基礎篇》。不過初期階段建議抱著一個目的去學習,就是如何在Linux寫一個完整的程式,為了達到這個目的你需要學習

  • cd touch cp mv rm ls,find,切換目錄,創建,複製,移動,刪除,查看,查找等等
  • vi/vim 編寫程式碼,這裡有一個在線練習網站 https://www.openvim.com/
  • gcc編譯程式碼,後期可能需要學習makefile,cmake等構建工具
  • 版本管理,git也是當前必備的一個工具了,學習資料推薦pro git或者官方git教程
  • gdb調試,可以參考《GDB調試指南》
  • 問題定位,除了觀察最基本的列印之外,還需要知道,如何查看進程資訊(ps),如何查看網路連接資訊(ss,netstat),如何強制停止進程(kill -9)如何查看進程文件打開情況(lsof),如何多種姿勢查看文本文件(cat,tail,more,less)等等。
  • 腳本學習,學習Linux,就不得不學習shell腳本了,它在很多時候能毫無抱怨地幫你做事,前提是你會調教。《Linux命令行與shell腳本編程大全》也是調教教程之一。這裡也有一些《必備的shell知識》

這個過程涉及到的命令非常多,但是不建議每一個都去細學,首先知道有這麼一個命令即可,然後需要的時候能夠快速找到用法,如通過man命令查看手冊。總之,記住你的目標就是流暢地進行開發調試,而在達成這個目標地過程中,你自己自然會慢慢接觸很多東西。

但是有必要說明的是,開發Linux應用程式並不一定要在Linux下編寫程式碼,你可以選擇利用samba等工具在windows和linux之間共享文件,然後再在windows下熟悉的工具中或者你認為比較強大合適的工具中編寫程式碼,在Linux下進行編譯調試即可。當然你也可以選擇Linux下的IDE,或者將vim調教一下也是可以的。

第三階段要求是比較高的,這個時候你應該學習過作業系統的相關課程(如,《現代作業系統》,《作業系統原理》等),然後你可以通過諸如《Linux內核設計與實現》,《深入Linux內核架構》,《深入理解Linux內核》等書籍進行相關概念學習,也可以通過閱讀源碼進行深入學習,最終,你需要了解堆和棧,記憶體管理,進程調度,虛擬記憶體,文件系統等相關知識。 當然相關命令學習也必不可少,例如readelf,nm,ipcs,iostat,objdump,free,chrt,pmap,uptime,top,pidstat等。

以上就是三個階段Linux相關的學習內容和建議,實際上其他相關內容的同步學習也非常重要,包括相關數據結構與演算法,系統編程,電腦網路等內容的學習,否則看到很多命令的結果仍然會一臉懵逼。

最後,建議實踐再實踐

總結

限於本人知識水平有限,以上屬個人建議和看法,僅供參考,歡迎留言說說你為什麼要學Linux,有什麼學習方法?

推薦閱讀:

linux常用命令–開發調試篇

Linux常用命令–文本查看篇

Linux常用命令–系統狀態篇

Linux常用命令-解壓縮篇

關注公眾號【編程珠璣】,獲取更多Linux/C/C++/Python/Go/演算法/工具等原創技術文章。後台免費獲取經典電子書和影片資源