目錄
1.磁盤
1.1 概念
1.2?磁盤物理結構
1.3?磁盤的存儲結構
1.4?磁盤的邏輯結構
1.5?CHS && LBA地址
2.基礎文件系統
2.1 塊
?編輯
2.2?分區
2.3?inode
3.ext2 ?件系統
3.1?宏觀認識
3.2?Block Group
3.3塊組內部構成
3.3.1?超級塊(Super Block)
3.3.2?GDT(Group Descriptor Table)
3.3.3?塊位圖(Block Bitmap)
3.3.4?inode位圖(Inode Bitmap)
3.3.5?i節點表(Inode Table)
3.3.6?Data Block
3.4?inode和datablock映射
3.5??錄與?件名
3.6?路徑解析
3.7?路徑緩存
3.8?掛載分區
3.9 總結圖
4.軟硬連接
4.1 硬鏈接
4.2 軟鏈接
4.3?軟硬連接對?及用途
1.磁盤
在Linux中,打開的文件保存在內存中,對于沒有打開的文件則保存在磁盤里
1.1 概念
磁盤(disk)是指利用磁記錄技術存儲數據的存儲器。
1.2?磁盤物理結構
磁盤的物理結構由磁盤,磁頭,馬達....組成,這里的磁盤稱為盤片,一般有三個盤片,六個面,同樣也有每個盤面對應一個磁頭,一共六個磁頭,這六個磁頭由于綁定在一個機械臂上,因此只能共同運行(你走哪,我就走哪)
1.3?磁盤的存儲結構
磁盤的存儲結構和飛鏢盤差不多,每一面盤片中圓形代表一個磁道,磁道中又被分為許多扇區
扇區:是磁盤存儲數據的基本單位,512字節,塊設備
對于一個磁盤來說有三個盤片,對于一個磁道,從上往下看就相當一個圓柱體
可以先定位磁頭(header)確定磁頭要訪問哪?個柱?(磁道)(cylinder)定位?個扇區(sector)
而這三步就被稱為CHS地址定位
扇區是從磁盤讀出和寫?信息的最?單位,通常??為 512 字節。磁頭(head)數:每個盤??般有上下兩?,分別對應1個磁頭,共2個磁頭磁道(track)數:磁道是從盤?外圈往內圈編號0磁道,1磁道...,靠近主軸的同?圓?于停靠磁頭,不存儲數據柱?(cylinder)數:磁道構成柱?,數量上等同于磁道個數扇區(sector)數:每個磁道都被切分成很多扇形區域,每道的扇區數量相同圓盤(platter)數:就是盤?的數量磁盤容量=磁頭數 × 磁道(柱?)數 × 每道扇區數 × 每扇區字節數
1.4?磁盤的邏輯結構
在上文敘述過,由于盤片中的磁道是一個圓形,就可以把這個圓形剪開,形成一個線性結構


一樣也可以對多個磁道展開
整個磁盤就是多張?維的扇區數組表,也就是三維數組,對于三維數組,也可以像一維數組展開,所以,每?個扇區都有?個下標,我們叫做 LBA(Logical Block Address) 地址,其實就是線性地址
在OS只需要使?LBA就可以了,對于LBA地址轉成CHS地址,這步操作由磁盤??來做
1.5?CHS && LBA地址
磁頭數*每磁道扇區數 = 單個柱?的扇區總數LBA = 柱?號C*單個柱?的扇區總數 + 磁頭號H*每磁道扇區數 + 扇區號S - 1即:LBA = 柱?號C*(磁頭數*每磁道扇區數) + 磁頭號H*每磁道扇區數 + 扇區號S - 1扇區號通常是從1開始的,?在LBA中,地址是從0開始的柱?和磁道都是從0開始編號的總柱?,磁道個數,扇區總數等信息,在磁盤內部會?動維護,上層開機的時候,會獲取到這些參數。
柱?號C = LBA // (磁頭數*每磁道扇區數)【就是單個柱?的扇區總數】磁頭號H = (LBA % (磁頭數*每磁道扇區數)) // 每磁道扇區數扇區號S = (LBA % 每磁道扇區數) + 1"//": 表?除取整
2.基礎文件系統
2.1 塊
其實硬盤是典型的“塊”設備,操作系統讀取硬盤數據的時候,其實是不會?個個扇區地讀取,這樣效率太低,?是?次性連續讀取多個扇區,即?次性讀取?個”塊”(block)。 硬盤的每個分區是被劃分為?個個的”塊”。?個”塊”的??是由格式化的時候確定的,并且不可以更改,最常?的是4KB,即連續?個扇區組成?個 ”塊”。”塊”是?件存取的最?單位。
2.2?分區

2.3?inode
模式硬鏈接數?件所有者組??最后修改時間?件名

對于?件數據它都儲存在”塊”中,這種儲存?件屬性信息的區域就叫做inode,每?個?件都有對應的inode,??包含了與該?件有關的?些信息。注意:Linux下?件的存儲是屬性和內容分離存儲的Linux下,保存?件屬性的集合叫做inode,?個?件?件名屬性并未納?到inode數據結構內部inode的???般是128字節或者256任何?件的內容??可以不同,但是屬性???定是相同的
3.ext2 ?件系統
3.1?宏觀認識

3.2?Block Group
ext2?件系統會根據分區的??劃分為數個Block Group。?每個Block Group都有著相同的結構組成
3.3塊組內部構成
3.3.1?超級塊(Super Block)
存放?件系統本?的結構信息,描述整個分區的?件系統信息。記錄的信息主要有:bolck 和 inode的總量,未使?的block和inode的數量,?個block和inode的??,最近?次掛載的時間,最近?次寫?數據的時間,最近?次檢驗磁盤的時間等其他?件系統的相關信息。Super Block的信息被破壞,可以說整個?件系統結構就被破壞了
3.3.2?GDT(Group Descriptor Table)
塊組描述符表,描述塊組屬性信息,整個分區分成多個塊組就對應有多少個塊組描述符。每個塊組描述符存儲?個塊組的描述信息,如:在這個塊組中從哪?開始是inode Table,從哪?開始是Data Blocks,空閑的inode和數據塊還有多少個等等。塊組描述符在每個塊組的開頭都有?份拷?。
3.3.3?塊位圖(Block Bitmap)
Block Bitmap中記錄著Data Block中哪個數據塊已經被占?,哪個數據塊沒有被占?利用比特位記錄
3.3.4?inode位圖(Inode Bitmap)
表??個inode是否空閑可?。
利用比特位記錄
3.3.5?i節點表(Inode Table)
存放?件屬性 如 ?件??,所有者,最近修改時間等當前分組所有Inode屬性的集合inode編號以分區為單位,整體劃分,不可跨分區,可以跨組
3.3.6?Data Block
數據區:存放?件內容,也就是?個?個的Block。根據不同的?件類型有以下?種情況:
對于普通?件,?件的數據存儲在數據塊中。對于?錄,該?錄下的所有?件名和?錄名存儲在所在?錄的數據塊中,除了?件名外,ls -l命令看到的其它信息保存在該?件的inode中。Block 號按照分區劃分,不可跨分區
3.4?inode和datablock映射
__le32 i_block[EXT2_N_BLOCKS];
/* Pointers to blocks */ ,
EXT2_N_BLOCKS =15
分區之后的格式化操作,就是對分區進?分組,在每個分組中寫?SB、GDT、Block Bitmap、Inode Bitmap等管理信息,這些管理信息統稱: ?件系統只要知道?件的inode號,就能在指定分區中確定是哪?個分組,進?在哪?個分組確定是哪?個inode拿到inode?件屬性和內容就全部都有了
1. 存儲屬性內核先找到?個空閑的i節點(這?是263466)。內核把?件信息記錄到其中。2. 存儲數據該?件需要存儲在三個磁盤塊,內核找到了三個空閑塊:300,500,800。將內核緩沖區的第?塊數據復制到300,下?塊復制到500,以此類推。3. 記錄分配情況?件內容按順序300,500,800存放。內核在inode上的磁盤分布區記錄了上述塊列表。4. 添加?件名到?錄新的?件名abc。內核將??(263466,abc)添加到?錄?件。?件名和inode之間的對應關系將?件名和?件的內容及屬性連接起來。
3.5??錄與?件名
對于目錄也有inode和數據內容,它的保存方式和文件一樣,對于文件名保存在所屬目錄的數據內容中
訪問?件,必須打開當前?錄,根據?件名,獲得對應的inode號,然后進??件訪問 ,所以,訪問?件必須要知道當前?作?錄,本質是必須能打開當前?作?錄?件,查看?錄?件的內容!
3.6?路徑解析
所以類似"遞歸",需要把路徑中所有的?錄全部解析,出?是"/"根?錄。?實際上,任何?件,都有路徑,訪問?標?件,?如:/home/Azusa/code/test/test/test.c都要從根?錄開始,依次打開每?個?錄,根據?錄名,依次訪問每個?錄下指定的?錄,直到訪問 到test.c。這個過程叫做Linux路徑解析。
訪問?件必須要有?錄+?件名=路徑的原因根?錄固定?件名,inode號,?需查找,系統開機之后就必須知道
路徑誰提供?
訪問?件,都是指令/?具訪問,本質是進程訪問,進程有CWD!進程提供路徑。open?件,提供了路徑?
可是最開始的路徑從哪?來??
本質就是在磁盤?件系統中,新建?錄?件。?新建的任何?件,都在系統指定的?錄下新建,此時就有路徑了系統+??共同構建Linux路徑結構.
3.7?路徑緩存
對于一個文件,每次訪問都要進行路徑解析,而這樣效率很低,因此Linux中OS在進行路徑解析的時候會把歷史訪問的所有目錄形成一顆多叉樹保存,而這個結構struct dentry
每個?件其實都要有對應的dentry結構,包括普通?件。這樣所有被打開的?件,就可以在內存中形成整個樹形結構整個樹形節點也同時會?屬于LRU(Least Recently Used,最近最少使?)結構中,進?節點淘汰整個樹形節點也同時會?屬于Hash,?便快速查找更重要的是,這個樹形結構,整體構成了Linux的路徑緩存結構,打開訪問任何?件,都在先在這棵樹下根據路徑進?查找,找到就返回屬性inode和內容,沒找到就從磁盤加載路徑,添加dentry結構,緩存新路徑

3.8?掛載分區
在上文能夠根據inode號在指定分區找?件了,也已經能根據?錄?件內容,找指定的inode了,怎么找到自己所在的分區?
此時就需要一個特定的目錄來進行關聯,而這個目錄就是就需要掛載才能使用
怎么利用Linux進行掛載這里就不做敘述
3.9 總結圖
4.軟硬連接
4.1 硬鏈接

這兩個鏈接狀態完全相同,他們被稱為指向?件的硬鏈接。內核記錄了這個連接數,inode789401的硬連接數為2。刪除?件時?了兩件事情:1.在?錄中將對應的記錄刪除,2.將硬連接數-1,如果為0,則將對應的磁盤釋放。硬鏈接本質不是一個獨立的文件,因為沒有獨立的inode,其實就是一組新的文件名和目標inode number映射關系,主要的作用就是用來對文件進行備份

4.2 軟鏈接
硬鏈接是通過inode引?另外?個?件,軟鏈接是通過名字引?另外?個?件,但實際上,新的?件和被引?的?件的inode不同,應?常?上可以想象成?個快捷?式

4.3?軟硬連接對?及用途
軟連接是獨??件硬鏈接只是?件名和?標?件inode的映射關系
硬鏈接:?件備份軟連接:類似快捷?式