目錄
磁盤簡介
Ext文件系統
塊
分區
分組
inode
再談inode
路徑解析
路徑緩存
再再看inode
掛載
小知識
磁盤簡介
磁盤:一個機械設備,用于儲存數據。? 未被打開的文件都是存在磁盤上的,被打開的加載到內存中。
扇區:是OS訪問磁盤的基本單位,普通為512字節。
磁頭:通過左右擺動定位磁道,然后定位扇區
柱面:同一半徑上下的磁道構成的柱面
邏輯上看,可以以磁道展開,當做一維數組,以柱面(整個磁盤的同一個垂直位置的磁道為一個柱面)展開,每個柱面都是個二維數組,整個磁盤(多個柱面)就是個三維數組,這樣,對于OS來說,只需要在一個三維數組中定位即可對磁盤上的數據進行操作。
所以,對扇區的定位要通過找柱面-》磁道-》扇區的過程,叫CHS地址。
Ext文件系統
塊
塊:八個扇區組成一個塊,塊是文件存取的最小單位。
1.OS看待磁盤,認為磁盤是一個塊設備,每個塊都有下標
2.文件系統看待磁盤,認為磁盤是一個block array[N] 的塊設備。
分區
分區:以開始塊號和結束塊號劃分,不同分區其實就是不同的盤,所以一塊磁盤就可以通過分區形成C、D等盤。
分組
分組:每個分區被分為多個塊組。這里采用分治的思想,分而治之。
在一個塊組中
Data Blocks:保存文件的內容,以4KB為單位。大部分的磁盤分區空間,都由Data Blocks占據。(每個數據塊(4KB大小的塊),都有唯一的編號 )
Block Bitmap(塊位圖):用來記錄Data Blocks 中哪個數據塊被占用,哪個數據塊沒被占用。(每個比特位代表一個數據塊,比特位位置表示對應位置的數據塊,比特位內容表示是否被占用。 )
inode
1.在文件系統中,文件屬性由inode的結構體來描述,而結構體大小是固定的,一般為128字節或256字節。可知,任何文件的屬性的種類是相同的,屬性的內容不同。
?
2.為了標識每個文件的唯一性,每個inode中都有inode number(inode編號)。
?
3.inode結構體中有i_block的數組映射關系表來找到文件內容
所以,上面的塊組中的
inode Table:存放文件屬性,如文件大小、所有者、最近修改時間等(是當前塊組中所有inode屬性的集合)。
?
inode Bitmap:用來標識inode Table中的位置是否被占用。(比特位的位置,表示哪個對應的inode ,比特位的內容表示是否空閑)
GDT:用來描述整個塊組的不同分區的位置。
?
Super Block:管理所有的組,用來描述一個分區分組整體情況。
注:不一定所有的組中都有,但幾乎多個組會同時存在同樣的Super Block,因為這個部分非常重要,如果損壞會導致整個分區廢掉,所以會在多個組中都存在來備份。
所以,新建一個分區時,Super Block和GDT一定有有效數據,要給寫入文件系統和分區分組相關的管理信息。
再談inode
1.inode用來標識文件的唯一性。
2.inode由全分區統一分配(塊號也是),不能跨分區,一個分區,就是一個文件系統,相互獨立,,每個組的大小固定,每個組有多少個block和inode都是固定的,在Super Block結構中。
?
3.inode中不存放文件名,為什么呢,因為文件名存放在目錄文件的Data Block中,目錄文件的Data Block中放的是該目錄下的文件的文件名和inode的映射關系。
?
4.所以,在指定目錄下,新建文件,需要就將文件名和inode的映射寫入到當前目錄的Data Block中,所以要有w權限,讀取一個文件的屬性,要有r權限,x權限,關系著我們能否打開該目錄,打開了才能去讀寫。
路徑解析
要打開一個文件,就要知道這個文件的inode,就要去這個文件的目錄文件Date Block中取,但目錄文件也是文件,想要打開也要向上找,直到找到根目錄,這就是路徑解析,總之訪問文件都需要其路徑。
路徑緩存
linux中,當用戶訪問指定路徑下文件(包括路徑上目錄、最終的文件),linux會在進行路徑解析過程中,在內核中形成目錄樹和路徑緩存,加快查找效率。
在內核中使用dentry結構體組織、緩存文件的inode等信息,每個文件都會有對應的dentry結構體,這樣訪問文件時,會先在dentry樹中查找,找到返回inode等數據,沒找到再去磁盤中搜索,然后緩存新路徑。
?
dentry樹會使用lru算法處理不常訪問的路徑,防止占內存過多
再再看inode
1.前12個下標直接映射,還有三個分別是一級、二級、三級的間接塊指針,一共在inode中只需要存15個指針來指向所有內容塊。
2.一級間接塊指針指向一個塊,這個塊中存的不是數據,而是塊號,用來映射多個儲存數據的塊,二級的間接塊指針指向一個存著多個一級間接塊的塊,三級同理,多級映射,就可以讓一個inode指向一個很大的文件。
3.一個inode指向的文件如果過大,可以跨組申請塊空間。(可能inode用完,block沒用完或者反過來,這時,雖然磁盤還有空間,但不能新建文件了)
掛載
指的是將文件系統附加到操作系統的目錄樹中的某個特定位置(稱為掛載點),從而使得該文件系統中的文件和目錄能夠被訪問和使用。
?
1.一個磁盤必須分區格式化才能使用,一個分區也不能直接使用,需要掛載到指定的目錄才可以使用。
?
2.df -h 查看掛載
?
3.所以,雖然每個分區inode編號可能重復,但可以根據訪問目標文件的“路徑前綴”來判斷是在哪一個分區。
小知識
1.操作系統通過外設內部的寄存器將數據寫給或讀出外設。
?
2.OS一次會讀取4KB,就會一次讀取32個文件的inode,可以減少IO次數,提高緩存效率。