1. 程式人生 > >Linux文件系統---用戶與內核的交互接口

Linux文件系統---用戶與內核的交互接口

gbm 程序 系統環境 組成 linu 數據塊 ssd 其他 int

從磁盤到數據,從數據到文件,從文件到目錄,從目錄到文件系統,從文件系統到操作系統。構成了計算機中的IO讀寫機制。

技術分享圖片

整個磁盤可以分為1個MBR(Master Boot Record)和4個partitions。一個分區,其實就是一個文件系統,文件系統就是管理組織硬盤上數據的一堆數據結構程序,一個文件系統由許多block塊組成。塊是文件系統讀寫存放數據的最小單位,一般是4KB。每個Block裏只能存放一個文件的數據。如果文件大於Block大小,則該文件會占用多個Block。對於文件來說,分為目錄項、inode、數據塊。對於操作系統和應用程序來說,都是通過文件系統來訪問硬盤上的文件。

1、硬盤讀寫原理

大多數永久性或半永久性電腦數據都是將磁盤上的一小片金屬物質磁化來實現。然後再將這些磁性圖可被轉換成原始數據。這便是磁存儲的原理。

我們知道信息存儲在硬盤裏,把它拆開也看不見裏面有任何東西,只有些盤片。假設,你用顯微鏡把盤片放大,會看見盤片表面凹凸不平,凸起的地方被磁化,凹的地方是沒有被磁化;凸起的地方代表數字1(磁化為1),凹的地方代表數字0。因此硬盤可以以二進制來存儲表示文字、圖片等信息。

硬盤,我們可以把它比喻成是我們電腦儲存數據和信息的大倉庫。一般說來,無論哪種硬盤,都是由盤片、磁頭、盤片主軸、控制電機、磁頭控制器、數據轉換器、接口、緩存等幾個部份組成。

磁頭是硬盤中最昂貴的部件,也是硬盤技術中最重要和最關鍵的一環。

當磁盤旋轉時,磁頭若保持在一個位置上,則每個磁頭都會在磁盤表面劃出一個圓形軌跡,這些圓形軌跡就叫做磁道。這些磁道用肉眼是根本看不到的,因為它們僅是盤面上以特殊方式磁化了的一些磁化區,磁盤上的信息便是沿著這樣的軌道存放的。磁盤上的每個磁道被等分為若幹個弧段,這些弧段便是磁盤的山區,每個扇區可以存放512個字節的信息,磁盤驅動器在向磁盤讀取和寫入數據時,要以扇區為單位。1.44MB3.5英寸的軟盤,每個磁道分為18個扇區。

磁盤通常由重疊的一組盤片構成,每個盤面都被劃分為數目相等的磁道,並從外緣的“0”開始編號,具有相同編號的磁道形成一個圓柱,稱之為磁盤的柱面。磁盤的柱面數與一個盤單面上的磁道數是相等的。無論是雙盤面還是單盤面,由於每個盤面都只有自己獨一無二的磁頭,因此,盤面數等於總的磁頭數。所謂硬盤的CHS,即Cylinder(柱面)、Head(磁頭)、Sector(扇區),只要知道了硬盤的CHS的數目,即可確定硬盤的容量,硬盤的容量=柱面數*磁頭數*扇區數*512B。

2、文件

Linux中有個哲學,一切皆文件。那麽,在Linux文件系統下,有哪些文件類型呢?文件又是怎樣存儲在文件系統中的呢?

在Linux下,常用的七種文件類型如下:

1)、普通文件regular file,用 - (破折號)標示, 比如 -rwxr--r-- ,rxw前面的 - 表明這個是普通文件。

2)、目錄文件directory,用 d 標示 ,比如drwx------ 目錄也是一個文件,其中存放著文件名和文件索引結點之間的關聯關系。

3)、塊設備文件block deivce ,用 b 標示,實際表示硬件設備 ,可以在/dev 目錄訪問,包含磁盤驅動光盤驅動等。

4)、字符設備文件character device,用 c 標示,也表示硬件設備,但數據是以字節流發送的,設備包括終端設備和串口設備。

5)、鏈接 link 設備用 l 標示,就是ln 創建的鏈接,分為軟和硬鏈接。

6)、命名管道文件 pipe 用 p 標示,管道也是一個文件,作為數據管道方便程序之間的通信,也稱為FIFO。

7)、套接字文件socket 用 s 標示,與管道不同,套接字能使通過網絡連接的不同計算機的進程之間進行通信。

當執行一個文件時候,進程通過文件名直接訪問文件本身。這樣,每次讀取文件的時候,過程如下:

文件名----(通過目錄項)---->inode編號----(通過inode)----->得到文件的地址(數據塊號數組)---->讀取文件。

在Linux的文件系統(如ext2、ext3、ext4)中,一個文件由目錄項、inode和數據塊組成。

1)、目錄項:包括文件名和inode節點號。

2)、Inode:又稱文件索引節點,是包含了文件基本信息的和數據塊的指針。

Linux正統的文件系統下,將硬盤分區時會劃分出目錄塊、inode Table區塊和data block數據區域。Inode包含文件的屬性(如讀寫屬性、owner等,以及指向數據塊的指針),數據區域塊則是文件內容。當查看某個文件時,會先從inode table中查出文件屬性及數據存放點,再從數據塊中讀取數據。理解inode,要從文件儲存說起。文件儲存在硬盤上,硬盤的最小存儲單位叫做"扇區"(Sector),每個扇區儲存512字節(相當於0.5KB)。

操作系統讀取硬盤的時候,不會一個扇區一個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取個"塊"(block)。這種由多個扇區組成的"塊",是文件存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個block。


文件數據都儲存在"塊"中,那麽很顯然,我們還必須找到一個地方儲存文件的元信息,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名為"索引節點"。

技術分享圖片

3)、數據塊:文件的具體內容存放地。

技術分享圖片

3、文件目錄

目錄,實際上是文件下系統的訪問各個文件組合的映射。在LInux下,設備和硬盤都是掛載到某個目錄,最原始的是掛載到根目錄。然後用戶通過進入目錄去訪問硬盤上的數據,也就是文件。所以說,目錄是一個訪問硬盤文件數據的實際入口。在Linux下的目錄結構如下:

/bin:系統有很多放置執行檔的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。在/bin底下的指令可以被root與一般帳號所使用,主要有:cat,chmod(修改權限),chown、date、mv、mkdir、cp、bash等等常用的指令。

/boot:主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。Linux kernel常用的檔名為:vmlinuz ,如果使用的是grub這個開機管理程式,則還會存在/boot/grub/這個目錄。

/dev:在Linux系統上,任何裝置與周邊設備都是以檔案的型態存在於這個目錄當中。 只要通過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有/dev/null、 /dev/zero、/dev/tty、/dev/lp*、 / dev/hd*、/dev/sd*等等

/etc:系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務的啟始檔等等。 一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但是只有root有權力修改。 另外,其下重要的目錄有:/etc/init.d/ 。所有服務的預設啟動script都是放在這裏的,例如要啟動或者關閉iptables的話: /etc/init.d/iptables start、/etc/init.d/ iptables stop。

/homt:這是系統預設的使用者家目錄(home directory)。在你新增一個一般使用者帳號時,預設的使用者家目錄都會規範到這裏來。比較重要的是,家目錄有兩種代號:~ :代表當前使用者的家目錄,而 ~guest:則代表用戶名為guest的家目錄。

/lib:系統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin或/sbin底下的指令會呼叫的函式庫而已 。 什麽是函式庫呢?妳可以將他想成是外掛,某些指令必須要有這些外掛才能夠順利完成程式的執行之意。 尤其重要的是/lib/modules/這個目錄,因為該目錄會放置核心相關的模組(驅動程式)。

/media:media是媒體的英文,顧名思義,這個/media底下放置的就是可移除的裝置。 包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy、/media/cdrom等等。

/mnt:如果想要暫時掛載某些額外的裝置,一般建議可以放置到這個目錄中。

/opt:這個是給第三方協力軟體放置的目錄 。

/root:系統管理員(root)的家目錄。

/sbin:Linux有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來設定系統,其他使用者最多只能用來查詢而已。放在/sbin底下的為開機過程中所需要的,裏面包括了開機、修復、還原系統所需要的指令。

/srv:srv可以視為service的縮寫,是一些網路服務啟動之後,這些服務所需要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來說,WWW伺服器需要的網頁資料就可以放置在/srv/www/裏面。呵呵,看來平時我們編寫的代碼應該放到這裏了。

/tmp:這是讓一般使用者或者是正在執行的程序暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以定期清理。


4、文件系統

文件系統,是操作系統中用於明確磁盤或者分區上的文件的方法和數據結構,即磁盤上組織文件的方法。文件系統的存在,使得數據可以被有效而透明地進行存儲訪問。在傳統意義上,一個分區只能格式化為一個文件系統,所以通常認為一個文件系統就是一個分區。在計算機中,DOS、Windows、OS/2、Macintosh和UNIX-based操作系統都有文件系統,在此系統中文件被放置在分等級的(樹狀)結構中的某一處。文件被放置進目錄或子目錄,在樹狀結構中你希望的位置中。

磁盤或分區和它所包括的文件系統的不同是很重要的。少數程序(包括最有理由的產生文件系統的程序)直接對磁盤或分區的原始扇區進行操作;這可能破壞一個存在的文件系統。大部分程序基於文件系統進行操作,在不同種文件系統上不能工作。

在Linux系統下,可以通過df -Th 查看Linux下硬盤分區以及文件系統信息,而du -sh是查看文件大小信息:

在安裝 Linux 系統時,根據服務器的用途,需要對硬盤進行合理分區規劃。在系統運行的過程中,隨著業務的發展變化,不斷增長的數據存儲的要求,也需要對磁盤存儲進行調整和管理。目前在服務器上使用得最多,技術最成熟可靠的仍然是傳統的機械硬盤。隨著技術的發展,在相當多的領域也使用了基於閃存技術的 SSD 硬盤。硬盤當然是用來存儲數據,即存放系統和用戶的文件,而分區的文件系統就規定了數據存儲單元在硬盤上排列的規則。

不同的文件系統,存儲數據的方式不一樣,這些不同的文件系統可以共存於同一個系統的硬盤之上,但不能共存於同一個磁盤分區之上。Linux 最重要的特性之一就是支持多種文件系統。

而 Linux 通過 VFS(Virtual File System)支持多個不同的文件系統,能夠與不同的操作環境實現資源共享。關於文件系統,在Linux下有一個重要的哲學,就是一切皆文件。其實現的原理,就是通過VFS。虛擬文件系統(VFS)作為內核的子系統,為用戶空間程序提供了文件系統接口,系統中的所有文件系統依靠VFS系統協調工作。通過虛擬文件系統,可以利用標準的UNIX系統調用對不同介質的不同文件進行讀寫操作,而不需要考慮具體的文件系統和實際物理介質。

所有,總的來說。從磁盤到數據,從數據到文件,從文件到目錄,從目錄到文件系統,從不同的文件系統到操作系統,這其中蘊含了復雜的實現原理,但是底層設計思路構成了計算機中的IO讀寫機制的基礎。

Linux文件系統---用戶與內核的交互接口