專家級:
此級別一般是專業方向。不是通用技能。系統的瞭解和預備知識的準備相同重要。好比tcp的深入理解纔會知道怎樣作syn的ddos防禦(不是內核的那個開關),對無線理論的深入瞭解,才幹搞無線的內核和應用內容。前端
內核虛擬化、內核存儲邏輯(scsi、pci、usb等專注的和串聯的)、無線子系統、音頻子系統、顯卡子系統、電源管理子系統、網絡子系統、電源管理子系統java
專家級以前的通常都要學會,工做中都會用到。這裏的定級也限於對linux操做系統的使用,一般是軟件和系統特性。也並無涉及太多的編程要求。編程是另外的一個方面。編程能力很差不必定linux水平不行,因此這裏的定級不怎麼考慮編程水平。python
對linux的使用者實用來替代windows的普通桌面用戶(如使用startos),可能緣由是認爲windows很差用。或者是感情問題。或者是版權問題,或者是爲之後深刻linux作平滑準備的。
也有命令使用者。mysql
這部分人涵蓋了很是多實際的工做崗位,典型的是運維。linux
運維有很是多細分的子崗位:系統管理,軟件管理,後臺server管理(好比數據庫。http server),軟件部署,安全等。ios
安全有時候劃入運維,有時候單獨列出。nginx
因此。linux用好了就是可以當飯吃的。golang
使用桌面可以鼠標點點便可,但是也可以用的很是銷魂。web
也有專門的職業工做就是怎麼把桌面用起來。算法
好比嵌入式裏的裁剪和啓動桌面(讓startx命令跑起來)。
linux的桌面有很是多。普通的使用者一般會直接使用這幾個桌面提供的環境和軟件。
發行版有很是多,一般是不一樣風格或者是服務於不一樣目的的專用發行版。常見的通用的發行版有:Ubuntu、opensuse、fedora、debian、Mandriva、mint、。
眼下ubuntu大有一統之勢,愈來愈多的使用者和開發人員轉向ubuntu,甚至server後端曾經常用的centos也在慢慢的丟失市場給ubuntu server。
專用如kali(網絡滲透)。puppy,lubuntu(精簡),coreos,ubuntu core(虛擬化),router os(路由器)。這些專用發行版通常提供給專業用戶,普通用戶也可以使用,要發揮其所有威力。一般需要不少其它的行業知識。
常見桌面環境有很是多:ubuntu的unity、gnome、kde、Cinnamon、mate、lxde、xfce。通常各個發行版都會攜帶不一樣的桌面魂晶,每個桌面環境的窗體風格都是不同的,還包含隨桌面管理器攜帶的配套軟件通常也是不同的(好比計算器。包管理器,音樂播放器等)。但是有的流行的軟件仍是會被移植到不一樣的桌面管理器上。但是大部分沒有。
gnome、kde、unity的使用者最多。unity眼下僅僅用於Ubuntu。ubuntu也並不是僅僅支持unity一種,差點兒所有的桌面環境ubuntu都有相應的支持版本號。unity的使用率隨着ubuntu的普及而迅速上升。
高級的桌面使用者通常可以自由的選擇不一樣的桌面環境,理解每個桌面環境工做的原理,理解X系統,可以遠程多終端使用X。自由的選擇啓動甚至不啓動X或者X的一部分。
理解X和桌面管理器與窗體管理器的差異。
framebuffer模式的顯卡自己不具備不論什麼運算數據的能力,他比如是一個臨時存放水的水池.CPU將運算後的結果放到這個水池,水池再將結果 流到顯示器.中間不會對數據作處理.在這中狀況下,所有顯示任務都有CPU完畢。CPU負擔很是重.從frambuffer這個名字咱們就能推測到他的功能 了(數據偵緩衝).
在linux內核中有有framebuffer機制,摹仿framebuffer顯卡的這樣的功能.他的優勢是把顯卡的硬件結構抽象掉。把所有的顯卡都當作一個」水池」來用.應用程序也可以直接讀取這個水池的內容.framebuffer的設備名是 /dev/fb
可以用命令:
#dd if=/dev/zero of=/dev/fb
清空屏幕.假設你的X用的是framebuffer的驅動,屏幕將全變黑.經過移動鼠標,切換窗體等動做可以讓原先的內容又一次顯示.
假設你不用framebuffer驅動,可以在字符模式下作這個試驗.屏幕將所有被清空.
如下的命令:
#dd if=/dev/fb of=fbfile
可以將fb中的內容保存下來,之後可以又一次寫回屏幕:
#dd if=fbfile of=/dev/fb
做用類似於屏幕截圖。但是截下的圖不能用普通圖片瀏覽器看.
linux字符界面在高分辨率下,啓動時會有一個小企鵝logo,這個logo就是用framebuffer功能寫上屏幕的.
Linux內核給用戶提供了顯示frame buffer。所有要顯示的東西寫到buffer去就行了。也就是內核提供了顯示的機制,但是沒有提供顯示的內容。因此顯示內容需要 操做系統去實現。
差點兒所有的linux顯示的核心都是X系統。X是一種顯示協議,實現這個協議的常用軟件是Xfree8六、motif(商用),xorg、xnest等。
因此X也可以實現在windows中,蘋果操做系統也是用的X。僅僅是是實現在內核中。
現在的髮型版通常都默認使用xorg。好多人都看到x11這個詞,X11R6 其實是 X Protocol version 11 Release 6(X協議第11版第六次發行)的意思。
運維人員可以說是最專業的linux使用者了,因爲他們要關心linux整個系統的執行情況,是對linu系統的使用挖掘的最深的一羣人。研發可能會更深刻,但是通常不如運維的廣度和揮灑自如。
一個運維的基本功應該是查看系統狀態的命令和腳本的編寫,深刻一些的運維對linux有很是深入的瞭解。
運維常用的查看系統資源的命令有:
- 網絡
- iftop:查看ip——ip的流量。還可以交互的查看port到port,以及進行過濾
- netstat(可以用ss替代)
- iptraf:圖形化的觀看ip流量
- nethogs
- tcpdump:抓包直接打印或者保存爲pcap文件。甚至可以生成bpf代碼
- ngrep:把網絡數據包當成grep文件同樣過濾。
高速查看網絡數據的神器
- mascan:掃描器
- hscan:掃描器
- nmap:掃描器
- 內存
- vmstat
- io
- iostat:
- iotop
- 進程
- top:基礎的進程查看工具。可以動態的查看進程的內存、cpu等系統資源。可以交互
- htop:加強的top,界面更美麗。功能也略多
- 其它:
- sar
- lsof
- acct
- monit
一些方便的工具應用:
nping、incron(使用inotify機制,當文件發生變化時本身主動執行註冊腳本。相應於cron是基於時間的,incron基於文件事件)。rsync(遠程文件同步)、inotial(不是輪訓的tail,而是基於文件變化事件的tail)
從/sys/文件夾如下看到系統當前的物理資源(好比經過rotational文件來推斷一個設備是不是ssd),
通常的運維人員都會讓本身的shell儘可能的帥起來,好比使用guake。tmux,zsh等,還要熟練使用ssh遠程管理系統,以及相關配置。一般你們都是編寫bash腳本。
通常的,運維人員的cron和本身主動化腳本都是管理的每臺機器必有的。
系統管理員與運維人員很是類似,只是運維通常出現在互聯網企業,系統管理員通常出現在傳統企業。通常的。系統管理員比運維更偏向於使用現有工具。而運維對系統的瞭解和腳本的使用更熟悉一些。
通常對升級內核要求很少,但是升級系統版本號仍是有的。庫的部署,部署環境(docker),解決環境問題。軟件公佈,配置管理等。
通常對etc下的配置文件都要很是熟
一個大頭的工做很是多是:修電腦。。。。
好比數據庫管理員、http server、ntp、dns server、ftp server等各類常見的server的搭建和配置管理。
提及來easy。但每個軟件的配置文件都是一坨。詳細閱讀doc,多踩坑。祝君好運。
linux的安全系統發展至今很是全面,但是仍是遠遠不夠,linux距離一個安全的操做系統還有很是長的路要走。
- 在linux中的基礎安全是UGO文件權限,對於進程的能力限制capbilities。
- 提升的是內核的安全框架lsm。以及在lsm下實現的各類防火牆,好比實現flask框架的selinux和apparmor。
- 還有針對文件的,mount文件系統的時候指定acl就可以針對文件進行訪問控制。還有開源的殺毒程序clamav
- 還有訪問控制模塊pam,可以把進程的認證工做由程序猿轉交給系統管理員
內核剪裁、編譯、改動、移植
內核的使用者多見於嵌入式開發和運維的內核升級。但是運維的內核升級通常涉及的功能裁剪較少,涉及的漏洞更新和功能加強較多。換句話說運維作內核是爲了升級。嵌入式作內核是大部分爲了降級。
很是重要的一點,linux內核從2.6.30版本號開始,基本不適用於嵌入式系統。
儘管仍聲稱爲嵌入式應用作了諸多優化,但是業界的嵌入式開發基本停步在2.6.30版本號的內核。你可以看到內核的新功能和加強基本都是爲了互聯網而產生的。而針對這樣的內核進行裁剪也愈來愈難,甚至要高版本號的內核在嵌入式板子上跑起來這個主要的工做也愈來愈複雜。這也從側面反映出了互聯網的活力和嵌入式行業的守舊。
內核的裁剪工做最主要的不要求對內核怎樣實現有太多的瞭解,但是需要知道內核實現的那些功能有什麼,爲什麼需要。好比你得現有net設備。以後net功能纔是可選。並且net功能的繁多,一個嵌入式設備根本大部分不需要。內核的編譯排版很是重要的一點是依照功能的層級劃分的,而不是依照功能的重要性劃分的。
比方你會發現無線系統裏rfid,led。業餘無線電和wifi是平級的,但是大部分人對前三者是不會使用的,僅僅需要wifi。但是內核的編譯選項的組織並無針對這樣的需求上的流行程度進行優化。
因此一個內核裁剪者需要知道差點兒所有內核選項的做用,最好多試試。至於針對改動。內核的實現大部分爲了通用性,對效率和安全的考量是很是少的。假設你深刻內核的代碼層次的研究。你會發現內核的實現大部分在你使用的場景。你會有更優的算法。
你會想去又一次實現。但是,這裏有一點linux內核最大的哲學:
內核的主要目的是搶佔市場。
因此。內核會覆蓋儘量多的功能,但是大部分功能的實現都不是企業級的。好比假設你的產品要支持打印機,你通常不會去用內核內置的功能,你會去購買更產品化的內核模塊(好比kcodes),假設你的產品要支持samba,你會發現內核對ntfs的支持就是搞笑的,你仍是會去購買商用的ntfs內核模塊(商用的和開源的是同一個公司開發的)。
當你多關注內核的發展時。你會發現開源發展的最好的模塊一般是企業支持的,而這背後通常有商用版本號存在。這就是內核的本質,出發點是開源的,共享的。發展是靠利益驅動的,繁榮則是全然靠商業的。相同的。商業又會阻礙內核的發展,因此感激尚存的爲了理想而生活的程序猿。他們該開個帳戶,咱們給他捐款。0….
移植工做考驗的大部分不是內核自己的技能,而是對gcc的瞭解程度。尤爲是內核使用的Makefile系統。因此。想要作好嵌入式內核的移植工做。編譯系統和鏈接的paper看一遍你基本就是大牛了。中國業界的大部分從業者。都不會去看的。我也不知道爲啥,他們就是不去看。
。
。
。
開發人員就是傳說中的程序猿。剛開始入門的程序猿一般會注重語法。helloworld就是這樣的心態的典型寫照。不一樣級別的程序猿用戶的素養要求是不同的。好比寫業務代碼,需要架構能力和編碼標準。寫高性能程序則需要數學。算法和高性能編程的硬件相關的知識。寫實時代碼又是需要另一套理論體系。編程的語法是基礎,但是編程的核心歷來都不是語法。
選擇了一門好語言,基本就能肯定你要用他來作的事情。
不存在萬金油的語言。注重效率的和注重高速開發的。注重project管理,注重描寫敘述問題的都不是相同的語言(固然你要用C作web開發我也沒辦法),甚至還存在專門處理字符串最牛逼的語言(perl)。對於linux來講,linux是個平臺,開發高性能代碼通常就得是asm,C和C++,需要性能和開發效率折中的可以有golang。腳本化的語言也是都可以用在linux上的,那取決於業務。
單有語言寫個hello world還可以,project編程最重要的是庫。
就是代碼的複用。一個成熟的程序猿和一個入門級的程序猿的最大差異不在於語法的熟練程度,在於架構能力和庫的複用能力。
因此,linux之於開發人員。不存在編程語言和庫上的障礙。
基本上是內核所提供的功能上的。以及你怎樣使用這樣的功能(利用epoll、inotify等)
linux下常見的桌面主要是kde和gnome。但是基本沒人敢用他們開發工業產品。因爲指不定哪天他們就沒了。照眼下看來,gnome伴隨着ubuntu的unity用戶UI統一天下的機率很是大,說不定往後愈來愈多的廠商願意爲ubuntu的gnome開發圖形界面的應用。
眼下linux上的產品級的應用的圖形界面通常使用Qt,java(swing)等成熟的。可移植的圖形庫。
因此眼下來看,假設你是桌面程序猿(andriod除外),你可能要用java和Qt的C++了。
因爲andriod也是java,因此最划算的選擇是用java(外國人對java有強大的熱情,因爲他是最先普及的工業化的編碼語言,但不表明他是眼下最好的)。因此學習桌面應用開發基本上就是學習這兩款產品的文檔。
後端開發人員佔領了很是大一部分it開發就業比例(界面,站點。等前端開發人數最多。變化最快,技術沉澱最難),差點兒所有面向社會的程序都有後臺server(很是多單機程序是沒有的)。也是差點兒所有的後臺server都要存儲數據。
因此後臺開發人員要面對的核心開發點就是:網絡使用、傳輸編碼、數據存儲和多線程編程。至於後臺設計的業務。在這4大模塊來看差點兒可以忽略。因此後端開發技術要求比較高。而眼下的server差點兒被linux一統江湖了,這個趨勢還會愈演愈烈,windows在這個領域基本沒救了。
今年golang在後端開發的流行度迅速崛起,但是大部分仍是使用C/C++,python作後臺開發也有至關大比例的份額(別說人家的效率不行,人家快,效率可以用錢買機器解決)。因爲golang大部分使用自帶的網絡庫,因此這節不關golang啥事了。
網絡常用的C/C++後端庫是:原生的epoll、libevent、libev、boost::asio。ace。ace通常產業界沒人用,較好不叫座。libev理論上比libevent高效,但是實際使用不見得。通常的工業級的開發都是使用libevent或者epoll,也有使用asio(比較少。因爲C++難度高,大部分網絡服務是C的)。
傳輸編碼問題,曾經是直接使用本身定義的格式或者本身定義的json後面加壓縮,後來發展出了序列化。
再後來序列化進一步發展造成了protocolBuffer, thrift, avro等大公司主導的傳輸格式。眼下通常要用網絡數據傳輸protocol buffer用的最多,thrift強勢崛起,avro剛剛起步,但是特性不俗。
數據存儲問題。mysql差點兒是大小系統的第一選擇。很是小的可能會使用sqlite,涉及到非IT大型企業可能用商用數據庫比較多(本身不能開發,賣他的人又得賺錢)。nosql裏mongodb用的比較多,但是近年各類nosql數據庫千奇百怪。
有專門存放圖的數據庫,也有存儲下載內容的分級的(rocksdb),也有存儲地理信息的等等。
假設你是專業方向的開發人員,可能這些專門的數據庫更適合你。
多線程編程,在C/C++的世界裏沒有太多的選擇。一般是pthread,C++可以用boost:thread或者C++11的thread,其後臺也是pthread。pthread基本可以一統江湖。
因此使用庫的linux開發人員僅僅需要了解庫的使用方法,固然對庫後臺是怎麼調用操做系統詳細實現的,可以瞭解也是很是好的。
假設你打算看看你的發行版上裝的那些莫名其妙的庫是用來幹嗎的。好比libncurses,libnss,libfuse等,而這些通常你平時開發應用程序都用不到。那麼你基本作的就是系統級的後端開發了。系統開發與操做系統的關聯很是大,學習系統開發就是在學習操做系統。
系統開發對內核信息的獲取要經過proc和sys。這是必定要熟練掌握的。這兩個proc還比較easy,但是內容也很是多。sys則比較龐雜。內容不少其它。好比你得清楚的知道/proc/sys/kernel/core_pattern裏面存的是core dump的路徑。ulimit -c可以用來設置core的大小,默認是0.這些基礎的背景知識以及整個文件系統衍生出來的知識點是系統級後端開發的基礎。
這些常用的開發內容包含:fifo文件,uevent,inotify,netlink。nice(實時進程),cpu親和度,cgroup虛擬化。ptrace進程跟蹤,子進程建立和控制,信號處理,文件鎖。向量化的讀寫文件,文件描寫敘述符操做,socket調用,epoll。文件與文件夾連接控制。鎖。磁盤配額校驗。進程記帳,權限控制,執行優先級(io和cpu),低級port操做和sg直接發scsi命令,交換分區控制。pdflush,kswapd等內核進程的調優。模塊的裝載與卸載。內存映射與加鎖,cache操做,直接的網絡操做。用戶管理,消息隊列、信號量與共享內存等。
系統級的後端開發直接是面向內核的使用,也就是系統級的開發人員基本就是內核的合格使用者。
運維開發人員比較接近於系統開發人員,但是運維開發人員比較多的使用cron命令,腳本,着重於系統資源的監控和劃分。現在流行的devops好比ansible工具讓運維與開發一鼓作氣。運維開發人員首先是一個運維使用者,運維繫統好比全網監控系統。包公佈系統,主機探測系統。域名系統等都是運維開發人員的方向。一個運維開發人員不作詳細業務,也不是直接爲詳細業務服務,而是讓詳細業務可以專一於詳細業務。
通常的技能要求:常用運維命令,腳本。python
安全開發人員有兩種。一種是怎樣讓本身開發的軟件更安全,還有一種是就是開發安全防禦軟件。好比病毒掃描,防火牆,入侵檢測,漏洞管理,權限控制等。
除了對安全使用者的技能的掌握外,還需要更深刻的瞭解白帽子們的安全防禦細節和原理。一般能防的人也能攻。不知作別人怎麼攻就在防基本是瞎防。攻防是互動進步的。
內核裏有很是多針對安全開發的特性提供:內核加密接口和祕鑰環、ASLR(進程啓動棧隨機化)、LSM機制。
作安全開發對系統自己的特性利用不大,對攻防手法的理解要求比較大。另外。防護系統一般是在業務的前面,因此要求低延時和高吞吐。因此基本上僅僅能使用C/C++(假設你見到哪一個防火牆用python寫的,麻煩給我膜拜一下)。
因此安全開發的核心是業務和高效編程的能力。
而高效編程好比對dpdk、sse指令集的使用就是一個專門的學科了。業務就是安全相關的知識點。
大部分應用的後臺就有兩個要求:開發快,問題少。因此現在的市面上你會見到大把的時候golang、python甚至java作後臺開發的案例。這樣的形式的後臺開發基本與操做系統無關,懂得主要的linux系統使用便可。
人們可以專一的面向業務。
內核開發人員的難度應該是最難的,假設誰提交了一個patch被內核接受了,那是很是了不得的事情。因爲內核自己進展就很是大。並且內核開發沒有市場上的職業相應,基本全靠偶然接觸或者興趣。職業最多的是驅動開發和內核裁剪小改動,另外文件系統開發和網絡開發對內核也涉及到一些內核開發。因爲內核的龐雜和耦合性比較重,學習自己就很是難了,更別說開發。但是假設你已經可以開發了。那很是多牛逼的開發就可以如探囊取物了,就像寫一個C++程序那麼順手。
驅動開發對uevent、kobject系統的瞭解需求比較多,明確udev程序和dev文件夾的工做原理。設備號的管理,主要的內存申請和使用。進階的可以瞭解內核socket編程。進程的控制等。內核驅動的編程最主要的仍是業務,要知道你控制的設備的寄存器和相應的總線在內核中的邏輯。
好比所有磁盤都是使用scsi命令,都要通過scsi層,usb。pci等總線的運做和內核接口的使用。
因爲一切皆文件的思想,因此文件系統在linux中特別重要。
你得可以建立虛擬的設備,得學會利用dev下的設備,重要的,你得學會使用fd。這個fd就是簡單的C裏面open一個文件以後生成的那個,但是也是socket()以後生成的那個,因爲是系統資源,因此fd是跨進程的,你僅僅要知道fd的號碼,就可以在其它進程中直接使用。比方0,1,2(實際不是這個號碼)號的fd就是輸入輸出和錯誤。
因此經過shell事實上可以作好多事情(O(∩_∩)O)
內核層次的文件系統開發,必須得了解文件使用的整個流程,一切皆文件僅僅是最上面的vfs層。往下還有通用塊層(在這裏要進行重要的電梯算法),還要scsi層,要把對邏輯文件的訪問變爲對物理存儲訪問的命令,還要pci層。還要usb層。邏輯成真總要通過物理。因此物理協議實現的瞭解也是必須的。
內核中提供了很是多默認的文件系統操做,很是多實現的文件系統都直接使用的默認的實現。有一類關鍵的文件系統是fuse,在用戶端實現的。像個程序同樣。這是內核爲版權保護作的折中。
內核現在愈來愈多的傾向於把功能讓給用戶空間,大內核的思想在收縮。
因爲開源的力量在一個點上確實不如商業高效。
文件系統通常可以以模塊的方式提供,可以很是easy也可以很是複雜。因此文件系統開發對內核的瞭解與其它差異不大。但是對文件系統自己有比較高的知識儲備要求。
好比完整性校驗,extends大塊。磁盤配額,磁盤訪問控制acl,熱插播。B+樹等。
Linux內核自己的網絡協議棧比較低效,但是可以應付絕大多數的使用狀況。使用內核原生的協議棧時,一般是使用netfilter的hook。用內核的模塊作一些事情。對內核代碼自己的改動是不建議的。詳細作安全仍是包變換,有很是多netfilter的iptable自己就可以作。bpf更是提供了可編程的規則。
因此內核層面的網絡開發核心是netfilter。
對於有高性能要求的。通常有新浪的fastsocket和intel的dpdk這兩種協議棧可以供選擇。fastsocket眼下還不支持長鏈接,但是nginx這樣的短鏈接應用會收益良多。
dpdk沒有socket的概念。純粹的包處理,並且是在用戶空間,完美的支持多CPU和numa系統。因此你可以看到阿里。騰訊,谷歌,百度等都是用dpdk來作的網絡。