目錄
前言
inode
软链接
对比
文件重命名或文件移动
文件删除
链接文件和文件夹
不同文件系统创建链接
应用场景
硬链接
总结
首頁 運維 linux運維 帶你搞懂linux硬連結和軟連結(圖文詳解)

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

Feb 21, 2022 pm 05:50 PM
linux

這篇文章為大家帶來了關於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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

vscode終端命令不能用 vscode終端命令不能用 Apr 15, 2025 pm 10:03 PM

VS Code 終端命令無法使用的原因及解決辦法:未安裝必要的工具(Windows:WSL;macOS:Xcode 命令行工具)路徑配置錯誤(添加可執行文件到 PATH 環境變量中)權限問題(以管理員身份運行 VS Code)防火牆或代理限制(檢查設置,解除限制)終端設置不正確(啟用使用外部終端)VS Code 安裝損壞(重新安裝或更新)終端配置不兼容(嘗試不同的終端類型或命令)特定環境變量缺失(設置必要的環境變量)

See all articles