磁盤的空間管理
如何對磁盤空間進行管理?
假設在一塊大小為500G的磁盤中,500*1024*1024=524288000KB。在磁盤中,扇區是磁盤的基本單位(一般大小為512byte),而文件系統訪問磁盤的基本單位是4KB,因此500G就被分成了131072000個扇區,將這些扇區看作為數組。而如果對這500GB進行分盤(C盤50G,D盤100G等),因此對500G磁盤的管理也就是對分的C盤50G,D盤100G的管理,相同,對于C盤50G的管理又被分化成對C盤中5個10G的管理。因此只要管理好局部,就能管理好整體,將整體細化成小等份進行管理即可(如下圖)。
在Linux中,文件由數據與屬性組成,這里數據內容存儲在block(一般是4KB)中,屬性存放在inode(磁盤上的另一塊空間,一般是128字節)中,因此一個扇區(512字節)可以存儲4個inode。但是內容可以增多或減少,而屬性是不變的。
- Date blocks:里面包含許多Data Block,并且占磁盤的絕大部分空間,每一個Data Block大小是4KB。Data Blocks的作用是以塊(這里的塊就是Data Block)為單位,對文件內容進行保存,OS將文件每4KB分為一塊進行保存,不夠4KB也按照4KB保存。
- inode table:里面包含大量的inode空間(每個inode大小為128字節),用于保存文件屬性。這里的inode可以理解成一個結構體(struct inode,其中保存著對應文件的Data Block編號,這使得Data Blocks與inode進行相互關聯),結構體內部包含文件屬性(所有者,權限等),并且以二進制的形式將實例化對象(struct inode i)寫到inode空間里面。一般而言,一個文件有一個inode編號,以保證文件的唯一性。
- Block Bitmap:意思是位圖,用于判斷Data Blocks上的空間是否被占用。通過比特位上的數據來判斷數據塊中哪些空間被使用,哪些空間沒被使用(0000 0000表示空空間都沒有被使用,0000 1010表示1號位和3號位空間被使用)。
- Inode Bitmap:用于判斷inode哪些空間被占,哪些空間沒有被使用。
- Group Descriptor Table:簡稱GDT,塊組描述符,用于描述inode表和數據塊的起始位置。
- Super Block:用于記錄存放文件系統本身的信息,記錄Data Block和inode Block中的使用量以及未使用量等。并不是每個Block Group都含有Super Block,Super Block存在的意義是如果Super Block出現損壞可以通過其他Super Block對文件進行恢復。
注意:文件名也是文件的屬性,但是在Linux中,并沒有文件名的概念,而是通過inode對應的Data Block編號來識別文件的,因此要找到文件,就必須找到該文件對應inode編號,找到inode編號就能找到文件的Data Blocks,從而找到文件內容。那么如何找到inode呢?
我們知道,目錄其實也是文件,是文件就具有文件內容和屬性,這里目錄的文件內容其實就是文件與目錄的inode編號的映射關系。當我們在某一個目錄下創建一個文件的時候,OS會根據當前目錄下的Inode Bitmap找到未使用空間,將創建的文件的屬性寫入到該未使用的inode上,然后再根據Block Bitmap找打未使用的Data Block,然后填寫數據到Data Block上,最后返回該文件的inode。最后返回的inode編號找到該文件所處的目錄,根據目錄的inode找到目錄的Data Block,然后將文件名與inode的映射關系寫入到目錄的Data Block中。(這就是為什么inode中不保存文件名,因為文件名在目錄中)
當刪除一個文件的時候,根據目錄的inode和要刪除的文件名,找到目錄的Data Block,根據文件名的映射關系找到文件的inode,再根據要刪除文件的inode找到該文件的BlockGroup,將要刪除文件的inode Bitmap和Block Bitmap的位圖上的標志位由1置為0,最后取消該文件與目錄的映射關系。
軟連接與硬連接
軟連接:
如上圖,在/home/101-asy/linux/2024-12-06/d1/d2/d3目錄下編譯成的可執行文件mytest1,如果在/home/101-asy/linux/2024-12-06下執行需要帶該文件的路徑:?./d1/d2/d3/mytest1;但是如果使用軟連接的方式:ln -s ./d1/d2/d3/mytest1 mytest1.s在/home/101-asy/linux/2024-12-06目錄下生成一個軟連接的可執行文件mytest1.s。這個軟連接可以理解成快捷鍵。
如上圖,軟連接的文件與源文件的inode不同(因此軟連接文件是一個獨立的文件,也要進行分配inode,填寫屬性Data block,映射等操作),并且軟連接文件的內容其實是源文件的所在路徑。
硬連接:
創建的硬鏈接文件與原文件的inode相同,所謂的硬連接就是在當前目錄下,給指定的文件新增文件名和inode編號的映射關系。
硬連接數是指向同一inode文件的數量,用于標識有多少個文件指向當前inode文件。
為什么創建的文件默認硬連接數是1呢???而文件夾又是2呢???
如上圖,我們知道硬連接數表示有幾個文件名指向該文件。當創建file文件時,file文件本身就指向了該文件,因此file文件本省就是一個硬連接數。而對于文件夾來說除了文件夾名本身外其內部還有一些文件:
以目錄d4為例,d4的硬連接數為3,分別為d4文件名本身指向d4,d4目錄下的.文件指向d4,以及d5目錄下的..文件指向d4。