前言:
我們前幾篇文章講了緩沖區與重定向的有關概念,這些設計是linux系統的核心機制,對系統性能、資源管理和用戶操作靈活性有重要意義。
不涉及一些硬件就不可能讓大家清楚地去理解文件系統,所以這篇文章,我將會從計算機組成原理的角度,為大家講解一下文件系統的構成。
文件被打開了,是存儲到內存里的。那么文件沒有被打開呢?存儲到哪里?
自然是磁盤里。
我們訪問一個文件的前提是不是要打開它?那我們訪問文件的前提是要找到它,也就是說我們要有對應的路徑。
但那么多文件,不只是你一個文件有路徑,所有文件都要有路徑。眾多路徑需要被管理起來,所以就出現了文件系統的概念:
磁盤級文件系統與內存級文件系統。
如同我們去取快遞一樣,快遞就好比一個一個的文件,放在菜鳥驛站的快遞柜上,我們需要根據快遞的編號,找到對應的存放位置,最后取回到我們的宿舍(內存中)。
文件系統又是如何把未打開的文件,在磁盤上管理起來的呢?
我們又如何去理解路徑呢?
別著急,我將為大家一一解答。
一、磁盤
像這些機械磁盤,是計算機中唯一一個機械設備。圖左是一個機械硬盤,圖右是機械硬盤拆開后的樣子。
圖示為一個服務器,里面嵌入了許多個磁盤,而服務器是計算資源的載體,安裝在機柜內 :
圖為一個一個的機柜,機房就是存儲這些機柜的地方。
不同于我們的其他存儲設備,機械磁盤的好處就是容量大,便宜。但它的讀取速度就比較慢。
公司里有大量平時用不到的數據,你不可能用其他昂貴的設備來進行存儲,自然需要用到機房。
而磁盤是怎么進行存儲數據的呢?
我們知道,磁鐵是有著南極與北極的,同樣的,二進制劃分為0,1.
所以,我們就規定南極與北極各自代表0或1。這樣,就方便了我們進行二進制數據的存儲。
所以我們如何銷毀一個磁盤呢?
自然就是對該磁盤進行消磁處理。
一個磁盤的結構如下圖所示:
?
?
?我們的機械臂桿上有著多個讀寫磁頭,分別近距離挨著每個盤片的上下兩個面。比如上圖我們就有著6個讀寫磁頭,以及6個面,二者的數量是相同的。如果我們在讀寫一個磁頭,實際上就是在讀寫一個磁面。注意,磁頭與磁盤之間并沒有實際接觸,就像是一架飛機貼地1m處飛行一樣。
每個面上,存在著包圍著中心的,不同大小的環道,我們稱之為磁道,而每個磁道上,我們劃分了一定區域,每個區域叫做扇區。
有個疑問,我們這上面有不同的扇區,他們的長短是不一樣,那么存儲大小呢?
在早期的磁盤中,是一樣的,但現在的技術已經能做到同質度的存儲數據了,也就是說扇區越大,存儲的數據越多。
?扇區,是磁盤存儲數據的基本單位,通常,一個扇區的大小為512字節。
如果我想修改一個扇區的一個比特位,也要把512字節全部讀取到內存才行,所以我們稱磁盤為快設備。
那我們如何定位一個扇區呢?
?
以上3步,被我們稱為CHS地址定位法。(但現在大部分已經淘汰了,我們講這個只是為了幫助大家理解)

?我們可以通過以上的命令查看我們云服務器的磁盤分區
這是一個?50GB的虛擬磁盤(GPT分區表),包含:
-
1MB的BIOS引導分區(兼容傳統啟動)。
-
50GB的Linux主分區(實際可用空間)。
?
二、磁帶
我們以前也有磁帶這種存儲設備。
?磁帶上?可以存儲數據,我們可以把磁帶“拉直”,形成線性的結構:
?
這樣每?個扇區,就有了?個線性地址(其實就是數組下標),這種地址叫做LBA地址定位法。?
?
由于我們前面說到,傳動臂上的磁頭是共進退的。
所以,我們可以把每個盤面上,相同半徑大小的磁道,組成一個柱面?
所以,磁盤物理上分了很多?,但是在我們看來,邏輯上,磁盤整體是由“柱?”卷起來的。?
因此,把一個磁道展開,我們可以看做是一個一維數組,隨后一個柱面上有多個磁道,我們可以看做柱面為二維的扇區數組。多個柱面盤旋起來形成磁盤,所以磁盤可以看作是扇區的三維數組?

?三、塊
如果我們進行IO操作,是以扇區512字節為單位,未免就太少了。
所以我們可以把一定數量的扇區,劃分為一個塊。一個塊的數據大小為4kb,也就是八個扇區。
而這些塊,我們也可以進行編號,比如說,塊1,塊2,塊3.
所以磁盤就劃分為了以塊為單位的一維數組。
假如我們磁盤中有500GB的存儲空間,我們應該如何進行管理呢?
答案是,我們會把這500GB的空間換劃分為一個一個的的分區。
就像是大家電腦上的C盤,E盤,D盤。
?
從linux系統看,我的這個就劃分為了2個區域。一個分區掛掉了不會影響其他分區,這一切都是為了磁盤的?靈活性、安全性、性能優化和兼容性。
這也體現了分治的思想。我們只需要管理好一個分區,隨后把這個分區的管理方法復制到其他分區進行管理就行了。?
那我們該如何管理好一個分區呢?
這里就要開始引入我們的文件系統的概念了。
?四、EXT2文件系統?
1、分區

這里獨立于分區外的是Boot Block,通常記錄的是啟動的相關設置。
而一個分區內通常會存儲以上信息: Data blocks,inode Table ,inode Bitmap等。
2、inode?
我們知道,一個文件=屬性+數據
那么一個文件的屬性信息,其實也是一種數據,我們把這個屬性信息以結構體的方式構建出來。
這個結構體我們就把它叫做inode。(所以inode,是文件屬性的集合)
通常來說,一個文件就對應著這一個inode。
一個inode的大小通常為128字節,當然也有256字節的情況,我們在這里不討論256字節的inode。
操作系統與磁盤進行IO交互時基本單位是4KB,所以一個塊就有4kb/128字節個inode。
每個inode都有自己的編號:
我們在ls指令后面跟上-i選項就可以查看每個文件的inode的隊友編號:
?前面的920502就是inode編號,而每個文件直接的inode編號互不重復。
值得注意的是,在linux中,文件名這個屬性并不保存在inode中。
inode table對應這個組里的所有文件屬性集。如果我們有一萬個文件,inode table中會要占用多少塊呢?
:10000*128/4/1024個
既然文件的屬性已經被保存起來了,那么文件的內容呢?
答案是保存在Data Blocks中,所以我們可以知道,在linux下,文件的屬性與內容是分開存儲的
?在inode結構中,還有一個數組:int blocks[NUM],用于存儲文件數據塊的地址。這個數組直接決定了如何找到文件的實際內容。
blocks[NUM]存儲的是文件內容所在的?磁盤塊號,通過這些號碼可以在磁盤上定位文件的具體數據。
由于時間的原因,本篇文章就暫時寫到這里,后面的內容,我會在下一篇文章中為大家詳細介紹inode等信息。
結語:
文件系統上怎么知道一個一共有多少inode,還有多少inode沒使用這些信息的呢?
下一篇文章再來談文件系統的塊號如何理解,inode的值是怎么來?為什么找文件只需要通過inode就行了這些內容。
本篇文章介紹了大量概念,希望同學們能夠進行一定程度的記憶。
如果有任何疑問與指正,歡迎評論區或者私信留言!!