是時候深入瞭解Linux的系統結構了

freeky發表於2017-12-20

作為一名開發者或極客,Linux 才配得上你的高逼格
本篇描述的是Linux的介紹及結構,讓你認識這位性感的 麗娜絲 女士

什麼是 Linux ?

如果你以前從未接觸過Linux,可能就不清楚為什麼會有這麼多不同的Linux發行版。在檢視Linux軟體包時,你肯定被髮行版、LiveCD和GNU之類的術語搞暈過。初次進入Linux世界會讓人覺得不那麼得心應手。在開始學習命令和指令碼之前,本章將為你稍稍揭開Linux系統的神祕面紗。首先,Linux可劃分為以下四部分:

  1. ↪ Linux核心
  2. ↪ GNU工具鏈
  3. ↪ GUI桌面環境
  4. 應用軟體 ...
|--------------------------|
|          APPS            |        應用軟體
|--------------------------|
|                          |        GUI桌面環境
|     GUI    |-------------|
|            |    GNU      |        GNU工具鏈
|--------------------------|
|         kernel           |        Linux核心
|--------------------------|
|         hardware         |        計算機硬體
----------------------------
複製程式碼

1. Linux 核心

Linux系統的核心是核心。核心控制著計算機系統上的所有硬體和軟體,在必要時分配硬體,並根據需要執行軟體。

  1. 系統記憶體管理
  2. 應用程式管理
  3. 硬體裝置管理
  4. 檔案系統管理

1. 系統記憶體管理

作業系統核心的主要功能之一就是記憶體管理。核心不僅管理伺服器上的可用實體記憶體,還可以建立和管理虛擬記憶體(即實際並不存在的記憶體)

  • 核心通過硬碟上的儲存空間來實現虛擬記憶體,這塊區域稱為交換空間(swap space)。核心不斷地在交換空間和實際的實體記憶體之間反覆交換虛擬記憶體中的內容。這使得系統以為它擁有比實體記憶體更多的可用記憶體

  • Linux系統記憶體對映

|---------|             -----------
|         |             | 實體記憶體 |
|         |             /----------
|         |    ---------
| 虛擬記憶體 | —— |  核心  |
|         |    ---------
|         |             \---------- 
|         |             | 交換空間 |
|---------|             -----------
複製程式碼

2. 應用程式管理

Linux作業系統將執行中的程式稱為程式。程式可以在前臺執行,將輸出顯示在螢幕上,也可以在後臺執行,隱藏到幕後。核心控制著Linux系統如何管理執行在系統上的所有程式。

  • 核心建立了第一個程式(稱為init程式)來啟動系統上所有其他程式。當核心啟動時,它會將init程式載入到虛擬記憶體中。核心在啟動任何其他程式時,都會在虛擬記憶體中給新程式分配一塊專有區域來儲存該程式用到的資料和程式碼。

  • Linux作業系統有5個啟動執行級

    • 執行級為1時,只啟動基本的系統程式以及一個控制檯終端程式。我們稱之為單使用者模式。單使用者模式通常用來在系統有問題時進行緊急的檔案系統維護。顯然,在這種模式下,僅有一個人(通常是系統管理員)能登入到系統上運算元據。
    • 標準的啟動執行級是3。在這個執行級上,大多數應用軟體,比如網路支援程式,都會啟動。
    • Linux中常見的執行級是5。在這個執行級上系統會啟動圖形化的X Window系統,允許使用者通過圖形化桌面視窗登入系統。

3. 硬體裝置管理

核心的另一職責是管理硬體裝置。任何Linux系統需要與之通訊的裝置,都需要在核心程式碼中加入其驅動程式程式碼。驅動程式程式碼相當於應用程式和硬體裝置的中間人,允許核心與裝置之間交換資料。在Linux核心中有兩種方法用於插入裝置驅動程式碼:

  • 編譯進核心的裝置驅動程式碼
  • 可插入核心的裝置驅動模組

以前,插入裝置驅動程式碼的唯一途徑是重新編譯核心。每次給系統新增新裝置,都要重新編譯一遍核心程式碼。隨著Linux核心支援的硬體裝置越來越多,這個過程變得越來越低效。不過好在Linux開發人員設計出了一種更好的將驅動程式碼插入執行中的核心的方法。

開發人員提出了核心模組的概念。它允許將驅動程式碼插入到執行中的核心而無需重新編譯核心。同時,當裝置不再使用時也可將核心模組從核心中移走。這種方式極大地簡化和擴充套件了硬體裝置在Linux上的使用。

  • Linux系統將硬體裝置當成特殊的檔案,稱為裝置檔案。裝置檔案有3種分類:

    • 字元型裝置檔案
      • 字元型裝置檔案是指處理資料時每次只能處理一個字元的裝置。大多數型別的調變解調器和終端都是作為字元型裝置檔案建立的。
    • 塊裝置檔案
      • 塊裝置檔案是指處理資料時每次能處理大塊資料的裝置,比如硬碟。
    • 網路裝置檔案
      • 網路裝置檔案是指採用資料包傳送和接收資料的裝置,包括各種網路卡和一個特殊的迴環裝置。這個迴環裝置允許Linux系統使用常見的網路程式設計協議同自身通訊。
  • Linux為系統上的每個裝置都建立一種稱為節點的特殊檔案。與裝置的所有通訊都通過裝置節點完成。每個節點都有唯一的數值對供Linux核心標識它。數值對包括一個主裝置號和一個次裝置號。類的裝置被劃分到同樣的主裝置號下。次裝置號用於標識主裝置組下的某個特定裝置。

4. 檔案系統管理

不同於其他一些作業系統,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位日誌檔案系統
複製程式碼
  • Linux伺服器所訪問的所有硬碟都必須格式化成表1-1所列檔案系統型別中的一種。
  • Linux核心採用虛擬檔案系統(Virtual File System,VFS)作為和每個檔案系統互動的介面。這為Linux核心同任何型別檔案系統通訊提供了一個標準介面。當每個檔案系統都被掛載和使用時,VFS將資訊都快取在記憶體中。

2. GNU工具鏈

GNU組織(GNU是GNU’s Not Unix的縮寫)開發了一套完整的Unix工具,但沒有可以執行它們的核心系統。這些工具是在名為開源軟體(open source software,OSS)的軟體理念下開發的。

開源軟體理念允許程式設計師開發軟體,並將其免費釋出。任何人都可以使用、修改該軟體,或將該軟體整合進自己的系統,無需支付任何授權費用。將Linus的Linux核心和GNU作業系統工具整合起來,就產生了一款完整的、功能豐富的免費作業系統。

  • 儘管通常將Linux核心和GNU工具的結合體稱為Linux, 但你也會在網際網路上看到一些Linux純粹主義者將其稱為GNU/Linux系統,藉此向GNU組織所作的貢獻致意

核心GNU工具

GNU coreutils軟體包由三部分構成:

  • 用以處理檔案的工具
  • 用以操作文字的工具
  • 用以管理程式的工具

Shell

GNU/Linux shell是一種特殊的互動式工具。它為使用者提供了啟動程式、管理檔案系統中的檔案以及執行在Linux系統上的程式的途徑。 shell的核心是命令列提示符。命令列提示符是shell負責互動的部分。它允許你輸入文字命令,然後解釋命令,並在核心中執行。

  • 我們在命令列中輸入的命令都是GNU工具鏈提供,而非Linux核心
  • 所有Linux發行版預設的shell都是bash shell。bash shell由GNU專案開發,被當作標準Unix shell——Bourne shell(以建立者的名字命名)的替代品。
  • Linux中常見的幾種不同 shell
bash | 由GNU專案開發,被當作標準shell
ash  | 執行在記憶體受限環境中簡單的輕量級shell,但與bash shell完全相容
korn | 與Bourne shell相容的程式設計shell,但支援如關聯陣列和浮點運算等一些高階的程式設計特性
tcsh | 將C語言中的一些元素引入到shell指令碼中的shell
zsh  | 結合了bash、tcsh和korn的特性,同時提供高階程式設計特性、共享歷史檔案和主題化提示符的高階shell
複製程式碼

3. Linux 桌面環境

在Linux的早期(20世紀90年代初期),能用的只有一個簡單的Linux作業系統文字介面。這個文字介面允許系統管理員執行程式,控制程式的執行,以及在系統中移動檔案。

隨著Microsoft Windows的普及,電腦使用者已經不再滿足於對著老式的文字介面工作了。這推動了OSS社群的更多開發活動,Linux圖形化桌面環境應運而生。

  • X Window系統

有兩個基本要素決定了視訊環境:顯示卡和顯示器。要在電腦上顯示絢麗的畫面,Linux軟體就得知道如何與這兩者互通。X Window系統是圖形顯示的核心部分。

X Window系統,是直接和PC上的顯示卡及顯示器打交道的底層程式。它控制著Linux程式如何在電腦上顯示出漂亮的視窗和圖形

  • 現在流行的桌面環境有 Unity GNOME Cinnamon Xfce



Linux 發行版

已經瞭解了構成完整Linux系統所需要的4個關鍵部件,那你可能在考慮要怎樣才能把它們組成一個Linux系統。幸運的是,已經有人為你做好這些了


核心 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 # 可執行許可權
複製程式碼

檔案系統

  • ext

Linux作業系統中引入的最早的檔案系統叫作擴充套件檔案系統 (extended filesystem,簡記為ext)。它為Linux提供了一個基本的類Unix檔案系統:使用虛擬目錄來操作硬體裝置,在物理裝置上按定長的塊來儲存資料。

ext檔案系統採用名為索引節點的系統來存放虛擬目錄中所儲存檔案的資訊。索引節點系統在每個物理裝置中建立一個單獨的表(稱為索引節點表)來儲存這些檔案的資訊。儲存在虛擬目錄中的每一個檔案在索引節點表中都有一個條目。ext檔案系統名稱中的extended部分來自其跟蹤的每個檔案的額外資料

- 檔名
- 檔案大小
- 檔案的屬主
- 檔案的屬組
- 檔案的訪問許可權
- 指向存有檔案資料的每個硬碟塊的指標
複製程式碼

Linux通過唯一的數值(稱作索引節點號)來引用索引節點表中的每個索引節點,這個值是建立檔案時由檔案系統分配的。檔案系統通過索引節點號而不是檔案全名及路徑來標識檔案。

  • ext2

最早的ext檔案系統有不少限制,比如檔案大小不得超過2 GB。在Linux出現後不久,ext檔案系統就升級到了第二代擴充套件檔案系統,叫作ext2

日誌檔案系統

日誌檔案系統為Linux系統增加了一層安全性。它不再使用之前先將資料直接寫入儲存裝置再更新索引節點表的做法,而是先將檔案的更改寫入到臨時檔案(稱作日誌,journal)中

在資料成功寫到儲存裝置和索引節點表之後,再刪除對應的日誌條目。如果系統在資料被寫入儲存裝置之前崩潰或斷電了,日誌檔案系統下次會讀取日誌檔案並處理上次留下的未寫入的資料

  • ext3

2001年,ext3檔案系統被引入Linux核心中,直到最近都是幾乎所有Linux發行版預設的檔案系統。它採用和ext2檔案系統相同的索引節點表結構,但給每個儲存裝置增加了一個日誌檔案,以將準備寫入儲存裝置的資料先記入日誌。

  • ext4

ext4檔案系統在 2008 年受到Linux核心官方支援,現在已是大多數流行的Linux發行版採用的預設檔案系統

除了支援資料壓縮和加密,ext4檔案系統還支援一個稱作區段(extent)的特性。區段在儲存裝置上按塊分配空間,但在索引節點表中只儲存起始塊的位置。由於無需列出所有用來儲存檔案中資料的資料塊,它可以在索引節點表中節省一些空間。

ext4還引入了塊預分配技術(block preallocation)。如果你想在儲存裝置上給一個你知道要變大的檔案預留空間,ext4檔案系統可以為檔案分配所有需要用到的塊,而不僅僅是那些現在已經用到的塊。ext4檔案系統用 0 填滿預留的資料塊,不會將它們分配給其他檔案

Linux 中的 LVM

Linux LVM是由Heinz Mauelshagen開發的,於1998年釋出到了Linux社群。它允許你在Linux上用簡單的命令列命令管理一個完整的邏輯卷管理環境

  • LVM1

最初的LVM包於1998年釋出,只能用於Linux核心2.4版本。它僅提供了基本的邏

  • LVM2

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包提供了跨多個儲存裝置建立邏輯卷的命令列命令。


如有寫錯或不對的地方,請指正
複製程式碼

相關文章