1.認識磁盤結構
機械鍵盤是計算機中唯一的機械設備,磁盤是外設,容量大,速度慢,價格便宜
物理結構:
- 磁頭是一面一個,左右擺動,兩個整體移動的,有磁頭停靠點
- 磁頭和盤面不接觸,所以物理上不適用于筆記本,開機狀態移來移去,磁頭刮花了磁盤,屬于硬件問題
- 機械磁盤要在無塵環境下,灰塵落上去可能會把數據都磨沒了
- 所有的數據都在盤片上以二進制存儲,磁頭通過充放電寫入
- 內存掉電易失設備,磁盤永久性存儲介質
- 通過充放電/強弱/波,在磁盤上寫入 01 數據,像吸鐵石的 N S 級
存儲結構:
磁盤被訪問的最小基本單元是扇區--大小約為512字節,塊設備
如何定位一個扇區呢?
CHS尋址:先定位磁頭(header),確定磁頭要訪問哪一個柱面(磁道)(cylinder),定位一個扇區(sector)
邏輯結構:
我們可以把磁帶拉直,形成線性結構
那么磁盤本質上雖然是硬質的,但是邏輯上我們可以把磁盤想象成為卷在?起的磁帶,那么磁盤的邏輯存儲結構我們也可以類似于?
?這樣每?個扇區,就有了?個線性地址(其實就是數組下標)
這種地址叫做LBA(Logical Block Address)
?
假設是兩片四面。盡管扇區大小有差異,但是每個扇區的內存大小都是一樣的。每一面上都有很多扇區,最后就把磁盤抽象成數組 。
有了數組,就可以通過下標找到某個扇區,但是磁盤只認CHS,所以要通過算法將下標轉換成CHS的地址。
找到下標后交給磁盤,磁盤內部會把線性地址轉換成CHS的地址,進而定位到某一個扇區里。
?
注意:一般而言,OS未來和磁盤交互的時候,基本單位為4KB,而不是512字節(一個扇區512字節),因為一次讀512字節太少了,因為要提高效率
所以4KB=8個連續的扇區,系統把這8個連續的扇區稱為塊大小(數據塊)
8個扇區為一個塊,塊號*8 = 每一個塊的第一個扇區的下標,連續往后讀就能知道整個塊的下標
對于OS而言:未來讀取數據就能以塊為單位了,這里的每一個塊號的起始地址稱作LBA (邏輯區塊地址)
LBA和CHS轉化(了解)
從此往后,在磁盤使?者看來,根本就不關?CHS地址,?是直接使?LBA地址,磁盤內部自己
轉換。所以:從現在開始,磁盤就是?個?元素為扇區?的?維數組,數組的下標就是每?個扇區的LBA地址。OS使用磁盤,就可以??個數字訪問磁盤扇區了。
2.文件系統?
引入塊的概念:
其實硬盤是典型的“塊”設備,操作系統讀取硬盤數據的時候,其實是不會?個個扇區地讀取,這樣
效率太低,?是?次性連續讀取多個扇區,即?次性讀取?個”塊”(block)。
硬盤的每個分區是被劃分為?個個的”塊”。?個”塊”的??是由格式化的時候確定的,并且不可
以更改,最常?的是4KB,即連續?個扇區組成?個”塊”。”塊”是?件存取的最?單位。
?理解分區
其實磁盤是可以被分成多個分區(partition)的,以Windows觀點來看,你可能會有?塊磁盤并且將它分區成C,D,E盤。那個C,D,E就是分區。分區從實質上說就是對硬盤的?種格式化。但是Linux的設備都是以?件形式存在,那是怎么分區的呢?
假設磁盤的空間很大,需要分區管理,因此只要能管理好其中一個區,剩下的其他區就可以照搬它的管理方法,全部管理好。(分治思想)
如果這里管理其中一個區,這個區還是太大,就要在這個區里面繼續分組。只要把一個組管理好了,這個區的每一個組就都能管理好了?
磁盤文件系統圖 :
Linux文件系統特點:文件內容和文件屬性 分開存儲
Block Group:文件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組成
超級塊(Super Block):存放文件系統本身的結構信息,描述的是整個分區整體的文件系統的情況
? ? ? ? 1.記錄的信息主要有:
? ? ? ? ? ? ? ? 1.bolck 和 inode的總量
? ? ? ? ? ? ? ? ?2.未使用的block和inode的數量
? ? ? ? ? ? ? ? 3.一個block和inode的大小
? ? ? ? ? ? ? ? 4.近一次掛載的時間
? ? ? ? ? ? ? ? 5.最近一次寫入數據的時間
? ? ? ? ? ? ? ? 6.最近一次檢驗磁盤的時間等其他文件系統的相關信息
? ? ? ? 2.Super Block 的信息被破壞,可以說整個文件系統結構就被破壞了
? ? ? ? 3.超級塊不止一個,可能有多個,在不同的塊組里,這樣可以讓文件系統更穩定
GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用
inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
inode表:存放文件屬性 如 文件大小,所有者,最近修改時間等
數據區:存放文件內容
inode Table里面存的是文件的屬性,Data blocks里面存的是文件的內容
Linux中文件的屬性是一個大小固定的集合體,也就是inode結構體結構體里面沒有文件名。內核層面,每一個inode都有inode number,通過inode號標識一個文件。通過inode號找到inode后,inode里面還有一個數組,可以映射到對應數據塊
?
理解inode
在linux文件系統中,?inode(索引節點)是一個非常重要的概念。每個文件和目錄在Linux文件系統中都有一個對應的?inode?,它包含了除文件名之外的所有元信息(文件屬性)
文件內容與inode
映射
inode
結構中除了有編號屬性外,還有一個屬性,這個屬性是存儲指向data Blocks
中指定數據塊的指針,其有四種分類:
1.12個直接映射指針,每個指針直接指向每一個存儲內容的數據塊,一共可以存儲4kb * 12 = 48kb的數據,對于小文件非常有效
2.一級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲其他塊的索引,此時有4 * 1024 / 4 * 4 * 1024 = 4MB個存儲空間
3.二級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲與一級指針指向的數據塊相同的數據塊,此時有4 * 1024 / 4 * 4 = 4096MB = 4GB個存儲空間
4.三級指針,指向一個數據塊,一個4kb的數據塊中每4個字節存儲與二級指針指向的數據塊相同的數據塊,此時有4 * 1024 / 4 * 4 = 4096GB = 4TB個存儲空間
inode的定義
inode 是文件系統中的一個數據結構,用于存儲文件的元數據(即文件的屬性信息)
每個文件或目錄都有一個唯一的 inode 號,注意:一個文件inode是有可能有多個目錄項的,比如給一個文件創建多個硬鏈接,因此文件 和 inode 不是 一一對應
inode 編號是以分區為單位的,一個分區內 inode 號不能重復,兩個分區間可以,所以 inode 不能跨分區訪問。
inode包含的信息
文件類型:普通文件、目錄、符號鏈接等
權限:文件的讀、寫、執行權限
所有者:文件的所有者和組
時間戳:文件的創建時間、修改時間和訪問時間
文件大小:文件的實際大小
指向數據塊的指針:文件數據在磁盤上的位置
硬鏈接數:指向該inode的目錄項數量
inode的作用
唯一標識: inode 號是文件系統的唯一標識符,即使文件名改變, inode 號也不會改變。
元數據管理: inode 存儲了文件的所有重要元數據,使得文件系統可以高效地管理和檢索文件。
硬鏈接支持:多個目錄項可以指向同一個 inode ,這就是硬鏈接的基礎。
inode與文件名的關系?
文件名實際上是目錄中的一個條目,指向相應的 inode可以有多個文件名(硬鏈接)指向同一個 inode
刪除一個文件名并不會刪除 inode ,只有當所有的硬鏈接都被刪除時,inode 才會被釋放
查看inode信息
可以使用一些命令來查看inode信息:
ls -i:顯示文件和目錄的 inode 號。
stat :顯示文件的詳細信息,包括inode號和其他元數據。
df -i:顯示文件系統的 inode 使用情況。
inode限制?
每個文件系統有一個固定的?inode?數量上限,這在創建文件系統時確定
如果文件系統中的?inode?用盡,即使還有可用的磁盤空間,也無法再創建新的文件或目錄
?
Inode 、Inode Table 、Data Blocks 三者關系
Inode 是一個數據結構,用于存儲文件的元數據(即文件的屬性信息)。每個文件和目錄都有一個唯一的 inode
Inode Table 是文件系統中存儲所有inode 的一個區域。它是一個固定大小的數組,每個 inode 占用固定的大小。作用如下:
????????Inode Table 存儲了文件系統中所有文件和目錄的元數據
????????每個 inode 在 Inode Table 中有一個唯一的編號(inode號)
????????當文件系統創建時,Inode Table 的大小是預先分配好的,這意味著文件系統中可以存儲的文件和目錄數量有一個上限
Data Blocks 是實際存儲文件內容的磁盤空間。文件的數據被分割成多個塊,并存儲在這些數據塊中。作用如下:
????????文件的實際內容存儲在Data Blocks中
????????Inode中的指針指向這些數據塊的位置
????????數據塊的大小通常是固定的,例如4KB或8KB,具體取決于文件系統的配置
三者的關系
????????Inode 存儲文件的元數據,并包含指向數據塊的指針。
????????Inode Table 是存儲所有inode 的區域,每個inode 在其中有一個唯一的編號。
????????Data Blocks 存儲文件的實際內容,通過inode 中的指針來訪問。
?
格式化
操作系統在建立完分區之后就需要對當前分區進行分組,而這個過程也被稱為格式化分區,本質上就是向Group Descriptor Table和Super Block中寫入數據,既然要寫入數據,就需要先獲得到對應的數據,操作系統會根據一定的比率分配inode Table和data blocks,所以整個分區的大小都是固定的,這就會導致出現inode用完,但是data Blocks沒有用完。所以前面說「可以確定起始值是因為組內每一個字段以及大小都是固定的」
需要注意,同時也存在出現inode沒用完,但是data Blocks用完的情況
實際上,如果一個分區不進行格式化,那么這個分區就無法被用戶使用,除了因為制定的分組信息沒有填寫外,還存在沒有給當前分區建立目錄索引的原因。這個原因在接下來的內容中會提及
如何查找文件?
前面提到每一個文件有對應的屬性,而屬性存儲在inode結構中,操作系統為了查找一個文件首先就需要對應文件的inode結構的編號成員,接著根據這個編號減去當前分組的inode Table的起始值就可以算出一個偏移量,在inode Bitmap中根據這個偏移量判斷指定inode編號是否有效,即判斷這個編號在inode中的對應位置是否為1,如果為1,證明指定文件存在。
因為每一個分組的起始值不同,導致inode Table中inode編號的偏移量加上對應的起始值就不會相同,所以就可以解釋為什么inode不會相同
接著在該inode結構中根據數據區指針指向的數據塊在block Bitmap中判斷是否有效,如果有效,就找出對應的文件內容即可
如果現在這個文件非常大,其內容不僅在當前組中存在,也存在于其他組,此時就需要不同組之間的Data Blocks進行連接,所以實際上,Data Blocks在Linux中是可以跨分組的,但是不可以跨分區,因為不同的分區可能使用的文件系統不同
對于其他的「如何刪除文件」、「如何修改文件」以及「如何新增文件」都涉及到「如何查找文件」,所以基本思路都是一致的
對于刪除文件來說,本質上就是先進行查找文件的操作,而刪除的過程就是將對應的inode Bitmap和block Bitmap對應位置置為0,此時就表示指定的文件內容和屬性無效,新的文件或者已有的文件可以使用對應的數據塊
正是因為有上面的刪除機制,所以刪除的文件理論上是可以被恢復的,但是恢復的難度很大
對于修改文件,依舊是先查找文件,再修改文件對應的數據塊的內容即可
對于新增文件,之所以要先查找,是因為需要防止出現文件沖突,如果沒有發生沖突,就需要先在inode Bitmap中申請一塊空間(將指定位置記為1),在根據這個位置加上指定inode Table的起始值就可以找到一個位置存儲inode節點,再將inode節點中的編號屬性賦值即可
文件與目錄
前面提到「如何查找一個文件」是通過獲取到的inode編號,但是現在的問題是,系統如何拿到的inode編號。換句話說,在使用Linux命令行操作時,用戶輸入的文件名或者目錄名都是字符串,系統是如何知道指定文件對應的inode編號的?
在inode結構中不存儲著文件名,但是系統能根據文件名獲取到其對應的inode編號,主要原因是文件所在路徑,為了更好理解下面的內容,先討論目錄文件:
對于底層磁盤硬件來說,不論是目錄還是普通的文件,它們都是由二進制組成,而系統要找到某一個目錄就需要根據當前目錄的所在路徑從根路徑開始解析(根路徑是系統加載時一定會被固定加載的),直到進入到當前目錄的數據塊,而在目錄中的數據塊存儲著當前目錄中所有文件名字符串和其inode編號的映射關系
一般來說,這個映射關系是相互映射的
所以系統獲取一個文件的inode編號只需要根據其所在路徑按照路徑解析進入到其所在目錄找到映射關系就可以獲取到
但是,如果同一個目錄有很多個文件,對每一個文件都進行路徑解析,那么系統整體的效率就會受到影響,為了盡可能提升系統效率,在Linux中還存在一個多叉樹結構dentry,這個結構的根節點就是根路徑,剩下的節點就是按照文件路徑中的目錄構成的一個一個節點。與進程PCB結構一樣,dentry結構也是內存級的結構
有了上面的概念,所以在一個程序中之所以可以使用open打開一個文件本質就是因為進程的CWD給出了當前程序的路徑,即根據這個路徑找到該進程要打開的文件
至此,系統獲取到文件的inode編號的方式就已經基本確定,現在也就可以基本解釋在前面權限部分提到rwx三個權限為什么缺失時目錄會用相應的效果:
缺失r權限,無法讀取目錄中的內容:本質就是無法獲取到目錄中的文件名和inode編號的映射關系
缺失w權限,無法修改目錄中的文件:本質就是無法向目錄的數據塊寫入
缺失x權限,無法進入目錄:本質就是無法進入到目錄的數據塊中