---
title: 'Linux 組成、層次概念'
disqus: kyleAlien
---
Linux 組成、層次概念
===
## Overview of Content
Linux 其實是 Unix 的變種,它的本質還是 Unix
> 從 Unix 發展的作業系統除了 Linux 之外,還有 Solaris & BSD
:::success
* 如果喜歡讀更好看一點的網頁版本,可以到我新做的網站 [**DevTech Ascendancy Hub**](https://devtechascendancy.com/)
本篇文章對應的是 [**了解 Linux 組成:內核責任、GNU 工具、桌面環境 | 基礎版到發行版**](https://devtechascendancy.com/linux-composition-and-distros/)
:::
[TOC]
## Linux 基礎組成
不管是哪個版本的 Linux(CenterOS, RedHat, Unbuntu... 等等發行版本),他們都是透過 4 個部份組成整個系統
1. **Linux 內核**:以下為內核中的幾個重要組件
| 重點組件 | 概述 |
| - | - |
| 系統內存管理 | 有關於內存回收、虛擬內存、內存交換 (Swap)...等等 |
| 進程管理 | 決定進程的優先順序,啟動順序 ...等等 |
| 硬體設備管理 | 管理硬體的驅動,這個驅動會被當作特殊文件被管理(Node 唯一值) |
| 系統呼叫、支援 | 像是 文件管理:Linux 支持讀取多種不同類型文件,像是 ext2~4, hpfs... 等等 |
2. **GNU 工具**
3. **圖形化桌面環境**
4. **應用軟體**
> 
### Linux 抽象級別、層次
現在以令一個更加抽象的概念來看,Linux 主要有分為 3 個抽象層次
```mermaid
graph TB
subgraph Linux 組成
硬體
Linux核心
使用者程序
end
```
* **硬體(Hardware)**: CPU、硬碟、記憶體... 等等硬體裝置
:::warning
* **映像(`Image`)是硬體嘛**?
這是一種抽象描述記憶體的方式,用來表示位元在記憶體中的 **特定實體排列**
:::
* **Linux 核心(Kernel)**:核心是執行在記憶體中的軟體,它可以直接控制、操作硬體,由此可知它的 **重點在 ++管理硬體系統++,並提供硬體對外的溝通界面(抽象界面)**
:::info
* **核心模式**:
核心是運行在 **核心模式**,其特點是可以不受限制的取運用處理器、記憶體資源
> 所以核心沒控制好很容易造成系統崩潰
:::
* **使用者程序(User process)**:所有應用都由核心通一管理,藉由一個一個應用組成了最頂層,也就是 **使用者空間(也可稱為 User speace)**
> 有些應用不會直接與使用者互動,但它仍是使用者程序(像是背景服務應用)
另一個定義:核心分配給使用者程序的記憶體空間,我們稱之為 **使用者空間(User space)**
:::info
* **使用者模式**:
相對於核心模式,使用者模式可以取用的資源就受到了限制(無法無限制取用),並且使用者模式不能訪問核心模式的記憶體空間
> 應用在核心的管理之下,所以如果應用崩潰也可由核心回收資源,不會導致系統崩潰
:::
## 內核空間:內核責任
第一版 Linux 內核是由 Linus Torvalds 發行(那時是為了模仿 Unix 操作系統);以下會簡介 Linux 內核 中幾個重要的組件、特色
### 應用管理:上下文切換
* 程式在記憶體上的劃分單元就是 **進程**(`Process`);程式可以運行在前台(可見)、也可以運行在後台(不可見)… 那系統中一定會運行不只一個應用,這些應用們由誰管理呢?
**核心會管理所有程序**(`Process Management`),它涉及程序的啟動、暫停、恢復、中止... 等等行為
```mermaid
graph TB;
subgraph 核心管理鏈表
n1(node 1)
n2(node 2)
n3(node 3)
end
a1(應用 a)
a2(應用 b)
a3(應用 c)
n1 -.-> a1
n2 -.-> a2
n3 -.-> a3
```
:::warning
* **上下文切換 `Context Switch`** ?
在多應用執行時,核心會分配 CPU 資源,不會讓單個應用執行完才運行令一個,而是 **讓 CPU 快速切換資源,讓多個程序看起來是一起執行的**;
:::success
* 核心管理程序的概念順序如下:
> 核心執行的時間點就是 **上下文切換的時間間隙**
1. CPU 為每個應用計時,計時到就切換為核心模式,由核心接管 CPU 資源
2. 核心紀錄下每個 CPU 的記憶體狀態資訊
> 等到下次要恢復某個應用時可以用到這些記憶體資訊
3. 核心執行上一個時間段內的任務
> 處理核心自身的任務(eg. 像是讀取輸入、輸出、硬碟操作)
4. 核心執行下一個程序
> 下一個要運行的使用者空間的程序
5. 核心為新程序準備 CPU、記憶體
6. 核心江心程序執行的時間通知 CPU(計時 CPU 的使用時間)
7. 核心將 CPU 切換置使用者模式,將 CPU 控制權交給新應用
:::
:::
* **進程的啟動順序**:這取決於你使用哪一版的 Linux,啟動順序往往會放在一個文件中做管理;Ubuntu 就會放置在 `/etc/init.d` 目錄下
:::info
Linux 中運行的第一個程式稱為 init 進程
:::
> 其他 Linux 程式啟動順序則可能放置在 `/etc/inittab` 中
在Linux系統中,init進程在啟動時會按照以下順序執行不同位置的腳本,順序如下:
1. init 進程會讀取並執行 `/etc/inittab` or `etc/init.d` 文件中的腳本
2. 接著 init 進程會讀取當前運行級別(run level)對應的 `/etc/rc<X>.d` 目錄下的腳本 (X 代表了運行等級)
:::info
* 目錄中以字母 S 開頭的腳本(S代表Start,即啟動腳本),按照文件名的字母順序執行其中的腳本
* 目錄中以字母 K 開頭的腳本(K代表Kill,即停止腳本),同樣按照文件名的字母順序執行其中的腳本。
:::
* **運行等級**:Linux 系統的運行等級有分為 5 個級別;這些級別可以調整(3 -> 5 將系統改為優先圖形系統)
| 運行等級 | 特色 | e.g |
| -------- | -------- | -------- |
| 1 | 單用戶模式(啟動基本的系統進程 & 一個控制台終端) | 通常在系統有問題需要做緊急修復時 |
| 3 | 標準的系統運行等級,大多數軟體都運行在這個等級之下 | 網路應用 |
| 5 | 啟動圖形化系統 | 圖形化桌面窗口登入系統 |
### 記憶體管理 & 虛擬記憶體
* **內存就是記憶體 Memory**,程式運行就是建立在內存之上,當你在操控程式時其實就是在操控這個程式專屬區域的內存
* 核心會管理所有記憶體,並為每個應用分配記憶體
* 核心也管理包括了共享記憶體、空閒記憶體
:::warning
* **上下文切換管理記憶體**:
我們上面有說核心運行的時機點就是,上下文切換的間隙,而記憶體的管理也是核心的工作之ㄧ;其特色如下
* 核心有自己的專有記憶體空間,其他使用者程序無法使用
* 而每個使用者程序也有自己的專用空間
* 使用者應用程序之間無法存取另一個程序的專有記憶體空間
> 除了記憶體共享,使用者程序之間可以透過 **記憶體共享** 來共享記憶體
* 使用者程序的某些記憶體空間是唯讀取的
* 透過硬體來作為虛擬記憶體,在程序需要時作為記憶體使用
:::
* **虛擬記憶體**(虛擬內存):當然這邊需要考慮到記憶體不足的情況,當記憶體不足時,就會 **取用「硬體」當作假的記憶體**
:::info
我們也知道如果使用硬體作為記憶體速度一定會變慢;這個交換過程稱為 swapping in/out,而平凡交換則會導致系統的不穩定(顫抖)
:::
```mermaid
graph LR;
硬體 -.-> 虛擬記憶體
subgraph 記憶體
真實記憶體
虛擬記憶體
end
```
1. 記憶體可能只有 4G,但當前在系統上運行的程式有 5G
2. 這時為了避免系統當機或 Crush,會使用硬體當作記憶體來使用
3. 實際情況會把使用率較低的程式放入硬體中儲存,當有需要時再將它的資料從硬體中取出
:::success
虛擬記憶體劃分並不是以 1Byte, 1K... 等等單元,它是 **使用一個虛擬單位 `Page`** 來劃分記憶體
:::
* **MMU 記憶體管理單元**:
新型(近代) CPU 提供 MMU 機制,也就是 **程序不會直接存取記憶體,而是 ++透過核心存取記憶體++**,當程序需要記憶體時,透過 MMU **記憶體映射** 來取得實體記憶體位置
:::info
* **分頁表(page table)**
核心要做的工作就是在上下文切換時,將記憶體映射表從被移出程序轉給被移入的程序使用(管理記憶體映射表)
:::
### 硬體設備管理
* **核心負責管理、操控硬體設備,並對外提供一個訪問界面**
:::warning
硬體設備只能在核心模式下被存取
:::
軟體最終都要透過硬體輸入(或輸出)才能接收到 User 指令 (像是鍵盤滑鼠),而 Linux 內核的工作也包括與這些硬體通訊,與其通訊的方式有以下兩種
1. 將特定硬體訊息 **編譯進內核驅動模塊**
> 早期的設計
```mermaid
graph LR
subgraph 內核
特定硬體訊息_1
特定硬體訊息_2
end
```
2. **可熱插拔的內核驅動模塊**(需要在編譯內核時就設定可動態安裝驅動)
> 當然是這個方便多了,可隨時添加移除硬體驅動
```mermaid
graph LR
subgraph 內核
特定硬體訊息_1
特定硬體訊息_2
end
特定硬體訊息_3 -.-> |insmod| 內核
```
* **硬體在內核中存在的方式**:Linux 系統會將硬體當作 **特殊的文件**,這文件通常分為 3 種
| 驅動文件(特殊文件) | 說明 |
| -------- | -------- |
| 字符型設備文件 | 每次只能處理一個字符,通常是終端在使用 |
| 塊設備文件 | 一次處理大量數據 |
| 網路設備文件 | 數據包的接收 & 發送 |
:::info
Linux 會為每個設備提供一個文件,該文件稱為一個 **節點 Node**,這個節點在 Linux 中具有唯一性(對同個機台而言)
:::
### 系統呼叫、文件管理
* 核心還對使用者程序提供其他功能:
* **系統呼叫(`System call` or `syscall`)**:
系統呼叫是使用者空間應用,用來訪問核心的方式,其中常見的有 `fork`、`exec` 兩個函數
* **`fork` 函數**:核心會建立一個和該程序幾乎一模一樣的 **副本**
* **`exec` 函數**:核心會替換某個應用到指定記憶體中
* **虛擬設備(`pseudodevices`)**:
虛擬設備對於使用者程序來說就是真實設備,但其實是透過軟體實現的
* **文件管理**:Linux 內核支持讀取硬碟中的多種不同類型文件(其中也包括 Windows 文件),以下是 Linux 標準文件
| 文件系統 | 說明 | 補充 |
| -------- | -------- | - |
| ext | Linux 擴展文件系統 | 最初文件系統 |
| ext2 | 拓展 ext | 拓展多功能 |
| ext3 | 拓展 ext2 | 支持日誌功能 |
| ext4 | 拓展 ext3 | 支持高級日誌功能 |
| hpfs | IBM 公司為 `OS/2` 操作系統開發的一種文件系 | 高性能、安全性文件 |
| jfs | IBM 日誌文件系統 | - |
| iso9660 | CD-ROM | - |
| minix | MINIX 文件系統 | - |
| ncp | Netware文件系统 | - |
| nfs | 網路文件系統 | - |
| ntfs | Microsoft NT文件系统 | - |
| proc | 訪問系統訊息文件 | - |
| ReiserFS | 高級 Linux 文件系統 | 更高性能,硬碟恢復功能 |
| smb | Samba SMB文件系统 | - |
| sysv | 早期 Unix 文件系統 | - |
| ufs | BSD 文件系統 | - |
| umsdos | 建立在 msdos 上的類 Unix 文件系統 | - |
| vfat | Window 95 文件系統 | FAT32 |
| XFS | 高性能 64 位元日誌文件系統 | - |
:::success
* **這麼多文件系統要怎麼統一**?
Linux 內核中有一個標準接口(protocol),只要實作這個接口就可以讀取任意文件系統,這個接口稱為 **VFS (`Virtual File System`)**
:::
## GUN 工具
除了內核控制硬體設備之外還需要一些標準功能(控制文件、GBD 調適、網路功能...),這些功能就由 GUN 完成
> Linux 中的 GNU 工具則是仿 Unix 計算機上的功能
GNU (GNU's Not Unix) 開發了一套完整的 Unix 工具,這整套程式都是開源軟體,這些工具不包括內核系統
### 核心工具
* GNU 的主旨在於為 Unix 系統管理員設計出一套類似 Unix 的環境(包括操作系統核心、命令列介面、標準程式庫、開發工具... 等等)
為了這個目的有移植了很多常見的 Unix 命令工具 (Unix 環境移植到 GNU 環境中),Linux 稱這些工具核心工具為 **coreutils** (組成如下)
1. 處理文件工具
2. 操作文本工具
3. 管理進程工具
### Shell 互動工具
* GNU/Linux shell 是一種互動式工具,透過它可以執行命令與腳本
> 多個命令組合起來就是一個腳本
:::info
Shell 並不直接與內核互動,而是它主要是與 GNU 工具和其他軟件進行互動(只能間接性的與內核互動),很適合拿來作為不同軟體的黏接面
:::
* 而 Linux 系統上通常提供多種不同的 Shell 給使用者使用(每種 Shell 有不同特性),常見的 Shell 如下表
| Shell 類型 | 特性 |
| -------- | -------- |
| Bourne shell | Unix 版本的 Shell |
| bash shell | GNU 模仿 Bourne shell 的產品,這是最常見的 Shell (默認 Shell) |
| ash | 運行在內存受限的輕量級 Shell (與 bash shell 相容) |
| korn | 支持浮點數、高級編程特性 (與 Bourne shell 相容) |
| tcsh | 擁有 C 語言特性的 Shell |
| zsh | 結合多個 Shell 特性(bash shell, korn, tcsh...) |
## Linux 桌面環境
Linux 圖型化介面並不只一種方式,它類似於一種 Protocol,只要符合 Linux 開出的 Protocol 就可以使用不同方式做出介面
### 圖形工具:XWindow 系統
* XWindow 系統會與 PC 上的顯卡與顯示器(螢幕)打交道的底層程式,它會控制電腦上顯示出的 Window(視窗)、圖形
:::success
* XWindow 的實現有哪些?
`X Window System` 是一種基於網絡的窗口系統;像是 `X.org` 就是一個開源的 X Window System(X11)的實現;
:::
* XWindow 系統是主要顯示視窗、圖型… 如果要實現桌面化來操作文件或開啟應用,那還需要其他桌面系統來協助
> 這樣說起來 XWindow 更像是一個產生圖形的 工具
### 桌面化:KDE 桌面
* KDE 桌面環境是在 1996 年作為開源項目發布,它的樣子類似 Window 桌面,它主要由 四個部分組成
1. **KDE 菜單**:與 Window 的菜單功能類似
KDE 桌面環境包含了一個功能豐富的菜單系統,類似於 Windows 桌面的菜單,用戶可以通過菜單來訪問安裝的應用程序、系統設置和其他功能
2. **應用快捷**:桌面有應用的快捷連結
KDE桌面環境允許用戶在桌面上放置應用程序的快捷方式,這使得用戶可以快速訪問和啟動常用的應用程序,提高了操作效率
3. **任務欄**:可以查看當前運行的任務,並顯示運行中任務的圖標
KDE 桌面環境包含一個名為「任務欄」的組件,用於顯示當前正在運行的任務和應用程序,並且可以顯示相應應用程序的圖標,使用戶可以輕鬆切換和管理正在運行的應用程序
4. **小應用**:類似於桌面上的小工具
KDE 桌面環境提供了一個名為「小應用」的功能,類似於桌面上的小工具(`Widget`),用戶可以通過添加不同類型的小應用來擴展桌面功能,例如天氣預報、系統監視器等
* **KDE 桌面使用場景**:
KDE桌面環境適用於各種場景,包括個人電腦、工作站、服務器和嵌入式設備等。它具有高度的可定製性,用戶可以根據自己的需求和偏好來調整和配置桌面環境,並且提供了豐富的擴展和插件支持,使得用戶可以根據自己的需要來擴展桌面功能
### 桌面化:GNOME
* **GNOME**(`the FNU Network Object Model Environment`, GNU 網路對象模型環境) 是一個流行的開源桌面環境,主要用於Linux發行版
它是由GNU計劃開發的,旨在提供一個現代化、直觀且易於使用的桌面環境,為用戶提供了豐富的功能和高度的可定製性
> 像是 Red Hat Linux 就是使用這個桌面
* **GNOME 主要特點**:
* **圖標桌面**:
**GNOME 提供了一個桌面空間**,用戶可以在上面放置和組織圖標,這些圖標可以是應用程序、文件或文件夾等,這使得用戶可以快速訪問和啟動常用的應用程序或打開文件
* **多個桌面**:
**GNOME 支持多個虛擬桌面**,用戶可以在不同的桌面之間切換,這使得用戶可以更好地組織和管理打開的應用程序和窗口,提高了工作效率
* **拖放功能**:
**GNOME 具有強大的拖放功能**,用戶可以通過拖曳應用程序、文件或文件夾等物件來進行操作,例如移動到其他桌面、放置在面板上或將其拖到應用程序窗口中進行打開等。
* **樣式與用戶體驗**:
GNOME 的設計風格與 Windows 相似,但同時也具有其獨特的風格和特色。它注重直觀性和易用性,提供了一個簡潔、現代化且易於操作的用戶界面
GNOME 的界面通常包括面板、應用程序菜單、窗口管理器和文件管理器等組件,用戶可以通過這些組件來訪問系統功能、應用程序和文件,並進行操作和管理
* **GNOME 使用場景**:
GNOME 桌面環境適用於各種場景,包括個人電腦、工作站、服務器和嵌入式設備等。它為用戶提供了一個穩定、靈活和功能豐富的桌面環境,可以滿足不同用戶的需求和偏好
```mermaid
graph LR
GNOME --> 個人電腦
GNOME --> 工作站
GNOME --> 服務器
GNOME --> 嵌入式設備
```
### 桌面化:Unity
* Unity 桌面系統是由 `Canonical` 公司負責開發的桌面環境,最初作為 Ubuntu Linux 發行版的默認桌面環境;它的目標是提供一個現代化、直觀且功能豐富的使用者界面,適用於多種設備,包括工作站、平板電腦和移動設備
* **Unity 主要特點**
* **現代化的用戶界面**:
Unity 桌面系統采用了現代化的設計風格,包括全局菜單、啟動器和快速應用程序切換等功能,使得用戶可以方便地訪問和管理應用程序
* **全局搜索功能**:
Unity 提供了一個強大的全局搜索功能,使用戶可以快速找到應用程序、文件和設置等內容,並且能夠直接從搜索結果中啟動應用程序或打開文件
* **整合的通知系統**:
Unity 桌面系統具有一個整合的通知系統,可以顯示來自應用程序和系統的通知,並且可以通過指示燈、聲音和彈出窗口等方式提醒用戶
* **支持多種設備**:
Unity桌面系統設計用於適應不同類型的設備,包括桌面電腦、筆記本電腦、平板電腦和智能手機等,並且提供了相應的界面優化和觸摸支持
* **可定製性**:
Unity桌面系統具有豐富的可定製性,用戶可以通過更改主題、安裝擴展和調整設置等方式來自定義桌面環境,以滿足個人偏好和需求
* **Unity 使用場景**
* **工作站**:
Unity桌面系統提供了一個現代化且功能豐富的桌面環境,非常適合用於日常工作、開發和娛樂等用途
* **平板電腦**:
Unity桌面系統具有觸摸支持和平板電腦友好的用戶界面,可以在平板電腦上提供優秀的用戶體驗
* **移動設備**:(Android, iOS 系統都有支持)
由於Unity桌面系統的輕量級和現代化設計,它也可以在一些較為資源有限的移動設備上運行,提供快速、流暢的使用體驗
```mermaid
graph LR
Unity --> 工作站
Unity --> 平板電腦
Unity --> 移動設備
移動設備 --> Android
移動設備 --> iOS
```
### 其他桌面化
* 桌面化其實是相當耗費內存的,如果電腦對於內存的使用較為苛刻就可以改用其他的桌面化系統(如下)
| 桌面系統 | 特色 |
| - | - |
| Fluxbox | 沒有 Window 的桌面,僅有一個用來啟動應用的菜單 |
| Xfce | 與 KDE 類似,但它少了很多圖像(適合低內存) |
| JWM | 適合低內存 & 低硬碟空間的輕量桌面 |
| Fvwm | 支持虛擬桌面 & Window(適合低內存) |
| Fvwm95 | 類似 Fvwm,看起來像是 Window95 桌面 |
## Linux 發行版
我們知道 Linux 系統的四大部件(應用、桌面圖形化、GUN 工具、內核)後,就可以組合出一個 Linux 系統
> **組合部件後的 Linux 系統就是 ++Linux 發行版++** (發行版通常也分為幾種)
### 核心 Linux 發行版
* 核心 Linux 發行版 會包含上述的四大組件,不過它的選項、設定相當的多(對於新手較不健康)
> 可能問你需要載入哪些默認應用、以及硬體配置... 等等
以下是幾個較常見的發行版
| 發行版 | 特點 |
| - | - |
| Slackware | 最早期的 Linux 發行版 |
| Red Hat | 主要用於 Internet 服務的商業發行版 |
| Fedora | Red Hat 的家用版分支 |
| Gentoo | 高級 Linux 用戶版本,包含 Linux source code |
| openSUSE | 用於商用、家用的版本 |
| Debain | 用於商用、家用的版本 |
### 特定用途 發行版
* 常基於某個主流發行版,但僅包含主流發行版中一小部分用於某種特定用途的應用程式;對於新手來說會幫忙自動檢測、配置硬體
| 發行版 | 特點 |
| - | - |
| CenterOS | 包含 Linux source code 的免費企業版 |
| Ubuntu | 學校、家用 |
| PCLinuxOS | 家庭、辦公用(免費版) |
| Mint | 家庭、娛樂用(免費版) |
| dyne:bolic | 音頻、MIDI 應用的(免費版) |
| Puppy Linux | 老舊電腦用(免費版) |
:::success
大多數 Linux 特定用途發行版都是基於 **Debian Linux** (可以和 Debian 一樣安裝文件,但僅打包了完正的 Debian 系統之的一部分)
:::
### LiveCD 測試發行版
* LiveCD 測試發行版的特點在於:^1.^ 透過 CD 啟動、^2.^ 並非完整版的 Linux 系統、^3.^ 內部可以有各種不同的軟體
* 由於是攜帶型的版本,所以它也有一些缺點:^1.^ 速度較慢、^2.^ 無法對 CD 寫入數據
:::info
* **對接技術** (解決無法寫入數據問題的方案):
透過將 Linux 核心文件複製到內存(記憶體)中,就可以移除硬碟,並仍保持運行系統
:::
其中有名的 LiveCD 發行版如下
| 發行版 | 特點 |
| - | - |
| Knoppix | 最早期來自德國的一款 Linux LiveCD 發行版 |
| PCLinuxOS | 成熟的 LiveCD 發行版 |
| Ubuntu | 多語言世界級項目~ |
| Slax | 基於 Slackware Linux 的一款 Linux LiveCD |
| Puppy Linux | 為老舊 PC 設置 |
## Appendix & FAQ
:::info
:::
###### tags: `Linux Shell`