一.軟硬鏈接操作
1.軟連接
touch 創建一個文件file.txt ,對該文件創建對應的軟鏈接改怎么做呢?
ln? -s? file.txt? file-soft.link?.給對應文件創建軟連接。
軟連接本質就是一個獨立的文件,因為我們對應的軟連接有獨立的inode,他和他指向的file.txt的inode是不同的。
如下圖:
我們把字符串寫入file.txt中,查看兩個文件的內容,都能看到該字符串,說明實際在用戶層使用我們的軟連接,等同于我們的目標文件。軟鏈接是通過名字引?另外?個?件,但實際上,新的?件和 被引?的?件的inode不同
2.硬鏈接
硬鏈接的使用方法,對文件file.txt怎么創建硬鏈接?
ln? file.txt? file-head.link.給對應的文件創建硬鏈接。
硬鏈接本質上不是一個獨立的文件,沒有獨立的inode,而是相同的inode,不同的文件文件名。
在Linux中可以讓多個文件名指向同一個inode。
如上面圖片所示,權限后面這個數字是什么呢?沒創建硬鏈接時,數字為1,創建硬鏈接后數字變成2,這個我們先引出來,后面說!!
Linux中搞懂操作是沒什么用的,就跟之前創建進程,等待進程,說了操作,接口講完沒有用,最關鍵的是他在干什么?下面我們來認識如何理解軟硬鏈接!!!
二.如何理解軟硬鏈接
a.軟硬鏈接有獨立的inode,所以一定要有獨立的屬性和內容,軟鏈接內容上,保存的是目標文件的路徑,在Windows中,相當于一個軟件在桌面上的快捷方式,所以平時用的這些快捷方式也是一個軟連接文件,Linux中,軟連接就是指向文件的快捷方式!!
b.硬鏈接,不是獨立的文件,沒有獨立的inode,硬鏈接本質就是一組文件名和已經已經存在的文件的inode的映射關系!!!
c.所以當我們建立了軟連接,就是相當于在當前目錄下建立了一個軟連接文件,快捷方式,而其中,我們建立一個硬鏈接,就是在我們當前所處的目錄當中新增加一個文件名和要鏈接文件的inode的映射關系,所以最終,我們就會發現,這個硬鏈接文件,他所查到的inode和目標文件inode是一樣的了,這個就是硬鏈接!!!
d.文件權限后面對應的數字是什么呢?創建硬鏈接文件前,目標文件數字為1,創建硬鏈接文件后,目標文件變成2?
根據前面講的文件系統內容,知道了,一個目錄也是文件,他的內容保存的是該目錄下文件的文件名和inode的映射關系,所以在我們當前目錄中,新建一個普通文件,題目文件名不在inode中保存,普通文件的文件名是在我們的文件所處的目錄文件他的內容中保存的,創建一個硬鏈接文件,換句話說,就是在當前目錄中有兩個文件名,他們兩個都會映射到同一個inode,這像什么呢?inode特別像一個指針一樣的東西,所以當我們想使用文件名找文件的時候,我們都知道Linux下是通過inode找文件,兩個文件的inode相同,所以本質上就是相當于有兩個文件名指向同一個inode,換句話說,我作為一個inode,作為一個文件,什么時候在系統上算真正的刪除呢?是不是要在整個系統里,沒有任何文件名字符串和我這個文件inode的有映射關系時,也就是這個文件沒有名字了,這個時候對應的文件就應該被刪除了,可是我們怎么知道有多少個文件名通過ionde編號,來和我對應的文件的inode來產生關系呢?答案是在我們inode中,存在一個引用計數的東西,int ret_count,也就是說,今天在一個特定的目錄下有一個文件名映射的inode是該文件,ret_count就會++,再有一個文件名和這個文件inode有映射關系,再++,所以我們對應的這個數字,稱之為inode本身的引用計數,被稱之為硬鏈接數!!!
e.如果我們對目標文件進行刪除會怎么樣?
對目標文件進行刪除,硬鏈接還在,里面的內容還能打印出來,這個文件并沒有被刪除,所以這個刪除做了一個什么工作?對目標文件進行重命名的工作,所有平時建立一個普通文件本質上都在不斷進行建立硬鏈接,建立一個文件,本質就是硬鏈接文件,因為你的文件名和你的inode映射關系就相當于一份,所以刪除,目標文件就減少一份,再把剩余的硬鏈接刪除掉,引用計數變為0,文件系統中就會把你對應的這個inode直接刪掉了。
刪除目標文件,軟鏈接就會變紅,因為軟鏈接文件中存的是目標文件的路徑,目標文件找不到,軟連接也就找不到了。
總結:
其實軟鏈接說到底,其實就相當于,軟鏈接就是一個普通文件,他的內容保存的是目標文件的路徑,所以目標文件刪除了變成紅色,是因為這個軟鏈接文件保存的目標文件的路徑沒有了,找不到了,而所謂的硬鏈接就相當于在當前目錄下保存一下文件名和inode的映射關系,沒有創建新的文件。
三.為什么要有軟硬鏈接呢?各種應用場景
軟鏈接:
?a.如果我們創建一個可執行程序code.exe,在命令行上要執行該文件是? ./code.exe 如果我們想要? ./code? 就直接可以執行,我們該怎么辦?
之前說過,可以把當前路徑增加到環境變量或者把可執行文件拷貝到系統默認路徑下,就可以不帶? ./? 直接執行。
現在我們學了軟鏈接,就可以在當前路徑下直接創建軟鏈接:
ln -s code.exe code這樣就創建了一個軟鏈接,就直接可以? ./code? 直接執行該可執行程序。
如果想不加? ./? 呢?
可以在 /usr/bin/ 路徑下建立軟鏈接,/usr/bin/ 是系統存放可執行文件的默認路徑,這樣就直接進行code就可以執行,創建快捷方式,直接建立軟鏈接,就可以指向目標程序了。
刪除一個軟鏈接文件:一個rm? 一個unlink
b.如果可以執行程序藏在一個比較深的路徑下,比如 ./dir1/dir2/dir3/ 里,我們要在當前所處的路徑使用可執行程序,就必須帶一串路徑,所以我們可以在當前路徑下創建軟鏈接。
c.我們也可以給一個目錄形成一個軟鏈接,比如? /usr/inlude/? 我想查看頭文件,就可以給這個目錄創建一個軟鏈接。
d.軟鏈接就是為了快速定位文件,以最簡單的方式進入!!!
e.作用:快捷方式
? ?最主要用途:快速找到指令,快速找到對應的庫
?硬鏈接:
?a.在一個目錄里創建一個普通文件和一個目錄,普通文件的引用計數是1,是因為在當前目錄中只有一個文件名與該inode有映射關系,那為什么新建一個目錄,他的引用計數是2呢?進入這個目錄中,再新建一個目錄,引用計數為什么變成3了呢?
因為在目錄里面有一個? .? 文件和? ..? 文件,之前說過,一個點表示當前目錄,兩個點表示上級目錄,那么一個點憑什么表示當前目錄他自己,一個點他是一個文件名,他所映射的inode和當前所處的目錄的映射的inode是一樣的!!文件名不同但指向的文件是一樣的,所以一個點就表示當前工作路徑,所以再在新建的目錄中創建一個新目錄,里面有兩個點的文件名,他映射的inode與上級目錄映射的inode相同,所以此時就有三個文件名指向同一個文件,所以,引用計數是3,所以我們在Linux中,在每一個目錄下都要有一個? .? 和? ..? 呢?就是為了進行路徑切換!!!
b.創建一個文件,在一個目錄比如 /tmp/ 下,給這個文件創建一個硬鏈接,這時,如果誤操作,把原本文件進行了刪除,但是沒關系,因為我們在特定的路徑下,有一個該文件的硬鏈接文件,我們照樣可以通過該硬鏈接文件拿到該文件的內容,這意味著什么?這意味著,在Linux下,對文件做備份,只需要建立硬鏈接文件就可以了,不需要拷貝了!!!?
c.我們現在可以對普通文件做硬鏈接,那么我們可不可以對目錄進行建立硬鏈接呢?
Linux中,不允許對目錄新建硬鏈接文件,因為主要怕,新建硬鏈接形成一些環狀路徑,進而導致系統出現問題,但是目錄里面? .? 和 ..? 不都是當前目錄和上級目錄的硬鏈接文件嗎?這該怎么理解呢?不怎么理解,因為這是Linux特殊進行處理的!!!?
目錄創建硬鏈接形成環狀路徑的危害
- 文件系統遍歷異常:文件系統的遍歷算法通常是基于樹形結構進行的,假設可以對目錄創建硬鏈接形成環狀路徑,當系統或應用程序嘗試遍歷目錄樹時,就可能陷入無限循環,無法正常完成遍歷操作,導致程序掛起甚至系統崩潰。
- 元數據更新混亂:目錄的硬鏈接會使得目錄的元數據(如目錄的鏈接數、修改時間等)管理變得極為復雜且容易出現混亂。例如,當通過一個硬鏈接對目錄進行修改時,很難確定應該如何正確更新其他硬鏈接所指向的同一目錄的元數據,可能導致文件系統的元數據不一致,進而影響文件系統的穩定性和可靠性。
- 權限管理復雜:在 Linux 中,權限是基于文件和目錄的 inode 進行管理的。如果存在目錄硬鏈接形成的環狀結構,權限的繼承和傳播會變得非常復雜,可能導致權限漏洞或錯誤的權限設置,威脅系統安全。