硬連結和軟連結的區別(軟連線和硬連線到底有啥作用和區別)

在 Linux 系統中,一切都是檔案,然而為了區分不同型別的事物,我們有了:普通檔案;目錄檔案;連結檔案;裝置檔案

Linux 系統中,一切都是檔案,然而為了區分不同型別的事物,我們有了:

  • 普通檔案
  • 目錄檔案
  • 連結檔案
  • 裝置檔案

在之前的文章《阿里面試題 | Nginx 所使用的 epoll 模型是什麼?》中我們討論了檔案描述符的概念:

檔案描述符(file descriptor)是核心為了高效管理已被開啟的檔案所建立的索引,其值是一個非負整數(通常是小整數),用於指代被開啟的檔案,所有執行 I/O 操作的系統呼叫都通過檔案描述符。

對於 Linux 有一些使用的使用者來說,會有類似如下的寫法:

g lots_of_errors 2>&1 | head

其中 2>&1 中的2 就是表示的「標準錯誤」,1 就是「標準輸出」,中間的 & 表示後面跟的數字是檔案描述符而不是一個檔案(不然所有的「標準錯誤」就都重定向到了一個名為 1 的檔案中了)。

本文將針對另一個面試重點進行展開闡述:

說說看 Linux 下有哪幾種連結?軟連結和硬連結?它們之間的區別是什麼呢?

Linux 下的連結

作為的一個 Linux 的使用者,Linux 系統下提供 ln 指令來進行檔案連結,我們一定見過類似如下指令:

此時如果 ls 檢視當前目錄下的檔案的話,會發現:

那麼這個 foo.txt 究竟是個什麼呢?

這個就是一個檔案連結,檔案連結主要分為硬連結和軟連結,通過檢視 ln --help,可以看到一些重要的內容:

ln 指令預設建立的是硬連結,如果加入了 -s 引數,則會生成一個軟連結。

硬連結

先來看看 ln 預設建立的硬連結,由於 Linux 下的檔案是通過索引節點(Inode)來識別檔案,在 Linux 的檔案系統中,儲存在磁碟分割槽中的檔案不管是什麼型別都給它分配一個編號,稱為索引節點號(Inode Number)。

在 Linux 中,多個檔名指向同一索引節點是存在的,所以硬連線指通過索引節點來進行的連線,即每一個硬連結都是一個指向對應區域的檔案。

我們這裡建立一個檔案 foo.txt 然後建立一個它的硬連結看看:

前面的 6817859是檔案的 inode,可以簡單把它想成 C 語言中的指標,它指向了物理硬碟的一個區塊,事實上檔案系統會維護一個引用計數,只要有檔案指向這個區塊,它就不會從硬碟上消失,這裡我們會發現,這兩個檔案擁有相同的 inode,通過檢視檔案內容也會發現是同一個檔案:

硬連結的作用是允許一個檔案擁有多個有效路徑名,這樣使用者就可以建立硬連結到重要檔案,以防止“誤刪”的功能,由於對應該目錄的索引節點有一個以上的連線,假設我們刪除了原始的 foo.txt 檔案:

此時檔案的內容依然存在,所以只刪除一個連線並不影響索引節點本身和其它的連線,只有當最後一個連結被刪除後,檔案的資料塊及目錄的連線才會被釋放,也就是說,檔案才會被真正刪除。

軟連結

軟連結又叫符號連結,這個檔案包含了另一個檔案的路徑名,例如在上圖中,foo.txt 就是 bar.txt 的軟連線,bar.txt 是實際的檔案,foo.txt 包含的是對於 bar.txt 的 inode 的記錄。

軟連線可以是任意檔案或目錄,可以連結不同檔案系統的檔案,在對符號檔案進行讀或寫操作的時候,系統會自動把該操作轉換為對原始檔的操作,但刪除連結檔案時,系統僅僅刪除連結檔案,而不刪除原始檔本身,這一點類似於 Windows 作業系統下的快捷方式。

軟連結和硬連結的區別

在有了上面的知識後我們就可以簡要地回答面試中的問題了:

軟連結和硬連結的區別是什麼?

我們來總結一下:

在掌握了連結方面的知識之後,還有以下相關面試題也可以一起準備起來:

  • Linux 檔案系統有哪些
  • Linux 有哪些檔案型別
  • 使用者程序間通訊主要哪幾種方式
  • 中斷與系統呼叫的概念

原文來自:
           https://www.linuxprobe.com/?p=163007