linux hard link and symbolic link 2012-04-09
15:36:53
分類: LINUX
Linux鏈接分兩種,一種被稱為硬鏈接(Hard Link),另一種被稱為符號鏈接(Symbolic Link)。默認情況下,ln命令產生硬鏈接。
【硬連接】
硬連接指通過索引節點來進行連接。在Linux的文件系統中,保存在磁盤分區中的文件不管是什麼類型都給它分配一個編號,稱為索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。一般這種連接就是硬連接。硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。其原因如上所述,因為對應該目錄的索引節點有一個以上的連接。只刪除一個連接並不影響索引節點本身和其它的連接,只有當最後一個連接被刪除後,文件的數據塊及目錄的連接才會被釋放。也就是說,文件真正刪除的條件是與之相關的所有硬連接文件均被刪除。
硬連接的2個限制:
1 不允許給目錄創建硬鏈接
2 只有在同一文件系統中的文件之間才能創建鏈接。 即不同硬盤分區上的兩個文件之間不能夠建立硬鏈接。這是因為硬鏈接是通過結點指向原始文件的,而文件的i-結點在不同的文件系統中可能會不同。
【軟連接】
另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似於Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。
這就允許符號鏈接(經常簡寫為symlinks)指向位於其他分區、甚至是其他網絡硬盤上的某個文件
刪除原文件,查看軟連接會報找不到文件;刪除原文件,對硬鏈接沒有影響。
本質的區別:
(1)軟連接可以 跨文件系統 ,硬連接不可以 。實踐的方法就是用共享文件把windows下的 aa.txt文本文檔連接到linux下/root目錄 下 bb,cc . ln -s aa.txt /root/bb 連接成功 。ln aa.txt /root/bb 失敗;
(2)關於 I節點的問題 。硬連接不管有多少個,都指向的是同一個I節點,會把結點連接數增加,只要結點的連接數不是 0,文件就一直存在 ,不管你刪除的是源文件還是連接的文件。只要有一個存在,文件就 存在(其實也不分什麼 源文件連接文件的 ,因為他們指向都是同一個 I節點)。 當你修改源文件或者連接文件任何一個的時候,其他的 文件都會做同步的修改 。
軟鏈接不直接使用i節點號作為文件指針, 而是使用文件路徑名作為指針。所以刪除連接文件對源文件無影響,但是刪除源文件,連接文件就會找不到要指向的文件。軟鏈接有自己的inode, 並在磁盤上有一小片空間存放路徑名。
(3)硬鏈接不增加系統的I節點數目,軟鏈接增加系統I節點數目。
ps:可以通過命令 dumpe2fs -h /dev/sdx | grep Free\ \inodes來查看文件系統inode的使用情況。
首先要弄清楚,在Linux系統中,內核為每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個惟一的inode號。文件屬性保存在索引結點裡,在訪問文件時,索引結點被復制到內存在,從而實現文件的快速訪問。
鏈接是一種在共享文件和訪問它的用戶的若干目錄項之間建立聯系的一種方法。Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱為符號鏈接(Symbolic link)。
一、硬鏈接
硬鏈接說白了是一個指針,指向文件索引節點,系統並不為它重新分配inode。可以用:ln命令來建立硬鏈接。語法:
QUOTE:ln [options] existingfile newfile
ln[options] existingfile-list directory 用法: 第一種:為”existingfile”創建硬鏈接,文件名為”newfile”。第二種:在”directory”目錄中,為 ”existingfile-list”中包含的所有文件創建一個同名的硬鏈接。常用可選[options] –f 無論”newfile”存在與否,都創建鏈接。-n 如果”newfile”已存在,就不創建鏈接。
下面舉一些例子:
QUOTE:$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
$ ln file2 file2hard
$ ls –il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard 注意在創建鏈接前,file1 顯示的鏈接數目為1,創建鏈接後(1)file1和file1hard的鏈接數目都變為2;(2) file1和file1hard在inode號是一樣的(3) file1和file1hard顯示的文件大小也是一樣。可見進行了ln命令的操作結果:file1和file1hard是同一個文件的兩個名字,它們具 有同樣的索引節點號和文件屬性,建立文件file1的硬鏈接,就是為file1的文件索引節點在當前目錄上建立一個新指針。
鏈接數同時減一,只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除。當前目錄邏輯結構:(不好意思圖沒有顯示出來)。
還可以在不同目錄,但同一文件系統中建立文件的硬鏈接。設file1、file2在目錄/home/longcheng/dir1中,下面的命令,在/home/longcheng中建立file2的硬鏈接。
QUOTE:ln file2 /home/longcheng/file2hard 下面的程序,是將dir1目錄中所有文件,在目錄dir2中建立硬鏈接
QUOTE:$mkdir dir2
$ln /home/longcheng/dir1/* /home/longcheng/dir2 如果使用了 ln –f existingfile newfile,如果newfile已經存在,則無論原來newfile是什麼文件,只用當前用戶對它有寫權限,newfile就成為exisitngfile的硬鏈接文件。
盡管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一下不足之處:
(1)不可以在不同文件系統的文件間建立鏈接
(2)只有超級用戶才可以為目錄創建硬鏈接。雖然很多樹上說root用戶可以創建,但是筆者在學習過程中發現即使是root用戶也不能創建,我的系統是Redhat,內核2.4、2.6都試過,在其他系統中不知道是不是可以。
二、軟鏈接(符號鏈接)
軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。
建立軟鏈接,只要在ln後面加上選項 –s,下面舉個例子
QUOTE:$ ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
$ln –s file1 file1soft
$ls -il
13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1 從上面鏈接後的結果可以看出來軟鏈接與硬鏈接,區別不僅僅是在概念上,在實現上也是不同的。區別:硬鏈接原文件&鏈接文件公用一個inode號,說明他 們是同一個文件,而軟鏈接原文件&鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫
出來,因為在本質上硬鏈接文件和原文件是完全平等關系;鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;文件大小是不一樣的,硬鏈接文件顯示的大小是跟原
文件是一樣的,這用強調,因為是等同的嘛,而這裡軟鏈接顯示的大小與原文件就不同了,file1大小是48B,而file1soft是5B,這裡面的5實 際上就是“file1”的大小。
總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。
在不同系統之間建立軟鏈接、對目錄建立鏈接,這裡就不舉例了,讀者可以自己去嘗試,我也是在不斷實踐中學習的。
當然軟鏈接也有硬鏈接沒有的缺點,因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到 了~~,而硬鏈接就沒有這個缺陷,你想怎麼移就怎麼移(呵呵);還有它要系統分配額外的空間用於建立新的索引節點和保存原文件的路徑。
補充一下:可以通過symlink來查看鏈接文件,可以用 man symlink來學習。
以上轉自:http://xiaoer-1982.javaeye.com/blog/501950
補充:
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結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的文件,這樣
下來就會浪費很多系統空間了,特別是如果被硬連接的目錄中存在大量文件和子目錄的時候就更加明顯了。這也許是第二個原因。