核心 檔案和檔案系統的內部結構2UFS

2022-08-17 02:36:15 字數 3226 閱讀 9310

上一講,我們講了unix的本地檔案系統和linux的ext2檔案系統。並對他們進行了簡單的比較,發現基本相同。unix檔案系統的柱面組(cg,cylinder group)就是linux下的塊組(block group),因此柱面組資訊塊就是組塊描述符。另外,unix的柱面組資訊塊結構體包含位示圖(bitmap),而ext2中的點陣圖則單獨列了出來,使得每個組塊描述符是一樣的。

這一講,我們以ext2中的名詞為準,看看在原始碼中這些名詞(超級塊,塊組描述符,(inode)位示圖,索引節點表,資料塊)都是什麼東西。

目標檔案:linux-2.6.0\include\linux\ext2_fs.h

超級塊(superblock):ext2在磁碟上的超級塊存放在乙個ext2_super_block結構中。

當我們點進__u8,__u16,__u32其實是使用typedef給 unsigned char, unsigned short以及unsigned int的別名,代表長度為8,16,以及32位的無符號數,而__s8等則代表有符號的數。  這個裡面包含了全部ext2的超級塊的屬性。然而實際上,我們不能能把全部的超級塊內容都放入記憶體中,記憶體中關於ext2的超級塊資訊放在linux-2.6.0\include\linux\ext2_fs_sb.h。(如下圖)

塊組描述符(block group desc):是乙個ext2_group_desc結構體

當分配新索引節點和資料塊時,會用到bg_free_blocks_count,bg_free_inode_count和bg_used_dirs_count欄位。

其中位示圖就是這個結構體中的bg_block_bitmap和bg_inode_bitmap。位示圖是位的序列,其中值0表示對應的索引節點塊或者資料塊是空閒的,1表示占用。每個位圖必須存放在乙個單獨的塊中,又因為乙個塊可以是1024,2048或4096位元組,因此乙個單獨的點陣圖描述8192,16384或32768個塊的狀態。

索引節點表(icommon):由一連串連續的塊組成,其中每個塊包含索引節點的乙個預定義號。索引節點表第乙個塊的塊號存放在組描述的bg_inode_table欄位中。

所有索引節點的大小相同,即128位元組。乙個1024位元組的塊開業包含8個索引節點。為了計算出索引節點表占用了多少塊,用乙個組中的索引節點總數(存放在超級塊的s_inodes_per_group中)除以每塊中的索引節點數。

這裡的icommon與vfs中索引節點物件的字段相似。不相同的主要處理塊的分配。

索引節點表主要包括的屬性有mode(檔案型別0-7),i_size(以位元組為單位的檔案長度),uid,gid,a/c/m/dtime,硬鏈結數,檔案的資料塊數(i_blocks),檔案標誌(flags),指向資料塊的指標(i_block[ext2_n_blocks])等。

1、i_size和i_blocks的區別?——檔案的洞

2、指向資料塊的指標是如何指向資料塊的?——資料塊索引節點表

資料塊索引節點表(資料塊定址)上面的i_blocks和i_block[ext2_n_blocks]共同組成了資料塊索引節點表

i_block中有ext2_n_blocks個元素,且包含邏輯塊號的陣列。我們根據ext2_fs.h中的定義可知ext2_n_blocks=15(如下圖),而這15個元素有4種不同的型別,如下圖所示:

在申請新磁碟塊的時候,雖然理論上物理塊之間不連續,但是為了提高效率,ext2採用了相應的策略讓同一檔案的塊盡可能連續靠近。

注意這種機制是如何支援小檔案的。如果檔案需要的資料塊小於12,那麼兩次訪問磁碟就可以檢索到任何資料:一次是讀磁碟索引節點i_block陣列的乙個元素,另一次是讀所需要的資料塊。對於大檔案來說,可能需要3-4次的磁碟訪問才能找到需要的塊。實際上,這是一種最壞的估計,因為目錄項、緩衝區及頁快取記憶體都有助於極大地減少實際訪問磁碟的次數。

要注意檔案系統的塊大小是如何影響定址機制的,ext2的塊大小是允許調整的,因為大的塊大小允許ext2把更多的邏輯塊號存放在乙個單獨的塊中。表9.2顯示了對每種塊大小和每種定址方式所存放檔案大小的上限。例如,如果塊的大小是1024位元組,並且檔案包含的資料最多為268kb,那麼,通過直接對映可以訪問檔案最初的12kb資料,通過簡單的間接對映可以訪問剩餘的13kb到268kb的資料。對於4096位元組的塊,兩次間接就完全滿足了對2gb檔案的定址(2gb是32位體系結構上的ext2檔案系統所允許的最大值)。可定址的檔案資料塊大小的界限(如下表):

檔案的洞

檔案的洞(file hole)是普通檔案系統的一部分,它是一些空字元但沒有存放在磁碟的任何資料塊中。洞是unix檔案一直存在的乙個特點。下列的unix命令建立了第乙個位元組是洞的檔案:

$ echo -n "x" | dd of=/tmp/hole bs=1024 seek=6
/tmp/hole有6145個字元(6144個空字元+x),然而,這個檔案在磁碟上只佔乙個資料塊。引入檔案的洞是為了避免磁碟空間的浪費。檔案洞在ext2中的實現是基於動態資料塊的分配的:只有當程序需要向乙個塊寫資料時,才真正把這個塊分配給檔案。每個索引節點的i_size欄位定義程式鎖看到的檔案大小,包括洞,而i_blocks欄位存放分配給檔案有效的資料塊數(以512位元組為單位)

無論是在vfs還是在ufs,還是在別的什麼檔案系統,我們使用記住,檔案系統中最重要的兩個component是inode table和data block。乙個用於檔案索引節點號,乙個用於放資料塊。在ufs中,無論是超級塊,還是組塊描述符還是data block bitmap以及i-node bitmap都是為這兩者服務的,用來說明兩者的對應關係(指標+檔案占用block數目,資料塊索引表),兩者是誰的問題(dentry,inode)。

參考:《深入理解linux核心》

linux檔案系統和檔案結構

普通檔案 regular file 就是一般訪問的檔案,由ls al顯示出來的屬性中,第乙個屬性為 例如 rwxrwxrwx 目錄檔案 directory 就是目錄,第乙個屬性為 d 例如 drwxrwxrwx 連線檔案 link 類似windows下面的快捷方式。第乙個屬性為 l 例如 lrwxr...

python的檔案和檔案系統

一 檔案 1 python中使用 open 方法用於開啟乙個檔案,並返回檔案物件,在對檔案進行處理過程都需要使用到這個函式,如果該檔案無法被開啟,會丟擲 oserror。open 函式常用形式是接收兩個引數 檔名 file 和模式 mode 注意 使用 open 方法一定要保證關閉檔案物件,即呼叫 ...

linux檔案系統和檔案操作

write和open函式的練習 open函式可以開啟已經存在的檔案,也可以建立檔案返回檔案描述符 int fd open 路徑 o rdwr o creat,許可權 0777 建立檔案的時候需要加許可權0777,開啟檔案不需要加 int bytes write fd,字串指標,寫入bytes大小 i...