Ubuntu 12.04 link file詳解

在Unix世界裏有兩個’link’(鏈接)概念,一般稱之爲硬鏈接和軟鏈接。
在學習link之前,先了解一下inode和block的概念。inode 譯成中文就是索引節點。每個存儲設備或存儲設備的分區(存儲設備是硬盤、軟盤、U盤 ... ... )被格式化爲文件系統後,應該有兩部份,一部份是inode,另一部份是Block,Block是用來存儲數據用的。而inode呢,就是用來存儲這些數據的信息,這些信息包括文件的類型和權限屬性,屬主,屬組,文件大小,修改日期等。inode爲每個文件進行信息索引,所以就有了inode的數值。操作系統根據inode值能最快的找到相對應的文件。
用ls可以查看文件的inode
                
$ touch goodluck
$ ls -li
32908 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
32908 就是文件goodluck的inode值。
硬鏈接
一個硬鏈接僅僅是一個文件名。(一個文件可以有好幾個文件名,只有將 最後一個文件名從磁盤上刪除,才能把這個文件刪掉。文件名的個數是由 ls(1)來確定的。所有的文件名都處於同一個狀態,也就沒有什麼源名字 之說。通常文件系統裏的一個文件的所有名字包含着一樣的數據信息,不 過這樣也不是必需的。)
在Linux 文件系統中,inode值相同的文件是硬鏈接文件,也就是說,不同的文件名,inode可能是相同的,一個inode值可以對應多個文件。
$ ls -li
32908 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
$ ln goodluck goodluck1
$ ls -li
32908 -rw-r--r-- 2 ubuntu ubuntu    0 2007-01-12 00:20 goodluck
32908 -rw-r--r-- 2 ubuntu ubuntu    0 2007-01-12 00:20 goodluck1
由上面的代碼可以看到,爲文件goodluck創建一個硬鏈接goodluck1,兩個文件的inode值都是32908,即兩個文件用同一個inode值,而文件鏈接的個數由1變成了2。硬鏈接的文件是互爲鏈接的,並沒有所謂誰是源文件的說法。刪除任何一個硬鏈接文件,並不會對跟它互爲鏈接的文件產生任何影響。但是如果對文件進行修改,互爲鏈接的文件也會跟着修改。在上面代碼的基礎上:
$ echo 'hello world!'>goodluck
$ cat goodluck1
hello
$ ls -li
35159 -rw-r--r-- 2 ubuntu ubuntu   13 2007-01-12 14:06 goodluck
35159 -rw-r--r-- 2 ubuntu ubuntu   13 2007-01-12 14:06 goodluck1
修改goodluck,在裏面寫入"hello world!",可以看到goodluck1裏也寫入了"hello world!",再用ls -li查看,可以看到兩個文件的大小和修改日期一樣的都改變了。
$ rm goodluck1
$ ls -li
35159 -rw-r--r-- 1 ubuntu ubuntu   13 2007-01-12 14:06 goodluck
刪除了goodluck1之後,goodluck完全沒有變化,不過鏈接的個數變成了1.
另外注意:硬鏈接不可以跨文件系統,而且只可以對文件做鏈接,不可以對目錄做鏈接。
軟鏈接
軟鏈接(也叫符號鏈接)是 一個包含了路徑信息的小小的指定文件。因此,軟鏈接可以指向不同文件系統裏的文件(比如由NFS裝載的不同機器文件系統上的文件),甚至可以 指向一個不一定確實存在的文件。在軟鏈接文件被訪問(系統調用open(2) 或stat(2))的時 候, 操 作 系 統 用 該 文件所包含的路徑替換該文件的訪問介 入點,從而實現對所指文件的訪問。(用命令rm(1)和unlink(2)可以刪除 鏈接,但不是刪除該文件所指向的文件。系統指定調用lstat(2)和readlink(2) 來讀取鏈接文件與其所指文件的狀態。到底是對軟鏈接文件操作,還是對被 指向文件操作,由於不同操作系統件存在不同的系統調用,而存在着差異。)
$ touch goodluck
$ ln -s goodluck goodluck2
$ ls -li
36277 -rw-r--r-- 1 ubuntu ubuntu    0 2007-01-12 14:06 goodluck
36279 lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:26 goodluck2 -> goodluck
創建一個文件goodluck,並做一個符號鏈接goodluck2。可以看到,goodluck和goodluck2兩個文件的inode是不相同的,由goodluck2的文件類型和權限lrwxrwxrwx可以看到,goodluck2不是文件,它只是個鏈接,相當於一個路徑。goodluck2 -> goodluck就是說goodluck2的源文件是goodluck。
當符號鏈接文件發生改變時,源文件也會跟着改變,但是如果源文件被刪除了,符號鏈接也就不存在意義了,也就是所謂的斷鏈。
$ echo 'hello world!'>goodluck2
$ cat goodluck
hello
$ ls -l
-rw-r--r-- 1 ubuntu ubuntu   13 2007-01-12 14:39 goodluck
lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:38 goodluck2 -> goodluck
$ rm goodluck
$ cat goodluck2
cat: goodluck2: No such file or directory
lrwxrwxrwx 1 ubuntu ubuntu    8 2007-01-12 14:38 goodluck2 -> goodluck
當刪除了goodluck後,goodluck2就成了斷鏈。
注意:符號鏈接不僅可以對文件做鏈接,同樣也適用於目錄。要特別注意,對目錄做符號鏈接跟對文件做符號鏈接有一點不同,當把符號鏈接目錄中的文件刪除了,也就是把源文件給刪除了。而對於文件做的符號鏈接,刪除符號鏈接文件並不會對源文件有任何影響。
$ mkdir goodluck
$ cd ./goodluck
$ touch goodluck1 goodluck2
$ cd ..
$ln -s ./goodluck/ ./luckgood
$ ls -li
36562 drwxr-xr-x 2 ubuntu ubuntu 4096 2007-01-12 14:52 goodluck
36657 lrwxrwxrwx 1 ubuntu ubuntu   11 2007-01-12 14:54 luckgood -> ./goodluc
$ rm ./luckgood/goodluck1
$cd ./goodluck
$ls -l
goodluck2
創建文件夾goodluck,在goodluck下建立兩個文件goodluck1,goodluck2。給文件夾goodluck做符號鏈接luckgood,把符號鏈接文件夾裏面的goodluck1刪除,可以看到源文件./goodluck/goodluck1被刪除了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章