Linux 指南/Linux 如何運作
Linux 的構建秉持著一定的一套統一原則。理解這些原則對於理解整個系統的工作方式非常有幫助。它們被稱為“Linux 之道”,源於 UNIX 系統背後的理念。
Linux 之道可以概括為
- 使用只做一件事但做好一件事的程式。
- 為了完成複雜的任務,使用幾個程式相互連線。
- 儘可能地將資訊儲存在人類可讀的純文字檔案中。
- 做任何事都沒有“唯一正確的方法”。
- 優先選擇命令列工具而不是圖形工具。
Linux 的大多數特性都是這些原則的結果。根據這些原則,Linux 系統由小而可替換的元件構成。我們將更詳細地考察其中最重要的元件。它們是:引導載入程式、核心、Shell、X 視窗伺服器、視窗管理器和桌面環境。之後,我們將看一下 Linux 中的檔案系統。最後,我們將討論執行 Linux 的計算機的安全性。
這是系統中第一個執行的部分。當您只安裝了一個作業系統時,它會簡單地載入核心(見下文)。如果您碰巧安裝了多個作業系統或多個版本的 Linux 核心,它允許您選擇要啟動哪個。最流行的引導載入程式是 GRUB(GRand Unified Bootloader)和 Lilo(LInux LOader)。大多數使用者無需關心引導載入程式,因為它會自動安裝和配置。實際上,引導載入程式建立了 Linux 核心所需的引導序列,將核心和引導過程早期所需的某些裝置驅動程式載入到記憶體中(作為所謂的“initramfs”的一部分),並啟動核心。
核心是系統中的核心元件,它直接與硬體通訊。事實上,“Linux”這個名稱恰當地指代了這種特定型別的軟體。它允許程式忽略不同計算機之間的差異。核心將系統資源(如記憶體、處理器時間、硬碟空間和外部裝置)分配給在計算機上執行的程式。它將每個程式與其他程式隔離開來,以便當其中一個程式遇到錯誤時,其他程式不會受到影響。大多數使用者在日常使用中無需擔心核心,但某些軟體或硬體可能需要或在某些核心版本下執行得更好。
在典型的 Linux 系統中,有各種服務作為後臺程序執行,負責諸如配置網路連線、響應已連線的 USB 裝置、管理使用者登入、管理檔案系統等任務。它們通常被稱為“守護程序”,因為它們在後臺靜默執行,對使用者來說大多是不可見的。
其中一個由核心在完成自身引導後啟動的“守護程序”稱為init,它的作用是啟動系統的其餘部分,包括所有其他“守護程序”和圖形會話。
不同的 Linux 發行版使用不同的init系統。自舊 Unix 時代以來一直使用的傳統 init 系統是Sys V init(指的是 System V Unix)。但最近許多發行版已切換到更現代的 init 系統,例如systemd。
Shell,有時也稱為“命令列”,實現了一個文字介面,允許您透過從鍵盤輸入命令來執行程式和控制系統。沒有 Shell(或可以替代它的東西,比如桌面環境),讓您的系統真正做一些事情會很困難。Shell只是一個程式;Linux 有幾種不同的 Shell,每種 Shell 都提供了一些不同的功能。大多數 Linux 系統使用 Bourne Again Shell(Bash)。Linux Shell 支援多工處理(同時執行多個程式)。
X 視窗伺服器是命令 Shell 的圖形替代品。它負責繪製圖形並處理來自鍵盤、滑鼠、平板電腦和其他裝置的輸入。X 伺服器是網路透明的;也就是說,它允許您在自己的計算機和透過網路連線的遠端計算機上都可以在圖形環境中工作。如今最常用的 X 伺服器是 X.Org。大多數圖形程式只需要 X 伺服器才能執行,因此它們可以在任何視窗管理器和桌面環境下使用。
視窗管理器是一個與 X 伺服器通訊的程式。它的任務是管理視窗。它負責繪製視窗邊框,在您單擊視窗時將其置於最前面,在螢幕上移動它以及在您最小化其程式時將其隱藏。流行的視窗管理器的示例包括
- Metacity - GNOME 桌面環境視窗管理器
- KWin - KDE 視窗管理器
- Xfwm - Xfce 視窗管理器,一個輕量級管理器,旨在儘可能少地消耗資源,而不會影響可用性
- Compiz Fusion - 一種高階視窗管理器,具有許多視覺效果,如可自定義的視窗動畫、放置在您可以用滑鼠旋轉的立方體上的多個桌面、透明的視窗邊框、在拖動視窗時晃動視窗等。
桌面環境(如 GNOME 桌面環境、KDE 和 Xfce)是旨在為大多數常見任務提供一致的使用者介面的程式集合。它們是大多數人在說“作業系統”時所指的,即使它們只是整個作業系統的部分。同一臺機器可以共存多個桌面環境。它們可以輕鬆安裝,安裝後,使用者將可以選擇使用哪個 DE 來啟動會話。
基於 Linux 的發行版使用幾種檔案系統。它們是 BTRFS、EXT3/4、VFS、NILFS 和 SquashFS。
計算機硬碟的介面非常簡單。它只接受“讀取 550923 號資料塊並將其放入記憶體地址 0x0021A400”之類的指令。假設您正在編輯一段文字並想將其儲存到磁碟上。使用資料塊編號(地址)來標識資料塊,例如您的文字,這很麻煩:您不僅要告訴您的程式在哪裡使用原始資料塊編號儲存檔案,而且您還要確保這些資料塊沒有被用於家庭照片,您的音樂收藏,甚至您的系統核心。為了解決這個問題,引入了檔案。檔案是磁碟上儲存資料的區域,它有名稱(例如“example.txt”)。檔案被組織在稱為目錄的集合中。目錄可以包含其他目錄,形成樹狀結構。每個檔案都可以透過“路徑”進行唯一識別,該路徑描述了它在目錄層次結構中的位置。在本節的剩餘部分中,將假設您熟悉檔案、目錄和路徑。
在 Linux 中,頂層目錄稱為根目錄。系統中的每個檔案和目錄都必須是根目錄的後代。(通常使用家庭關係的術語來談論目錄,例如“父級”、“子級”、“後代”、“祖先”、“兄弟姐妹”等等。)檔案和目錄的名稱可以包含除空字元(無法從鍵盤輸入)和“/”字元之外的所有字元。一個示例路徑是
- /var/logs/apache/error.log
此路徑是指一個名為“error.log”的檔案,它位於名為“apache”的目錄中,該目錄是名為“logs”的目錄的子目錄,該目錄是名為“var”的目錄的子目錄,該目錄是根目錄的子目錄。根目錄沒有像其他目錄一樣的名稱;它只是用路徑開頭的“/”字元表示。
根目錄通常只包含少量子目錄。最重要的是
- bin - 執行基本任務所需的程式,例如更改目錄或複製檔案
- dev - 表示硬體裝置的特殊檔案
- etc - 配置檔案
- home - 包含使用者的私有目錄
- media 或 mnt - 掛載點,用於連線到此計算機的外部驅動器,例如 CD 或 USB 金鑰
- tmp - 臨時檔案
- usr - 安裝在計算機上的程式
- var - 程式產生的可變資料,例如錯誤日誌
裝置作為檔案
[edit | edit source]正如可以寫入和讀取檔案一樣,計算機系統中的裝置也可以傳送和接收資料。因此,Linux 將連線到系統的裝置表示為/dev目錄中的檔案。這些檔案不能重新命名或移動(它們沒有儲存在任何磁碟上)。這種方法極大地簡化了應用程式程式設計。如果您想透過序列埠將某些內容傳送到另一臺計算機,您甚至不需要另一個程式——您只需寫入檔案/dev/ttyS0即可,該檔案表示序列埠。以相同的方式,表示音效卡(/dev/dsp)的檔案可以被讀取以捕捉連線的麥克風的聲音,或者被寫入以透過揚聲器發出聲音。
驅動器磁碟機代號在哪裡?
[edit | edit source]如果您使用過 Windows,您可能會驚訝地發現 Linux 中沒有驅動器磁碟機代號。根目錄表示安裝系統的驅動器(在 Windows 中為 C:)。其他驅動器可以在檔案系統中的任何目錄(最好是空的目錄)中“掛載”或“解除安裝”。透過掛載磁碟,您將此磁碟的根目錄附加到檔案系統中的目錄。之後,您可以像訪問系統磁碟一樣訪問磁碟。例如:如果您有一個包含目錄text的磁碟,該目錄又包含一個名為linux-intro.tex的檔案,並且您將此驅動器掛載到目錄/media/usbkey中,您就可以透過路徑/media/usbkey/text/linux-intro.tex訪問檔案linux-intro.tex。
在大多數 Linux 發行版中,USB 金鑰和 CD 在插入或連線時會自動掛載,預設掛載目錄是/media或/mnt的子目錄。例如,您的第一個 CD-ROM 驅動器可能會掛載在/media/cdrom0,而 USB 金鑰的內容可能可以透過/media/usb0訪問。您可以手動更改掛載目錄,但您必須學習兩個 shell 命令並知道代表您的驅動器的裝置檔案(我們在上一節中談到的——磁碟也在/dev目錄中獲得其檔案表示)。我們將在後面介紹這個主題。
使用者
[edit | edit source]使用者是與系統互動的人或事物的隱喻。使用者透過使用者名稱和密碼識別。在內部,每個使用者都有一個唯一的數字分配,稱為使用者 ID,簡稱 UID。您只需要在某些罕見的情況下知道您的 UID。使用者還可以被組織到組中。在所有 Linux 系統中,都存在一個特殊使用者,其使用者名稱為“root”,UID 為 0。它也稱為超級使用者。超級使用者可以執行任何操作,不受任何安全機制的控制。擁有這樣的使用者帳戶對於管理任務和配置系統非常有用。在某些發行版(如 Ubuntu)中,直接訪問 root 帳戶被停用,而是使用其他機制。
如果您在 Linux 系統上有多個使用者帳戶,您無需登出並重新登入即可切換身份模擬。存在一些特殊的 shell 命令,允許您以其他使用者身份訪問檔案和執行程式,前提是您知道他們的使用者名稱和密碼。由於這種機制,您可以將大部分時間作為低許可權使用者,只有在需要時才切換到高許可權帳戶。
以非特權使用者身份執行的優點是,您碰巧犯下的任何錯誤都很不可能損壞系統。系統關鍵元件只能由 root 使用者更改。
檔案許可權
[edit | edit source]使用者的存在是為了控制使用系統的人員和程式可以控制系統的程度。這是透過檔案許可權系統實現的。每個檔案都屬於一個使用者——也就是說,每個檔案都有一個所有者。此外,檔案可以分配給一組使用者,但所有者必須是該組的成員。每個檔案都有三種類型的許可權:讀、寫和執行。這些許可權可以分配給三種所有者關係:所有者、組和其他。其他包括所有不是檔案所有者且不屬於擁有該檔案的組的使用者。只有檔案所有者或超級使用者(root)可以更改檔案的許可權或所有權。
此係統允許對誰可以在給定計算機上執行什麼進行精確控制。可以透過從系統檔案上刪除“寫入”許可權來阻止使用者修改系統檔案,或者透過刪除“執行”許可權來阻止使用者執行某些命令。請注意,使用者可能被允許執行程式,但不能修改它們。這一點非常重要,因為大多數 Linux 系統都包含一個編譯器,允許您建立自己的程式。
檔案許可權通常以三個八進位制數字表示(每個數字從 0 到 7)。數字分別代表所有者、組和其他使用者的許可權。每個數字都是許可權程式碼的總和:執行為 1,寫入為 2,讀取為 4。例如,“755”允許每個人讀取或執行檔案,但只有所有者可以寫入它。“400”允許所有者讀取檔案,而其他人則不允許執行任何操作。“540”允許所有者讀取或執行檔案,組成員只能讀取檔案,而其他使用者則不允許執行任何操作。