個人表示只簡單接觸過Linux,如何從頭學起,有什麼好的學習路線嗎?


大前提: 英語, 英語, 還是TMD英語!

首先是看你想學 Linux 幹什麼. 開發么? 運維么? 還是搞嵌入式? 還是研究 Android 以後做 Android 開發? 不同的方向對應不同的方法. 如果只是玩那你隨便, 玩到噁心為止. 如果是開發, 那你應該把精力更多的放在提升代碼的能力上面. 畢竟未來應用部署都是容器化的, 一個 dockerfile 解決一切問題. 過度的研究操作系統本身並沒什麼意義. 但是如果你是搞運維那就另說了. 跟 Linux 有關的大部分東西你都的學. 甚至還得了解不同發行版之間的差異, 開源協議等. 如果是嵌入式開發, 你得明白如何進行裁剪, 如何交叉編譯等...

然後具體的學習過程要本著 "由淺入深", "由簡到繁" 的原則. 不要上來就去搞什麼 GTK, 不要上來就研究什麼 Arch 配置之類的. 畢竟既然是剛開始學肯定有一些 "約定俗成", "習以為常" 的基本操作 (比如文件系統, SELinux 等) 你必然是不知道的. 在這種情況下遇到問題很容易被噁心到. 被噁心幾次就把自己噁心到退坑了.

個人的建議最好是給自己一個平緩的學習曲線, 先從最簡單的 Ubuntu / Manjaro / Deepin 等用戶體驗更佳的 Linux 發行版入手, 熟悉 Linux 的基本操作 (包括但不限於基本命令, 包管理, 定時任務, 用戶等) 和一些基礎概念 (如文件系統, 許可權系統等) 之後, 再去向更深層次挖掘. 不要去聽一些人說的上來就去整什麼很複雜的東西 (比如什麼折騰 VIM 啊, 編譯啊, 什麼折騰 Arch 初始化之類的). 他們用慣了覺得很簡單的東西不代表你可以直接上手. 你是菜雞. 人家是大佬.

Linux 有些東西好是真的好, 但是難也真的是挺難的. 學習的過程遇到問題一定不要死磕, 去 google 上搜索, 去 ServerFault 而且一定要注意問問題的技巧. 用英語問, 而且切記態度好點不要懟人. 不要灰心. 新手能遇到的坑基本上別人都踩過幾百遍了. 善用搜索引擎總能找到解決方案的.

當你用的多了, 踩的坑多了也自然就學差不多了. 等你自己覺得自己 "基本上" 會用了的時候, 再去根據自己的方向往對應方向走就行.


從ARCH開始,第一步Linux From Scratch,第二步:Beyond Linux From Scratch,堅持下來也就沒什麼難的了。


怎麼學好Linux?天地會珠海分舵的視頻 · 1487 播放

一個Linux老鳥說一下吧,首先聲明,我不想好為人師,我這裡只是根據我自己的經驗來回答這個問題,所以不一定適合所有人。所以我建議你最好還是多參考下不同的答案,然後看下哪個才是你覺得最適合你自己的方法。

首先,你說要學好Linux,這個問題是非常廣泛的,非常開放性的一個話題,我敢百分百保證沒有人能給出你一個正確的答案!為什麼呢?學好Linux這個話題可大可小,小,可以小到你把Linux下的Samba協議的服務源碼吃透了,你就可以獨當一面,傲視大部分同行!大,可以大到你把Linux最新的源碼吃透了,然後根據已有的知識,響應國家號召,寫出自己的一個純國產自主知識產權的操作系統,為國家做出不可磨滅的貢獻!

所以這裡我需要稍微幫你細分一下你究竟是要怎麼個學好Linux。按照我個人的理解,一般人說學好Linux,無非這幾個方面:

  • 第一,運維層面的學好Linux,就是知道不同的Linux命令,然後對一些常用的服務的配置比較理解,如nginx,haproxy,ntp,samba,nfs之類的。
  • 第二,應用開發方面的學好Linux,就是可以在Linux下面進行編程,寫出自己的應用,其實一般來說應該是可以在Linux下寫服務端。
  • 第三,熟讀Linux源碼,讓自己可以理解操作系統實現的原理。雖然不一定真的要自己去寫一個新的操作系統,但是可以從中獲得滿足感,因為程序員的快樂往往很簡單,了解一些運行原理會讓我們很開心。或者說為了今後做驅動,做嵌入式系統深度定製等而去學好Linux源碼。

那麼先說第一種吧。運維層面應該怎麼學好Linux呢?

首先,別的你都先別做,先去選定一個Linux發行版,因為不同的Linux發行版操作方式肯定是不一樣的。這裡建議你用Ubuntu吧,沒有別的原因,就是因為我自己一直在用,什麼fedora,redhat,centos,arch linux之類的,早被我拋棄多年了。

版本的話你就挑個最新的吧,好像現在都到了20.10了吧?可憐我自己一直在用的還是16.04。不過我一直都是ssh進去用命令行的,基本不用Desktop,所以無球所謂了。

說到這個,那下一個你需要做的就是別去用什麼Linux Desktop。不客氣的說,你把Linux桌面玩得更溜,其他人都不會覺得你對Linux有多了解,要玩就完命令行。

那麼命令行怎麼玩,很簡單,我立刻根據我現在腦海裡面能想到的給你列個清單,其實這個也是我以前給新入職程序員面試的時候考的一些點:

  • 第一,熟悉最基本的ls,ps,cd,cat,sed,awk, apt-get這些命令,你不知道這些東西的話,進入到Linux你就會雲山霧罩的找不著北,狂呼:我是誰?我在哪?我在幹什麼?
  • 第二,先去了解下Linux的文件系統層級結構,術語叫做Filesystem Hierarchy Standard,中文應該叫做文件系統層次標準之類吧。網上找個資料,大把的。這個主要是要讓你了解Linux下的文件層級,從根目錄開始,顯示了解目錄樹是怎麼回事,然後了解根下面各個文件夾如etc,var,proc這些主要是做什麼用的。這裡會有不少知識點,特別是proc這些,夠你學一段時間的了。
  • 第三,學會vim命令。不要求你能配起ctag之類的代碼跳轉插件,但是vim的一些常用快捷方式你需要懂,比如dd是什麼?yy是什麼?cc是什麼?shift+$是什麼,這麼進入交互模式,怎麼插入,如此這般。自己去嘗試編輯一篇文章出來吧,1000字吧,等你完成了,也就是熟練了。記得不懂就去查,別拷貝一行跟我來個滑鼠操作,要完全放棄掉滑鼠!
  • 第四,搭建samba和nfs網路文件共享服務。主要會用到上面所有的知識點,你需要知道去哪裡找配置文件,需要知道怎麼編輯,需要知道服務啟動關閉是怎麼被管理起來的,同時,作為新的知識點,你會知道配置文件一般是長什麼樣子的,到時你碰到個.conf結尾的你就會立刻反應過來知道這是個配置文件,然後看到裡面的項目你就會大概知道應該怎麼去配。
  • 第五,把sshd配置起來,直到可以從另外一台機器ssh進去。這裡主要是上面一點的實操。同時也是為了讓你學習方便。因為一般都是裝個虛擬機之類的玩Linux,不需要每次都進入到虛擬機裡面,直接在你host上面通過ssh進去就完了。
  • 第六,把nginx從源碼開始make然後搭建起來,寫一個簡單的html,直到能通過http和https在外網訪問到你的html網頁。內網穿透的話有很多免費的,自己去找,沒人給我錢,我不想給他們打廣告。
  • 第七,學會fdisk,mkfs和dd等這些磁碟和塊設備操控命令,運維的話會經常碰到。
  • 第八,手動安裝個nodejs。nodejs + express應該是現在服務端最熱的搭配,做運維的必須要知道
  • 第九,熟練一些網路工具。比如netstat,nslookup之類的,方便你調試問題。

以上就差不多了。等你做完這些之後,後面的我相信都不需要我去教你了,你自然而然就會遇神殺神,遇佛殺佛,遇到問題找谷歌了。經歷過一段時間的迭代之後,相信下次在這裡去指導後輩怎麼去學好Linux的就是你了。但要記得到時不要捏捏藏藏的,要勇於秉承開源精神,把自己的知識分享出去。

我們上面說了還有Linux軟體開發和Linux源碼閱讀,我感覺戰線拉的有點長了,現在時間已經很晚了。我加快點速度,看能說多少就多少把。

第二個,應用開發怎麼學好Linux?首先,這裡你要確定你最終想要做什麼。你是想要開發一個終端應用呢,還是想要開發一個app的服務端?

如果你是想要開發一個終端應用或者一個daemon服務之類的,用c/c++吧。如果是需要console的,我以前用過ncurse庫,非常不錯的。但是開始之前最後你去買本Linux c/c++編程入門的書籍看一下,然後去了解下make以及makefile應該怎麼去寫。

別擔心,真的不難。只要你花個一頭半個月的時間進去,基本上你就能寫出自己的一個應用出來了。所以針對怎麼學好Linux開發,最重要的一點應該是耐心,沉得住氣!

如果你是想做個app的服務端的,去學習以下這幾個東西,足夠了。

  • 第一,nodejs + express。這是你寫服務端的主要框架。
  • 第二,mongodb。這是你的資料庫。
  • 第三,redis。這是你鑒權即用戶登錄需要用到內存資料庫。你總不能每次驗證用戶有效性的時候都去mongodb對比用戶名密碼吧?搞個access token,session什麼的,保存到redis上。

說完Linux應用和服務端開發,下一個怎麼學好Linux的命題就到了怎麼學好Linux源代碼的。這個我自己都沒有完全看完Linux源碼。但是根據我之前學習的經驗,我已經寫過對應的一篇回答叫做《Linux內核代碼大佬們如何觀看的?》的了。看點贊數的,應該很多人認為該方法是可行的。感興趣的可以關注我到我空間下去看下吧,我就不重新寫一遍了。

新手閱讀Linux源碼的正確姿勢天地會珠海分舵的視頻 · 2.4 萬播放

好了,時間已經很晚了,明天還要搬磚,就先寫到這裡吧。沒有什麼時間校驗錯別字之類了,如果有朋友看到哪裡寫錯之類的,請評論給出來,我再進行修改吧。

最後感謝大家的時間觀看,喜歡的歡迎點個贊關注下吧。當前粉絲太少了,我都有點喪失創作動力了。


看你的現狀和未來想用 Linux 幹什麼吧。我是在大三的暑假想給自己增加點技能,學一些課程里沒有,但有的確有用的東西。Linux 是接觸 Unix 最便捷的途徑(20 多年前了,那時候還是 RedHat 6.0 剛出沒多久。

為什麼不是 FreeBSD?和 Linux 同期出來的。要論可學的內容,及討論熱度,Linux 更多一些。如果一個領域內都是大牛,很少小白,那麼能看到的問題就會很少,後面的內容里提到的學習方法就比較難推進。學會了 Linux 再反推 FreeBSD 的學習,在很多基礎知識已經具備的前提下,就沒什麼難度。

核心思路是多動手

剛開始感覺無門而入,裝上以後看著那個老舊的 X 界面,還不支持中文,打開 console 界面發現想幹什麼都不會。就去學校的 BBS 看 Linux 版精華區,自己學校里的看完了就去水木清華(現在也還存在著,感謝 KCN),裡面有師兄們寫出來的各種經典問題和回答,然後從標題里看到了好多 Linux 命令,就在自己的電腦里看 man page(有問題找男人),到現在也還是英文版的居多,其實看多了就會有感覺,專業英語里用到的英文單詞並不多,大不了試試嘛,系統玩掛了就重裝。那個暑假重裝過不知道多少次,以及,一塊硬碟里裝 10 個不同版本的發行版,互相之間 chroot 什麼的。如果是學生,我會建議也這麼多來幾遍,如果已經工作了想要拓展自己的職業能力,我不建議在這方面多花時間,某個周末把倆虛擬機的硬碟文件掛一起試試看怎麼修改啟動菜單,啟動以後怎麼 chroot 也就差不多了。

後來就主要是關注各種 shell 命令了,vim 不說了(emacs 也有很多人用,這兩種編輯器的各有陣營,選自己覺得喜歡的就好),grep/ sed / awk,然後發現正則表達式是個繞不開的問題,就去研究了一下正則表達式(regexp) ,後來實習的時候剛好遇到一本書是講正則表達式的,有兩包煙那麼厚。

自己想要去遇到問題然後解決,會比較慢。這時候 BBS(現在是各種專項論壇)的重要性就體現出來了,天天跑去學校 BBS 上幫別人解決問題。因為 100 個人遇到的問題,比自己去探索要迅猛的多了,這是重點,有點像「分散式問題發現」,因為未來那些問題都有可能是自己會遇到的。用問題幫自己打開門

現在當然有很多書、線上的或者印刷版的可以看了。這方面我感覺,如果想走捷徑,不想吃苦,那乾脆就放棄了算了。成書的通常是比較常規的操作教學,分兩類,籠統的 Linux 學習的書,因為內容長度限制,會把常規操作、問題列出來,就想數學書里會講怎麼解方程,但還是要自己會做應用題,會去用哪些方法。另一類是專項的書籍,像我上面提到的正則表達式那一大本。

入門時,全系統教學的那類選一兩本就好,比如鳥哥 Linux 那本也盛行了好多年了吧,現在也經常見到有人推薦,坦白說我沒看過,因為那本書出來的時候我已經不用看那類(第一類)教學書籍了。然後就回去選各種專項書籍看看,不好推薦,因為分支和方向太多。圖書館和書店是好東西,以及各種別人總結出來的文章(用了 20 多年 vim,現在我在知乎上看 vim 相關的問題和回答,依然能學到好多東西,是版本更新和自己以前忽略過的)。

中間嘗試翻譯一些 man page,和寫一些經驗總結的文章,因為在寫文章的時候需要全面、具體,能促進自己把某件事情學透,所以寫東西是個不錯的學習方式,即使你覺得自己很菜,總有比你更菜的人需要你再往前走的時候總結的經驗。有點記不清了,記得寫過一篇 X Window 的配置文件詳解,怎麼在各種顯卡的機器上獲得最好的顯示效果(是的,那時候大部分台式機都是自己攢的,什麼顯卡都有,支持和配置都會比較麻煩),還有一篇我確實忘了,因為那兩篇對現在的 Linux 發行版都已經用不上了。

熟讀對自己很很有用的文檔,會遇到很多自己不知道的名詞,而且是很有用的名詞,比如 regexp。

  • 比如當時覺得 bash 內置命令、參數、環境變數,以及寫腳本遇到的問題,對自己有困擾,就把 bash 的 man page 通讀了一遍,很長,但花費的時間,讓我在未來的若干年裡都受益(寫了個 shell 腳本,掛在 inetd 下面做服務,快速解決問題)。
  • 再比如 vim 的初學者都覺得很難用,那我就打開它,進入幫助頁,挨個試。比較耗時,因為很多時候都需要先把那些命令或操作鍵需要的編輯內容寫出來(比如寫一段代碼什麼的)。
  • 再比如各種網路配置,怎麼通過配置文件完成各種設置,然後不重啟系統讓那些配置生效。
  • 如果將來想做運維,還可以去熟悉各種伺服器軟體的配置,比如 bind(域名解析)、apache、nginx(這倆是 Web 伺服器)、proftpd(ftp 伺服器)、sendmail、postfix(這倆是郵件伺服器)。
  • 如果對安全感興趣,可以學習 SELinux,PAM 認證,ssh server 配置。

即使一些東西自己僅僅是淺嘗則止,但是未來在需要用到的時候你能知道有那樣一個東西存在,再去深挖找答案,都好過在遇到問題的時候茫然不知所措

回答這個問題到現在的話,總結出來就是發現自己的未知,然後找答案,是最好的學習方式。

現在的學習、提問途徑已經比以前豐富太多了,如果 google 搜索用不了,那也百度,面試人的時候我會問到對方找答案的方式。國外的 stackoverflow 上有好多問題和答案,GitHub 上也有好多學習資源,各種 awesome- 打頭的項目。

找問題,找答案,別提問。因為你問的問題,都是好多人早就問過,也有好多人都已經回答過的

還有一點是,如果你不做嵌入式,不是想要改造系統,沒有寫驅動的需求,從實際需要的角度出發,就先別嘗試閱讀 Linux Kernel 源碼,及內核研究領域。現在的 Linux 源碼已經足夠複雜了,得不償失。如果是出於個人興趣,那就請隨意。

-- 補充 --

後來我在這樣的基礎上,利用 Linux 的網路知識,首先是混成學校 BBS 管理員,一起改進代碼。然後更重要的是,搞懂了 HTTP、SMTP、POP3、IMAP 這些基礎協議。郵件現在用的少了,而且不能隨意架設伺服器。但 HTTP 相關的知識,不管 Web X.0,都依然很有用。


10年運維 安全 網路 搬磚工大概總結下

希望能可以更多人帶來幫助

先觀其大略,再不求甚解。

1.學習的流程入門,進階,高級,任意發揮

入門篇:大概就是Linux前世今生,基礎命令,系統文件操作,網路設置操作,開關機自動化簡單命令,這部分枯燥但是以後天天會用,一定要了如指掌。切勿死記,要學會用man help 等。

進階篇: web dns ftp database php java 等各種開發環境的搭建,日誌分析,拍錯理解各自之間的關係。一定要多會用搜索引擎,因為目前只要能出現的錯誤,不像10年前,一搜1頁,還得去國外找e版本,所以的報錯前輩們都基本上有解決辦法。

高級篇:一般到高級服務的時候,公司或者運行的環境已經10+以上設備了。前端集群,中間件,緩存,資料庫,日誌分析,大數據分析,虛擬化平台,這部分的時候一定要熟悉改服務的整套運作模式。

任意發揮: 武功最高境界是無招勝有招,出什麼錯排什麼錯。自己不會就借力。借朋友,借圈子,這時候就呈現出來的是資源的重要性。

2.技術圈內圈外論

圈子,決定高度,圈子不同,不能硬融。

一定要會分析屬於自己的圈子

找到適合自己的技術圈

避開鋒芒,學會錯位和自己的定位

找本地的技術論壇峰會報名參加

兵法曰 知己知彼 百戰不殆

3.找領地 深耕細作

如果經過了5-8年以上,還在整天孤島web db

拆硬碟,剪網線,那索性就放棄這個行業吧!

技術領域是真正屬於那些勇於探索的小夥伴

你們加油,俗人只喜歡搞錢。

所以放棄了這個圈圈!


推薦閱讀:
相关文章