一、磁盤的物理結構
磁盤的物理結構如圖所示:
其中具體的物理存儲結構如下:
磁盤中存儲的基本單位為扇區,一個扇區的大小通常為512字節或4KB,我們這里暫且認為是512字節。一般來說,一個扇區都是512字節,同半徑所有的扇區構成了一圈磁道。
因此,當我們需要讀取指定文件數據時,首先要確定是哪一個盤面,其次再確定是哪一個磁道,最后根據扇區的編號去定位扇區。通過磁頭、柱面(磁道)、扇區來定位扇區的方法稱為CHS定位法。
一個普通文件包括屬性和內容,本質上都是數據,占據一個或多個扇區。我們既然能夠用CHS定位任意一個扇區,就能定位任意多個扇區,從而從硬件角度讀取或寫入文件。
二、磁盤邏輯抽象我們已經知道如果操作系統可以得知CHS的地址,就能夠訪問任意一個扇區。但是由于操作系統是軟件,磁盤是硬件,為了防止硬件發生迭代變化而操作系統也需要隨之變化,就需要做好操作系統與硬件的解耦工作,因此操作系統內部使用的不是CHS的地址。
為了減少進行IO操作的頻率,操作系統與外設進行IO操作的基本單位大小是4KB(可以調整)。即使只需要修改一個字節的數據,也需要把這個數據所在的4KB大小的數據都加載進內存,修改好后再統一寫回磁盤,因此我們把磁盤稱為塊設備。操作系統需要有一套新的地址來進行塊級別的訪問。
把磁盤磁道看作一個連續的空間結構:
扇區就相當于連續的數組,此時定位一個扇區只需要一個數組下標。由于操作系統是以4KB為單位進行IO的,所以一個操作系統級別的文件塊要包括8個扇區。操作系統不關心扇區的概念,計算機常規的訪問地址是通過起始地址和偏移量的方式進行的,因此操作系統訪問數據塊時,只需要知道數據塊的起始地址和4KB就可以了,把數據塊看作一種類型。
三、文件系統由于磁盤很大,為了更加方便的管理,操作系統對磁盤塊進行了分區。分區后再對每一個磁盤區域進行分組。具體結構如下:
在操作系統對磁盤進行分區時,會在最開始的位置設置一個Boot Block,這段區域主要保存與操作系統相關的內容,比如分區表、鏡像地址等。一般而言,這個分區存在于0號盤面的0號磁道的1號扇區。當用戶開機時,操作系統會加載磁盤的驅動,讀取磁盤的分區表,再從特定分區的開始位置讀取到操作系統所在的地址,并加載操作系統,此時操作系統才算真正運行起來。
之后是操作系統對每一個分區進行分組形成的諸多Block group,即塊組。每一個Block group都有上圖所示的6塊區域。
1、Super BlockSuper Block保存的是文件系統的所有屬性信息,包括文件系統的類型、整個分組的情況。記錄的信息主要有:block和inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最后一次寫入數據的時間,最近一次寫入磁盤的時間等其他文件系統的相關信息。
2、Group Descriptor tableGDT為組描述符,保存該組內的詳細統計等屬性信息。比如本組內從哪里到哪里是哪部分內容,本組被使用了多少等。
3、inode Table一般而言,我們把文件內部所有屬性的集合稱為inode節點,一般大小為128字節。一個文件會有一個inode,一個分組內會有大量的文件,也有大量的inode節點,所以在組內會有一個專門的區域來保護這些inode節點,這個區域就稱為inode Table,也叫inode表。
在分組內部,每個inode表都有自己的inode編號,inode編號本身也屬于對應文件的屬性,linux查找一個文件的時候,也是通過inode編號來查找的。
一個inode對應一個文件,該文件的inode屬性和該文件對應的數據塊是有映射關系的。
4、Data Blocks文件的內容是變化的,用數據塊來進行保存。所以要保存一個有效文件的內容,就需要n個數據塊。如果有多個文件就需要多個數據塊。這些數據塊所在的區域就是Data Blocks。一個數據塊的默認大小是4KB。
Linux查找一個文件,首先找到該文件的inode。在inode結構體內部有一個int blocks[NUM]數組,數組內記錄了存儲該文件內容的數據塊的地址。一個分組中,百分之95以上的內容都是Data Blocks。
當操作系統要加載一個文件時,只加載該文件的inode節點。而inode節點中包含該文件內容數據塊的映射關系,想要訪問哪部分內容,就根據映射關系把哪一部分內容加載到內存中。
5、inode Bitmapinode Bitmap是一個位圖結構,每個bit表示一個inode是否空閑可用。
6、Block BitmapBlock Bitmap是一個位圖結構,記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用。
四、Linux下文件系統在Linux中,使用ls命令加上-i選項,就可以觀察到文件的inode:
1、inode與文件名Linux系統只認inode值,且inode屬性中不會包含文件名,因為文件名只是提供給用戶看的
任何一個文件一定存在于目錄中,目錄其實也是一個文件,也有自己的inode值和對應的數據塊,目錄的數據庫塊里保存的是該目錄的文件名和inode值對應的映射關系,而且在目錄內,文件名與inode編號互為key值
inode number在一個分區內唯一有效,不能跨分區使用。根據inode number可以確定該文件在當前分區的哪一個分組。
2、文件的增刪查改2.1、查看文件內容首先要在當前目錄下找到目標文件的inode number。一個目錄也是文件,也隸屬于一個分區,在該分區中通過目標文件的inode number找到分組,在該組的inode Table區域找到目標文件的inode。通過目標文件的inode與對應Data blocks的映射關系,找到該文件的數據塊,加載到操作系統,最后顯示在顯示器上。2.2、刪除文件在當前目錄下,根據文件名找到目標文件的inode number。根據inode number找到目標文件的inode,結合與對應Data blocks的映射關系,把block bitmap對應的比特位設置為0。根據inode number把inode bitmap對應的比特位設置為0。2.3、創建文件操作系統在目錄所處的分組里掃描inode bitmap,找到空余的位置并設置為1,獲得inode number。把該文件創建出來后的默認屬性填充到對應的inode中。在當前所處的目錄文件的Data blocks里追加一條新的文件名與inode number的映射關系。2.4、補充內容>