天天看點

Linux中的軟硬連接配接

Linux中的軟硬連接配接

Linux中的連接配接被分為軟連接配接和硬連接配接,軟連接配接又被稱為符号連接配接。這種連接配接操作實際上是給系統中已有的某個檔案指定另外一個可用于通路它的名稱。對于這個新的檔案名,我們可以為之指定不同的通路權限,以控制對資訊的共享和安全性的問題。 如果連結指向目錄,使用者就可以利用該連結直接進入被連結的目錄而不用打一大堆的路徑名。而且,即使我們删除這個連結,也不會破壞原來的目錄。

Linux中的檔案的檔案名、檔案屬性和檔案的資料是分開存儲的。在檔案系統初始化的時候,硬碟就被分成兩個區域iNode區(iNode table)和資料區(block)。檔案名存放在目錄項(dentry)中,檔案的屬性存放在iNode中,而檔案的内容,即檔案的實際資料存放在block中。目錄檔案是特殊的檔案,這是因為目錄檔案中的資料是一個關聯清單,儲存檔案名(包括目錄名)和iNode的映射。這也導緻了如果一個使用者對一個目錄隻有r權限,那麼他隻能讀取目錄下的檔案名和iNode的id,而無法讀取這些iNode中存放的檔案的屬性資訊,讀取這些資訊需要x權限。

一、硬連接配接

硬連結是使用inode号作為指針的。這種連結中,兩個檔案(檔案連結檔案A 和原檔案 B)的檔案名不同,但是iNode号是相同的,這種情況下,通路檔案連接配接檔案A時,系統會自動根據檔案A的inode号來查找檔案。此時如果檔案B被删除,檔案A依然能夠正常通路檔案。這樣就相當于檔案被做了備份一樣。

1、建立普通檔案并檢視inode号及連接配接數

[root@yu63 test]# touch a.txt

[root@yu63 test]# stat a.txt

  File: "a.txt"

  Size: 0         Blocks: 0          IO Block: 4096   普通空檔案

Device: 802h/2050dInode: 274338      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-06-14 12:35:14.963998529 +0800

Modify: 2017-06-14 12:35:14.963998529 +0800

Change: 2017-06-14 12:35:14.963998529 +0800

解釋:Links:1 指的是這個檔案是被硬連接配接自己。

2、建立硬連結

[root@yu63 test]# ln -d a.txt a.txt.block #建立硬連結

Device: 802h/2050dInode: 274338      Links: 2

Change: 2017-06-14 12:35:42.657998429 +0800

[root@yu63 test]# stat a.txt.block

  File: "a.txt.block"

解釋:建立的硬連結,源檔案與連結檔案的inode号是不變的,說明硬連結是根據inode号來連結的。a.txt的連結數是2,說明存在硬連結,即還有其他的檔案名連結到這個iNode。這時通過其中一個檔案名修改檔案中的内容會對這兩個檔案都有影響。但是删除一個檔案名,并不會影響另一個檔案名的正常通路。

3、删除源檔案或者連結檔案

[root@yu63 test]# echo '123456' > a.txt

[root@yu63 test]# cat a.txt

123456

[root@yu63 test]# cat a.txt.block

[root@yu63 test]# rm -rf a.txt

解釋:這裡将源檔案給删除了,并沒有影響另一個檔案名的正常通路。

二、軟連接配接

軟連接配接是使用檔案路徑來作為指針的。這種連結中,兩個檔案(檔案連結檔案A 和原檔案 B)的檔案名和iNode都不同,但是其中一個檔案(假設是檔案A)的block中存放的内容是另一個檔案(假設是檔案B)的路徑(即絕對路徑,包括檔案名),這種情況下,通路檔案A時,系統會自動根據檔案A的block中的路徑内容通路檔案B的block中存放的内容。此時如果檔案B被删除,再通路檔案A時,系統會報錯,告知使用者該檔案不存在。這從一定程度上保證了安全性。

1、建立源檔案及檢視inode号和連接配接數

[root@yu63 test]# touch b.txt

[root@yu63 test]# stat b.txt

  File: "b.txt"

Device: 802h/2050dInode: 274339      Links: 1

Access: 2017-06-14 12:36:03.563999873 +0800

Modify: 2017-06-14 12:36:03.563999873 +0800

Change: 2017-06-14 12:36:03.563999873 +0800

2、建立軟連接配接

[root@yu63 test]# ln -s b.txt b.txt.block

[root@yu63 test]# ls

a.txt.block  b.txt  b.txt.block

[root@yu63 test]# stat b.txt.block

  File: "b.txt.block" -> "b.txt"

  Size: 5         Blocks: 0          IO Block: 4096   符号連結

Device: 802h/2050dInode: 274340      Links: 1

Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-06-14 12:37:33.196997558 +0800

Modify: 2017-06-14 12:37:32.035998060 +0800

Change: 2017-06-14 12:37:32.035998060 +0800

解釋:inode号發生了改變,說明軟連接配接不是根據inode号來連結的,實際上以檔案的絕對路徑來連結的。

[root@yu63 test]# echo '123456789'> b.txt

[root@yu63 test]# cat b.txt

123456789

[root@yu63 test]# cat b.txt.block

[root@yu63 test]# rm -rf b.txt

cat: b.txt.block: 沒有那個檔案或目錄

[root@yu63 test]#

注釋:這裡删除了源檔案,在檢視連結檔案之後,就會産生檔案不存在的報錯。

三、軟硬連結對目錄進行連接配接

[root@yu63 test]# ln -d c.txt /home

ln: 建立硬連結"/home/c.txt": 檔案已存在

[root@yu63 test]# ln -s d.txt /home

解釋:軟連結可以對目錄進行連結,而硬連結不可以

四、硬連結和軟連結的主要差別在于:

(1)軟連結可以跨檔案系統,硬連結不可以。

(2)硬連結不管有多少個,都指向的是同一個iNode,會把iNode連結數增加隻要iNode的連結數不是 0,檔案就一直存在,不管你删除的是源檔案還是連結的檔案。隻要有一個存在,檔案就存在(其實也不分什麼 源檔案連結檔案的,因為他們指向都是同一個 iNode)當你修改源檔案或者連結檔案任何一個的時候 ,其他的檔案都會做同步的修改。軟連結不直接使用iNode号作為檔案指針,而是使用檔案路徑名作為指針(軟連結跟源檔案的iNode不一樣)。是以删除連結檔案對源檔案無影響,但是删除源檔案,連結檔案就會找不到要指向的檔案 。軟連結有自己的iNode,并在磁盤上有一小片空間存放路徑名.

(3)軟連結可以對一個不存在的檔案名進行連結。

(4)軟連結可以對目錄進行連結,而硬連結不可以。

本文轉自 于學康 51CTO部落格,原文連結:http://blog.51cto.com/blxueyuan/1936601,如需轉載請自行聯系原作者

繼續閱讀