目錄
??前言??
?? 硬盤
??? 物理結(jié)構(gòu)
??? 存儲結(jié)構(gòu)
??? CHS定址法
??? 操作系統(tǒng)對硬盤的管理和抽象
?? 文件系統(tǒng)
??? 分區(qū)
??? 分組
??? inode號
?分配
??? 逆向路徑解析
分區(qū)掛載
目錄作用
?? 總結(jié)
??前言??
? ? ? ? 歡迎收看本期【Linux雜貨鋪】內(nèi)容,本期主要講解文件系統(tǒng)的概念,其中我們會(huì)先講解什么是硬盤,硬盤的物理和邏輯結(jié)構(gòu)分別是什么樣子,最后會(huì)講解操作系統(tǒng)是如何通過文件系統(tǒng)管理硬盤的。
????????
?? 硬盤
??? 物理結(jié)構(gòu)
? ? ? ? 硬盤也叫做磁盤,中間有一個(gè)盤面,盤面是可讀可寫可擦除的一個(gè)設(shè)備,每一個(gè)盤面都有一個(gè)磁頭。盤面會(huì)進(jìn)行高速旋轉(zhuǎn),磁頭在馬達(dá)和永磁鐵的作用下,會(huì)左右擺動(dòng),通過電磁感應(yīng)等方式,將0,1這樣的數(shù)據(jù)存儲在硬盤上。
? ? ? ? 所以硬盤本質(zhì)上是一個(gè)機(jī)械設(shè)備。
??? 存儲結(jié)構(gòu)
? ? ? ? 硬盤讀寫的基本單位就是:扇區(qū)(512 B 或者 4 KB)。
? ? ? ? 通過上圖得出結(jié)論: 1片 = n個(gè)磁道(柱面) ; n個(gè)磁道(柱面)= m個(gè)扇區(qū)
??? CHS定址法
????????了解了磁盤上有盤片,柱面和扇區(qū)后,扇區(qū)就是磁盤讀寫的基本單位,想要找到數(shù)據(jù),就要找到指定盤片上指定柱面上的指定扇區(qū),這就是CHS定址法。
? ? ? ? 1. 找到指定的磁頭(Header)
? ? ? ? 2. 找到指定的磁道/柱面(Cylinder)
? ? ? ? 3. 找到指定的扇區(qū)(Sector)
? ? ? ? 所以得出結(jié)論,盤片為什么要告訴旋轉(zhuǎn)?定位指定扇區(qū)。磁頭為什么要左右擺動(dòng)?定位指定的磁道
??? 操作系統(tǒng)對硬盤的管理和抽象
? ? ? ? 如果OS直接使用CHS,耦合度太高(硬件改變,影響軟件,軟件也要改變),同時(shí)也為了方便實(shí)現(xiàn)內(nèi)核進(jìn)行磁盤管理,所以需要進(jìn)行邏輯抽象。OS和磁盤進(jìn)行交互的時(shí)候,基本單位是4KB(8個(gè)連續(xù)的Sector)。
? ? ? ? 我們將一個(gè)個(gè)圓的磁盤抽象成一個(gè)巨大的數(shù)組,每一個(gè)元素就是一個(gè)sector,我們就會(huì)有一個(gè)扇區(qū)數(shù)組 sector disk_array[N]。
? ? ? ? 有了數(shù)組,天然的就會(huì)有下標(biāo)index,我們就可以使用下標(biāo),通過某種算法,轉(zhuǎn)換為CHS地址,這樣就進(jìn)行了解耦。
? ? ? ? 舉個(gè)例子,我們有個(gè)硬盤,每個(gè)面有1000個(gè)扇區(qū),10個(gè)磁道,即每1個(gè)磁道有100個(gè)扇區(qū)。
? ? ? ? index / 1000 = H
? ? ? ? index % 1000 = temp [0 , 999]
? ? ? ? temp / 100 = C
? ? ? ? temp % 100 = S
? ? ? ? 我們先確定在哪個(gè)盤面,在確定在哪個(gè)柱面,最終定位到在哪個(gè)扇區(qū)。
? ? ? ? OS每次操作只能是512B的話,效率太低。所以一般而言,磁盤訪問的基本單位是512B,OS與磁盤交互的基本單位是4KB(8 * sector)。一次I/O讀取更多數(shù)據(jù),提高了效率。
? ? ? ? 8個(gè)連續(xù)的扇區(qū),就稱作數(shù)據(jù)塊。每一個(gè)塊都有一個(gè)塊號,我們通過 塊號 * 8 = index ,就能將塊號轉(zhuǎn)為sector數(shù)組下標(biāo),得到扇區(qū)的下標(biāo)就能轉(zhuǎn)為CHS地址。
? ? ? ? 所以對OS而言,讀取數(shù)據(jù),就以塊為單位。
? ? ? ? 所以我們只要知道了硬盤大小,就能知道有多少個(gè)塊,每個(gè)塊的塊號也就有了,知道了起始塊的塊號,連續(xù)的讀8個(gè)sector下標(biāo),就能轉(zhuǎn)換為對應(yīng)的多個(gè)CHS地址。
? ? ? ? 這就是LBA(邏輯區(qū)塊地址)。LBA可以意指某個(gè)數(shù)據(jù)區(qū)塊的地址或是某個(gè)地址所指向的數(shù)據(jù)區(qū)塊。
? ? ? ? 這樣就得到了LBA數(shù)組,LBA block[N],通過對數(shù)組的管理,達(dá)到對硬盤的管理,就是先描述,再組織。
?? 文件系統(tǒng)
? ? ? ? 接下來,我們使用的是Linux中的ext2文件系統(tǒng)進(jìn)行講解。
??? 分區(qū)
?????????概念:分區(qū)是將硬盤空間劃分成獨(dú)立的區(qū)域,每個(gè)區(qū)域可以被單獨(dú)管理和使用。
??? 分組
? ? ? ? 我們只要管理好一個(gè)分區(qū),就能使用相同標(biāo)準(zhǔn)管理好所有分區(qū),進(jìn)而管理好整個(gè)硬盤。
? ? ? ? 分完區(qū)后,還是太大,所以進(jìn)行分組,管理好一個(gè)組,就能管理好每個(gè)組,進(jìn)而管理好一個(gè)分區(qū)。這就是分支思想。
? ? ? ? 上圖是磁盤文件系統(tǒng)。磁盤是典型的塊設(shè)備,磁盤分區(qū)被劃分為一個(gè)個(gè)block,一個(gè)block的大小是有格式化確定的,并不可以修改。
? ? ? ? 這就引入了文件系統(tǒng)的概念,通過文件系統(tǒng)管理好分組,進(jìn)而管理好分區(qū),從而管理好硬盤,每個(gè)分區(qū)有自己的文件系統(tǒng),每個(gè)分區(qū)的文件系統(tǒng)可以不同。
? ? ? ? 此外,我們還需要知道,Linux中,文件的內(nèi)容和屬性分開存儲。
????????Data blocks (數(shù)據(jù)區(qū)):存放文件內(nèi)容。也是占據(jù)區(qū)域最大的。
????????Block Bitmap(塊位圖):記錄者Data Block 中哪個(gè)數(shù)據(jù)塊已經(jīng)被占用,哪個(gè)數(shù)據(jù)塊沒有被占用。比特位的位置,表示塊號,比特位的內(nèi)容,表示該塊是否被占用。
????????inode table (inode節(jié)點(diǎn)表):Linux中文件屬性是一個(gè)大小固定的集合體,大小是128字節(jié),inode內(nèi)部不包含文件名,并且1個(gè)文件對應(yīng)1個(gè)inode。所以在內(nèi)核里,不看文件名,只看inode號。
? ? ? ? Linux中,文件屬性是一個(gè)大小固定的集合體(128 B)。其中最重要的字段是inode_num,即inode號,此外data[N]數(shù)組里面元素存儲著存放內(nèi)容的塊的塊號(N一般是15),分為一級,二級,三級等直接和間接映射。
ls -li //查看文件的,并且能查看到inode
????????inode bitmap:比特位的位置表示第幾個(gè)inode,內(nèi)容表示該inode是否空閑可用。
????????GDT(塊組描述符):塊描述符,描述塊組的信息。
? ? ? ? 超級塊(Super Block):存放文件系統(tǒng)本身的結(jié)構(gòu)信息。記錄的信息主要有:bolck 和 inode的總量, 未使用的block和inode的數(shù)量,一個(gè)block和inode的大小,最近一次掛載的時(shí)間,最近一次寫入數(shù)據(jù)的 時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等其他文件系統(tǒng)的相關(guān)信息。Super Block的信息被破壞,可以說整個(gè) 文件系統(tǒng)結(jié)構(gòu)就被破壞了。super block 存放在多個(gè)block中(2~3個(gè)),但不是每個(gè)block中都有。
? ? ? ? 以上我們就對文件系統(tǒng)有了基本的概念,所以我么將硬盤分區(qū)后,分組并且寫入文件系統(tǒng),這就是格式化。所以格式化的本質(zhì),就是在硬盤中寫入文件系統(tǒng)。
??? inode號
?分配
? ? ? ? inode編號的分配是以分區(qū)為單位進(jìn)行分配。所以超級塊 和 GDT 記錄著每個(gè)分組的其實(shí)inode,結(jié)束inode,以此將inode分配個(gè)不同區(qū)域(分組)。inode bitmap 和 inode table是從0開始的,所以知道inode ,在 - 起始inode,就能對應(yīng)到inode bitmap和i節(jié)點(diǎn)表中對應(yīng)的下標(biāo),找到對應(yīng)的文件屬性,進(jìn)而找到文件內(nèi)容。
? ? ? ? 所以不同分區(qū)可能有相同的inode,但1個(gè)分區(qū)內(nèi)不能有相同的inode。
? ? ? ? Dateblock也是同樣的原理,數(shù)據(jù)塊也是整體分配,也有statr塊號,end塊號,有對應(yīng)的塊號也能映射到對應(yīng)組的塊號里面。
? ? ? ? inode映射到對應(yīng)的組后,優(yōu)先使用當(dāng)前組的數(shù)據(jù)塊,除非文件非常大,否則不建議跨組訪問。但 inode 和 數(shù)據(jù)塊 是可以跨組訪問的。
? ? ? ? 總結(jié),在分區(qū)內(nèi)知道了inode,就能確定在哪個(gè)分組,在組內(nèi)減起始inode,就能找到inode bitmap,檢測是否被用,再在i節(jié)點(diǎn)表中找到或存儲inode屬性,進(jìn)而在數(shù)據(jù)塊中找到對應(yīng)的文件內(nèi)容。
??? 逆向路徑解析
? ? ? ? 前文中,我們講解在內(nèi)核中,操作一個(gè)文件,使用的是文件的inode,但用戶使用的是文件名,所以文件名一定和inode存在映射關(guān)系。映射關(guān)系存儲在哪呢?
? ? ? ? 目錄,也是一個(gè)文件,文件內(nèi)容就是 文件名 和 inode的映射關(guān)系。所以有了目錄,就有了文件名和inode的映射關(guān)系。
? ? ? ? 但目錄也是一個(gè)文件呀,所以目錄也會(huì)查找自己的目錄,找到自己的inode號,一直找到根目錄為止,這就是所謂的逆向路徑解析。
目錄的r權(quán)限:是否允許度目錄內(nèi)容,即文件名:inode的映射關(guān)系,拿不到inode,就讀不了。
目錄的w權(quán)限:先當(dāng)前目錄寫文件名:inode的映射關(guān)系
? ? ? ? 逆向路徑解析是OS自己做的,根據(jù)文件路徑,找到文件inode,這也就是為什么要有路徑的原因了,也是為什么一個(gè)目錄下不能建立同名文件。
? ? ? ? 但是逆向路徑解析不是每一次都進(jìn)行的,Linux會(huì)緩存常用的路徑結(jié)構(gòu)。
分區(qū)掛載
? ? ? ? 之前,我們都是在一個(gè)分區(qū)內(nèi)知道了inode,但是我們?nèi)绾沃牢覀冊谀膫€(gè)分區(qū)呢?在Linux中,分區(qū)需要掛載到指定目錄,即將分區(qū)和目錄進(jìn)行關(guān)聯(lián),進(jìn)入分區(qū)就是進(jìn)入目錄。
目錄作用
????????1. 確定在哪個(gè)分區(qū) ;
????????2. 文件名:inode的映射關(guān)系,找到指定文件的inode
? ? ? ? 那么目錄/路徑誰提供的呢?我 或者 進(jìn)程已經(jīng)提供了。即內(nèi)核文件系統(tǒng)提前寫入并組織好,然后我們提供的。
? ? ? ? 例如,打開一個(gè)文件open(),第一個(gè)參數(shù)需要你提供文件名,open早就提供了cwd(當(dāng)前路徑),拼接上你的文件名,就能得到一個(gè)路徑,然后找到inode,進(jìn)而創(chuàng)建或讀寫文件內(nèi)容。
????????總結(jié)一下:文件的創(chuàng)建,會(huì)在目錄下創(chuàng)建,而路徑是由內(nèi)核文件系統(tǒng)提起寫入并組織好,我們提供文件名拼接形成。如進(jìn)程的cwd(存儲當(dāng)前路徑) + 文件名 ,從而在指定目錄下創(chuàng)建文件。再根據(jù)路徑的前綴確定在哪個(gè)分區(qū),在指定分區(qū)下申請位圖,塊,屬性等資源,進(jìn)行文件操作。
?? 總結(jié)
? ? ? ? 以上,我們就對Linux中的文件系統(tǒng)做了詳解,開始,我們介紹了硬盤這一物理設(shè)備,介紹了它的物理結(jié)構(gòu),存儲結(jié)構(gòu)以及OS如何管理硬盤,之后,我們講解什么OS如何通過文件系統(tǒng)管理好分組,進(jìn)而管理好分區(qū),從而管理好整個(gè)硬盤。最后,講解了inode是如何來的,目錄和分區(qū)的關(guān)系,總結(jié)了如何創(chuàng)建,讀寫文件的。
? ? ? ? 以上,就是本期【Linux雜貨鋪】的主要內(nèi)容了,如果感覺本期內(nèi)容對你有幫助,歡迎點(diǎn)贊,收藏,關(guān)注 Thanks?(?ω?)?文章來源:http://www.zghlxwxcb.cn/news/detail-851152.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-851152.html
到了這里,關(guān)于【Linux雜貨鋪】文件系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!