硬鏈接

硬鏈接

硬鏈接(hard link, 也稱鏈接)就是一個文件的一個或多個文件名。再說白點,所謂鏈接無非是把文件名和計算機文件系統使用的節點號鏈接起來。因此我們可以用多個文件名與同一個文件進行鏈接,這些文件名可以在同一目錄或不同目錄。

硬鏈接概念


一個文件有幾個文件名(用ln命令實現多個文件名),我們就說該文件的鏈接數為幾。由定義可知,此鏈接數可以是1, 這表明該文件只有一個文件名。
總之,硬鏈接就是讓多個不在或者同在一個目錄下的文件名,同時能夠修改同一個文件,其中一個修改後,所有與其有硬鏈接的文件都一起修改了。

關於Windows系統的硬鏈接


簡介

Windows系統的硬鏈接是一種針對文件的特殊快捷方式,只不過這種快捷方式的實現和一般的快捷方式不一樣,是NTFS文件系統特有的屬性之一,在Linux下面,也有類似的機制。
認識了硬鏈接究竟是怎麼一回事,理解硬鏈接的兩個限制就容易多了。
1、硬連接適用於在同一個卷的文件級別,不允許給目錄創建硬鏈接;
2、硬連接是不能跨卷的,只有在同一文件系統中的文件之間才能創建鏈接。

Windows系統的硬鏈接,系統屬性測試

WindowsVista/Windows7自帶了創建硬連接的命令:mklink.exe,利用這個命令,我們可以給指定的文件創建硬連接:
下面的命令將在link.txt和source.txt之間建立硬連接關係
C:\Users\hoii\Desktop》mklink /h link.txt gb.txt
為link.txt《《===》》gb.txt創建了硬鏈接
注意上面的例子:link.txt本是一個不存在的文件,但是當執行完mklink命令以後,link.txt文件也就被創建了。其實,link.txt是一個虛假的文件,它是在文件系統層面上對gb.txt文件的一個映射,而link.txt是不佔硬碟空間的。
關於硬碟空間的佔用問題,可以這樣測試:
1、給硬碟劃分一個新分區,空間只有2GB
2、在這個分區的test目錄裡面新建了一個1.9GB大小的文件,此時剩餘空間是0.1GB
3、用mklink命令給這個1.9GB大小的文件建立了一個硬連接
4、檢查這個分區的剩餘空間,還是0.1GB,但是如果用資源管理器看test目錄的屬性,會發現有2個文件,總大小是3.8GB(整個分區才2GB,能夠容納3.8GB大小的文件嗎?顯然不可能了)
還是針對上述的例子,如果我們把原始的文件gb.txt刪除以後,link.txt文件還是會繼續存在的,且內容就是source.txt的文件內容。也就是說,我們刪除gb.txt,實際上刪除的僅僅是這種連接關係,文件本身還是沒有被操作的。
關於硬連接,最後一個需要介紹的內容是:當硬連接建立以後,硬連接雙方任何一個對象被修改,都會造成對應的連接對象被修改。例如上面的例子:如果修改了link.txt,那麼gb.txt文件也會同步被修改,反之亦然。這一點和SHELL層面的快捷方式不同,SHELL層面的快捷方式文件LNK僅僅是一個指示關係,修改LNK文件並不影響LNK文件指向的對象,修改LNK文件指向的對象也不會影響LNK文件。

硬鏈接在Windows系統下的應用

1.節省硬碟空間。同樣的文件,只需要維護硬連接關係,不需要進行多重的拷貝,這樣可以節省硬碟空間。
2.重命名文件。重命名文件並不需要打開該文件,只需改動某個目錄項的內容即可。
3.刪除文件。刪除文件只需將相應的目錄項刪除,該文件的鏈接數減1,如果刪除目錄項后該文件的鏈接數為零,這時系統才把真正的文件從磁碟上刪除。
4.文件更新。如果涉及文件更新,只需要先在WinSxS目錄裡面下載好一個新版本,然後修改Windows\System32下面同名文件的硬連接關係,從舊版本的硬連接指向新版本的硬連接,這樣就能夠快速的完成文件的更新工作,而不需要進行文件的複製,速度也會快不少。
5.卸載補丁。遇到需要補丁卸載的情況,只需要把硬連接指向改為舊版本就可以了,沒有文件替換的問題。而且建立了硬連接關係的文件之間的修改是同步的,因此只要有一方被修改了,另一方也會得到修改。
篇幅關係,不再贅述。

關於Linux系統的硬鏈接


硬鏈接的定義

Linux 文件系統最重要的特點之一是它的文件鏈接。鏈接是對文件的引用,這樣您可以讓文件在文件系統中多處被看到。不過,在 Linux 中,鏈接可以如同原始文件一樣來對待。鏈接可以與普通的文件一樣被執行、編輯和訪問。對系統中的其他應用程序而言,鏈接就是它所對應的原始文件。當您通過鏈接對文件進行編輯時,您編輯的實際上是原始文件。鏈接不是副本。有兩種類型的鏈接:硬鏈接和符號鏈接(軟鏈接)。
硬鏈接只能引用同一文件系統中的文件。它引用的是文件在文件系統中的物理索引(也稱為 inode)。當您移動或刪除原始文件時,硬鏈接不會被破壞,因為它所引用的是文件的物理數據而不是文件在文件結構中的位置。硬鏈接的文件不需要用戶有訪問原始文件的許可權,也不會顯示原始文件的位置,這樣有助於文件的安全。如果您刪除的文件有相應的硬鏈接,那麼這個文件依然會保留,直到所有對它的引用都被刪除。

硬鏈接的使用與注意事項

ln 源文件 目標文件 : 創建硬鏈接文件
比如 ln test2.sh test_l.sh。這裡test_l.sh就是鏈接到了test2.sh腳本文件
注意事項:
1、修改源文件或者目標文件, 對應另外一個文件也會發生相應修改.
2、刪除源文件或者目標文件, 對另外一個文件沒有影響.
3、硬鏈接文件不佔用存儲空間.
4、不能對目錄文件進行創建硬鏈接操作.
5、硬鏈接文件不能跨文件系統.

硬鏈接與軟鏈接的區別

在Linux的文件系統中,保存在磁碟分區中的文件不管是什麼類型都給它分配一個編號,稱為索引節點號inode 。軟連接,其實就是新建立一個文件,這個文件就是專門用來指向別的文件的(那就和windows 下的快捷方式的那個文件有很接近的意味)。軟鏈接產生的是一個新的文件,但這個文件的作用就是專門指向某個文件的,刪了這個軟連接文件,那就等於不需要這個連接,和原來的存在的實體原文件沒有任何關係,但刪除原來的文件,則相應的軟連接不可用(cat那個軟鏈接文件,則提示“沒有該文件或目錄“)
硬連接是不會建立inode的,他只是在文件原來的inode link count域再增加1而已,也因此硬鏈接是不可以跨越文件系統的。相反都是軟連接會重新建立一個inode,當然inode的結構跟其他的不一樣,他只是一個指明源文件的字元串信息。一旦刪除源文件,那麼軟連接將變得毫無意義。而硬鏈接刪除的時候,系統調用會檢查inode link count的數值,如果他大於等於1,那麼inode不會被回收。因此文件的內容不會被刪除。
創建硬鏈接實際上是為 原文件在儲存器中的資源再新建一個入口,所以硬鏈接和原文件指向的其實是 儲存器中的同一處資源(可以理解為硬鏈接和原文件就是同一個文件)。可以通過ls -i來查看一下,這兩個文件的inode號是同一個,說明它們是同一個文件;而軟鏈接建立的是一個指向,即鏈接文件內的內容是指向原文件的指針,它們是兩個文件。
軟鏈接可以跨文件系統,硬鏈接不可以;軟鏈接可以對一個不存在的文件名(filename)進行鏈接(當然此時如果你vi這個軟鏈接文件,linux會自動新建一個文件名為filename的文件),硬鏈接不可以(其文件必須存在,inode必須存在);軟鏈接可以對目錄進行連接,硬鏈接不可以。兩種鏈接都可以通過命令 ln 來創建。ln 默認創建的是硬鏈接。使用 -s 開關可以創建軟鏈接。