1. 程式人生 > >Linux檔案系統和系統結構

Linux檔案系統和系統結構

導讀 Linux系統一般有4個主要部分:核心、shell、檔案系統和應用程式。核心、shell和檔案系統一起形成了基本的作業系統結構,它們使得使用者可以執行程式、管理檔案並使用系統。

改一改

1. linux核心

核心是作業系統的核心,具有很多最基本功能,它負責管理系統的程序、記憶體、裝置驅動程式、檔案和網路系統,決定著系統的效能和穩定性。

Linux 核心由如下幾部分組成:記憶體管理、程序管理、裝置驅動程式、檔案系統和網路管理等。如圖:

帶你真正認識Linux 系統結構帶你真正認識Linux 系統結構

系統呼叫介面:SCI 層提供了某些機制執行從使用者空間到核心的函式呼叫。這個介面依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函式呼叫多路複用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。

1.1 記憶體管理

對任何一臺計算機而言,其記憶體以及其它資源都是有限的。為了讓有限的實體記憶體滿足應用程式對記憶體的大需求量,Linux 採用了稱為“虛擬記憶體”的記憶體管理方式。Linux 將記憶體劃分為容易處理的“記憶體頁”(對於大部分體系結構來說都是 4KB)。Linux 包括了管理可用記憶體的方式,以及物理和虛擬對映所使用的硬體機制。

不過記憶體管理要管理的可不止 4KB 緩衝區。Linux 提供了對 4KB 緩衝區的抽象,例如 slab 分配器。這種記憶體管理模式使用 4KB 緩衝區為基數,然後從中分配結構,並跟蹤記憶體頁使用情況,比如哪些記憶體頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整記憶體使用。

為了支援多個使用者使用記憶體,有時會出現可用記憶體被消耗光的情況。由於這個原因,頁面可以移出記憶體並放入磁碟中。這個過程稱為交換,因為頁面會被從記憶體交換到硬碟上。記憶體管理的原始碼可以在 ./linux/mm 中找到。

1.2 程序管理

程序實際是某特定應用程式的一個執行實體。在 Linux 系統中,能夠同時執行多個程序,Linux 通過在短的時間間隔內輪流執行這些程序而實現“多工”。這一短的時間間隔稱為“時間片”,讓程序輪流執行的方法稱為“程序排程” ,完成排程的程式稱為排程程式。

程序排程控制程序對CPU的訪問。當需要選擇下一個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待CPU資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。Linux使用了比較簡單的基於優先順序的程序排程演算法選擇新的程序。

通過多工機制,每個程序可認為只有自己獨佔計算機,從而簡化程式的編寫。每個程序有自己單獨的地址空間,並且只能由這一程序訪問,這樣,作業系統避免了程序之間的互相干擾以及“壞”程式對系統可能造成的危害。 為了完成某特定任務,有時需要綜合兩個程式的功能,例如一個程式輸出文字,而另一個程式對文字進行排序。為此,作業系統還提供程序間的通訊機制來幫助完成這樣的任務。Linux 中常見的程序間通訊機制有訊號、管道、共享記憶體、訊號量和套接字等。

核心通過 SCI 提供了一個應用程式程式設計介面(API)來建立一個新程序(fork、exec 或 Portable Operating System Interface [POSⅨ] 函式),停止程序(kill、exit),並在它們之間進行通訊和同步(signal 或者 POSⅨ 機制)。

1.3 檔案系統

和 DOS 等作業系統不同,Linux 作業系統中單獨的檔案系統並不是由驅動器號或驅動器名稱(如 A: 或 C: 等)來標識的。相反,和 UNIX 作業系統一樣,Linux 作業系統將獨立的檔案系統組合成了一個層次化的樹形結構,並且由一個單獨的實體代表這一檔案系統。Linux 將新的檔案系統通過一個稱為“掛裝”或“掛上”的操作將其掛裝到某個目錄上,從而讓不同的檔案系統結合成為一個整體。Linux 作業系統的一個重要特點是它支援許多不同型別的檔案系統。Linux 中最普遍使用的檔案系統是 Ext2,它也是 Linux 土生土長的檔案系統。但 Linux 也能夠支援 FAT、VFAT、FAT32、MINIX 等不同型別的檔案系統,從而可以方便地和其它作業系統交換資料。由於 Linux 支援許多不同的檔案系統,並且將它們組織成了一個統一的虛擬檔案系統.

虛擬檔案系統(VirtualFileSystem,VFS):隱藏了各種硬體的具體細節,把檔案系統操作和不同檔案系統的具體實現細節分離了開來,為所有的裝置提供了統一的介面,VFS提供了多達數十種不同的檔案系統。虛擬檔案系統可以分為邏輯檔案系統和裝置驅動程式。邏輯檔案系統指Linux所支援的檔案系統,如ext2,fat等,裝置驅動程式指為每一種硬體控制器所編寫的裝置驅動程式模組。

虛擬檔案系統(VFS)是 Linux 核心中非常有用的一個方面,因為它為檔案系統提供了一個通用的介面抽象。VFS 在 SCI 和核心所支援的檔案系統之間提供了一個交換層。即VFS在使用者和檔案系統之間提供了一個交換層。

VFS在使用者和檔案系統之間提供了一個交換層: 帶你真正認識Linux 系統結構帶你真正認識Linux 系統結構

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函式的一個通用 API 抽象。在 VFS 下面是檔案系統抽象,它定義了上層函式的實現方式。它們是給定檔案系統(超過 50 個)的外掛。檔案系統的原始碼可以在 ./linux/fs 中找到。

檔案系統層之下是緩衝區快取,它為檔案系統層提供了一個通用函式集(與具體檔案系統無關)。這個快取層通過將資料保留一段時間(或者隨即預先讀取資料以便在需要是就可用)優化了對物理裝置的訪問。緩衝區快取之下是裝置驅動程式,它實現了特定物理裝置的介面。

因此,使用者和程序不需要知道檔案所在的檔案系統型別,而只需要象使用 Ext2 檔案系統中的檔案一樣使用它們。

1.4 裝置驅動程式

裝置驅動程式是 Linux 核心的主要部分。和作業系統的其它部分類似,裝置驅動程式執行在高特權級的處理器環境中,從而可以直接對硬體進行操作,但正因為如此,任何一個裝置驅動程式的錯誤都可能導致作業系統的崩潰。裝置驅動程式實際控制作業系統和硬體裝置之間的互動。

裝置驅動程式提供一組作業系統可理解的抽象介面完成和作業系統之間的互動,而與硬體相關的具體操作細節由裝置驅動程式完成。一般而言,裝置驅動程式和裝置的控制晶片有關,例如,如果計算機硬碟是 SCSI 硬碟,則需要使用 SCSI 驅動程式,而不是 IDE 驅動程式。

1.5 網路介面(NET)

提供了對各種網路標準的存取和各種網路硬體的支援。網路介面可分為網路協議和網路驅動程式。網路協議部分負責實現每一種可能的網路傳輸協議。眾所周知,TCP/IP 協議是 Internet 的標準協議,同時也是事實上的工業標準。

Linux 的網路實現支援 BSD 套接字,支援全部的TCP/IP協議。Linux核心的網路部分由BSD套接字、網路協議層和網路裝置驅動程式組成。網路裝置驅動程式負責與硬體裝置通訊,每一種可能的硬體裝置都有相應的裝置驅動程式。

2. Linux Shell

shell是系統的使用者介面,提供了使用者與核心進行互動操作的一種介面。它接收使用者輸入的命令並把它送入核心去執行,是一個命令直譯器。另外,shell程式語言具有普通程式語言的很多特點,用這種程式語言編寫的shell程式與其他應用程式具有同樣的效果。

目前主要有下列版本的shell。

1.Bourne Shell:是貝爾實驗室開發的。

2.BASH:是GNU的Bourne Again Shell,是GNU作業系統上預設的shell,大部分linux的發行套件使用的都是這種shell。

3.Korn Shell:是對Bourne SHell的發展,在大部分內容上與Bourne Shell相容。

4.C Shell:是SUN公司Shell的BSD版本。

3. linux 檔案系統

檔案系統是檔案存放在磁碟等儲存裝置上的組織方法。Linux系統能支援多種目前流行的檔案系統,如EXT2、 EXT3、 FAT、 FAT32、 VFAT和ISO9660。

3.1 檔案型別

Linux下面的檔案型別主要有:

1) 普通檔案:C語言元程式碼、SHELL指令碼、二進位制的可執行檔案等。分為純文字和二進位制。

2) 目錄檔案:目錄,儲存檔案的唯一地方。

3) 連結檔案:指向同一個檔案或目錄的的檔案。

4) 裝置檔案:與系統外設相關的,通常在/dev下面。分為塊裝置和字元裝置。

5)管道(FIFO)檔案: 提供程序之間通訊的一種方式

6)套接字(socket) 檔案: 該檔案型別與網路通訊有關

可以通過ls –l, file, stat幾個命令來檢視檔案的型別等相關資訊。

3.2 Linux目錄

檔案結構是檔案存放在磁碟等存貯裝置上的組織方法。主要體現在對檔案和目錄的組織上;

目錄提供了管理檔案的一個方便而有效的途徑。

Linux使用標準的目錄結構,在安裝的時候,安裝程式就已經為使用者建立了檔案系統和完整而固定的目錄組成形式,並指定了每個目錄的作用和其中的檔案型別。

完整的目錄樹可劃分為小的部分,這些小部分又可以單獨存放在自己的磁碟或分割槽上。這樣,相對穩定的部分和經常變化的部分可單獨存放在不同的分割槽中,從而方便備份或系統管理。目錄樹的主要部分有 root、/usr、/var、/home 等。這樣的佈局可方便在 Linux 計算機之間共享檔案系統的某些部分。

帶你真正認識Linux 系統結構帶你真正認識Linux 系統結構

Linux採用的是樹型結構。最上層是根目錄,其他的所有目錄都是從根目錄出發而生成的。

微軟的DOS和windows也是採用樹型結構,但是在DOS和windows中這樣的樹型結構的根是磁碟分割槽的碟符,有幾個分割槽就有幾個樹型結構,他們之間的關係是並列的。最頂部的是不同的磁碟(分割槽),如:C,D,E,F等。

但是在linux中,無論作業系統管理幾個磁碟分割槽,這樣的目錄樹只有一個。從結構上講,各個磁碟分割槽上的樹型目錄不一定是並列的。

3.3 Linux磁碟分割槽

主分割槽,擴充套件分割槽和邏輯分割槽:

linux分割槽不同於windows,硬碟和硬碟分割槽在Linux都表示為裝置.

硬碟分割槽一共有三種:主分割槽,擴充套件分割槽和邏輯分割槽。

硬碟的分割槽主要分為主分割槽(Primary Partion)和擴充套件分割槽(Extension Partion)兩種,主分割槽和擴充套件分割槽的數目之和不能大於四個。

主分割槽(Primary Partion):可以馬上被使用但不能再分割槽。

擴充套件分割槽(Extension Partion):必須再進行分割槽後才能使用,也就是說它必須還要進行二次分割槽。

邏輯分割槽((Logical Partion)):由擴充套件分割槽建立起來的分割槽,邏輯分割槽沒有數量上限制。

擴充套件分割槽只不過是邏輯分割槽的“容器”,實際上只有主分割槽和邏輯分割槽進行資料儲存。

Linux下硬碟分割槽的標識

硬碟分割槽的標識一般使用/dev/hd[a-z]X或者/dev/sd[a-z]X來標識,其中[a-z]代表硬碟號,X代表硬碟內的分割槽號。

整塊硬碟分割槽的塊號標識:Linux下用hda、hdb、sda、sdb 等來標識不同的硬碟;

其中:

IDE介面硬碟:表示為/dev/hda1、/dev/hdb …;

SCSI 介面的硬碟、SATA介面的硬碟表示為/dev/sda、/dev/sdb … … ;

硬碟內的分割槽:如果X的值是1到4,表示硬碟的主分割槽(包含擴充套件分割槽);邏輯分割槽從是從5開始的,比如/dev/hda5肯定是邏輯分割槽了;

例如:

用hda1、hda2、 hda5、hda6 來標識不同的分割槽。其中,字母a代表第一塊硬碟,b代表第二塊硬碟,依次類推。而數字1 代表一塊硬碟的第一個分割槽、2 代表第二個分割槽,依次類推。1 到4 對應的是主分割槽(Primary Partition)或擴充套件分割槽(Extension Partition)。從5開始,對應的都是硬碟的邏輯分割槽(Logical Partition)。一塊硬碟即使只有一個主分割槽,邏輯分割槽也是從5開始編號的,這點應特別注意。

總結:一個硬碟分割槽首先要確認在哪個硬碟,然後再確認它所在硬碟內的哪個分割槽。

對於/dev/hda 類似的表示方法,也並不寞生吧;我們在Linux通過fdisk -l 就可以查到硬碟是/dev/hda還是/dev/hdb;

[[email protected] ~]# fdisk -l