這篇文章為大家帶來了關於Linux中硬連結和軟連結的相關知識,其中還有inode的相關問題,希望對大家有幫助。
最近前端套件管理器pnpm真的是太火了,大量的文章分析了pnpm的原理。了解之後,發現pnpm整個架構都是基於硬連結和軟連結組織的,但我對這兩個概念比較模糊,所以想研究一下。
眾所周知,Unix/Linux系統中一切皆檔案。可見,檔案在Linux系統中非常重要。我們平常比較直觀的對於文件的感受肯定是文件名和文件內容。但在Linux的檔案系統中,除了檔案名稱和檔案內容,還有一個很重要的概念,就是inode。
維基百科這樣描述inode:
#意思是:inode是類別Unix檔案系統中用來描述檔案系統物件(例如檔案或資料夾)的一種資料結構。它儲存著檔案的各種屬性(最近一次inode變動的時間、最近一次存取的時間、最近一次修改的時間等元信息,以及權限資訊等)。資料夾是一組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與檔案名稱、檔案資料是一對一的關係,但我們可以透過shell指令讓多個檔案名稱指向同一個inode,這種就是硬連結(hard link)。 使用lnln test.txt test_hard.txt
#建立硬連結後:
可以看到,test_hard.txt的inode跟來源檔test.txt使用的是同一個,只是現在連結數變成2了。
我們可以執行ls -li查看一下。第一列是inode number,可以看到都是13029546,所以兩個檔案使用的是同一個inode。第二列是權限訊息,第四列是擁有者,第六列是檔案內容大小。可以看到,除了檔案名稱不一樣之外,硬連結建立的檔案跟來源檔案的所有元資訊完全一樣。第三列表示連結數,可以看到,目前連結數為2。
由於硬連結檔案和來源檔案使用同一個inode,並指向同一塊檔案數據,除檔案名稱之外的所有資訊都是一樣的。所以這兩份文件是等價的,可以說是互為硬連結檔。修改任一文件,可以看到另外一個文件的內容也會同步改變。准确来说叫符号链接(symbolic link),一般又叫软链接(soft link)。与硬链接共用一个inode不同,软链接会创建新的inode,并指向源文件。可以理解软链接就是windows系统中的桌面快捷方式。
创建软链接的命令和硬链接很像,多了-s参数:ln -s
ln -s test.txt test_symbolic.txt
对应的nodejs的fs.symlink方法。
创建软链接之后:
源文件inode的链接数还是1,创建了新的inode,软链接指向源文件。
执行ls -li看一下:
可以看到,软链接的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中文網其他相關文章!