目錄
1.文件系統
1.1 磁盤物理存儲結構
1.2 磁盤邏輯存儲結構
1.3 inode編號
2. 軟硬鏈接
2.1 軟鏈接
2.2 硬鏈接
2.3 目錄文件的軟硬鏈接
1.文件系統
在一臺電腦中,大部分文件都不是被打開的,這些文件都在磁盤中進行保存。已經打開的文件需要管理,沒有被打開的文件同樣需要管理,所以需要文件系統。
1.1 磁盤物理存儲結構
磁盤是一種用于存儲數據的硬件設備,通常分為機械硬盤(HDD)和固態硬盤(SSD)兩大類。機械硬盤通過旋轉的磁性盤片和磁頭讀寫數據,而固態硬盤則使用閃存芯片,沒有機械部件。因為大容量磁盤比較便宜,大型公司還是使用磁盤,我們這里講解一下磁盤的結構。
磁盤的主要組成部分:
- 盤片(Platter):表面覆蓋磁性材料的圓形金屬片
- 磁頭(Head):讀寫數據的電磁組件
- 磁道(Track):盤片上的同心圓環
- 扇區(Sector):磁道的最小存儲單元(通常512字節或4K)
- 柱面(Cylinder):所有盤片同一磁道組成的立體結構
一個盤面可以有很多個同心磁道,一圈磁道可以有很多扇區,扇區是磁盤最小的存儲單元。
如果我們想向一個扇區寫入,我們尋址的過程是這樣的:
- 確定盤面
- 確定磁盤
- 確定扇區
1.2 磁盤邏輯存儲結構
我們把磁盤抽象成連續的線性空間。
那我們如何尋找一個扇區呢,我們可以給每個扇區編號,比如1~100000第一面,100001~200000第二面,對磁盤的管理就變成了對數組的管理。
操作系統中,可以按照扇區為單位進行存取,也可以基于文件系統,按照文件塊為單位進行存取。一個文件塊可以有多個扇區組成,這樣可以更好的應用空間局部性原理,就可以理解為什么說磁盤是塊設備了,即按照塊的大小從磁盤中讀取數據。
1.3 inode編號
文件系統時如何實現并找到我們的文件的呢?文件系統為每個文件分配一個inode編號,通過inode編號進行查找。
Linux ext2文件系統,上圖為磁盤文件系統圖(內核內存映像肯定有所不同),磁盤是典型的塊設備,硬盤分區被劃分為一個個的block。一個block的大小是由格式化的時候確定的,并且不可以更改。例如mke2fs的-b選項可以設定block大小為1024、2048或4096字節。而上圖中啟動塊(Boot Block)的大小是確定的,
- Block Group:ext2文件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組成。
- Datablocks:數據區存放文件內容。
- inode Table(inode表):struct inode inode_table[N]
inode Table中有很多inode結構體,一般情況下一個文件一個inode,且在整個分區具有唯一性。不同分區可以裝不同的操作系統。
struct inode
{大小,權限,擁有者,所屬組,修改時間,inode編號,引用計數;int blocks[N];
}
inode存放文件的屬性信息,Data blocks中存放文件的內容。其中inode編號不同表示不同文件,其中 block[N] 表示所用塊的下標,N一般不會太大,比如N是15時,0~10使用直接映射,11~12使用二級映射,13~14使用三級映射,可以跨組存儲。
- inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
- 塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用。一個比特位表示一個塊。
- GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息,有興趣的同學可以深入了解。
- 超級塊(Super Block):存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞。超級塊不是每個塊組都有,一般只有3~4個塊組有。
用戶使用操作系統時使用的是文件名,而內核只使用inode編號,所有我們的目錄文件中存儲的就是該目錄下文件與inode編號的映射。
inode編號同一分區內唯一,不同分區inode編號可以相同,那么操作系統如何判斷相同inode編號的文件在那個分區的呢?
- 訪問文件時都是需要知道該文件的目錄,不同目錄創建時會通過掛載知道屬于哪個分區。
2. 軟硬鏈接
通過 ln -s 指令可以為文件建立軟鏈接,不加 s 為文件建立硬鏈接。
ln -s 文件名 鏈接名
2.1 軟鏈接
為log建立軟連接,通過 ls -l -i? 可以看到文件第一個屬性是inode編號。
ln -s log log.soft.link
可以看到文件和其軟鏈接inode編號不同,可以判斷出這是兩個不同的文件,軟鏈接是一個獨立的文件。軟鏈接內容是指向目標文件的路徑,類似于windows的快捷方式。
軟鏈接的文件屬性是 l,說明是鏈接文件。
2.2 硬鏈接
為hello文件創立一個硬鏈接。
ln hello hello.hard.link
可以看到普通文件與其硬鏈接inode編號相同,硬鏈接不是一個獨立的文件,且文件屬性是 - ,普通文件。
那硬鏈接是什么呢?硬鏈接是在指定的的目錄內部添加一組映射關系(文件名<-> inode編號)。inode編號相同,訪問磁盤時也是訪問相同的inode。
第三個屬性就是該文件的硬鏈接數,當一個文件的硬鏈接數是0時,該文件才算是真正地被刪除。在文件系統層面,inode內部有引用計數,表明有幾個文件名與inode編號有映射關系。
2.3 目錄文件的軟硬鏈接
創建一個新文件和一個新目錄
mkdir newdir
touch newfile
可以發現新普通文件的硬連接數時1,而新目錄的硬連接數是2。我們可以通過 ls -a,可以看到 . 和 .. 兩個隱藏目錄文件,. 代表當前目錄,.. 代表上一級目錄。本級的 newdir?和 newdir 中的 .?都指向該目錄,所以新建目錄的硬連接數是2,當 newdir 中每新建一個目錄,newdir 的硬鏈接數都會加1,因為在 newdir 中新建的目錄中都有 .. 指向 newdir 。
. 與 .. 都屬于目錄的硬鏈接,但是用戶是不能給目錄文件建立硬鏈接。因為在執行一些查找命令時會通過目錄查找,會陷入循環,且硬鏈接文件是普通文件,可能繞過權限檢查,當然還存在其他等等問題。
用戶是可以為目錄建立軟鏈接的,因為軟鏈接可以通過文件屬性 l 分辨出。
本篇結束!