1. 程式人生 > 實用技巧 >Linux檔案共享方式——硬連結和軟連結

Linux檔案共享方式——硬連結和軟連結

基於Linux面向多使用者的特性,檔案共享已成為必需的功能。在一個多使用者系統中,如果每個使用者都對某檔案有讀、寫等操作需求,而此時作業系統不提供檔案共享,那麼只能對每個使用者都建立一個該檔案的副本。這樣一來,大大浪費了儲存空間,二來也不方便使用者之間的協作。因此,在Linux系統中,採用了現在常用的兩種檔案共享方式——基於索引節點的共享方式(硬連結)和基於符號鏈的共享方式(軟連結)。


一、基於索引節點的共享方式(硬連結)

1、前言

在講這兩種連結方式之前,我們先說一下Linux上的檔案是什麼樣的。檔案包括兩個部分:檔案本身的資料和元資料。檔案本身的資料就是我們使用者所需要的資料,儲存在硬碟上的資料塊中;而元資料就用來表示檔案的屬性,如檔案大小、檔名、時間戳等等以及inode索引節點(inode具體定義這裡不再詳述)資訊。而在這些元資料中,只有inode號才能唯一地標識某個檔案(檔名並不能),基於這一點,下面詳解硬連結的實現。


2、概念

硬連結可以理解為對現有的一個檔案的引用。初始時,每個檔案都有一個硬連結,即指向該檔案inode的指標,inode中設定一個計數器count,稱為引用計數器。當有其他地方需要使用到這個檔案的時候,可以不用複製,直接建立一個對該檔案的引用,也就是再建立一個指向該檔案inode的指標,此時引用計數器的值**+1**,我們稱這種共享方式為基於索引節點的共享方式,也就是建立硬連結的方式,在這種共享方式中,檔案目錄中只設置檔名指向inode節點的指標,由於inode唯一標識檔案,因此檔名可以改變

下面給出硬連結的圖示:
在這裡插入圖片描述


這裡共有3個使用者,這三個使用者共享filename這個檔案,共建立了三個硬連結,共同指向檔案filename

的inode,inode中的引用計數器count == 3表示共有三個引用,檔案filename在三個使用者系統中的檔名各不相同。

如果這時候使用者2不再需要此檔案,不可直接將filename檔案刪除,因為這樣會導致使用者1和3對該檔案建立的硬連結指標懸空,使用者1和3再用此檔案的時候就找不到了,發生錯誤。正確的做法是先將inode節點中的count值-1,然後刪除自己檔案目錄中相應的目錄項,也就是“1feg ptr1”這一條記錄刪除。當最終count == 0的時候,表明沒有使用者再需要該檔案,由系統負責刪除該檔案。

同理,假設這個時候使用者User4需要對這個檔案進行操作,則生成一個指向inode的指標和檔名,建立硬連結,同時count+1

總結:硬連結就可以理解為有著相同inode號的不同名檔案(也可同名),這些檔案都是對同一個檔案的對映。


3、特點

硬連結有以下幾個特點:
(1) 所有的硬連結指向相同的inode以及資料塊;
(2) 必須對已存在的檔案建立硬連結;
(3) 刪除一個硬連結不影響其他的硬連結,也不影響原檔案;只要還有一個指標指向被連結檔案,該檔案就不能被刪除;
(4) 不可以對目錄建立硬連結;
(5) 硬連結與被連結檔案有著相同的檔案屬性(許可權、時間戳等);
(6) 新建一個硬連結,inode中的count+1,反之-1。


二、基於符號鏈的共享方式(軟連結)


1、概念

軟連結是指某檔案 F’ 的使用者資料塊中存放的是另一檔案 F 的路徑名,稱“某檔案”是“另一檔案”的軟連結,“另一檔案”是被軟連結的檔案,且這個路徑名被視為符號鏈
當用戶2要訪問被連結的檔案F時,作業系統根據軟連結檔案F’中的路徑名去訪問檔案F,從而實現多使用者對檔案F的共享。
軟連結的檔案佔用的資料塊與被連結檔案不同,而且有自己的inode,因此檔案屬性資訊。


2、特點

軟連結有以下幾個特點:
(1) 每個軟連結都有自己的inode以及資料塊;
(2) 原檔案不存在時,亦可以建立軟連結;
(3) 刪除一個軟連結,不影響被連結的檔案;刪除被連結的檔案,則軟連結無法找到原檔案,變成懸掛的軟連結;但原檔案被重新建立(按原路徑)時,軟連結又重新發揮作用;
(4) 可以對目錄建立軟連結;
(5) 軟連結與被連結檔案有不同的檔案屬性(許可權、時間戳等);
(6) 新建和刪除軟連結不改變count值。


三、例題

設檔案file的inode當前的引用計數器值為3,先對file建立軟連結f1,再對file建立硬連結f2,再對f1建立硬連結f3,再刪除f2、f3。分別求file、f1中的引用計數器值。

:對file建立軟連結f1,不影響file的引用計數器的值,故還是3;對file建立硬連結f2,故引用計數器+1,變為4;軟連結f1本身就是一個檔案,故初始f1中的引用計數器值為1,對f1建立硬連結f3,故引用計數器值+1,變為2;最後刪除f2,被硬連結檔案file的引用計數器的值-1,變為3,刪除f3,被硬連結檔案f1的引用計數器的值-1,變為1。
因此最終答案為:
file的引用計數器的值:3;f1的引用計數器的值:1