欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux下的鏈接文件詳解

  發(fā)布時(shí)間:2016-11-24 15:31:55   作者:佚名   我要評(píng)論
Linux下的鏈接文件可以分為硬鏈接(hard link)與軟鏈接(soft link)。下面小編將詳細(xì)的講解Linux下的鏈接文件,有需要的朋友可以過(guò)來(lái)看看

ln命令

我們用ln命令創(chuàng)建硬鏈接或者軟鏈接。其語(yǔ)法為:

ln [options] file link

此命令的第一種形式會(huì)創(chuàng)建一個(gè)指向file的新的鏈接,其中options選項(xiàng),我們只記住一個(gè)就行,-s表示創(chuàng)建軟鏈接,而默認(rèn)會(huì)創(chuàng)建硬鏈接。例如:

# ln -s /usr/src/linux-2.6.32 /usr/src/linux

這里,我們創(chuàng)建了一個(gè)符號(hào)鏈接/usr/src/linux,指向真實(shí)的Linux源代碼目錄/usr/src/linux-2.6.32。

我們?cè)倥e一個(gè)例子,演示一下軟鏈接與硬鏈接的區(qū)別,我們創(chuàng)建一個(gè)myfile文件,然后再創(chuàng)建一個(gè)指向該文件的軟鏈接myslink和硬鏈接myhlink:

$ $ echo "an example." > myfile
$ ln -s myfile myslink
$ ls myfile myhlink

使用stat檢查前述文件:

$ stat my*
  File: `myfile'
  Size: 12          Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 11552       Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/     wjm)   Gid: (  500/     wjm)
Access: 2016-08-10 03:59:54.421017669 +0800
Modify: 2016-08-10 03:59:54.421017669 +0800
Change: 2016-08-10 04:00:08.689000105 +0800
  File: `myhlink'
  Size: 12          Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 11552       Links: 2
Access: (0664/-rw-rw-r--)  Uid: (  500/     wjm)   Gid: (  500/     wjm)
Access: 2016-08-10 03:59:54.421017669 +0800
Modify: 2016-08-10 03:59:54.421017669 +0800
Change: 2016-08-10 04:00:08.689000105 +0800
  File: `myslink' -> `myfile'
  Size: 6           Blocks: 0          IO Block: 4096   symbolic link
Device: fd00h/64768d    Inode: 11553       Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (  500/     wjm)   Gid: (  500/     wjm)
Access: 2016-08-10 04:00:03.784997923 +0800
Modify: 2016-08-10 04:00:03.784997923 +0800
Change: 2016-08-10 04:00:03.784997923 +0800

仔細(xì)觀察myfile和myhlink,發(fā)現(xiàn)它們指向同一個(gè)inode(inode號(hào)同為11552)。硬鏈接數(shù)(Links字段)同為2,這表示有兩個(gè)目錄項(xiàng)指向該inode,每增加一個(gè)硬鏈接Links字段值就會(huì)增加1。而myslink文件,我們發(fā)現(xiàn)它的inode號(hào)與前兩個(gè)不同,其訪問(wèn)權(quán)限為0777。我們刪除myhlink這個(gè)硬鏈接,看看會(huì)出現(xiàn)什么變化?這次我們用ls -il命令來(lái)查看:

$ rm myfile

$ ll -li
total 4
11552 -rw-rw-r-- 1 wjm wjm 12 Aug 10 03:59 myhlink
11553 lrwxrwxrwx 1 wjm wjm  6 Aug 10 04:00 myslink -> myfile

$ cat myhlink
an example.

$ cat myslink
cat: myslink: No such file or directory

ls命令的-i選項(xiàng)也可以輸出文件的inode號(hào)。輸出信息的第三列為硬鏈接數(shù),我們發(fā)現(xiàn)刪除了myfile文件后,myhlink的硬鏈接數(shù)已經(jīng)由2變?yōu)?了,但是原myfile文件的數(shù)據(jù)依然可以通過(guò)myhlink這個(gè)硬鏈接訪問(wèn),因?yàn)橛叉溄邮峭ㄟ^(guò)文件的inode號(hào)來(lái)訪問(wèn)文件數(shù)據(jù)的。然而通過(guò)myslink軟鏈接卻無(wú)法再訪問(wèn)原myfile文件的數(shù)據(jù)了,因?yàn)檐涙溄訉?shí)質(zhì)上是一個(gè)指向目標(biāo)文件的全路徑,這個(gè)路徑中任何一個(gè)環(huán)節(jié)斷裂,都會(huì)使這個(gè)軟鏈接失效。

追隨鏈接

自從了軟連接,當(dāng)你要備份、復(fù)制或者移動(dòng)目錄或者文件時(shí)候,會(huì)出現(xiàn)是否要“追隨鏈接”的問(wèn)題。如果是,則會(huì)復(fù)制鏈接所指向的對(duì)象;如果不是,則僅僅操作鏈接本身。

通常如tar或cp之類的命令工具會(huì)給出是否追隨鏈接的選項(xiàng)。如cp,你可以使用-L選項(xiàng)表示追隨鏈接(復(fù)制鏈接所指向的目標(biāo)),或者用-P表示不追隨鏈接(復(fù)制鏈接本身)。如下例:

$ mkdir dir1
$ ln -s /tmp/a.txt dir1/slink
$ cp -rL dir1 dir2
$ ls -l dir2
total 0
-rw-rw-r-- 1 wjm wjm 0 Aug  6 17:02 slink

這里我們?cè)赿ir1目錄下創(chuàng)建了一個(gè)軟鏈接,當(dāng)用-L選項(xiàng)將其復(fù)制到dir2目錄下時(shí),我們看到dir2目錄下的slink現(xiàn)在成為一個(gè)普通文件。如果使用-P選項(xiàng)(保存鏈接)復(fù)制,則復(fù)制后的文件依然是一個(gè)軟鏈接:

$ cp -rP dir1 dir3
$ ls -l dir3
total 0
lrwxrwxrwx 1 wjm wjm 10 Aug  6 17:07 slink -> /tmp/a.txt

假如沒(méi)有明確指定-L或者-P選項(xiàng),則cp的默認(rèn)行為將隨版本而定。

目錄的硬鏈接

前文提到過(guò),無(wú)法對(duì)一個(gè)目錄創(chuàng)建硬鏈接。但其實(shí)目錄是存在硬鏈接的,只是這個(gè)硬鏈接是系統(tǒng)自動(dòng)創(chuàng)建的,而我們不能手動(dòng)創(chuàng)建。當(dāng)我們用mkdir創(chuàng)建一個(gè)空目錄時(shí),會(huì)發(fā)現(xiàn)這個(gè)目錄的硬鏈接數(shù)為2,例如:

$ ls -dl ~
drwx------. 6 wjm wjm 4096 Aug 10 04:25 /home/wjm

$ cd ~
$ mkdir mydir

$ ls -dli ~
8605 drwx------. 7 wjm wjm 4096 Aug 10 04:25 /home/wjm

$ ls -dli mydir
11556 drwxrwxr-x 2 wjm wjm 4096 Aug 10 04:25 mydir

原先/home/wjm目錄的硬鏈接數(shù)量為6,當(dāng)在/home/wjm下創(chuàng)建了一個(gè)空目錄mydir后,它的硬鏈接數(shù)量變成了7,而這個(gè)空目錄mydir的硬鏈接數(shù)為2。這是為什么呢?原因是任何一個(gè)目錄下,都有兩個(gè)隱藏的硬鏈接:

ls -ali mydir
total 8
11556 drwxrwxr-x  2 wjm wjm 4096 Aug 10 04:25 .
 8605 drwx------. 7 wjm wjm 4096 Aug 10 04:25 ..

我們看到mydir目錄下有兩個(gè)隱藏的硬鏈接,使用ls的-a選項(xiàng)才能使其列出來(lái)。其中一個(gè)硬鏈接是“.”,指向的inode號(hào)為11556,就是mydir這個(gè)目錄本身的inode號(hào);另一個(gè)是“..”,通過(guò)inode號(hào)我們發(fā)現(xiàn)它指向了其父目錄/home/wjm。因此,當(dāng)創(chuàng)建了空目錄mydir后,mydir的硬鏈接數(shù)為2,而其父目錄的硬鏈接數(shù)加1。所以一個(gè)目錄的硬鏈接數(shù)=其子目錄數(shù)+2。

這種硬鏈接是系統(tǒng)自動(dòng)為我們創(chuàng)建的,而當(dāng)你試圖手動(dòng)創(chuàng)建一個(gè)指向目錄的硬鏈接時(shí),系統(tǒng)一定會(huì)報(bào)錯(cuò)阻止你這樣做。為什么呢?

其實(shí)在UNIX操作系統(tǒng)的歷史上,對(duì)目錄創(chuàng)建硬鏈接曾經(jīng)是允許的。但人們發(fā)現(xiàn),這樣做會(huì)出現(xiàn)很多問(wèn)題,尤其是一些對(duì)目錄樹(shù)進(jìn)行遍歷操作的如fsck、find等命令無(wú)法正確執(zhí)行。在《Unix高級(jí)環(huán)境編程》中提到作者Steven在自己的系統(tǒng)上做過(guò)實(shí)驗(yàn),結(jié)果是:創(chuàng)建目錄硬鏈接后,文件系統(tǒng)變得錯(cuò)誤百出。因?yàn)檫@樣做會(huì)破壞文件系統(tǒng)的樹(shù)形結(jié)構(gòu),可能會(huì)使目錄之間出現(xiàn)環(huán)。例如:

$ ln ~ ~/mydir/myhdir_link
ln: `/home/wjm': hard link not allowed for directory

$ ln -s ~ ~/mydir/myhdir_link

這里第一條命令我們?cè)噲D在mydir目錄下創(chuàng)建一個(gè)硬鏈接指向其父目錄,然而失敗了。因?yàn)檫@使得/home/wjm和/home/wjm/mydir兩個(gè)目錄之間形成一個(gè)環(huán),我們無(wú)法再區(qū)分這兩者誰(shuí)是父目錄誰(shuí)是子目錄了。然而第二條命令創(chuàng)建一個(gè)指向其父目錄的軟鏈接卻可以成功,難道這樣不是同樣形成了一個(gè)環(huán)嗎?

為什么軟鏈接可以指向目錄而硬鏈接不行呢?根本原因在于軟鏈接實(shí)質(zhì)上是一個(gè)文件,而硬鏈接實(shí)質(zhì)上是一個(gè)目錄項(xiàng)(dentry)。在linux系統(tǒng)中,每個(gè)文件(目錄也是文件,軟鏈接也是文件)都對(duì)應(yīng)著一個(gè)inode結(jié)構(gòu),其中inode數(shù)據(jù)結(jié)構(gòu)中包含了文件類型(目錄,普通文件,符號(hào)連接文件等等)的信息,也就是說(shuō)操作系統(tǒng)在遍歷目錄時(shí)可以判斷出符號(hào)連接。既然可以判斷出符號(hào)連接當(dāng)然就可以采取一些措施來(lái)防范進(jìn)入死循環(huán)了,系統(tǒng)在連續(xù)遇到8個(gè)符號(hào)連接后就停止遍歷,這就是為什么對(duì)目錄符號(hào)連接不會(huì)進(jìn)入死循環(huán)的原因了。而“硬鏈接”本質(zhì)上是“目錄項(xiàng)”的同義詞。當(dāng)一個(gè)目標(biāo)第一次被創(chuàng)建,就會(huì)為它創(chuàng)建一個(gè)目錄項(xiàng),這其實(shí)就是硬鏈接。大多數(shù)人常常把“硬鏈接”聯(lián)想成為一個(gè)已有的對(duì)象創(chuàng)建一個(gè)額外的目錄項(xiàng),但其實(shí)是原來(lái)的目錄項(xiàng)沒(méi)有任何特殊,所有的硬鏈接都是平等的,所以Linux內(nèi)核沒(méi)有方法能識(shí)別出哪個(gè)是“原文件”哪個(gè)是“硬鏈接”。這樣對(duì)于由于目錄硬鏈接而形成的環(huán)就無(wú)法進(jìn)行合適的處理。

但是根目錄是一個(gè)特例。我們觀察:

$ ls -dli /
2 dr-xr-xr-x. 22 root root 4096 Aug 10 00:50 /


$ ls -ali /
total 102
     2 dr-xr-xr-x. 22 root root  4096 Aug 10 00:50 .
     2 dr-xr-xr-x. 22 root root  4096 Aug 10 00:50 ..
... ...

可見(jiàn)這里根目錄的inode號(hào)為2,而且根目錄下的指向其父目錄的隱藏硬鏈接(..)也指向了自身。

相關(guān)文章

最新評(píng)論