Linux下的軟連結和永久連結的不同
一直以來,對Linux的連結都有點懵懵懂懂的,使用上也存在一些問題,這兩天仔細上網查了查資料,仔細瞭解了Linux上的永久連結和軟連結。
連結---------是一種在共用檔案和訪問它的使用者的若干目錄項之間建立聯絡的一種方法。
Linux中包括兩種連結:永久連結(Hard Link)和軟連結(Soft Link),軟連結又稱為符號連結(Symbolic link)。
我們首先來瞭解一下幾個名詞。
索引節點(inode)
要瞭解連結,我們首先得瞭解一個概念,叫索引節點(inode)。在Linux系統中,核心為每一個新建立的檔案分配一個Inode(索引結點),每個檔案都有一個惟一的inode號,我們可以將inode簡單理解成一個指標,它永遠指向本檔案的具體儲存位置。檔案屬性儲存在索引結點裡,在訪問檔案時,索引結點被複製到記憶體在,從而實現檔案的快速存取。系統是通過索引節點(而不是檔案名稱)來定位每一個檔案。
永久連結(Hard Link)
永久連結說白了是一個指標,指向檔案索引節點,系統並不為它重新分配inode。
可以用:ln命令來建立永久連結。
引用ln [options] existingfile newfile
ln [options] existingfile-list directory
用法:
第一種為”existingfile”建立永久連結,檔案名稱為”newfile”。
第二種在”directory”目錄中,為” existingfile-list”中包含的所有檔案建立一個同名的永久連結。
常用可選[options]:-f 無論”newfile”存在與否,都建立連結。-n 如果”newfile”已存在,就不建立連結。
軟連結(Soft Link)
軟連結又叫符號連結,這個檔案包含了另一個檔案的路徑名。可以是任意檔案或目錄,可以連結不同檔案系統的檔案。和win下的捷徑差不多。
可以用:ln -s 命令來建立軟連結。
引用ln -s existingfile newfile
ln -s existingfile-list directory
下面我們用一個執行個體來說明永久連結和軟連結。
現在目錄下有兩個檔案,一個名為AAA,一個名為BBB。
引用$ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
首先先做一個AAA的永久連結。
引用$ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
這裡我們注意在建立連結前,AAA顯示的連結數目為1,建立連結後
1.AAA和AAAhard的連結數目都變為2。
2.AAA和AAAhard的inode號是一樣的,都是963922。
3.AAA和AAAhard顯示的檔案大小也是一樣,都是92B。
可見進行了ln命令的操作結果:AAA和AAAhard是同一個檔案的兩個名字,它們具有同樣的索引節點號和檔案屬性,建立檔案AAA的永久連結,就是為AAA的檔案索引節點在目前的目錄上建立一個新指標。你可以刪除其中任何一個,如rm AAA,每次只會刪除一個指標,連結數同時減一,只有將所有指向檔案內容的指標,也即連結數減為0時,核心才會把檔案內容從磁碟上刪除。
儘管永久連結節省空間的,也是Linux系統整合檔案系統的傳統方式,但是存在一些不足之處:
1.不允許給目錄建立永久連結。
2.不可以在不同檔案系統的檔案間建立連結。
接著我們做一個指向BBB的軟連結,軟連結克服了永久連結的不足,沒有任何檔案系統的限制,任何使用者可以建立指向目錄的符號連結。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網路對檔案進行連結。
引用$ ln -s BBB BBBsoft
$ ls -il
總用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB
從上面連結後的結果可以看出來軟連結與永久連結,區別不僅僅是在概念上,在實現上也是完全不同的。
區別:
1.永久連結原檔案/連結檔案公用一個inode號,說明他們是同一個檔案,而軟連結原檔案/連結檔案擁有不同的inode號,表明他們是兩個不同的檔案;
2.在檔案屬性上軟連結明確寫出了是連結檔案,而永久連結沒有寫出來,因為在本質上永久連結檔案和原檔案是完全平等關係;
3.連結數目是不一樣的,軟連結的連結數目不會增加;
4.檔案大小是不一樣的,永久連結檔案顯示的大小是跟原檔案是一樣的。而這裡軟連結顯示的大小與原檔案就不同了,BBB大小是95B,而BBBsoft是3B。
總之,建立軟連結就是建立了一個新檔案。當訪問連結檔案時,系統就會發現他是個連結檔案,它讀取連結檔案找到真正要訪問的檔案。
當然軟連結也有永久連結沒有的缺點,因為連結檔案包含有原檔案的路徑資訊,所以當原檔案從一個目錄下移到其他目錄中,再訪問連結檔案,系統就找不到了,而永久連結就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統分配額外的空間用於建立新的索引節點和儲存原檔案的路徑。
串連計數count:
前面我們介紹了,檔案的連結計數域表明本系統中共有幾個檔案目錄項的inode和本檔案相同,也就是本檔案共有幾個永久連結。如上面的例子中AAA和AAAhard檔案的count值都是2。
那麼對於目錄,其count域的含義是什麼呢?目錄的count同樣表示共有多少個目錄項指向此目錄,不過要詳細說明必須進一步解釋VFS檔案系統的結構,為簡單起見,只要這樣理解就行了:(count-2)等於本目錄包含的直接子目錄數(就是只包括兒子,不包括孫子)。
例如:如果一個目錄/ln的count域為5,那麼/ln目錄一定包含3個子目錄。
/*********************************************************
在學習ln前要搞懂檔案系統的結構:
結點區 資料區
--------- ----------
| | | |
| | | |
| | | |
... ....
|-------| |--------|
這樣的檔案系統就如同一本書,結點區對應書的目錄,資料區對應書的正式章節.
本文以檔案/etc/passwd為例.
[applprod@erp applprod]$ stat /etc/passwd
File: "/etc/passwd"
Size: 1603 Blocks: 8 IO Block: -4612090707425882112 Regular File
Device: 803h/2051d Inode: 224278 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: Mon Oct 23 15:29:34 2006
Modify: Mon Jul 24 07:49:15 2006
Change: Mon Jul 24 07:49:15 2006
1.ln分為:
1)永久連結(節點備份);
2)符號連結(軟連結,類似WIN下的捷徑);
2.使用範圍
1)永久連結在任一分區內可任一建立,沒有數量限制,不支援目錄,不支援跨分區.永久連結就相當於頁碼數相同的兩個不同指向資料區的指標.通過使用永久連結可達到備份資料(實際是備份節點)的效果,但如果資料區出現問題這種方法也沒有辦法.
例如: ls file沒問題,但cat file則出現問題,這種情況說明資料區出現問題
2)符號連結是在結點區建立一個指向資料區結點的結點(軟結點-->硬結點-->資料區),支援目錄連結,可跨分區,有連結次數限制(最好不要超過8次),若原檔案刪除(軟結點-->硬結點-->資料區),則符號連結就變成斷連結.
***********************************************************/
ln命令詳細用法
指令名稱 : ln
使用許可權 : 所有使用者
使用方式 : ln [options] source dist,其中 option 的格式為 :
[-bdfinsvF] [-S backup-suffix] [-V {numbered,existing,simple}]
[--help] [--version] [--]
說明 : Linux/Unix 檔案系統中,有所謂的連結(link),我們可以將其視為檔案的別
名,而連結又可分為兩種 : 硬連結(hard link)與軟連結(symbolic link),硬連結的
意思是一個檔案可以有多個名稱,而軟連結的方式則是產生一個特殊的檔案,該檔案的
內容是指向另一個檔案的位置。硬連結是存在同一個檔案系統中,而軟連結卻可以跨越
不同的檔案系統。
ln source dist 是產生一個連結(dist)到 source,至於使用硬連結或軟鏈結則由參數
決定。
不論是硬連結或軟鏈結都不會將原本的檔案複製一份,只會佔用非常少量的磁碟空間。
參數 :
-f : 鏈結時先將與 dist 同檔名的檔案刪除
-d : 允許系統管理者硬鏈結自己的目錄
-i : 在刪除與 dist 同檔名的檔案時先進行詢問
-n : 在進行軟連結時,將 dist 視為一般的檔案
-s : 進行軟鏈結(symbolic link)
-v : 在連結之前顯示其檔名
-b : 將在鏈結時會被覆寫或刪除的檔案進行備份
-S SUFFIX : 將備份的檔案都加上 SUFFIX 的字尾
-V METHOD : 指定備份的方式
--help : 顯示輔助說明
--version : 顯示版本
範例 :
將檔案 yy 產生一個 symbolic link : zz
ln -s yy zz
將檔案 yy 產生一個 hard link : zz
ln yy xx