> 作者:?舊言~
> 座右銘:松樹千年終是朽,槿花一日自為榮。> 目標(biāo):理解什么是軟硬鏈接,并且能創(chuàng)建軟硬鏈接。
> 毒雞湯:再小的事,別人做了是情分,不做是本分??墒怯行┤?永遠(yuǎn)只要求他人付出,不懂得感恩。
> 專欄選自:Linux初階
> 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲????
??前言
我們已經(jīng)知道了簡單的文件知識(shí),文件的讀寫呀,管理文件呀等等等,那我們來想我們學(xué)習(xí)的文件都時(shí)獨(dú)立,兩個(gè)文件不能相互溝通,就好像需要過一條河,需要一座橋,使兩岸可以來往,那文件的來往那又該如何呢?這里不得不提出軟硬鏈接了。
?主體
?學(xué)習(xí)【Linux】文件系統(tǒng)軟硬鏈接咱們按照下面的圖解:
?? 了解磁盤
磁盤是計(jì)算機(jī)主要的存儲(chǔ)介質(zhì),可以存儲(chǔ)大量的二進(jìn)制數(shù)據(jù),并且斷電后也能保持?jǐn)?shù)據(jù)不丟失。下面,我們來簡單了解一下磁盤的結(jié)構(gòu)。
???磁盤的物理結(jié)構(gòu)
結(jié)構(gòu):
磁盤是外設(shè)并且是我們計(jì)算機(jī)中唯一的機(jī)械結(jié)構(gòu)(機(jī)械結(jié)構(gòu)相對較慢)。
概念:
磁盤的盤片/盤面就像光盤一樣(盤面上存儲(chǔ)數(shù)據(jù)),兩面都有。而像刀子一樣的是磁頭(每一面都有一個(gè)磁頭),磁頭和盤面并沒有接觸,磁盤必須防止抖動(dòng)。中間有馬達(dá),一旦盤片加電之后,盤片旋轉(zhuǎn),磁頭擺動(dòng),馬達(dá)可以控制磁頭擺動(dòng),控制盤片旋轉(zhuǎn)。對應(yīng)的磁盤也有自己的硬件電路,通過硬件電路+伺服系統(tǒng),給磁盤發(fā)二進(jìn)制指令,讓磁盤定位尋址某個(gè)區(qū)域。
圖解:
解釋:
- 這個(gè)磁盤的盤片就像光盤一樣,數(shù)據(jù)就在盤片上放著,只不過光盤是只讀的,磁盤是可讀可寫的
- 盤面上要存儲(chǔ)數(shù)據(jù)?。ǘM(jìn)制) -> 但計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制 ->?二進(jìn)制是兩態(tài)?—> 我們想到磁鐵也是兩態(tài)的
???磁盤的存儲(chǔ)結(jié)構(gòu)
結(jié)構(gòu):
機(jī)械硬盤的尋址的工作方式:盤片不斷旋轉(zhuǎn),磁頭不斷擺動(dòng),定位到特定的扇區(qū)(面 — 磁道 — 扇區(qū)),通過柱面Cylinder —— 磁頭Head —— 扇區(qū)Sector 的尋址方法為CHS尋址
,扇區(qū)的大?。?code>512字節(jié)是硬件上的要求(外磁道和內(nèi)磁道都是一樣大小,密度不一樣)
分析:
在單面上定位扇區(qū):通過確認(rèn)磁道,最終確定在對應(yīng)磁道的哪一個(gè)扇區(qū)。確認(rèn)磁道:每個(gè)磁道都有自己的編號(hào),磁道周長不一樣,但是存儲(chǔ)大小是一樣的,因?yàn)樯葏^(qū)大小一樣,一個(gè)磁道有多少扇區(qū)也是固定的,所以每個(gè)磁道的扇區(qū)也有編址。所以定位到某個(gè)磁道上就能夠找到。
機(jī)械硬盤的尋址方式:盤片不斷旋轉(zhuǎn),磁頭不斷擺動(dòng),就是在確認(rèn)在哪一個(gè)磁道,如何確認(rèn)在哪個(gè)扇區(qū)?盤片也在旋轉(zhuǎn),就是讓磁頭定位扇區(qū)。
柱面:把一系列同心的磁道壓在一起,宏觀上看成一個(gè)整體。一般定位的時(shí)候:磁頭、柱面、扇區(qū)====(磁頭、磁道、扇區(qū)),這兩個(gè)是等價(jià)的。柱面相當(dāng)于磁頭一起指向的位置就是柱面的邊界位置。
在磁盤中定位任何一個(gè)扇區(qū):先定位在哪一個(gè)磁道(哪個(gè)柱面),磁道確定,所有磁頭共進(jìn)退,此時(shí)磁頭不動(dòng),在去定位磁頭(定位盤面),最后在定位哪一個(gè)扇區(qū)。
圖解:
總結(jié):
磁盤中定位任何一個(gè)扇區(qū),采用的硬件級(jí)別定位方式(CHS定位法):柱面Cylinder——磁頭Head——扇區(qū)Sector
???磁盤的邏輯結(jié)構(gòu)
概念:
類比于磁帶,卷起來是圓形的,扯開是線性結(jié)構(gòu)的。所以我們可以把磁盤盤片想象成線性結(jié)構(gòu)。以O(shè)S為角度,則認(rèn)為磁盤是線性結(jié)構(gòu),要訪問某個(gè)扇區(qū),只需要定位數(shù)組下標(biāo),也就是說知道這個(gè)扇區(qū)的下標(biāo)就算定位了一個(gè)扇區(qū)。在操作系統(tǒng)內(nèi)部,我們稱這種地址為LBA(Logic Block Address)地址!而要寫到物理磁盤上,我們就要把LBA地址轉(zhuǎn)換成對應(yīng)磁盤的三維地址CHS地址。總結(jié)來說,OS的地址為LBA地址,而對應(yīng)的磁盤為CHS地址。
圖解:
總結(jié):
OS要進(jìn)行邏輯抽象,不直接使用CHS:1.便于管理,管理數(shù)組與管理三維立體結(jié)構(gòu),數(shù)組比較好管理;2.不想讓OS的代碼和硬件強(qiáng)耦合!比如磁盤的基本大小改變,OS的源碼有必要跟著變。
?? 文件系統(tǒng)與inode
概念:
文件在磁盤中是如何存儲(chǔ):文件是在磁盤中的,而邏輯結(jié)構(gòu)是線性結(jié)構(gòu)。磁盤的空間很大,雖然對應(yīng)的磁盤的訪問的基本單位是512字節(jié),但是依舊很小,OS內(nèi)的文件系統(tǒng)會(huì)定制的多個(gè)扇區(qū)的讀取,以1KB,2KB,4KB為基本單位,所以即使讀取/修改1bit,也必須將4KB加載到內(nèi)存,進(jìn)行讀取或修改,在將其寫回磁盤。我們采用分治的思想,來管理磁盤空間進(jìn)行分區(qū):大的磁盤空間->小空間,大事化小,給每個(gè)分區(qū)寫入不同的文件系統(tǒng)。
圖解:
分析:
boot block 存在于每個(gè)分區(qū)的開頭,備份文件,是與啟動(dòng)相關(guān)的,供啟動(dòng)時(shí)查找分區(qū),我們再把剩下的空間繼續(xù)拆解分組,Block group 0 ,Block group 1 … 那么問題就又變成了如果我能管理好Block Group 0,就能管好1~n這些,因此研究文件系統(tǒng)又縮小范圍了,就變成研究這一個(gè)Block Group 0。
這里我們逐個(gè)分析:
- ?Super Block:文件系統(tǒng)的屬性信息,整個(gè)分區(qū)屬性的屬性集(每個(gè)塊組都有 防止磁盤被刮傷而找不到 文件屬性)
- ?Data blocks:多個(gè)4KB(扇區(qū)*8)大小的集合,保存的都是特定文件的內(nèi)容
- ?inode Table:inode是一個(gè)大小為128字節(jié)的空間,保存的是對應(yīng)文件的屬性,該塊組內(nèi),所有文件的inode空間的集合,需要標(biāo)識(shí)唯一性,每一個(gè)inode塊都要有一個(gè)inode編號(hào)?。ㄒ话愣?,一個(gè)文件,一個(gè)inode,一個(gè)inode編號(hào))
- ?BlockBitmap(位圖):統(tǒng)計(jì)block的使用情況。假設(shè)有10000+個(gè)blocks,就有一一對應(yīng)的比特位。其中比特位為1,代表該block被占用,否則表示可用
- ?inode Bitmap:統(tǒng)計(jì)inode的使用情況,假設(shè)有10000+個(gè)inode,就有一一對應(yīng)的比特位。其中比特位為1,代表該inode被占用,否則表示可用
- ?GDT:塊組描述符,已經(jīng)使用了多少,有多少個(gè)inode,已經(jīng)被占用了多少個(gè),還剩下多少個(gè),使用了多少
分析問題:
眾所周知,文件 = 文件內(nèi)容 + 文件屬性,其中文件內(nèi)容放在Data blocks
中:
內(nèi)容放在data blocks中,屬性在inode table中,而inode內(nèi)部保存了一個(gè)數(shù)組,保存對應(yīng)塊的編號(hào),二者就聯(lián)系起來了:
但是如果文件特別大?并不是所有的data block只能存放文件的數(shù)據(jù),也可以存放其他塊的塊號(hào),所以最終指向更多的block來存儲(chǔ)。
?總結(jié):
- 創(chuàng)建一個(gè)文件:在位圖的比特位由0置為1,找到其inode table,屬性填進(jìn)去,文件的數(shù)據(jù)寫到block里,在inode和block建立映射關(guān)系,最后返回inode編號(hào),創(chuàng)建成功
- 查找一個(gè)文件:拿到inode找到inode table,在根據(jù)inode table找到對應(yīng)的數(shù)據(jù)塊,內(nèi)容加屬性就全找到了
- 刪除一個(gè)文件:刪除文件也需要用到inode,實(shí)際上刪除一個(gè)文件時(shí),我們只需要找到inode在inode bitmap當(dāng)中的比特位,把比特位由1置為0就刪除了。
所以刪除一個(gè)文件根本不需要把數(shù)據(jù)屬性和內(nèi)容清空,只要把inode bitmap的1置為0,屬性就刪除了,這個(gè)文件也占著數(shù)據(jù)塊,也把block的比特位也置為0。所以把文件刪除是能夠恢復(fù)的,一旦刪除只是把bit位清掉了,想要恢復(fù)只要得到inode的編號(hào),然后把inode bitmap里的比特位由0置為1,在去inode table對應(yīng)的映射表,在block bitmap的0置為1。
如果在Linux中誤刪除一個(gè)文件,還是能恢復(fù)的,但是前提必須是inode和data block沒有被占用,所以當(dāng)誤刪除一個(gè)文件時(shí),最好的辦法就是什么都不做。而我們在Windows中刪除文件到回收站,只是轉(zhuǎn)移了目錄,在回收站中刪除才是真正的刪除。
可是我們在查找一個(gè)文件的時(shí)候,用的不是inode,而是文件名?
- 任何一個(gè)文件都在一個(gè)目錄下,但是這些文件并沒有重復(fù)的文件名
- 目錄是一個(gè)文件,也有自己的inode,有對應(yīng)自己的data block,目錄的數(shù)據(jù)塊存放的是當(dāng)前目錄下的文件名和inode的映射關(guān)系,所以inode并不需要保存文件名。
- 所以我們在一個(gè)目錄下新增一個(gè)文件,必須得有寫入權(quán)限,新增一個(gè)文件的時(shí)候,要向當(dāng)前目錄的內(nèi)容里去寫文件名和inode的映射關(guān)系,所以必須得有寫入權(quán)限。羅列當(dāng)前的文件,要有讀權(quán)限,想讀的時(shí)候要根據(jù)文件名找到inode讀取底下的所有文件的屬性,讀的是拿到文件名,必須得去訪問數(shù)據(jù)塊,所以要有讀權(quán)限
?? 軟硬鏈接
?? 軟鏈接
建立軟鏈接:
ln -s myfile.txt soft_file.link
舉個(gè)栗子:
分析:
有自己獨(dú)立的inode的稱為軟鏈接,即軟鏈接是獨(dú)立的文件,獨(dú)立的文件有獨(dú)立的inode和對應(yīng)的文件內(nèi)容。所謂的軟連接標(biāo)定文件并不是用inode來標(biāo)記的,我們刪除myfile.txt,然后再去cat soft_file.link:這個(gè)軟鏈接并沒有用目標(biāo)文件對應(yīng)的inode,而是用目標(biāo)文件的文件名,把文件刪了找不到,軟鏈接的數(shù)據(jù)塊里保存的是所指向的目標(biāo)文件的路徑,所以目標(biāo)文件一刪,軟鏈接也就失效了。
刪除鏈接,可以rm,但是更建議
unlink soft_file.link
分析:
軟鏈接相當(dāng)于快捷方式。軟鏈接的作用:當(dāng)執(zhí)行路徑非常的深,導(dǎo)致路徑非常的長,我們可能會(huì)忘記路徑,所以我們可以通過軟鏈接不用每次都輸入長長的路徑,可以通過軟鏈接而快速找到:
舉個(gè)栗子:
分析:
這就相當(dāng)于Windows的快捷方式了。
???硬鏈接
創(chuàng)建硬鏈接:不帶上s就是硬鏈接了。
ln myfile.txt hard_file.link
舉個(gè)栗子:
分析:
軟硬鏈接最重要的區(qū)別在于是否具有獨(dú)立的inode,硬鏈接沒有獨(dú)立的inode,指向到其他文件的inode,不是獨(dú)立的文件,**建立一個(gè)硬鏈接是在做什么?**當(dāng)硬鏈接其中一個(gè)文件的大小、內(nèi)容等發(fā)生變化,那硬鏈接的文件都會(huì)發(fā)生相應(yīng)的變化,所以建立硬鏈接根本沒有新增文件,因?yàn)闆]有給硬鏈接分配獨(dú)立的inode,既然沒有創(chuàng)建文件那么就沒有自己的屬性集合和內(nèi)容集合,用的是別人的inode和內(nèi)容。創(chuàng)建硬鏈接本質(zhì)就是在指定的路徑下,新增文件名和inode編號(hào)的映射關(guān)系!
圖解:
說明:
inode可能會(huì)被多個(gè)文件指向,所以inode有一個(gè)計(jì)算器,count的引用計(jì)數(shù),把引用計(jì)數(shù)稱為硬鏈接數(shù):
這也是我們?yōu)槭裁茨芸吹?變?yōu)?的原因,因?yàn)橛辛诵碌奈募?,inode被兩個(gè)文件所指向,硬鏈接數(shù)變?yōu)?了:
硬鏈接的作用:
為什么創(chuàng)建一個(gè)普通文件的時(shí)候,硬鏈接數(shù)是1?
首先目錄和本身的inode就是一組映射關(guān)系了,另外,第二個(gè)是目錄內(nèi)部的.(.表示當(dāng)前目錄,也是文件名。inode是一樣的)和inode也是一組映射,所以是硬鏈接數(shù)是2
現(xiàn)在在empty目錄下在創(chuàng)建一個(gè)目錄dir,此時(shí)empty目錄的硬鏈接數(shù)變?yōu)榱?:
因?yàn)榇藭r(shí)dir的…文件指向上級(jí)的目錄empty,所以硬鏈接數(shù)為3
?? 總結(jié)
我們大致了解磁盤的物理結(jié)構(gòu)、存儲(chǔ)結(jié)構(gòu)、邏輯結(jié)構(gòu);然后就是文件系統(tǒng)與inode的認(rèn)識(shí)。
最后是軟硬鏈接,軟硬鏈接本質(zhì)區(qū)別就是有無獨(dú)立的inode.
??結(jié)束語?
? ? ? ?今天內(nèi)容就到這里啦,時(shí)間過得很快,大家沉下心來好好學(xué)習(xí),會(huì)有一定的收獲的,大家多多堅(jiān)持,嘻嘻,成功路上注定孤獨(dú),因?yàn)閳?jiān)持的人不多。那請大家舉起自己的小手給博主一鍵三連,有你們的支持是我最大的動(dòng)力??????,回見。文章來源:http://www.zghlxwxcb.cn/news/detail-855091.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-855091.html
到了這里,關(guān)于【Linux】文件系統(tǒng)軟硬鏈接的那些事兒的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!