??作者:小樹苗渴望變成參天大樹??
??作者宣言:認(rèn)真寫好每一篇博客??
??作者gitee:gitee?
??作者專欄:C語言,數(shù)據(jù)結(jié)構(gòu)初階,Linux,C++ 動態(tài)規(guī)劃算法??
如 果 你 喜 歡 作 者 的 文 章 ,就 給 作 者 點(diǎn) 點(diǎn) 關(guān) 注 吧!
前言
今天我們開始講解文件系統(tǒng),上一篇我們通過文件操作,解決了一系列我們之前只停留在表面的操作,例如文件操作,重定向,緩沖區(qū)這些,但是我們還是不知道什么是文件系統(tǒng),因?yàn)槲覀兩弦黄v解的被打開的文件,加載到內(nèi)存,不在文件系統(tǒng)管理范圍的了,今天我們要說的是沒有被打開的文件,此時是放在硬盤里面的,那么硬盤怎么講我們這些沒有被打開的文件給存儲起來的呢。這篇帶大家來理解一下,讓我們對文件系統(tǒng)有重新認(rèn)識了一下。
本章講解順序
1.認(rèn)識硬件
2.在談文件系統(tǒng)
一、認(rèn)識硬件
大家應(yīng)該都知道,我們的硬盤是儲存計(jì)算機(jī)數(shù)據(jù)的,以為內(nèi)存是一個有電設(shè)備,斷電后上面的數(shù)據(jù)都沒有了,所以需要一個在斷電后存儲數(shù)據(jù)的硬件,那就是硬盤,我們現(xiàn)代的硬盤幾乎都是SSD了,但是在以前我們使用的都是磁盤,今天博主給大家講解的硬件設(shè)備就是磁盤,因?yàn)榇疟P的樣貌適合我們?nèi)ブv解的,現(xiàn)代的SSD和磁盤原理都是一樣的,只是集成了,不便于我們?nèi)チ私馑脑?,博主講通過圖片的方式一一給大家進(jìn)行講解。
1.1磁盤是什么??
磁盤是唯一的一個是機(jī)械設(shè)備的外設(shè),讓我們一起來看看。
我們打開看看磁盤里面的結(jié)構(gòu),非常的光亮,里面有許多結(jié)構(gòu),主要的是磁頭和盤片,數(shù)據(jù)就存儲在盤片上,在盤片運(yùn)作的時候磁頭會移到盤片上,來掃描盤片里面的數(shù)據(jù),盤片的個數(shù)是按照磁盤的存儲數(shù)據(jù)量的大小而決定的,數(shù)據(jù)越多盤片就越多,這是在出廠的時候就設(shè)定好了的,而這些盤片都是由一個馬達(dá)一起帶著轉(zhuǎn)動的,同事旋轉(zhuǎn),轉(zhuǎn)動速度都是一樣的。我們的每一片盤片都有兩面,每一面都可以存儲數(shù)據(jù),所以都必須有磁頭,磁頭是盤片的兩本,而這些磁頭也是另一個馬達(dá)同時控制轉(zhuǎn)動的,這些磁頭俯視來看都是重疊在一起的,我們找數(shù)據(jù)必須在盤片上進(jìn)行尋找,而這些都是通過磁頭轉(zhuǎn)到那個位置去定位到我們要找到的數(shù)據(jù),此時就要知道是哪個磁頭,就可以對應(yīng)到哪個盤片,在通過磁頭轉(zhuǎn)動的角度來讀取數(shù)據(jù)
盤片轉(zhuǎn)動的速度可以達(dá)到每秒幾萬轉(zhuǎn),大家看圖,磁頭和盤片很近,但是不會接觸,這樣就不會導(dǎo)致盤片刮花,導(dǎo)致數(shù)據(jù)讀取失敗,我們最好不要開始的來回拌勻電腦,開機(jī)狀態(tài)磁盤會轉(zhuǎn)到盤片上,震動有可能使磁頭上面抖動,掛到盤片,我們的一個磁盤在生產(chǎn)的時候都會在一個無塵的地方用封膠,防止灰塵對盤片有影響,拆開后的磁盤一般都報廢了
有了上面的介紹我們大致知道磁盤是怎么工作的,但是里面的細(xì)節(jié)我們不知道,只知道磁頭同時轉(zhuǎn),盤片同時轉(zhuǎn),磁頭在盤片上就可以讀取數(shù)據(jù)了,關(guān)于怎么存儲,我們是不知道的,接下來解決這個問題
1.2磁盤的具體存儲細(xì)節(jié)
我們來看一下更內(nèi)部的結(jié)構(gòu)
博主拿一面過來介紹。
按照上面的
盤面我們劃分成四個區(qū)域,每一個都是同心圓,而這每個圓叫做磁道,這四個區(qū)域中的其中一個里面的黃色部分就是扇區(qū),他是一條有弧度的線,里面都是二進(jìn)制位,類似于這樣
磁頭會發(fā)射電流使得這上面的數(shù)據(jù)0/1之間來回變化的。大家看到垌一個區(qū)域上扇區(qū)的長度是不一樣的,這樣就導(dǎo)致不均勻,但是現(xiàn)在已經(jīng)幾乎均勻了,是通過盤片不同位置的密度所控制的,來圓心近一點(diǎn)的二進(jìn)制位離得近一些,則反之.扇區(qū)是我們磁盤最基本的單位–512字節(jié)/4kb,(為什么是這個大小呢,這是一些數(shù)學(xué)家算出來這樣的大小有利于提高整機(jī)效率,具體的博主也不清楚)磁盤可以看成是無數(shù)個扇區(qū)組成的存儲介質(zhì)
我們是通過磁頭來將數(shù)據(jù)寫入盤片,此時第一個要解決的問題就是定位一個扇區(qū),就是先定位時哪個盤面(這是通過哪個磁頭決定的),再定位到哪個磁道,最后就可以定位到是哪個扇區(qū)。
解決上面的問題:對磁盤進(jìn)行邏輯結(jié)構(gòu)分析
相信在我們這個年紀(jì)的人,在小時候應(yīng)該都見過磁帶,博主經(jīng)常在英語聽力的時候看到。
我們的磁帶也是存儲數(shù)據(jù)的,把他扯出來就是一個長長的直線,為什么磁帶要設(shè)計(jì)成圓形??(因?yàn)檫@樣可以更多的增加磁帶的長度,增加磁帶的存儲容量),磁帶扯出來以后整體就想一個數(shù)組,此時我們的磁盤就也可以抽象成數(shù)組,假設(shè)我們磁盤有三個盤片,就有六個磁頭,把每個盤片分成10個磁道,每個磁道分成5個扇區(qū),我們的數(shù)組就可以劃分成如下圖
此時我們就把磁盤的物理結(jié)構(gòu)就變成了邏輯結(jié)構(gòu),只要給我一個數(shù)組下標(biāo),就可以計(jì)算出對應(yīng)的盤片,磁頭,磁道。
假設(shè)每個盤片2W個扇區(qū),每個盤片有50個磁道,這樣就可以算出每個磁道有400個扇區(qū)。外部傳進(jìn)來數(shù)組下標(biāo)是28888
邏輯地址又叫LBA地址,這樣我們就可以通過LBA地址計(jì)算出來磁盤的CHS地址,反過來計(jì)算也可以。
再次回歸到硬件,我們之前說過不止CPU有寄存器,其他外設(shè)也有,當(dāng)然這也包括磁盤
所以大家應(yīng)該知道我們是怎么讓磁盤獲得數(shù)組下標(biāo)在進(jìn)行轉(zhuǎn)化的吧。
二、文件系統(tǒng)
我們知道可以從邏輯結(jié)構(gòu)專程物理結(jié)構(gòu),那么我們接下來就在邏輯地址上進(jìn)行講解,因?yàn)檫壿嫿Y(jié)構(gòu)是我們所熟悉的結(jié)構(gòu)。
Linux下一切皆文件,這個大家都知道了,我們磁盤里面也存儲了許多沒有被打開的文件,那么這些文件不可能在磁盤里面里面隨便放著,從進(jìn)程開始我們就開始講解管理,方便我們?nèi)ゲ僮?,所以我們磁盤里面的文件也需要管理,這樣讀取文件的時候就方便。假設(shè)我們的磁盤有800G的容量,這太大了,管理起來太麻煩,所以我們要進(jìn)行劃分,將它劃分成200G左右的,但是也太大了,在瓜分成10G的,把這10G管理好,其余區(qū)域復(fù)制粘貼過去較好,來看劃分圖,所以分區(qū)就是我們電腦上的C盤,D盤
此時我們的重點(diǎn)就來到最底下的一幅圖,大家應(yīng)該都不理解,接下來博主就來給大家一一介紹
最底下的一幅圖就是我們的文件系統(tǒng)
**(1)**啟動塊(Boot Block),這個大小是設(shè)定好的
**(2)**Block Group:ext2文件系統(tǒng)會根據(jù)分區(qū)的大小劃分為數(shù)個Block Group。而每個Block Group都有著相同的結(jié)構(gòu)組成。 將著10個g的空間瓜分成n個block group,接下來我們介紹其中一個block group
**(3)**datablocks:這是數(shù)據(jù)塊,里面有很多小塊,大小都是4kb,里面存放的都是內(nèi)容,所以存文件內(nèi)容的區(qū)域,以塊的形式呈現(xiàn)。
**(4)**inode table:這是屬性數(shù)據(jù)塊,里面存放單個文件的所有屬性,一般而言,一個文件一個inode,inode是一個結(jié)構(gòu)體,大小是128字節(jié),這個結(jié)構(gòu)體里面還有一個inode編號。
大家應(yīng)該看到博主把里面的其中三個屬性標(biāo)紅了嗎,這是我們今天所講的重點(diǎn)。第一個標(biāo)紅的屬性是唯一標(biāo)識文件的,只有找到他才能找到我們的文件所存儲的位置,第二個標(biāo)紅的屬性,等到講解軟硬件鏈接的時候再說,第三個標(biāo)紅的屬性是找對應(yīng)的數(shù)據(jù)塊(在上面我們說過datablock被分成很多小塊,每個小塊大小為4kb,我們給這些小塊設(shè)置下標(biāo),一個文件可能占用的不止一個小塊而是多個,而第三個屬性是一個數(shù)組,大小一般為15,他里面的內(nèi)容就是小塊的下標(biāo),這樣就形成了映射了,有的人會說,一個小塊4kb,數(shù)組才15個,這才可以對應(yīng)60kb大小的文件啊,當(dāng)文件特別大的時候,數(shù)組就不夠,難道會擴(kuò)容??答案是不會擴(kuò)容,我們的數(shù)組前12個位置是直接映射關(guān)系,里面存放的是小塊對應(yīng)的編號,后面三位是間接映射關(guān)系,我們數(shù)據(jù)塊里面規(guī)定好了,不止可以存放文件的數(shù)據(jù),也可以存放其他小塊的編號,后三位的前兩位是兩級索引,里面存放的也是小塊的編號,只不過這個小塊里面的內(nèi)容是其他小塊的編號,4kb的大小為4512字節(jié),一個編號是一個整型,大小是4字節(jié),所以兩個小塊可以存放1024個編號,大小變成了4096kb=4MB,最后一位是三級索引,里面存放的是小塊的編號,里面的內(nèi)容依舊存儲編號可以存儲512個小塊的編號,在繼續(xù)往下面的小塊里面存儲編號,每個小塊又可以存儲512個小塊編號,此時就有512512=262144個小塊,每個小塊存儲的數(shù)據(jù)大小為4kb,可以存儲4*262144=1048576kb=1GB)來看圖解,理解一下:
通過上面的講解我們的文件是怎么存儲了的吧,還有一個重要點(diǎn)的就是文件系統(tǒng)里面的文件屬性和文件內(nèi)容是分開存儲的
(5)block bitmap:用來標(biāo)識我們數(shù)據(jù)塊有沒有被使用,比特位的位置和塊號映射起來,比特位的內(nèi)容,就是表示該塊有沒有被使用,所以我們刪除一個文件的時候,不需要講數(shù)據(jù)塊里面的內(nèi)容清空,只需要將對應(yīng)的比特位置0就可以了,下次在使用此位置就直接覆蓋就行了,所以大家有沒有發(fā)現(xiàn),下載很大的文件時間很長,但是刪除一個文件的時候速度很快,原因就在這里。大家如果誤刪一個文件后,其實(shí)可以恢復(fù),蛋需要專業(yè)的軟件和技術(shù)人員,將比特位置1,就可以了,但是此時你這塊位置沒有被使用過,不然內(nèi)容就被覆蓋了,所以誤刪最好就是什么都不要動,交給專業(yè)的人。
(6) inode bitmap:用來標(biāo)識我們的inode有沒有被使用,比特位的位置和inode的標(biāo)號映射起來,這個inode的個數(shù)是在分區(qū)的時候就劃分好的,個數(shù)是確定好的,當(dāng)inode使用完了,而數(shù)據(jù)塊還有,也是創(chuàng)建不了文件的,數(shù)據(jù)塊沒有,inode還有也創(chuàng)建不了文件。所以接下來就有了我們super block
(7) super block:文件系統(tǒng)的基本信息
里面包含了整個分區(qū)的基本使用情況(一共多少個組,每個組的大小,每個組的inode數(shù)量,每個組的block數(shù)量,每個組的起始inode,文件系統(tǒng)的類型與名稱等),這是每個分區(qū)里面的屬性,不會在每個分組里面都有的,一般只在開頭。所以在每個分區(qū)使用前,都必須提前將部分文件系統(tǒng)屬性的信息提前設(shè)置進(jìn)對應(yīng)的分區(qū)中,方便我們后續(xù)使用這個分區(qū)或者分組,這也叫格式化
(8) Group Descriptor Table:這是描述一個分組里面的情況,有多少數(shù)據(jù)使用,還剩多少,有多少inode被使用,還剩多少,一些屬性的。
inode vs 文件名
我們的一切根源都是通過inode去操作的,找到文件:inode編號->分區(qū)特定的分組->inode->屬性->內(nèi)容。在Linux系統(tǒng)中,一個文件,一個inode,每個inode都有自己的inode編號(inode的設(shè)置,是以分區(qū)為單位的,不能跨分區(qū)),inode標(biāo)識文件的所有屬性,文件名并不屬于inode這個結(jié)構(gòu)體里面的屬性,那我們怎么知道一個文件的inode編號的呢??我們用戶從來沒有使用過inode,我們一直使用的是文件名,所以這兩者肯定有一種聯(lián)系。這就要依托于我們的目錄結(jié)構(gòu),我們的目錄也是文件,有自己的inode, 就可以找到對應(yīng)的數(shù)據(jù)塊,那數(shù)據(jù)塊里面存儲的是什么內(nèi)容呢??但是就是文件名和inode的映射關(guān)系,兩者互為key值。這樣我們操作文件名,就間接操作了inode了。因?yàn)閕node是唯一的,所以統(tǒng)一目錄下不能有同名文件
此時大家理解一下:
- 目錄下,沒有w,我們就無法創(chuàng)建文件
- 目錄下,沒有r,我們就無法查看文件
- 目錄下,沒有x,我們就無法進(jìn)入文件
在思考一下:
新建文件,刪除文件,查找文件,修改文件,系統(tǒng)要做什么??,這個問題博主交給讀者,相信學(xué)習(xí)了上面的內(nèi)容,我認(rèn)為聰明的你肯定知道思考題的答案。
三、軟硬鏈接
3.1軟硬鏈接效果的展示
在講解軟硬件鏈接的時候,先不講概念,先讓大家看到軟硬件鏈接怎么去操作,長什么樣,才能更好的給大家講解,就好比先給大家看看磁盤結(jié)構(gòu),在講原理,大家才能更好的理解。
我們來看操作結(jié)果。
我們的第一個是建立文件的硬連接,第二個是建立文件的軟鏈接,在ls上加一個-i選項(xiàng)就可以查看到文件的inode,對于軟硬件鏈接,我們看到最明顯的區(qū)別就是硬連接和原文件是同一個inode,所以說明硬連接沒有創(chuàng)建新的文件,而軟鏈接有一個屬于自己的inode.兩者的刪除使用unlink,可能使用rm kennel不行,但是刪除后都不會影響原文件。
3.2 概念講解
通過上面的演示,我們看到兩者出現(xiàn)了不同的效果:
(1)軟鏈接的理解
軟鏈接有自己獨(dú)立的inode,也就是一個獨(dú)立的文件,有自己的inode編號,和數(shù)據(jù)塊,里面的內(nèi)容存儲的是指向原文件的路徑,上面的演示是在同一目錄下建立的軟鏈接,看不出來優(yōu)勢,接下來給大家展示一下不同目錄下建立軟鏈接文件。
軟鏈接的應(yīng)用場景
我們通過軟鏈接,把深路徑的程序在淺路徑執(zhí)行出來了,大家有沒有發(fā)現(xiàn)這就是我們windows下的桌面快捷方式,相信大家小時候卸載軟件都是直接把桌面的圖標(biāo)給刪除了就認(rèn)為都刪除了,但實(shí)際上,只是刪除掉快捷方式的文件,真正的可執(zhí)行程序在你安裝目錄下存在著呢。
注意:我們軟鏈接文件里面存儲的是指向原文件的路徑,所以只刪除軟鏈接文件么有問題,但是只刪除原文件就會出現(xiàn)問題
(2)硬連接的理解
硬連接文件和原文件是同一個inode,可以理解為硬連接是我們原文件的一個別名,其實(shí)可以理解為互為別名,刪除任意一個其他的都不受影響,大家還記得我們在介紹inode結(jié)構(gòu)體的時候,說第二個標(biāo)紅的屬性引用計(jì)數(shù)后面來講,此時就是講解他的最好時機(jī)。
這一串?dāng)?shù)字表示的就是硬連接數(shù),當(dāng)刪除一個文件的時候,只有等到硬連接數(shù)減到0的時候,才會刪除,不然只會計(jì)數(shù)減減,他家有沒有發(fā)現(xiàn)技術(shù)有時候是相同,這個引用計(jì)數(shù)在智能指針,文件描述符表,和硬連接數(shù)都出現(xiàn)了,所以系統(tǒng)方面的知識連貫性很大。
硬連接具體做了什么,就是在指定目錄下(可以不在同一個目錄下),建立文件名和指定inode的映射關(guān)系–僅此而已
硬連接的應(yīng)用場景
他的應(yīng)用場景不是很多,但是運(yùn)用在廣泛的是進(jìn)行目錄間的切換。
我們先來創(chuàng)建一個目錄文件
普通文件的默認(rèn)硬連接數(shù)是1,目錄文件的默認(rèn)的硬鏈接數(shù)是2
我們來看一下此目錄文件的inode
我們看到目錄文件在一開始就要兩個隱藏文件 點(diǎn)點(diǎn)代表當(dāng)前路徑,點(diǎn)點(diǎn)代表上一路徑,所以點(diǎn)文件和當(dāng)前文件的inode是同一個。
硬鏈接不允許給目錄,軟鏈接可以。
為什么硬鏈接不允許給目錄呢??
這樣會造成環(huán)路問題,我們的操作文件的前提是查找到這個文件,所以路徑是方便我們查找的,所以查找回在路徑文件里面去查找,如果在一個目錄里面有硬鏈接后的路徑文件,就要可能往回找了
所以我們才可以使用相對路徑去進(jìn)行操作,那點(diǎn)和點(diǎn)點(diǎn)不就是對目錄進(jìn)行硬鏈接?而且點(diǎn)和點(diǎn)也是存在環(huán)路問題啊?為什么可以呢?原因是這是系統(tǒng)自帶的,人家可以,我們用戶不可以,所以可以進(jìn)行硬鏈接,而我們搜索路徑的時候,不去點(diǎn)和點(diǎn)點(diǎn)里面進(jìn)行搜索,這樣就避免了環(huán)路。文章來源:http://www.zghlxwxcb.cn/news/detail-757196.html
四、補(bǔ)充知識
先發(fā)布,晚點(diǎn)再來補(bǔ)充,各位讀者們。文章來源地址http://www.zghlxwxcb.cn/news/detail-757196.html
到了這里,關(guān)于【Linux】-文件系統(tǒng)的詳解以及軟硬鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!