--- 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. **應用軟體** > ![](https://i.imgur.com/fmrjRPb.png) ### 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`