前言
關(guān)于Linux中軟硬鏈接的概念之前一直沒有很好地理解,今天結(jié)合實(shí)際例子和網(wǎng)上的文章,寫一篇文章來進(jìn)行這個(gè)知識(shí)點(diǎn)的總結(jié),希望對(duì)各位讀者有所幫助。
在Linux系統(tǒng)中,連接一共可以分為2種,硬連接和軟連接。按我自己理解,無論是哪種連接,本質(zhì)上都是為了創(chuàng)建文件副本這個(gè)功能服務(wù)的
一、硬連接
硬連接指通過索引節(jié)點(diǎn)來進(jìn)行連接。在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)中的文件都會(huì)有一個(gè)唯一的節(jié)點(diǎn)值,稱為索引節(jié)點(diǎn)號(hào)(Inode Index)。出于文件備份考慮,我們有時(shí)候會(huì)希望在磁盤中多拷貝一份文件的副本,基于cp命令直接復(fù)制一份當(dāng)然是一個(gè)可行的方案,不過cp命令創(chuàng)建出來的文件屬于新文件,會(huì)占用磁盤空間,而硬連接則可以讓我們?cè)诓欢嗾加么疟P空間的前提下對(duì)文件進(jìn)行備份,原因是通過硬連接創(chuàng)建出來的文件和原文件指向了同一個(gè)node節(jié)點(diǎn)。只刪除一個(gè)連接并不影響索引節(jié)點(diǎn)本身和其它的連接,只有當(dāng)最后一個(gè)連接被刪除后,文件的數(shù)據(jù)塊及目錄的連接才會(huì)被釋放。也就是說,文件真正刪除的條件是與之相關(guān)的所有硬連接文件均被刪除。
我們不妨用下面的例子來了解一下上文的含義,創(chuàng)建文件a.txt后再利用ln和cp命令分別創(chuàng)建文件的硬連接和副本
echo {1..1000} > a.txt
ln a.txt b.txt # 為文件a創(chuàng)建硬連接
cp a.txt c.txt # 復(fù)制文件a的副本文件c

從圖中我們可以看到,硬連接
b.txt文件大小、節(jié)點(diǎn)id都和a.txt文件一樣,而副本c.txt節(jié)點(diǎn)id和a.txt文件不同,文件大小相同。且使用du -sh *命令進(jìn)行統(tǒng)計(jì)的時(shí)候,我們會(huì)發(fā)現(xiàn)硬連接創(chuàng)建的b.txt文件并不會(huì)被統(tǒng)計(jì)在內(nèi),也就是其實(shí)磁盤空間只占用一份內(nèi)存。
二、軟連接
軟連接有點(diǎn)類似于我們window系統(tǒng)的快捷方式,比如我們常常會(huì)將訪問比較頻繁的文件創(chuàng)建快捷方式后放到桌面上,方便我們后續(xù)訪問。Linux系統(tǒng)的軟連接也是這個(gè)道理,我們可以通過ln -s sourceFile targetFile的方式來創(chuàng)建原文件的快捷方式。
需要注意的是,創(chuàng)建出來的快捷方式會(huì)有屬于自己的節(jié)點(diǎn)id,且?guī)缀醪徽加么疟P空間,畢竟人家就是一個(gè)快捷方式而已。
ln -s a.txt d.txt # 為文件a創(chuàng)建軟連接

三、關(guān)于ls命令顯示的硬連接數(shù)
相信不少讀者會(huì)使用ls -l命令來查看目錄下面的文件,也知道第一列表示的是文件或者文件夾對(duì)應(yīng)的文件類型和權(quán)限,那么第二列的數(shù)字表示什么呢?其實(shí)這個(gè)數(shù)字表示的就是文件的硬連接數(shù),一般情況下普通文件的硬連接數(shù)都是1,假如說我們使用ln命令對(duì)文件A創(chuàng)建了兩個(gè)硬連接,那么這三個(gè)文件的硬連接數(shù)就都會(huì)變成3,表示這個(gè)node節(jié)點(diǎn)目前一共映射有有3個(gè)文件。

文件的硬連接數(shù)還比較好理解,但是文件夾的硬連接數(shù)又怎么解釋呢?
ln命令明明不支持對(duì)目錄類型的文件來創(chuàng)建硬連接事實(shí)上,目錄類型的文件確實(shí)比較特殊,我們可以簡(jiǎn)單把目錄類型文件的硬連接數(shù)簡(jiǎn)單理解為目錄中的子目錄數(shù),我們知道新建一個(gè)目錄后,目錄里面會(huì)自動(dòng)生成
.和..這兩個(gè)子目錄,對(duì)應(yīng)當(dāng)前目錄和上一級(jí)目錄。所以默認(rèn)情況下目錄對(duì)應(yīng)的硬連接數(shù)就是2,如果在這個(gè)目錄下面多建了3個(gè)子目錄,那么這個(gè)父目錄對(duì)應(yīng)的硬連接數(shù)就是5。這里有一個(gè)小細(xì)節(jié),目錄的硬連接數(shù)統(tǒng)計(jì)只會(huì)追溯到1層,不會(huì)往下繼續(xù)追溯。比如子目錄aa里面又有一個(gè)子目錄bb,那么統(tǒng)計(jì)的時(shí)候不會(huì)把bb目錄頁統(tǒng)計(jì)進(jìn)去。

小結(jié)
總的來說,硬連接是提供了一種文件備份(復(fù)制)的方案,軟連接則是通過創(chuàng)建快捷方式的手段來實(shí)現(xiàn)文件復(fù)制的效果,但后者本質(zhì)上相當(dāng)于是一個(gè)文件快速入口而已(或者理解為是文件別名),一旦原文件被刪除,那么軟連接也就會(huì)隨之失效,但硬連接創(chuàng)建的文件卻能依靠原文件的節(jié)點(diǎn)id而保存下來。
參考文章
Linux軟連接和硬鏈接 https://zhuanlan.zhihu.com/p/67366919