目錄
📕.什么是inode
📕.目錄
📕.硬鏈接
📕.軟鏈接
📕.什么是inode
當我們創建一個檔案時,我們不對檔案中寫入任何內容,請問該檔案是否占磁盤空間?答案是肯定的,因為檔案中的屬性資訊也占了磁盤空間,
首先我們得認清一個概念:
檔案構成=檔案屬性資訊+檔案里存盤的內容,
檔案屬性:檔案的權限,檔案檔案里存盤的內容的空間大小,檔案的創建時間等等,
在linux中,檔案的屬性和內容是分開存盤的,我們把把存盤檔案屬性資訊的結構稱為inode,inode是任何一個檔案的屬性集合,linux中幾乎每一個檔案都有一個inode,在linux可能存在大量的inode,所以系統就會給inode分配一個編號,這個編號叫做inode編號,
我們通常需要對一個磁盤分成若干個區域,例如我們電腦上的c盤,d盤,e盤等都是磁盤被劃分的區域,每個區域的構成是類似的,只要我們知道其中一個區域怎么劃分,我們就知道其他區域怎么劃分,然后每個區域會分成若干個組,每個組的組成也是類似的,所以我們只要我們了解了磁盤上的一個組,我們就能理解檔案系統,如下:

1.

- 超級區塊(super block):記錄此檔案的系統的整體資訊,包括inode與資料區塊的總量,使用量,剩余量,以及檔案系統的格式與相關資訊等,
- Filesystem Description(檔案系統描述說明):這個區段可以描述每個群組的開始與結束的區塊,以及說明每個區段(超級區塊,對照表,inode對照表,資料區塊)分別介于哪一個區間中,
- inode table:當我們整個塊組里面可能包括多個檔案,在inode table中可以存在多個inode,在inode table中的inode數量一開始就已經被檔案系統給劃分好了,·當我們在塊組里面創建檔案test的時候,首先需要在inode table申請一個inode去記錄該檔案的資訊,
- 資料區塊(data table):資料區塊是用來放置檔案資料的地方,在區塊里面有若干個資料區塊,每個區塊都有自己的編號,以方便的記錄,在etc2檔案系統中所支持的資料區塊大小有1k,2k及4k三種,在格式化時區塊就已經確定了,常見的是4kb,磁區之后,資料區塊的個數是確定的,
當我們要在往test檔案中寫資料的時候,我們要在塊里面寫,假設我們要寫的內容是12kb,我們就需要在其中的三個資料區塊中進行寫資料,然后將在哪三個塊中寫的資料記錄到test的inode結構去里面去,
每個inode里面都有一個陣列,這個陣列是記錄檔案相對應的資料區塊的編號

Block Bitmap中的bit位置代表的是哪一個區塊,內容代表的是是否被占用,
創建一個檔案就需要去某個塊組中的inode table中申請一個inode給給該檔案,并將inode位圖里面中相對應的bit位置為1,表示該inode空間已經被占用了,然后將檔案的屬性資訊寫入到我們的inode里面,
在檔案中寫入1kb資料的程序是去區塊中申請一個資料區塊中,并在塊位圖中將相對應的的bit位置為1,表示該區塊已被占用,然后將資料區塊中,
先將該檔案的在塊位圖中的相關的bit為置為0,然后將inode位圖中相關的bit位置為0,這樣就表示該檔案已經被洗掉,不用清空inode和資料塊中的內容,當另一個檔案創建的時候分配到相對應的inode和資料塊時,再清空inode和資料塊再進行寫資料,當我們要恢復檔案時,我們只要把之前刪掉的檔案中位圖相對應的bit位和塊位圖相對應的bit位給恢復出來即可,這就是為什么檔案中的資料可以被恢復的原因,當我們誤刪了公司某個檔案的時候,不要再創建檔案或者寫資料,我們可以需要上級匯報,也許他可以幫我們恢復資料,
當我們ll -i的時候,最前面的數字代表的時inode編號,一個inode都有一個inode編號,
📕.目錄
檔案我們講完了,在linux中,一切皆檔案,那么目錄也是檔案,
我們該如何理解目錄呢?
我們先創建一個目錄dir1,ll -i發現,目錄也有一個inode編號,

說明創建目錄的時候,檔案系統會給目錄申請一個inode,這個inode也是放目錄的屬性資訊,那么目錄中的內容放的是什么,
目錄:放的是當前目錄下的 檔案名和對應的檔案的inode編號(inode號)

ls lesson20 -i 查看lesson20目錄下檔案名和相對應的inode編號,

所以當我們要查看檔案里面的內容時,我們只需要拿到該檔案的名字,找到該檔案的當前目錄,然后就找到該目錄的inode,在找出相對應的資料區塊,在資料區塊中再通過檔案名和inode映射關系找到該檔案的inode編號,在找到相對應的inode,然后通過inode找到相對應的資料區塊,就可以查看該檔案的內容了,
結論:
1.inode結構中不包括檔案名,包括目錄本身,作業系統不認識什么檔案名,作業系統要找到相對應的檔案的inode,只需要知道inode編號即可,檔案名是放在當前目錄下的內容里,
總結:
創建一個檔案,我們就需要在一個組中的inode table申請一個inode,放該檔案的屬性資訊,然后在inode位圖中相對應的bit位置為1,表示該inode已被占用,然后將inode編號和檔案名放在當前目錄下進行映射起來,
📕.硬鏈接
真正在區分磁盤的不是磁盤的檔案名而是inode,因為一個檔案只有只有一個inode編號,檔案內容是由inode記錄指向的,而檔案名只與目錄有關,在linux下一個inode是可以對應多個檔案名,當我們給檔案創建另外一個名字的方式叫做硬鏈接,
創建硬鏈接的方式:
ln test.c test.1 :給test.c檔案進行硬鏈接,test.1是test.c的別名,test.1和test.c的inode編號是一樣的,說明這兩個檔案是同一個檔案,

一個檔案有幾個名字就有多少次硬鏈接,


所以無論是test.c還是檔案的test.1檔案都可以找到編號為1835850的inode編號的檔案,
我們在洗掉檔案時干了兩件事情: 1. 在目錄中將對應的記錄洗掉, 2. 將硬連接數 -1 ,如果為 0 ,則將對應 的磁盤釋放,
📕.軟鏈接
創建軟連接的方式:

test-s檔案是test.c檔案軟鏈接生成的,我們發現它們兩個的inode的編號是不同的,說明這兩個檔案是不同的,但是我們查看這兩個檔案內容時發現它們的內容時一樣的,
軟鏈接就是建立一個獨立檔案,這個檔案會讓資料的讀取指向它鏈接的那個檔案的檔案名,
軟鏈接就相當于我們windows上給軟體建立快捷方式,

好啦,今天的分享就到這里了,覺得有用的小伙伴們麻煩你們幫我點個贊加關注,謝謝你們~
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/342262.html
標籤:其他
上一篇:位運算---------圖解及代碼演示(gan貨技巧滿滿,適合初學者)
下一篇:最優美的快排代碼

