我們來看一下,關於文件系統的一些知識
首先,我們來看一下磁碟的內部結構:
磁碟是由盤面+讀寫磁頭+主軸+組合臂+磁臂組成,我們忽略機械組件,主要研究讀寫磁頭(讀取和寫入數據)和盤面兩(存儲數據)
然後,我們再來了解一下關於磁碟的一些名詞:
磁軌:我們可以把盤面當成是由無數個大小不一樣的圓圈組成,盤面上一圈一圈的就叫磁軌
柱面:所有的盤面上同一位置的磁軌會形成一個圓柱體,我們把它叫做柱面
扇區:每個磁軌上面,可以分成一個一個的扇區,扇區是存儲數據的最小單元
之後,我們來看一下磁碟是如何工作的:
旋轉:磁碟運行的時候,是由主軸帶著盤面飛速旋轉,轉速越快的磁碟,讀寫的速度就會越快
尋道時間:當我們從磁碟上讀數據的時候,我們會告訴磁頭,我要取x盤面y磁軌z扇區上面的數據(或者叫x柱面y磁頭z扇區),然後對應的磁頭就會指到該磁軌上面,我們把這個過程叫做」尋道時間」
旋轉時間:磁頭找到該磁軌以後,再由主軸帶動旋轉道對應的扇面,我們把這個過程叫做」旋轉時間「
讀取時間:所有磁碟讀取數據的時間就是尋道時間加旋轉時間
下面,我們再來看一下什麼是」塊「:
為了使我們告知磁碟去尋找磁碟位置的時候更加方便,我們發明了LBA(Logical Block Address)的定址方式,把磁碟邏輯上分成一個個」塊「,給這些塊依次編號,比如:1、2、3…,n;我們在尋找磁碟位置的時候,只需要把」塊「的編號告訴磁碟,然後磁碟會在內部將」塊「編號轉換成盤面+磁軌+扇區來讀取寫入數據,格式化的過程就是將磁碟進行分」塊「
接下來,我們來看一下扇區和塊之間的關係:
扇區是磁碟存儲數據的最小單位,磁碟本身並沒有塊的概念,我們可以把塊看成是邏輯上的磁碟單位,不同的文件系統中,塊的大小是不同的
在linux系統中,我們通過下面的命令,可以查看扇區的大小:fdisk -l | grep Sector, 查看塊的大小:tune2fs -l /dev/vda1 | grep “Block size”,ext4文件系統中,block的大小是4096byte(4k),則一個block包含8個扇區
下面,我們來思考一下,當我們想存一張48k大小的照片,流程會是什麼樣的呢:
有一種方法是這樣的:
我們命令硬碟 ,我需要12個塊來存數據,你把塊的編號返回我,之後磁碟返回空閑塊的編號給我,分別是3,9,11,24,33…,我們根據磁碟返回給我們的編號,將數據存入磁碟,然後記下這些塊的編號,以便在下次需要讀取圖片的時候使用
用這個方法,一兩條數據還好,要是成千上萬條,那還不崩潰了。
實際上我們現在使用的方法是這個樣子的:
找到一個目錄,然後把圖片放進去就可以了,就這麼方便,我們下一次讀取的時候,只需要記住文件的目錄和文件名就好了,剩下的工作就交給作業系統來完成了,作業系統在這個過程中,都做了哪些事情呢
我們接著來看,當我們讀取寫入文件的時候,作業系統幫我做了哪些事情呢:
我們創建一個文件以後,作業系統記錄文件對應的塊編號,比如文件img.jpg佔據磁碟塊1~12,但是作業系統具體是如何管理文件對應的塊的呢,它也想了很多辦法。
方法一:採用連續的塊來存儲文件,這樣做的好處是,訪問文件的效率會很好,但是不連續的塊無法使用,會造成磁碟嚴重的浪費。
方法二:採用鏈式的方法存儲文件,文件從第一塊磁碟開始,形成一條鏈,這樣就解決了磁碟浪費的情況,但是讀取的效率又慢了很多。
方法三:專門在磁碟中劃分出一些特殊的磁碟塊,這些塊不存儲真實的數據,專門存放文件對應的存放數據塊的編號,我們把這樣的磁碟塊叫做inode索引塊,這樣,當我們讀取文件的時候,先去inode索引塊中查找對應的數據塊,然後再去取數據。這個方法是不是好了很多呢
我們接受了方法三的方式,那麼我們來看一下inode節點裡面都放了些什麼東西:
每一個文件都對應了一個inode塊:inode塊裡面不僅存儲了真實數據存放的數據塊的編號,還記錄了文件的許可權,所有者,創建時間等等資訊。
接下來,我們來看一下inode塊可能會帶來什麼問題:
我們來舉個栗子:假設我們的inode的大小是4096byte,存放非數據塊資訊用掉了512byte,剩下的3584byte可以用來存放數據塊對應的資訊,每個數據塊編號的存儲需要32byte,也就是這個inode可以存儲3584/32=112個編號,及112個數據塊,112個數據塊可以存放112*4096byte大小的數據,但是文件大小要是超出這個大小怎麼辦呢,那inode豈不是放不下這些資訊了嗎
針對上面的問題,我們來看一下什麼是間接塊:
間接塊的誕生,就是解決大文件的inode問題,如下圖,我們使用一個位置,來記錄指向另一個存放文件資訊的塊,這個叫做一次間接塊,還可以以同樣的方式做出二次、三次間接塊,這樣就解決了大文件存儲的問題。
知道了文件的索引塊,我們來看一下目錄的inode索引塊:
目錄同樣有inode索引塊,但是目錄裡面指向的磁碟塊裡面存放的是子目錄和文件對應的文件inode索引塊的編號。
我們來看一個例子,如果我們要查看/tmp/test.log文件流程是什麼樣的呢:
首先我們找到/目錄的inode—找到/目錄磁碟塊—找到tmp目錄inode—-找到tmp磁碟塊—找到test.log的inode—找到對應的數據塊
我們來看一下,如果要刪除/tmp/test.log,我們需要做些什麼呢:
在目錄的磁碟塊中刪除文件指向記錄,刪除test.log的inode,刪除數據盤中的數據
下面,我們來看一下文件時如何管理空閑塊的:
我們在寫入數據的時候需要知道哪些塊時空閑可用的,怎麼樣來管理這些空閑的塊呢,點陣圖法出來了,我們找一個塊,每一位都代表一個塊編號,1表示使用,0表示空閑。
接下來,我們來看一下ext2文件系統對磁碟的布局組成:
MBR:主要由引導程式碼和磁碟分區表組成,分區表裡面記錄的每個分區的起始位置和結束位置
塊組:每個分區又會被分成多個快組,快組的結構都是一樣的,由超級塊、快組描述、塊點陣圖、inode點陣圖、inode塊、數據塊組成
超級塊:超級塊裡面存著快組的一些資訊,如:磁碟的塊數、每個磁碟塊的大小、空閑的inode和磁碟塊個數等
磁碟塊點陣圖、inode點陣圖、inode塊、數據塊這些不用介紹我們也知道是幹什麼的了。
至此,整個文件系統初略的架構我們大致就梳理清楚了。