linux中軟鏈接與硬鏈接的區別學習

其中部分圖片無法正常顯示,請在github閱讀

1.linux的主要發行版本

所謂的發行版本,他們之間的內核(kernel)是完全一樣的,都是由linux官網來維護的,只是不同廠商做了一定的其他處理。主要有以下:

其中ubuntu和其他廠商發行的版本在內核上是完全一樣的,只是它包含了圖形界面,因此更加佔用內存,一般並不會用於服務器(安全性與穩定性都不高)。服務器主要使用的是redhat,但是redhat包含一些收費的售後服務,而相對而言我們的centos是完全免費的,而且內核和redhat也完全一樣。

2.硬鏈接

2.1 通過shell命令查看i節點與硬鏈接磁盤空間佔用翻倍

在查找系統中文件的時候,我們先會查找一個文件索引表,然後根據索引表去硬盤中查找。如下圖:

硬鏈接就像是教室的兩個門,不管從那個門進入最後都會是同一個教室。而且不同的硬鏈接指向的文件索引表中的對象具有相同的i節點與block塊,刪除任何一個硬鏈接,剩餘的硬鏈接依然能夠打開(因爲他們引用的是同一個文件),但是前提是必須在同一個分區,形象的說就是同一棟樓!你也可以從上面的圖中看出。我們可以通過下面的命令來查看i節點:

ln commonError.md e.md 
ll -i -h
#-i表示查看i節點,h表示human readable,也就是使用20k等大小

此時你看到在我的shellGlobStar中運行該命令後得到的結果如下:

 total 51K
1688849860445007 -rw-r--r-- 2 Administrator 197121 471 四月  7 09:04 commonError.md
1688849860445007 -rw-r--r-- 2 Administrator 197121 471 四月  7 09:04 e.md
3377699720668628 -rw-r--r-- 1 Administrator 197121 541 四月  8 11:32 for.sh
1407374883695985 drwxr-xr-x 1 Administrator 197121   0 四月  5 17:22 node_modules/
2814749767292893 -rw-r--r-- 1 Administrator 197121 37K 四月  8 13:16 readme.md
5066549580932128 drwxr-xr-x 1 Administrator 197121   0 四月  8 12:20 src/

第一列表示該文件的i節點(你可以清楚的看到源文件與硬鏈接指向的i節點是完全一致的),第二列表示權限(如果是軟連接那麼第一個字符是l,而此處硬連接你可以看到其和普通文件是一樣的,這可能也是爲什麼刪除了源文件後硬鏈接依然可用,但是軟連接不可用的一個表現),第三列表示該文件的引用次數(因爲我爲commonError.md添加了硬連接,其文件名爲e.md,所以你看到e.md與commonError.md的引用次數都是2,也就是硬鏈接和源文件的引用次數會同時增加,因爲硬鏈接最後指向的是硬盤中的文件,所以此處表示有兩個指針指向硬盤中的文件而已,刪除的時候你會發現另外一個文件的引用次數也會相應減少),第四列表示文件的所用者,第六列表示文件大小(commonError.md與e.md都是471字節)。其他列都比較容易理解。你也可以通過下面的命令來僅僅查找i節點:

ls -i

此時結果如下:

1688849860445007 commonError.md  1407374883695985 node_modules/
1688849860445007 e.md          2814749767292893 readme.md
3377699720668628 for.sh          5066549580932128 src/

通過這個輸出,你可以看到每一個文件和目錄的i節點。我們可以發現,硬鏈接和源文件的大小完全是一致的!硬鏈接個人感覺用處不大,因爲創建硬鏈接是磁盤上空間是增加了雙倍,你可以通過右鍵看到e.md與commonError.md兩個文件其實佔用了雙份空間,但是對於硬鏈接而言,修改硬鏈接文件和原始文件的內容都會相互影響。這也是硬鏈接與普通文件之間唯一的區別把!

2.2 深入分析硬鏈接

linux系統下的文件包括`i_node`結構和`data`兩部分,其中i_node結構中有兩個引用計數i_count和i_nlink,前者記錄該文件當前的使用者數量,後者記錄該文件的介質鏈接數量,即前者針對`內存`,後者針對`硬盤`,只有這兩個引用計數值都爲0的情況下,data的刪除才真正進行。
所以,一個文件沒有創建相應的硬連接時、和創建了相應的硬連接時,rm命令執行的結果是不一樣的;

其中創建了硬鏈接後,我們刪除了源文件,那麼我們的硬鏈接依然可以正常使用,彷彿源文件沒有被刪除一樣(因爲源文件還有硬鏈接指向它),而軟連接在這種情況下就失效!比如我們刪除commonError.md這個源文件,然後看看err.md這個硬鏈接的情況:

 rm -rf commonError.md
 #此時源文件已經刪除
 ll -i -h

此時得到下面的結果:

total 47K
4785074604271084 -rw-r--r-- 1 Administrator 197121 471 四月  9 10:06 commonError1.md
1688849860445007 -rw-r--r-- 1 Administrator 197121 471 四月  7 09:04 err.md
3377699720668628 -rw-r--r-- 1 Administrator 197121 541 四月  8 11:32 for.sh
1407374883695985 drwxr-xr-x 1 Administrator 197121   0 四月  5 17:22 node_modules/
2814749767292893 -rw-r--r-- 1 Administrator 197121 37K 四月  8 13:16 readme.md
5066549580932128 drwxr-xr-x 1 Administrator 197121   0 四月  8 12:20 src/ 

此時你發現commonError1.md已經移除了,但是我們的硬鏈接err.md依然可以正常使用(cat命令可以查看內容)!原因在於:雖然我們對commonError1.md執行了rm -rf操作,但是因爲我們的硬鏈接依然指向它,所以其引用次數沒有變化爲0,故而沒有真正從硬盤中刪除。此種情況下硬鏈接依然可以找到,只是軟連接無法找到而已!這也是官網給下面例子的說明:

 ln file1.txt link1
 rm file1.txt         
#The file cannot be deleted until the link is removed.
#只有當link文件刪除後才能真正從硬盤中刪除源文件

3.軟連接創建,大小,與失效

首先windows上git bash的ln命令無法創建軟連接的,只是對源文件的一個複製而已,所以我們可以使用windows上的mklink來完成!命令如下(在cmd中運行):

mklink error.md commonError.md
#爲commonError.md創建一個軟鏈接error.md,鏈接文件在前,和ln參數順序有差異
#在cmd中輸入爲: error.md <<===>> commonError.md 創建的符號鏈接

此時我們運行ls -aihl得到如下的結果:

 total 94K
127508164450063745 drwxr-xr-x 1 Administrator 197121   0 四月  9 11:15 ./
   562949953421669 drwxr-xr-x 1 Administrator 197121   0 四月  9 09:21 ../
 10414574138434611 drwxr-xr-x 1 Administrator 197121   0 四月  8 16:44 .git/
  4785074604271084 -rw-r--r-- 3 Administrator 197121 471 四月  9 10:06 commonError.md
  4785074604271084 -rw-r--r-- 3 Administrator 197121 471 四月  9 10:06 e.md
  9570149208351226 lrwxrwxrwx 1 Administrator 197121  14 四月  9 11:15 error.md -> commonError.md
  3377699720668628 -rw-r--r-- 1 Administrator 197121 541 四月  8 11:32 for.sh
 25051272927384877 -rw-r--r-- 1 Administrator 197121 541 四月  8 11:32 for1.sh
  1407374883695985 drwxr-xr-x 1 Administrator 197121   0 四月  5 17:22 node_modules/
  2814749767292893 -rw-r--r-- 1 Administrator 197121 37K 四月  8 13:16 readme.md
  5066549580932128 drwxr-xr-x 1 Administrator 197121   0 四月  8 12:20 src/

你可以看到硬鏈接e.md與源文件commomError.md大小一致,而軟連接爲14字節,明顯比源文件小很多!同時軟連接給出了目標文件的地址:

lrwxrwxrwx 1 Administrator 197121  14 四月  9 11:15 error.md -> commonError.md

所以,當你移動了源文件後,軟連接也就失效了!

3.軟連接vs硬鏈接的區別

(1)軟鏈接也有硬鏈接沒有的缺點,因爲鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了~~,而硬鏈接就沒有這個缺陷,你想怎麼移就怎麼移(呵呵);還有它要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑。

(2)軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更爲廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器不同網絡對文件進行鏈接。

(3)關於 I節點的問題 。硬連接不管有多少個,都指向的是同一個I節點,會把 結點連接數增加 ,只要結點的連接數不是 0,文件就一直存在 ,不管你刪除的是源文件還是鏈接的文件 。只要有一個存在 ,文件就存在 (其實也不分什麼 源文件連接文件的 ,因爲他們指向都是同一個I節點)。 當你修改源文件或者連接文件任何一個的時候 ,其他的文件都會做同步的修改 。軟鏈接不直接使用i節點號作爲文件指針,而是使用文件路徑名作爲指針。所以 刪除連接文件對源文件無影響,但是刪除源文件,連接文件就會找不到要指向的文件 。軟鏈接有自己的inode,並在磁盤上有一小片空間存放路徑名

(4)軟連接可以對目錄進行連接

你可以查看下圖:

軟連接自己的i節點指向的文件原本的I節點,這是爲什麼我們軟連接在硬盤中佔據的空間要小很多!

上面是硬鏈接的特點

該圖給出了軟連接的特點,其中注意一點軟連接的權限不是777,而是與原來鏈接的文件的權限相關。同時,我們在鏈接的時候注意一般還是使用絕對路徑~

參考資料:

Linux “ls -l”文件列表權限詳解

linux 鏈接的使用 創建和刪除符號連接(軟、硬鏈接)

linux的問題

Windows 使用 ln -s 創建軟鏈接

Win7中的軟鏈接詳解(mklink命令)

bash ln

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章