LINUX 硬鏈接與軟鏈接

       首先要弄清楚,在Linux系統中,內核爲每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個惟一的inode號。文件屬性保存在索引結點裏,在訪問文件時,索引結點被複制到內存在,從而實現文件的快速訪問。 

  鏈接是一種在共享文件和訪問它的用戶的若干目錄項之間建立聯繫的一種方法。Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱爲符號鏈接(Symbolic link)。 
符號連接相當於windows下的快捷方式。


不可以對  文件夾/目錄  建立硬連接的,我們通常用的還是軟連接比較多。    
    
eg:
    ln -s source dist        # 建立軟連接
    ln source dist            # 建立硬連接
 

    軟鏈接實際上只是一段文字,裏面包含着它所指向的文件的名字,系統看到軟鏈接後自動跳到對應的文件位置處進行處理;相反,硬鏈接爲文件開設一個新的目錄項,硬鏈接與文件原有的名字是平權的,在Linux看來它們是等價的。由於這個原因,硬鏈接不能連接兩個不同文件系統上的文件。
 
軟連接與windows下的快捷方式類似

至於硬連接,舉個例子說吧,你把dir1/file1硬連接到dir2/file2, 就是在dir2下建立一個dir1/file1的鏡像文件file2,它與file1是佔用一樣大的空間的,並且改動兩者中的一個,另一個也會發生同樣的改動.

軟連接和硬連接可以這樣理解:
硬連接就像一個文件有多個文件名,
軟連接就是產生一個新文件(這個文件內容,實際上就是記當要鏈接原文件路徑的信息),這個文件指向另一個文件的位置,
硬連接必須在同一文件系統中,而軟連接可以跨文件系統

硬連接 :源文件名和鏈接文件名都指向相同的物理地址,目錄不能夠有硬連接,文件在磁盤中只有一個複製,可以節省硬盤空間,由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此可以防止不必要的誤刪除軟連接(符號連接)用ln -s命令創建文件的符號連接,符號連接是linux特殊文件的一種,作爲一個文件,它的資料是它所連接的文件的路徑名,類似於硬件方式,******可以刪除原始文件 而連接文件仍然存在。

 

 一 鏈接文件


    鏈接有兩種方式,軟鏈接和硬鏈接。
  1 軟鏈接文件
  軟鏈接又叫符號鏈接,這個文件包含了另一個文件的路徑名。可以是任意文件或目錄,可以鏈接不同文件系統的文件。
    **********鏈接文件甚至可以鏈接不存在的文件,這就產生一般稱之爲"斷鏈"的問題(或曰“現象"),鏈接文件甚至可以循環鏈接自己。類似於編程語言中的遞歸。
  用ln -s 命令可以生成一個軟連接,如下:
  [root@linux236 test]# ln -s  source_file softlink_file
  在對符號文件進行讀或寫操作的時候,系統會自動把該操作轉換爲對源文件的操作,但刪除鏈接文件時,系統僅僅刪除鏈接文件,而不刪除源文件本身。
  2 硬鏈接文件
  info ln 命令告訴您,硬鏈接是已存在文件的另一個名字(A "hard link" is another name for an existing file),這多少有些令人困惑。硬連接的命令是
  ln -d existfile newfile
  硬鏈接文件有兩個限制
  1)、不允許給目錄創建硬鏈接;
  2)、只有在同一文件系統中的文件之間才能創建硬鏈接。
  對硬鏈接文件進行讀寫和刪除操作時候,結果和軟鏈接相同。但如果我們刪除硬鏈接文件的源文件,硬鏈接文件仍然存在,而且保留了願有的內容。
   這時,系統就“忘記”了它曾經是硬鏈接文件。而把他當成一個普通文件。


二  兩者之間的區別
    硬連接指通過索引節點來進行的連接。在Linux的文件系統中,保存在磁盤分區中的文件不管是什麼類型都給它分配一個編號,稱爲索引節點號(Inode Number)。
    在Linux中,多個文件名指向同一索引節點是存在的。一般這種連接就是硬連接。*******硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要
    文件,以防止“誤刪”的功能。其原因如上所述,因爲對應該目錄的索引節點有一個以上的連接。只刪除一個連接並不影響索引節點本身和其它的連接,只有當最後一個
    連接被刪除後,文件的數據塊及目錄的連接纔會被釋放。也就是說,文件纔會被真正刪除。
    軟鏈接文件有點類似於Windows的快捷方式。它實際上是特殊文件的一種。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。


三  個人體會
    軟鏈接是另一個文件,作用可以理解爲一個指針,作用在這個文件上的操作除了刪除都直接轉向實際指向文件,由於是一個真實的文件所以佔用磁盤空間
    硬鏈接可以認爲不是一個文件,它只是實際文件的一個別名,它的作用是防止真實文件被誤操作,給一個文件建立硬鏈接後,他們互爲別名,刪除其中任意一個,
    這樣用RM命令只會刪除該別名,實際文件並不會被刪除。只有鏈接數爲0時,纔會刪除原始文件。


linux系統中的硬連接有兩個限制不能跨越文件系統不允許普通用戶對目錄作硬連接

至於第一個限制,很好理解,而第二個就不那麼好理解 了。 對任何一個目錄用ls -l 命令都可以看到其連接數至少是2,這也說明了系統中是存在硬連接的,而且命令ln -d 也可以讓超級用戶對目錄作硬連接,這些都說明了系統限制對目錄進行硬連接只是一個硬性規定,並不是邏輯上不允許或技術上的不可行。那麼操作系統爲什麼要進 行限制呢?答案可能有兩個。


  先來說第一個如果引入了對目錄的硬連接就有可能在目錄中引入循環那麼在目錄遍歷的時候系統就會陷入無限循環當中。也許您會說,符號連接不也可以引入循 環嗎,那麼爲什麼不限制目錄的符號連接呢?原因就在於在linux系統中,每個文件(目錄也是文件)都對應着一個inode結構,其中inode數據結構 中包含了文件類型(目錄,普通文件,符號連接文件等等)的信息,也就是說操作系統在遍歷目錄時可以判斷出符號連接,既然可以判斷出符號連接當然就可以採取 一些措施來防範進入過大的循環了,系統在連續遇到8個符號連接後就停止遍歷,這就是爲什麼對目錄符號連接不會進入死循環的原因了。但是對於硬連接,由於操 作系統中採用的數據結構和算法限制,目前是不能防範這種死循環的。

  在說明第二個原因之前,先來看看文件的dentry結構在系統空間中長什麼樣子和它們是怎麼存放在系統空間的。dentry結構主要包含了文件名,文件的inode號,指向父目錄dentry結構的指針和其他一些與本次討論無關的指針,這裏關鍵是那個指向父目錄的指針;系統中所有的dentry結構都 是按雜湊值存放在雜湊表中的,這裏的雜湊算法很重要,它是取文件名和文件的父目錄dentry結構的地址一起雜湊運算出雜湊值的。現在假設有兩個目錄 /a和/b,其中/b是我們通過ln -d命令建立起來的對/a的硬連接。這個時候內核空間中就會存在一個/a的dentry結構和一個/b的dentry結構,由上面的知識可知,/a和/b 目錄下面的每一個文件或目錄都各自有對應的dentry結構(因爲雖然/a目錄下面的文件名沒有改變,但是因爲dentry結構有指向父目錄dentry 的指針和計算雜湊值時考慮了父目錄dentry結構的地址,這個時候dentry結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的文件,這樣 下來就會浪費很多系統空間了,特別是如果被硬連接的目錄中存在大量文件和子目錄的時候就更加明顯了。這也許是第二個原因。 


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