文件系統 軟硬連接

?🌻個人主頁:路飛雪吖~

? ? ? ?🌠專欄: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下不允許對目錄新建硬鏈接!!!【原因:怕進行硬鏈接之后,形成一些環狀路徑】

軟鏈接【直接指向文件,里面保存的時路徑字符串】,我們在進行查找軟鏈接時,并不會對軟鏈接做任何解析。?

???????

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901873.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901873.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901873.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單片機 | 基于51單片機的自動循跡小車設計

以下是一個基于51單片機的自動循跡小車設計詳解,包含原理、公式和完整代碼: 一、系統原理 核心模塊: 傳感器:紅外對管(TCRT5000)x4主控芯片:STC89C52RC(51單片機)電機驅動:L298N驅動模塊電源:7.4V鋰電池(電機) + 5V穩壓(單片機)工作原理: 紅外對管發射紅外線,…

2025.04.17【Stacked area】| 生信數據可視化:堆疊區域圖深度解析

文章目錄 生信數據可視化&#xff1a;堆疊區域圖深度解析堆疊面積圖簡介為什么使用堆疊面積圖如何使用R語言創建堆疊面積圖安裝和加載ggplot2包創建堆疊面積圖的基本步驟示例代碼 解讀堆疊面積圖堆疊面積圖的局限性實際應用案例示例&#xff1a;基因表達量隨時間變化 結論 生信…

基于單片機的智能養生油炸爐系統設計與實現

標題:基于單片機的智能養生油炸爐系統設計與實現 內容:1.摘要 本文針對傳統油炸爐功能單一、無法滿足現代養生需求的問題&#xff0c;設計并實現了基于單片機的智能養生油炸爐系統。通過采用STC89C52單片機作為控制核心&#xff0c;結合溫度傳感器、液位傳感器、繼電器等硬件&…

QML與C++:基于ListView調用外部模型進行增刪改查(附自定義組件)

目錄 引言相關閱讀項目結構文件組織 核心技術實現1. 數據模型設計聯系人項目類 (datamodel.h)數據模型類 (datamodel.h)數據模型實現 (datamodel.cpp) 2. 主程序入口點 (main.cpp)3. 主界面設計 (Main.qml)4. 聯系人對話框 (ContactDialog.qml)5. 自定義組件CustomTextField.qm…

【MySQL】事務ACID理解記憶

事務的 ACID 特性詳解 數據庫中的 事務&#xff08;Transaction&#xff09; 是一組操作的集合&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行。為了保證事務可靠執行&#xff0c;必須滿足 ACID 四大特性&#xff1a; 特性英文縮寫簡要說明原子性Atomicity事務…

MYSQL “Too Many Connections“ 錯誤解決

1.查詢當前連接數 show status like "Threads_connected"; 2.查詢數據庫最大連接數 show variables like "max_connections" 3.查詢所有活動連接 show processlist; 4.根據查詢結果觀察是否有長時間未被釋放的連接 參數解釋 : 字段說明id連接的唯一…

Python爬蟲實戰:基于 Scrapy 框架的微博數據爬取研究

一、引言 1.1 研究背景 在當今數字化時代,社交媒體已成為信息傳播和公眾交流的重要平臺。微博作為國內極具影響力的社交媒體之一,每日產生海量的用戶生成內容,涵蓋新聞資訊、社交互動、娛樂八卦、熱點話題討論等多個領域。這些數據不僅反映了公眾的興趣偏好、情感態度和社…

貓咪如廁檢測與分類識別系統系列【九】視頻檢測區域在線繪制+支持攝像頭+網絡攝像頭+整體構建【上】

前情提要 家里養了三只貓咪&#xff0c;其中一只布偶貓經常出入廁所。但因為平時忙于學業&#xff0c;沒法時刻關注牠的行為。我知道貓咪的如廁頻率和時長與健康狀況密切相關&#xff0c;頻繁如廁可能是泌尿問題&#xff0c;停留過久也可能是便秘或不適。為了更科學地了解牠的如…

【AI插件開發】Notepad++ AI插件開發實踐:支持多平臺多模型

引言 上篇文章我們的Notepad插件介紹到Dock窗口集成&#xff0c;本篇將繼續完善插件功能&#xff0c;主要包括兩個部分&#xff1a; 支持多平臺、多模型支持多種授權驗證、接口類型 一、多平臺 原先的配置項很簡單&#xff1a; // PluginConf.h class PlatformConf { publ…

【C#】Socket通信的使用

在C#中&#xff0c;Socket通信是一種用于實現網絡通信的底層技術。通過Socket&#xff0c;程序可以在網絡上與其他設備進行數據交換。以下是如何使用C#中的System.Net.Sockets命名空間來實現Socket通信的詳細步驟。 1. Socket通信的基本概念 Socket: 一個Socket是網絡通信的端…

2024年第九屆團隊程序設計天梯賽c++題解L1-L3-1(附PTA網址)

L1-1 編程解決一切 5分 L1-097 編程解決一切 - 團體程序設計天梯賽-練習集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水觸摸芯片 - 復雜環境下精準交互,提升觸控體驗

▍核心優勢 ◆ 超強抗干擾能力 ◆ 工業級設計&#xff0c;一致性和穩定性好 ▍提供場景化解決方案 【智能廚電矩陣】抽油煙機檔位調節 | 電磁爐火力觸控 | 洗碗機模式切換 【衛浴設備方案】淋浴房霧化玻璃控制 | 智能馬桶觸控面板 | 浴缸水位感應 【工業控制應用】儀器儀…

Golang|抽獎相關

文章目錄 抽獎核心算法生成抽獎大轉盤抽獎接口實現 抽獎核心算法 我們可以根據 單商品庫存量/總商品庫存量 得到每個商品被抽中的概率&#xff0c;可以想象這樣一條 0-1 的數軸&#xff0c;數軸上的每一段相當于一種商品&#xff0c;概率之和為1。 抽獎時&#xff0c;我們會生…

OpenCV 圖形API(43)顏色空間轉換-----將 BGR 圖像轉換為 LUV 色彩空間函數BGR2LUV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從BGR色彩空間轉換為LUV色彩空間。 該函數將輸入圖像從BGR色彩空間轉換為LUV。B、G和R通道值的傳統范圍是0到255。 輸出圖像必須是8位無符…

【Python】用Python寫一個俄羅斯方塊玩玩

【Python】用Python寫一個俄羅斯方塊玩玩 一、引言1.成品效果展示 二、思考準備1.思考設計2.代碼設計2.1 游戲頁面2.2 控件設計2.2.1 方塊生成2.2.2 方塊碰撞2.2.3 方塊消融2.2.4 游戲主循環2.2.5 游戲窗口 三、游戲完整版 一、引言 今日看到侄子在玩游戲&#xff0c;湊近一看…

維港首秀!沃飛長空AE200亮相香港特別行政區

4月13日-16日&#xff0c;第三屆香港國際創科展在香港會議展覽中心盛大舉辦。 作為國內領先、國際一流的eVTOL主機廠&#xff0c;沃飛長空攜旗下AE200批產構型登陸國際舞臺&#xff0c;以前瞻性的創新技術與商業化應用潛力&#xff0c;吸引了來自全球17個國家及地區的行業領袖…

Openfein實現遠程調用的方法(實操)

文章目錄 環境準備一、URL中接收參數二、接收一個參數三、接收多個參數四、傳遞對象五、傳遞JSON格式數據 環境準備 下面的配置&#xff0c;服務調用方加入即可。 依賴導入&#xff1a; <!-- openfeign依賴--><dependency><groupId>org.springframe…

Bright+Data網頁解鎖器:旅游行業數據革命的“隱形引擎”

在數字經濟浪潮中&#xff0c;旅游行業正經歷前所未有的變革。當消費者指尖滑動間完成跨國酒店預訂&#xff0c;當航空公司每秒調整萬次艙位價格&#xff0c;背后是一場無聲的數據戰爭。而在這場戰爭中&#xff0c;BrightData網頁解鎖器正成為旅游企業破局的關鍵武器——它像一…

OpenCV 圖形API(38)圖像濾波-----Sobel 算子操作函數Sobel()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::gapi::Sobel 函數是 OpenCV 的 G-API 模塊中用于執行 Sobel 算子操作的一個函數&#xff0c;主要用于圖像的邊緣檢測。Sobel 算子通過計算圖…

CS5346 - Interactivity in Visualization 可視化中的交互

文章目錄 Visualization representation interactionInteraction &#xff08;交互&#xff09;Benefits (好處)Typical Interaction Techniques&#xff08;交互技術&#xff09;SelectFilteringAbstract / Elaborate幾何放縮&#xff08;Geometric zoom)語義放縮&#xff0…