目錄
一.?磁盤的結(jié)構(gòu)和讀寫數(shù)據(jù)的方式
1.1?磁盤級(jí)文件和內(nèi)存級(jí)文件
1.2?磁盤的物理結(jié)構(gòu)
1.3?訪問磁盤數(shù)據(jù)的方式
二.?磁盤文件系統(tǒng)
2.1?磁盤的分區(qū)管理方法
2.2?文件名和inode的關(guān)系
三.?結(jié)合文件系統(tǒng)對(duì)文件創(chuàng)建和刪除的相關(guān)問題的理解
3.1?文件創(chuàng)建時(shí)操作系統(tǒng)進(jìn)行的工作
3.2?文件刪除時(shí)操作系統(tǒng)進(jìn)行的工作
3.3?查看文件時(shí)操作系統(tǒng)進(jìn)行的工作
3.4?已刪除文件的恢復(fù)問題
四.?總結(jié)
一.?磁盤的結(jié)構(gòu)和讀寫數(shù)據(jù)的方式
1.1?磁盤級(jí)文件和內(nèi)存級(jí)文件
- 內(nèi)存級(jí)文件:被某個(gè)進(jìn)程打開的文件,文件的內(nèi)容被加載到了內(nèi)存。
- 磁盤級(jí)文件:沒有被進(jìn)程打開的文件,存儲(chǔ)在磁盤。
如果設(shè)備斷電,內(nèi)存中的數(shù)據(jù)會(huì)丟失,但是磁盤上存儲(chǔ)的數(shù)據(jù)依舊會(huì)被保存下來。也就是說,磁盤是一種永久性的存儲(chǔ)介質(zhì),永久性的存儲(chǔ)介質(zhì)還有:SSD、光盤、磁帶等。
磁盤,是計(jì)算機(jī)系統(tǒng)中唯一的機(jī)械設(shè)備。
現(xiàn)代筆記本電腦和很多臺(tái)式機(jī),都采用SSD來替代機(jī)械硬盤。SSD,就是我們常說的固態(tài)硬盤,它以固態(tài)電子芯片作為存儲(chǔ)介質(zhì),相對(duì)于磁盤,SSD的讀寫速度更快,成本也較高。大型互聯(lián)網(wǎng)公司的服務(wù)器,一般還是使用磁盤來存儲(chǔ)數(shù)據(jù)。
1.2?磁盤的物理結(jié)構(gòu)
一個(gè)磁盤的主要結(jié)構(gòu)包括:磁盤盤片、磁頭、音圈馬達(dá)、主軸等。磁盤盤片用于存儲(chǔ)數(shù)據(jù),磁頭用于從磁盤中讀取數(shù)據(jù)和向磁盤中寫數(shù)據(jù)。
計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制數(shù)據(jù),也就是0/1,因此,只要能在磁盤盤片上讀寫0/1信號(hào)即可。磁盤盤片上涂有磁性物質(zhì),通過磁頭放電,改變磁盤上磁性物質(zhì)的正負(fù)極,從而實(shí)現(xiàn)數(shù)據(jù)的讀寫。通過磁盤上的正負(fù)極信號(hào),來記錄二進(jìn)制數(shù)據(jù),從而實(shí)現(xiàn)對(duì)數(shù)據(jù)的永久性存儲(chǔ)。

磁盤盤片,根據(jù)區(qū)域劃分原則,可分為如下幾塊區(qū)域:
- 磁道:在一個(gè)磁盤盤片上,距離中心軸半徑相同的環(huán)形面。
- 扇區(qū):一個(gè)磁道中的一段扇形區(qū)域,每塊扇區(qū)所對(duì)應(yīng)的圓周角大小相同。
- 柱面:所有磁盤盤片上,以主軸為中心軸,半徑相同的圓柱面。(一個(gè)磁盤并非只有一個(gè)盤片,而是由許多盤片摞起來的)
一個(gè)扇區(qū),為一個(gè)數(shù)據(jù)存儲(chǔ)的單元。一般一個(gè)扇區(qū)可以存儲(chǔ)512bytes的數(shù)據(jù),也有些磁盤一個(gè)扇區(qū)存儲(chǔ)4KB的數(shù)據(jù),現(xiàn)在的技術(shù)也支持了不同扇區(qū)的容量有所不同。

1.3?訪問磁盤數(shù)據(jù)的方式
如果我們想要訪問某個(gè)特定的數(shù)據(jù),要依次進(jìn)行如下的工作,找到數(shù)據(jù)存儲(chǔ)的位置:
- 確定數(shù)據(jù)存儲(chǔ)在哪個(gè)磁盤盤面(確定對(duì)應(yīng)磁頭)-- Head
- 確定位于那個(gè)磁道(柱面)-- Cylinder
- 確定位于哪個(gè)扇區(qū) -- Sector?
上述尋址方法,被稱為CHS尋址法,?有了CHS,我們就能夠訪問到任意扇區(qū)的數(shù)據(jù)。
我們可以通過磁帶結(jié)構(gòu),來抽象類比磁盤。如圖1.3所示,磁帶被環(huán)形纏繞在一個(gè)柱面上,每層磁帶疊加起來,就好比磁盤的盤片結(jié)構(gòu),磁帶上也存在正負(fù)極來記錄二進(jìn)制信號(hào)。磁帶可以展開為線性結(jié)構(gòu),這個(gè)線性結(jié)構(gòu)就類似于數(shù)組,而我們可以想象將磁盤當(dāng)做磁帶展開,這樣盤形結(jié)構(gòu)就變?yōu)榱藬?shù)組似的線性結(jié)構(gòu)。每個(gè)數(shù)組下標(biāo)位置,就相當(dāng)于一個(gè)磁盤上的扇區(qū),根據(jù)下標(biāo)就可以轉(zhuǎn)換獲取對(duì)應(yīng)的盤面、磁道和扇區(qū)。
假設(shè)存儲(chǔ)空間為1T的磁盤,那么我們就可以假想整個(gè)磁盤的存儲(chǔ)空間就是一個(gè)數(shù)組,而向磁盤的某個(gè)扇區(qū)寫數(shù)據(jù),就等同于向這個(gè)數(shù)組中某個(gè)特定下標(biāo)位置寫數(shù)據(jù)。


二.?磁盤文件系統(tǒng)
2.1?磁盤的分區(qū)管理方法
由于一個(gè)磁盤的存儲(chǔ)空間相對(duì)較大,為了便于管理,一般會(huì)對(duì)磁盤進(jìn)行分區(qū)管理,這就好比我們將電腦的存儲(chǔ)空間分為C盤、D盤、E盤。磁盤的存儲(chǔ)空間,會(huì)被劃分為若干個(gè)Block Group和一個(gè)Boot Block,Boot Block記錄整個(gè)文件系統(tǒng)相關(guān)的屬性信息,如果Boot Block中的數(shù)據(jù)丟失,那么對(duì)整個(gè)文件系統(tǒng)來說將是災(zāi)難性的,因此,在每個(gè)block group中,會(huì)有一塊Super Block,用于備份文件系統(tǒng)的屬性信息。當(dāng)Boot Block中的信息丟失時(shí),OS會(huì)去Block Group中尋找備份信息。
每個(gè)Block Group又可以根據(jù)存儲(chǔ)數(shù)據(jù)的不同,分為這幾個(gè)區(qū)域:Super Block、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data Blocks。在這些分區(qū)里,存儲(chǔ)了文件的數(shù)據(jù)和屬性,以及塊組和文件系統(tǒng)相關(guān)的屬性信息。

每塊Block Group(塊組)內(nèi)部分區(qū)存儲(chǔ)的內(nèi)容為:
- Data Block:數(shù)據(jù)塊,存儲(chǔ)文件的正文內(nèi)容,一般來說,每個(gè)塊組的容量為4KB。
- inode Table:inode表,每個(gè)文件會(huì)分的一塊128bytes的inode空間,用于存儲(chǔ)文件的屬性信息。同時(shí),每個(gè)inode都有與之對(duì)應(yīng)的inode編號(hào),對(duì)應(yīng)于某個(gè)特定的文件,如果拿到文件的inode編號(hào),就可以找到對(duì)應(yīng)的inode模塊,獲取文件的屬性信息。
- inode Bitmap:與inode Table對(duì)應(yīng)的位圖,每個(gè)二進(jìn)制比特位對(duì)應(yīng)一個(gè)inode Table的下標(biāo)位置,0表示該inode Table位置(某個(gè)inode編號(hào))沒有被使用,1表示被使用了。
- Block Bitmap:與Data Block對(duì)應(yīng)的位圖,每個(gè)存儲(chǔ)文件內(nèi)容的Data Block如果被使用了,與之對(duì)應(yīng)的Block Bitmap的二進(jìn)制位就為1,否則為0。
- Group Descriptor Table:塊組描述表,記錄該Block Group(塊組)中,使用了幾個(gè)inode,還剩幾個(gè)inode,使用了幾個(gè)Data Block,還有多少Data Block沒有使用等信息。
- Super Block:記錄整個(gè)文件系統(tǒng)的屬性信息,如果Boot Block或某個(gè)塊組上的Super Block上存儲(chǔ)的信息被破壞,那么其他塊組中的Super Block就存儲(chǔ)了其備份信息,用于OS恢復(fù)文件系統(tǒng)屬性信息。之所以要在多個(gè)塊組保存多份文件系統(tǒng)屬性信息,是因?yàn)槿绻募到y(tǒng)屬性信息被破壞或丟失,那么整個(gè)文件系統(tǒng)就會(huì)崩潰。
在磁盤的每個(gè)塊組上記錄上面的這些信息,讓每個(gè)文件的屬性和內(nèi)容可追溯、可管理。在磁盤中,文件的內(nèi)容和文件的屬性是分開存儲(chǔ)的,文件 =?文件內(nèi)容 +?文件屬性。
一個(gè)Data Block存儲(chǔ)4KB的數(shù)據(jù),磁盤和內(nèi)存進(jìn)行IO操作的基本單位為4KB,但是,一個(gè)扇區(qū)一般存儲(chǔ)512Bytes的數(shù)據(jù),不讓一個(gè)扇區(qū)存儲(chǔ)的數(shù)據(jù)量和磁盤和內(nèi)存進(jìn)行IO操作的基本單位保持一致主要出于以下兩個(gè)方面考慮:(1)如果IO的基本單位太小,那么就會(huì)大幅增加IO的次數(shù),降低計(jì)算機(jī)系統(tǒng)的整體效率。(2)如果讓磁盤扇區(qū)大小和IO基本單位大小一致,那么如果磁盤扇區(qū)大小發(fā)生變化,那么就需要更改OS的源代碼,不讓它們一致,是為了實(shí)現(xiàn)硬件層面和軟件層面的解耦,軟件工程要求高內(nèi)聚低耦合。
2.2?文件名和inode的關(guān)系
存儲(chǔ)在特定塊組中的每個(gè)文件,都會(huì)有一個(gè)獨(dú)立的、與之對(duì)應(yīng)的inode編號(hào),通過這個(gè)inode編號(hào),可以在inode Table中,查找到特定的下標(biāo)位置,以獲取文件的屬性信息。
Linux系統(tǒng)內(nèi)置的ll、stat等獲取文件屬性信息的指令,其底層都是通過拿到文件的inode編號(hào),進(jìn)而在inode Table中獲取文件的屬性信息來實(shí)現(xiàn)的。
那么,文件的內(nèi)容又是怎樣獲取的呢,怎樣知道某個(gè)文件的內(nèi)容存儲(chǔ)在哪個(gè)Data Block中呢?
每個(gè)Data Block,都有一個(gè)特定的編號(hào),每個(gè)文件的inode中,會(huì)記錄有文件對(duì)應(yīng)的Data Block編號(hào),?只需要根據(jù)inode中記錄的Data Block編號(hào),就可以找到與之對(duì)應(yīng)的Data Block,從而找到文件的內(nèi)容。如圖2.2所示,inode中有一個(gè)blocks數(shù)組,記錄存儲(chǔ)這個(gè)文件內(nèi)容的Data Block編號(hào)。
獲取某個(gè)文件的內(nèi)容的流程為:拿到文件的inode編號(hào) ->?找到與之對(duì)應(yīng)的inode ->?找到inode內(nèi)部的Blocks數(shù)組,獲取存儲(chǔ)這個(gè)文件的內(nèi)容Data Blocks ->?訪問Data Blocks獲取文件內(nèi)容。?
那么,如果文件很大,需要龐大數(shù)量的Data Blocks才能放下的時(shí)候,又該怎么辦呢,總不能將這些Data Blocks的編號(hào)全都放到inode中的Blocks數(shù)組中吧? -- Data Blocks中不僅可以存儲(chǔ)文件的具體內(nèi)容,也可以存儲(chǔ)其它的Data Block編號(hào),這個(gè)可以根據(jù)Data Blocks中記錄的其他Data Block編號(hào),找到存儲(chǔ)了具體文件內(nèi)容的Data Blocks。

inode中,并不會(huì)存儲(chǔ)文件的文件名!
提問,如何通過文件名獲取文件對(duì)應(yīng)的inode編號(hào)呢?目錄(文件夾),也屬于文件,有與之對(duì)應(yīng)的inode編號(hào)和Data Blocks,目錄的Data Blocks中存儲(chǔ)該目錄下文件名和inode編號(hào)之間的映射關(guān)系,這就解釋了為什么同一目錄下不允許有同名的文件,因?yàn)槿绻型募?,就無法建立文件名與inode編號(hào)之間準(zhǔn)確的映射關(guān)系。
在某一特定磁盤塊組Data Group中,inode和Data Block的數(shù)量都是固定的。這就解釋了為什么有時(shí)候明明塊組中還有內(nèi)存空間,但卻無法成功創(chuàng)建新文件的現(xiàn)象。這有可能是因?yàn)閕node Table被用完了,但Data Blocks還沒用完,或者Data Blocks被用完了,但是inode Table還沒有被用完。
三.?結(jié)合文件系統(tǒng)對(duì)文件創(chuàng)建和刪除的相關(guān)問題的理解
3.1?文件創(chuàng)建時(shí)操作系統(tǒng)進(jìn)行的工作
遍歷塊組的inode Bitmap,查找一個(gè)還沒有被使用的inode編號(hào),分配給新建的文件 ->?將對(duì)應(yīng)的inode Bitmap的二進(jìn)制為置為1 ->?向inode中寫入文件的屬性信息 ->?為文件分配Data Blocks,記入inode中,并將Block Bitmap中與之對(duì)應(yīng)的二進(jìn)制位置為1 ->?將文件名及其與inode編號(hào)之間的映射關(guān)系寫入到文件所在目錄對(duì)應(yīng)的Data Blocks中。
3.2?文件刪除時(shí)操作系統(tǒng)進(jìn)行的工作
根據(jù)文件名,從文件所在路徑的Data Blocks中獲取該文件的inode編號(hào) ->?根據(jù)inode編號(hào),在inode Tables中,找到與之對(duì)應(yīng)的inode,從inode中獲取該文件占用的Data Blocks編號(hào) ->?將inode Bitmap和Blocks Bitmap中對(duì)應(yīng)的二進(jìn)制位置0 ->?在文件所在的目錄的Data Blocks中,解除文件名和inode編號(hào)的映射關(guān)系。
注意:刪除文件不需要清除Data Blocks中的文件內(nèi)容,只要改變位圖標(biāo)記、解除文件名和inode編號(hào)之間的映射關(guān)系即可。因此,刪除一個(gè)大文件所耗費(fèi)的時(shí)間遠(yuǎn)低于拷貝一個(gè)大文件的時(shí)間。
3.3?查看文件時(shí)操作系統(tǒng)進(jìn)行的工作
根據(jù)文件名拿到與之對(duì)應(yīng)的inode編號(hào) ->?通過inode編號(hào)找到該文件的inode ->?從inode中獲取存儲(chǔ)該文件內(nèi)容的Data Blocks ->?訪問指定的Data Blocks,查看文件內(nèi)容。
3.4?已刪除文件的恢復(fù)問題
當(dāng)用戶刪除一個(gè)文件時(shí),OS會(huì)有記錄相應(yīng)的刪除日志,日志中會(huì)包含文件的inode編號(hào)。由于刪除文件并不會(huì)刪除掉inode Tables和Data Blocks中的內(nèi)容,因此,可以通過已刪除文件的inode編號(hào),獲取存儲(chǔ)文件內(nèi)容的Data Blocks,這樣就可以實(shí)現(xiàn)對(duì)刪除文件的恢復(fù)。
但是,恢復(fù)刪除文件有一個(gè)必要的前提:原來文件所使用的inode Tables和Data Blocks均沒有被覆蓋。如果被覆蓋,那么文件就無法恢復(fù),寫文件、新建文件等各種操作,都有可能造成被刪除文件的inode Tables和Data Blocks被覆蓋,因此,如果誤刪了重要文件,在文件恢復(fù)之前,什么都不應(yīng)該做!
四.?總結(jié)
-
文件根據(jù)是否被進(jìn)程打開,分為內(nèi)存級(jí)文件和磁盤級(jí)文件。
-
磁盤的主要結(jié)構(gòu)有:盤片、磁頭、主軸、音圈馬達(dá)等。數(shù)據(jù)存儲(chǔ)在磁盤盤片上,磁盤盤片被劃分為一個(gè)個(gè)的磁道和扇區(qū),一個(gè)扇區(qū)為一個(gè)磁盤存儲(chǔ)單元。磁盤盤片上涂有磁性物質(zhì),磁性物質(zhì)的正負(fù)極,代表二進(jìn)制數(shù)據(jù)的0和1,磁頭負(fù)責(zé)在磁盤盤片上讀取數(shù)據(jù)和向磁盤寫數(shù)據(jù)。
-
通過CHS法,找到數(shù)據(jù)在磁盤中的盤片、磁道和扇區(qū),就可以獲取對(duì)應(yīng)的數(shù)據(jù)。
-
磁盤中是被分為若干個(gè)塊組進(jìn)行分區(qū)管理的,每個(gè)塊組存儲(chǔ)有文件的屬性信息和文件的內(nèi)容,文件的屬性信息和內(nèi)容是分開存儲(chǔ)的,每個(gè)文件占用一個(gè)inode來存儲(chǔ)屬性信息,占用若干個(gè)Data Blocks存儲(chǔ)文件內(nèi)容。文章來源:http://www.zghlxwxcb.cn/news/detail-566753.html
-
目錄也是文件,與它自己的inode和Data Blocks,目錄的Data Blocks中存有該目錄下文件的文件名和與之對(duì)應(yīng)的inode編號(hào)。文章來源地址http://www.zghlxwxcb.cn/news/detail-566753.html
到了這里,關(guān)于Linux系統(tǒng)編程:文件系統(tǒng)和inode的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!