Linux 中的文件分為 Hard Link 和 Symbolic Link 兩種。Hard Link
文件又被稱為硬鏈接文件、實(shí)體鏈接文件,Symbolic Link 文件則常被稱為符號鏈接、軟鏈接文件。
ln 命令用來在文件之間建立鏈接。在介紹 ln 命令前,讓我們先來搞清楚究竟什么是硬鏈接,什么又是軟鏈接。
Hard Link(硬鏈接)
我們知道,在 Linux 系統(tǒng)中,每個文件對應(yīng)一個 inode,文件的內(nèi)容在存儲在 inode 指向的 data block
中。要讀取該文件的內(nèi)容,需要通過文件所在的目錄中記錄的文件名找到文件的 inode 號,然后通過 inode 找到存儲文件內(nèi)容的 data block(參考《
Linux 文件與目錄 <https://www.cnblogs.com/sparkdev/p/11249659.html>》)。
也就是說,文件名存儲在目錄中,inode 號執(zhí)行文件存儲的內(nèi)容,文件名和 inode 之間有一個對應(yīng)關(guān)系。那么多個文件名可不可以同時指向同一個 inode
呢?答案是可以的,這就是硬鏈接!從本質(zhì)上來說,硬鏈接只是在目錄下新添加了一個文件名,這個文件名與一個已有文件的 inode 相關(guān)聯(lián)。讓我們也通過
/etc/crontab 文件來進(jìn)行觀察:
$ ll -i /etc/crontab 131213 -rw-r--r-- 1 root root 722 Nov 16 2017 /etc/crontab
使用 ln 命令在當(dāng)前目錄下創(chuàng)建一個 /etc/crontab 文件的硬鏈接,然后觀察其文件屬性:
$ sudo ln /etc/crontab . $ ll -i /etc/crontab crontab 131213 -rw-r--r-- 2 root
root722 Nov 16 2017 crontab 131213 -rw-r--r-- 2 root root 722 Nov 16 2017
/etc/crontab
這兩個文件名關(guān)聯(lián)的 inode 號完全相同,都是 131213,所以它們指向的是同一個文件。同時請注意文件屬性中的第三個字段,由 1 變成了
2。這個字段被稱為 "鏈接數(shù)",它說明有多少個文件名鏈接到同一個文件的 inode。
另外需要注意的一點(diǎn)是上面所有輸出中的第二個字段中的第一位,它們都是 "-",它說明這個文件的類型為普通文件,鏈接類型為硬鏈接。
我們可以通過下圖來理解硬鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式:
硬鏈接的特點(diǎn)
* 幾乎不額外占用空間
* 只要還有一個文件名引用著文件,文件就不會被真正刪除
由于硬鏈接只是在目錄中添加了一條包含文件名和 對應(yīng) inode 的記錄,所以它幾乎不會消耗額外的磁盤容量。
另外在刪除硬鏈接所關(guān)聯(lián)的文件時,其實(shí)只是刪除了一條目錄中的記錄,真正的文件并不受影響。只有在刪除最后一個硬鏈接時才會真正刪除文件的內(nèi)容數(shù)據(jù)。
硬鏈接的局限性
* 不能跨文件系統(tǒng)創(chuàng)建硬鏈接
* 不能鏈接目錄
由于這兩個限制,實(shí)際使用中硬鏈接并沒有軟鏈接使用的廣泛,下面我們看看究竟什么是軟鏈接。
Symbolic Link(軟鏈接)
軟鏈接的實(shí)現(xiàn)方式與硬鏈接有本質(zhì)上的不同。創(chuàng)建軟鏈接時會創(chuàng)建一個新的文件(分配一個 inode 和對應(yīng)的 data block),新文件的 data
block 中存儲了目標(biāo)文件的路徑。
還拿 /etc/crontab 文件舉例子,這次創(chuàng)建一個軟鏈接并查看其文件屬性:
$ sudo ln -s /etc/crontab crontab2
第一列,兩個文件名對應(yīng)的 inode 不同,說明這是兩個文件。
第二列顯示的文件權(quán)限也不一樣,這一點(diǎn)和硬鏈接完全不同。注意文件類型被標(biāo)記為 "l",說明這是一個軟鏈接文件。
第三列很有意思,注意 /etc/crontab 文件的鏈接數(shù)量,還是 2,這和創(chuàng)建軟鏈接文件 crontab2
前是一樣的。也就是說創(chuàng)建軟鏈接并不增加原文件的鏈接數(shù)。
第六列是文件大大小,注意新建的軟鏈接文件大小為 12 Bytes,也就是字符串 "/etc/crontab" 的長度。
最后一列會友好的顯示出軟鏈接文件指向的源文件。
我們可以通過下圖來理解軟鏈接在文件系統(tǒng)中的實(shí)現(xiàn)方式:
從上圖我們可以看出,軟鏈接文件 crontab2 是一個實(shí)實(shí)在在的文件,有自己的 inode 和 data block。但是它的 data block
中保存的是目標(biāo)文件的地址:/etc/crontab。 像 open() 這樣的 API 能夠識別出軟鏈接,并根據(jù) data block
中的目標(biāo)文件徑把操作重定向到目標(biāo)文件上。
可以鏈接目錄是軟鏈接的一大優(yōu)勢,創(chuàng)建目錄鏈接的方式和普通文件一樣:
$ ln -s /bin testbin
此時進(jìn)入 testbin 目錄和進(jìn)入 /bin 目錄是一樣的。
更厲害的是,還可以跨文件系統(tǒng)創(chuàng)建軟鏈接!
刪除源文件
對于軟鏈接來說,刪除源鏈接后,鏈接文件就會無法找到指向的源文件了??聪旅娴难菔荆?br>$ echo "hello world" > hello.txt $ ln -s hello.txt hello2 $ cat hello2 hello
world $rm hello.txt $ cat hello2 cat: hello2: No such file or directory
刪除原文件后,操作鏈接文件時的提示是:"No such file or directory"。
文件的鏈接數(shù)
從上文中的示例我們可以看到,當(dāng)創(chuàng)建硬鏈接文件時,文件的鏈接數(shù)會增加 1,而創(chuàng)建軟鏈接時文件的鏈接數(shù)卻不發(fā)生變化。
下面讓我們看一個目錄文件的鏈接數(shù),先創(chuàng)建一個空目錄:
$ mkdir /home/nick/testdir $ ll /home/nick | grep testdir drwxr-xr-x 2 nick
nick4096 Jul 10 08:58 testdir/
新建的空目錄有兩個硬鏈接,分別是:
/home/nick/testdir /home/nick/testdir/.
而 /home/nick/testdir 目錄下還有一個指向其父目錄的硬鏈接:/home/nick/testdir/..
也就是說當(dāng)我們創(chuàng)建一個目錄時,其父目錄的硬鏈接數(shù)會增加 1。
ln 命令
ln 命令用來在文件之間建立鏈接,其的常用方式為:
ln source target
ln -s source target
它們分別用來創(chuàng)建硬鏈接文件和軟鏈接文件。還有一個比較常用的選項(xiàng)是 f,它會強(qiáng)制刪除已經(jīng)存在的目標(biāo)文件。
參考:
ln man page <http://man7.org/linux/man-pages/man1/ln.1.html>
鳥哥的私房菜
徹底理解“軟鏈接”和“硬鏈接” <http://ybin.cc/linux/soft-link-vs-hard-link/>
The difference between hard and soft links
<https://linuxgazette.net/105/pitcher.html>
熱門工具 換一換
感谢您访问我们的网站,您可能还对以下资源感兴趣:
调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看