做爲一名開發者或極客,Linux 才配得上你的高逼格
本篇描述的是Linux的介紹及結構,讓你認識這位性感的 麗娜絲 女士程序員
若是你之前從未接觸過Linux,可能就不清楚爲何會有這麼多不一樣的Linux發行版。在查看Linux軟件包時,你確定被髮行版、LiveCD和GNU之類的術語搞暈過。初次進入Linux世界會讓人以爲不那麼駕輕就熟。在開始學習命令和腳本以前,本章將爲你稍稍揭開Linux系統的神祕面紗。首先,Linux可劃分爲如下四部分:shell
|--------------------------|
| APPS | 應用軟件
|--------------------------|
| | GUI桌面環境
| GUI |-------------|
| | GNU | GNU工具鏈
|--------------------------|
| kernel | Linux內核
|--------------------------|
| hardware | 計算機硬件
----------------------------
複製代碼
Linux系統的核心是內核。內核控制着計算機系統上的全部硬件和軟件,在必要時分配硬件,並根據須要執行軟件。數據庫
操做系統內核的主要功能之一就是內存管理。內核不只管理服務器上的可用物理內存,還能夠建立和管理虛擬內存(即實際並不存在的內存)編程
內核經過硬盤上的存儲空間來實現虛擬內存,這塊區域稱爲交換空間(swap space)。內核不斷地在交換空間和實際的物理內存之間反覆交換虛擬內存中的內容。這使得系統覺得它擁有比物理內存更多的可用內存數組
Linux系統內存映射緩存
|---------| -----------
| | | 物理內存 |
| | /----------
| | ---------
| 虛擬內存 | —— | 內核 |
| | ---------
| | \----------
| | | 交換空間 |
|---------| -----------
複製代碼
Linux操做系統將運行中的程序稱爲進程。進程能夠在前臺運行,將輸出顯示在屏幕上,也能夠在後臺運行,隱藏到幕後。內核控制着Linux系統如何管理運行在系統上的全部進程。安全
內核建立了第一個進程(稱爲init進程)來啓動系統上全部其餘進程。當內核啓動時,它會將init進程加載到虛擬內存中。內核在啓動任何其餘進程時,都會在虛擬內存中給新進程分配一塊專有區域來存儲該進程用到的數據和代碼。bash
Linux操做系統有5個啓動運行級服務器
內核的另外一職責是管理硬件設備。任何Linux系統須要與之通訊的設備,都須要在內核代碼中加入其驅動程序代碼。驅動程序代碼至關於應用程序和硬件設備的中間人,容許內核與設備之間交換數據。在Linux內核中有兩種方法用於插入設備驅動代碼:網絡
之前,插入設備驅動代碼的惟一途徑是從新編譯內核。每次給系統添加新設備,都要從新編譯一遍內核代碼。隨着Linux內核支持的硬件設備愈來愈多,這個過程變得愈來愈低效。不過好在Linux開發人員設計出了一種更好的將驅動代碼插入運行中的內核的方法。
開發人員提出了內核模塊的概念。它容許將驅動代碼插入到運行中的內核而無需從新編譯內核。同時,當設備再也不使用時也可將內核模塊從內核中移走。這種方式極大地簡化和擴展了硬件設備在Linux上的使用。
Linux系統將硬件設備當成特殊的文件,稱爲設備文件。設備文件有3種分類:
Linux爲系統上的每一個設備都建立一種稱爲節點的特殊文件。與設備的全部通訊都經過設備節點完成。每一個節點都有惟一的數值對供Linux內核標識它。數值對包括一個主設備號和一個次設備號。類的設備被劃分到一樣的主設備號下。次設備號用於標識主設備組下的某個特定設備。
不一樣於其餘一些操做系統,Linux內核支持經過不一樣類型的文件系統從硬盤中讀寫數據。除 了自有的諸多文件系統外,Linux還支持從其餘操做系統(好比Microsoft Windows)採用的文件 系統中讀寫數據。內核必須在編譯時就加入對全部可能用到的文件系統的支持。表1-1列出了 Linux系統用來讀寫數據的標準文件系統。
ext | Linux擴展文件系統,最先的Linux文件系統
ext2 | 第二擴展文件系統,在ext的基礎上提供了更多的功能
ext3 | 第三擴展文件系統,支持日誌功能
ext4 | 第四擴展文件系統,支持高級日誌功能
hpfs | OS/2高性能文件系統
jfs | IBM日誌文件系統
iso9660 | ISO 9660文件系統(CD-ROM)
minix | MINIX文件系統
msdos | 微軟的FAT16
ncp | Netware文件系統
nfs | 網絡文件系統
ntfs | 支持Microsoft NT文件系統
proc | 訪問系統信息
ReiserFS | 高級Linux文件系統,能提供更好的性能和硬盤恢復功能
smb | 支持網絡訪問的Samba SMB文件系統
sysv | 較早期的Unix文件系統
ufs | BSD文件系統
umsdos | 創建在msdos上的類Unix文件系統
vfat | Windows 95文件系統(FAT32)
XFS | 高性能64位日誌文件系統
複製代碼
GNU組織(GNU是GNU’s Not Unix的縮寫)開發了一套完整的Unix工具,但沒有能夠運行它們的內核系統。這些工具是在名爲開源軟件(open source software,OSS)的軟件理念下開發的。
開源軟件理念容許程序員開發軟件,並將其免費發佈。任何人均可以使用、修改該軟件,或將該軟件集成進本身的系統,無需支付任何受權費用。將Linus的Linux內核和GNU操做系統工具整合起來,就產生了一款完整的、功能豐富的免費操做系統。
GNU coreutils軟件包由三部分構成:
GNU/Linux shell是一種特殊的交互式工具。它爲用戶提供了啓動程序、管理文件系統中的文件以及運行在Linux系統上的進程的途徑。 shell的核心是命令行提示符。命令行提示符是shell負責交互的部分。它容許你輸入文本命令,而後解釋命令,並在內核中執行。
bash | 由GNU項目開發,被看成標準shell
ash | 運行在內存受限環境中簡單的輕量級shell,但與bash shell徹底兼容
korn | 與Bourne shell兼容的編程shell,但支持如關聯數組和浮點運算等一些高級的編程特性
tcsh | 將C語言中的一些元素引入到shell腳本中的shell
zsh | 結合了bash、tcsh和korn的特性,同時提供高級編程特性、共享歷史文件和主題化提示符的高級shell
複製代碼
在Linux的早期(20世紀90年代初期),能用的只有一個簡單的Linux操做系統文本界面。這個文本界面容許系統管理員運行程序,控制程序的執行,以及在系統中移動文件。
隨着Microsoft Windows的普及,電腦用戶已經再也不知足於對着老式的文本界面工做了。這推進了OSS社區的更多開發活動,Linux圖形化桌面環境應運而生。
有兩個基本要素決定了視頻環境:顯卡和顯示器。要在電腦上顯示絢麗的畫面,Linux軟件就得知道如何與這二者互通。X Window系統是圖形顯示的核心部分。
X Window系統,是直接和PC上的顯卡及顯示器打交道的底層程序。它控制着Linux程序如何在電腦上顯示出漂亮的窗口和圖形
Unity
GNOME
Cinnamon
Xfce
等已經瞭解了構成完整Linux系統所須要的4個關鍵部件,那你可能在考慮要怎樣才能把它們組成一個Linux系統。幸運的是,已經有人爲你作好這些了
核心Linux發行版含有內核、一個或多個圖形化桌面環境以及預編譯好的幾乎全部能見到的Linux應用。它提供了一站式的完整Linux安裝
Slackware | 最先的Linux發行版中的一員,在Linux極客中比較流行
Redhat | 主要用於Internet服務器的商業發行版
Gentoo | 爲高級Linux用戶設計的發行版,僅包含Linux源代碼
openSUSE | 用於商用和家用的發行版
Debian | 在Linux專家和商用Linux產品中流行的發行版
複製代碼
|—— bin # 二進制目錄,存放用戶級的GNU工具(bash命令)
|—— boot # 啓動目錄,存放用於系統引導時使用的各類文件
|—— dev # 設備目錄,存放硬件設備,建立設備節點
|—— etc # 系統配置文件目錄,存放系統管理和配置文件
|—— home # 普通用戶的主目錄
|—— lib # 庫目錄,存放系統和應用程序的動態連接庫
|—— lost+found # 這個目錄平時是空的,系統非正常關機而留下「無家可歸」的文件
|—— media # 媒體目錄,可移動媒體設備的經常使用掛載點
|—— mnt # 掛載目錄,另外一個可移動媒體設備的經常使用掛載點
|—— opt # 可選目錄,經常使用於存放第三方軟件包和數據文件
|—— proc # 進程目錄,存放現有硬件及當前進程的相關信息,是系統內存的映射。可直接訪問這個目錄來獲取系統信息
|—— root # 超級用戶的主目錄
|—— run # 運行目錄,存放系統運做時的運行時數據
|—— sbin # 系統二進制目錄,存放許多GNU管理員級工具
|—— srv # 服務目錄,存放本地服務的相關文件
|—— sys # 系統目錄,存放系統硬件信息的相關文件
|—— tmp # 臨時目錄,能夠在該目錄中建立和刪除臨時工做文件,重啓後清空
|—— usr # 用戶二進制目錄,大量用戶級的GNU工具和數據文件都存儲在這裏
| |—— bin # 包含系統安裝的可執行程序。一般,這個目錄會包含許多程序
| |—— games #
| |—— include # 寫程序須要使用到的一些頭文件
| |—— lib # 包含由/usr/bin 目錄中的程序所用的共享庫
| |—— local # 是非系統發行版自帶,卻打算讓系統使用的程序的安裝目錄。 一般,由源碼編譯的程序會安裝在/usr/local/bin 目錄下
| |—— sbin # 包含許多系統管理程序
| |—— share # 存放幫助文檔和共享文件
| |—— src #
|—— var # 可變目錄,用以存放常常變化的文件,好比日誌文件
複製代碼
ls -l
drwxr-xr-x
# 文件類型 屬主權限 成員權限 其餘用戶權限
d rwx r-x r-x
|—— 文件類型
| |—— - # 文件
| |—— d # 文件夾
| |—— l # 連接
| |—— c # 字符型設備
| |—— b # 塊設備
| |—— n # 網絡設備
|
|—— r # 可讀權限
|—— w # 可寫權限
|—— x # 可執行權限
複製代碼
Linux操做系統中引入的最先的文件系統叫做擴展文件系統 (extended filesystem,簡記爲ext)。它爲Linux提供了一個基本的類Unix文件系統:使用虛擬目錄來操做硬件設備,在物理設備上按定長的塊來存儲數據。
ext文件系統採用名爲索引節點的系統來存放虛擬目錄中所存儲文件的信息。索引節點系統在每一個物理設備中建立一個單獨的表(稱爲索引節點表)來存儲這些文件的信息。存儲在虛擬目錄中的每個文件在索引節點表中都有一個條目。ext文件系統名稱中的extended部分來自其跟蹤的每一個文件的額外數據
- 文件名
- 文件大小
- 文件的屬主
- 文件的屬組
- 文件的訪問權限
- 指向存有文件數據的每一個硬盤塊的指針
複製代碼
Linux經過惟一的數值(稱做索引節點號)來引用索引節點表中的每一個索引節點,這個值是建立文件時由文件系統分配的。文件系統經過索引節點號而不是文件全名及路徑來標識文件。
最先的ext文件系統有很多限制,好比文件大小不得超過2 GB。在Linux出現後不久,ext文件系統就升級到了第二代擴展文件系統,叫做ext2
日誌文件系統爲Linux系統增長了一層安全性。它再也不使用以前先將數據直接寫入存儲設備再更新索引節點表的作法,而是先將文件的更改寫入到臨時文件(稱做日誌,journal)中
在數據成功寫到存儲設備和索引節點表以後,再刪除對應的日誌條目。若是系統在數據被寫入存儲設備以前崩潰或斷電了,日誌文件系統下次會讀取日誌文件並處理上次留下的未寫入的數據
2001年,ext3文件系統被引入Linux內核中,直到最近都是幾乎全部Linux發行版默認的文件系統。它採用和ext2文件系統相同的索引節點表結構,但給每一個存儲設備增長了一個日誌文件,以將準備寫入存儲設備的數據先記入日誌。
ext4文件系統在 2008 年受到Linux內核官方支持,如今已經是大多數流行的Linux發行版採用的默認文件系統
除了支持數據壓縮和加密,ext4文件系統還支持一個稱做區段(extent)的特性。區段在存儲設備上按塊分配空間,但在索引節點表中只保存起始塊的位置。因爲無需列出全部用來存儲文件中數據的數據塊,它能夠在索引節點表中節省一些空間。
ext4還引入了塊預分配技術(block preallocation)。若是你想在存儲設備上給一個你知道要變大的文件預留空間,ext4文件系統能夠爲文件分配全部須要用到的塊,而不只僅是那些如今已經用到的塊。ext4文件系統用 0 填滿預留的數據塊,不會將它們分配給其餘文件
Linux LVM是由Heinz Mauelshagen開發的,於1998年發佈到了Linux社區。它容許你在Linux上用簡單的命令行命令管理一個完整的邏輯卷管理環境
最初的LVM包於1998年發佈,只能用於Linux內核2.4版本。它僅提供了基本的邏
LVM的更新版本,可用於Linux內核2.6版本。它在標準的LVM1功能外提供了額外的功能。
最初的Linux LVM容許你在邏輯卷在線的狀態下將其複製到另外一個設備。這個功能叫做快照。在備份因爲高可靠性需求而沒法鎖定的重要數據時,快照功能很是給力。傳統的備份方法在將文件複製到備份媒體上時一般要將文件鎖定。快照容許你在複製的同時,保證運行關鍵任務的Web服務器或數據庫服務器繼續工做。遺憾的是,LVM1只容許你建立只讀快照。一旦建立了快照,就不能再寫入東西了
LVM2容許你建立在線邏輯卷的可讀寫快照。有了可讀寫的快照,就能夠刪除原先的邏輯卷,而後將快照做爲替代掛載上。這個功能對快速故障轉移或涉及修改數據的程序試驗(若是失敗,須要恢復修改過的數據)很是有用。
LVM2提供的另外一個引人注目的功能是條帶化(striping)。有了條帶化,可跨多個物理硬盤建立邏輯卷。當Linux LVM將文件寫入邏輯卷時,文件中的數據塊會被分散到多個硬盤上。每一個後繼數據塊會被寫到下一個硬盤上。條帶化有助於提升硬盤的性能,由於Linux能夠將一個文件的多個數據塊同時寫入多個硬盤,而無需等待單個硬盤移動讀寫磁頭到多個不一樣位置。這個改進一樣適用於讀取順序訪問的文件,由於LVM可同時從多個硬盤讀取數據。
經過LVM安裝文件系統並不意味着文件系統就不會再出問題。和物理分區同樣,LVM邏輯卷也容易受到斷電和磁盤故障的影響。一旦文件系統損壞,就有可能再也沒法恢復。
LVM快照功能提供了一些安慰,你能夠隨時建立邏輯卷的備份副本,但對有些環境來講可能還不夠。對於涉及大量數據變更的系統,好比數據庫服務器,自上次快照以後可能要存儲成百上千條記錄。
這個問題的一個解決辦法就是LVM鏡像。鏡像是一個實時更新的邏輯卷的完整副本。當你建立鏡像邏輯卷時,LVM會將原始邏輯卷同步到鏡像副本中。根據原始邏輯卷的大小,這可能須要一些時間才能完成。
一旦原始同步完成,LVM會爲文件系統的每次寫操做執行兩次寫入——一次寫入到主邏輯卷,一次寫入到鏡像副本。能夠想到,這個過程會下降系統的寫入性能。就算原始邏輯卷由於某些緣由損壞了,你手頭也已經有了一個完整的最新副本!
在Linux上使用存儲設備須要懂一點文件系統的知識。當工做在Linux系統下時,懂得如何在命令行下建立和處理文件系統能幫上你的忙。Linux系統和Windows的不一樣之處在於前者支持大量不一樣的存儲文件和目錄的方法。每一個文件系統方法都有不一樣的特性,使其適用於不一樣的場景
fdisk 命令用來對存儲設備進行分區,以便安裝文件系統。在分區存儲設備時,必須定義在上面使用什麼類型的文件系統。劃分完存儲設備分區後,你能夠爲該分區選用一種文件系統。流行的Linux文件系統包括ext3和ext4。二者都提供了日誌文件系統功能,下降它們在Linux系統崩潰時遇到錯誤或問題的概率
在存儲設備分區上直接建立文件系統的一個限制因素是,若是硬盤空間用完了,你沒法輕易地改變文件系統的大小。但Linux支持邏輯卷管理,這是一種跨多個存儲設備建立虛擬分區的方法。這種方法容許你輕鬆地擴展一個已有文件系統,而不用徹底重建。Linux LVM包提供了跨多個存儲設備建立邏輯卷的命令行命令。
若有寫錯或不對的地方,請指正
複製代碼