溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux硬鏈接和軟鏈接的示例分析

發(fā)布時間:2022-02-22 09:13:02 來源:億速云 閱讀:189 作者:小新 欄目:建站服務器

這篇文章主要介紹linux硬鏈接和軟鏈接的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

前言

最近前端包管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之后,發(fā)現(xiàn)pnpm整個架構都是基于硬鏈接和軟鏈接組織的,但我對這兩個概念比較模糊,所以想研究一下。

眾所周知,Unix/Linux系統(tǒng)中一切皆文件??梢姡募贚inux系統(tǒng)中非常重要。我們平常比較直觀的對于文件的感受肯定是文件名和文件內容。但在Linux的文件系統(tǒng)中,除了文件名和文件內容,還有一個很重要的概念,就是inode。

linux硬鏈接和軟鏈接的示例分析

inode

維基百科這樣描述inode:

The inode (index node) is a data structure in a Unix-style file system that describes a file-system object such as a file or a directory. Each inode stores the attributes and disk block locations of the object's data.File-system object attributes may include metadata (times of last change,access, modification), as well as owner and permission data.

A directory is a list of inodes with their assigned names. The list includes an entry for itself, its parent, and each of its children.

意思就是:inode是類Unix文件系統(tǒng)中用來描述文件系統(tǒng)對象(比如文件或文件夾)的一種數(shù)據(jù)結構。它存儲著文件的各種屬性(最近一次inode變動的時間、最近一次訪問的時間、最近一次修改的時間等元信息,以及權限信息等)。文件夾是一組inode,包括自身的入口、父節(jié)點的入口以及所有子節(jié)點。

其實,inode包含的內容不止上面這些,具體有:

  • 文件的字節(jié)數(shù)

  • 文件的User ID

  • 文件的Group ID

  • 文件的讀、寫、執(zhí)行權限

  • 時間戳:ctime,inode上一次變動的時間;mtime,文件內容上一次變動的時間;atime,文件上一次打開的時間

  • 鏈接數(shù),即有多少個文件名指向這個inode

  • 文件數(shù)據(jù)block的位置

Linux使用的ext2/ext3文件系統(tǒng)中,不同類型的數(shù)據(jù)存放在不同的區(qū)域。inode組成的inode table存放在一個位置,文件數(shù)據(jù)塊則存在另外一個位置。

inode不包含文件名,文件名存放在文件夾信息的結構體里。文件名相當于inode的別名,便于我們管理和記憶。Linux系統(tǒng)對文件的操作都是通過inode做到的,當我們修改文件時,系統(tǒng)從文件夾的信息結構體里找到文件名對應的inode,再通過存儲在inode中的文件數(shù)據(jù)block地址找到對應的硬盤位置進行讀寫操作。

linux硬鏈接和軟鏈接的示例分析

硬鏈接

一般來說,inode與文件名、文件數(shù)據(jù)是一對一的關系,但我們可以通過shell命令讓多個文件名指向同一個inode,這種就是硬鏈接(hard link)。

使用ln <origin> <destination>命令可以創(chuàng)建硬鏈接,如

ln test.txt test_hard.txt

對應nodejs的fs.link方法。

創(chuàng)建硬鏈接前,test.txt可以這樣表示:

linux硬鏈接和軟鏈接的示例分析

創(chuàng)建硬鏈接后:

linux硬鏈接和軟鏈接的示例分析

可以看到,test_hard.txt的inode跟源文件test.txt使用的是同一個,只是現(xiàn)在鏈接數(shù)變成2了。

我們可以執(zhí)行l(wèi)s -li查看一下。

linux硬鏈接和軟鏈接的示例分析

第一列是inode number,可以看到都是13029546,所以兩個文件使用的是同一個inode。第二列是權限信息,第四列是擁有者,第六列是文件內容大小??梢钥吹?,除了文件名不一樣之外,硬鏈接創(chuàng)建的文件跟源文件的所有元信息完全一樣。第三列表示鏈接數(shù),可以看到,目前鏈接數(shù)為2。

由于硬鏈接文件和源文件使用同一個inode,并指向同一塊文件數(shù)據(jù),除文件名之外的所有信息都是一樣的。所以這兩個文件是等價的,可以說是互為硬鏈接文件。修改任意一個文件,可以看到另外一個文件的內容也會同步變化。

軟鏈接

準確來說叫符號鏈接(symbolic link),一般又叫軟鏈接(soft link)。與硬鏈接共用一個inode不同,軟鏈接會創(chuàng)建新的inode,并指向源文件??梢岳斫廛涙溄泳褪莣indows系統(tǒng)中的桌面快捷方式。

創(chuàng)建軟鏈接的命令和硬鏈接很像,多了-s參數(shù):ln -s <origin> <destination>:

ln -s test.txt test_symbolic.txt

對應的nodejs的fs.symlink方法。

創(chuàng)建軟鏈接之后:

linux硬鏈接和軟鏈接的示例分析

源文件inode的鏈接數(shù)還是1,創(chuàng)建了新的inode,軟鏈接指向源文件。

執(zhí)行l(wèi)s -li看一下:

linux硬鏈接和軟鏈接的示例分析

可以看到,軟鏈接的inode number跟源文件的不一樣,權限一列開頭為小寫L,表示軟鏈,鏈接數(shù)為1,大小為8個字節(jié)。沒錯,軟鏈文件也有大小,不過一般很小,畢竟只是一個快捷方式。

對比

文件重命名或文件移動

文件重命名和文件移動對于Linux系統(tǒng)來說都是文件絕對路徑的更改。對硬鏈接來說,文件重命名或文件移動不會改變鏈接指向,而對軟鏈接來說,文件重命名或文件移動則使鏈接斷開,這時通過軟鏈接修改文件內容時會重新創(chuàng)建一個新的inode,跟原文件名和文件數(shù)據(jù)塊關聯(lián)。

文件刪除

rm命令或者nodejs的unlink其實是將inode的鏈接數(shù)減1。對于前文的硬鏈接,刪除test_hard.txt使得inode1的鏈接數(shù)變成1,當鏈接數(shù)變成0時,系統(tǒng)就會釋放掉這個inode,之后再創(chuàng)建的新文件就可以使用該inode的inode number了。這時沒有inode指向文件數(shù)據(jù)block,所以文件找不到了。但實際上文件數(shù)據(jù)還存在硬盤中,所以經(jīng)常能看到網(wǎng)上有一些幫助恢復誤刪的文件的工具。軟鏈接inode鏈接數(shù)為1,刪除軟鏈接則系統(tǒng)釋放該inode。

鏈接文件和文件夾

軟鏈接可以鏈接文件和文件夾,但硬鏈接只能鏈接文件。

不同文件系統(tǒng)創(chuàng)建鏈接

軟鏈接可以跨不同的文件系統(tǒng)創(chuàng)建,但是硬鏈接不行,因為硬鏈接是共用一個inode,而不同的文件系統(tǒng)有不同的inode table。

應用場景

硬鏈接

  • 文件備份:為了防止重要的文件被誤刪,文件備份是一種好的辦法,但拷貝文件會帶來磁盤空間的消耗。硬鏈接能不占用磁盤空間實現(xiàn)文件備份。

  • 文件共享:多人共同維護同一份文件時,可以通過硬鏈接的方式,在私人目錄里創(chuàng)建硬鏈接,每個人的修改都能同步到源文件,但又避免某個人誤刪就丟掉了文件的問題。

  • 文件分類:不同的文件資源需要分類,比如某個電影即是的分類是外國、懸疑,那我們可以在外國的文件夾和懸疑的文件夾里分別創(chuàng)建硬鏈接,這樣可以避免重復拷貝電影浪費磁盤空間。有人可能說,使用軟鏈接不也可以嗎?是的,但不太好。因為一旦源文件移動位置或者重命名,軟鏈接就失效了。

軟鏈接

  • 快捷方式:對于路徑很深的文件,查找起來不太方便。利用軟鏈接在桌面創(chuàng)建快捷方式,可以迅速打開并編輯文件。

  • 靈活切換程序版本:對于機器上同時存在多個版本的程序,可以通過更改軟鏈接的指向,從而迅速切換程序版本。這里提到了python版本的切換可以這么做。

  • 動態(tài)庫版本管理:不是很懂,具體可以看這里。

總結

Linux系統(tǒng)通過inode管理文件,inode存儲著文件字節(jié)數(shù)、文件權限、鏈接數(shù)、數(shù)據(jù)block位置等信息。

硬鏈接與源文件共用inode,除了文件名不同,其他與源文件一樣。不能對文件夾創(chuàng)建硬鏈接,不能對不同的文件系統(tǒng)的文件創(chuàng)建硬鏈接。

軟鏈接類似于windows的快捷方式,有獨立的inode。可以對文件夾或不同文件系統(tǒng)的文件創(chuàng)建軟鏈接。

硬鏈接和軟鏈接修改文件內容都會同步到源文件,因為本質上它們都是指向源文件的數(shù)據(jù)block。

以上是“l(fā)inux硬鏈接和軟鏈接的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI