首頁 > 運維 > linux運維 > 主體

帶你搞懂linux硬連結和軟連結(圖文詳解)

WBOY
發布: 2022-02-21 17:50:01
轉載
4185 人瀏覽過

這篇文章為大家帶來了關於Linux中硬連結和軟連結的相關知識,其中還有inode的相關問題,希望對大家有幫助。

帶你搞懂linux硬連結和軟連結(圖文詳解)

前言

最近前端套件管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之後,發現pnpm整個架構都是基於硬連結和軟連結組織的,但我對這兩個概念比較模糊,所以想研究一下。

眾所周知,Unix/Linux系統中一切皆檔案。可見,檔案在Linux系統中非常重要。我們平常比較直觀的對於文件的感受肯定是文件名和文件內容。但在Linux的檔案系統中,除了檔案名稱和檔案內容,還有一個很重要的概念,就是inode。

帶你搞懂linux硬連結和軟連結(圖文詳解)

inode

維基百科這樣描述inode:

The inode (index node) is a data structure in a Unix -style file 系統。 ), 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.

children.
#意思是:inode是類別Unix檔案系統中用來描述檔案系統物件(例如檔案或資料夾)的一種資料結構。它儲存著檔案的各種屬性(最近一次inode變動的時間、最近一次存取的時間、最近一次修改的時間等元信息,以及權限資訊等)。資料夾是一組inode,包括自身的入口、父節點的入口以及所有子節點。

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

  • 檔案的位元組數

  • ##」檔的User ID
  • 檔案的Group ID
  • #檔案的讀取、寫入、執行權限
  • ##時間戳:ctime,inode上一次變動的時間;mtime,文件內容上一次變動的時間;atime,文件上一次開啟的時間
  • 連結數,即有多少文件名指向這個inode
  • 檔案資料block的位置
  • #Linux所使用的ext2/ext3檔案系統中,不同類型的資料存放在不同的區域。 inode組成的inode table存放在一個位置,檔案資料塊則存在另外一個位置。
inode不包含檔案名,檔案名稱存放在資料夾資訊的結構體裡。檔案名稱相當於inode的別名,方便我們管理和記憶。 Linux系統對檔案的操作都是透過inode做到的,當我們修改檔案時,系統從資料夾的資訊結構體裡找到檔案名稱對應的inode,再透過儲存在inode中的檔案資料block位址找到對應的硬碟位置進行讀寫操作。

硬連結帶你搞懂linux硬連結和軟連結(圖文詳解)

一般來說,inode與檔案名稱、檔案資料是一對一的關係,但我們可以透過shell指令讓多個檔案名稱指向同一個inode,這種就是硬連結(hard link)。

使用ln 指令可以建立硬鏈接,如

ln test.txt test_hard.txt
登入後複製

對應nodejs的fs.link方法。

在建立硬連結前,test.txt可以這樣表示:

#建立硬連結後:帶你搞懂linux硬連結和軟連結(圖文詳解)

可以看到,test_hard.txt的inode跟來源檔test.txt使用的是同一個,只是現在連結數變成2了。 帶你搞懂linux硬連結和軟連結(圖文詳解)

我們可以執行ls -li查看一下。

第一列是inode number,可以看到都是13029546,所以兩個檔案使用的是同一個inode。第二列是權限訊息,第四列是擁有者,第六列是檔案內容大小。可以看到,除了檔案名稱不一樣之外,硬連結建立的檔案跟來源檔案的所有元資訊完全一樣。第三列表示連結數,可以看到,目前連結數為2。 帶你搞懂linux硬連結和軟連結(圖文詳解)

由於硬連結檔案和來源檔案使用同一個inode,並指向同一塊檔案數據,除檔案名稱之外的所有資訊都是一樣的。所以這兩份文件是等價的,可以說是互為硬連結檔。修改任一文件,可以看到另外一個文件的內容也會同步改變。

软链接

准确来说叫符号链接(symbolic link),一般又叫软链接(soft link)。与硬链接共用一个inode不同,软链接会创建新的inode,并指向源文件。可以理解软链接就是windows系统中的桌面快捷方式。

创建软链接的命令和硬链接很像,多了-s参数:ln -s

ln -s test.txt test_symbolic.txt
登入後複製

对应的nodejs的fs.symlink方法。

创建软链接之后:

帶你搞懂linux硬連結和軟連結(圖文詳解)

源文件inode的链接数还是1,创建了新的inode,软链接指向源文件。

执行ls -li看一下:

帶你搞懂linux硬連結和軟連結(圖文詳解)

可以看到,软链接的inode number跟源文件的不一样,权限一列开头为小写L,表示软链,链接数为1,大小为8个字节。没错,软链文件也有大小,不过一般很小,毕竟只是一个快捷方式。

对比

文件重命名或文件移动

文件重命名和文件移动对于Linux系统来说都是文件绝对路径的更改。对硬链接来说,文件重命名或文件移动不会改变链接指向,而对软链接来说,文件重命名或文件移动则使链接断开,这时通过软链接修改文件内容时会重新创建一个新的inode,跟原文件名和文件数据块关联。

文件删除

rm命令或者nodejs的unlink其实是将inode的链接数减1。对于前文的硬链接,删除test_hard.txt使得inode1的链接数变成1,当链接数变成0时,系统就会释放掉这个inode,之后再创建的新文件就可以使用该inode的inode number了。这时没有inode指向文件数据block,所以文件找不到了。但实际上文件数据还存在硬盘中,所以经常能看到网上有一些帮助恢复误删的文件的工具。软链接inode链接数为1,删除软链接则系统释放该inode。

链接文件和文件夹

软链接可以链接文件和文件夹,但硬链接只能链接文件。

不同文件系统创建链接

软链接可以跨不同的文件系统创建,但是硬链接不行,因为硬链接是共用一个inode,而不同的文件系统有不同的inode table。

应用场景

硬链接

  • 文件备份:为了防止重要的文件被误删,文件备份是一种好的办法,但拷贝文件会带来磁盘空间的消耗。硬链接能不占用磁盘空间实现文件备份。

  • 文件共享:多人共同维护同一份文件时,可以通过硬链接的方式,在私人目录里创建硬链接,每个人的修改都能同步到源文件,但又避免某个人误删就丢掉了文件的问题。

  • 文件分类:不同的文件资源需要分类,比如某个电影即是的分类是外国、悬疑,那我们可以在外国的文件夹和悬疑的文件夹里分别创建硬链接,这样可以避免重复拷贝电影浪费磁盘空间。有人可能说,使用软链接不也可以吗?是的,但不太好。因为一旦源文件移动位置或者重命名,软链接就失效了。

软链接

  • 快捷方式:对于路径很深的文件,查找起来不太方便。利用软链接在桌面创建快捷方式,可以迅速打开并编辑文件。

  • 灵活切换程序版本:对于机器上同时存在多个版本的程序,可以通过更改软链接的指向,从而迅速切换程序版本。这里提到了python版本的切换可以这么做。

  • 动态库版本管理:不是很懂,具体可以看这里。

总结

Linux系统通过inode管理文件,inode存储着文件字节数、文件权限、链接数、数据block位置等信息。

硬链接与源文件共用inode,除了文件名不同,其他与源文件一样。不能对文件夹创建硬链接,不能对不同的文件系统的文件创建硬链接。

软链接类似于windows的快捷方式,有独立的inode。可以对文件夹或不同文件系统的文件创建软链接。

硬链接和软链接修改文件内容都会同步到源文件,因为本质上它们都是指向源文件的数据block。

相关推荐:《Linux视频教程

以上是帶你搞懂linux硬連結和軟連結(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.im
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!