今天主要介紹一下Linux系統的文件系統,一起來看看吧~
網上看到的一張完整的文件系統圖,如下:
首先,該圖中有Boot Block、Super Block、GDT、Reserver GDT這幾個概念,下面會分别介紹它們。
然後,圖中指明了塊組中每個部分占用的block數量,除了superblock、bmap、imap能确定占用1個block,其他的部分都不能确定占用幾個block。
最後,圖中指明了Superblock、GDT和Reserved GDT是同時出現且不一定存在于每一個塊組中的,也指明了bmap、imap、inode table和data blocks是每個塊組都有的。
即上圖中的Boot Block部分,也稱為boot sector。它位于分區上的第一個塊,占用1024字節,并非所有分區都有這個boot sector,隻有裝了操作系統的主分區和裝了操作系統的邏輯分區才有。裡面存放的也是boot loader,這段boot loader稱為VBR(主分區裝操作系統時)或EBR(擴展分區裝操作系統時),這裡的Boot loader和mbr上的boot loader是存在交錯關系的。開機啟動的時候,首先加載mbr中的bootloader,然後定位到操作系統所在分區的boot serctor上加載此處的boot loader。如果是多系統,加載mbr中的bootloader後會列出操作系統菜單,菜單上的各操作系統指向它們所在分區的boot sector上。
但是,這種方式的操作系統菜單早已經棄之不用了,而是使用grub來管理啟動菜單。盡管如此,在安裝操作系統時,仍然有一步是選擇boot loader安裝位置的步驟。
既然一個文件系統會分多個塊組,那麼文件系統怎麼知道分了多少個塊組呢?每個塊組又有多少block多少inode号等等信息呢?還有,文件系統本身的屬性信息如各種時間戳、block總數量和空閑數量、inode總數量和空閑數量、當前文件系統是否正常、什麼時候需要自檢等等,它們又存儲在哪裡呢?
毫無疑問,這些信息必須要存儲在block中。存儲這些信息占用1024字節,所以也要一個block,這個block稱為超級塊(superblock),它的block号可能為0也可能為1。如果block大小為1K,則引導塊正好占用一個block,這個block号為0,所以superblock的号為1;如果block大小大于1K,則引導塊和超級塊同置在一個block中,這個block号為0。總之superblock的起止位置是第二個1024(1024-2047)字節。
使用df命令讀取的就是每個文件系統的superblock,所以它的統計速度非常快。相反,用du命令查看一個較大目錄的已用空間就非常慢,因為不可避免地要遍曆整個目錄的所有文件。
superblock對于文件系統而言是至關重要的,超級塊丢失或損壞必将導緻文件系統的損壞。
既然文件系統劃分了塊組,那麼每個塊組的信息和屬性元數據又保存在哪裡呢?
ext文件系統每一個塊組信息使用32字節描述,這32個字節稱為塊組描述符,所有塊組的塊組描述符組成塊組描述符表GDT(group descriptor table)。
雖然每個塊組都需要塊組描述符來記錄塊組的信息和屬性元數據,但是不是每個塊組中都存放了塊組描述符。ext文件系統的存儲方式是:将它們組成一個GDT,并将該GDT存放于某些塊組中,存放GDT的塊組和存放superblock和備份superblock的塊相同,也就是說它們是同時出現在某一個塊組中的。讀取時也總是讀取Group0中的塊組描述符表信息。
假如block大小為4KB的文件系統劃分了143個塊組,每個塊組描述符32字節,那麼GDT就需要143*32=4576字節即兩個block來存放。這兩個GDT block中記錄了所有塊組的塊組信息,且存放GDT的塊組中的GDT都是完全相同的。
下圖是一個塊組描述符的信息(通過dumpe2fs獲取)。
保留GDT用于以後擴容文件系統使用,防止擴容後塊組太多,使得塊組描述符超出當前存儲GDT的blocks。保留GDT和GDT總是同時出現,當然也就和superblock同時出現了。
例如前面143個塊組使用了2個block來存放GDT,但是此時第二個block還空餘很多空間,當擴容到一定程度時2個block已經無法再記錄塊組描述符了,這時就需要分配一個或多個Reserved GDT的block來存放超出的塊組描述符。
由于新增加了GDT block,所以應該讓每一個保存GDT的塊組都同時增加這一個GDT block,所以将保留GDT和GDT存放在同一個塊組中可以直接将保留GDT變換為GDT而無需使用低效的複制手段備份到每個存放GDT的塊組。
同理,新增加了GDT需要修改每個塊組中superblock中的文件系統屬性,所以将superblock和Reserved GDT/GDT放在一起又能提升效率。
後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!