硬鏈接與軟鏈接 (符號鏈接)的區別與聯繫

在linux系統中,鏈接分兩種 :一種被稱爲硬鏈接(Hard Link),另一種被稱爲符號鏈接或軟鏈接(Symbolic Link)。

硬鏈接與軟鏈接 是 Linux 文件系統中的一個重要概念,其涉及文件系統中的索引節點 (index node 又稱 inode),而索引節點對象是 Linux 虛擬文件系統 (VFS) 的四個基本概念之一。通過剖析硬鏈接與軟鏈接的聯繫與區別,我們可更好的瞭解 Linux 中 VFS 這一通用文件模型。並讓 Linux 普通用戶和系統管理員正確使用硬鏈接與軟鏈接,幫助文件系統開發者獲取 inode 的相關知識

iNode與block理解參考博文:

Linux文件與目錄

現代操作系統爲解決信息能獨立於進程之外被長期存儲引入了文件,文件作爲進程創建信息的邏輯單元可被多個進程併發使用。在 UNIX 系統中,操作系統爲磁盤上的文本與圖像、鼠標與鍵盤等輸入設備及網絡交互等 I/O 操作設計了一組通用 API,使他們被處理時均可統一使用字節流方式。換言之,UNIX 系統中除進程之外的一切皆是文件,而 Linux 保持了這一特性。爲了便於文件的管理,Linux 還引入了目錄(有時亦被稱爲文件夾)這一概念。目錄使文件可被分類管理,且目錄的引入使 Linux 的文件系統形成一個層級結構的目錄樹。清單 1.所示的是普通 Linux 系統的頂層目錄結構,其中 /dev 是存放了設備相關文件的目錄。

硬鏈接:新建的文件是已經存在的文件的一個別名,當原文件刪除時,新建的文件仍然可以使用.

軟鏈接:也稱爲符號鏈接,新建的文件以“路徑”的形式來表示另一個文件,和Windows的快捷方式十分相似,新建的軟鏈接可以指向不存在的文件.

Linux頂層目錄結構

 /              根目錄
├── bin     存放用戶二進制文件
├── boot    存放內核引導配置文件
├── dev     存放設備文件
├── etc     存放系統配置文件
├── home    用戶主目錄
├── lib     動態共享庫
├── lost+found 	文件系統恢復時的恢復文件
├── media   可卸載存儲介質掛載點
├── mnt     文件系統臨時掛載點
├── opt     附加的應用程序包
├── proc    系統內存的映射目錄,提供內核與進程信息
├── root    root 用戶主目錄
├── sbin    存放系統二進制文件
├── srv     存放服務相關數據
├── sys     sys 虛擬文件系統掛載點
├── tmp     存放臨時文件
├── usr     存放用戶應用程序
└── var     存放郵件、系統日誌等變化文件

軟鏈接和硬鏈接的區別與聯繫

下面是在我理解的基礎上畫的模型

軟鏈接:                                                                          硬鏈接:

                               

 

硬鏈接(hard link) ln 

UNIX文件系統提供了一種將不同文件鏈接至同一個文件的機制,我們稱這種機制爲鏈接。它可以使得單個程序對同一文件使用不同的名字。這樣的好處是文件系統只存在一個文件的副本。系統簡單地通過在目錄中建立一個新的登記項來實現這種連接。該登記項具有一個新的文件名和要連接文件的inode號(inode與原文件相同)。不論一個文件有多少硬鏈接,在磁盤上只有一個描述它的inode,只要該文件的鏈接數不爲0,該文件就保持存在。硬鏈接不能對目錄建立硬鏈接!

硬連接是直接建立在節點表上的(inode),建立硬連接指向一個文件的時候,會更新節點表上面的計數值。舉個例子,一個文件被連接了兩次(硬連接),這個文件的計數值是3,而無論通過3個文件名中的任何一個訪問,效果都是完全一樣的,但是如果刪除其中任意一個,都只是把計數值減1,不會刪除實際的內容的,(任何存在的文件本身就算是一個硬連接)只有計數值變成0也就是沒有任何硬連接指向的時候纔會真實的刪除內容。

軟鏈接(symbolic link) ln-s

我們把符號鏈接稱爲軟鏈接,它是指向另一個文件的特殊文件,這種文件的數據部分僅包含它所要鏈接文件的路徑名。軟鏈接是爲了克服硬鏈接的不足而引入的,軟鏈接不直接使用inode號作爲文件指針,而是使用文件路徑名作爲指針(軟鏈接:文件名 + 數據部分-->目標文件的路徑名)。軟件有自己的inode,並在磁盤上有一小片空間存放路徑名。因此,軟鏈接能夠跨文件系統,也可以和目錄鏈接!其二,軟鏈接可以對一個不存在的文件名進行鏈接,但直到這個名字對應的文件被創建後,才能打開其鏈接。

那麼如何判斷是硬鏈接,軟鏈接,源文件呢?其實不難

創建方法:

ln mo linka
ln mo linkb
ln -s mo linkc

查看方法:

ll
-rw-r--r--  3 root root 11260 Jul 13 19:19 linka//硬連接
-rw-r--r--  3 root root 11260 Jul 13 19:19 linkb//硬連接
lrwxrwxrwx  1 root root     5 Jul 18 05:19 linkc -> mo//軟連接
-rw-r--r--  3 root root 11260 Jul 13 19:19 mo//原文件

區別:
軟鏈接只是指向原文件的名字;
創建軟連接時創建一個文件,文件的內容就是原來的文件的地址;
如果刪掉原文件,則找不到軟連接實際連接的文件了。

相反,創建硬聯接時創建一個inode,inode指向原文件,文件的連接數加1;
硬鏈接與文件原有的名字是平權的,在Linux看來它們是等價的。
即如果刪掉原文件,只是把連接數減1,如果連接數爲0,則文件仍然被刪除,否則硬連接指向的文件仍然存在。
如果刪掉硬連接也是如此。

由於這個原因,硬鏈接不能連接兩個不同文件系統上的文件。

總結

硬鏈接: 與普通文件沒什麼不同,inode 都指向同一個文件在硬盤中的區塊
軟鏈接: 保存了其代表的文件的絕對路徑,是另外一種文件,在硬盤上有獨立的區塊,訪問時替換自身路徑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章