Linux 文件系統最重要的特點之一是它的文件鏈接。鏈接是對文件的引用,這樣你可以讓文件在文件系統中多處被看到。
我一般用的是RHEL 7.0 所以實驗也是在此版本上使用。
在 Linux 中,鏈接可以如同原始文件一樣來對待。鏈接可以與普通的文件一樣被執行、編輯和訪問。對系統中的其它應用程序而言,鏈接就是它所對應的原始文件。當你通過鏈接對文件進行編輯時,你編輯的實際上就是原始文件。切記,鏈接並不是文件的副本。
在Linux系統中,鏈接可分爲兩類:一類被稱爲硬鏈接(Hard Link),另一類被稱爲軟鏈接或符號鏈接(Symbolic Link)。
硬鏈接(hard link, 也稱鏈接)
就是一個文件的一個或多個文件名。再說白點,所謂鏈接無非是把文件名和計算機文件系統使用的節點號鏈接起來。因此我們可以用多個文件名與同一個文件進行鏈接,這些文件名可以在同一目錄或不同目錄。一個文件有幾個文件名(用ln命令實現多個文件名),我們就說該文件的鏈接數爲幾。由定義可知,此鏈接數可以是1, 這表明該文件只有一個文件名。
總之,硬鏈接就是讓多個不在或者同在一個目錄下的文件名,同時能夠修改同一個文件,其中一個修改後,所有與其有硬鏈接的文件都一起修改了,只刪除一個連接並不影響索引節點本身和其它的連接,只有當最後一個連接被刪除後,文件的數據塊及目錄的連接纔會被釋放。也就是說,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。
軟鏈接(Symbolic Link)
又稱符號鏈接,它是一類特殊的文件, 其包含有一條以絕對路徑或者相對路徑的形式指向其它文件或者目錄的引用。
當我們在移動或刪除原始文件時,軟鏈接文件會被破壞(失效),但是不會消失。當我們對軟鏈接文件進行讀寫的操作的時候,實際操作的是原始文件。
符號鏈接文件僅包含有一個文本字符串,其被操作系統解釋爲一條指向另一個文件或者目錄的路徑。它是一個獨立文件,其存在並不依賴於目標文件。如果刪除一個符號鏈接,它指向的目標文件不受影響。
在Linux中,系統的ln命令爲我們提供了創建軟/硬鏈接的功能。
[root@localhost]# touch file_name
#創建範例文件file_name
[root@localhost]# ln file_name hard_link_file_name
#創建硬鏈接,前面跟原始文件名,後面跟硬鏈接文件的名
[root@localhost]# ln -s file_name Symbolic_link_file_name
#創建軟鏈接,前面跟原始文件名,後面跟軟鏈接文件的名
[root@localhost]# ls -i
l#查看創建信息,i查看inode節點號,l文件信息長格式輸出
total 0
286759 -rw-r--r-- 2 root root 0 Jun 15 22:48 file_name
286759 -rw-r--r-- 2 root root 0 Jun 15 22:48 hard_link_file_name
286760 lrwxrwxrwx 1 root root 9 Jun 15 22:49 Symbolic_link_file_name -> file_name
通過觀察file_name的軟鏈接文件和硬鏈接文件,我們發現原始文件的inode節點號和硬鏈接的inode節點號一模一樣,而軟鏈接則是新的inode節點號。
下面呢,爲大家總結下硬鏈接和軟鏈接的區別:
1)創建命令ln,默認不帶參數創建的是硬鏈接,帶-s參數創建的是軟鏈接
2)硬鏈接文件與原始文件的 inode 節點號相同,而軟鏈接文件的 inode 節點號與原始文件不同
3)ln命令不能對目錄創建硬鏈接,但可以創建軟鏈接,並且對目錄的軟鏈接在生產環境中經常用到。
4)刪除軟鏈接文件,對原始文件及硬鏈接文件無任何影響
5)刪除硬鏈接文件,對原始文件及軟鏈接無任何影響
6)刪除軟鏈接文件的原始文件,對硬鏈接文件無任何影響,但是會導致其軟鏈接失效
7)正常情況下,只有同時刪除原始文件及其硬鏈接文件,整個文件纔會被真正的刪除
8)很多硬件設備中的快照功能,使用的就是類似硬鏈接的原理
9)軟鏈接可以跨文件系統,硬鏈接不可以跨文件系統
介紹了,軟/硬鏈接以及它們的區別,下面介紹下各自在生產環境中的使用案例:
1)軟鏈接的生產使用案例
當我們編譯apache、nginx或者php之類的軟件時,編譯的路徑中默認都帶着版本號,比如/apps/apache-2.4.6(用來區分版本,因此路徑比較長)。但是我們在訪問目錄時卻又希望簡便,並且爲了方便後期軟件的升級以及實現其它擴展功能,此時我們就可以通過爲原始目錄建立一個軟鏈接,來滿足需求。比如:
ln –s /apps/apache2.4.6 /apps/apache
以上的例子,就是一個簡單而又常用的例子。這樣子,我們在一些腳本中指定apache路徑時,只需要指定軟鏈接文件的地址就可以了,這樣子我們下次升級apache軟件的時候,就不用一個一個修改衆多腳本中的apache路徑了。
再看一個例子,假設我服務器上跑着lnmp的網站架構,並且針對php,我安裝了2個版本的,一個是php-5.2.17,一個是php-5.4.24。針對這種情況,我如果想實現快速的php切換,此時我就可以通過軟鏈接的形式來實現。每次,只需要通過修改軟鏈接的指向,就能輕鬆切換php的版本了。
2)硬鏈接的生產使用案例
硬鏈接用的多的就是在數據的備份這方面,比如硬件存儲的快照功能、爲備份數據創建多個硬鏈接放置刪除數據等等
以上就是鏈接相關的知識了,下面補充一個朋友諮詢的問題:
如何查看一個文件硬鏈接的分佈,或者說假設一個文件有5個硬鏈接,我怎麼知道這5個硬鏈接文件到底在文件系統的哪個目錄下?
解決方案:
Linux系統中的find命令,可以幫助我們查找文件的硬鏈接到底分佈在系統中的哪些位置。
[root@localhost]# ls -il #查看file_name文件的inode節點號
total 0
286759 -rw-r--r-- 5 root root 0 Jun 15 22:48 file_name
[root@localhost]# find / -inum 286759 2> /dev/null #通過find提供的-inum選項通過文件的inode節點號去查看同一個inode的文件分佈情況
/mnt/hard_link_file_name_1
/root/rhce/file_name
/etc/hard_link_file_name_2
/tmp/hard_link_file_name
/media/hard_link_file_name_3
在 Linux 中,鏈接可以如同原始文件一樣來對待。鏈接可以與普通的文件一樣被執行、編輯和訪問。對系