是時候深入瞭解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包提供了跨多個存儲設備創建邏輯卷的命令行命令。

如果你還不太瞭解Linux的命令行命令,歡迎閱讀我的下一篇

  • 你可能還在尋找一款 Linux發行版?
  • 如果你還不知道如何選擇的話

鏈接:https://www.jianshu.com/p/2b9f4a6ed1df


分享到:


相關文章: