1. 是什么
- 鏈接:一種在共享文件和訪問它的用戶的若干目錄項(xiàng)之間建立聯(lián)系的一種方法。
-
【硬鏈接】(hard link):指通過索引節(jié)點(diǎn)來進(jìn)行連接,就是一個文件(不是文件夾)的別名,無論有多少各別名,但它其實(shí)是一個文件。
可以這樣理解:
一面墻上有一個洞,洞里放著一個蘋果。從墻的這一面看是這個蘋果,從墻的另一面看還是同一個蘋果
也就是說同一塊數(shù)據(jù)但有兩個不同的名字,讀寫的時候本質(zhì)上都是修改的同一塊數(shù)據(jù)。
硬鏈接的刪除:
硬鏈接在刪除的時候只是刪除了一個名字,只有一塊數(shù)據(jù)的所有名字都刪除了的時候,數(shù)據(jù)才會被刪除。(刪除的時候相當(dāng)于把墻的這一面糊上,但蘋果本身不動,只有兩面都糊上了,你才會看不到)
-
【軟鏈接】(又稱符號鏈接,即 soft link 或 symbolic link):相當(dāng)于我們 Windows 中的快捷方式,即如果你軟鏈接一個目錄,只是一個目錄的快捷方式到指定位置,操作系統(tǒng)找這個快捷方式會直接找到真實(shí)目錄下的文件。
可以這樣理解:
我聲稱我有一個蘋果,但是當(dāng)你找我要的時候,我對你說,到某個建筑物的倉庫就可以拿到那個蘋果了??梢娢也⒉徽嬲龘碛幸粋€蘋果,我只是擁有“某個地方有一個蘋果”這個信息。但對于外部的觀察者來說,這跟我實(shí)際上擁有一個蘋果并無差異。
軟鏈接的刪除:
假設(shè)我死了,不會影響到原始數(shù)據(jù)。假設(shè)原始數(shù)據(jù)沒了,那我這個符號鏈接就變成了一張空頭支票,也就是懸空的符號鏈接。
一個符號鏈接可以指向一個不存在的目標(biāo),而硬鏈接就表示肯定有文件存在。
硬鏈接可以指向文件,也可以指向目錄??梢钥缭饺魏挝募到y(tǒng)??截悇h除原始文件或者鏈接文件,不會造成相互影響。
2. 怎么查看
通過ls -l查看,->后面就是原始地址
$ ls -l
total 6964
lrwxrwxrwx 1 wangdanna wangdanna 48 10月 14 16:07 1.jpg -> /home/wangdanna/Downloads/picture/wallpaper1.jpg
-rw-rw-r-- 2 wangdanna wangdanna 3858 10月 9 02:13 7.jpg
-rw-rw-r-- 1 wangdanna wangdanna 14009 10月 9 01:51 love.jpg
-rw-rw-r-- 1 wangdanna wangdanna 66420 10月 9 16:51 persepolis_6-t2.jpg
如上圖,前面帶有l的就是軟鏈接,不帶的則是硬鏈接,lrwxrwxrwx 1 wangdanna wangdanna 48 10月 14 16:07 1.jpg -> /home/wangdanna/Downloads/picture/wallpaper1.jpg 在->后面的是真實(shí)路徑
3. 優(yōu)缺點(diǎn)
- 優(yōu)點(diǎn)
硬連接的作用是允許一個文件擁有多個有效路徑名,這樣用戶就可以建立硬連接到重要文件,以防止“誤刪”的功能。
比如我將一個名為
test.txt從/home/XX/筆記硬鏈接到/home/XX/桌面,
編輯桌面的test.txt時 筆記下的test.txt已同步更新了
即使不小心把桌面上的test.txt刪了,/home/XX/筆記里的test.txt還在
你可能會說為什么不直接復(fù)制test.txt呢?
復(fù)制要占兩個大小啊,而且復(fù)制了,你編輯了一個,另一個它不同步啊
- 缺點(diǎn)
軟鏈接文件包含有原文件的路徑信息,所以當(dāng)原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統(tǒng)就找不到了
硬鏈接就沒有這個缺陷,你想怎么移就怎么移
4. 怎么創(chuàng)建
- 查看
$ ls -l
total 504
-rw-rw-r-- 1 wangdanna wangdanna 91327 10月 11 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 10月 12 21:40 html5播放器.png
drwxrwxr-x 2 wangdanna wangdanna 4096 10月 9 17:29 Wallpapers/
- 創(chuàng)建軟鏈接
$ ln -s old.file soft.link
// 可對不存在的文件創(chuàng)建軟鏈接
$ ls -l
total 504
-rw-rw-r-- 1 wangdanna wangdanna 91327 10月 11 14:03 github_api.png
-rw-rw-r-- 1 wangdanna wangdanna 413749 10月 12 21:40 html5播放器.png
lrwxrwxrwx 1 wangdanna wangdanna 8 10月 14 16:28 soft.link -> old.file
drwxrwxr-x 2 wangdanna wangdanna 4096 10月 9 17:29 Wallpapers/
$ cat soft.link
# 由于被指向的文件不存在,此時的軟鏈接 soft.link 就是死鏈接
cat: soft.link: No such file or directory
$ echo "This is an original file_A" >> old.file
// 創(chuàng)建被指向的文件 old.file,soft.link 恢復(fù)成正常的軟鏈接
$ cat soft.link
#可看到文件內(nèi)容了
This is an original file_A
5. 加深理解
$ touch f1
#創(chuàng)建一個測試文件f1
ln f1 f2
#創(chuàng)建f1的一個硬連接文件f2
ln -s f1 f3
#創(chuàng)建f1的一個軟鏈接文件f3
$ ls -li
#-i參數(shù)顯示文件的inode節(jié)點(diǎn)信息
total 0
4083871 -rw-rw-r-- 2 wangdanna wangdanna 0 10月 14 16:37 f1
4083871 -rw-rw-r-- 2 wangdanna wangdanna 0 10月 14 16:37 f2
4083907 lrwxrwxrwx 1 wangdanna wangdanna 2 10月 14 16:37 f3 -> f1
從上面的結(jié)果中可以看出,硬連接文件 f2 與原文件 f1 的inode節(jié)點(diǎn)相同,均為4083871,然而軟連接文件的inode節(jié)點(diǎn)不同
$ echo "I am f1 file" >>f1
$ cat f1
I am f1 file
$ cat f2
I am f1 file
$ cat f3
I am f1 file
$ rm -f f1
$ cat f2
I am f1 file
$ cat f3
No such file or directory
通過上面的測試可以看出:當(dāng)刪除原始文件 f1 后,硬連接 f2 不受影響,但是軟鏈接 f1 文件無效
得出結(jié)論
- 刪除軟鏈接 f3 ,對 f1,f2 無影響;
- 刪除硬鏈接 f2,對 f1,f3 也無影響;
- 刪除原文件 f1,對硬鏈接 f2 沒有影響,導(dǎo)致符號鏈接 f3 失效;
- 同時刪除原文件 f1,硬鏈接 f2,整個文件會真正的被刪除。
6. 特性總結(jié)
【硬鏈接】
- 文件有相同的 inode 及 data block;
- 只能對已存在的文件進(jìn)行創(chuàng)建;
- 不能交叉文件系統(tǒng)進(jìn)行硬鏈接的創(chuàng)建;
- 不能對目錄進(jìn)行創(chuàng)建,只可對文件創(chuàng)建;
- 刪除一個硬鏈接文件并不影響其他有相同 inode 號的文件。
不能對目錄創(chuàng)建的原因: 硬連接的話,相當(dāng)于鏡像的方式,你創(chuàng)建一個目錄的硬連接之后,操作系統(tǒng)需要把這* 個目錄下所有的文件都要做一次硬連接(復(fù)制一份過去),這樣操作系統(tǒng)在訪問這個鏈接的時候要不斷去遍歷,大大增加復(fù)雜度,而且很容易進(jìn)入死循環(huán)。現(xiàn)在linux沒有很好支持這個 所以 不支持。詳情見這里和這里
【軟鏈接】
- 軟鏈接有自己的文件屬性及權(quán)限等;
- 可對不存在的文件或目錄創(chuàng)建軟鏈接;
- 軟鏈接可交叉文件系統(tǒng);
- 軟鏈接可對文件或目錄創(chuàng)建;
- 創(chuàng)建軟鏈接時,鏈接計數(shù) i_nlink 不會增加;
- 刪除軟鏈接并不影響被指向的文件,但若被指向的原文件被刪除,則相關(guān)軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創(chuàng)建,死鏈接可恢復(fù)為正常的軟鏈接
參考鏈接https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/