?🌻個人主頁:路飛雪吖~
? ? ? ?🌠專欄:Linux
目錄
?
一、理解文件系統
🌠磁盤結構
二、軟硬連接
🌟軟硬鏈接
🌠軟鏈接:
🌠硬鏈接:
🌟理解軟硬鏈接的應用場景
?軟鏈接
?硬鏈接
如若對你有幫助,記得關注、收藏、點贊哦~ 您的支持是我最大的動力🌹🌹🌹🌹!!!
若有誤,望各位,在評論區留言或者私信我 指點迷津!!!謝謝 ヾ(≧▽≦*)o? \( ?? ω ?? )/
一、理解文件系統
🌠磁盤結構
<1> 任何磁盤結構
磁盤由上億的小磁鐵構成【磁鐵--南北極 --> 二進制】
(1)? 磁盤物理結構:
a. 磁盤在進行擺動旋轉【磁頭的左右擺動】:可以進行數據的尋址。
b. 磁頭懸浮在盤片上【要求在真空環境中】。
(2)?磁盤存儲結構:
a. 磁頭在擺動的本質:定位磁道(柱面)
b. 磁頭定位好一個磁道后,盤面在進行旋轉時,就可以把各個不同的扇區,依次放在磁頭的正下方,讓磁頭來確定一個扇區上面的 01 值;
c. 磁盤盤片旋轉的本質:定位扇區。
d. 扇區:是磁盤存儲數據的基本單位,512字節,塊設備;
e. 磁盤,若有3片,就有6面,每一面都有一個磁頭【h0~h5】;
f. 讀寫哪一個磁頭,本質是讀寫哪一個面;
g. 如何定位一個扇區?【CHS地址定位法】
? ???先定位磁頭(header)
? ?? 確定磁頭要訪問哪一個柱面(磁道)(cylinder)
? ?? 定位一個扇區(sector)
h. 文件 = 內容 + 屬性 這些都是數據,數據無非就是占據哪幾個扇區的問題,能定位一個扇區,就能定位多個扇區了。
i. 傳動臂上的磁頭是共進退的!!!
(3)?磁盤邏輯結構:
磁帶上面可以儲存數據,我們可以把磁帶“拉直”,形成線性結構
磁盤本質上是硬質的,但是邏輯上我們可以把磁盤想象成為卷在一起的磁帶,那么磁盤的邏輯存儲結構就類似于:
這樣每一個扇區,就有了一個線性地址(其實就是數組下標),這種地址叫做LBA
柱面是一個邏輯上的概念,其實就是每一個面上,相同半徑的磁道邏輯上構成柱面。所以,磁盤物理上分了很多面,但是在我們看來,邏輯上,磁盤整體是由“柱面”卷起來的。
整盤:
整個磁盤不就是多張二維的扇區數組表(三維數組?)
所有,尋址一個扇區:先找到哪一個柱面(Cylinder),在確定柱面內哪一個磁道(其實就是磁頭位置,Head),在確定扇區(Sector),所以就有了CHS。
我們之前學過C/C++的數組,在我們看來,其實全部都是一維數組:
所以,每一個扇區都有一個下標,我們叫做LBA(Logical Block Address)地址,其實就是線性地址。所以怎么計算得到這個LBA地址呢??
??扇區的編號從1開始,LBA從0開始【數組下標】。
?CHS轉成LBA:
? 磁頭數*每磁道扇區數 =單個柱面的扇區總數
? LBA = 柱面號C*單個柱面的扇區總數 + 磁頭號H*每磁道扇區數 +扇區號S-1
? 即:LBA = 柱面號C*(磁頭數*每磁道扇區數) + 磁頭號H*每磁道扇區數+扇區號S-1
? 扇區號通常是從1開始的,而在LBA中,地址是從0開始的
? 柱面和磁道都是從0開始編號的
? 總柱面,磁道個數,扇區總數等信息,在磁盤內部會自動維護,上層開機的時候,會獲取到這些參數。?LBA轉成CHS:
? 柱面號C?= LBA //(磁頭數*每磁道扇區數)【就是單個柱面的扇區總數】
? 磁頭號H = (LBA %(磁頭數*每磁道扇區數)) // 每磁道扇區數
? 扇區號S = (LBA % 每磁道扇區數)+1
? "//";表示除取整LBA地址? <--轉換--> CHS地址,誰來做?磁盤自己來做!固件(硬件電路、伺服系統)
所以,從此往后,在磁盤使用者看來,根本就不關心CHS地址,而是直接使用LBA地址,磁盤內部自己轉換。
所以,從現在開始,磁盤就是一個 元素為扇區 的一維數組,數組的下標就是每一個扇區的LBA地址。OS使用磁盤,就可以用一個數字訪問磁盤扇區了。
<2> 理解分區,格式化
OS和磁盤進行IO的時候,以扇區為基本單位,512字節,單次IO的數據量,1KB,2KB,3KB,4KB,8KB等,4KB數據塊 ---- 8個扇區。
OS如何管理?分區!--> 分組? 【分治思想】
<3> Linux文件系統Ext*系列的文件系統,inode號和inode
? Block Group:ext2文件系統會根據分區的大小劃分為數個Block Group。而每個Block Group都有著相同的結構組成。政府管理各區的例子;
? 超級塊(Super Block):【表示文件系統,管理整個分區】存放文件系統本身的結構信息。記錄的信息主要有:bolck 和 inode的總量,未使用的block和inode的數量,一個block和inode的大小,最近一次掛載的時間,最近一次寫入數據的時間,最近一次檢驗磁盤的時間等其他文件系統的相關信息。Super Block的信息被破壞,可以說整個文件系統結構就被破壞了;
? GDT,Group Descriptor Table:塊組描述符,描述塊組屬性信息;
? 塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個數據塊已經被占用,哪個數據塊沒有被占用;
? inode位圖(inode Bitmap):每個bit表示一個inode是否空閑可用。
? i節點表:存放文件屬性 如 文件大小,所有者,最近修改時間等;
? 數據區:存放文件內容 ;文件系統以分區為單位,一個分區一套文件系統;
分區和分區之間是互相獨立的,不同的分區可以用不同的文件系統
🌠小貼士:
? 文件 = 內容 + 屬性,文件屬性也是數據,
? 在Linux當中會以結構體的方式構建出來【inode】,
? 一個文件只有一個inode,inode是文件屬性數據的集合,
一個inode就是一個結構體【struct inode】
? inode的大小一般為128字節【跟系統有關】,一個塊組中可能會存在100或1000個文件,就會存在100或1000個inode,文件系統會把當前你要新建的文件,文件的屬性節點在內存里面定義出來【struct inode】,把屬性值填入,接著把inode節點寫入到磁盤當中指定的inode Table里面。
? OS在和磁盤進行IO交互的時,磁盤中一個塊有4KB,那一個塊就有 4KB/128字節 個inode,都存放在一個組當中的inode Table中,為此 每個文件都要有自己的文件編號【inode值】,inode彼此之間互不重復【有條件】
其中,在Linux系統中,文件名這個屬性不在inode中保存!
? inode Table 包含了當前組里面所有的文件屬性集。
? data block 用來存放文件的內容,里面全是劃分好的4KB大小的塊,
Linux下,文件屬性和文件內容是分開存儲的!
?如何找文件?
拿到對應的inode,接著在inode Table里面找到inode,inode屬性里面還有inode映射表?【int block[NUM]】,數組里面記錄了對應inode,所對應的數據在哪。
? inode Bitmap : inode Table有多少個inode,inoed Bitmap就需要有多少個比特位,當inode號為0,inode Bitmap對應的位圖比特位就會記錄下來【有效】,inode Bitmap會按比特位來檢查inode號是否有效,有效才會去inode屬性里面獲取有效的inode屬性。
? 對于inode Bitmap的一次進行修改,修改的原則:哪怕是一個Bite也要把4KB的數據全部放到內存里面,修改完成之后再寫回磁盤去;
?修改位圖時:
磁盤當中是以扇區為單位的,當要修改時,先把要修改的扇區搬到內存里,以比特位修改位圖,修改完成之后,直接寫回到磁盤分組的?inode Bitmap 里面的位置。
?在data block里面很多塊號,我們怎么樣才能知道哪些被占用/空閑?
black Bitmap也是一個位圖,它的二進制位圖中表明哪些被占用/空閑,因此在一個組當中,有了Block BItmap、inode Bitmap、inode Table、Data blocks后面這四塊,我們就可以對一個分組的內容和屬性進行基本的管理了。
有了inode Bitmap、inode Table這兩張位圖(有開始和結束),我們就可以清楚的知道,這兩張位圖所對應的區域,即inode Bitmap 和 inode Table 都有自己對應的編號(可以通過位圖來得到)
?過程:
新建一個文件并向這個文件寫入"hello world"字符串,
? 新建一個文件,要在inode Table里面先分配一個inode,接著在inode Bitmap里面去查某一個對應的位圖有沒有被使用,沒有被使用就會修改對應的位圖【由0-->1】,接著在inode Table里面拿著對應的inode號,初始化節點編號、填寫權限、屬主、時間、文件大小.....,寫入之后統計需要多少個塊,就回去Block Bitmap里面查位圖,申請所需的塊數,申請完之后,把對應的“hello world”字符串寫入到對應的塊號里面,接著拿著這個塊號返回到inode Bitmap找到inode Table里面的數組在里面寫入塊號(屬性),?接著在inode Table中找到對應的data blocks進行數據的寫入(內容)。
因此,我們只需要知道文件的inode編號就可以找到這個文件!!
? 在Linux中,刪除的本質是設置inode和block無效!
刪一個文件,可以恢復!!我們只需要把這個文件的inode Bitmap對應的【1/0 --置為--> 1】,接著再查找inode Table里面的塊【int block[NUM];】所對應的塊號,在Block Bitmap里面對應的塊號【由0 ---> 1】,這個文件就會被恢復。
不小心刪除了數據,不要隨便操作,以免被刪除的的inode和block被占用/覆蓋,就恢復不了了。
?如何評判當前塊組【Block group 0】已經滿了/放不下了呢?已經使用了多少/還剩多少?
因此每一個塊組都有一個Group Descriptor Table【GDT】塊組描述符。
?Boot Block跟分組關系不大,【以磁盤硬件為單位】一般是整個磁盤里面最開始的一個小區域,與啟動有關,一般保存這個磁盤里面的總容量是多少,【第一個分區開始和結束的扇區】啟動信息、分區表、操作系統的內核所在的地址.....(不考慮)。
?Super Block 表示的就是文件系統,對整個分區管理的數據結構【包括整個文件系統的文件系統名、什么文件系統】。在整個分區里面,不需要給每個分區里都保存Super Block,整個分區里面也不知是只有一個Super Block。混在組的內部里面,可能會存在兩三份,并且里面的數據是完全一樣的。【在整個分區里面,不是每個分組里面都有Super Block ,也絕不是只有其中一個分組里面有Super Block 】
?為什么不是在整個分區里面保存一個Super Block呢?在一個分區里面,若Super Block掛掉了,整個分區的文件系統就全部都沒了!!!分組情況都摸不清了,文件系統里面的整體情況都不知道了。所以會被打散到不同的分組里面,不一定每個分組都有,可能會同時存在兩三份,因此一個Super Block壞掉/出現問題了,我們對應的文件系統就可以直接區其他塊組里面去找對應的Super Block,把Super Block給覆蓋回來,此時就能進行文件系統恢復了。
?文件系統以分區為單位,一個分區,一套文件系統,不同的分區,可以寫不同的文件系統。
?格式化:寫入空的文件系統
磁盤分區--->分組---> 在組里面劃分好相關區域【inode Bitmap、Block Bitmap全部清零....】,劃分的區域是多大... 寫入文件信息?
<4> 理解 文件、目錄、文件系統
? 在一個塊組里面 inode號的個數,block個數都是固定的!【這兩個的占比是最多的】
? 存在 inode Table 用完【存的全部都是小文件】, Data Block沒用完的情況
?關于inode:
? inode只能在特定分區下有效,inode以分區為單位,一套inode;
? 在格式化分區的時候,要格式化出很多分組,其中在分組當中,inode在分配的時候,只需要確定起始inode即可;inode不能跨分區;inode里面有分組;每一個組里面的inode編號是固定的;這些值一般保存到GDT組描述符里面只需要記錄起始inode即可。
Super Block 和 Group Descriptor Table 是兩個固定的數據結構,大小也是固定的。
?關于block:
? 整個分區塊號也是統一編號的;【保存到GDT組描述符里面】
?在一個組里面,我們是如何分配一個inode的?
? 在inode Bitmap一旦確定好開始和結束,起始的inode Bitmap里面是位圖,位圖里面記錄的inode + 組里面分組好的起始inode值 = 新的inode;?這個inode在分區當中具有唯一性;
?在一個組里面,我們是如何分配一個data block的?
? data block也是一樣的,它的塊號也是加上分組好的起始的block值,這些值都在GDT里面;
?inode和data block都是全局建立的;
當塊號不夠的時候,可以進行跨組建立;
OS如何進行管理文件系統?OS對每個Super Block 和 Group Descriptor Table進行 先描述,再組織 來管理文件系統【內存級操作】;【Super Block 和 Group Descriptor Table的數據結構會被加載到內存里】
?如何查找一個文件?
在一個分區里通過inode怎么找到對應的文件呢?根據inode,確定文件在哪個組里面,接著拿著inode減去start_inode,再查inode Bitmap,找到之后inode Table就找到inode,找到了inode就找到了文件的屬性【inode結構】和 塊的映射關系就有了,即就找到了塊號,最終找到內容。
?如何刪除一個文件?
前提條件就是查找,找到之后,把inode Bitmap的位圖直接【由1--置為-->0】,再找到inode屬性和塊的映射關系,拿到了塊號,把 Block Bitmap的位圖直接【由1--置為-->0】,inode就被釋放了,GDT里面記錄的已使用的inode就得減一,最后再把屬性進行更新,就完成了刪除。
?如何修改一個文件?
前提條件就是查找,
修改要么是對屬性進行修改,改掉文件對應的創建時間、文件的大小、文件權限...,拿著文件的inode,按照查找方式,找到文件,把inode加載到內存里,改完再寫回對應的位置,
要么就是對內容進行修改,找到文件,把磁盤內容Data Block加載到內存里【文件的內核緩沖區】,改完之后寫回磁盤,此時對文件的屬性和內容就都能進行修改了。
?如何新增一個文件?
首先要確定在哪一個組里面,操作系統由文件系統自動來進行確定, 遍歷GDT去找,根據要新增文件的基本信息【新增文件的大小、文件名稱、...】找到了對應的一個組,其中就要分配inode號,首先查位圖,找到一個局部性的值【偏移量】,把inode Bitmap、Block Bitmap【由0--置為-->1】,最后給用戶返回一個inode,? start_inode + inode Bitmap里面的偏移量,即返回inode號。
?inode 和 block 究竟是怎么映射的?
?憑什么拿到inode?我們訪問的好像都是文件名!!!【Linux,文件名不在inode中保存】,inode存在哪里?文件類型【文本文件、二進制、普通文件、目錄】,存在自己所處的目錄的數據塊中【數據塊存文件名和映射關系】,
?如何理解目錄文件?
目錄 = inode + block = 屬性 + 內容,內容也要有對應的數據塊!目錄的數據塊里面,存的是文件名和 inode的映射關系,因此我們在查一個文件時,我們只要找到當前目錄,根據目錄的inode,找到目錄的數據塊【data block】,再根據文件名,進行inode映射,找到inode就可以找到屬性和內容。
文件名 和 inode號 是互為映射的,任何目錄不能存在同名文件,文件名 <--映射--> inode ,這就是為什么拿到文件名這個字符串就能找到文件,是因為拿著文件名,【ls命令】操作系統就會在當前目錄下,打開當前目錄,把當前目錄的文件名按字符串查找,找到inode,根據inode號查一個文件,屬性和內容就全有了。
🌠重新理解目錄權限:rwx
? 當我們對一個目錄沒有 r 權限時,我們就查不了這個目錄里面的內容,沒有讀權限,對目錄沒有讀權限時,就無法讀取目錄的data block【內容】,操作系統不讓讀,就得不到文件名和inode的映射關系,拿不到inode就訪問不到文件;
?? 目錄沒有 w 權限,就不能在該目錄新建文件,沒有寫權限就無法把文件名和inode的映射關系的字符串信息、文本信息,寫到目錄數據塊當中。
??目錄沒有 x 權限,就進不去,本質是打不開。
🌠文件類型【文本文件、二進制、普通文件、目錄】,文件名和映射關系是保存在普通文件里面的,在磁盤級文件系統里面的inode Table、Data block、inode Bitmap、Block Bitmap這個層面上不區分文件是普通文件還是目錄,不管是文件還是目錄,在底層都叫inode、data block。
🌠在Linux中,找文件要用inode去找呢?文件名不在inode保存,是保存在當前所處的目錄,所對應的數據塊當中的!!!如果沒有inode我們的文件名就存在屬性里,這時查找文件時,都是按照文件名【字符串】來查找文件的,字符串可長可短,影響查找的效率,而inode是一個整數,效率更高。
🌠 命令"ls -l",在操作系統底層上干了什么?就會把當前目錄在底層上給我們打開,接著遍歷該目錄對應的文件名和inode映射關系,把所有文件的inode全部拿到,接著把每個文件依次在文件系統當中進行查找,根據inode找到inode的值把屬性和文件名進行羅列出來。
🌠 找到文件名,首先要打開當前目錄,當前目錄,也是文件!!也有文件名 ----> 逆向的路徑解析,這就是為什么訪問任何一個文件都要有路徑,沒有路徑就根本不可能找到這個文件,文件名和inode的映射關系就建立不起來,必須要有全路徑,才能在linux內部進行路徑解析,才能找到最終文件名和inode的映射關系。
每一個進程都有一個CWD,?任何目標文件的路徑都是進程給的!!在bash里做的任何操作,都是進程操作,所以進程內部保存了任何文件的CWD,保存了你所要找的CWD,不管你怎么訪問絕對路徑/相對路徑,它都能拼成最終的完整路徑,最終進行路徑解析,方便查找。?
當我們連續對相同路徑下的文件進行訪問【即就是不斷地進行訪問磁盤文件系統】,此時Linux系統,需要進行對路徑結構進行緩存【內存級緩存】!!
Linux系統,在磁盤上不需要維護任何的路徑關系,只需要在數據塊里記錄這個目錄里存的是什么文件和inode的映射關系,?在磁盤上沒有路徑地概念,只要inode、data block,根本就沒有路徑,那么此時路徑是誰在維護呢?1.由進程提供,2.由對應的每個文件的?data block 給我們提供的映射關系,相當于在data block 構建了一張磁盤級簡單的路徑關系【多叉樹】,跟文件系統沒有關系。
Linux要以什么樣的數據結構來緩存路徑呢?多叉樹!!在Linux系統當中,在操作系統加載的時候只需要把根目錄掛上,就能找到相應的路徑,?構建的路徑緩存【占磁盤級文件當中極少,會把用戶曾經訪問過的目錄構建成節點緩存起來,沒有訪問過的目錄就不需要了,所以這個緩存是一個內存級的緩存,這樣我們在內存里就有一個對應的多叉樹的路徑了】,當第一次訪問這個文件時,就構建好了路徑樹,第二次再訪問時,不需要再進行訪問磁盤了,直接查找緩存結構【樹】。
struct dentry,維護的是再Linux當中,幫我們維護一個dentry樹,來進行路徑緩存。
find /home -name test.txt ---- 在磁盤上找這個文件【根據文件路徑去不斷進行路徑解析,去磁盤當中訪問磁盤,從根目錄開始】,find首次找會慢一點,第二次會快,第二次訪問的時候,路徑結構被緩存起來了,dentry會指導我們找到任何一個目錄的inode和內容。
在Linux中,每一個文件【目錄、普通文件....】都要配一個struct dentry{...},因為要把這個文件掛接在這個目錄樹里面,方便進行查找。
🌠宏觀認識:
磁盤上存有很多的文件系統,Linux系統里,默認會在全局當中找到dentry里的根目錄,當想要打開一個文件時,進程就必須給提供一個路徑 【/home/zxl/test.txt】,Linux系統,根據根目錄開始查dentry,dentry打開后,和路徑里的字符串進行比較,找對應的字符串【home ,加載home所對應的屬性inode和內容,在home所對應的內容里找zxl,此時就形成了路徑/home/zxl,再打開zxl數據塊的內容,得到test.txtx的內容和屬性,得到test.txtx的文件名和inode的映射關系[1234]】,此時dentry就會根據路徑所找到文件的inode,在磁盤指定的分區下找[1234]對應的inode,找到后加載到inode的文件屬性里面【磁盤加載到內存】,在內核當中形成dentry結構,構建dentry節點【test.txt】, 最終用dentry構建節點【test.txt】指向inode屬性,要打開【test.txtx】這個文件,內核就要創建struct_file,打開struct_file[文件描述符表]---> struct file? ---> struct path f_path ---> struct dentry ---> 找到所對應的inode, 這個inode就指向加載到屬性里面的inode,再讓struct path里的dentry指向新建的dentry,最后再磁盤上把文件的內容加載到文件內核緩沖區里面【磁盤加載到內存】。
※操作系統內打開一個文件:
? 創建內核數據結構
? 再磁盤當中讀取數據加載數據到內存,構建對應的映射關系
? 加載內容、加載文件的inode、添加路徑關系到Linux系統內部的路徑緩存dentry當中
<5> 做一個小實驗
$ dd if=/dev/zero of=./disk.img bs=1M count=5 #制作?個?的磁盤塊,就當做?個分區 $ mkfs.ext4 disk.img # 格式化寫??件系統 $ mkdir /mnt/mydisk # 建?空?錄 $ df -h # 查看可以使?的分區 Filesystem Size Used Avail Use% Mounted on udev 956M 0 956M 0% /dev tmpfs 198M 724K 197M 1% /run /dev/vda1 50G 20G 28G 42% / tmpfs 986M 0 986M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 986M 0 986M 0% /sys/fs/cgroup tmpfs 198M 0 198M 0% /run/user/0 tmpfs 198M 0 198M 0% /run/user/1002 $ sudo mount -t ext4 ./disk.img /mnt/mydisk/ # 將分區掛載到指定的?錄 $ df -h Filesystem Size Used Avail Use% Mounted on udev 956M 0 956M 0% /dev tmpfs 198M 724K 197M 1% /run /dev/vda1 50G 20G 28G 42% / tmpfs 986M 0 986M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 986M 0 986M 0% /sys/fs/cgroup tmpfs 198M 0 198M 0% /run/user/0 tmpfs 198M 0 198M 0% /run/user/1002 /dev/loop0 4.9M 24K 4.5M 1% /mnt/mydisk $ sudo umount /mnt/mydisk # 卸載分區 whb@bite:/mnt$ df -h Filesystem Size Used Avail Use% Mounted on udev 956M 0 956M 0% /dev tmpfs 198M 724K 197M 1% /run /dev/vda1 50G 20G 28G 42% / tmpfs 986M 0 986M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 986M 0 986M 0% /sys/fs/cgroup tmpfs 198M 0 198M 0% /run/user/0 tmpfs 198M 0 198M 0% /run/user/1002
怎么確認在哪一個分區里面?--> 訪問任何一個文件都要有路徑,路徑的前綴就可以指明在哪一個分區上!!
多個分區 --> 一個分區包含/ --> 若干個普通目錄 --> /a /b /c /d...
只要分區,該分區無法直接使用,分區必須經過“掛載”到目錄上,分區才可以被用通過路徑的方式進行訪問!
?任何一個分區,天然就有了基本的路徑了!【路徑一部分是掛載點提供的,一部分是自己產生的】
二、軟硬連接
🌟軟硬鏈接
🌠軟鏈接:
? 軟連接是一個獨立的文件,有獨立的 inode,軟鏈接內容上,保存的是目標文件的路徑【window上的快捷方式】;
? 在用戶層 使用軟連接【file-soft.link】 等同于 使用目標文件【file.txt】
??ln -s file.txt file-soft.link 【后者去鏈接前者】
? 當我們建立軟鏈接,就是在當前目錄下新建一個軟鏈接文件/快捷方式。
🌠硬鏈接:
??硬鏈接不是獨立的文件!【沒有獨立的inode】,硬鏈接本質就是一組文件名和已經存在的文件的映射關系!
??ln file.txt file-hard.link?【后者去鏈接前者】
??當我們建立一個硬鏈接,就是再當前目錄所處的目錄內部當中,新增一個新的文件名和inode對應的映射關系,所以硬鏈接所查到的 inode 和 目標文件的 inode 是一樣的。?
? 在當前目錄下新建一個普通文件,普通文件的文件名在文件所處目錄的內容中保存,硬鏈接會映射到同一個 inode【inode 特別像一個指針一樣的東西】,當我們想使用文件名來找對應文件時,Linux是通過inode去找文件的,硬鏈接使得兩個文件名指向同一個inode文件, 此時這個文件如何才算是刪除呢?在整個系統里沒有任何文件名字符串和這個文件inode有映射關系時,才算是被刪除,我們如何知道有多少個文件名通過和inode號來產生對應的映射關系呢?在inode當中存在一個引用計數【atomic_t d_count;】硬鏈接數。
? 建立一個普通文件本質上就是在不斷地進行建立硬鏈接【文件名和inode的映射關系只有一份,所以數字就會減一】
🌟理解軟硬鏈接的應用場景
?軟鏈接
可執行文件在當前目錄上,如何不帶路徑就可以直接執行文件呢?
1> 環境變量:把當前的所處的路徑添加到系統環境變量里;
2> 把 .exe可執行文件,拷貝到系統的默認路徑下;
3> 給對應的可執行程序重新進行命名,建立軟鏈接:
? 作用:當被執行的可執行程序放在比較深的目錄下【路徑很長】時,可以在深得路徑下,建立軟鏈接,也可以給目錄進行軟鏈接,直接一步進入想要進的目錄里面。
主要是能讓我們快速定位某一個文件,以最簡單的方式進入。
一般在一個磁盤分區里面,軟鏈接建在哪里都可以。
? 軟鏈接:快捷方式,可以幫我們快速找到指令和對應的庫。
?硬鏈接
? “.” [文件名] 所映射的inode編號,和當前所處的【/empty】目錄inode編號是一樣的,文件名不同【.? ?empty】但指向的inode是一樣的,所以 “.” 就表示當前工作路徑,所以在創建一個空目錄時,一個是它自己【有一個文件名和inode有映射關系】。
“.”和 “..”目的是為了路徑的快速切換,如何做到的呢?本質就是 文件所指向的inode就是上級路徑,因此當 cd? 切換路徑時,要找到目標路徑的inode,方便顯式目標路徑里面的文件。
??文件備份!(就可以不用拷貝,也能找到內容)
???????
? Linux下不允許對目錄新建硬鏈接!!!【原因:怕進行硬鏈接之后,形成一些環狀路徑】
軟鏈接【直接指向文件,里面保存的時路徑字符串】,我們在進行查找軟鏈接時,并不會對軟鏈接做任何解析。?
???????