軟鏈接就類似快捷方式,或者網頁上超級鏈接:跟原文件一樣,也同步更新,但不占空間。如果原文件被刪除,那磁盤空間立刻釋放(文件真沒了),軟鏈接本身不會被刪除,但由于指向的文件已經不在了,所以鏈接會失效。
軟連接很常用(相比硬鏈接)。比如你有一個軟件需要讀取cc.conf這個配置文件,但你有好幾套配置文件,常規的方法是用哪套就把哪套改名(或復制)成cc.conf,不用的暫時就叫cc1.conf,cc2.conf這樣。
但這樣有很多問題,第一,不看內容你也不知道現在的cc.conf到底是哪一套。第二,如果是改名,改來改去容易把文件弄丟。如果是復制,你修改了cc.conf還要記得復制一下,不然下次一切換就修改的部分就丟了。
用軟鏈接就很容易了,你把cc.conf做成軟鏈接,想用哪個就指向哪個就行了。想看當前用的是哪個ls -l就能看到,所有修改都會同步,你還不怕把foo.conf會弄丟。
硬鏈接跟軟鏈接差不多,但指向的不是文件,而是底層的文件系統。也就是如果原文件被刪,磁盤空間并不會釋放,硬鏈接也不會失效。如果要刪掉文件(釋放空間),就要刪掉它所有的硬鏈接。
硬鏈接用的少,但有一些很有意思的用法,比如增量備份。
假設你有很多很重要的文件,需要每天備份一次,因為有些時候需要回溯到某特定一天的版本。最簡單粗暴的辦法就是每天備份一次,但長期下來容量必然吃不消。所以我們用硬鏈接來做增量備份。
硬鏈接增量備份的原理如下圖所示
第一天,備份為Backup 1,里面有三個文件,沒什么好說的。
第二天,備份為Backup 2,還是三個文件,但File3修改了。這樣File1,File2做硬鏈接,File3保存新版
這樣文件系統上其實只存了File1,File2,File3和修改過的File3,但你在第一天和第二天的文件夾里可以看到當天完整的File1,File2和File3。這樣即使每天備份一次,其實也占不了多少空間,但卻可以像每天備份一次那樣,可以在指定日期的文件夾里找到所有文件那一天的版本。
更妙的是刪除的時候也會智能釋放空間,比如上圖的情況,這時候如果刪除第一天的備份(Backup 1),File1和File2由于還有第二天的硬鏈接,所以不會被刪除。File3(Changed)會保留,但第一天版本的File3則會被刪除,釋放空間。
所以你還可以把備份規則寫到風騷,比如過去1周每天保留一個備份,一周以前一個月以內每三天保存一個備份,之后每周保存一個版本,最多保存過去一年的,之類的。